Introduce group basic federation, event new page and notifications

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2020-02-18 08:57:00 +01:00
parent 300ef8f245
commit 4144e9ffd0
416 changed files with 32220 additions and 16750 deletions

1
js/src/@types/v-tooltip/index.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
declare module "v-tooltip";

57
js/src/@types/vuedraggable/index.d.ts vendored Normal file
View File

@@ -0,0 +1,57 @@
declare module "vuedraggable" {
import Vue, { ComponentOptions } from "vue";
export interface DraggedContext<T> {
index: number;
futureIndex: number;
element: T;
}
export interface DropContext<T> {
index: number;
component: Vue;
element: T;
}
export interface Rectangle {
top: number;
right: number;
bottom: number;
left: number;
width: number;
height: number;
}
export interface MoveEvent<T> {
originalEvent: DragEvent;
dragged: Element;
draggedContext: DraggedContext<T>;
draggedRect: Rectangle;
related: Element;
relatedContext: DropContext<T>;
relatedRect: Rectangle;
from: Element;
to: Element;
willInsertAfter: boolean;
isTrusted: boolean;
}
export interface ChangeEvent<T> {
added: {
newIndex: number;
element: T;
};
removed: {
oldIndex: number;
element: T;
};
moved: {
newIndex: number;
oldIndex: number;
};
}
const draggableComponent: ComponentOptions<Vue>;
export default draggableComponent;
}

View File

@@ -2,12 +2,39 @@
<div id="mobilizon">
<NavBar />
<div class="container" v-if="config && config.demoMode">
<b-message type="is-danger" :title="$t('Warning').toLocaleUpperCase()" closable aria-close-label="Close">
<p v-html="`${$t('This is a demonstration site to test the beta version of Mobilizon.')} ${$t('<b>Please do not use it in any real way.</b>')}`" />
<b-message
type="is-danger"
:title="$t('Warning').toLocaleUpperCase()"
closable
aria-close-label="Close"
>
<p
v-html="
`${$t('This is a demonstration site to test the beta version of Mobilizon.')} ${$t(
'<b>Please do not use it in any real way.</b>'
)}`
"
/>
<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="$i18n.locale === 'fr' ? 'https://framablog.org/?p=18268' : 'https://framablog.org/?p=18299'">{{ $t('on our blog') }}</a>
<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="
$i18n.locale === 'fr'
? 'https://framablog.org/?p=18268'
: 'https://framablog.org/?p=18299'
"
>{{ $t("on our blog") }}</a
>
</i18n>
</p>
</b-message>
@@ -22,20 +49,15 @@
</template>
<script lang="ts">
import NavBar from '@/components/NavBar.vue';
import { Component, Vue } from 'vue-property-decorator';
import {
AUTH_ACCESS_TOKEN,
AUTH_USER_EMAIL,
AUTH_USER_ID,
AUTH_USER_ROLE,
} from '@/constants';
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';
import { Component, Vue } from "vue-property-decorator";
import NavBar from "./components/NavBar.vue";
import { AUTH_ACCESS_TOKEN, AUTH_USER_EMAIL, AUTH_USER_ID, AUTH_USER_ROLE } from "./constants";
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: {
@@ -46,7 +68,7 @@ import { IConfig } from '@/types/config.model';
components: {
Logo,
NavBar,
'mobilizon-footer': Footer,
"mobilizon-footer": Footer,
},
})
export default class App extends Vue {
@@ -65,7 +87,7 @@ export default class App extends Vue {
const role = localStorage.getItem(AUTH_USER_ROLE);
if (userId && userEmail && accessToken && role) {
return await this.$apollo.mutate({
return this.$apollo.mutate({
mutation: UPDATE_CURRENT_USER_CLIENT,
variables: {
id: userId,
@@ -85,7 +107,7 @@ export default class App extends Vue {
/* Bulma imports */
@import "~bulma/bulma";
@import '~bulma-divider';
@import "~bulma-divider";
/* Buefy imports */
@import "~buefy/src/scss/buefy";
@@ -94,31 +116,34 @@ export default class App extends Vue {
$mdi-font-path: "~@mdi/font/fonts";
@import "~@mdi/font/scss/materialdesignicons";
.fade-enter-active, .fade-leave-active {
transition: opacity .5s;
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
.fade-enter,
.fade-leave-to {
opacity: 0;
}
body {
// background: #f7f8fa;
background: $body-background-color;
font-family: BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Fira Sans','Droid Sans','Helvetica Neue',Helvetica,Arial,sans-serif;
body {
// background: #f7f8fa;
background: $body-background-color;
font-family: BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans",
"Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
/*main {*/
/* margin: 1rem auto 0;*/
/*}*/
}
/*main {*/
/* margin: 1rem auto 0;*/
/*}*/
}
#mobilizon > .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: #4a4a4a;
}
color: #111;
#mobilizon > .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: #4a4a4a;
}
color: #111;
}
}
</style>

View File

@@ -1,19 +1,19 @@
import { ApolloCache } from 'apollo-cache';
import { NormalizedCacheObject } from 'apollo-cache-inmemory';
import { ICurrentUserRole } from '@/types/current-user.model';
import { ApolloCache } from "apollo-cache";
import { NormalizedCacheObject } from "apollo-cache-inmemory";
import { ICurrentUserRole } from "@/types/current-user.model";
export function buildCurrentUserResolver(cache: ApolloCache<NormalizedCacheObject>) {
export default function buildCurrentUserResolver(cache: ApolloCache<NormalizedCacheObject>) {
cache.writeData({
data: {
currentUser: {
__typename: 'CurrentUser',
__typename: "CurrentUser",
id: null,
email: null,
isLoggedIn: false,
role: ICurrentUserRole.USER,
},
currentActor: {
__typename: 'CurrentActor',
__typename: "CurrentActor",
id: null,
preferredUsername: null,
name: null,
@@ -24,31 +24,49 @@ export function buildCurrentUserResolver(cache: ApolloCache<NormalizedCacheObjec
return {
Mutation: {
updateCurrentUser: (_, { id, email, isLoggedIn, role }, { cache }) => {
updateCurrentUser: (
_: any,
{
id,
email,
isLoggedIn,
role,
}: { id: string; email: string; isLoggedIn: boolean; role: string },
{ cache: localCache }: { cache: ApolloCache<NormalizedCacheObject> }
) => {
const data = {
currentUser: {
id,
email,
isLoggedIn,
role,
__typename: 'CurrentUser',
__typename: "CurrentUser",
},
};
cache.writeData({ data });
localCache.writeData({ data });
},
updateCurrentActor: (_, { id, preferredUsername, avatar, name }, { cache }) => {
updateCurrentActor: (
_: any,
{
id,
preferredUsername,
avatar,
name,
}: { id: string; preferredUsername: string; avatar: string; name: string },
{ cache: localCache }: { cache: ApolloCache<NormalizedCacheObject> }
) => {
const data = {
currentActor: {
id,
preferredUsername,
avatar,
name,
__typename: 'CurrentActor',
__typename: "CurrentActor",
},
};
cache.writeData({ data });
localCache.writeData({ data });
},
},
};

63
js/src/apollo/utils.ts Normal file
View File

@@ -0,0 +1,63 @@
import { IntrospectionFragmentMatcher, NormalizedCacheObject } from "apollo-cache-inmemory";
import { IError, errors, defaultError, refreshSuggestion } from "@/utils/errors";
import { AUTH_ACCESS_TOKEN, AUTH_REFRESH_TOKEN } from "@/constants";
import { REFRESH_TOKEN } from "@/graphql/auth";
import { saveTokenData } from "@/utils/auth";
import { ApolloClient } from "apollo-client";
export const fragmentMatcher = new IntrospectionFragmentMatcher({
introspectionQueryResultData: {
__schema: {
types: [
{
kind: "UNION",
name: "SearchResult",
possibleTypes: [{ name: "Event" }, { name: "Person" }, { name: "Group" }],
},
{
kind: "INTERFACE",
name: "Actor",
possibleTypes: [{ name: "Person" }, { name: "Group" }],
},
],
},
},
});
export const computeErrorMessage = (message: any) => {
const error: IError = errors.reduce((acc, errorLocal) => {
if (RegExp(errorLocal.match).test(message)) {
return errorLocal;
}
return acc;
}, defaultError);
if (error.value === null) return null;
return error.suggestRefresh === false ? error.value : `${error.value}<br>${refreshSuggestion}`;
};
export async function refreshAccessToken(
apolloClient: ApolloClient<NormalizedCacheObject>
): Promise<boolean> {
// Remove invalid access token, so the next request is not authenticated
localStorage.removeItem(AUTH_ACCESS_TOKEN);
const refreshToken = localStorage.getItem(AUTH_REFRESH_TOKEN);
console.log("Refreshing access token.");
try {
const res = await apolloClient.mutate({
mutation: REFRESH_TOKEN,
variables: {
refreshToken,
},
});
saveTokenData(res.data.refreshToken);
return true;
} catch (err) {
return false;
}
}

View File

@@ -1 +1,11 @@
<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>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78">
<title>Mobilizon Logo</title>
<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: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,109 @@
<template>
<b-autocomplete
:data="baseData"
:placeholder="$t('Actor')"
v-model="name"
field="preferredUsername"
:loading="$apollo.loading"
check-infinite-scroll
@typing="getAsyncData"
@select="handleSelect"
@infinite-scroll="getAsyncData"
>
<template slot-scope="props">
<div class="media">
<div class="media-left">
<img width="32" :src="props.option.avatar.url" v-if="props.option.avatar" alt="" />
<b-icon v-else icon="account-circle" />
</div>
<div class="media-content">
<span v-if="props.option.name">
{{ props.option.name }}
<br />
<small>{{ `@${props.option.preferredUsername}` }}</small>
<small v-if="props.option.domain">{{ `@${props.option.domain}` }}</small>
</span>
<span v-else>
{{ `@${props.option.preferredUsername}` }}
</span>
</div>
</div>
</template>
<template slot="footer">
<span class="has-text-grey" v-show="page > totalPages">
Thats it! No more movies found.
</span>
</template>
</b-autocomplete>
</template>
<script lang="ts">
import { Component, Model, Vue, Watch } from "vue-property-decorator";
import { debounce } from "lodash";
import { IPerson } from "@/types/actor";
import { SEARCH_PERSONS } from "@/graphql/search";
import { Paginate } from "@/types/paginate";
const SEARCH_PERSON_LIMIT = 10;
@Component
export default class ActorAutoComplete extends Vue {
@Model("change", { type: Object }) readonly defaultSelected!: IPerson | null;
baseData: IPerson[] = [];
selected: IPerson | null = this.defaultSelected;
name: string = this.defaultSelected ? this.defaultSelected.preferredUsername : "";
page = 1;
totalPages = 1;
mounted() {
this.selected = this.defaultSelected;
}
data() {
return {
getAsyncData: debounce(this.doGetAsyncData, 500),
};
}
@Watch("defaultSelected")
updateDefaultSelected(defaultSelected: IPerson) {
console.log("update defaultSelected", defaultSelected);
this.selected = defaultSelected;
this.name = defaultSelected.preferredUsername;
}
handleSelect(selected: IPerson) {
this.selected = selected;
this.$emit("change", selected);
}
async doGetAsyncData(name: string) {
this.baseData = [];
if (this.name !== name) {
this.name = name;
this.page = 1;
}
if (!name.length) {
this.page = 1;
this.totalPages = 1;
return;
}
const {
data: { searchPersons },
} = await this.$apollo.query<{ searchPersons: Paginate<IPerson> }>({
query: SEARCH_PERSONS,
variables: {
searchText: this.name,
page: this.page,
limit: SEARCH_PERSON_LIMIT,
},
});
this.totalPages = Math.ceil(searchPersons.total / SEARCH_PERSON_LIMIT);
this.baseData.push(...searchPersons.elements);
}
}
</script>

View File

@@ -0,0 +1,152 @@
<template>
<div class="clickable">
<div class="media" style="align-items: top;">
<div class="media-left">
<figure class="image is-32x32" v-if="actor.avatar">
<img class="is-rounded" :src="actor.avatar.url" alt="" />
</figure>
<b-icon v-else size="is-medium" icon="account-circle" />
</div>
<div class="media-content">
<p>
{{ actor.name || `@${usernameWithDomain(actor)}` }}
</p>
<p class="has-text-grey" v-if="actor.name">@{{ usernameWithDomain(actor) }}</p>
<p v-if="full">{{ actor.summary }}</p>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import { IActor, usernameWithDomain } from "../../types/actor";
@Component
export default class ActorCard extends Vue {
@Prop({ required: true, type: Object }) actor!: IActor;
@Prop({ required: false, type: Boolean, default: false }) full!: boolean;
@Prop({ required: false, type: Boolean, default: true }) popover!: boolean;
usernameWithDomain = usernameWithDomain;
}
</script>
<style lang="scss" scoped>
.clickable {
cursor: pointer;
}
</style>
<style lang="scss">
.tooltip {
display: block !important;
z-index: 10000;
.tooltip-inner {
background: black;
color: white;
border-radius: 16px;
padding: 5px 10px 4px;
}
.tooltip-arrow {
width: 0;
height: 0;
border-style: solid;
position: absolute;
margin: 5px;
border-color: black;
z-index: 1;
}
&[x-placement^="top"] {
margin-bottom: 5px;
.tooltip-arrow {
border-width: 5px 5px 0 5px;
border-left-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
bottom: -5px;
left: calc(50% - 5px);
margin-top: 0;
margin-bottom: 0;
}
}
&[x-placement^="bottom"] {
margin-top: 5px;
.tooltip-arrow {
border-width: 0 5px 5px 5px;
border-left-color: transparent !important;
border-right-color: transparent !important;
border-top-color: transparent !important;
top: -5px;
left: calc(50% - 5px);
margin-top: 0;
margin-bottom: 0;
}
}
&[x-placement^="right"] {
margin-left: 5px;
.tooltip-arrow {
border-width: 5px 5px 5px 0;
border-left-color: transparent !important;
border-top-color: transparent !important;
border-bottom-color: transparent !important;
left: -5px;
top: calc(50% - 5px);
margin-left: 0;
margin-right: 0;
}
}
&[x-placement^="left"] {
margin-right: 5px;
.tooltip-arrow {
border-width: 5px 0 5px 5px;
border-top-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
right: -5px;
top: calc(50% - 5px);
margin-left: 0;
margin-right: 0;
}
}
&.popover {
$color: #f9f9f9;
.popover-inner {
background: $color;
color: black;
padding: 24px;
border-radius: 5px;
box-shadow: 0 5px 30px rgba(black, 0.1);
}
.popover-arrow {
border-color: $color;
}
}
&[aria-hidden="true"] {
visibility: hidden;
opacity: 0;
transition: opacity 0.15s, visibility 0.15s;
}
&[aria-hidden="false"] {
visibility: visible;
opacity: 1;
transition: opacity 0.15s;
}
}
</style>

View File

@@ -1,76 +0,0 @@
<docs>
A simple link to an actor, local or remote link
```vue
<template>
<ActorLink :actor="localActor">
<template>
<span>{{ localActor.preferredUsername }}</span>
</template>
</ActorLink>
</template>
<script>
export default {
data() {
return {
localActor: {
domain: null,
preferredUsername: 'localActor'
},
}
}
}
</script>
```
```vue
<template>
<ActorLink :actor="remoteActor">
<template>
<span>{{ remoteActor.preferredUsername }}</span>
</template>
</ActorLink>
</template>
<script>
export default {
data() {
return {
remoteActor: {
domain: 'mobilizon.org',
url: 'https://mobilizon.org/@Framasoft',
preferredUsername: 'Framasoft'
},
}
}
}
</script>
```
</docs>
<template>
<span>
<span v-if="actor.domain === null"
:to="{name: 'Profile', params: { name: actor.preferredUsername } }"
>
<!-- @slot What to put inside the link -->
<slot></slot>
</span>
<a v-else :href="actor.url">
<!-- @slot What to put inside the link -->
<slot></slot>
</a>
</span>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { IActor } from '@/types/actor';
@Component
export default class ActorLink extends Vue {
/**
* The actor you want to make a link to
*/
@Prop({ required: true }) actor!: IActor;
}
</script>

View File

@@ -1,18 +1,19 @@
<template>
<section>
<h1 class="title">
{{ $t('My identities') }}
{{ $t("My identities") }}
</h1>
<ul class="identities">
<li v-for="identity in identities" :key="identity.id">
<router-link
:to="{ name: 'UpdateIdentity', params: { identityName: identity.preferredUsername } }"
class="media identity" v-bind:class="{ 'is-current-identity': isCurrentIdentity(identity) }"
class="media identity"
v-bind:class="{ 'is-current-identity': isCurrentIdentity(identity) }"
>
<div class="media-left">
<figure class="image is-48x48" v-if="identity.avatar">
<img class="is-rounded" :src="identity.avatar.url">
<img class="is-rounded" :src="identity.avatar.url" />
</figure>
</div>
@@ -23,24 +24,24 @@
</li>
</ul>
<router-link :to="{ name: 'CreateIdentity' }" class="button create-identity is-primary" >
{{ $t('Create a new identity') }}
<router-link :to="{ name: 'CreateIdentity' }" class="button create-identity is-primary">
{{ $t("Create a new identity") }}
</router-link>
</section>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { IDENTITIES } from '@/graphql/actor';
import { IPerson, Person } from '@/types/actor';
import { Component, Prop, Vue } from "vue-property-decorator";
import { IDENTITIES } from "../../graphql/actor";
import { IPerson, Person } from "../../types/actor";
@Component({
apollo: {
identities: {
query: IDENTITIES,
update (result) {
return result.identities.map(i => new Person(i));
update(result) {
return result.identities.map((i: IPerson) => new Person(i));
},
},
},
@@ -49,6 +50,7 @@ export default class Identities extends Vue {
@Prop({ type: String }) currentIdentityName!: string;
identities: Person[] = [];
errors: string[] = [];
isCurrentIdentity(identity: IPerson) {
@@ -58,25 +60,25 @@ export default class Identities extends Vue {
</script>
<style lang="scss" scoped>
.identities {
border-right: 1px solid grey;
.identities {
border-right: 1px solid grey;
padding: 15px 0;
padding: 15px 0;
}
.media.identity {
align-items: center;
font-size: 1.3rem;
padding-bottom: 0;
margin-bottom: 15px;
color: #000;
&.is-current-identity {
background-color: rgba(0, 0, 0, 0.1);
}
}
.media.identity {
align-items: center;
font-size: 1.3rem;
padding-bottom: 0;
margin-bottom: 15px;
color: #000;
&.is-current-identity {
background-color: rgba(0, 0, 0, 0.1);
}
}
.title {
margin-bottom: 30px;
}
</style>
.title {
margin-bottom: 30px;
}
</style>

View File

@@ -25,32 +25,58 @@
</figure>
</div>
<div class="media-content">
<span ref="title">{{ actorDisplayName }}</span><br>
<small class="has-text-grey" v-if="participant.actor.domain">@{{ participant.actor.preferredUsername }}@{{ participant.actor.domain }}</small>
<span ref="title">{{ actorDisplayName }}</span
><br />
<small class="has-text-grey" v-if="participant.actor.domain"
>@{{ participant.actor.preferredUsername }}@{{ participant.actor.domain }}</small
>
<small class="has-text-grey" v-else>@{{ participant.actor.preferredUsername }}</small>
</div>
</div>
</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>
</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>
</footer>
</article>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Person } from '@/types/actor';
import { IParticipant, ParticipantRole } from '@/types/event.model';
import { Component, Prop, Vue } from "vue-property-decorator";
import { Person } from "../../types/actor";
import { IParticipant, ParticipantRole } from "../../types/event.model";
@Component
export default class ParticipantCard extends Vue {
@Prop({ required: true }) participant!: IParticipant;
@Prop({ type: Function }) accept;
@Prop({ type: Function }) reject;
@Prop({ type: Function }) exclude;
@Prop({ type: Function }) accept!: Function;
@Prop({ type: Function }) reject!: Function;
@Prop({ type: Function }) exclude!: Function;
ParticipantRole = ParticipantRole;
@@ -58,13 +84,12 @@ export default class ParticipantCard extends Vue {
const actor = new Person(this.participant.actor);
return actor.displayName();
}
}
</script>
<style lang="scss">
@import "../../variables.scss";
.card-footer-item {
height: $control-height;
}
@import "../../variables.scss";
.card-footer-item {
height: $control-height;
}
</style>

View File

@@ -0,0 +1,33 @@
<template>
<v-popover offset="16" trigger="hover" :class="{ inline }" class="clickable">
<slot></slot>
<template slot="popover" class="popover">
<actor-card :full="true" :actor="actor" :popover="false" />
</template>
</v-popover>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import { IActor } from "../../types/actor";
import ActorCard from "./ActorCard.vue";
@Component({
components: {
ActorCard,
},
})
export default class PopoverActorCard extends Vue {
@Prop({ required: true, type: Object }) actor!: IActor;
@Prop({ required: false, type: Boolean, default: false }) inline!: boolean;
}
</script>
<style lang="scss" scoped>
.inline {
display: inline;
}
.clickable {
cursor: pointer;
}
</style>

View File

@@ -1,104 +1,123 @@
<template>
<div>
<b-table
v-show="relayFollowers.elements.length > 0"
:data="relayFollowers.elements"
:loading="$apollo.queries.relayFollowers.loading"
ref="table"
:checked-rows.sync="checkedRows"
detailed
:show-detail-icon="false"
paginated
backend-pagination
:total="relayFollowers.total"
:per-page="perPage"
@page-change="onPageChange"
checkable
checkbox-position="left">
<template slot-scope="props">
<b-table-column field="actor.id" label="ID" width="40" numeric>
{{ props.row.actor.id }}
</b-table-column>
<div>
<b-table
v-show="relayFollowers.elements.length > 0"
:data="relayFollowers.elements"
:loading="$apollo.queries.relayFollowers.loading"
ref="table"
:checked-rows.sync="checkedRows"
detailed
:show-detail-icon="false"
paginated
backend-pagination
:total="relayFollowers.total"
:per-page="perPage"
@page-change="onPageChange"
checkable
checkbox-position="left"
>
<template slot-scope="props">
<b-table-column field="actor.id" label="ID" width="40" numeric>{{
props.row.actor.id
}}</b-table-column>
<b-table-column field="actor.type" :label="$t('Type')" width="80">
<b-icon icon="lan" v-if="isInstance(props.row.actor)" />
<b-icon icon="account-circle" v-else />
</b-table-column>
<b-table-column field="actor.type" :label="$t('Type')" width="80">
<b-icon icon="lan" v-if="RelayMixin.isInstance(props.row.actor)" />
<b-icon icon="account-circle" v-else />
</b-table-column>
<b-table-column field="approved" :label="$t('Status')" width="100" sortable centered>
<span :class="`tag ${props.row.approved ? 'is-success' : 'is-danger' }`">
{{ props.row.approved ? $t('Accepted') : $t('Pending') }}
</span>
</b-table-column>
<b-table-column field="approved" :label="$t('Status')" width="100" sortable centered>
<span :class="`tag ${props.row.approved ? 'is-success' : 'is-danger'}`">{{
props.row.approved ? $t("Accepted") : $t("Pending")
}}</span>
</b-table-column>
<b-table-column field="actor.domain" :label="$t('Domain')" sortable>
<template>
<a @click="toggle(props.row)" v-if="isInstance(props.row.actor)">
{{ props.row.actor.domain }}
</a>
<a @click="toggle(props.row)" v-else>
{{ `${props.row.actor.preferredUsername}@${props.row.actor.domain}` }}
</a>
</template>
</b-table-column>
<b-table-column field="actor.domain" :label="$t('Domain')" sortable>
<template>
<a @click="toggle(props.row)" v-if="RelayMixin.isInstance(props.row.actor)">{{
props.row.actor.domain
}}</a>
<a @click="toggle(props.row)" v-else>{{
`${props.row.actor.preferredUsername}@${props.row.actor.domain}`
}}</a>
</template>
</b-table-column>
<b-table-column field="actor.updatedAt" :label="$t('Date')" sortable>
{{ props.row.updatedAt | formatDateTimeString }}
</b-table-column>
</template>
<b-table-column field="actor.updatedAt" :label="$t('Date')" sortable>{{
props.row.updatedAt | formatDateTimeString
}}</b-table-column>
</template>
<template slot="detail" slot-scope="props">
<article>
<div class="content">
<strong>{{ props.row.actor.domain }}</strong>
<small>@{{ props.row.actor.preferredUsername }}</small>
<small>31m</small>
<br>
<p v-html="props.row.actor.summary" />
</div>
</article>
</template>
<template slot="detail" slot-scope="props">
<article>
<div class="content">
<strong>{{ props.row.actor.domain }}</strong>
<small>@{{ props.row.actor.preferredUsername }}</small>
<small>31m</small>
<br />
<p v-html="props.row.actor.summary" />
</div>
</article>
</template>
<template slot="bottom-left" v-if="checkedRows.length > 0">
<div class="buttons">
<b-button @click="acceptRelays" type="is-success" v-if="checkedRowsHaveAtLeastOneToApprove">
{{ $tc('No instance to approve|Approve instance|Approve {number} instances', checkedRows.length, { number: checkedRows.length }) }}
</b-button>
<b-button @click="rejectRelays" type="is-danger">
{{ $tc('No instance to reject|Reject instance|Reject {number} instances', checkedRows.length, { number: checkedRows.length }) }}
</b-button>
</div>
</template>
</b-table>
<b-message type="is-danger" v-if="relayFollowers.elements.length === 0">
{{ $t("No instance follows your instance yet.") }}
</b-message>
</div>
<template slot="bottom-left" v-if="checkedRows.length > 0">
<div class="buttons">
<b-button
@click="acceptRelays"
type="is-success"
v-if="checkedRowsHaveAtLeastOneToApprove"
>
{{
$tc(
"No instance to approve|Approve instance|Approve {number} instances",
checkedRows.length,
{ number: checkedRows.length }
)
}}
</b-button>
<b-button @click="rejectRelays" type="is-danger">
{{
$tc(
"No instance to reject|Reject instance|Reject {number} instances",
checkedRows.length,
{ number: checkedRows.length }
)
}}
</b-button>
</div>
</template>
</b-table>
<b-message type="is-danger" v-if="relayFollowers.elements.length === 0">{{
$t("No instance follows your instance yet.")
}}</b-message>
</div>
</template>
<script lang="ts">
import { Component, Mixins } from 'vue-property-decorator';
import { ACCEPT_RELAY, REJECT_RELAY, RELAY_FOLLOWERS } from '@/graphql/admin';
import { Paginate } from '@/types/paginate';
import { IFollower } from '@/types/actor/follower.model';
import RelayMixin from '@/mixins/relay';
import { Component, Mixins } from "vue-property-decorator";
import { ACCEPT_RELAY, REJECT_RELAY, RELAY_FOLLOWERS } from "../../graphql/admin";
import { Paginate } from "../../types/paginate";
import { IFollower } from "../../types/actor/follower.model";
import RelayMixin from "../../mixins/relay";
@Component({
apollo: {
relayFollowers: {
query: RELAY_FOLLOWERS,
fetchPolicy: 'cache-and-network',
fetchPolicy: "cache-and-network",
},
},
metaInfo() {
return {
title: this.$t('Followers') as string,
titleTemplate: '%s | Mobilizon',
title: this.$t("Followers") as string,
titleTemplate: "%s | Mobilizon",
};
},
})
export default class Followers extends Mixins(RelayMixin) {
relayFollowers: Paginate<IFollower> = { elements: [], total: 0 };
RelayMixin = RelayMixin;
async acceptRelays() {
await this.checkedRows.forEach((row: IFollower) => {
this.acceptRelay(`${row.actor.preferredUsername}@${row.actor.domain}`);
@@ -111,7 +130,7 @@ export default class Followers extends Mixins(RelayMixin) {
});
}
async acceptRelay(address: String) {
async acceptRelay(address: string) {
await this.$apollo.mutate({
mutation: ACCEPT_RELAY,
variables: {
@@ -122,7 +141,7 @@ export default class Followers extends Mixins(RelayMixin) {
this.checkedRows = [];
}
async rejectRelay(address: String) {
async rejectRelay(address: string) {
await this.$apollo.mutate({
mutation: REJECT_RELAY,
variables: {
@@ -134,7 +153,7 @@ export default class Followers extends Mixins(RelayMixin) {
}
get checkedRowsHaveAtLeastOneToApprove(): boolean {
return this.checkedRows.some(checkedRow => !checkedRow.approved);
return this.checkedRows.some((checkedRow) => !checkedRow.approved);
}
}
</script>
</script>

View File

@@ -1,125 +1,134 @@
<template>
<div>
<form @submit="followRelay">
<b-field :label="$t('Add an instance')" custom-class="add-relay" horizontal>
<b-field grouped expanded size="is-large">
<p class="control">
<b-input v-model="newRelayAddress" :placeholder="$t('Ex: test.mobilizon.org')" />
</p>
<p class="control">
<b-button type="is-primary" native-type="submit">{{ $t('Add an instance') }}</b-button>
</p>
</b-field>
</b-field>
</form>
<b-table
v-show="relayFollowings.elements.length > 0"
:data="relayFollowings.elements"
:loading="$apollo.queries.relayFollowings.loading"
ref="table"
:checked-rows.sync="checkedRows"
:is-row-checkable="(row) => row.id !== 3"
detailed
:show-detail-icon="false"
paginated
backend-pagination
:total="relayFollowings.total"
:per-page="perPage"
@page-change="onPageChange"
checkable
checkbox-position="left">
<template slot-scope="props">
<b-table-column field="targetActor.id" label="ID" width="40" numeric>
{{ props.row.targetActor.id }}
</b-table-column>
<div>
<form @submit="followRelay">
<b-field :label="$t('Add an instance')" custom-class="add-relay" horizontal>
<b-field grouped expanded size="is-large">
<p class="control">
<b-input v-model="newRelayAddress" :placeholder="$t('Ex: test.mobilizon.org')" />
</p>
<p class="control">
<b-button type="is-primary" native-type="submit">{{ $t("Add an instance") }}</b-button>
</p>
</b-field>
</b-field>
</form>
<b-table
v-show="relayFollowings.elements.length > 0"
:data="relayFollowings.elements"
:loading="$apollo.queries.relayFollowings.loading"
ref="table"
:checked-rows.sync="checkedRows"
:is-row-checkable="(row) => row.id !== 3"
detailed
:show-detail-icon="false"
paginated
backend-pagination
:total="relayFollowings.total"
:per-page="perPage"
@page-change="onPageChange"
checkable
checkbox-position="left"
>
<template slot-scope="props">
<b-table-column field="targetActor.id" label="ID" width="40" numeric>{{
props.row.targetActor.id
}}</b-table-column>
<b-table-column field="targetActor.type" :label="$t('Type')" width="80">
<b-icon icon="lan" v-if="isInstance(props.row.targetActor)" />
<b-icon icon="account-circle" v-else />
</b-table-column>
<b-table-column field="targetActor.type" :label="$t('Type')" width="80">
<b-icon icon="lan" v-if="RelayMixin.isInstance(props.row.targetActor)" />
<b-icon icon="account-circle" v-else />
</b-table-column>
<b-table-column field="approved" :label="$t('Status')" width="100" sortable centered>
<span :class="`tag ${props.row.approved ? 'is-success' : 'is-danger' }`">
{{ props.row.approved ? $t('Accepted') : $t('Pending') }}
</span>
</b-table-column>
<b-table-column field="approved" :label="$t('Status')" width="100" sortable centered>
<span :class="`tag ${props.row.approved ? 'is-success' : 'is-danger'}`">{{
props.row.approved ? $t("Accepted") : $t("Pending")
}}</span>
</b-table-column>
<b-table-column field="targetActor.domain" :label="$t('Domain')" sortable>
<template>
<a @click="toggle(props.row)" v-if="isInstance(props.row.targetActor)">
{{ props.row.targetActor.domain }}
</a>
<a @click="toggle(props.row)" v-else>
{{ `${props.row.targetActor.preferredUsername}@${props.row.targetActor.domain}` }}
</a>
</template>
</b-table-column>
<b-table-column field="targetActor.domain" :label="$t('Domain')" sortable>
<template>
<a @click="toggle(props.row)" v-if="RelayMixin.isInstance(props.row.targetActor)">{{
props.row.targetActor.domain
}}</a>
<a @click="toggle(props.row)" v-else>{{
`${props.row.targetActor.preferredUsername}@${props.row.targetActor.domain}`
}}</a>
</template>
</b-table-column>
<b-table-column field="targetActor.updatedAt" :label="$t('Date')" sortable>
{{ props.row.updatedAt | formatDateTimeString }}
</b-table-column>
</template>
<b-table-column field="targetActor.updatedAt" :label="$t('Date')" sortable>{{
props.row.updatedAt | formatDateTimeString
}}</b-table-column>
</template>
<template slot="detail" slot-scope="props">
<article>
<div class="content">
<strong>{{ props.row.targetActor.domain }}</strong>
<small>@{{ props.row.targetActor.preferredUsername }}</small>
<small>31m</small>
<br>
<p v-html="props.row.targetActor.summary" />
</div>
</article>
</template>
<template slot="detail" slot-scope="props">
<article>
<div class="content">
<strong>{{ props.row.targetActor.domain }}</strong>
<small>@{{ props.row.targetActor.preferredUsername }}</small>
<small>31m</small>
<br />
<p v-html="props.row.targetActor.summary" />
</div>
</article>
</template>
<template slot="bottom-left" v-if="checkedRows.length > 0">
<b-button @click="removeRelays" type="is-danger">
{{ $tc('No instance to remove|Remove instance|Remove {number} instances', checkedRows.length, { number: checkedRows.length }) }}
</b-button>
</template>
</b-table>
<b-message type="is-danger" v-if="relayFollowings.elements.length === 0">
{{ $t("You don't follow any instances yet.") }}
</b-message>
</div>
<template slot="bottom-left" v-if="checkedRows.length > 0">
<b-button @click="removeRelays" type="is-danger">
{{
$tc(
"No instance to remove|Remove instance|Remove {number} instances",
checkedRows.length,
{ number: checkedRows.length }
)
}}
</b-button>
</template>
</b-table>
<b-message type="is-danger" v-if="relayFollowings.elements.length === 0">{{
$t("You don't follow any instances yet.")
}}</b-message>
</div>
</template>
<script lang="ts">
import { Component, Mixins } from 'vue-property-decorator';
import { ADD_RELAY, RELAY_FOLLOWINGS, REMOVE_RELAY } from '@/graphql/admin';
import { IFollower } from '@/types/actor/follower.model';
import { Paginate } from '@/types/paginate';
import RelayMixin from '@/mixins/relay';
import { Component, Mixins } from "vue-property-decorator";
import { ADD_RELAY, RELAY_FOLLOWINGS, REMOVE_RELAY } from "../../graphql/admin";
import { IFollower } from "../../types/actor/follower.model";
import { Paginate } from "../../types/paginate";
import RelayMixin from "../../mixins/relay";
@Component({
apollo: {
relayFollowings: {
query: RELAY_FOLLOWINGS,
fetchPolicy: 'cache-and-network',
fetchPolicy: "cache-and-network",
},
},
metaInfo() {
return {
title: this.$t('Followings') as string,
titleTemplate: '%s | Mobilizon',
title: this.$t("Followings") as string,
titleTemplate: "%s | Mobilizon",
};
},
})
export default class Followings extends Mixins(RelayMixin) {
relayFollowings: Paginate<IFollower> = { elements: [], total: 0 };
newRelayAddress: String = '';
async followRelay(e) {
newRelayAddress = "";
RelayMixin = RelayMixin;
async followRelay(e: Event) {
e.preventDefault();
await this.$apollo.mutate({
mutation: ADD_RELAY,
variables: {
address: this.newRelayAddress,
},
// TODO: Handle cache update properly without refreshing
// TODO: Handle cache update properly without refreshing
});
await this.$apollo.queries.relayFollowings.refetch();
this.newRelayAddress = '';
this.newRelayAddress = "";
}
async removeRelays() {
@@ -128,7 +137,7 @@ export default class Followings extends Mixins(RelayMixin) {
});
}
async removeRelay(address: String) {
async removeRelay(address: string) {
await this.$apollo.mutate({
mutation: REMOVE_RELAY,
variables: {
@@ -139,4 +148,4 @@ export default class Followings extends Mixins(RelayMixin) {
this.checkedRows = [];
}
}
</script>
</script>

View File

@@ -1,112 +1,130 @@
<template>
<li :class="{ reply: comment.inReplyToComment }">
<article class="media" :class="{ selected: commentSelected, organizer: commentFromOrganizer }" :id="commentId">
<figure class="media-left" v-if="!comment.deletedAt && comment.actor.avatar">
<p class="image is-48x48">
<img :src="comment.actor.avatar.url" alt="">
</p>
</figure>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<div class="content">
<span class="first-line" v-if="!comment.deletedAt">
<strong>{{ comment.actor.name }}</strong>
<small v-if="comment.actor.domain">@{{ comment.actor.preferredUsername }}@{{ comment.actor.domain }}</small>
<small v-else>@{{ comment.actor.preferredUsername }}</small>
<a class="comment-link has-text-grey" :href="commentURL">
<small>{{ timeago(new Date(comment.updatedAt)) }}</small>
</a>
</span>
<a v-else class="comment-link has-text-grey" :href="commentURL">
<span>{{ $t('[deleted]') }}</span>
</a>
<span class="icons" v-if="!comment.deletedAt">
<span v-if="comment.actor.id === currentActor.id"
@click="$emit('delete-comment', comment)">
<b-icon
icon="delete"
size="is-small"
/>
</span>
<span @click="reportModal()">
<b-icon
icon="alert"
size="is-small"
/>
</span>
</span>
<br>
<div v-if="!comment.deletedAt" v-html="comment.text" />
<div v-else>{{ $t('[This comment has been deleted]') }}</div>
<span class="load-replies" v-if="comment.totalReplies">
<span v-if="!showReplies" @click="fetchReplies">
{{ $tc('View a reply', comment.totalReplies, { totalReplies: comment.totalReplies }) }}
</span>
<span v-else-if="comment.totalReplies && showReplies" @click="showReplies = false">
{{ $t('Hide replies') }}
</span>
</span>
</div>
<nav class="reply-action level is-mobile" v-if="currentActor.id && event.options.commentModeration !== CommentModeration.CLOSED">
<div class="level-left">
<span style="cursor: pointer" class="level-item" @click="createReplyToComment(comment)">
<span class="icon is-small">
<b-icon icon="reply" />
</span>
{{ $t('Reply') }}
</span>
</div>
</nav>
</div>
</article>
<form class="reply" @submit.prevent="replyToComment" v-if="currentActor.id" v-show="replyTo">
<article class="media reply">
<figure class="media-left" v-if="currentActor.avatar">
<p class="image is-48x48">
<img :src="currentActor.avatar.url" alt="">
</p>
</figure>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<div class="content">
<span class="first-line">
<strong>{{ currentActor.name}}</strong>
<small>@{{ currentActor.preferredUsername }}</small>
</span>
<br>
<span class="editor-line">
<editor class="editor" ref="commenteditor" v-model="newComment.text" mode="comment" />
<b-button :disabled="newComment.text.trim().length === 0" native-type="submit" type="is-info">{{ $t('Post a reply') }}</b-button>
</span>
</div>
</div>
</article>
</form>
<transition-group name="comment-replies" v-if="showReplies" class="comment-replies" tag="ul">
<comment
class="reply"
v-for="reply in comment.replies"
:key="reply.id"
:comment="reply"
:event="event"
@create-comment="$emit('create-comment', $event)"
@delete-comment="$emit('delete-comment', $event)" />
</transition-group>
</li>
<li :class="{ reply: comment.inReplyToComment }">
<article
class="media"
:class="{ selected: commentSelected, organizer: commentFromOrganizer }"
:id="commentId"
>
<figure class="media-left" v-if="!comment.deletedAt && comment.actor.avatar">
<p class="image is-48x48">
<img :src="comment.actor.avatar.url" alt="" />
</p>
</figure>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<div class="content">
<span class="first-line" v-if="!comment.deletedAt">
<strong>{{ comment.actor.name }}</strong>
<small v-if="comment.actor.domain"
>@{{ comment.actor.preferredUsername }}@{{ comment.actor.domain }}</small
>
<small v-else>@{{ comment.actor.preferredUsername }}</small>
<a class="comment-link has-text-grey" :href="commentURL">
<small>{{ timeago(new Date(comment.updatedAt)) }}</small>
</a>
</span>
<a v-else class="comment-link has-text-grey" :href="commentURL">
<span>{{ $t("[deleted]") }}</span>
</a>
<span class="icons" v-if="!comment.deletedAt">
<button
v-if="comment.actor.id === currentActor.id"
@click="$emit('delete-comment', comment)"
>
<b-icon icon="delete" size="is-small" aria-hidden="true" />
<span class="visually-hidden">{{ $t("Delete") }}</span>
</button>
<button @click="reportModal()">
<b-icon icon="alert" size="is-small" />
<span class="visually-hidden">{{ $t("Report") }}</span>
</button>
</span>
<br />
<div v-if="!comment.deletedAt" v-html="comment.text" />
<div v-else>{{ $t("[This comment has been deleted]") }}</div>
<span class="load-replies" v-if="comment.totalReplies">
<span v-if="!showReplies" @click="fetchReplies">
{{
$tc("View a reply", comment.totalReplies, { totalReplies: comment.totalReplies })
}}
</span>
<span v-else-if="comment.totalReplies && showReplies" @click="showReplies = false">
{{ $t("Hide replies") }}
</span>
</span>
</div>
<nav
class="reply-action level is-mobile"
v-if="currentActor.id && event.options.commentModeration !== CommentModeration.CLOSED"
>
<div class="level-left">
<span
style="cursor: pointer;"
class="level-item"
@click="createReplyToComment(comment)"
>
<span class="icon is-small">
<b-icon icon="reply" />
</span>
{{ $t("Reply") }}
</span>
</div>
</nav>
</div>
</article>
<form class="reply" @submit.prevent="replyToComment" v-if="currentActor.id" v-show="replyTo">
<article class="media reply">
<figure class="media-left" v-if="currentActor.avatar">
<p class="image is-48x48">
<img :src="currentActor.avatar.url" alt="" />
</p>
</figure>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<div class="content">
<span class="first-line">
<strong>{{ currentActor.name }}</strong>
<small>@{{ currentActor.preferredUsername }}</small>
</span>
<br />
<span class="editor-line">
<editor class="editor" ref="commentEditor" v-model="newComment.text" mode="comment" />
<b-button
:disabled="newComment.text.trim().length === 0"
native-type="submit"
type="is-info"
>{{ $t("Post a reply") }}</b-button
>
</span>
</div>
</div>
</article>
</form>
<transition-group name="comment-replies" v-if="showReplies" class="comment-replies" tag="ul">
<comment
class="reply"
v-for="reply in comment.replies"
:key="reply.id"
:comment="reply"
:event="event"
@create-comment="$emit('create-comment', $event)"
@delete-comment="$emit('delete-comment', $event)"
/>
</transition-group>
</li>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { CommentModel, IComment } from '@/types/comment.model';
import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
import { IPerson } from '@/types/actor';
import { Refs } from '@/shims-vue';
import EditorComponent from '@/components/Editor.vue';
import TimeAgo from 'javascript-time-ago';
import { COMMENTS_THREADS, FETCH_THREAD_REPLIES } from '@/graphql/comment';
import { IEvent, CommentModeration } from '@/types/event.model';
import ReportModal from '@/components/Report/ReportModal.vue';
import { IReport } from '@/types/report.model';
import { CREATE_REPORT } from '@/graphql/report';
import { Component, Prop, Vue, Ref } from "vue-property-decorator";
import EditorComponent from "@/components/Editor.vue";
import TimeAgo from "javascript-time-ago";
import { CommentModel, IComment } from "../../types/comment.model";
import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
import { IPerson } from "../../types/actor";
import { COMMENTS_THREADS, FETCH_THREAD_REPLIES } from "../../graphql/comment";
import { IEvent, CommentModeration } from "../../types/event.model";
import ReportModal from "../Report/ReportModal.vue";
import { IReport } from "../../types/report.model";
import { CREATE_REPORT } from "../../graphql/report";
@Component({
apollo: {
@@ -115,23 +133,29 @@ import { CREATE_REPORT } from '@/graphql/report';
},
},
components: {
editor: () => import(/* webpackChunkName: "editor" */ '@/components/Editor.vue'),
comment: () => import(/* webpackChunkName: "comment" */ './Comment.vue'),
editor: () => import(/* webpackChunkName: "editor" */ "@/components/Editor.vue"),
comment: () => import(/* webpackChunkName: "comment" */ "./Comment.vue"),
},
})
export default class Comment extends Vue {
@Prop({ required: true, type: Object }) comment!: IComment;
@Prop({ required: true, type: Object }) event!: IEvent;
$refs!: Refs<{
commenteditor: EditorComponent,
}>;
// Hack because Vue only exports it's own interface.
// See https://github.com/kaorun343/vue-property-decorator/issues/257
@Ref() readonly commentEditor!: EditorComponent & { replyToComment: (comment: IComment) => void };
currentActor!: IPerson;
newComment: IComment = new CommentModel();
replyTo: boolean = false;
showReplies: boolean = false;
timeAgoInstance = null;
replyTo = false;
showReplies = false;
timeAgoInstance: TimeAgo | null = null;
CommentModeration = CommentModeration;
async mounted() {
@@ -140,7 +164,7 @@ export default class Comment extends Vue {
TimeAgo.addLocale(locale);
this.timeAgoInstance = new TimeAgo(localeName);
const hash = this.$route.hash;
const { hash } = this.$route;
if (hash.includes(`#comment-${this.comment.uuid}`)) {
this.fetchReplies();
}
@@ -153,18 +177,17 @@ export default class Comment extends Vue {
return;
}
this.replyTo = true;
// this.newComment.inReplyToComment = comment;
// this.newComment.inReplyToComment = comment;
await this.$nextTick();
await this.$nextTick(); // For some reason commenteditor needs two $nextTick() to fully render
const commentEditor = this.$refs.commenteditor;
commentEditor.replyToComment(comment);
this.commentEditor.replyToComment(comment);
}
replyToComment() {
this.newComment.inReplyToComment = this.comment;
this.newComment.originComment = this.comment.originComment || this.comment;
this.newComment.actor = this.currentActor;
this.$emit('create-comment', this.newComment);
this.$emit("create-comment", this.newComment);
this.newComment = new CommentModel();
this.replyTo = false;
}
@@ -188,7 +211,7 @@ export default class Comment extends Vue {
if (!eventData) return;
const { event } = eventData;
const { comments } = event;
const parentCommentIndex = comments.findIndex(oldComment => oldComment.id === parentId);
const parentCommentIndex = comments.findIndex((oldComment) => oldComment.id === parentId);
const parentComment = comments[parentCommentIndex];
if (!parentComment) return;
parentComment.replies = thread;
@@ -201,12 +224,11 @@ export default class Comment extends Vue {
this.showReplies = true;
}
timeago(dateTime): String {
timeago(dateTime: Date): string {
if (this.timeAgoInstance != null) {
// @ts-ignore
return this.timeAgoInstance.format(dateTime);
}
return '';
return "";
}
get commentSelected(): boolean {
@@ -214,15 +236,20 @@ export default class Comment extends Vue {
}
get commentFromOrganizer(): boolean {
return this.event.organizerActor !== undefined && this.comment.actor && this.comment.actor.id === this.event.organizerActor.id;
return (
this.event.organizerActor !== undefined &&
this.comment.actor &&
this.comment.actor.id === this.event.organizerActor.id
);
}
get commentId(): String {
if (this.comment.originComment) return `#comment-${this.comment.originComment.uuid}:${this.comment.uuid}`;
get commentId(): string {
if (this.comment.originComment)
return `#comment-${this.comment.originComment.uuid}:${this.comment.uuid}`;
return `#comment-${this.comment.uuid}`;
}
get commentURL(): String {
get commentURL(): string {
if (!this.comment.local && this.comment.url) return this.comment.url;
return this.commentId;
}
@@ -232,7 +259,7 @@ export default class Comment extends Vue {
parent: this,
component: ReportModal,
props: {
title: this.$t('Report this comment'),
title: this.$t("Report this comment"),
comment: this.comment,
onConfirm: this.reportComment,
outsideDomain: this.comment.actor.domain,
@@ -240,7 +267,7 @@ export default class Comment extends Vue {
});
}
async reportComment(content: String, forward: boolean) {
async reportComment(content: string, forward: boolean) {
try {
await this.$apollo.mutate<IReport>({
mutation: CREATE_REPORT,
@@ -254,9 +281,11 @@ export default class Comment extends Vue {
},
});
this.$buefy.notification.open({
message: this.$t('Comment from @{username} reported', { username: this.comment.actor.preferredUsername }) as string,
type: 'is-success',
position: 'is-bottom-right',
message: this.$t("Comment from @{username} reported", {
username: this.comment.actor.preferredUsername,
}) as string,
type: "is-success",
position: "is-bottom-right",
duration: 5000,
});
} catch (error) {
@@ -266,93 +295,105 @@ export default class Comment extends Vue {
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
@import "@/variables.scss";
.first-line {
* {
padding: 0 5px 0 0;
}
}
form.reply {
padding-bottom: 1rem;
}
.editor-line {
display: flex;
max-width: calc(80rem - 64px);
.first-line {
* {
padding: 0 5px 0 0;
}
}
.editor {
flex: 1;
padding-right: 10px;
margin-bottom: 0;
}
}
.editor-line {
display: flex;
max-width: calc(80rem - 64px);
.comment-link small:hover {
color: hsl(0, 0%, 21%);
}
.editor {
flex: 1;
padding-right: 10px;
margin-bottom: 0;
}
}
.root-comment .comment-replies > .reply {
padding-left: 3rem;
}
.comment-link small:hover {
color: hsl(0, 0%, 21%);
}
.media .media-content {
.root-comment .comment-replies > .reply {
padding-left: 3rem;
}
.content .editor-line {
display: flex;
align-items: center;
}
.media .media-content {
.content .editor-line {
display: flex;
align-items: center;
}
.icons {
display: none;
}
}
.icons {
display: none;
}
}
.media:hover .media-content .icons {
display: inline;
cursor: pointer;
}
.media:hover .media-content .icons {
display: inline;
.load-replies {
cursor: pointer;
}
button {
cursor: pointer;
border: none;
background: none;
}
}
article {
border-radius: 4px;
.load-replies {
cursor: pointer;
}
&.selected {
background-color: lighten($secondary, 30%);
}
&.organizer:not(.selected) {
background-color: lighten($primary, 50%);
}
}
article {
border-radius: 4px;
.comment-replies-enter-active,
.comment-replies-leave-active,
.comment-replies-move {
transition: 500ms cubic-bezier(0.59, 0.12, 0.34, 0.95);
transition-property: opacity, transform;
}
&.selected {
background-color: lighten($secondary, 30%);
}
&.organizer:not(.selected) {
background-color: lighten($primary, 50%);
}
}
.comment-replies-enter {
opacity: 0;
transform: translateX(50px) scaleY(0.5);
}
.comment-replies-enter-active,
.comment-replies-leave-active,
.comment-replies-move {
transition: 500ms cubic-bezier(0.59, 0.12, 0.34, 0.95);
transition-property: opacity, transform;
}
.comment-replies-enter-to {
opacity: 1;
transform: translateX(0) scaleY(1);
}
.comment-replies-enter {
opacity: 0;
transform: translateX(50px) scaleY(0.5);
}
.comment-replies-leave-active {
position: absolute;
}
.comment-replies-enter-to {
opacity: 1;
transform: translateX(0) scaleY(1);
}
.comment-replies-leave-to {
opacity: 0;
transform: scaleY(0);
transform-origin: center top;
}
.comment-replies-leave-active {
position: absolute;
}
.reply-action .icon {
padding-right: 0.4rem;
}
.comment-replies-leave-to {
opacity: 0;
transform: scaleY(0);
transform-origin: center top;
}
.reply-action .icon {
padding-right: 0.4rem;
}
.visually-hidden {
display: none;
}
</style>

View File

@@ -1,60 +1,66 @@
<template>
<div class="columns">
<div class="column is-two-thirds-desktop">
<form class="new-comment" v-if="currentActor.id && event.options.commentModeration !== CommentModeration.CLOSED" @submit.prevent="createCommentForEvent(newComment)" @keyup.ctrl.enter="createCommentForEvent(newComment)">
<article class="media">
<figure class="media-left">
<identity-picker-wrapper :inline="false" v-model="newComment.actor" />
</figure>
<div class="media-content">
<div class="field">
<p class="control">
<editor ref="commenteditor" mode="comment" v-model="newComment.text" />
</p>
</div>
<div class="send-comment">
<b-button native-type="submit" type="is-info">{{ $t('Post a comment') }}</b-button>
</div>
</div>
</article>
</form>
<b-notification v-else-if="event.options.commentModeration === CommentModeration.CLOSED" :closable="false">
{{ $t('Comments have been closed.') }}
</b-notification>
<transition name="comment-empty-list" mode="out-in">
<transition-group name="comment-list" v-if="comments.length" class="comment-list" tag="ul">
<comment
class="root-comment"
:comment="comment"
:event="event"
v-for="comment in orderedComments"
v-if="!comment.deletedAt || comment.totalReplies > 0"
:key="comment.id"
@create-comment="createCommentForEvent"
@delete-comment="deleteComment"
/>
</transition-group>
<div v-else class="no-comments">
<span>{{ $t('No comments yet') }}</span>
<img src="../../assets/undraw_just_saying.svg" alt="" />
</div>
</transition>
<div>
<form
class="new-comment"
v-if="currentActor.id && event.options.commentModeration !== CommentModeration.CLOSED"
@submit.prevent="createCommentForEvent(newComment)"
@keyup.ctrl.enter="createCommentForEvent(newComment)"
>
<article class="media">
<figure class="media-left">
<identity-picker-wrapper :inline="false" v-model="newComment.actor" />
</figure>
<div class="media-content">
<div class="field">
<p class="control">
<editor ref="commenteditor" mode="comment" v-model="newComment.text" />
</p>
</div>
<div class="send-comment">
<b-button native-type="submit" type="is-info">{{ $t("Post a comment") }}</b-button>
</div>
</div>
</div>
</article>
</form>
<b-notification
v-else-if="event.options.commentModeration === CommentModeration.CLOSED"
:closable="false"
>{{ $t("Comments have been closed.") }}</b-notification
>
<transition name="comment-empty-list" mode="out-in">
<transition-group name="comment-list" v-if="comments.length" class="comment-list" tag="ul">
<comment
class="root-comment"
:comment="comment"
:event="event"
v-for="comment in filteredOrderedComments"
:key="comment.id"
@create-comment="createCommentForEvent"
@delete-comment="deleteComment"
/>
</transition-group>
<div v-else class="no-comments">
<span>{{ $t("No comments yet") }}</span>
<img src="../../assets/undraw_just_saying.svg" alt />
</div>
</transition>
</div>
</template>
<script lang="ts">
import { Prop, Vue, Component, Watch } from 'vue-property-decorator';
import { CommentModel, IComment } from '@/types/comment.model';
import { Prop, Vue, Component, Watch } from "vue-property-decorator";
import Comment from "@/components/Comment/Comment.vue";
import IdentityPickerWrapper from "@/views/Account/IdentityPickerWrapper.vue";
import { CommentModel, IComment } from "../../types/comment.model";
import {
CREATE_COMMENT_FROM_EVENT,
DELETE_COMMENT, COMMENTS_THREADS, FETCH_THREAD_REPLIES,
} from '@/graphql/comment';
import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
import { IPerson } from '@/types/actor';
import Comment from '@/components/Comment/Comment.vue';
import { IEvent, CommentModeration } from '@/types/event.model';
import IdentityPickerWrapper from '@/views/Account/IdentityPickerWrapper.vue';
CREATE_COMMENT_FROM_EVENT,
DELETE_COMMENT,
COMMENTS_THREADS,
FETCH_THREAD_REPLIES,
} from "../../graphql/comment";
import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
import { IPerson } from "../../types/actor";
import { IEvent, CommentModeration } from "../../types/event.model";
@Component({
apollo: {
@@ -69,7 +75,7 @@ import IdentityPickerWrapper from '@/views/Account/IdentityPickerWrapper.vue';
};
},
update(data) {
return data.event.comments.map((comment) => new CommentModel(comment));
return data.event.comments.map((comment: IComment) => new CommentModel(comment));
},
skip() {
return !this.event.uuid;
@@ -79,18 +85,21 @@ import IdentityPickerWrapper from '@/views/Account/IdentityPickerWrapper.vue';
components: {
Comment,
IdentityPickerWrapper,
editor: () => import(/* webpackChunkName: "editor" */ '@/components/Editor.vue'),
editor: () => import(/* webpackChunkName: "editor" */ "@/components/Editor.vue"),
},
})
export default class CommentTree extends Vue {
@Prop({ required: false, type: Object }) event!: IEvent;
newComment: IComment = new CommentModel();
currentActor!: IPerson;
comments: IComment[] = [];
CommentModeration = CommentModeration;
@Watch('currentActor')
@Watch("currentActor")
watchCurrentActor(currentActor: IPerson) {
this.newComment.actor = currentActor;
}
@@ -123,10 +132,13 @@ export default class CommentTree extends Vue {
const { event } = commentThreadsData;
const { comments: oldComments } = event;
// if it's no a root comment, we first need to find existing replies and add the new reply to it
if (comment.originComment) {
// @ts-ignore
const parentCommentIndex = oldComments.findIndex(oldComment => oldComment.id === comment.originComment.id);
// if it's no a root comment, we first need to find
// existing replies and add the new reply to it
if (comment.originComment !== undefined) {
const { originComment } = comment;
const parentCommentIndex = oldComments.findIndex(
(oldComment) => oldComment.id === originComment.id
);
const parentComment = oldComments[parentCommentIndex];
let oldReplyList: IComment[] = [];
@@ -204,15 +216,15 @@ export default class CommentTree extends Vue {
if (comment.originComment) {
// we have deleted a reply to a thread
const data = store.readQuery<{ thread: IComment[] }>({
const localData = store.readQuery<{ thread: IComment[] }>({
query: FETCH_THREAD_REPLIES,
variables: {
threadId: comment.originComment.id,
},
});
if (!data) return;
const { thread: oldReplyList } = data;
const replies = oldReplyList.filter(reply => reply.id !== deletedCommentId);
if (!localData) return;
const { thread: oldReplyList } = localData;
const replies = oldReplyList.filter((reply) => reply.id !== deletedCommentId);
store.writeQuery({
query: FETCH_THREAD_REPLIES,
variables: {
@@ -221,8 +233,11 @@ export default class CommentTree extends Vue {
data: { thread: replies },
});
// @ts-ignore
const parentCommentIndex = oldComments.findIndex(oldComment => oldComment.id === comment.originComment.id);
const { originComment } = comment;
const parentCommentIndex = oldComments.findIndex(
(oldComment) => oldComment.id === originComment.id
);
const parentComment = oldComments[parentCommentIndex];
parentComment.replies = replies;
parentComment.totalReplies -= 1;
@@ -230,7 +245,7 @@ export default class CommentTree extends Vue {
event.comments = oldComments;
} else {
// we have deleted a thread itself
event.comments = oldComments.filter(reply => reply.id !== deletedCommentId);
event.comments = oldComments.filter((reply) => reply.id !== deletedCommentId);
}
store.writeQuery({
query: COMMENTS_THREADS,
@@ -245,84 +260,92 @@ export default class CommentTree extends Vue {
}
get orderedComments(): IComment[] {
return this.comments.filter((comment => comment.inReplyToComment == null)).sort((a, b) => {
if (a.updatedAt && b.updatedAt) {
return (new Date(b.updatedAt)).getTime() - (new Date(a.updatedAt)).getTime();
}
return 0;
});
return this.comments
.filter((comment) => comment.inReplyToComment == null)
.sort((a, b) => {
if (a.updatedAt && b.updatedAt) {
return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();
}
return 0;
});
}
get filteredOrderedComments(): IComment[] {
return this.orderedComments.filter((comment) => !comment.deletedAt || comment.totalReplies > 0);
}
}
</script>
<style lang="scss" scoped>
.new-comment {
.media-content {
display: flex;
align-items: center;
align-content: center;
form.new-comment {
padding-bottom: 1rem;
.field {
flex: 1;
padding-right: 10px;
margin-bottom: 0;
}
}
.media-content {
display: flex;
align-items: center;
align-content: center;
.field {
flex: 1;
padding-right: 10px;
margin-bottom: 0;
}
}
}
.no-comments {
display: flex;
flex-direction: column;
.no-comments {
display: flex;
flex-direction: column;
span {
text-align: center;
margin-bottom: 10px;
}
span {
text-align: center;
margin-bottom: 10px;
}
img {
max-width: 250px;
align-self: center;
}
}
img {
max-width: 250px;
align-self: center;
}
}
ul.comment-list li {
margin-bottom: 16px;
}
ul.comment-list li {
margin-bottom: 16px;
}
.comment-list-enter-active,
.comment-list-leave-active,
.comment-list-move {
transition: 500ms cubic-bezier(0.59, 0.12, 0.34, 0.95);
transition-property: opacity, transform;
}
.comment-list-enter-active,
.comment-list-leave-active,
.comment-list-move {
transition: 500ms cubic-bezier(0.59, 0.12, 0.34, 0.95);
transition-property: opacity, transform;
}
.comment-list-enter {
opacity: 0;
transform: translateX(50px) scaleY(0.5);
}
.comment-list-enter {
opacity: 0;
transform: translateX(50px) scaleY(0.5);
}
.comment-list-enter-to {
opacity: 1;
transform: translateX(0) scaleY(1);
}
.comment-list-enter-to {
opacity: 1;
transform: translateX(0) scaleY(1);
}
.comment-list-leave-active,
.comment-empty-list-active {
position: absolute;
}
.comment-list-leave-active,
.comment-empty-list-active {
position: absolute;
}
.comment-list-leave-to,
.comment-empty-list-leave-to {
opacity: 0;
transform: scaleY(0);
transform-origin: center top;
}
.comment-list-leave-to,
.comment-empty-list-leave-to {
opacity: 0;
transform: scaleY(0);
transform-origin: center top;
}
/*.comment-empty-list-enter-active {*/
/* transition: opacity .5s;*/
/*}*/
/*.comment-empty-list-enter-active {*/
/* transition: opacity .5s;*/
/*}*/
/*.comment-empty-list-enter {*/
/* opacity: 0;*/
/*}*/
/*.comment-empty-list-enter {*/
/* opacity: 0;*/
/*}*/
</style>

View File

@@ -0,0 +1,110 @@
<template>
<article class="comment">
<div class="avatar">
<figure class="image is-48x48" v-if="comment.actor.avatar">
<img class="is-rounded" :src="comment.actor.avatar.url" alt="" />
</figure>
<b-icon v-else size="is-medium" icon="account-circle" />
</div>
<div class="body">
<div class="meta">
<div class="name">
<span>@{{ comment.actor.preferredUsername }}</span>
</div>
<div class="post-infos">
<span>{{ comment.updatedAt | formatDateTimeString }}</span>
</div>
</div>
<div class="description-content" v-html="comment.text"></div>
</div>
</article>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { IComment } from "../../types/comment.model";
@Component
export default class ConversationComment extends Vue {
@Prop({ required: true, type: Object }) comment!: IComment;
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
article.comment {
display: flex;
border-top: 1px solid #e9e9e9;
div.body {
flex: 2;
margin-bottom: 2rem;
padding-top: 1rem;
.meta {
display: flex;
align-items: center;
padding: 0 1rem 0.3em;
.name {
margin-right: auto;
flex: 1 1 auto;
overflow: hidden;
span {
color: #3c376e;
}
}
}
div.description-content {
padding: 0 1rem 0.3rem;
/deep/ h1 {
font-size: 2rem;
}
/deep/ h2 {
font-size: 1.5rem;
}
/deep/ h3 {
font-size: 1.25rem;
}
/deep/ ul {
list-style-type: disc;
}
/deep/ li {
margin: 10px auto 10px 2rem;
}
/deep/ blockquote {
border-left: 0.2em solid #333;
display: block;
padding-left: 1em;
}
/deep/ p {
margin: 10px auto;
a {
display: inline-block;
padding: 0.3rem;
background: $secondary;
color: #111;
&:empty {
display: none;
}
}
}
}
}
div.avatar {
padding-top: 1rem;
flex: 0;
}
}
</style>

View File

@@ -0,0 +1,68 @@
<template>
<router-link
class="conversation-minimalist-card-wrapper"
:to="{ name: RouteName.CONVERSATION, params: { slug: conversation.slug, id: conversation.id } }"
>
<div class="media-left">
<figure class="image is-32x32" v-if="conversation.lastComment.actor.avatar">
<img class="is-rounded" :src="conversation.lastComment.actor.avatar.url" alt />
</figure>
<b-icon v-else size="is-medium" icon="account-circle" />
</div>
<div class="title-info-wrapper">
<p class="conversation-minimalist-title">{{ conversation.title }}</p>
<div class="has-text-grey">{{ htmlTextEllipsis }}</div>
</div>
</router-link>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { IConversation } from "../../types/conversations";
import RouteName from "../../router/name";
@Component
export default class ConversationListItem extends Vue {
@Prop({ required: true, type: Object }) conversation!: IConversation;
RouteName = RouteName;
get htmlTextEllipsis() {
const element = document.createElement("div");
element.innerHTML = this.conversation.lastComment.text
.replace(/<br\s*\/?>/gi, " ")
.replace(/<p>/gi, " ");
return element.innerText;
}
}
</script>
<style lang="scss" scoped>
.conversation-minimalist-card-wrapper {
display: flex;
width: 100%;
color: initial;
border-bottom: 1px solid #e9e9e9;
align-items: center;
.calendar-icon {
margin-right: 1rem;
}
.title-info-wrapper {
flex: 2;
.conversation-minimalist-title {
color: #3c376e;
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial, serif;
font-size: 1.25rem;
font-weight: 700;
}
div.has-text-grey {
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,21 @@
import { Node, Plugin } from 'tiptap';
import { UPLOAD_PICTURE } from '@/graphql/upload';
import { apolloProvider } from '@/vue-apollo';
import ApolloClient from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { Node } from "tiptap";
import { UPLOAD_PICTURE } from "@/graphql/upload";
import apolloProvider from "@/vue-apollo";
import ApolloClient from "apollo-client";
import { NormalizedCacheObject } from "apollo-cache-inmemory";
import { NodeType, NodeSpec } from "prosemirror-model";
import { EditorState, Plugin, TextSelection } from "prosemirror-state";
import { DispatchFn } from "tiptap-commands";
import { EditorView } from "prosemirror-view";
/* eslint-disable class-methods-use-this */
export default class Image extends Node {
get name() {
return 'image';
return "image";
}
get schema() {
get schema(): NodeSpec {
return {
inline: true,
attrs: {
@@ -22,25 +27,25 @@ export default class Image extends Node {
default: null,
},
},
group: 'inline',
group: "inline",
draggable: true,
parseDOM: [
{
tag: 'img[src]',
getAttrs: dom => ({
src: dom.getAttribute('src'),
title: dom.getAttribute('title'),
alt: dom.getAttribute('alt'),
tag: "img[src]",
getAttrs: (dom: any) => ({
src: dom.getAttribute("src"),
title: dom.getAttribute("title"),
alt: dom.getAttribute("alt"),
}),
},
],
toDOM: node => ['img', node.attrs],
toDOM: (node: any) => ["img", node.attrs],
};
}
commands({ type }) {
return attrs => (state, dispatch) => {
const { selection } = state;
commands({ type }: { type: NodeType }): any {
return (attrs: { [key: string]: string }) => (state: EditorState, dispatch: DispatchFn) => {
const { selection }: { selection: TextSelection } = state;
const position = selection.$cursor ? selection.$cursor.pos : selection.$to.pos;
const node = type.create(attrs);
const transaction = state.tr.insert(position, node);
@@ -53,28 +58,39 @@ export default class Image extends Node {
new Plugin({
props: {
handleDOMEvents: {
async drop(view, event: DragEvent) {
if (!(event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files.length)) {
return;
drop(view: EditorView<any>, event: Event) {
const realEvent = event as DragEvent;
if (
!(
realEvent.dataTransfer &&
realEvent.dataTransfer.files &&
realEvent.dataTransfer.files.length
)
) {
return false;
}
const images = Array
.from(event.dataTransfer.files)
.filter((file: any) => (/image/i).test(file.type));
const images = Array.from(realEvent.dataTransfer.files).filter((file: any) =>
/image/i.test(file.type)
);
if (images.length === 0) {
return;
return false;
}
event.preventDefault();
realEvent.preventDefault();
const { schema } = view.state;
const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });
const client = apolloProvider.defaultClient as ApolloClient<InMemoryCache>;
const editorElem = document.getElementById('tiptab-editor');
const coordinates = view.posAtCoords({
left: realEvent.clientX,
top: realEvent.clientY,
});
if (!coordinates) return false;
const client = apolloProvider.defaultClient as ApolloClient<NormalizedCacheObject>;
const editorElem = document.getElementById("tiptab-editor");
const actorId = editorElem && editorElem.dataset.actorId;
for (const image of images) {
images.forEach(async (image) => {
const { data } = await client.mutate({
mutation: UPLOAD_PICTURE,
variables: {
@@ -86,12 +102,12 @@ export default class Image extends Node {
const node = schema.nodes.image.create({ src: data.uploadPicture.url });
const transaction = view.state.tr.insert(coordinates.pos, node);
view.dispatch(transaction);
}
});
return true;
},
},
},
}),
];
}
}

View File

@@ -1,133 +1,155 @@
<template>
<div class="address-autocomplete">
<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="addressData"
v-model="queryText"
:placeholder="$t('e.g. 10 Rue Jangot')"
field="fullName"
:loading="isFetching"
@typing="fetchAsyncData"
icon="map-marker"
expanded
@select="updateSelected">
<template slot-scope="{option}">
<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="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>
<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 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>-->
<!-- <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>-->
<!-- </b-field>-->
<!-- </form>-->
<!-- </section>-->
<!-- <footer class="modal-card-foot">-->
<!-- <button class="button" type="button" @click="resetPopup()">{{ $t('Clear') }}</button>-->
<!-- </footer>-->
<!-- </div>-->
<!-- </b-modal>-->
<div class="address-autocomplete">
<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="addressData"
v-model="queryText"
:placeholder="$t('e.g. 10 Rue Jangot')"
field="fullName"
:loading="isFetching"
@typing="fetchAsyncData"
icon="map-marker"
expanded
@select="updateSelected"
>
<template slot-scope="{ option }">
<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="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>
<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 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>-->
<!-- <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>-->
<!-- </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, 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';
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { LatLng } from "leaflet";
import { debounce } from "lodash";
import { Address, IAddress } from "../../types/address.model";
import { ADDRESS, REVERSE_GEOCODE } from "../../graphql/address";
import { CONFIG } from "../../graphql/config";
import { IConfig } from "../../types/config.model";
@Component({
components: {
'map-leaflet': () => import(/* webpackChunkName: "map" */ '@/components/Map.vue'),
Modal,
"map-leaflet": () => import(/* webpackChunkName: "map" */ "@/components/Map.vue"),
},
apollo: {
config: CONFIG,
},
})
export default class AddressAutoComplete extends Vue {
@Prop({ required: true }) value!: IAddress;
addressData: IAddress[] = [];
selected: IAddress = new Address();
isFetching: boolean = false;
queryText: string = (this.value && (new Address(this.value)).fullName) || '';
addressModalActive: boolean = false;
private gettingLocation: boolean = false;
isFetching = false;
queryText: string = (this.value && new Address(this.value).fullName) || "";
addressModalActive = false;
private gettingLocation = false;
private location!: Position;
private gettingLocationError: any;
private mapDefaultZoom: number = 15;
private mapDefaultZoom = 15;
config!: IConfig;
// We put this in data because of issues like https://github.com/vuejs/vue-class-component/issues/263
fetchAsyncData!: Function;
// We put this in data because of issues like
// https://github.com/vuejs/vue-class-component/issues/263
data() {
return {
fetchAsyncData: debounce(this.asyncData, 200),
};
}
async asyncData(query: String) {
async asyncData(query: string) {
if (!query.length) {
this.addressData = [];
this.selected = new Address();
@@ -142,27 +164,27 @@ export default class AddressAutoComplete extends Vue {
this.isFetching = true;
const result = await this.$apollo.query({
query: ADDRESS,
fetchPolicy: 'network-only',
fetchPolicy: "network-only",
variables: {
query,
locale: this.$i18n.locale,
},
});
this.addressData = result.data.searchAddress.map(address => new Address(address));
this.addressData = result.data.searchAddress.map((address: IAddress) => new Address(address));
this.isFetching = false;
}
@Watch('config')
watchConfig(config: IConfig) {
@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
// If autocomplete is disabled, we put a larger debounce value
// so that we don't request with incomplete address
this.fetchAsyncData = debounce(this.asyncData, 2000);
}
}
@Watch('value')
@Watch("value")
updateEditing() {
if (!(this.value && this.value.id)) return;
this.selected = this.value;
@@ -170,10 +192,10 @@ export default class AddressAutoComplete extends Vue {
this.queryText = `${address.poiInfos.name} ${address.poiInfos.alternativeName}`;
}
updateSelected(option) {
updateSelected(option: IAddress) {
if (option == null) return;
this.selected = option;
this.$emit('input', this.selected);
this.$emit("input", this.selected);
}
resetPopup() {
@@ -185,8 +207,8 @@ export default class AddressAutoComplete extends Vue {
this.addressModalActive = true;
}
async reverseGeoCode(e: LatLng, zoom: Number) {
// If the position has been updated through autocomplete selection, no need to geocode it !
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,
@@ -198,74 +220,77 @@ export default class AddressAutoComplete extends Vue {
},
});
this.addressData = result.data.reverseGeocode.map(address => new Address(address));
this.addressData = result.data.reverseGeocode.map((address: IAddress) => new Address(address));
const defaultAddress = new Address(this.addressData[0]);
this.selected = defaultAddress;
this.$emit('input', this.selected);
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]);
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.location = await AddressAutoComplete.getLocation();
this.mapDefaultZoom = 12;
this.reverseGeoCode(new LatLng(this.location.coords.latitude, this.location.coords.longitude), 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> {
static async getLocation(): Promise<Position> {
return new Promise((resolve, reject) => {
if (!('geolocation' in navigator)) {
reject(new Error('Geolocation is not available.'));
if (!("geolocation" in navigator)) {
reject(new Error("Geolocation is not available."));
}
navigator.geolocation.getCurrentPosition(pos => {
resolve(pos);
}, err => {
reject(err);
});
navigator.geolocation.getCurrentPosition(
(pos) => {
resolve(pos);
},
(err) => {
reject(err);
}
);
});
}
}
</script>
<style lang="scss">
.address-autocomplete {
margin-bottom: 0.75rem;
}
.address-autocomplete {
margin-bottom: 0.75rem;
}
.autocomplete {
.dropdown-menu {
z-index: 2000;
}
.autocomplete {
.dropdown-menu {
z-index: 2000;
}
.dropdown-item.is-disabled {
opacity: 1 !important;
cursor: auto;
}
}
.dropdown-item.is-disabled {
opacity: 1 !important;
cursor: auto;
}
}
.read-only {
cursor: pointer;
}
.read-only {
cursor: pointer;
}
.map {
height: 400px;
width: 100%;
}
.map {
height: 400px;
width: 100%;
}
</style>

View File

@@ -12,13 +12,13 @@
</docs>
<template>
<time class="datetime-container" :datetime="dateObj.getUTCSeconds()">
<span class="month">{{ month }}</span>
<span class="day">{{ day }}</span>
</time>
<time class="datetime-container" :datetime="dateObj.getUTCSeconds()">
<span class="month">{{ month }}</span>
<span class="day">{{ day }}</span>
</time>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Component, Prop, Vue } from "vue-property-decorator";
@Component
export default class DateCalendarIcon extends Vue {
@@ -32,44 +32,44 @@ export default class DateCalendarIcon extends Vue {
}
get month() {
return this.dateObj.toLocaleString(undefined, { month: 'short' });
return this.dateObj.toLocaleString(undefined, { month: "short" });
}
get day() {
return this.dateObj.toLocaleString(undefined, { day: 'numeric' });
return this.dateObj.toLocaleString(undefined, { day: "numeric" });
}
}
</script>
<style lang="scss" scoped>
time.datetime-container {
background: #f6f7f8;
border: 1px solid rgba(46,62,72,.12);
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
/*height: 50px;*/
width: 50px;
padding: 8px;
text-align: center;
time.datetime-container {
background: #f6f7f8;
border: 1px solid rgba(46, 62, 72, 0.12);
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
/*height: 50px;*/
width: 50px;
padding: 8px;
text-align: center;
span {
display: block;
font-weight: 600;
span {
display: block;
font-weight: 600;
&.month {
color: #fa3e3e;
padding: 2px 0;
font-size: 12px;
line-height: 12px;
text-transform: uppercase;
}
&.month {
color: #fa3e3e;
padding: 2px 0;
font-size: 12px;
line-height: 12px;
text-transform: uppercase;
}
&.day {
font-size: 20px;
line-height: 20px;
}
&.day {
font-size: 20px;
line-height: 20px;
}
}
}
</style>

View File

@@ -12,40 +12,41 @@
```
</docs>
<template>
<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 calendar-picker">
<b-datepicker
:day-names="localeShortWeekDayNamesProxy"
:month-names="localeMonthNamesProxy"
:first-day-of-week="parseInt($t('firstDayOfWeek'), 10)"
:min-date="minDatetime"
:max-date="maxDatetime"
v-model="dateWithTime"
: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"
:min-time="minDatetime"
:max-time="maxDatetime"
size="is-small"
inline>
</b-timepicker>
</div>
</div>
<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 calendar-picker">
<b-datepicker
:day-names="localeShortWeekDayNamesProxy"
:month-names="localeMonthNamesProxy"
:first-day-of-week="parseInt($t('firstDayOfWeek'), 10)"
:min-date="minDatetime"
:max-date="maxDatetime"
v-model="dateWithTime"
: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"
:min-time="minDatetime"
:max-time="maxDatetime"
size="is-small"
inline
>
</b-timepicker>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
import { localeMonthNames, localeShortWeekDayNames } from '@/utils/datetime';
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { localeMonthNames, localeShortWeekDayNames } from "@/utils/datetime";
@Component
export default class DateTimePicker extends Vue {
@@ -58,34 +59,35 @@ export default class DateTimePicker extends Vue {
/**
* What's shown besides the picker
*/
@Prop({ required: false, type: String, default: 'Datetime' }) label!: string;
@Prop({ required: false, type: String, default: "Datetime" }) label!: string;
/**
* The step for the time input
*/
@Prop({ required: false, type: Number, default: 1 }) step!: number;
/**
* Earliest date available for selection
*/
/**
* Earliest date available for selection
*/
@Prop({ required: false, type: Date, default: null }) minDatetime!: Date;
/**
* Latest date available for selection
*/
/**
* Latest date available for selection
*/
@Prop({ required: false, type: Date, default: null }) maxDatetime!: Date;
dateWithTime: Date = this.value;
localeShortWeekDayNamesProxy = localeShortWeekDayNames();
localeMonthNamesProxy = localeMonthNames();
@Watch('value')
@Watch("value")
updateValue() {
this.dateWithTime = this.value;
}
@Watch('dateWithTime')
@Watch("dateWithTime")
updateDateWithTimeWatcher() {
this.updateDateTime();
}
@@ -96,21 +98,21 @@ export default class DateTimePicker extends Vue {
*
* @type {Date}
*/
this.$emit('input', this.dateWithTime);
this.$emit("input", this.dateWithTime);
}
}
</script>
<style lang="scss" scoped>
.timepicker {
/deep/ .dropdown-content {
padding: 0;
}
}
.timepicker {
/deep/ .dropdown-content {
padding: 0;
}
}
.calendar-picker {
/deep/ .dropdown-menu {
z-index: 200;
}
}
.calendar-picker {
/deep/ .dropdown-menu {
z-index: 200;
}
}
</style>

View File

@@ -5,7 +5,7 @@ A simple card for an event
```vue
<EventCard
:event="{
:event="{
title: 'Vue Styleguidist first meetup: learn the basics!',
beginsOn: new Date(),
tags: [
@@ -29,9 +29,16 @@ A simple card for an event
<template>
<router-link class="card" :to="{ name: 'Event', params: { uuid: event.uuid } }">
<div class="card-image">
<figure class="image is-16by9" :style="`background-image: url('${event.picture ? event.picture.url : '/img/mobilizon_default_card.png'}')`">
<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-light">{{ tag.title }}</b-tag>
<b-tag v-for="tag in event.tags.slice(0, 3)" :key="tag.slug" type="is-light">{{
tag.title
}}</b-tag>
</div>
</figure>
</div>
@@ -43,57 +50,57 @@ A simple card for an event
<div class="media-content">
<p class="event-title">{{ event.title }}</p>
<div class="event-subtitle" v-if="event.physicalAddress">
<!-- <p>{{ $t('By @{username}', { username: actor.preferredUsername }) }}</p>-->
<!-- <p>{{ $t('By @{username}', { username: actor.preferredUsername }) }}</p>-->
<span>
{{ event.physicalAddress.description }}, {{ event.physicalAddress.locality }}
{{ event.physicalAddress.description }}, {{ event.physicalAddress.locality }}
</span>
</div>
</div>
</div>
</div>
<!-- <div class="date-and-title">-->
<!-- <div class="date-component">-->
<!-- <date-calendar-icon v-if="!mergedOptions.hideDate" :date="event.beginsOn" />-->
<!-- </div>-->
<!-- <div class="title-wrapper">-->
<!-- <h4>{{ event.title }}</h4>-->
<!-- <div class="organizer-place-wrapper has-text-grey">-->
<!-- <span>{{ $t('By @{username}', { username: actor.preferredUsername }) }}</span>-->
<!-- ·-->
<!-- <span v-if="event.physicalAddress">-->
<!-- {{ event.physicalAddress.description }}, {{ event.physicalAddress.locality }}-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div v-if="!mergedOptions.hideDetails" class="details">-->
<!-- <div v-if="event.participants.length > 0 &&-->
<!-- mergedOptions.loggedPerson &&-->
<!-- event.participants[0].actor.id === mergedOptions.loggedPerson.id">-->
<!-- <b-tag type="is-info"><translate>Organizer</translate></b-tag>-->
<!-- </div>-->
<!-- <div v-else-if="event.participants.length === 1">-->
<!-- <translate-->
<!-- :translate-params="{name: event.participants[0].actor.preferredUsername}"-->
<!-- >{name} organizes this event</translate>-->
<!-- </div>-->
<!-- <div v-else>-->
<!-- <span v-for="participant in event.participants" :key="participant.actor.uuid">-->
<!-- {{ participant.actor.preferredUsername }}-->
<!-- <span v-if="participant.role === ParticipantRole.CREATOR">(organizer)</span>,-->
<!-- &lt;!&ndash; <translate-->
<!-- :translate-params="{name: participant.actor.preferredUsername}"-->
<!-- >&nbsp;{name} is in,</translate>&ndash;&gt;-->
<!-- </span>-->
<!-- </div>-->
</router-link>
<!-- <div class="date-and-title">-->
<!-- <div class="date-component">-->
<!-- <date-calendar-icon v-if="!mergedOptions.hideDate" :date="event.beginsOn" />-->
<!-- </div>-->
<!-- <div class="title-wrapper">-->
<!-- <h4>{{ event.title }}</h4>-->
<!-- <div class="organizer-place-wrapper has-text-grey">-->
<!-- <span>{{ $t('By @{username}', { username: actor.preferredUsername }) }}</span>-->
<!-- ·-->
<!-- <span v-if="event.physicalAddress">-->
<!-- {{ event.physicalAddress.description }}, {{ event.physicalAddress.locality }}-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div v-if="!mergedOptions.hideDetails" class="details">-->
<!-- <div v-if="event.participants.length > 0 &&-->
<!-- mergedOptions.loggedPerson &&-->
<!-- event.participants[0].actor.id === mergedOptions.loggedPerson.id">-->
<!-- <b-tag type="is-info"><translate>Organizer</translate></b-tag>-->
<!-- </div>-->
<!-- <div v-else-if="event.participants.length === 1">-->
<!-- <translate-->
<!-- :translate-params="{name: event.participants[0].actor.preferredUsername}"-->
<!-- >{name} organizes this event</translate>-->
<!-- </div>-->
<!-- <div v-else>-->
<!-- <span v-for="participant in event.participants" :key="participant.actor.uuid">-->
<!-- {{ participant.actor.preferredUsername }}-->
<!-- <span v-if="participant.role === ParticipantRole.CREATOR">(organizer)</span>,-->
<!-- &lt;!&ndash; <translate-->
<!-- :translate-params="{name: participant.actor.preferredUsername}"-->
<!-- >&nbsp;{name} is in,</translate>&ndash;&gt;-->
<!-- </span>-->
<!-- </div>-->
</router-link>
</template>
<script lang="ts">
import { IEvent, IEventCardOptions, ParticipantRole } from '@/types/event.model';
import { Component, Prop, Vue } from 'vue-property-decorator';
import DateCalendarIcon from '@/components/Event/DateCalendarIcon.vue';
import { Actor, Person } from '@/types/actor';
import { IEvent, IEventCardOptions, ParticipantRole } from "@/types/event.model";
import { Component, Prop, Vue } from "vue-property-decorator";
import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
import { Actor, Person } from "@/types/actor";
@Component({
components: {
@@ -102,6 +109,7 @@ import { Actor, Person } from '@/types/actor';
})
export default class EventCard extends Vue {
@Prop({ required: true }) event!: IEvent;
@Prop({ required: false }) options!: IEventCardOptions;
ParticipantRole = ParticipantRole;
@@ -118,102 +126,103 @@ export default class EventCard extends Vue {
}
get actor(): Actor {
return Object.assign(new Person(), this.event.organizerActor || this.mergedOptions.organizerActor);
return Object.assign(
new Person(),
this.event.organizerActor || this.mergedOptions.organizerActor
);
}
}
</script>
<style lang="scss" scoped>
@import "../../variables";
@import "../../variables";
a.card {
display: block;
background: $secondary;
&:hover {
// box-shadow: 0 0 5px 0 rgba(0, 0, 0, 1);
transform: scale(1.01, 1.01);
&:after {
opacity: 1;
}
}
border-radius: 5px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
a.card {
display: block;
background: $secondary;
&:hover {
// box-shadow: 0 0 5px 0 rgba(0, 0, 0, 1);
transform: scale(1.01, 1.01);
&:after {
content: "";
border-radius: 5px;
position: absolute;
z-index: -1;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
}
div.tag-container {
position: absolute;
top: 10px;
right: 0;
margin-right: -3px;
z-index: 10;
max-width: 40%;
span.tag {
margin: 5px auto;
text-overflow: ellipsis;
overflow: hidden;
display: block;
font-size: 1em;
line-height: 1.75em;
}
}
div.card-image {
background: $secondary;
figure.image {
background-size: cover;
background-position: center;
}
}
.card-content {
padding: 0.5rem;
.event-title {
font-size: 1.25rem;
line-height: 1.25rem;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
min-height: 2.4rem;
}
.event-subtitle {
font-size: 0.85rem;
display: inline-flex;
flex-wrap: wrap;
span {
width: 15rem;
display: block;
overflow: hidden;
flex-grow: 1;
text-overflow: ellipsis;
white-space: nowrap;
}
}
opacity: 1;
}
}
border-radius: 5px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
&:after {
content: "";
border-radius: 5px;
position: absolute;
z-index: -1;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
}
div.tag-container {
position: absolute;
top: 10px;
right: 0;
margin-right: -3px;
z-index: 10;
max-width: 40%;
span.tag {
margin: 5px auto;
text-overflow: ellipsis;
overflow: hidden;
display: block;
font-size: 1em;
line-height: 1.75em;
}
}
div.card-image {
background: $secondary;
figure.image {
background-size: cover;
background-position: center;
}
}
.card-content {
padding: 0.5rem;
.event-title {
font-size: 1.25rem;
line-height: 1.25rem;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
min-height: 2.4rem;
}
.event-subtitle {
font-size: 0.85rem;
display: inline-flex;
flex-wrap: wrap;
span {
width: 15rem;
display: block;
overflow: hidden;
flex-grow: 1;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
</style>

View File

@@ -18,55 +18,87 @@
</docs>
<template>
<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="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>
<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="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';
import { Component, Prop, Vue } from "vue-property-decorator";
@Component
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;
formatDate(value: Date): string | undefined {
if (!this.$options.filters) return undefined;
return this.$options.filters.formatDateString(value);
}
formatTime(value) {
if (!this.$options.filters) return;
formatTime(value: Date): string | undefined {
if (!this.$options.filters) return undefined;
return this.$options.filters.formatTimeString(value);
}
isSameDay() {
const sameDay = ((new Date(this.beginsOn)).toDateString()) === ((new Date(this.endsOn)).toDateString());
return this.endsOn && sameDay;
isSameDay(): boolean {
const sameDay = new Date(this.beginsOn).toDateString() === new Date(this.endsOn).toDateString();
return this.endsOn !== undefined && sameDay;
}
}
</script>

View File

@@ -1,55 +1,3 @@
<docs>
A simple card for a participation (we should rename it)
```vue
<template>
<div>
<EventListCard
:participation="participation"
/>
</div>
</template>
<script>
export default {
data() {
return {
participation: {
event: {
title: 'Vue Styleguidist first meetup: learn the basics!',
id: 5,
uuid: 'some uuid',
beginsOn: new Date(),
organizerActor: {
preferredUsername: 'tcit',
name: 'Some Random Dude',
domain: null,
id: 4,
displayName() { return 'Some random dude' }
},
options: {
maximumAttendeeCapacity: 4
},
participantStats: {
approved: 1,
notApproved: 2
}
},
actor: {
preferredUsername: 'tcit',
name: 'Some Random Dude',
domain: null,
id: 4,
displayName() { return 'Some random dude' }
},
role: 'CREATOR',
}
}
}
}
</script>
```
</docs>
<template>
<article class="box">
<div class="columns">
@@ -58,37 +6,72 @@ export default {
<div class="date-component">
<date-calendar-icon :date="participation.event.beginsOn" />
</div>
<router-link :to="{ name: RouteName.EVENT, params: { uuid: participation.event.uuid } }"><h2 class="title">{{participation.event.title }}</h2></router-link>
<router-link :to="{ name: RouteName.EVENT, params: { uuid: participation.event.uuid } }">
<h2 class="title">{{ participation.event.title }}</h2>
</router-link>
</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.event.physicalAddress && participation.event.physicalAddress.locality
"
>{{ participation.event.physicalAddress.locality }} -</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>
{{
$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-open" v-if="participation.event.visibility === EventVisibility.UNLISTED" />
<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 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>-->
{{
$t("{approved} / {total} seats", {
approved: participation.event.participantStats.participant,
total: participation.event.options.maximumAttendeeCapacity,
})
}}
</span>
<span v-else>
{{ $tc('{count} participants', participation.event.participantStats.participant, { count: participation.event.participantStats.participant })}}
{{
$tc("{count} participants", participation.event.participantStats.participant, {
count: participation.event.participantStats.participant,
})
}}
</span>
<span
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 })}}
<span 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>
@@ -96,56 +79,86 @@ export default {
</div>
<div class="actions column is-narrow">
<ul>
<li v-if="!([ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(participation.role))">
<li
v-if="
![ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(
participation.role
)
"
>
<b-button
type="is-text"
@click="gotToWithCheck(participation, { name: RouteName.EDIT_EVENT, params: { eventId: participation.event.uuid } })"
icon-left="pencil"
type="is-text"
@click="
gotToWithCheck(participation, {
name: RouteName.EDIT_EVENT,
params: { eventId: participation.event.uuid },
})
"
icon-left="pencil"
>{{ $t("Edit") }}</b-button
>
{{ $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
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))">
<li
v-if="
![ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(
participation.role
)
"
>
<b-button
type="is-text"
@click="gotToWithCheck(participation, { name: RouteName.PARTICIPATIONS, params: { eventId: participation.event.uuid } })"
icon-left="account-multiple-plus"
type="is-text"
@click="
gotToWithCheck(participation, {
name: RouteName.PARTICIPATIONS,
params: { eventId: participation.event.uuid },
})
"
icon-left="account-multiple-plus"
>{{ $t("Manage participations") }}</b-button
>
{{ $t('Manage participations') }}
</b-button>
</li>
<li>
<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>
:to="{ name: RouteName.EVENT, params: { uuid: participation.event.uuid } }"
>{{ $t("View event page") }}</b-button
>
</li>
</ul>
</div>
</div>
</article>
</article>
</template>
<script lang="ts">
import { IParticipant, ParticipantRole, EventVisibility, IEventCardOptions } from '@/types/event.model';
import { Component, Prop } from 'vue-property-decorator';
import DateCalendarIcon from '@/components/Event/DateCalendarIcon.vue';
import { IPerson } from '@/types/actor';
import { mixins } from 'vue-class-component';
import ActorMixin from '@/mixins/actor';
import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
import EventMixin from '@/mixins/event';
import { RouteName } from '@/router';
import { changeIdentity } from '@/utils/auth';
import { Route } from 'vue-router';
import { Component, Prop } from "vue-property-decorator";
import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
import { mixins } from "vue-class-component";
import { RawLocation } from "vue-router";
import {
IParticipant,
ParticipantRole,
EventVisibility,
IEventCardOptions,
} from "../../types/event.model";
import { IPerson } from "../../types/actor";
import ActorMixin from "../../mixins/actor";
import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
import EventMixin from "../../mixins/event";
import RouteName from "../../router/name";
import { changeIdentity } from "../../utils/auth";
const defaultOptions: IEventCardOptions = {
hideDate: true,
@@ -169,15 +182,19 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
* The participation associated
*/
@Prop({ required: true }) participation!: IParticipant;
/**
* Options are merged with default options
*/
@Prop({ required: false, default: () => defaultOptions }) options!: IEventCardOptions;
@Prop({ required: false, default: () => defaultOptions })
options!: IEventCardOptions;
currentActor!: IPerson;
ParticipantRole = ParticipantRole;
EventVisibility = EventVisibility;
RouteName = RouteName;
get mergedOptions(): IEventCardOptions {
@@ -191,114 +208,116 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
await this.openDeleteEventModal(this.participation.event, this.currentActor);
}
async gotToWithCheck(participation: IParticipant, route: Route) {
async gotToWithCheck(participation: IParticipant, route: RawLocation) {
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',
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);
return this.$router.push(route);
}
}
</script>
<style lang="scss" scoped>
@import "../../variables";
@import "../../variables";
article.box {
div.tag-container {
position: absolute;
top: 10px;
right: 0;
margin-right: -5px;
z-index: 10;
max-width: 40%;
article.box {
div.tag-container {
position: absolute;
top: 10px;
right: 0;
margin-right: -5px;
z-index: 10;
max-width: 40%;
span.tag {
margin: 5px auto;
box-shadow: 0 0 5px 0 rgba(0, 0, 0, 1);
/*word-break: break-all;*/
text-overflow: ellipsis;
span.tag {
margin: 5px auto;
box-shadow: 0 0 5px 0 rgba(0, 0, 0, 1);
/*word-break: break-all;*/
text-overflow: ellipsis;
overflow: hidden;
display: block;
/*text-align: right;*/
font-size: 1em;
/*padding: 0 1px;*/
line-height: 1.75em;
}
}
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;
div.date-component {
flex: 0;
margin-right: 16px;
}
.title {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
display: block;
/*text-align: right;*/
font-size: 1em;
/*padding: 0 1px;*/
line-height: 1.75em;
}
}
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;
div.date-component {
flex: 0;
margin-right: 16px;
}
.title {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
font-weight: 400;
line-height: 1em;
font-size: 1.6em;
padding-bottom: 5px;
margin: auto 0;
}
}
/deep/ progress + .progress-value {
color: lighten($primary, 20%) !important;
font-weight: 400;
line-height: 1em;
font-size: 1.6em;
padding-bottom: 5px;
margin: auto 0;
}
}
.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;
color: $primary;
}
}
/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;
color: $primary;
}
}
}
}
</style>

View File

@@ -1,48 +1,3 @@
<docs>
A simple card for an event
```vue
<template>
<div>
<EventListViewCard
:event="event"
/>
</div>
</template>
<script>
export default {
data() {
return {
event: {
title: 'Vue Styleguidist first meetup: learn the basics!',
id: 5,
uuid: 'some uuid',
beginsOn: new Date(),
organizerActor: {
preferredUsername: 'tcit',
name: 'Some Random Dude',
domain: null,
id: 4,
displayName() {
return 'Some random dude'
}
},
options: {
maximumAttendeeCapacity: 4
},
participantStats: {
approved: 1,
notApproved: 2
}
}
}
}
}
}
</script>
```
</docs>
<template>
<article class="box">
<div class="columns">
@@ -51,12 +6,18 @@ export default {
<div class="date-component">
<date-calendar-icon :date="event.beginsOn" />
</div>
<router-link :to="{ name: RouteName.EVENT, params: { uuid: event.uuid } }"><h2 class="title">{{ event.title }}</h2></router-link>
<router-link :to="{ name: RouteName.EVENT, params: { uuid: event.uuid } }">
<h2 class="title">{{ event.title }}</h2>
</router-link>
</div>
<div class="participation-actor has-text-grey">
<span v-if="event.physicalAddress && event.physicalAddress.locality">{{ event.physicalAddress.locality }}</span>
<span v-if="event.physicalAddress && event.physicalAddress.locality">
{{ event.physicalAddress.locality }}
</span>
<span>
<span>{{ $t('Organized by {name}', { name: event.organizerActor.displayName() } ) }}</span>
<span>
{{ $t("Organized by {name}", { name: event.organizerActor.displayName() }) }}
</span>
</span>
</div>
<div class="columns">
@@ -67,30 +28,44 @@ export default {
</span>
<span class="column is-narrow participant-stats">
<span v-if="event.options.maximumAttendeeCapacity !== 0">
{{ $t('{approved} / {total} seats', {approved: event.participantStats.participant, total: event.options.maximumAttendeeCapacity }) }}
{{
$t("{approved} / {total} seats", {
approved: event.participantStats.participant,
total: event.options.maximumAttendeeCapacity,
})
}}
</span>
<span v-else>
{{ $tc('{count} participants', event.participantStats.participant, { count: event.participantStats.participant })}}
{{
$tc("{count} participants", event.participantStats.participant, {
count: event.participantStats.participant,
})
}}
</span>
</span>
</div>
</div>
</div>
</article>
</article>
</template>
<script lang="ts">
import { IParticipant, ParticipantRole, EventVisibility, IEventCardOptions } from '@/types/event.model';
import { Component, Prop } from 'vue-property-decorator';
import DateCalendarIcon from '@/components/Event/DateCalendarIcon.vue';
import { IPerson } from '@/types/actor';
import { mixins } from 'vue-class-component';
import ActorMixin from '@/mixins/actor';
import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
import EventMixin from '@/mixins/event';
import { RouteName } from '@/router';
import { changeIdentity } from '@/utils/auth';
import { Route } from 'vue-router';
import {
IParticipant,
ParticipantRole,
EventVisibility,
IEventCardOptions,
} from "@/types/event.model";
import { Component, Prop } from "vue-property-decorator";
import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
import { IPerson } from "@/types/actor";
import { mixins } from "vue-class-component";
import ActorMixin from "@/mixins/actor";
import { CURRENT_ACTOR_CLIENT } from "@/graphql/actor";
import EventMixin from "@/mixins/event";
import { changeIdentity } from "@/utils/auth";
import { Route } from "vue-router";
import RouteName from "../../router/name";
const defaultOptions: IEventCardOptions = {
hideDate: true,
@@ -114,58 +89,61 @@ export default class EventListViewCard extends mixins(ActorMixin, EventMixin) {
* The participation associated
*/
@Prop({ required: true }) event!: IParticipant;
/**
* Options are merged with default options
*/
@Prop({ required: false, default: () => defaultOptions }) options!: IEventCardOptions;
@Prop({ required: false, default: () => defaultOptions })
options!: IEventCardOptions;
currentActor!: IPerson;
ParticipantRole = ParticipantRole;
EventVisibility = EventVisibility;
RouteName = RouteName;
EventVisibility = EventVisibility;
RouteName = RouteName;
}
</script>
<style lang="scss" scoped>
@import "../../variables";
@import "../../variables";
article.box {
div.content {
padding: 5px;
article.box {
div.content {
padding: 5px;
.participation-actor span, .participant-stats span {
padding: 0 5px;
.participation-actor span,
.participant-stats span {
padding: 0 5px;
button {
height: auto;
padding-top: 0;
}
button {
height: auto;
padding-top: 0;
}
}
div.title-wrapper {
display: flex;
align-items: center;
div.date-component {
flex: 0;
margin-right: 16px;
}
div.title-wrapper {
display: flex;
align-items: center;
div.date-component {
flex: 0;
margin-right: 16px;
}
.title {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
font-weight: 400;
line-height: 1em;
font-size: 1.6em;
padding-bottom: 5px;
margin: auto 0;
}
.title {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
font-weight: 400;
line-height: 1em;
font-size: 1.6em;
padding-bottom: 5px;
margin: auto 0;
}
}
}
}
</style>

View File

@@ -0,0 +1,42 @@
<template>
<div>
<h2>{{ title }}</h2>
<div class="eventMetadataBlock">
<b-icon v-if="icon" :icon="icon" size="is-medium" />
<p :class="{ 'padding-left': icon }">
<slot></slot>
</p>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
@Component
export default class EventMetadataBlock extends Vue {
@Prop({ required: false, type: String }) icon!: string;
@Prop({ required: true, type: String }) title!: string;
}
</script>
<style lang="scss" scoped>
h2 {
font-size: 1.8rem;
font-weight: 500;
color: #f7ba30;
}
div.eventMetadataBlock {
display: flex;
align-items: center;
margin-bottom: 1.75rem;
p {
flex: 1;
&.padding-left {
padding-left: 20px;
}
}
}
</style>

View File

@@ -0,0 +1,55 @@
<template>
<router-link
class="event-minimalist-card-wrapper"
:to="{ name: RouteName.EVENT, params: { uuid: event.uuid } }"
>
<date-calendar-icon class="calendar-icon" :date="event.beginsOn" />
<div class="title-info-wrapper">
<p class="event-minimalist-title">{{ event.title }}</p>
<p v-if="event.physicalAddress" class="has-text-grey">
{{ event.physicalAddress.description }}
</p>
<p v-else>3 demandes de participation à traiter</p>
</div>
</router-link>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { IEvent } from "@/types/event.model";
import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
import RouteName from "../../router/name";
@Component({
components: {
DateCalendarIcon,
},
})
export default class EventMinimalistCard extends Vue {
@Prop({ required: true, type: Object }) event!: IEvent;
RouteName = RouteName;
}
</script>
<style lang="scss" scoped>
.event-minimalist-card-wrapper {
display: flex;
width: 100%;
color: initial;
align-items: flex-start;
.calendar-icon {
margin-right: 1rem;
}
.title-info-wrapper {
flex: 2;
.event-minimalist-title {
color: #3c376e;
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial, serif;
font-size: 1.25rem;
font-weight: 700;
}
}
}
</style>

View File

@@ -24,86 +24,131 @@ A button to set your participation
</docs>
<template>
<div class="participation-button">
<b-dropdown aria-role="list" position="is-bottom-left" v-if="participation && participation.role === ParticipantRole.PARTICIPANT">
<button class="button is-success is-large" type="button" slot="trigger">
<b-icon icon="check" />
<template>
<span>{{ $t('I participate') }}</span>
</template>
<b-icon icon="menu-down" />
</button>
<div class="participation-button">
<b-dropdown
aria-role="list"
position="is-bottom-left"
v-if="participation && participation.role === ParticipantRole.PARTICIPANT"
>
<button class="button is-success is-large" type="button" slot="trigger">
<b-icon icon="check" />
<template>
<span>{{ $t("I participate") }}</span>
</template>
<b-icon icon="menu-down" />
</button>
<b-dropdown-item :value="false" aria-role="listitem" @click="confirmLeave" class="has-text-danger">
{{ $t('Cancel my participation…')}}
</b-dropdown-item>
</b-dropdown>
<b-dropdown-item
:value="false"
aria-role="listitem"
@click="confirmLeave"
class="has-text-danger"
>{{ $t("Cancel my participation…") }}</b-dropdown-item
>
</b-dropdown>
<div v-else-if="participation && participation.role === ParticipantRole.NOT_APPROVED">
<b-dropdown aria-role="list" position="is-bottom-left" class="dropdown-disabled">
<button class="button is-success is-large" type="button" slot="trigger">
<b-icon icon="timer-sand-empty" />
<template>
<span>{{ $t('I participate') }}</span>
</template>
<b-icon icon="menu-down" />
</button>
<div v-else-if="participation && participation.role === ParticipantRole.NOT_APPROVED">
<b-dropdown aria-role="list" position="is-bottom-left" class="dropdown-disabled">
<button class="button is-success is-large" type="button" slot="trigger">
<b-icon icon="timer-sand-empty" />
<template>
<span>{{ $t("I participate") }}</span>
</template>
<b-icon icon="menu-down" />
</button>
<!-- <b-dropdown-item :value="false" aria-role="listitem">-->
<!-- {{ $t('Change my identity…')}}-->
<!-- </b-dropdown-item>-->
<!-- <b-dropdown-item :value="false" aria-role="listitem">-->
<!-- {{ $t('Change my identity…')}}-->
<!-- </b-dropdown-item>-->
<b-dropdown-item :value="false" aria-role="listitem" @click="confirmLeave" class="has-text-danger">
{{ $t('Cancel my participation request…')}}
</b-dropdown-item>
</b-dropdown>
<small>{{ $t('Participation requested!')}}</small><br />
<small>{{ $t('Waiting for organization team approval.')}}</small>
</div>
<div v-else-if="participation && participation.role === ParticipantRole.REJECTED">
<span>{{ $t('Unfortunately, your participation request was rejected by the organizers.')}}</span>
</div>
<b-dropdown aria-role="list" position="is-bottom-left" v-else-if="!participation && currentActor.id">
<button class="button is-primary is-large" type="button" slot="trigger">
<template>
<span>{{ $t('Participate') }}</span>
</template>
<b-icon icon="menu-down" />
</button>
<b-dropdown-item :value="true" aria-role="listitem" @click="joinEvent(currentActor)">
<div class="media">
<div class="media-left">
<figure class="image is-32x32" v-if="currentActor.avatar">
<img class="is-rounded" :src="currentActor.avatar.url" alt="" />
</figure>
</div>
<div class="media-content">
<span>{{ $t('as {identity}', {identity: currentActor.name || `@${currentActor.preferredUsername}` }) }}</span>
</div>
</div>
</b-dropdown-item>
<b-dropdown-item :value="false" aria-role="listitem" @click="joinModal" v-if="identities.length > 1">
{{ $t('with another identity…')}}
</b-dropdown-item>
</b-dropdown>
<b-button tag="router-link" :to="{ name: RouteName.EVENT_PARTICIPATE_LOGGED_OUT, params: { uuid: event.uuid } }" v-else-if="!participation && hasAnonymousParticipationMethods" type="is-primary" size="is-large" native-type="button">{{ $t('Participate') }}</b-button>
<b-button tag="router-link" :to="{ name: RouteName.EVENT_PARTICIPATE_WITH_ACCOUNT, params: { uuid: event.uuid } }" v-else-if="!currentActor.id" type="is-primary" size="is-large" native-type="button">{{ $t('Participate') }}</b-button>
<b-dropdown-item
:value="false"
aria-role="listitem"
@click="confirmLeave"
class="has-text-danger"
>{{ $t("Cancel my participation request…") }}</b-dropdown-item
>
</b-dropdown>
<small>{{ $t("Participation requested!") }}</small>
<br />
<small>{{ $t("Waiting for organization team approval.") }}</small>
</div>
<div v-else-if="participation && participation.role === ParticipantRole.REJECTED">
<span>
{{ $t("Unfortunately, your participation request was rejected by the organizers.") }}
</span>
</div>
<b-dropdown
aria-role="list"
position="is-bottom-left"
v-else-if="!participation && currentActor.id"
>
<button class="button is-primary is-large" type="button" slot="trigger">
<template>
<span>{{ $t("Participate") }}</span>
</template>
<b-icon icon="menu-down" />
</button>
<b-dropdown-item :value="true" aria-role="listitem" @click="joinEvent(currentActor)">
<div class="media">
<div class="media-left">
<figure class="image is-32x32" v-if="currentActor.avatar">
<img class="is-rounded" :src="currentActor.avatar.url" alt />
</figure>
</div>
<div class="media-content">
<span>
{{
$t("as {identity}", {
identity: currentActor.name || `@${currentActor.preferredUsername}`,
})
}}
</span>
</div>
</div>
</b-dropdown-item>
<b-dropdown-item
:value="false"
aria-role="listitem"
@click="joinModal"
v-if="identities.length > 1"
>{{ $t("with another identity…") }}</b-dropdown-item
>
</b-dropdown>
<b-button
tag="router-link"
:to="{ name: RouteName.EVENT_PARTICIPATE_LOGGED_OUT, params: { uuid: event.uuid } }"
v-else-if="!participation && hasAnonymousParticipationMethods"
type="is-primary"
size="is-large"
native-type="button"
>{{ $t("Participate") }}</b-button
>
<b-button
tag="router-link"
:to="{ name: RouteName.EVENT_PARTICIPATE_WITH_ACCOUNT, params: { uuid: event.uuid } }"
v-else-if="!currentActor.id"
type="is-primary"
size="is-large"
native-type="button"
>{{ $t("Participate") }}</b-button
>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { EventJoinOptions, IEvent, IParticipant, ParticipantRole } from '@/types/event.model';
import { IPerson, Person } from '@/types/actor';
import { CURRENT_ACTOR_CLIENT, IDENTITIES } from '@/graphql/actor';
import { CURRENT_USER_CLIENT } from '@/graphql/user';
import { CONFIG } from '@/graphql/config';
import { IConfig } from '@/types/config.model';
import { RouteName } from '@/router';
import { Component, Prop, Vue } from "vue-property-decorator";
import { EventJoinOptions, IEvent, IParticipant, ParticipantRole } from "../../types/event.model";
import { IPerson, Person } from "../../types/actor";
import { CURRENT_ACTOR_CLIENT, IDENTITIES } from "../../graphql/actor";
import { CURRENT_USER_CLIENT } from "../../graphql/user";
import { CONFIG } from "../../graphql/config";
import { IConfig } from "../../types/config.model";
import RouteName from "../../router/name";
@Component({
apollo: {
@@ -114,7 +159,8 @@ import { RouteName } from '@/router';
config: CONFIG,
identities: {
query: IDENTITIES,
update: ({ identities }) => identities ? identities.map(identity => new Person(identity)) : [],
update: ({ identities }) =>
identities ? identities.map((identity: IPerson) => new Person(identity)) : [],
skip() {
return this.currentUser.isLoggedIn === false;
},
@@ -123,28 +169,33 @@ import { RouteName } from '@/router';
})
export default class ParticipationButton extends Vue {
@Prop({ required: true }) participation!: IParticipant;
@Prop({ required: true }) event!: IEvent;
@Prop({ required: true }) currentActor!: IPerson;
ParticipantRole = ParticipantRole;
identities: IPerson[] = [];
config!: IConfig;
RouteName = RouteName;
joinEvent(actor: IPerson) {
if (this.event.joinOptions === EventJoinOptions.RESTRICTED) {
this.$emit('joinEventWithConfirmation', actor);
this.$emit("joinEventWithConfirmation", actor);
} else {
this.$emit('joinEvent', actor);
this.$emit("joinEvent", actor);
}
}
joinModal() {
this.$emit('joinModal');
this.$emit("joinModal");
}
confirmLeave() {
this.$emit('confirmLeave');
this.$emit("confirmLeave");
}
get hasAnonymousParticipationMethods(): boolean {
@@ -154,20 +205,20 @@ export default class ParticipationButton extends Vue {
</script>
<style lang="scss" scoped>
.participation-button {
.dropdown {
display: flex;
justify-content: flex-end;
.participation-button {
.dropdown {
display: flex;
justify-content: flex-end;
&.dropdown-disabled button {
opacity: 0.5;
}
}
&.dropdown-disabled button {
opacity: 0.5;
}
}
}
.anonymousParticipationModal {
/deep/ .animation-content {
z-index: 1;
}
}
</style>
.anonymousParticipationModal {
/deep/ .animation-content {
z-index: 1;
}
}
</style>

View File

@@ -1,123 +1,164 @@
<template>
<b-table
:data="data"
ref="queueTable"
detailed
detail-key="id"
:checked-rows.sync="checkedRows"
checkable
:is-row-checkable="row => row.role !== ParticipantRole.CREATOR"
checkbox-position="left"
default-sort="insertedAt"
default-sort-direction="asc"
:show-detail-icon="false"
:loading="this.$apollo.loading"
paginated
backend-pagination
:aria-next-label="$t('Next page')"
:aria-previous-label="$t('Previous page')"
:aria-page-label="$t('Page')"
:aria-current-label="$t('Current page')"
:total="total"
:per-page="perPage"
backend-sorting
:default-sort-direction="'desc'"
:default-sort="['insertedAt', 'desc']"
@page-change="page => $emit('page-change', page)"
@sort="(field, order) => $emit('sort', field, order)"
>
<template slot-scope="props">
<b-table-column field="insertedAt" :label="$t('Date')" sortable>
<b-tag type="is-success" class="has-text-centered">{{ props.row.insertedAt | formatDateString }}<br>{{ props.row.insertedAt | formatTimeString }}</b-tag>
</b-table-column>
<b-table-column field="role" :label="$t('Role')" sortable v-if="showRole">
<span v-if="props.row.role === ParticipantRole.CREATOR">
{{ $t('Organizer') }}
</span>
<span v-else-if="props.row.role === ParticipantRole.PARTICIPANT">
{{ $t('Participant') }}
</span>
</b-table-column>
<b-table-column field="actor.preferredUsername" :label="$t('Participant')" sortable>
<article class="media">
<figure class="media-left" v-if="props.row.actor.avatar">
<p class="image is-48x48">
<img :src="props.row.actor.avatar.url" alt="">
</p>
</figure>
<b-icon class="media-left" v-else-if="props.row.actor.preferredUsername === 'anonymous'" size="is-large" icon="incognito" />
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<div class="content">
<span v-if="props.row.actor.preferredUsername !== 'anonymous'">
<span v-if="props.row.actor.name">{{ props.row.actor.name }}</span><br />
<span class="is-size-7 has-text-grey">@{{ props.row.actor.preferredUsername }}</span>
</span>
<span v-else>
{{ $t('Anonymous participant') }}
</span>
</div>
</div>
</article>
</b-table-column>
<b-table-column field="metadata.message" :label="$t('Message')">
<span @click="toggleQueueDetails(props.row)" :class="{ 'ellipsed-message': props.row.metadata.message.length > MESSAGE_ELLIPSIS_LENGTH }" v-if="props.row.metadata && props.row.metadata.message">
{{ props.row.metadata.message | ellipsize }}
</span>
<span v-else class="has-text-grey">
{{ $t('No message') }}
</span>
</b-table-column>
</template>
<template slot="detail" slot-scope="props">
<article v-html="nl2br(props.row.metadata.message)" />
</template>
<template slot="bottom-left" v-if="checkedRows.length > 0">
<div class="buttons">
<b-button @click="acceptParticipants(checkedRows)" type="is-success" v-if="canAcceptParticipants">
{{ $tc('No participant to approve|Approve participant|Approve {number} participants', checkedRows.length, { number: checkedRows.length }) }}
</b-button>
<b-button @click="refuseParticipants(checkedRows)" type="is-danger" v-if="canRefuseParticipants">
{{ $tc('No participant to reject|Reject participant|Reject {number} participants', checkedRows.length, { number: checkedRows.length }) }}
</b-button>
<b-table
:data="data"
ref="queueTable"
detailed
detail-key="id"
:checked-rows.sync="checkedRows"
checkable
:is-row-checkable="(row) => row.role !== ParticipantRole.CREATOR"
checkbox-position="left"
:show-detail-icon="false"
:loading="this.$apollo.loading"
paginated
backend-pagination
:aria-next-label="$t('Next page')"
:aria-previous-label="$t('Previous page')"
:aria-page-label="$t('Page')"
:aria-current-label="$t('Current page')"
:total="total"
:per-page="perPage"
backend-sorting
:default-sort-direction="'desc'"
:default-sort="['insertedAt', 'desc']"
@page-change="(page) => $emit('page-change', page)"
@sort="(field, order) => $emit('sort', field, order)"
>
<template slot-scope="props">
<b-table-column field="insertedAt" :label="$t('Date')" sortable>
<b-tag type="is-success" class="has-text-centered"
>{{ props.row.insertedAt | formatDateString }}<br />{{
props.row.insertedAt | formatTimeString
}}</b-tag
>
</b-table-column>
<b-table-column field="role" :label="$t('Role')" sortable v-if="showRole">
<span v-if="props.row.role === ParticipantRole.CREATOR">
{{ $t("Organizer") }}
</span>
<span v-else-if="props.row.role === ParticipantRole.PARTICIPANT">
{{ $t("Participant") }}
</span>
</b-table-column>
<b-table-column field="actor.preferredUsername" :label="$t('Participant')" sortable>
<article class="media">
<figure class="media-left" v-if="props.row.actor.avatar">
<p class="image is-48x48">
<img :src="props.row.actor.avatar.url" alt="" />
</p>
</figure>
<b-icon
class="media-left"
v-else-if="props.row.actor.preferredUsername === 'anonymous'"
size="is-large"
icon="incognito"
/>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<div class="content">
<span v-if="props.row.actor.preferredUsername !== 'anonymous'">
<span v-if="props.row.actor.name">{{ props.row.actor.name }}</span
><br />
<span class="is-size-7 has-text-grey"
>@{{ props.row.actor.preferredUsername }}</span
>
</span>
<span v-else>
{{ $t("Anonymous participant") }}
</span>
</div>
</template>
</b-table>
</div>
</article>
</b-table-column>
<b-table-column field="metadata.message" :label="$t('Message')">
<span
@click="toggleQueueDetails(props.row)"
:class="{
'ellipsed-message': props.row.metadata.message.length > MESSAGE_ELLIPSIS_LENGTH,
}"
v-if="props.row.metadata && props.row.metadata.message"
>
{{ props.row.metadata.message | ellipsize }}
</span>
<span v-else class="has-text-grey">
{{ $t("No message") }}
</span>
</b-table-column>
</template>
<template slot="detail" slot-scope="props">
<article v-html="nl2br(props.row.metadata.message)" />
</template>
<template slot="bottom-left" v-if="checkedRows.length > 0">
<div class="buttons">
<b-button
@click="acceptParticipants(checkedRows)"
type="is-success"
v-if="canAcceptParticipants"
>
{{
$tc(
"No participant to approve|Approve participant|Approve {number} participants",
checkedRows.length,
{ number: checkedRows.length }
)
}}
</b-button>
<b-button
@click="refuseParticipants(checkedRows)"
type="is-danger"
v-if="canRefuseParticipants"
>
{{
$tc(
"No participant to reject|Reject participant|Reject {number} participants",
checkedRows.length,
{ number: checkedRows.length }
)
}}
</b-button>
</div>
</template>
</b-table>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { IParticipant, ParticipantRole } from '@/types/event.model';
import { Refs } from '@/shims-vue';
import { nl2br } from '@/utils/html';
import { asyncForEach } from '@/utils/asyncForEach';
import { Component, Prop, Vue, Ref } from "vue-property-decorator";
import { IParticipant, ParticipantRole } from "../../types/event.model";
import { nl2br } from "../../utils/html";
import { asyncForEach } from "../../utils/asyncForEach";
const MESSAGE_ELLIPSIS_LENGTH = 130;
@Component({
filters: {
ellipsize: (text?: string) => text && text.substr(0, MESSAGE_ELLIPSIS_LENGTH).concat('…'),
ellipsize: (text?: string) => text && text.substr(0, MESSAGE_ELLIPSIS_LENGTH).concat(""),
},
})
export default class ParticipationTable extends Vue {
@Prop({ required: true, type: Array }) data!: IParticipant[];
@Prop({ required: true, type: Number }) total!: number;
@Prop({ required: true, type: Function }) acceptParticipant;
@Prop({ required: true, type: Function }) refuseParticipant;
@Prop({ required: false, type: Boolean, default: false }) showRole;
@Prop({ required: false, type: Number, default: 20 }) perPage;
@Prop({ required: true, type: Function }) acceptParticipant!: Function;
@Prop({ required: true, type: Function }) refuseParticipant!: Function;
@Prop({ required: false, type: Boolean, default: false }) showRole!: boolean;
@Prop({ required: false, type: Number, default: 20 }) perPage!: number;
@Ref("queueTable") readonly queueTable!: any;
checkedRows: IParticipant[] = [];
MESSAGE_ELLIPSIS_LENGTH = MESSAGE_ELLIPSIS_LENGTH;
nl2br = nl2br;
ParticipantRole = ParticipantRole;
$refs!: Refs<{
queueTable: any,
}>;
nl2br = nl2br;
ParticipantRole = ParticipantRole;
toggleQueueDetails(row: IParticipant) {
if (row.metadata.message && row.metadata.message.length < MESSAGE_ELLIPSIS_LENGTH) return;
this.$refs.queueTable.toggleDetails(row);
this.queueTable.toggleDetails(row);
}
async acceptParticipants(participants: IParticipant[]) {
@@ -134,31 +175,33 @@ export default class ParticipationTable extends Vue {
this.checkedRows = [];
}
/**
* We can accept participants if at least one of them is not approved
*/
/**
* We can accept participants if at least one of them is not approved
*/
get canAcceptParticipants(): boolean {
return this.checkedRows.some(
(participant: IParticipant) => [ParticipantRole.NOT_APPROVED, ParticipantRole.REJECTED].includes(participant.role),
return this.checkedRows.some((participant: IParticipant) =>
[ParticipantRole.NOT_APPROVED, ParticipantRole.REJECTED].includes(participant.role)
);
}
/**
* We can refuse participants if at least one of them is something different than not approved
*/
/**
* We can refuse participants if at least one of them is something different than not approved
*/
get canRefuseParticipants(): boolean {
return this.checkedRows.some((participant: IParticipant) => participant.role !== ParticipantRole.REJECTED);
return this.checkedRows.some(
(participant: IParticipant) => participant.role !== ParticipantRole.REJECTED
);
}
}
</script>
<style lang="scss" scoped>
.ellipsed-message {
cursor: pointer;
}
.ellipsed-message {
cursor: pointer;
}
.table {
span.tag {
height: initial;
}
}
</style>
.table {
span.tag {
height: initial;
}
}
</style>

View File

@@ -1,56 +1,33 @@
<docs>
### Tag input
A special input to manage event tags
```vue
<tag-input :value="[{ title: 'toto' }]" path="title" />
```
```vue
<template>
<tag-input v-model="tags" :data="sourceTags" path="title" />
</template>
<script>
export default {
data() {
return {
sourceTags: [{ title: 'my tag'}, { title: 'my second tag' }, { title: 'another example'}],
tags: []
}
}
}
</script>
```
</docs>
<template>
<b-field>
<template slot="label">
{{ $t('Add some tags') }}
<b-tooltip type="is-dark" :label="$t('You can add tags by hitting the Enter key or by adding a comma')">
<b-icon size="is-small" icon="help-circle-outline"></b-icon>
</b-tooltip>
</template>
<b-taginput
v-model="tagsStrings"
:data="filteredTags"
autocomplete
:allow-new="true"
:field="path"
icon="label"
maxlength="20"
maxtags="10"
:placeholder="$t('Eg: Stockholm, Dance, Chess…')"
@typing="getFilteredTags"
>
</b-taginput>
</b-field>
<b-field>
<template slot="label">
{{ $t("Add some tags") }}
<b-tooltip
type="is-dark"
:label="$t('You can add tags by hitting the Enter key or by adding a comma')"
>
<b-icon size="is-small" icon="help-circle-outline"></b-icon>
</b-tooltip>
</template>
<b-taginput
v-model="tagsStrings"
:data="filteredTags"
autocomplete
:allow-new="true"
:field="path"
icon="label"
maxlength="20"
maxtags="10"
:placeholder="$t('Eg: Stockholm, Dance, Chess…')"
@typing="getFilteredTags"
>
</b-taginput>
</b-field>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { get, differenceBy } from 'lodash';
import { ITag } from '@/types/tag.model';
import { Component, Prop, Vue } from "vue-property-decorator";
import { get, differenceBy } from "lodash";
import { ITag } from "../../types/tag.model";
@Component({
computed: {
@@ -59,32 +36,30 @@ import { ITag } from '@/types/tag.model';
return this.$props.value.map((tag: ITag) => tag.title);
},
set(tagStrings) {
const tagEntities = tagStrings.map((tag) => {
if (TagInput.isTag(tag)) {
const tagEntities = tagStrings.map((tag: string | ITag) => {
if (!(tag instanceof String)) {
return tag;
}
return { title: tag, slug: tag } as ITag;
});
this.$emit('input', tagEntities);
this.$emit("input", tagEntities);
},
},
},
})
export default class TagInput extends Vue {
@Prop({ required: false, default: () => [] }) data!: ITag[];
@Prop({ required: true, default: 'value' }) path!: string;
@Prop({ required: true, default: "value" }) path!: string;
@Prop({ required: true }) value!: ITag[];
filteredTags: ITag[] = [];
getFilteredTags(text) {
this.filteredTags = differenceBy(this.data, this.value, 'id').filter((option) => {
return get(option, this.path)
.toString()
.toLowerCase()
.indexOf(text.toLowerCase()) >= 0;
});
getFilteredTags(text: string) {
this.filteredTags = differenceBy(this.data, this.value, "id").filter(
(option) => get(option, this.path).toString().toLowerCase().indexOf(text.toLowerCase()) >= 0
);
}
static isTag(x: any): x is ITag {

View File

@@ -1,25 +1,40 @@
<template>
<footer class="footer" ref="footer">
<mobilizon-logo :invert="true" class="logo" />
<img src="../assets/footer.png" :alt="$t('World map')" />
<ul>
<li><a href="https://joinmobilizon.org">{{ $t('About') }}</a></li>
<li><router-link :to="{ name: RouteName.TERMS }">{{ $t('Terms') }}</router-link></li>
<li><a href="https://framagit.org/framasoft/mobilizon/blob/master/LICENSE">{{ $t('License') }}</a></li>
</ul>
<div class="content has-text-centered">
<span>{{ $t('© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks', { date: new Date().getFullYear()}) }}</span>
</div>
</footer>
<footer class="footer" ref="footer">
<mobilizon-logo :invert="true" class="logo" />
<img src="../assets/footer.png" :alt="$t('World map')" />
<ul>
<li>
<a href="https://joinmobilizon.org">{{ $t("About") }}</a>
</li>
<li>
<router-link :to="{ name: RouteName.TERMS }">{{ $t("Terms") }}</router-link>
</li>
<li>
<a href="https://framagit.org/framasoft/mobilizon/blob/master/LICENSE">
{{ $t("License") }}
</a>
</li>
</ul>
<div class="content has-text-centered">
<span>
{{
$t(
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks",
{ date: new Date().getFullYear() }
)
}}
</span>
</div>
</footer>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import Logo from './Logo.vue';
import { RouteName } from '@/router';
import { Component, Vue } from "vue-property-decorator";
import RouteName from "../router/name";
import Logo from "./Logo.vue";
@Component({
components: {
'mobilizon-logo': Logo,
"mobilizon-logo": Logo,
},
})
export default class Footer extends Vue {
@@ -27,33 +42,34 @@ export default class Footer extends Vue {
}
</script>
<style lang="scss" scoped>
@import "../variables.scss";
@import "../variables.scss";
footer.footer {
color: $secondary;
display: flex;
flex-direction: column;
align-items: center;
footer.footer {
color: $secondary;
display: flex;
flex-direction: column;
align-items: center;
.logo {
fill: $secondary;
flex: 1;
}
.logo {
fill: $secondary;
flex: 1;
max-width: 300px;
}
div.content {
flex: 1;
}
div.content {
flex: 1;
}
ul li {
display: inline-flex;
margin: auto 5px;
ul li {
display: inline-flex;
margin: auto 5px;
a {
color: #eee;
font-size: 1.5rem;
text-decoration: underline;
text-decoration-color: $secondary;
}
}
a {
color: #eee;
font-size: 1.5rem;
text-decoration: underline;
text-decoration-color: $secondary;
}
}
}
</style>

View File

@@ -1,32 +1,50 @@
<template>
<div class="card">
<div class="card-image" v-if="!group.banner">
<figure class="image is-4by3">
<img src="https://picsum.photos/g/400/200/">
</figure>
</div>
<div class="card-content">
<div class="content">
<router-link :to="{ name: RouteName.GROUP, params:{ preferredUsername: group.preferredUsername } }">
<h2 class="title">{{ group.displayName() }}</h2>
</router-link>
<div class="media">
<div class="media-left">
<figure class="image is-48x48">
<img src="https://bulma.io/images/placeholders/96x96.png" alt="Placeholder image" />
</figure>
</div>
<div class="media-content">
<router-link
:to="{ name: RouteName.GROUP, params: { preferredUsername: groupFullUsername } }"
>
<h3>{{ member.parent.name }}</h3>
<p class="is-6 has-text-grey">
<span v-if="member.parent.domain">{{
`@${member.parent.preferredUsername}@${member.parent.domain}`
}}</span>
<span v-else>{{ `@${member.parent.preferredUsername}` }}</span>
</p>
<b-tag type="is-info">{{ member.role }}</b-tag>
</router-link>
</div>
</div>
<div>
<p>{{ group.summary }}</p>
<div class="content">
<p>{{ member.parent.summary }}</p>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Group } from '@/types/actor';
import { RouteName } from '@/router';
import { Component, Prop, Vue } from "vue-property-decorator";
import { IGroup, IMember } from "@/types/actor";
import RouteName from "../../router/name";
@Component
export default class GroupCard extends Vue {
@Prop({ required: true }) group!: Group;
@Prop({ required: true }) member!: IMember;
RouteName = RouteName;
get groupFullUsername() {
if (this.member.parent.domain) {
return `${this.member.parent.preferredUsername}@${this.member.parent.domain}`;
}
return this.member.parent.preferredUsername;
}
}
</script>

View File

@@ -0,0 +1,75 @@
<template>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">{{ $t("Pick a group") }}</p>
</header>
<section class="modal-card-body">
<div class="list is-hoverable">
<a
class="list-item"
v-for="groupMembership in groupMemberships.elements"
:class="{ 'is-active': groupMembership.parent.id === currentGroup.id }"
@click="changeCurrentGroup(groupMembership.parent)"
:key="groupMembership.id"
>
<div class="media">
<img
class="media-left image is-48x48"
v-if="groupMembership.parent.avatar"
:src="groupMembership.parent.avatar.url"
alt=""
/>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
<div class="media-content">
<h3>@{{ groupMembership.parent.name }}</h3>
<small>{{ `@${groupMembership.parent.preferredUsername}` }}</small>
</div>
</div>
</a>
<a class="list-item" @click="changeCurrentGroup(new Group())" v-if="currentGroup.id">
<h3>{{ $t("Unset group") }}</h3>
</a>
</div>
</section>
<slot name="footer" />
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { IGroup, IMember, IPerson, Group } from "@/types/actor";
import { PERSON_MEMBERSHIPS } from "@/graphql/actor";
import { Paginate } from "@/types/paginate";
@Component({
apollo: {
groupMemberships: {
query: PERSON_MEMBERSHIPS,
variables() {
return {
id: this.identity.id,
};
},
update: (data) => data.person.memberships,
skip() {
return !this.identity.id;
},
},
},
})
export default class GroupPicker extends Vue {
@Prop() value!: IGroup;
@Prop() identity!: IPerson;
groupMemberships: Paginate<IMember> = { elements: [], total: 0 };
currentGroup: IGroup = this.value;
Group = Group;
changeCurrentGroup(group: IGroup) {
this.currentGroup = group;
this.$emit("input", group);
}
}
</script>

View File

@@ -0,0 +1,110 @@
<template>
<div class="group-picker">
<div
class="no-group box"
v-if="!currentGroup.id && groupMemberships.total > 0"
@click="isComponentModalActive = true"
>
<p class="is-4">{{ $t("Add a group") }}</p>
<p class="is-6 is-size-6 has-text-grey">
{{ $t("The event will show the group as organizer.") }}
</p>
</div>
<div v-if="inline && currentGroup.id" class="inline box" @click="isComponentModalActive = true">
<div class="media">
<div class="media-left">
<figure class="image is-48x48" v-if="currentGroup.avatar">
<img class="image" :src="currentGroup.avatar.url" :alt="currentGroup.avatar.alt" />
</figure>
<b-icon v-else size="is-large" icon="account-circle" />
</div>
<div class="media-content" v-if="currentGroup.name">
<p class="is-4">{{ currentGroup.name }}</p>
<p class="is-6 has-text-grey">{{ `@${currentGroup.preferredUsername}` }}</p>
</div>
<div class="media-content" v-else>
{{ `@${currentGroup.preferredUsername}` }}
</div>
<b-button type="is-text" @click="isComponentModalActive = true">
{{ $t("Change") }}
</b-button>
</div>
</div>
<span v-else-if="currentGroup.id" class="block" @click="isComponentModalActive = true">
<img
class="image is-48x48"
v-if="currentGroup.avatar"
:src="currentGroup.avatar.url"
:alt="currentGroup.avatar.alt"
/>
<b-icon v-else size="is-large" icon="account-circle" />
</span>
<div v-if="groupMemberships.total === 0" class="box">
<p class="is-4">{{ $t("This identity is not a member of any group.") }}</p>
<p class="is-6 is-size-6 has-text-grey">
{{ $t("You need to create the group before you create an event.") }}
</p>
</div>
<b-modal :active.sync="isComponentModalActive" has-modal-card>
<group-picker v-model="currentGroup" :identity.sync="identity" @input="relay" />
</b-modal>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { IGroup, IMember, IPerson } from "../../types/actor";
import GroupPicker from "./GroupPicker.vue";
import { PERSON_MEMBERSHIPS } from "../../graphql/actor";
import { Paginate } from "../../types/paginate";
@Component({
components: { GroupPicker },
apollo: {
groupMemberships: {
query: PERSON_MEMBERSHIPS,
variables() {
return {
id: this.identity.id,
};
},
update: (data) => data.person.memberships,
skip() {
return !this.identity.id;
},
},
},
})
export default class GroupPickerWrapper extends Vue {
@Prop({ type: Object, required: true }) value!: IGroup;
@Prop({ default: true, type: Boolean }) inline!: boolean;
@Prop({ type: Object, required: true }) identity!: IPerson;
isComponentModalActive = false;
currentGroup: IGroup = this.value;
groupMemberships: Paginate<IMember> = { elements: [], total: 0 };
@Watch("value")
updateCurrentGroup(value: IGroup) {
this.currentGroup = value;
}
relay(group: IGroup) {
this.currentGroup = group;
this.$emit("input", group);
this.isComponentModalActive = false;
}
}
</script>
<style lang="scss" scoped>
.group-picker {
.block,
.no-group,
.inline {
cursor: pointer;
}
}
</style>

View File

@@ -0,0 +1,78 @@
<template>
<div class="media">
<div class="media-content">
<div class="content">
<p>
{{
$t("You have been invited by {invitedBy} to the following group:", {
invitedBy: member.invitedBy.name,
})
}}
</p>
</div>
<div class="media subfield">
<div class="media-left">
<figure class="image is-48x48">
<img src="https://bulma.io/images/placeholders/96x96.png" alt="Placeholder image" />
</figure>
</div>
<div class="media-content">
<div class="level">
<div class="level-left">
<div class="level-item">
<router-link
:to="{
name: RouteName.GROUP,
params: { preferredUsername: member.parent.preferredUsername },
}"
>
<h3>{{ member.parent.name }}</h3>
<p class="is-6 has-text-grey">
<span v-if="member.parent.domain">
{{ `@${member.parent.preferredUsername}@${member.parent.domain}` }}
</span>
<span v-else>{{ `@${member.parent.preferredUsername}` }}</span>
</p>
</router-link>
</div>
</div>
<div class="level-right">
<div class="level-item">
<b-button type="is-success" @click="$emit('accept', member.id)">
{{ $t("Accept") }}
</b-button>
</div>
<div class="level-item">
<b-button type="is-danger" @click="$emit('decline', member.id)">
{{ $t("Decline") }}
</b-button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { IGroup, IMember } from "@/types/actor";
import RouteName from "../../router/name";
@Component
export default class InvitationCard extends Vue {
@Prop({ required: true }) member!: IMember;
RouteName = RouteName;
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
.media:not(.subfield) {
background: lighten($primary, 40%);
padding: 10px;
}
</style>

View File

@@ -1,23 +1,30 @@
<template>
<img svg-inline src="../assets/mobilizon_logo.svg" alt="Mobilizon" :class="{invert: invert}" height="40px">
<!-- <img src="../assets/mobilizon_logo.svg" alt="Mobilizon" :class="{ invert: invert }" height="40" /> -->
<MobilizonLogo />
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component
import { Component, Prop, Vue } from "vue-property-decorator";
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
import MobilizonLogo from "../assets/mobilizon_logo.svg";
@Component({
components: {
MobilizonLogo,
},
})
export default class Logo extends Vue {
@Prop({ type: Boolean, required: false, default: false }) invert!: boolean;
}
</script>
<style lang="scss" scoped>
@import "../variables.scss";
@import "../variables.scss";
svg {
fill: $primary;
svg {
fill: $primary;
&.invert {
fill: $secondary;
}
}
&.invert {
fill: $secondary;
}
}
</style>

View File

@@ -1,77 +1,92 @@
<template>
<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="config.maps.tiles.endpoint"
:attribution="attribution"
>
</l-tile-layer>
<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>
<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="config.maps.tiles.endpoint" :attribution="attribution"> </l-tile-layer>
<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, LatLng, LeafletMouseEvent } from 'leaflet';
import 'leaflet/dist/leaflet.css';
import { Component, Prop, Vue } from 'vue-property-decorator';
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';
import { Icon, LatLng, LeafletMouseEvent, LeafletEvent } from "leaflet";
import "leaflet/dist/leaflet.css";
import { Component, Prop, Vue } from "vue-property-decorator";
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, LIcon, 'v-locatecontrol': Vue2LeafletLocateControl },
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: Object, required: false }) marker!: { text: String|String[], icon: 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;
@Prop({ type: Function, required: false })
updateDraggableMarkerCallback!: Function;
defaultOptions: {
zoom: Number;
height: String;
width: String;
zoom: number;
height: string;
width: string;
} = {
zoom: 15,
height: '100%',
width: '100%',
height: "100%",
width: "100%",
};
zoom = this.defaultOptions.zoom;
config!: IConfig;
/* eslint-disable */
mounted() {
// this part resolve an issue where the markers would not appear
// @ts-ignore
delete Icon.Default.prototype._getIconUrl;
Icon.Default.mergeOptions({
iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
iconUrl: require('leaflet/dist/images/marker-icon.png'),
shadowUrl: require('leaflet/dist/images/marker-shadow.png'),
iconRetinaUrl: require("leaflet/dist/images/marker-icon-2x.png"),
iconUrl: require("leaflet/dist/images/marker-icon.png"),
shadowUrl: require("leaflet/dist/images/marker-shadow.png"),
});
}
/* eslint-enable */
openPopup(event) {
openPopup(event: LeafletEvent) {
this.$nextTick(() => {
event.target.openPopup();
});
@@ -81,8 +96,13 @@ export default class Map extends Vue {
return { ...this.defaultOptions, ...this.options };
}
get lat() { return this.$props.coords.split(';')[1]; }
get lon() { return this.$props.coords.split(';')[0]; }
get lat() {
return this.$props.coords.split(";")[1];
}
get lon() {
return this.$props.coords.split(";")[0];
}
get popupMultiLine() {
if (Array.isArray(this.marker.text)) {
@@ -99,22 +119,22 @@ export default class Map extends Vue {
this.updateDraggableMarkerCallback(e, this.zoom);
}
updateZoom(zoom: Number) {
updateZoom(zoom: number) {
this.zoom = zoom;
}
get attribution() {
return this.config.maps.tiles.attribution || this.$t('© The OpenStreetMap Contributors');
return this.config.maps.tiles.attribution || this.$t("© The OpenStreetMap Contributors");
}
}
</script>
<style lang="scss" scoped>
div.map-container {
height: 100%;
width: 100%;
div.map-container {
height: 100%;
width: 100%;
.leaflet-map {
z-index: 20;
}
}
.leaflet-map {
z-index: 20;
}
}
</style>

View File

@@ -1,30 +1,36 @@
<template>
<div style="display: none;">
<slot v-if="ready"></slot>
</div>
<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)
* 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';
import L, { DomEvent } from "leaflet";
import { findRealParent, propsBinder } from "vue2-leaflet";
import "leaflet.locatecontrol";
import { Component, Prop, Vue } from "vue-property-decorator";
@Component({
beforeDestroy() {
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
this.parentContainer.removeLayer(this);
},
})
export default class Vue2LeafletLocateControl extends Vue {
@Prop({ type: Object, default: () => { return {}; } }) options;
@Prop({ type: Object, default: () => ({}) }) options!: object;
@Prop({ type: Boolean, default: true }) visible = true;
ready: boolean = false;
ready = false;
mapObject!: any;
parentContainer: any;
mounted() {
@@ -43,5 +49,5 @@ export default class Vue2LeafletLocateControl extends Vue {
</script>
<style>
@import "~leaflet.locatecontrol/dist/L.Control.Locate.css";
@import "~leaflet.locatecontrol/dist/L.Control.Locate.css";
</style>

View File

@@ -1,13 +1,24 @@
<template>
<b-navbar type="is-secondary" wrapper-class="container">
<template slot="brand">
<b-navbar-item tag="router-link" :to="{ name: RouteName.HOME }"><logo /></b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.HOME }" :aria-label="$t('Home')">
<logo />
</b-navbar-item>
</template>
<template slot="start">
<b-navbar-item tag="router-link" :to="{ name: RouteName.EXPLORE }">{{ $t('Explore') }}</b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.MY_EVENTS }">{{ $t('My events') }}</b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.EXPLORE }">{{
$t("Explore")
}}</b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.MY_EVENTS }">{{
$t("My events")
}}</b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.MY_GROUPS }">{{
$t("My groups")
}}</b-navbar-item>
<b-navbar-item tag="span">
<b-button tag="router-link" :to="{ name: RouteName.CREATE_EVENT }" type="is-success">{{ $t('Create') }}</b-button>
<b-button tag="router-link" :to="{ name: RouteName.CREATE_EVENT }" type="is-success">{{
$t("Create")
}}</b-button>
</b-navbar-item>
</template>
<template slot="end">
@@ -18,56 +29,72 @@
<b-navbar-dropdown v-if="currentActor.id && currentUser.isLoggedIn" right>
<template slot="label" v-if="currentActor" class="navbar-dropdown-profile">
<figure class="image is-32x32" v-if="currentActor.avatar">
<img class="is-rounded" alt="avatarUrl" :src="currentActor.avatar.url">
<img class="is-rounded" alt="avatarUrl" :src="currentActor.avatar.url" />
</figure>
<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">
<!-- No identities dropdown if no identities -->
<span v-if="identities.length <= 1" />
<b-navbar-item
tag="span"
v-for="identity in identities"
v-else
:active="identity.id === currentActor.id"
:key="identity.id"
>
<span @click="setIdentity(identity)">
<div class="media-left">
<figure class="image is-32x32" v-if="identity.avatar">
<img class="is-rounded" :src="identity.avatar.url" alt="" />
<img class="is-rounded" :src="identity.avatar.url" alt />
</figure>
<b-icon v-else size="is-medium" icon="account-circle" />
</div>
<div class="media-content">
<span>{{ identity.displayName() }}</span>
<span class="has-text-grey" v-if="identity.name">
@{{ identity.preferredUsername }}
</span>
<span class="has-text-grey" v-if="identity.name"
>@{{ identity.preferredUsername }}</span
>
</div>
</span>
<hr class="navbar-divider">
<hr class="navbar-divider" />
</b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.UPDATE_IDENTITY }">{{
$t("My account")
}}</b-navbar-item>
<b-navbar-item tag="router-link" :to="{ name: RouteName.UPDATE_IDENTITY }">
{{ $t('My account') }}
</b-navbar-item>
<!-- <b-navbar-item tag="router-link" :to="{ name: RouteName.CREATE_GROUP }">-->
<!-- {{ $t('Create group') }}-->
<!-- </b-navbar-item>-->
<!-- <b-navbar-item tag="router-link" :to="{ name: RouteName.CREATE_GROUP }">-->
<!-- {{ $t('Create group') }}-->
<!-- </b-navbar-item>-->
<b-navbar-item
v-if="currentUser.role === ICurrentUserRole.ADMINISTRATOR"
tag="router-link"
:to="{ name: RouteName.ADMIN_DASHBOARD }"
>{{ $t("Administration") }}</b-navbar-item
>
<b-navbar-item v-if="currentUser.role === ICurrentUserRole.ADMINISTRATOR" tag="router-link" :to="{ name: RouteName.ADMIN_DASHBOARD }">
{{ $t('Administration') }}
</b-navbar-item>
<b-navbar-item tag="span">
<span @click="logout">{{ $t('Log out') }}</span>
</b-navbar-item>
<b-navbar-item tag="span">
<span @click="logout">{{ $t("Log out") }}</span>
</b-navbar-item>
</b-navbar-dropdown>
<b-navbar-item v-else tag="div">
<div class="buttons">
<router-link class="button is-primary" v-if="config && config.registrationsOpen" :to="{ name: RouteName.REGISTER }">
<strong>{{ $t('Sign up') }}</strong>
<router-link
class="button is-primary"
v-if="config && config.registrationsOpen"
:to="{ name: RouteName.REGISTER }"
>
<strong>{{ $t("Sign up") }}</strong>
</router-link>
<router-link class="button is-light" :to="{ name: RouteName.LOGIN }">{{ $t('Log in') }}</router-link>
<router-link class="button is-light" :to="{ name: RouteName.LOGIN }">{{
$t("Log in")
}}</router-link>
</div>
</b-navbar-item>
</template>
@@ -75,18 +102,18 @@
</template>
<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator';
import { CURRENT_USER_CLIENT } from '@/graphql/user';
import { changeIdentity, logout } from '@/utils/auth';
import { CURRENT_ACTOR_CLIENT, IDENTITIES } from '@/graphql/actor';
import { IPerson, Person } from '@/types/actor';
import { CONFIG } from '@/graphql/config';
import { IConfig } from '@/types/config.model';
import { ICurrentUser, ICurrentUserRole } from '@/types/current-user.model';
import Logo from '@/components/Logo.vue';
import SearchField from '@/components/SearchField.vue';
import { RouteName } from '@/router';
import { GraphQLError } from 'graphql';
import { Component, Vue, Watch } from "vue-property-decorator";
import Logo from "@/components/Logo.vue";
import { GraphQLError } from "graphql";
import { CURRENT_USER_CLIENT } from "../graphql/user";
import { changeIdentity, logout } from "../utils/auth";
import { CURRENT_ACTOR_CLIENT, IDENTITIES, UPDATE_DEFAULT_ACTOR } from "../graphql/actor";
import { IPerson, Person } from "../types/actor";
import { CONFIG } from "../graphql/config";
import { IConfig } from "../types/config.model";
import { ICurrentUser, ICurrentUserRole } from "../types/current-user.model";
import SearchField from "./SearchField.vue";
import RouteName from "../router/name";
@Component({
apollo: {
@@ -98,11 +125,14 @@ import { GraphQLError } from 'graphql';
},
identities: {
query: IDENTITIES,
update: ({ identities }) => identities ? identities.map(identity => new Person(identity)) : [],
update: ({ identities }) =>
identities ? identities.map((identity: IPerson) => new Person(identity)) : [],
skip() {
return this.currentUser.isLoggedIn === false;
},
error({ graphQLErrors }) { this.handleErrors(graphQLErrors); },
error({ graphQLErrors }) {
this.handleErrors(graphQLErrors);
},
},
config: {
query: CONFIG,
@@ -115,34 +145,45 @@ import { GraphQLError } from 'graphql';
})
export default class NavBar extends Vue {
currentActor!: IPerson;
config!: IConfig;
currentUser!: ICurrentUser;
ICurrentUserRole = ICurrentUserRole;
identities: IPerson[] = [];
RouteName = RouteName;
@Watch('currentActor')
@Watch("currentActor")
async initializeListOfIdentities() {
if (!this.currentUser.isLoggedIn) return;
const { data } = await this.$apollo.query<{ identities: IPerson[] }>({
query: IDENTITIES,
});
if (data) {
this.identities = data.identities.map(identity => new Person(identity));
this.identities = data.identities.map((identity) => new Person(identity));
// If we don't have any identities, the user has validated their account,
// is logging for the first time but didn't create an identity somehow
if (this.identities.length === 0) {
await this.$router.push({
name: RouteName.REGISTER_PROFILE,
params: { email: this.currentUser.email, userAlreadyActivated: 'true' },
params: {
email: this.currentUser.email,
userAlreadyActivated: "true",
},
});
}
}
}
async handleErrors(errors: GraphQLError[]) {
if (errors.length > 0 && errors[0].message === 'You need to be logged-in to view your list of identities') {
if (
errors.length > 0 &&
errors[0].message === "You need to be logged-in to view your list of identities"
) {
await this.logout();
}
}
@@ -150,9 +191,9 @@ export default class NavBar extends Vue {
async logout() {
await logout(this.$apollo.provider.defaultClient);
this.$buefy.notification.open({
message: this.$t('You have been disconnected') as string,
type: 'is-success',
position: 'is-bottom-right',
message: this.$t("You have been disconnected") as string,
type: "is-success",
position: "is-bottom-right",
duration: 5000,
});
@@ -161,7 +202,13 @@ export default class NavBar extends Vue {
}
async setIdentity(identity: IPerson) {
return await changeIdentity(this.$apollo.provider.defaultClient, identity);
await this.$apollo.mutate({
mutation: UPDATE_DEFAULT_ACTOR,
variables: {
preferredUsername: identity.preferredUsername,
},
});
return changeIdentity(this.$apollo.provider.defaultClient, identity);
}
}
</script>
@@ -169,6 +216,10 @@ export default class NavBar extends Vue {
@import "../variables.scss";
nav {
.navbar-item svg {
height: 1.75rem;
}
.navbar-dropdown .navbar-item {
cursor: pointer;

View File

@@ -1,33 +1,34 @@
<template>
<section class="container">
<h1 class="title" v-if="loading">
{{ $t('Your participation is being validated') }}
</h1>
<div v-else>
<div v-if="failed">
<b-message :title="$t('Error while validating participation')" type="is-danger">
{{ $t('Either the participation has already been validated, either the validation token is incorrect.') }}
</b-message>
</div>
<h1 class="title" v-else>
{{ $t('Your participation has been validated') }}
</h1>
</div>
</section>
<section class="container">
<h1 class="title" v-if="loading">{{ $t("Your participation is being validated") }}</h1>
<div v-else>
<div v-if="failed">
<b-message :title="$t('Error while validating participation')" type="is-danger">
{{
$t(
"Either the participation has already been validated, either the validation token is incorrect."
)
}}
</b-message>
</div>
<h1 class="title" v-else>{{ $t("Your participation has been validated") }}</h1>
</div>
</section>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { RouteName } from '@/router';
import { IParticipant } from '@/types/event.model';
import { CONFIRM_PARTICIPATION } from '@/graphql/event';
import { confirmLocalAnonymousParticipation } from '@/services/AnonymousParticipationStorage';
import { Component, Prop, Vue } from "vue-property-decorator";
import RouteName from "../../router/name";
import { IParticipant } from "../../types/event.model";
import { CONFIRM_PARTICIPATION } from "../../graphql/event";
import { confirmLocalAnonymousParticipation } from "../../services/AnonymousParticipationStorage";
@Component
export default class ConfirmParticipation extends Vue {
@Prop({ type: String, required: true }) token!: string;
loading = true;
failed = false;
async created() {
@@ -36,7 +37,9 @@ export default class ConfirmParticipation extends Vue {
async validateAction() {
try {
const { data } = await this.$apollo.mutate<{ confirmParticipation: IParticipant }>({
const { data } = await this.$apollo.mutate<{
confirmParticipation: IParticipant;
}>({
mutation: CONFIRM_PARTICIPATION,
variables: {
token: this.token,
@@ -46,7 +49,10 @@ export default class ConfirmParticipation extends Vue {
if (data) {
const { confirmParticipation: participation } = data;
await confirmLocalAnonymousParticipation(participation.event.uuid);
await this.$router.replace({ name: RouteName.EVENT, params: { uuid: data.confirmParticipation.event.uuid } } );
await this.$router.replace({
name: RouteName.EVENT,
params: { uuid: data.confirmParticipation.event.uuid },
});
}
} catch (err) {
console.error(err);

View File

@@ -1,54 +1,65 @@
<template>
<section class="section container hero is-fullheight">
<div class="hero-body">
<div class="container">
<div class="columns">
<div class="column">
<b-button type="is-primary" size="is-medium" tag="router-link" :to="{ name: RouteName.LOGIN }">{{ $t('Login on {instance}', { instance: host }) }}</b-button>
</div>
<vertical-divider :content="$t('Or')" />
<div class="column">
<subtitle>{{ $t('I have an account on another Mobilizon instance.')}}</subtitle>
<p>{{ $t('Other software may also support this.') }}</p>
<p>{{ $t('We will redirect you to your instance in order to interact with this event') }}</p>
<form @submit.prevent="redirectToInstance">
<b-field :label="$t('Your federated identity')">
<b-field>
<b-input
expanded
autocapitalize="none" autocorrect="off"
v-model="remoteActorAddress"
:placeholder="$t('profile@instance')">
</b-input>
<p class="control">
<button class="button is-primary" type="submit">{{ $t('Go') }}</button>
</p>
</b-field>
</b-field>
</form>
</div>
</div>
<div class="has-text-centered">
<b-button tag="a" type="is-text" @click="$router.go(-1)">
{{ $t('Back to previous page') }}
</b-button>
</div>
</div>
<section class="section container hero is-fullheight">
<div class="hero-body">
<div class="container">
<div class="columns">
<div class="column">
<b-button
type="is-primary"
size="is-medium"
tag="router-link"
:to="{ name: RouteName.LOGIN }"
>{{ $t("Login on {instance}", { instance: host }) }}</b-button
>
</div>
<vertical-divider :content="$t('Or')" />
<div class="column">
<subtitle>{{ $t("I have an account on another Mobilizon instance.") }}</subtitle>
<p>{{ $t("Other software may also support this.") }}</p>
<p>
{{ $t("We will redirect you to your instance in order to interact with this event") }}
</p>
<form @submit.prevent="redirectToInstance">
<b-field :label="$t('Your federated identity')">
<b-field>
<b-input
expanded
autocapitalize="none"
autocorrect="off"
v-model="remoteActorAddress"
:placeholder="$t('profile@instance')"
></b-input>
<p class="control">
<button class="button is-primary" type="submit">{{ $t("Go") }}</button>
</p>
</b-field>
</b-field>
</form>
</div>
</div>
</section>
<div class="has-text-centered">
<b-button tag="a" type="is-text" @click="$router.go(-1)">{{
$t("Back to previous page")
}}</b-button>
</div>
</div>
</div>
</section>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { RouteName } from '@/router';
import VerticalDivider from '@/components/Utils/VerticalDivider.vue';
import Subtitle from '@/components/Utils/Subtitle.vue';
import { Component, Prop, Vue } from "vue-property-decorator";
import VerticalDivider from "@/components/Utils/VerticalDivider.vue";
import Subtitle from "@/components/Utils/Subtitle.vue";
import RouteName from "../../router/name";
@Component({
components: { Subtitle, VerticalDivider },
})
export default class ParticipationWithAccount extends Vue {
@Prop({ type: String, required: true }) uuid!: string;
remoteActorAddress: string = '';
remoteActorAddress = "";
RouteName = RouteName;
get host() {
@@ -56,29 +67,39 @@ export default class ParticipationWithAccount extends Vue {
}
get uri(): string {
return `${window.location.origin}${this.$router.resolve({ name: RouteName.EVENT, params: { uuid: this.uuid } }).href}`;
return `${window.location.origin}${
this.$router.resolve({
name: RouteName.EVENT,
params: { uuid: this.uuid },
}).href
}`;
}
async redirectToInstance() {
let res;
const [_, host] = res = this.remoteActorAddress.split('@', 2);
const [_, host] = (res = this.remoteActorAddress.split("@", 2));
const remoteInteractionURI = await this.webFingerFetch(host, this.remoteActorAddress);
window.open(remoteInteractionURI);
}
private async webFingerFetch(hostname: string, identity: string): Promise<string> {
const scheme = process.env.NODE_ENV === 'production' ? 'https' : 'http';
const data = await ((await fetch(`${scheme}://${hostname}/.well-known/webfinger?resource=acct:${identity}`)).json());
const scheme = process.env.NODE_ENV === "production" ? "https" : "http";
const data = await (
await fetch(`${scheme}://${hostname}/.well-known/webfinger?resource=acct:${identity}`)
).json();
if (data && Array.isArray(data.links)) {
const link: { template: string } = data.links.find((link: any) => {
return link && typeof link.template === 'string' && link.rel === 'http://ostatus.org/schema/1.0/subscribe';
});
const link: { template: string } = data.links.find(
(link: any) =>
link &&
typeof link.template === "string" &&
link.rel === "http://ostatus.org/schema/1.0/subscribe"
);
if (link && link.template.includes('{uri}')) {
return link.template.replace('{uri}', encodeURIComponent(this.uri));
if (link && link.template.includes("{uri}")) {
return link.template.replace("{uri}", encodeURIComponent(this.uri));
}
}
throw new Error('No interaction path found in webfinger data');
throw new Error("No interaction path found in webfinger data");
}
}
</script>
</script>

View File

@@ -1,48 +1,72 @@
<template>
<section class="container section hero is-fullheight">
<div class="hero-body">
<div class="container">
<form @submit.prevent="joinEvent">
<p>{{ $t('This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.') }}</p>
<b-message type="is-info">{{ $t("Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.") }}</b-message>
<b-message type="is-danger" v-if="error">{{ error }}</b-message>
<b-field :label="$t('Email')">
<b-input
type="email"
v-model="anonymousParticipation.email"
placeholder="Your email"
required>
</b-input>
</b-field>
<p v-if="event.joinOptions === EventJoinOptions.RESTRICTED">{{ $t("The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.") }}</p>
<p v-else>{{ $t("If you want, you may send a message to the event organizer here.") }}</p>
<b-field :label="$t('Message')">
<b-input
type="textarea"
v-model="anonymousParticipation.message"
minlength="10"
:required="event.joinOptions === EventJoinOptions.RESTRICTED">
</b-input>
</b-field>
<b-button type="is-primary" native-type="submit">{{ $t('Send email') }}</b-button>
<div class="has-text-centered">
<b-button native-type="button" tag="a" type="is-text" @click="$router.go(-1)">
{{ $t('Back to previous page') }}
</b-button>
</div>
</form>
</div>
</div>
</section>
<section class="container section hero is-fullheight">
<div class="hero-body">
<div class="container">
<form @submit.prevent="joinEvent">
<p>
{{
$t(
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation."
)
}}
</p>
<b-message type="is-info">
{{
$t(
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer."
)
}}
</b-message>
<b-message type="is-danger" v-if="error">{{ error }}</b-message>
<b-field :label="$t('Email')">
<b-input
type="email"
v-model="anonymousParticipation.email"
placeholder="Your email"
required
></b-input>
</b-field>
<p v-if="event.joinOptions === EventJoinOptions.RESTRICTED">
{{
$t(
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event."
)
}}
</p>
<p v-else>{{ $t("If you want, you may send a message to the event organizer here.") }}</p>
<b-field :label="$t('Message')">
<b-input
type="textarea"
v-model="anonymousParticipation.message"
minlength="10"
:required="event.joinOptions === EventJoinOptions.RESTRICTED"
></b-input>
</b-field>
<b-button type="is-primary" native-type="submit">{{ $t("Send email") }}</b-button>
<div class="has-text-centered">
<b-button native-type="button" tag="a" type="is-text" @click="$router.go(-1)">{{
$t("Back to previous page")
}}</b-button>
</div>
</form>
</div>
</div>
</section>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { EventModel, IEvent, IParticipant, ParticipantRole, EventJoinOptions } from '@/types/event.model';
import { FETCH_EVENT, JOIN_EVENT } from '@/graphql/event';
import { IConfig } from '@/types/config.model';
import { CONFIG } from '@/graphql/config';
import { addLocalUnconfirmedAnonymousParticipation } from '@/services/AnonymousParticipationStorage';
import { RouteName } from '@/router';
import { Component, Prop, Vue } from "vue-property-decorator";
import {
EventModel,
IEvent,
IParticipant,
ParticipantRole,
EventJoinOptions,
} from "@/types/event.model";
import { FETCH_EVENT, JOIN_EVENT } from "@/graphql/event";
import { IConfig } from "@/types/config.model";
import { CONFIG } from "@/graphql/config";
import { addLocalUnconfirmedAnonymousParticipation } from "@/services/AnonymousParticipationStorage";
import RouteName from "../../router/name";
@Component({
apollo: {
@@ -53,7 +77,9 @@ import { RouteName } from '@/router';
uuid: this.uuid,
};
},
skip() { return !this.uuid; },
skip() {
return !this.uuid;
},
update: (data) => new EventModel(data.event),
},
config: CONFIG,
@@ -61,10 +87,18 @@ import { RouteName } from '@/router';
})
export default class ParticipationWithoutAccount extends Vue {
@Prop({ type: String, required: true }) uuid!: string;
anonymousParticipation: { email: String, message: String } = { email: '', message: '' };
anonymousParticipation: { email: string; message: string } = {
email: "",
message: "",
};
event!: IEvent;
config!: IConfig;
error: String|boolean = false;
error: string | boolean = false;
EventJoinOptions = EventJoinOptions;
async joinEvent() {
@@ -88,7 +122,7 @@ export default class ParticipationWithoutAccount extends Vue {
if (cachedData == null) return;
const { event } = cachedData;
if (event === null) {
console.error('Cannot update event participant cache, because of null value.');
console.error("Cannot update event participant cache, because of null value.");
return;
}
@@ -99,19 +133,31 @@ export default class ParticipationWithoutAccount extends Vue {
event.participantStats.participant = event.participantStats.participant + 1;
}
store.writeQuery({ query: FETCH_EVENT, variables: { uuid: this.event.uuid }, data: { event } });
store.writeQuery({
query: FETCH_EVENT,
variables: { uuid: this.event.uuid },
data: { event },
});
},
});
if (data && data.joinEvent.metadata.cancellationToken) {
await addLocalUnconfirmedAnonymousParticipation(this.event, data.joinEvent.metadata.cancellationToken);
return this.$router.push({ name: RouteName.EVENT, params: { uuid: this.event.uuid } });
await addLocalUnconfirmedAnonymousParticipation(
this.event,
data.joinEvent.metadata.cancellationToken
);
return this.$router.push({
name: RouteName.EVENT,
params: { uuid: this.event.uuid },
});
}
} catch (e) {
console.log(JSON.stringify(e));
if (e.message === 'GraphQL error: You are already a participant of this event') {
this.error = this.$t('This email is already registered as participant for this event') as string;
if (e.message === "GraphQL error: You are already a participant of this event") {
this.error = this.$t(
"This email is already registered as participant for this event"
) as string;
}
}
}
}
</script>
</script>

View File

@@ -1,67 +1,94 @@
<template>
<section class="section container hero">
<div class="hero-body" v-if="event">
<div class="container">
<subtitle>{{ $t('You wish to participate to the following event')}}</subtitle>
<EventListViewCard v-if="event" :event="event" />
<div class="columns has-text-centered">
<div class="column">
<router-link :to="{ name: RouteName.EVENT_PARTICIPATE_WITH_ACCOUNT }">
<figure class="image is-128x128">
<img src="../../assets/undraw_profile.svg" alt="Profile illustration" />
</figure>
<b-button type="is-primary">{{ $t('I have a Mobilizon account') }}</b-button>
</router-link>
<p>
<small>{{ $t('Either on the {instance} instance or on another instance.', {instance: host })}}</small>
<b-tooltip type="is-dark" :label="$t('Mobilizon is a federated network. You can interact with this event from a different server.')">
<b-icon size="is-small" icon="help-circle-outline" />
</b-tooltip>
</p>
</div>
<vertical-divider :content="$t('Or')" v-if="anonymousParticipationAllowed" />
<div class="column" v-if="anonymousParticipationAllowed && hasAnonymousEmailParticipationMethod">
<router-link :to="{ name: RouteName.EVENT_PARTICIPATE_WITHOUT_ACCOUNT }" v-if="event.local">
<figure class="image is-128x128">
<img src="../../assets/undraw_mail_2.svg" alt="Privacy illustration" />
</figure>
<b-button type="is-primary">{{ $t("I don't have a Mobilizon account") }}</b-button>
</router-link>
<a :href="`${event.url}/participate/without-account`" v-else>
<figure class="image is-128x128">
<img src="../../assets/undraw_mail_2.svg" alt="Privacy illustration" />
</figure>
<b-button type="is-primary">{{ $t("I don't have a Mobilizon account") }}</b-button>
</a>
<p>
<small>{{ $t('Participate using your email address')}}</small><br />
<small v-if="!event.local">{{ $t('You will be redirected to the original instance')}}</small>
</p>
</div>
</div>
<div class="has-text-centered">
<b-button tag="a" type="is-text" @click="$router.go(-1)">
{{ $t('Back to previous page') }}
</b-button>
</div>
</div>
<section class="section container hero">
<div class="hero-body" v-if="event">
<div class="container">
<subtitle>{{ $t("You wish to participate to the following event") }}</subtitle>
<EventListViewCard v-if="event" :event="event" />
<div class="columns has-text-centered">
<div class="column">
<router-link :to="{ name: RouteName.EVENT_PARTICIPATE_WITH_ACCOUNT }">
<figure class="image is-128x128">
<img src="../../assets/undraw_profile.svg" alt="Profile illustration" />
</figure>
<b-button type="is-primary">{{ $t("I have a Mobilizon account") }}</b-button>
</router-link>
<p>
<small>
{{
$t("Either on the {instance} instance or on another instance.", {
instance: host,
})
}}
</small>
<b-tooltip
type="is-dark"
:label="
$t(
'Mobilizon is a federated network. You can interact with this event from a different server.'
)
"
>
<b-icon size="is-small" icon="help-circle-outline" />
</b-tooltip>
</p>
</div>
<vertical-divider :content="$t('Or')" v-if="anonymousParticipationAllowed" />
<div
class="column"
v-if="anonymousParticipationAllowed && hasAnonymousEmailParticipationMethod"
>
<router-link
:to="{ name: RouteName.EVENT_PARTICIPATE_WITHOUT_ACCOUNT }"
v-if="event.local"
>
<figure class="image is-128x128">
<img src="../../assets/undraw_mail_2.svg" alt="Privacy illustration" />
</figure>
<b-button type="is-primary">{{ $t("I don't have a Mobilizon account") }}</b-button>
</router-link>
<a :href="`${event.url}/participate/without-account`" v-else>
<figure class="image is-128x128">
<img src="../../assets/undraw_mail_2.svg" alt="Privacy illustration" />
</figure>
<b-button type="is-primary">{{ $t("I don't have a Mobilizon account") }}</b-button>
</a>
<p>
<small>{{ $t("Participate using your email address") }}</small>
<br />
<small v-if="!event.local">
{{ $t("You will be redirected to the original instance") }}
</small>
</p>
</div>
</div>
</section>
<div class="has-text-centered">
<b-button tag="a" type="is-text" @click="$router.go(-1)">{{
$t("Back to previous page")
}}</b-button>
</div>
</div>
</div>
</section>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { RouteName } from '@/router';
import { FETCH_EVENT } from '@/graphql/event';
import EventListCard from '@/components/Event/EventListCard.vue';
import EventListViewCard from '@/components/Event/EventListViewCard.vue';
import { EventModel, IEvent } from '@/types/event.model';
import VerticalDivider from '@/components/Utils/VerticalDivider.vue';
import { CONFIG } from '@/graphql/config';
import { IConfig } from '@/types/config.model';
import Subtitle from '@/components/Utils/Subtitle.vue';
import { Component, Prop, Vue } from "vue-property-decorator";
import { FETCH_EVENT } from "@/graphql/event";
import EventListCard from "@/components/Event/EventListCard.vue";
import EventListViewCard from "@/components/Event/EventListViewCard.vue";
import { EventModel, IEvent } from "@/types/event.model";
import VerticalDivider from "@/components/Utils/VerticalDivider.vue";
import { CONFIG } from "@/graphql/config";
import { IConfig } from "@/types/config.model";
import Subtitle from "@/components/Utils/Subtitle.vue";
import RouteName from "../../router/name";
@Component({
components: { VerticalDivider, EventListViewCard, EventListCard, Subtitle },
components: {
VerticalDivider,
EventListViewCard,
EventListCard,
Subtitle,
},
apollo: {
event: {
query: FETCH_EVENT,
@@ -70,7 +97,9 @@ import Subtitle from '@/components/Utils/Subtitle.vue';
uuid: this.uuid,
};
},
skip() { return !this.uuid; },
skip() {
return !this.uuid;
},
update: (data) => new EventModel(data.event),
},
config: CONFIG,
@@ -78,8 +107,11 @@ import Subtitle from '@/components/Utils/Subtitle.vue';
})
export default class UnloggedParticipation extends Vue {
@Prop({ type: String, required: true }) uuid!: string;
RouteName = RouteName;
event!: IEvent;
config!: IConfig;
get host() {
@@ -91,15 +123,17 @@ export default class UnloggedParticipation extends Vue {
}
get hasAnonymousEmailParticipationMethod(): boolean {
return this.config.anonymous.participation.allowed && this.config.anonymous.participation.validation.email.enabled;
return (
this.config.anonymous.participation.allowed &&
this.config.anonymous.participation.validation.email.enabled
);
}
}
</script>
<style lang="scss" scoped>
.column > a {
display: flex;
flex-direction: column;
align-items: center;
}
</style>
.column > a {
display: flex;
flex-direction: column;
align-items: center;
}
</style>

View File

@@ -1,7 +1,7 @@
<template>
<div class="root">
<figure class="image" v-if="imageSrc">
<img :src="imageSrc" />
<img :src="imageSrc" />
</figure>
<figure class="image is-128x128" v-else>
<div class="image-placeholder">
@@ -12,50 +12,61 @@
<b-upload @input="onFileChanged" :accept="accept">
<a class="button is-primary">
<b-icon icon="upload"></b-icon>
<span>{{ $t('Click to upload') }}</span>
<span>{{ $t("Click to upload") }}</span>
</a>
</b-upload>
</div>
</template>
<style scoped lang="scss">
.root {
display: flex;
align-items: center;
}
.root {
display: flex;
align-items: center;
}
figure.image {
margin-right: 30px;
max-height: 200px;
max-width: 200px;
overflow: hidden;
}
figure.image {
margin-right: 30px;
max-height: 200px;
max-width: 200px;
overflow: hidden;
}
.image-placeholder {
background-color: grey;
width: 100%;
height: 100%;
border-radius: 100%;
display: flex;
justify-content: center;
align-items: center;
.image-placeholder {
background-color: grey;
width: 100%;
height: 100%;
border-radius: 100%;
display: flex;
justify-content: center;
align-items: center;
span {
flex: 1;
color: #eee;
}
span {
flex: 1;
color: #eee;
}
}
</style>
<script lang="ts">
import { Component, Model, Prop, Vue, Watch } from 'vue-property-decorator';
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/gif,image/png,image/jpeg,image/webp' }) accept;
// @ts-ignore
@Prop({ type: String, required: false, default() { return this.$t('Avatar'); } }) textFallback!: string;
@Model("change", { type: File }) readonly pictureFile!: File;
@Prop({ type: String, required: false, default: "image/gif,image/png,image/jpeg,image/webp" })
accept!: string;
@Prop({
type: String,
required: false,
default() {
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
return this.$t("Avatar");
},
})
textFallback!: string;
imageSrc: string | null = null;
@@ -63,13 +74,13 @@ export default class PictureUpload extends Vue {
this.updatePreview(this.pictureFile);
}
@Watch('pictureFile')
@Watch("pictureFile")
onPictureFileChanged(val: File) {
this.updatePreview(val);
}
onFileChanged(file: File) {
this.$emit('change', file);
this.$emit("change", file);
this.updatePreview(file);
}

View File

@@ -4,39 +4,39 @@
```
</docs>
<template>
<div class="card" v-if="report">
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-48x48" v-if="report.reported.avatar">
<img alt="" :src="report.reported.avatar.url" />
</figure>
<b-icon v-else size="is-large" icon="account-circle" />
</div>
<div class="media-content">
<p class="title is-4">{{ report.reported.name }}</p>
<p class="subtitle is-6">@{{ report.reported.preferredUsername }}</p>
</div>
</div>
<div class="content columns">
<div class="column is-one-quarter-desktop">
<span v-if="report.reporter.type === ActorType.APPLICATION">
{{ $t('Reported by someone on {domain}', { domain: report.reporter.domain}) }}
</span>
<span v-else>
{{ $t('Reported by {reporter}', { reporter: report.reporter.preferredUsername}) }}
</span>
</div>
<div class="column" v-if="report.content">{{ report.content }}</div>
</div>
<div class="card" v-if="report">
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-48x48" v-if="report.reported.avatar">
<img alt="" :src="report.reported.avatar.url" />
</figure>
<b-icon v-else size="is-large" icon="account-circle" />
</div>
<div class="media-content">
<p class="title is-4">{{ report.reported.name }}</p>
<p class="subtitle is-6">@{{ report.reported.preferredUsername }}</p>
</div>
</div>
<div class="content columns">
<div class="column is-one-quarter-desktop">
<span v-if="report.reporter.type === ActorType.APPLICATION">
{{ $t("Reported by someone on {domain}", { domain: report.reporter.domain }) }}
</span>
<span v-else>
{{ $t("Reported by {reporter}", { reporter: report.reporter.preferredUsername }) }}
</span>
</div>
<div class="column" v-if="report.content">{{ report.content }}</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { IReport } from '@/types/report.model';
import { ActorType } from '@/types/actor';
import { Component, Prop, Vue } from "vue-property-decorator";
import { IReport } from "@/types/report.model";
import { ActorType } from "@/types/actor";
@Component
export default class ReportCard extends Vue {
@@ -46,9 +46,9 @@ export default class ReportCard extends Vue {
}
</script>
<style lang="scss">
.content img.image {
display: inline;
height: 1.5em;
vertical-align: text-bottom;
}
</style>
.content img.image {
display: inline;
height: 1.5em;
vertical-align: text-bottom;
}
</style>

View File

@@ -1,77 +1,80 @@
<template>
<div class="modal-card">
<header class="modal-card-head" v-if="title">
<p class="modal-card-title">{{ title }}</p>
</header>
<div class="modal-card">
<header class="modal-card-head" v-if="title">
<p class="modal-card-title">{{ title }}</p>
</header>
<section
class="modal-card-body is-flex"
:class="{ 'is-titleless': !title }">
<div class="media">
<div
class="media-left">
<b-icon
icon="alert"
type="is-warning"
size="is-large"/>
</div>
<div class="media-content">
<div class="box" v-if="comment">
<article class="media">
<div class="media-left">
<figure class="image is-48x48" v-if="comment.actor.avatar">
<img :src="comment.actor.avatar.url" alt="Image">
</figure>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
</div>
<div class="media-content">
<div class="content">
<strong>{{ comment.actor.name }}</strong> <small>@{{ comment.actor.preferredUsername }}</small>
<br>
<p v-html="comment.text"></p>
</div>
</div>
</article>
</div>
<p>{{ $t('The report will be sent to the moderators of your instance. You can explain why you report this content below.') }}</p>
<div class="control">
<b-input
v-model="content"
type="textarea"
@keyup.enter="confirm"
:placeholder="$t('Additional comments')"
/>
</div>
<div class="control" v-if="outsideDomain">
<p>{{ $t('The content came from another server. Transfer an anonymous copy of the report?') }}</p>
<b-switch v-model="forward">{{ $t('Transfer to {outsideDomain}', { outsideDomain }) }}</b-switch>
</div>
</div>
</div>
</section>
<footer class="modal-card-foot">
<button
class="button"
ref="cancelButton"
@click="close">
{{ translatedCancelText }}
</button>
<button
class="button is-primary"
ref="confirmButton"
@click="confirm">
{{ translatedConfirmText }}
</button>
</footer>
<section class="modal-card-body is-flex" :class="{ 'is-titleless': !title }">
<div class="media">
<div class="media-left">
<b-icon icon="alert" type="is-warning" size="is-large" />
</div>
<div class="media-content">
<div class="box" v-if="comment">
<article class="media">
<div class="media-left">
<figure class="image is-48x48" v-if="comment.actor.avatar">
<img :src="comment.actor.avatar.url" alt="Image" />
</figure>
<b-icon class="media-left" v-else size="is-large" icon="account-circle" />
</div>
<div class="media-content">
<div class="content">
<strong>{{ comment.actor.name }}</strong>
<small>@{{ comment.actor.preferredUsername }}</small>
<br />
<p v-html="comment.text"></p>
</div>
</div>
</article>
</div>
<p>
{{
$t(
"The report will be sent to the moderators of your instance. You can explain why you report this content below."
)
}}
</p>
<div class="control">
<b-input
v-model="content"
type="textarea"
@keyup.enter="confirm"
:placeholder="$t('Additional comments')"
/>
</div>
<div class="control" v-if="outsideDomain">
<p>
{{
$t(
"The content came from another server. Transfer an anonymous copy of the report?"
)
}}
</p>
<b-switch v-model="forward">{{
$t("Transfer to {outsideDomain}", { outsideDomain })
}}</b-switch>
</div>
</div>
</div>
</section>
<footer class="modal-card-foot">
<button class="button" ref="cancelButton" @click="close">
{{ translatedCancelText }}
</button>
<button class="button is-primary" ref="confirmButton" @click="confirm">
{{ translatedConfirmText }}
</button>
</footer>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { IComment } from '@/types/comment.model';
import { Component, Prop, Vue } from "vue-property-decorator";
import { IComment } from "../../types/comment.model";
@Component({
mounted() {
@@ -79,23 +82,30 @@ import { IComment } from '@/types/comment.model';
},
})
export default class ReportModal extends Vue {
@Prop({ type: Function, default: () => {} }) onConfirm;
@Prop({ type: String }) title;
@Prop({ type: Object }) comment!: IComment;
@Prop({ type: String, default: '' }) outsideDomain;
@Prop({ type: String }) cancelText;
@Prop({ type: String }) confirmText;
@Prop({ type: Function }) onConfirm!: Function;
isActive: boolean = false;
content: string = '';
forward: boolean = false;
@Prop({ type: String }) title!: string;
@Prop({ type: Object }) comment!: IComment;
@Prop({ type: String, default: "" }) outsideDomain!: string;
@Prop({ type: String }) cancelText!: string;
@Prop({ type: String }) confirmText!: string;
isActive = false;
content = "";
forward = false;
get translatedCancelText() {
return this.cancelText || this.$t('Cancel');
return this.cancelText || this.$t("Cancel");
}
get translatedConfirmText() {
return this.confirmText || this.$t('Send the report');
return this.confirmText || this.$t("Send the report");
}
confirm() {
@@ -103,32 +113,32 @@ export default class ReportModal extends Vue {
this.close();
}
/**
* Close the Dialog.
*/
/**
* Close the Dialog.
*/
close() {
this.isActive = false;
this.$emit('close');
this.$emit("close");
}
}
</script>
<style lang="scss" scoped>
.modal-card .modal-card-foot {
justify-content: flex-end;
.modal-card .modal-card-foot {
justify-content: flex-end;
}
.modal-card-body {
.media-content {
.box {
.media {
padding-top: 0;
border-top: none;
}
}
.modal-card-body {
.media-content {
.box {
.media {
padding-top: 0;
border-top: none;
}
}
& > p {
margin-bottom: 2rem;
}
}
& > p {
margin-bottom: 2rem;
}
}
}
</style>

View File

@@ -0,0 +1,171 @@
<template>
<div class="resource-wrapper">
<router-link
:to="{
name: RouteName.RESOURCE_FOLDER,
params: {
path: ResourceMixin.resourcePathArray(resource),
preferredUsername: usernameWithDomain(group),
},
}"
>
<div class="preview">
<b-icon icon="folder" size="is-large" />
</div>
<div class="body">
<h3>{{ resource.title }}</h3>
<span class="host" v-if="inline">{{ resource.updatedAt | formatDateTimeString }}</span>
</div>
<draggable
v-if="!inline"
class="dropzone"
v-model="list"
:sort="false"
:group="groupObject"
@change="onChange"
/>
</router-link>
<resource-dropdown
class="actions"
v-if="!inline"
@delete="$emit('delete', resource.id)"
@move="$emit('move', resource.id)"
@rename="$emit('rename', resource)"
/>
</div>
</template>
<script lang="ts">
import { Component, Mixins, Prop } from "vue-property-decorator";
import { Route } from "vue-router";
import Draggable, { ChangeEvent } from "vuedraggable";
import { IResource } from "../../types/resource";
import RouteName from "../../router/name";
import ResourceMixin from "../../mixins/resource";
import { IGroup, usernameWithDomain } from "../../types/actor";
import ResourceDropdown from "./ResourceDropdown.vue";
import { UPDATE_RESOURCE } from "../../graphql/resources";
@Component({
components: { Draggable, ResourceDropdown },
})
export default class FolderItem extends Mixins(ResourceMixin) {
@Prop({ required: true, type: Object }) resource!: IResource;
@Prop({ required: true, type: Object }) group!: IGroup;
@Prop({ required: false, default: false }) inline!: boolean;
list = [];
groupObject: object = {
name: `folder-${this.resource.title}`,
pull: false,
put: ["resources"],
};
RouteName = RouteName;
ResourceMixin = ResourceMixin;
usernameWithDomain = usernameWithDomain;
async onChange(evt: ChangeEvent<IResource>): Promise<Route | undefined> {
console.log("into folder item");
console.log(evt);
if (evt.added && evt.added.element) {
const movedResource = evt.added.element as IResource;
const updatedResource = await this.moveResource(movedResource);
if (updatedResource && this.resource.path) {
// eslint-disable-next-line
// @ts-ignore
return this.$router.push({
name: RouteName.RESOURCE_FOLDER,
params: {
// eslint-disable-next-line
// @ts-ignore
path: ResourceMixin.resourcePathArray(this.resource),
preferredUsername: this.group.preferredUsername,
},
});
}
}
return undefined;
}
async moveResource(resource: IResource): Promise<IResource | undefined> {
const { data } = await this.$apollo.mutate<{ updateResource: IResource }>({
mutation: UPDATE_RESOURCE,
variables: {
id: resource.id,
path: `${this.resource.path}/${resource.title}`,
parentId: this.resource.id,
},
});
if (!data) {
console.error("Error while updating resource");
return undefined;
}
return data.updateResource;
}
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
.resource-wrapper {
display: flex;
flex: 1;
align-items: center;
.actions {
flex: 0;
display: block;
margin: auto 1rem auto 2rem;
cursor: pointer;
}
}
.dropzone {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 10;
}
a {
display: flex;
font-size: 14px;
color: #444b5d;
text-decoration: none;
overflow: hidden;
flex: 1;
position: relative;
.preview {
flex: 0 0 100px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.body {
padding: 10px 8px 8px;
flex: 1 1 auto;
overflow: hidden;
h3 {
white-space: nowrap;
display: block;
font-weight: 500;
margin-bottom: 5px;
color: $primary;
overflow: hidden;
text-overflow: ellipsis;
text-decoration: none;
}
}
}
</style>

View File

@@ -0,0 +1,24 @@
<template>
<b-dropdown aria-role="list" position="is-bottom-left">
<b-icon icon="dots-horizontal" slot="trigger" />
<b-dropdown-item aria-role="listitem" @click="$emit('rename')">
<b-icon icon="pencil" />
{{ $t("Rename") }}
</b-dropdown-item>
<b-dropdown-item aria-role="listitem" @click="$emit('move')">
<b-icon icon="folder-move" />
{{ $t("Move") }}
</b-dropdown-item>
<b-dropdown-item aria-role="listitem" @click="$emit('delete')">
<b-icon icon="delete" />
{{ $t("Delete") }}
</b-dropdown-item>
</b-dropdown>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
@Component
export default class ResourceDropdown extends Vue {}
</script>

View File

@@ -0,0 +1,137 @@
<template>
<div class="resource-wrapper">
<a :href="resource.resourceUrl" target="_blank">
<div class="preview">
<div v-if="resource.type && Object.keys(mapServiceTypeToIcon).includes(resource.type)">
<b-icon :icon="mapServiceTypeToIcon[resource.type]" size="is-large" />
</div>
<div
class="preview-image"
v-else-if="resource.metadata && resource.metadata.imageRemoteUrl"
:style="`background-image: url(${resource.metadata.imageRemoteUrl})`"
/>
<div class="preview-type" v-else>
<b-icon icon="link" size="is-large" />
</div>
</div>
<div class="body">
<img
class="favicon"
v-if="resource.metadata && resource.metadata.faviconUrl"
:src="resource.metadata.faviconUrl"
/>
<h3>{{ resource.title }}</h3>
<span class="host" v-if="inline">{{ resource.updatedAt | formatDateTimeString }}</span>
<span class="host" v-else>{{ urlHostname }}</span>
</div>
</a>
<resource-dropdown
class="actions"
v-if="!inline"
@delete="$emit('delete', resource.id)"
@move="$emit('move', resource.id)"
@rename="$emit('rename', resource)"
/>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { IResource, mapServiceTypeToIcon } from "@/types/resource";
import ResourceDropdown from "@/components/Resource/ResourceDropdown.vue";
@Component({
components: { ResourceDropdown },
})
export default class ResourceItem extends Vue {
@Prop({ required: true, type: Object }) resource!: IResource;
@Prop({ required: false, default: false }) inline!: boolean;
list = [];
mapServiceTypeToIcon = mapServiceTypeToIcon;
get urlHostname(): string {
return new URL(this.resource.resourceUrl).hostname.replace(/^(www\.)/, "");
}
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
.resource-wrapper {
display: flex;
flex: 1;
align-items: center;
.actions {
flex: 0;
display: block;
margin: auto 1rem auto 2rem;
cursor: pointer;
}
}
a {
display: flex;
font-size: 14px;
color: #444b5d;
text-decoration: none;
overflow: hidden;
flex: 1;
.preview {
flex: 0 0 100px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.preview-image {
border-radius: 4px 0 0 4px;
display: block;
margin: 0;
width: 100%;
height: 100%;
object-fit: cover;
background-size: cover;
background-position: 50%;
}
}
.body {
padding: 10px 8px 8px;
flex: 1 1 auto;
overflow: hidden;
img.favicon {
display: inline-block;
width: 16px;
height: 16px;
margin-right: 6px;
vertical-align: middle;
}
h3 {
white-space: nowrap;
display: inline-block;
font-weight: 500;
margin-bottom: 5px;
color: $primary;
overflow: hidden;
text-overflow: ellipsis;
text-decoration: none;
vertical-align: middle;
}
.host {
display: block;
margin-top: 5px;
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
</style>

View File

@@ -1,33 +1,52 @@
<template>
<b-input custom-class="searchField" icon="magnify" type="search" rounded :placeholder="defaultPlaceHolder" v-model="searchText" @keyup.native.enter="enter" />
<label>
<span class="visually-hidden">{{ defaultPlaceHolder }}</span>
<b-input
custom-class="searchField"
icon="magnify"
type="search"
rounded
:placeholder="defaultPlaceHolder"
v-model="searchText"
@keyup.native.enter="enter"
/>
</label>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { RouteName } from '@/router';
import { Component, Prop, Vue } from "vue-property-decorator";
import RouteName from "../router/name";
@Component
export default class SearchField extends Vue {
@Prop({ type: String, required: false }) placeholder!: string;
searchText: string = '';
searchText = "";
enter() {
this.$router.push({ name: RouteName.SEARCH, params: { searchTerm: this.searchText } });
this.$router.push({
name: RouteName.SEARCH,
params: { searchTerm: this.searchText },
});
}
get defaultPlaceHolder(): string {
// We can't use "this" inside @Prop's default value.
return this.placeholder || this.$t('Search') as string;
// We can't use "this" inside @Prop's default value.
return this.placeholder || (this.$t("Search") as string);
}
}
</script>
<style lang="scss">
input.searchField {
box-shadow: none;
border-color: #b5b5b5;
label span.visually-hidden {
display: none;
}
&::placeholder {
color: gray;
}
}
input.searchField {
box-shadow: none;
border-color: #b5b5b5;
&::placeholder {
color: gray;
}
}
</style>

View File

@@ -1,14 +1,14 @@
<template>
<li class="setting-menu-item" :class="{ active: isActive }">
<router-link v-if="menuItem.to" :to="menuItem.to">
<span>{{ menuItem.title }}</span>
</router-link>
<span v-else>{{ menuItem.title }}</span>
</li>
<li class="setting-menu-item" :class="{ active: isActive }">
<router-link v-if="menuItem.to" :to="menuItem.to">
<span>{{ menuItem.title }}</span>
</router-link>
<span v-else>{{ menuItem.title }}</span>
</li>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { ISettingMenuSection } from '@/types/setting-menu.model';
import { Component, Prop, Vue } from "vue-property-decorator";
import { ISettingMenuSection } from "@/types/setting-menu.model";
@Component
export default class SettingMenuItem extends Vue {
@@ -28,27 +28,28 @@ export default class SettingMenuItem extends Vue {
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
@import "@/variables.scss";
li.setting-menu-item {
font-size: 1.05rem;
background-color: #fff1de;
color: $primary;
margin: auto;
li.setting-menu-item {
font-size: 1.05rem;
background-color: #fff1de;
color: $primary;
margin: auto;
span {
padding: 5px 15px;
display: block;
}
span {
padding: 5px 15px;
display: block;
}
a {
display: block;
color: inherit;
}
a {
display: block;
color: inherit;
}
&:hover, &.active {
cursor: pointer;
background-color: lighten(#fea72b, 10%);
}
}
</style>
&:hover,
&.active {
cursor: pointer;
background-color: lighten(#fea72b, 10%);
}
}
</style>

View File

@@ -1,48 +1,52 @@
<template>
<li :class="{ active: sectionActive }">
<router-link v-if="menuSection.to" :to="menuSection.to">{{ menuSection.title }}</router-link>
<b v-else>{{ menuSection.title }}</b>
<ul>
<setting-menu-item :menu-item="item" v-for="item in menuSection.items" :key="item.title" />
</ul>
</li>
<li :class="{ active: sectionActive }">
<router-link v-if="menuSection.to" :to="menuSection.to">{{ menuSection.title }}</router-link>
<b v-else>{{ menuSection.title }}</b>
<ul>
<setting-menu-item :menu-item="item" v-for="item in menuSection.items" :key="item.title" />
</ul>
</li>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { ISettingMenuSection } from '@/types/setting-menu.model';
import SettingMenuItem from '@/components/Settings/SettingMenuItem.vue';
import { Component, Prop, Vue } from "vue-property-decorator";
import { ISettingMenuSection } from "@/types/setting-menu.model";
import SettingMenuItem from "@/components/Settings/SettingMenuItem.vue";
@Component({
components: { SettingMenuItem },
})
export default class SettingMenuSection extends Vue {
@Prop({ required: true, type: Object }) menuSection!: ISettingMenuSection;
get sectionActive(): boolean|undefined {
return this.menuSection.items && this.menuSection.items.some((({ to }) => to && to.name === this.$route.name));
get sectionActive(): boolean | undefined {
return (
this.menuSection.items &&
this.menuSection.items.some(({ to }) => to && to.name === this.$route.name)
);
}
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
@import "@/variables.scss";
li {
font-size: 1.3rem;
background-color: $secondary;
color: $primary;
margin: 2px auto;
li {
font-size: 1.3rem;
background-color: $secondary;
color: $primary;
margin: 2px auto;
&.active {
background-color: #fea72b;
}
&.active {
background-color: #fea72b;
}
a, b {
cursor: pointer;
margin: 5px 0;
display: block;
padding: 5px 10px;
color: inherit;
font-weight: 500;
}
}
</style>
a,
b {
cursor: pointer;
margin: 5px 0;
display: block;
padding: 5px 10px;
color: inherit;
font-weight: 500;
}
}
</style>

View File

@@ -1,18 +1,20 @@
<template>
<ul>
<SettingMenuSection v-for="section in menuValue" :key="section.title" :menu-section="section" />
</ul>
<ul>
<SettingMenuSection v-for="section in menuValue" :key="section.title" :menu-section="section" />
</ul>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import SettingMenuSection from '@/components/Settings/SettingMenuSection.vue';
import { ISettingMenuSection } from '@/types/setting-menu.model';
import { Component, Prop, Vue } from "vue-property-decorator";
import SettingMenuSection from "@/components/Settings/SettingMenuSection.vue";
import { ISettingMenuSection } from "@/types/setting-menu.model";
@Component({
components: { SettingMenuSection },
})
export default class SettingsMenu extends Vue {
@Prop({ required: true, type: Array }) menu!: ISettingMenuSection[];
get menuValue() { return this.menu; }
get menuValue() {
return this.menu;
}
}
</script>
</script>

24
js/src/components/Tag.vue Normal file
View File

@@ -0,0 +1,24 @@
<template>
<span class="tag">
<span>
<slot />
</span>
</span>
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Tag extends Vue {}
</script>
<style lang="scss" scoped>
span.tag {
background: #ecebf7;
color: #8e8bae;
text-transform: uppercase;
&::before {
content: "#";
}
}
</style>

View File

@@ -0,0 +1,60 @@
<template>
<div class="card" v-if="todo">
<div class="card-content">
<b-checkbox v-model="status" />
<router-link :to="{ name: RouteName.TODO, params: { todoId: todo.id } }">{{
todo.title
}}</router-link>
<span class="details has-text-grey">
<span v-if="todo.dueDate" class="due_date">
<b-icon icon="calendar" />
{{ todo.dueDate | formatDateString }}
</span>
<span v-if="todo.assignedTo" class="assigned_to">
<b-icon icon="account" />
{{ `@${todo.assignedTo.preferredUsername}` }}
<span v-if="todo.assignedTo.domain">{{ `@${todo.assignedTo.domain}` }}</span>
</span>
</span>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { ITodo } from "../../types/todos";
import RouteName from "../../router/name";
import { UPDATE_TODO } from "../../graphql/todos";
@Component
export default class Todo extends Vue {
@Prop({ required: true, type: Object }) todo!: ITodo;
RouteName = RouteName;
editMode = false;
get status(): boolean {
return this.todo.status;
}
set status(status: boolean) {
this.updateTodo({ status });
}
updateTodo(params: object) {
this.$apollo.mutate({
mutation: UPDATE_TODO,
variables: {
id: this.todo.id,
...params,
},
});
this.editMode = false;
}
}
</script>
<style lang="scss" scoped>
span.details {
margin-left: 1rem;
}
</style>

View File

@@ -0,0 +1,90 @@
<template>
<div class="card" v-if="todo">
<div class="card-content">
<b-field :label="$t('Statut')">
<b-checkbox size="is-large" v-model="status" />
</b-field>
<b-field :label="$t('Title')">
<b-input v-model="title" />
</b-field>
<b-field :label="$t('Assigned to')">
<actor-auto-complete v-model="assignedTo" />
</b-field>
<b-field :label="$t('Due on')">
<b-datepicker v-model="dueDate" />
</b-field>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { debounce } from "lodash";
import { ITodo } from "../../types/todos";
import RouteName from "../../router/name";
import { UPDATE_TODO } from "../../graphql/todos";
import ActorAutoComplete from "../Account/ActorAutoComplete.vue";
import { IPerson } from "../../types/actor";
@Component({
components: { ActorAutoComplete },
})
export default class Todo extends Vue {
@Prop({ required: true, type: Object }) todo!: ITodo;
RouteName = RouteName;
editMode = false;
debounceUpdateTodo!: Function;
// We put this in data because of issues like
// https://github.com/vuejs/vue-class-component/issues/263
data() {
return {
debounceUpdateTodo: debounce(this.updateTodo, 1000),
};
}
get title(): string {
return this.todo.title;
}
set title(title: string) {
this.debounceUpdateTodo({ title });
}
get status(): boolean {
return this.todo.status;
}
set status(status: boolean) {
this.debounceUpdateTodo({ status });
}
get assignedTo(): IPerson | undefined {
return this.todo.assignedTo;
}
set assignedTo(person: IPerson | undefined) {
this.debounceUpdateTodo({ assignedToId: person ? person.id : null });
}
get dueDate(): Date | undefined {
return this.todo.dueDate;
}
set dueDate(dueDate: Date | undefined) {
this.debounceUpdateTodo({ dueDate });
}
updateTodo(params: object) {
this.$apollo.mutate({
mutation: UPDATE_TODO,
variables: {
id: this.todo.id,
...params,
},
});
this.editMode = false;
}
}
</script>

View File

@@ -1,32 +1,31 @@
<template>
<h3>
<span>
<slot />
</span>
</h3>
<h2>
<span>
<slot />
</span>
</h2>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Subtitle extends Vue {
}
export default class Subtitle extends Vue {}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
@import "@/variables.scss";
h3 {
display: block;
margin: 15px 0 30px;
h2 {
display: block;
margin: 15px 0 30px;
span {
background: $secondary;
display: inline;
padding: 3px 8px;
color: #3A384C;
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial, serif;
font-weight: 400;
font-size: 32px;
}
}
</style>
span {
background: $secondary;
display: inline;
padding: 3px 8px;
color: #3a384c;
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial, serif;
font-weight: 400;
font-size: 32px;
}
}
</style>

View File

@@ -1,12 +1,12 @@
<template>
<div class="is-divider-vertical" :data-content="dataContent"></div>
<div class="is-divider-vertical" :data-content="dataContent"></div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Component, Prop, Vue } from "vue-property-decorator";
@Component
export default class VerticalDivider extends Vue {
@Prop({ default: 'Or' }) content;
@Prop({ default: "Or" }) content!: string;
get dataContent() {
return this.content.toLocaleUpperCase();
@@ -14,9 +14,9 @@ export default class VerticalDivider extends Vue {
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
@import "@/variables.scss";
.is-divider-vertical[data-content]::after {
background-color: $body-background-color;
}
</style>
.is-divider-vertical[data-content]::after {
background-color: $body-background-color;
}
</style>

View File

@@ -1,6 +1,6 @@
export const AUTH_ACCESS_TOKEN = 'auth-access-token';
export const AUTH_REFRESH_TOKEN = 'auth-refresh-token';
export const AUTH_USER_ID = 'auth-user-id';
export const AUTH_USER_EMAIL = 'auth-user-email';
export const AUTH_USER_ACTOR_ID = 'auth-user-actor-id';
export const AUTH_USER_ROLE = 'auth-user-role';
export const AUTH_ACCESS_TOKEN = "auth-access-token";
export const AUTH_REFRESH_TOKEN = "auth-refresh-token";
export const AUTH_USER_ID = "auth-user-id";
export const AUTH_USER_EMAIL = "auth-user-email";
export const AUTH_USER_ACTOR_ID = "auth-user-actor-id";
export const AUTH_USER_ROLE = "auth-user-role";

View File

@@ -3,22 +3,32 @@ function parseDateTime(value: string): Date {
}
function formatDateString(value: string): string {
return parseDateTime(value).toLocaleString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
return parseDateTime(value).toLocaleString(undefined, {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
});
}
function formatTimeString(value: string): string {
return parseDateTime(value).toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric' });
return parseDateTime(value).toLocaleTimeString(undefined, { 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' };
function formatDateTimeString(value: string, showTime = true): string {
const options = {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
minute: "numeric",
};
if (showTime) {
options.hour = 'numeric';
options.minute = 'numeric';
options.hour = "numeric";
options.minute = "numeric";
}
return parseDateTime(value).toLocaleTimeString(undefined, options);
}
export { formatDateString, formatTimeString, formatDateTimeString };

View File

@@ -1,11 +1,11 @@
import { formatDateString, formatTimeString, formatDateTimeString } from './datetime';
import { nl2br } from '@/filters/utils';
import nl2br from "@/filters/utils";
import { formatDateString, formatTimeString, formatDateTimeString } from "./datetime";
export default {
install(vue) {
vue.filter('formatDateString', formatDateString);
vue.filter('formatTimeString', formatTimeString);
vue.filter('formatDateTimeString', formatDateTimeString);
vue.filter('nl2br', nl2br);
install(vue: any) {
vue.filter("formatDateString", formatDateString);
vue.filter("formatTimeString", formatTimeString);
vue.filter("formatDateTimeString", formatDateTimeString);
vue.filter("nl2br", nl2br);
},
};

View File

@@ -4,6 +4,6 @@
* @param {string} str Input text
* @return {string} Filtered text
*/
export function nl2br(str: String): String {
return `${str}`.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1<br>');
export default function nl2br(str: string): string {
return `${str}`.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, "$1<br>");
}

View File

@@ -1,222 +1,328 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
import { CONVERSATION_BASIC_FIELDS_FRAGMENT } from "@/graphql/conversation";
import { RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT } from "@/graphql/resources";
export const FETCH_PERSON = gql`
query($username: String!) {
fetchPerson(preferredUsername: $username) {
id,
url,
name,
domain,
summary,
preferredUsername,
suspended,
avatar {
name,
query($username: String!) {
fetchPerson(preferredUsername: $username) {
id
url
},
banner {
url
},
feedTokens {
name
domain
summary
preferredUsername
suspended
avatar {
name
url
}
banner {
url
}
feedTokens {
token
},
organizedEvents {
uuid,
title,
}
organizedEvents {
uuid
title
beginsOn
},
}
}
}
}
`;
export const GET_PERSON = gql`
query($actorId: ID!) {
person(id: $actorId) {
id,
url,
name,
domain,
summary,
preferredUsername,
suspended,
avatar {
name,
url
},
banner {
url
},
feedTokens {
token
},
organizedEvents {
uuid,
title,
beginsOn
},
}
query($actorId: ID!) {
person(id: $actorId) {
id
url
name
domain
summary
preferredUsername
suspended
avatar {
name
url
}
banner {
url
}
feedTokens {
token
}
organizedEvents {
uuid
title
beginsOn
}
}
}
`;
export const LOGGED_PERSON = gql`
query {
loggedPerson {
id,
avatar {
url
},
preferredUsername,
query {
loggedPerson {
id
avatar {
url
}
preferredUsername
}
}
}`;
`;
export const UPDATE_DEFAULT_ACTOR = gql`
mutation ChangeDefaultActor($preferredUsername: String!) {
changeDefaultActor(preferredUsername: $preferredUsername) {
id
defaultActor {
id
}
}
}
`;
export const CURRENT_ACTOR_CLIENT = gql`
query currentActor {
currentActor @client {
id,
avatar {
url
},
preferredUsername,
name
}
query currentActor {
currentActor @client {
id
avatar {
url
}
preferredUsername
name
}
}
`;
export const UPDATE_CURRENT_ACTOR_CLIENT = gql`
mutation UpdateCurrentActor($id: String!, $avatar: String, $preferredUsername: String!, $name: String!) {
updateCurrentActor(id: $id, avatar: $avatar, preferredUsername: $preferredUsername, name: $name) @client
}
mutation UpdateCurrentActor(
$id: String!
$avatar: String
$preferredUsername: String!
$name: String!
) {
updateCurrentActor(
id: $id
avatar: $avatar
preferredUsername: $preferredUsername
name: $name
) @client
}
`;
export const LOGGED_USER_PARTICIPATIONS = gql`
query LoggedUserParticipations($afterDateTime: DateTime, $beforeDateTime: DateTime, $page: Int, $limit: Int) {
loggedUser {
participations(afterDatetime: $afterDateTime, beforeDatetime: $beforeDateTime, page: $page, limit: $limit) {
query LoggedUserParticipations(
$afterDateTime: DateTime
$beforeDateTime: DateTime
$page: Int
$limit: Int
) {
loggedUser {
participations(
afterDatetime: $afterDateTime
beforeDatetime: $beforeDateTime
page: $page
limit: $limit
) {
total
elements {
event {
id,
uuid,
title,
picture {
id,
url,
alt
},
beginsOn,
visibility,
organizerActor {
id,
preferredUsername,
name,
domain,
avatar {
url
}
},
participantStats {
notApproved
participant
},
options {
maximumAttendeeCapacity
remainingAttendeeCapacity
}
},
id,
role,
actor {
id,
preferredUsername,
name,
domain,
avatar {
url
}
}
}
}
}`;
export const LOGGED_USER_DRAFTS = gql`
query LoggedUserDrafts($page: Int, $limit: Int) {
loggedUser {
drafts(page: $page, limit: $limit) {
id,
uuid,
title,
picture {
id,
url,
alt
},
beginsOn,
visibility,
organizerActor {
id,
preferredUsername,
name,
domain,
avatar {
url
}
},
participantStats {
going,
notApproved
},
options {
maximumAttendeeCapacity
remainingAttendeeCapacity
}
id
uuid
title
picture {
id
url
alt
}
beginsOn
visibility
organizerActor {
id
preferredUsername
name
domain
avatar {
url
}
}
participantStats {
notApproved
participant
}
options {
maximumAttendeeCapacity
remainingAttendeeCapacity
}
}
id
role
actor {
id
preferredUsername
name
domain
avatar {
url
}
}
}
}`;
export const IDENTITIES = gql`
query {
identities {
id,
avatar {
url
},
preferredUsername,
name
}
}`;
export const CREATE_PERSON = gql`
mutation CreatePerson($preferredUsername: String!, $name: String!, $summary: String, $avatar: PictureInput) {
createPerson(
preferredUsername: $preferredUsername,
name: $name,
summary: $summary,
avatar: $avatar
) {
id,
preferredUsername,
name,
summary,
avatar {
url
}
}
}
`;
export const LOGGED_USER_DRAFTS = gql`
query LoggedUserDrafts($page: Int, $limit: Int) {
loggedUser {
drafts(page: $page, limit: $limit) {
id
uuid
title
picture {
id
url
alt
}
beginsOn
visibility
organizerActor {
id
preferredUsername
name
domain
avatar {
url
}
}
participantStats {
going
notApproved
}
options {
maximumAttendeeCapacity
remainingAttendeeCapacity
}
}
}
}
`;
export const LOGGED_USER_MEMBERSHIPS = gql`
query LoggedUserMemberships($page: Int, $limit: Int) {
loggedUser {
memberships(page: $page, limit: $limit) {
total
elements {
id
role
parent {
id
preferredUsername
domain
name
avatar {
url
}
organizedEvents {
elements {
id
title
picture {
url
}
}
total
}
}
invitedBy {
id
preferredUsername
domain
name
avatar {
url
}
}
}
}
}
}
`;
export const IDENTITIES = gql`
query {
identities {
id
avatar {
url
}
preferredUsername
name
}
}
`;
export const PERSON_MEMBERSHIPS = gql`
query PersonMemberships($id: ID!) {
person(id: $id) {
id
memberships {
total
elements {
id
role
parent {
id
preferredUsername
name
domain
avatar {
url
}
}
}
}
}
}
`;
export const CREATE_PERSON = gql`
mutation CreatePerson(
$preferredUsername: String!
$name: String!
$summary: String
$avatar: PictureInput
) {
createPerson(
preferredUsername: $preferredUsername
name: $name
summary: $summary
avatar: $avatar
) {
id
preferredUsername
name
summary
avatar {
url
}
}
}
}
`;
export const UPDATE_PERSON = gql`
mutation UpdatePerson($id: ID!, $name: String, $summary: String, $avatar: PictureInput) {
updatePerson(
id: $id,
name: $name,
summary: $summary,
avatar: $avatar
) {
id,
preferredUsername,
name,
summary,
updatePerson(id: $id, name: $name, summary: $summary, avatar: $avatar) {
id
preferredUsername
name
summary
avatar {
url
},
}
}
}
`;
@@ -224,91 +330,175 @@ export const UPDATE_PERSON = gql`
export const DELETE_PERSON = gql`
mutation DeletePerson($id: ID!) {
deletePerson(id: $id) {
preferredUsername,
preferredUsername
}
}
`;
/**
* This one is used only to register the first account. Prefer CREATE_PERSON when creating another identity
* This one is used only to register the first account.
* Prefer CREATE_PERSON when creating another identity
*/
export const REGISTER_PERSON = gql`
mutation ($preferredUsername: String!, $name: String!, $summary: String!, $email: String!) {
registerPerson(
preferredUsername: $preferredUsername,
name: $name,
summary: $summary,
mutation($preferredUsername: String!, $name: String!, $summary: String!, $email: String!) {
registerPerson(
preferredUsername: $preferredUsername
name: $name
summary: $summary
email: $email
) {
id,
preferredUsername,
name,
summary,
avatar {
url
},
id
preferredUsername
name
summary
avatar {
url
}
}
}
`;
export const LIST_GROUPS = gql`
query {
groups {
elements {
id
url
name
domain
summary
preferredUsername
suspended
avatar {
url
}
banner {
url
}
organizedEvents {
elements {
uuid
title
beginsOn
}
total
}
}
total
}
}
}
`;
export const FETCH_GROUP = gql`
query($name:String!) {
group(preferredUsername: $name) {
id,
url,
name,
domain,
summary,
preferredUsername,
suspended,
avatar {
query($name: String!) {
group(preferredUsername: $name) {
id
url
},
banner {
url
}
organizedEvents {
uuid,
title,
beginsOn
},
members {
role,
actor {
id,
name,
domain,
preferredUsername
name
domain
summary
preferredUsername
suspended
avatar {
url
}
banner {
url
}
organizedEvents {
elements {
id
uuid
title
beginsOn
}
total
}
conversations {
total
elements {
...ConversationBasicFields
}
}
members {
elements {
role
actor {
id
name
domain
preferredUsername
avatar {
url
}
}
}
total
}
resources(page: 1, limit: 3) {
elements {
id
title
resourceUrl
summary
updatedAt
type
path
metadata {
...ResourceMetadataBasicFields
}
}
total
}
todoLists {
elements {
id
title
todos {
elements {
id
title
status
dueDate
assignedTo {
id
preferredUsername
}
}
total
}
}
total
}
}
}
}
${CONVERSATION_BASIC_FIELDS_FRAGMENT}
${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;
export const CREATE_GROUP = gql`
mutation CreateGroup(
$creatorActorId: ID!,
$preferredUsername: String!,
$name: String!,
$summary: String,
$avatar: PictureInput,
$creatorActorId: ID!
$preferredUsername: String!
$name: String!
$summary: String
$avatar: PictureInput
$banner: PictureInput
) {
createGroup(
creatorActorId: $creatorActorId,
preferredUsername: $preferredUsername,
name: $name,
summary: $summary,
banner: $banner,
creatorActorId: $creatorActorId
preferredUsername: $preferredUsername
name: $name
summary: $summary
banner: $banner
avatar: $avatar
) {
id,
preferredUsername,
name,
summary,
id
preferredUsername
name
summary
avatar {
url
},
}
banner {
url
}

View File

@@ -1,4 +1,4 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
const $addressFragment = `
id,

View File

@@ -1,147 +1,148 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const DASHBOARD = gql`
query {
dashboard {
lastPublicEventPublished {
uuid,
title,
picture {
id,
alt,
url
},
},
numberOfUsers,
numberOfEvents,
numberOfComments,
numberOfReports
query {
dashboard {
lastPublicEventPublished {
uuid
title
picture {
id
alt
url
}
}
numberOfUsers
numberOfEvents
numberOfComments
numberOfReports
}
`;
}
`;
export const RELAY_FRAGMENT = gql`
fragment relayFragment on Follower {
actor {
id,
preferredUsername,
name,
domain,
type,
summary
},
targetActor {
id,
preferredUsername,
name,
domain,
type,
summary
},
approved,
insertedAt,
updatedAt
fragment relayFragment on Follower {
actor {
id
preferredUsername
name
domain
type
summary
}
targetActor {
id
preferredUsername
name
domain
type
summary
}
approved
insertedAt
updatedAt
}
`;
export const RELAY_FOLLOWERS = gql`
query relayFollowers($page: Int, $limit: Int) {
relayFollowers(page: $page, limit: $limit) {
elements {
...relayFragment
},
total
}
query relayFollowers($page: Int, $limit: Int) {
relayFollowers(page: $page, limit: $limit) {
elements {
...relayFragment
}
total
}
${RELAY_FRAGMENT}
}
${RELAY_FRAGMENT}
`;
export const RELAY_FOLLOWINGS = gql`
query relayFollowings($page: Int, $limit: Int) {
relayFollowings(page: $page, limit: $limit) {
elements {
...relayFragment
},
total
}
query relayFollowings($page: Int, $limit: Int) {
relayFollowings(page: $page, limit: $limit) {
elements {
...relayFragment
}
total
}
${RELAY_FRAGMENT}
}
${RELAY_FRAGMENT}
`;
export const ADD_RELAY = gql`
mutation addRelay($address: String!) {
addRelay(address: $address) {
...relayFragment
}
mutation addRelay($address: String!) {
addRelay(address: $address) {
...relayFragment
}
${RELAY_FRAGMENT}
}
${RELAY_FRAGMENT}
`;
export const REMOVE_RELAY = gql`
mutation removeRelay($address: String!) {
removeRelay(address: $address) {
...relayFragment
}
mutation removeRelay($address: String!) {
removeRelay(address: $address) {
...relayFragment
}
${RELAY_FRAGMENT}
}
${RELAY_FRAGMENT}
`;
export const ACCEPT_RELAY = gql`
mutation acceptRelay($address: String!) {
acceptRelay(address: $address) {
...relayFragment
}
mutation acceptRelay($address: String!) {
acceptRelay(address: $address) {
...relayFragment
}
${RELAY_FRAGMENT}
}
${RELAY_FRAGMENT}
`;
export const REJECT_RELAY = gql`
mutation rejectRelay($address: String!) {
rejectRelay(address: $address) {
...relayFragment
}
mutation rejectRelay($address: String!) {
rejectRelay(address: $address) {
...relayFragment
}
${RELAY_FRAGMENT}
}
${RELAY_FRAGMENT}
`;
export const ADMIN_SETTINGS_FRAGMENT = gql`
fragment adminSettingsFragment on AdminSettings {
instanceName,
instanceDescription,
instanceTerms,
instanceTermsType,
instanceTermsUrl
registrationsOpen
}
fragment adminSettingsFragment on AdminSettings {
instanceName
instanceDescription
instanceTerms
instanceTermsType
instanceTermsUrl
registrationsOpen
}
`;
export const ADMIN_SETTINGS = gql`
query {
adminSettings {
...adminSettingsFragment
}
query {
adminSettings {
...adminSettingsFragment
}
${ADMIN_SETTINGS_FRAGMENT}
}
${ADMIN_SETTINGS_FRAGMENT}
`;
export const SAVE_ADMIN_SETTINGS = gql`
mutation SaveAdminSettings(
$instanceName: String,
$instanceDescription: String,
$instanceTerms: String,
$instanceTermsType: InstanceTermsType,
$instanceTermsUrl: String,
$registrationsOpen: Boolean) {
saveAdminSettings(
instanceName: $instanceName,
instanceDescription: $instanceDescription,
instanceTerms: $instanceTerms,
instanceTermsType: $instanceTermsType,
instanceTermsUrl: $instanceTermsUrl,
registrationsOpen: $registrationsOpen
) {
...adminSettingsFragment
}
mutation SaveAdminSettings(
$instanceName: String
$instanceDescription: String
$instanceTerms: String
$instanceTermsType: InstanceTermsType
$instanceTermsUrl: String
$registrationsOpen: Boolean
) {
saveAdminSettings(
instanceName: $instanceName
instanceDescription: $instanceDescription
instanceTerms: $instanceTerms
instanceTermsType: $instanceTermsType
instanceTermsUrl: $instanceTermsUrl
registrationsOpen: $registrationsOpen
) {
...adminSettingsFragment
}
${ADMIN_SETTINGS_FRAGMENT}
}
${ADMIN_SETTINGS_FRAGMENT}
`;

View File

@@ -1,48 +1,48 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const LOGIN = gql`
mutation Login($email: String!, $password: String!) {
login(email: $email, password: $password) {
accessToken,
refreshToken,
user {
id,
email,
role
mutation Login($email: String!, $password: String!) {
login(email: $email, password: $password) {
accessToken
refreshToken
user {
id
email
role
}
}
},
}
}
`;
export const SEND_RESET_PASSWORD = gql`
mutation SendResetPassword($email: String!) {
sendResetPassword(email: $email)
}
mutation SendResetPassword($email: String!) {
sendResetPassword(email: $email)
}
`;
export const RESET_PASSWORD = gql`
mutation ResetPassword($token: String!, $password: String!) {
resetPassword(token: $token, password: $password) {
accessToken,
refreshToken
user {
id,
mutation ResetPassword($token: String!, $password: String!) {
resetPassword(token: $token, password: $password) {
accessToken
refreshToken
user {
id
}
}
},
}
}
`;
export const RESEND_CONFIRMATION_EMAIL = gql`
mutation ResendConfirmationEmail($email: String!) {
resendConfirmationEmail(email: $email)
}
mutation ResendConfirmationEmail($email: String!) {
resendConfirmationEmail(email: $email)
}
`;
export const REFRESH_TOKEN = gql`
mutation RefreshToken($refreshToken: String!) {
refreshToken(refreshToken: $refreshToken) {
accessToken,
refreshToken,
accessToken
refreshToken
}
}
`;

View File

@@ -1,85 +1,101 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const COMMENT_FIELDS_FRAGMENT_NAME = 'CommentFields';
export const COMMENT_FIELDS_FRAGMENT_NAME = "CommentFields";
export const COMMENT_FIELDS_FRAGMENT = gql`
fragment CommentFields on Comment {
id,
uuid,
url,
text,
visibility,
local,
actor {
avatar {
url
},
id,
domain,
preferredUsername,
name
},
totalReplies,
updatedAt,
deletedAt
},
fragment CommentFields on Comment {
id
uuid
url
text
visibility
local
actor {
avatar {
url
}
id
domain
preferredUsername
name
}
totalReplies
updatedAt
deletedAt
}
`;
export const COMMENT_RECURSIVE_FRAGMENT = gql`
fragment CommentRecursive on Comment {
fragment CommentRecursive on Comment {
...CommentFields
inReplyToComment {
...CommentFields
}
originComment {
...CommentFields
}
replies {
...CommentFields
replies {
...CommentFields
inReplyToComment {
...CommentFields
},
originComment {
...CommentFields
},
replies {
...CommentFields
replies {
...CommentFields
}
},
},
${COMMENT_FIELDS_FRAGMENT}
}
}
}
${COMMENT_FIELDS_FRAGMENT}
`;
export const FETCH_THREAD_REPLIES = gql`
query($threadId: ID!) {
thread(id: $threadId) {
...CommentRecursive
}
query($threadId: ID!) {
thread(id: $threadId) {
...CommentRecursive
}
${COMMENT_RECURSIVE_FRAGMENT}
}
${COMMENT_RECURSIVE_FRAGMENT}
`;
export const COMMENTS_THREADS = gql`
query($eventUUID: UUID!) {
event(uuid: $eventUUID) {
id,
uuid,
comments {
...CommentFields,
}
}
query($eventUUID: UUID!) {
event(uuid: $eventUUID) {
id
uuid
comments {
...CommentFields
}
}
${COMMENT_RECURSIVE_FRAGMENT}
}
${COMMENT_RECURSIVE_FRAGMENT}
`;
export const CREATE_COMMENT_FROM_EVENT = gql`
mutation CreateCommentFromEvent($eventId: ID!, $actorId: ID!, $text: String!, $inReplyToCommentId: ID) {
createComment(eventId: $eventId, actorId: $actorId, text: $text, inReplyToCommentId: $inReplyToCommentId) {
...CommentRecursive
}
mutation CreateCommentFromEvent(
$eventId: ID!
$actorId: ID!
$text: String!
$inReplyToCommentId: ID
) {
createComment(
eventId: $eventId
actorId: $actorId
text: $text
inReplyToCommentId: $inReplyToCommentId
) {
...CommentRecursive
}
${COMMENT_RECURSIVE_FRAGMENT}
}
${COMMENT_RECURSIVE_FRAGMENT}
`;
export const DELETE_COMMENT = gql`
mutation DeleteComment($commentId: ID!, $actorId: ID!) {
deleteComment(commentId: $commentId, actorId: $actorId) {
id
}
mutation DeleteComment($commentId: ID!, $actorId: ID!) {
deleteComment(commentId: $commentId, actorId: $actorId) {
id
}
}
`;
export const UPDATE_COMMENT = gql`
mutation UpdateComment($commentId: ID!, $text: String!) {
updateComment(commentId: $commentId, text: $text) {
...CommentFields
}
}
`;

View File

@@ -1,68 +1,81 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const CONFIG = gql`
query {
config {
name,
description,
registrationsOpen,
registrationsWhitelist,
demoMode,
countryCode,
anonymous {
participation {
allowed,
validation {
email {
enabled,
confirmationRequired
},
captcha {
enabled
query {
config {
name
description
registrationsOpen
registrationsWhitelist
demoMode
countryCode
anonymous {
participation {
allowed
validation {
email {
enabled
confirmationRequired
}
captcha {
enabled
}
}
}
}
eventCreation {
allowed,
validation {
email {
enabled,
confirmationRequired
},
captcha {
enabled
eventCreation {
allowed
validation {
email {
enabled
confirmationRequired
}
captcha {
enabled
}
}
}
actorId
}
actorId
},
location {
latitude,
longitude,
accuracyRadius
},
maps {
tiles {
endpoint,
attribution
location {
latitude
longitude
accuracyRadius
}
maps {
tiles {
endpoint
attribution
}
}
geocoding {
provider
autocomplete
}
resourceProviders {
type
endpoint
software
}
},
geocoding {
provider,
autocomplete
}
}
}
`;
export const TERMS = gql`
query Terms($locale: String) {
config {
terms(locale: $locale) {
type,
url,
bodyHtml
query Terms($locale: String) {
config {
terms(locale: $locale) {
type
url
bodyHtml
}
}
}
`;
export const TIMEZONES = gql`
query {
config {
timezones
}
}
}
`;

View File

@@ -0,0 +1,120 @@
import gql from "graphql-tag";
export const CONVERSATION_BASIC_FIELDS_FRAGMENT = gql`
fragment ConversationBasicFields on Conversation {
id
title
slug
lastComment {
id
text
actor {
preferredUsername
avatar {
url
}
}
}
}
`;
export const CONVERSATION_FIELDS_FOR_REPLY_FRAGMENT = gql`
fragment ConversationFieldsReply on Conversation {
id
title
slug
lastComment {
id
text
updatedAt
actor {
id
preferredUsername
avatar {
url
}
}
}
actor {
id
preferredUsername
}
creator {
id
preferredUsername
}
}
`;
export const CONVERSATION_FIELDS_FRAGMENT = gql`
fragment ConversationFields on Conversation {
id
title
slug
lastComment {
id
text
updatedAt
}
actor {
id
preferredUsername
}
creator {
id
preferredUsername
}
}
`;
export const CREATE_CONVERSATION = gql`
mutation createConversation($title: String!, $creatorId: ID!, $actorId: ID!, $text: String!) {
createConversation(title: $title, text: $text, creatorId: $creatorId, actorId: $actorId) {
...ConversationFields
}
}
${CONVERSATION_FIELDS_FRAGMENT}
`;
export const REPLY_TO_CONVERSATION = gql`
mutation replyToConversation($conversationId: ID!, $text: String!) {
replyToConversation(conversationId: $conversationId, text: $text) {
...ConversationFieldsReply
}
}
${CONVERSATION_FIELDS_FOR_REPLY_FRAGMENT}
`;
export const GET_CONVERSATION = gql`
query getConversation($id: ID!, $page: Int, $limit: Int) {
conversation(id: $id) {
comments(page: $page, limit: $limit) {
total
elements {
id
text
actor {
id
avatar {
url
}
preferredUsername
}
insertedAt
updatedAt
}
}
...ConversationFields
}
}
${CONVERSATION_FIELDS_FRAGMENT}
`;
export const UPDATE_CONVERSATION = gql`
mutation updateConversation($conversationId: ID!, $title: String!) {
updateConversation(conversationId: $conversationId, title: $title) {
...ConversationFields
}
}
${CONVERSATION_FIELDS_FRAGMENT}
`;

View File

@@ -1,29 +1,33 @@
import gql from 'graphql-tag';
import { COMMENT_FIELDS_FRAGMENT } from '@/graphql/comment';
import gql from "graphql-tag";
import { COMMENT_FIELDS_FRAGMENT } from "@/graphql/comment";
const participantQuery = `
role,
id,
actor {
preferredUsername,
avatar {
url
},
name,
id,
domain
},
event {
id,
uuid
},
metadata {
cancellationToken,
message
},
insertedAt
`;
const participantsQuery = `
total,
elements {
role,
id,
actor {
preferredUsername,
avatar {
url
},
name,
id,
domain
},
event {
id,
uuid
},
metadata {
cancellationToken,
message
},
insertedAt
${participantQuery}
}
`;
@@ -66,7 +70,8 @@ const optionsQuery = `
attendees,
program,
commentModeration,
showParticipationPrice
showParticipationPrice,
hideOrganizerWhenGroupEvent,
__typename
`;
@@ -106,14 +111,19 @@ export const FETCH_EVENT = gql`
name,
url,
id,
summary
},
attributedTo {
avatar {
url,
}
preferredUsername,
name,
summary,
domain,
url,
id
},
# attributedTo {
# avatar {
# url,
# }
# preferredUsername,
# name,
# },
participantStats {
going,
notApproved,
@@ -147,7 +157,6 @@ export const FETCH_EVENT = gql`
}
}
}
${COMMENT_FIELDS_FRAGMENT}
`;
export const FETCH_EVENTS = gql`
@@ -193,7 +202,7 @@ export const FETCH_EVENTS = gql`
# },
category,
participants {
${participantQuery}
${participantsQuery}
},
tags {
slug,
@@ -206,6 +215,7 @@ export const FETCH_EVENTS = gql`
export const CREATE_EVENT = gql`
mutation createEvent(
$organizerActorId: ID!,
$attributedToId: ID,
$title: String!,
$description: String!,
$beginsOn: DateTime!,
@@ -224,6 +234,7 @@ export const CREATE_EVENT = gql`
) {
createEvent(
organizerActorId: $organizerActorId,
attributedToId: $attributedToId,
title: $title,
description: $description,
beginsOn: $beginsOn,
@@ -263,6 +274,16 @@ export const CREATE_EVENT = gql`
physicalAddress {
${physicalAddressQuery}
},
attributedTo {
id,
domain,
name,
url,
preferredUsername,
avatar {
url
}
},
organizerActor {
avatar {
url
@@ -304,6 +325,7 @@ export const EDIT_EVENT = gql`
$onlineAddress: String,
$phoneAddress: String,
$organizerActorId: ID,
$attributedToId: ID,
$category: String,
$physicalAddress: AddressInput,
$options: EventOptionsInput,
@@ -323,6 +345,7 @@ export const EDIT_EVENT = gql`
onlineAddress: $onlineAddress,
phoneAddress: $phoneAddress,
organizerActorId: $organizerActorId,
attributedToId: $attributedToId,
category: $category,
physicalAddress: $physicalAddress
options: $options,
@@ -350,6 +373,16 @@ export const EDIT_EVENT = gql`
physicalAddress {
${physicalAddressQuery}
},
attributedTo {
id,
domain,
name,
url,
preferredUsername,
avatar {
url
}
},
organizerActor {
avatar {
url
@@ -390,11 +423,7 @@ export const JOIN_EVENT = gql`
export const LEAVE_EVENT = gql`
mutation LeaveEvent($eventId: ID!, $actorId: ID!, $token: String) {
leaveEvent(
eventId: $eventId,
actorId: $actorId,
token: $token
) {
leaveEvent(eventId: $eventId, actorId: $actorId, token: $token) {
actor {
id
}
@@ -406,11 +435,11 @@ export const CONFIRM_PARTICIPATION = gql`
mutation ConfirmParticipation($token: String!) {
confirmParticipation(confirmationToken: $token) {
actor {
id,
},
id
}
event {
uuid
},
}
role
}
}
@@ -419,7 +448,7 @@ export const CONFIRM_PARTICIPATION = gql`
export const UPDATE_PARTICIPANT = gql`
mutation AcceptParticipant($id: ID!, $moderatorActorId: ID!, $role: ParticipantRoleEnum!) {
updateParticipation(id: $id, moderatorActorId: $moderatorActorId, role: $role) {
role,
role
id
}
}
@@ -427,11 +456,8 @@ export const UPDATE_PARTICIPANT = gql`
export const DELETE_EVENT = gql`
mutation DeleteEvent($eventId: ID!, $actorId: ID!) {
deleteEvent(
eventId: $eventId,
actorId: $actorId
) {
id
deleteEvent(eventId: $eventId, actorId: $actorId) {
id
}
}
`;
@@ -441,7 +467,7 @@ export const PARTICIPANTS = gql`
event(uuid: $uuid) {
id,
participants(page: $page, limit: $limit, roles: $roles, actorId: $actorId) {
${participantQuery}
${participantsQuery}
},
participantStats {
going,
@@ -456,13 +482,13 @@ export const PARTICIPANTS = gql`
export const EVENT_PERSON_PARTICIPATION = gql`
query($actorId: ID!, $eventId: ID!) {
person(id: $actorId) {
id,
id
participations(eventId: $eventId) {
id,
role,
id
role
actor {
id
},
}
event {
id
}
@@ -472,15 +498,15 @@ export const EVENT_PERSON_PARTICIPATION = gql`
`;
export const EVENT_PERSON_PARTICIPATION_SUBSCRIPTION_CHANGED = gql`
subscription ($actorId: ID!, $eventId: ID!) {
subscription($actorId: ID!, $eventId: ID!) {
eventPersonParticipationChanged(personId: $actorId) {
id,
id
participations(eventId: $eventId) {
id,
role,
id
role
actor {
id
},
}
event {
id
}

View File

@@ -1,51 +1,54 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const LOGGED_PERSON = gql`
query {
loggedPerson {
id,
avatar {
url
},
preferredUsername,
query {
loggedPerson {
id
avatar {
url
}
preferredUsername
}
}
}`;
`;
export const CREATE_FEED_TOKEN_ACTOR = gql`
mutation createFeedToken($actor_id: ID!) {
createFeedToken(actorId: $actor_id) {
token,
actor {
id
},
user {
id
}
}
}`;
export const CREATE_FEED_TOKEN = gql`
mutation {
createFeedToken {
token,
actor {
id
},
user {
id
}
}
}`;
export const DELETE_FEED_TOKEN = gql`
mutation deleteFeedToken($token: String!) {
deleteFeedToken(token: $token) {
actor {
id
},
user {
id
}
mutation createFeedToken($actor_id: ID!) {
createFeedToken(actorId: $actor_id) {
token
actor {
id
}
user {
id
}
}
}
`;
export const CREATE_FEED_TOKEN = gql`
mutation {
createFeedToken {
token
actor {
id
}
user {
id
}
}
}
`;
export const DELETE_FEED_TOKEN = gql`
mutation deleteFeedToken($token: String!) {
deleteFeedToken(token: $token) {
actor {
id
}
user {
id
}
}
}
`;

View File

@@ -1 +1,11 @@
{"__schema":{"types":[{"possibleTypes":[{"name":"Event"},{"name":"Actor"}],"name":"SearchResult","kind":"UNION"}]}}
{
"__schema": {
"types": [
{
"possibleTypes": [{ "name": "Event" }, { "name": "Actor" }],
"name": "SearchResult",
"kind": "UNION"
}
]
}
}

24
js/src/graphql/member.ts Normal file
View File

@@ -0,0 +1,24 @@
import gql from "graphql-tag";
export const INVITE_MEMBER = gql`
mutation InviteMember($groupId: ID!, $targetActorUsername: String!) {
inviteMember(groupId: $groupId, targetActorUsername: $targetActorUsername) {
id
role
parent {
id
}
actor {
id
}
}
}
`;
export const ACCEPT_INVITATION = gql`
mutation AcceptInvitation($id: ID!) {
acceptInvitation(id: $id) {
id
}
}
`;

View File

@@ -1,186 +1,185 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const REPORTS = gql`
query Reports($status: ReportStatus) {
reports(status: $status) {
id,
reported {
id,
preferredUsername,
domain,
name,
avatar {
url
}
},
reporter {
id,
preferredUsername,
name,
avatar {
url
},
domain,
type
},
event {
id,
uuid,
title,
picture {
id,
url
}
},
status,
content
query Reports($status: ReportStatus) {
reports(status: $status) {
id
reported {
id
preferredUsername
domain
name
avatar {
url
}
}
reporter {
id
preferredUsername
name
avatar {
url
}
domain
type
}
event {
id
uuid
title
picture {
id
url
}
}
status
content
}
}
`;
const REPORT_FRAGMENT = gql`
fragment ReportFragment on Report {
id,
reported {
id,
preferredUsername,
name,
avatar {
url
},
domain
},
reporter {
id,
preferredUsername,
name,
avatar {
url
},
domain,
type
},
event {
id,
uuid,
title,
description,
picture {
id,
url
}
},
comments {
id,
text,
actor {
id,
preferredUsername,
domain,
name,
avatar {
url
}
}
}
notes {
id,
content
moderator {
id,
preferredUsername,
name,
avatar {
url
}
},
insertedAt
},
insertedAt,
updatedAt,
status,
content
fragment ReportFragment on Report {
id
reported {
id
preferredUsername
name
avatar {
url
}
domain
}
reporter {
id
preferredUsername
name
avatar {
url
}
domain
type
}
event {
id
uuid
title
description
picture {
id
url
}
}
comments {
id
text
actor {
id
preferredUsername
domain
name
avatar {
url
}
}
}
notes {
id
content
moderator {
id
preferredUsername
name
avatar {
url
}
}
insertedAt
}
insertedAt
updatedAt
status
content
}
`;
export const REPORT = gql`
query Report($id: ID!) {
report(id: $id) {
...ReportFragment
}
query Report($id: ID!) {
report(id: $id) {
...ReportFragment
}
${REPORT_FRAGMENT}
}
${REPORT_FRAGMENT}
`;
export const CREATE_REPORT = gql`
mutation CreateReport(
$eventId: ID!,
$reporterId: ID!,
$reportedId: ID!,
$content: String,
$commentsIds: [ID],
$forward: Boolean
mutation CreateReport(
$eventId: ID!
$reporterId: ID!
$reportedId: ID!
$content: String
$commentsIds: [ID]
$forward: Boolean
) {
createReport(
eventId: $eventId
reporterId: $reporterId
reportedId: $reportedId
content: $content
commentsIds: $commentsIds
forward: $forward
) {
createReport(eventId: $eventId, reporterId: $reporterId, reportedId: $reportedId, content: $content, commentsIds: $commentsIds, forward: $forward) {
id
}
id
}
`;
}
`;
export const UPDATE_REPORT = gql`
mutation UpdateReport(
$reportId: ID!,
$moderatorId: ID!,
$status: ReportStatus!
) {
updateReportStatus(reportId: $reportId, moderatorId: $moderatorId, status: $status) {
...ReportFragment
}
mutation UpdateReport($reportId: ID!, $moderatorId: ID!, $status: ReportStatus!) {
updateReportStatus(reportId: $reportId, moderatorId: $moderatorId, status: $status) {
...ReportFragment
}
${REPORT_FRAGMENT}
}
${REPORT_FRAGMENT}
`;
export const CREATE_REPORT_NOTE = gql`
mutation CreateReportNote(
$reportId: ID!,
$moderatorId: ID!,
$content: String!
) {
createReportNote(reportId: $reportId, moderatorId: $moderatorId, content: $content) {
id,
content,
insertedAt
}
mutation CreateReportNote($reportId: ID!, $moderatorId: ID!, $content: String!) {
createReportNote(reportId: $reportId, moderatorId: $moderatorId, content: $content) {
id
content
insertedAt
}
`;
}
`;
export const LOGS = gql`
query {
actionLogs {
id,
action,
actor {
id,
preferredUsername
avatar {
url
}
},
object {
...on Report {
id
},
... on ReportNote {
report {
id,
}
}
... on Event {
id,
title
}
},
insertedAt
query {
actionLogs {
id
action
actor {
id
preferredUsername
avatar {
url
}
}
object {
... on Report {
id
}
... on ReportNote {
report {
id
}
}
... on Event {
id
title
}
}
insertedAt
}
`;
}
`;

142
js/src/graphql/resources.ts Normal file
View File

@@ -0,0 +1,142 @@
import gql from "graphql-tag";
export const RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT = gql`
fragment ResourceMetadataBasicFields on ResourceMetadata {
imageRemoteUrl
height
width
type
faviconUrl
}
`;
export const GET_RESOURCE = gql`
query GetResource($path: String!, $username: String!) {
resource(path: $path, username: $username) {
id
title
summary
url
path
metadata {
...ResourceMetadataBasicFields
authorName
authorUrl
providerName
providerUrl
html
}
parent {
id
}
actor {
id
preferredUsername
domain
}
children {
total
elements {
id
title
summary
url
type
path
resourceUrl
metadata {
...ResourceMetadataBasicFields
}
}
}
}
}
${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;
export const CREATE_RESOURCE = gql`
mutation CreateResource(
$title: String!
$parentId: ID
$summary: String
$actorId: ID!
$resourceUrl: String
$type: String
) {
createResource(
title: $title
parentId: $parentId
summary: $summary
actorId: $actorId
resourceUrl: $resourceUrl
type: $type
) {
id
title
summary
url
resourceUrl
updatedAt
path
type
metadata {
...ResourceMetadataBasicFields
authorName
authorUrl
providerName
providerUrl
html
}
}
}
${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;
export const UPDATE_RESOURCE = gql`
mutation UpdateResource(
$id: ID!
$title: String
$summary: String
$parentId: ID
$resourceUrl: String
) {
updateResource(
id: $id
title: $title
parentId: $parentId
summary: $summary
resourceUrl: $resourceUrl
) {
id
title
summary
url
path
resourceUrl
}
}
`;
export const DELETE_RESOURCE = gql`
mutation DeleteResource($id: ID!) {
deleteResource(id: $id) {
id
}
}
`;
export const PREVIEW_RESOURCE_LINK = gql`
mutation PreviewResourceLink($resourceUrl: String!) {
previewResourceLink(resourceUrl: $resourceUrl) {
title
description
...ResourceMetadataBasicFields
authorName
authorUrl
providerName
providerUrl
html
}
}
${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;

View File

@@ -1,55 +1,55 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const SEARCH_EVENTS = gql`
query SearchEvents($searchText: String!) {
searchEvents(search: $searchText) {
total,
elements {
title,
uuid,
beginsOn,
picture {
url,
},
tags {
slug,
title
},
__typename
}
}
}
`;
export const SEARCH_GROUPS = gql`
query SearchGroups($searchText: String!) {
searchGroups(search: $searchText) {
total,
elements {
avatar {
url
},
domain,
preferredUsername,
name,
__typename
}
}
}
`;
export const SEARCH_PERSONS = gql`
query SearchPersons($searchText: String!) {
searchPersons(search: $searchText) {
total,
query SearchEvents($searchText: String!) {
searchEvents(search: $searchText) {
total
elements {
id,
avatar {
title
uuid
beginsOn
picture {
url
},
domain,
preferredUsername,
name,
}
tags {
slug
title
}
__typename
}
}
}
`;
export const SEARCH_GROUPS = gql`
query SearchGroups($searchText: String!) {
searchGroups(search: $searchText) {
total
elements {
avatar {
url
}
domain
preferredUsername
name
__typename
}
}
}
`;
export const SEARCH_PERSONS = gql`
query SearchPersons($searchText: String!, $page: Int, $limit: Int) {
searchPersons(search: $searchText, page: $page, limit: $limit) {
total
elements {
id
avatar {
url
}
domain
preferredUsername
name
__typename
}
}

View File

@@ -1,16 +1,17 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
/* eslint-disable import/prefer-default-export */
export const TAGS = gql`
query {
tags {
id,
related {
id,
slug,
query {
tags {
id
related {
id
slug
title
}
slug
title
}
slug,
title
}
}
`;

130
js/src/graphql/todos.ts Normal file
View File

@@ -0,0 +1,130 @@
import gql from "graphql-tag";
export const GET_TODO = gql`
query GetTodo($id: ID!) {
todo(id: $id) {
id
title
status
dueDate
todoList {
actor {
id
preferredUsername
}
title
id
}
assignedTo {
id
preferredUsername
domain
name
avatar {
url
}
}
}
}
`;
export const FETCH_TODO_LIST = gql`
query FetchTodoList($id: ID!) {
todoList(id: $id) {
id
title
todos {
total
elements {
id
title
status
assignedTo {
id
preferredUsername
domain
}
dueDate
}
}
actor {
id
preferredUsername
domain
}
}
}
`;
export const CREATE_TODO_LIST = gql`
mutation CreateTodoList($title: String!, $groupId: ID!) {
createTodoList(title: $title, groupId: $groupId) {
id
title
todos {
total
elements {
id
}
}
}
}
`;
export const CREATE_TODO = gql`
mutation createTodo(
$title: String!
$todoListId: ID!
$status: Boolean
$assignedToId: ID
$dueDate: DateTime
) {
createTodo(
title: $title
todoListId: $todoListId
status: $status
assignedToId: $assignedToId
dueDate: $dueDate
) {
id
title
status
assignedTo {
id
}
creator {
id
}
dueDate
}
}
`;
export const UPDATE_TODO = gql`
mutation updateTodo(
$id: ID!
$title: String
$status: Boolean
$assignedToId: ID
$dueDate: DateTime
) {
updateTodo(
id: $id
title: $title
status: $status
assignedToId: $assignedToId
dueDate: $dueDate
) {
id
title
status
assignedTo {
id
}
creator {
id
}
dueDate
}
}
`;

View File

@@ -1,10 +1,11 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
/* eslint-disable import/prefer-default-export */
export const UPLOAD_PICTURE = gql`
mutation UploadPicture($file: Upload!, $alt: String, $name: String!, $actorId: ID!){
uploadPicture(file: $file, alt: $alt, name: $name, actorId: $actorId) {
url,
id
}
mutation UploadPicture($file: Upload!, $alt: String, $name: String!, $actorId: ID!) {
uploadPicture(file: $file, alt: $alt, name: $name, actorId: $actorId) {
url
id
}
}
`;

View File

@@ -1,39 +1,39 @@
import gql from 'graphql-tag';
import gql from "graphql-tag";
export const CREATE_USER = gql`
mutation CreateUser($email: String!, $password: String!, $locale: String) {
createUser(email: $email, password: $password, locale: $locale) {
email,
confirmationSentAt
mutation CreateUser($email: String!, $password: String!, $locale: String) {
createUser(email: $email, password: $password, locale: $locale) {
email
confirmationSentAt
}
}
}
`;
export const VALIDATE_USER = gql`
mutation ValidateUser($token: String!) {
validateUser(token: $token) {
accessToken,
refreshToken,
user {
id,
email,
defaultActor {
id,
preferredUsername,
name,
avatar {
mutation ValidateUser($token: String!) {
validateUser(token: $token) {
accessToken
refreshToken
user {
id
email
defaultActor {
id
preferredUsername
name
avatar {
url
}
}
}
}
}
}
`;
export const LOGGED_USER = gql`
query {
loggedUser {
id,
id
email
}
}
@@ -57,9 +57,7 @@ export const CHANGE_EMAIL = gql`
export const VALIDATE_EMAIL = gql`
mutation ValidateEmail($token: String!) {
validateEmail(
token: $token
) {
validateEmail(token: $token) {
id
}
}
@@ -67,25 +65,69 @@ export const VALIDATE_EMAIL = gql`
export const DELETE_ACCOUNT = gql`
mutation DeleteAccount($password: String!) {
deleteAccount (password: $password) {
deleteAccount(password: $password) {
id
}
}
`;
export const CURRENT_USER_CLIENT = gql`
query {
currentUser @client {
id,
email,
isLoggedIn,
role
query {
currentUser @client {
id
email
isLoggedIn
role
}
}
}
`;
export const UPDATE_CURRENT_USER_CLIENT = gql`
mutation UpdateCurrentUser($id: String!, $email: String!, $isLoggedIn: Boolean!, $role: UserRole!) {
updateCurrentUser(id: $id, email: $email, isLoggedIn: $isLoggedIn, role: $role) @client
}
mutation UpdateCurrentUser(
$id: String!
$email: String!
$isLoggedIn: Boolean!
$role: UserRole!
) {
updateCurrentUser(id: $id, email: $email, isLoggedIn: $isLoggedIn, role: $role) @client
}
`;
export const USER_SETTINGS_FRAGMENT = gql`
fragment UserSettingFragment on UserSettings {
timezone
notificationOnDay
notificationEachWeek
notificationBeforeEvent
}
`;
export const USER_SETTINGS = gql`
query UserSetting {
loggedUser {
settings {
...UserSettingFragment
}
}
}
${USER_SETTINGS_FRAGMENT}
`;
export const SET_USER_SETTINGS = gql`
mutation SetUserSettings(
$timezone: String
$notificationOnDay: Boolean
$notificationEachWeek: Boolean
$notificationBeforeEvent: Boolean
) {
setUserSettings(
timezone: $timezone
notificationOnDay: $notificationOnDay
notificationEachWeek: $notificationEachWeek
notificationBeforeEvent: $notificationBeforeEvent
) {
...UserSettingFragment
}
}
${USER_SETTINGS_FRAGMENT}
`;

View File

@@ -1,270 +1,270 @@
{
"A validation email was sent to {email}": "لقد تم إرسال رسالة إلكترونية للتأكيد إلى {email}",
"Abandon edition": "إلغاء التحرير",
"About": "عن",
"About Mobilizon": "عن Mobilizon",
"About this event": "عن هذه الفعالية",
"About this instance": "عن مثيل الخادم هذا",
"Accepted": "تم قبوله",
"Account settings": "إعدادات الحساب",
"Add": "إضافة",
"Add a note": "إضافة ملاحظة",
"Add an address": "إضافة عنوان",
"Add an instance": "إضافة مثيل خادم",
"Add some tags": "أضف بعض الوسوم",
"Additional comments": "تعليقات إضافية",
"Admin settings": "إعدادات المدير",
"Admin settings successfully saved.": "تم حفظ إعدادات المدير بنجاح.",
"Administration": "الإدارة",
"Allow all comments": "السماح بكافة التعليقات",
"Allow registrations": "السماح بإنشاء حسابات",
"An error has occurred.": "حدث هناك خطأ.",
"Anonymous participations": "المشاركات المجهولة",
"Approve": "قبول",
"Are you sure you want to cancel your participation at event \"{title}\"?": "هل أنت متأكد مِن أنك تريد الغاء مشاركتك في فعالية \"{title}\"؟",
"Avatar": "الصورة الرمزية",
"By @{username}": "حسب @{username}",
"Cancel": "الغاء",
"Cancel creation": "إلغاء الإنشاء",
"Cancel edition": "إلغاء التحرير",
"Cancel my participation request…": "إلغاء طلب مشارَكتي…",
"Cancel my participation…": "إلغاء مشارَكتي…",
"Cancelled: Won't happen": "تم إلغاؤها : لن تُجرى",
"Category": "الفئة",
"Change": "تعديل",
"Change my identity…": "تغيير هويتي…",
"Change my password": "تغيير كلمتي السرية",
"Change password": "تعديل الكلمة السرية",
"Clear": "امسح",
"Click to select": "اضغط للإختيار",
"Click to upload": "اضغط للتحميل",
"Comment deleted": "تم حذف التعليق",
"Comments": "التعليقات",
"Comments have been closed.": "تم إغلاق التعليقات.",
"Confirm my particpation": "تأكيد مشاركتي",
"Confirmed: Will happen": "مؤكّدة : سيتمّ إجراؤها",
"Continue editing": "مواصلة التحرير",
"Country": "البلد",
"Create": "انشاء",
"Create a new event": "انشاء فعالية جديدة",
"Create a new group": "إنشاء فريق جديد",
"Create a new identity": "إنشاء هوية جديدة",
"Create and manage several identities from the same account": "انشاء وإدارة هويات متعددة بحساب واحد",
"Create group": "إنشاء فريق",
"Create my event": "انشئ فعاليتي",
"Create my group": "انشئ فريقي",
"Create my profile": "انشئ ملفي التعريفي",
"Create, edit or delete events": "انشاء وتعديل وحدف الفعاليات",
"Creator": "المُنشئ",
"Dashboard": "لوح التحكم",
"Date": "التاريخ",
"Date and time settings": "إعدادات التاريخ والوقت",
"Date parameters": "إعدادات التاريخ",
"Delete": "حذف",
"Delete Comment": "احذف التعليق",
"Delete Event": "حذف الفعالية",
"Delete event": "حذف الفعالية",
"Delete this identity": "حذف هذه الهوية",
"Delete your identity": "احذف هويتك",
"Delete {eventTitle}": "احذف {eventTitle}",
"Delete {preferredUsername}": "حذف {preferredUsername}",
"Deleting comment": "جارٍ حذف التعليق",
"Deleting event": "حذف الفعالية",
"Description": "الوصف",
"Didn't receive the instructions ?": "لم تتلقّ التعليمات؟",
"Display name": "الإسم المعروض",
"Display participation price": "عرض سعر المشارَكة",
"Domain": "النطاق",
"Draft": "مسودة",
"Drafts": "المسودات",
"Edit": "تحرير",
"Eg: Stockholm, Dance, Chess…": "مثال: تونس ، رقص ، شطرنج…",
"Email": "البريد الإلكتروني",
"Ends on…": "ينتهي في…",
"Enjoy discovering Mobilizon!": "تمتّعوا عبر استكشاف Mobilizon!",
"Enter the link URL": "ادخل عنوان الرابط",
"Error while communicating with the server.": "خطأ عند الإتصال بالخادم.",
"Error while validating account": "خطأ أثناء تأكيد الحساب",
"Event": "فعالية",
"Event cancelled": "أُلغِيَت الفعالية",
"Event creation": "إنشاء الفعاليات",
"Event edition": "تعديل الفعاليات",
"Event list": "قائمة الفعاليات",
"Event not found.": "لم يتم العثور على الفعالية.",
"Event page settings": "خيارات صفحة الفعالية",
"Event to be confirmed": "في انتظار تأكيد الفعالية",
"Events": "الفعاليات",
"Ex: test.mobilizon.org": "مثال : test.mobilizon.org",
"Exclude": "إقصاء",
"Explore": "استكشاف",
"Featured events": "الفعاليات على الأولى",
"Features": "الميزات",
"Find an address": "البحث عن عنوان",
"Find an instance": "البحث عن مثيل خادم",
"Followers": "المتابِعون",
"Followings": "المتابَعون",
"For instance: London, Taekwondo, Architecture…": "مثال : لندن، تايكواندو، معمار…",
"Forgot your password ?": "هل نسيت كلمتك السرية؟",
"From the {startDate} at {startTime} to the {endDate}": "بداية مِن {startDate} at {startTime} إلى غاية {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "مِن {startDate} على {startTime} إلى غاية {endDate} على {endTime}",
"From the {startDate} to the {endDate}": "بداية مِن {startDate} إلى غاية {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "إلتقاء ⋅ تنظيم ⋅ حشد",
"General information": "معلومات عامة",
"Getting location": "جارٍ الحصول على الموقع",
"Going as {name}": "كـ {name}",
"Group List": "قائمة الفِرَق",
"Group full name": "الإسم الكامل للفريق",
"Group name": "اسم الفريق",
"Group {displayName} created": "تم إنشاء الفريق {displayName}",
"Groups": "الفِرَق",
"Headline picture": "الصورة على الصفحة الأولى",
"Hide replies": "اخفاء الردود",
"I create an identity": "أنشيء هوية",
"I participate": "أشارِك",
"I want to approve every participation request": "أريد أن أوافق على كل طلب مشاركة",
"Identity {displayName} created": "تم إنشاء الهوية {displayName}",
"Identity {displayName} deleted": "تم حذف هذه الهوية {displayName}",
"Identity {displayName} updated": "تم تحديث الهوية {displayName}",
"Instances": "مثيلات الخوادم",
"Last published event": "آخِر فعالية تم نشرها",
"Last week": "الأسبوع الماضي",
"Learn more": "معرفة المزيد",
"Learn more about Mobilizon": "معرفة المزيد عن Mobilizon",
"Leave event": "إلغاء مشاركتي في الفعالية",
"Leaving event \"{title}\"": "إلغاء مشاركتي في الفعالية \"{title}\"",
"License": "الرخصة",
"Limited number of places": "عدد الأماكن محدود",
"Load more": "تحميل المزيد",
"Locality": "البلدية",
"Log in": "لِج",
"Log out": "الخروج",
"Login": "لِج",
"Login on Mobilizon!": "الولوج إلى Mobilizon!",
"Manage participations": "إدارة المشارَكات",
"Members": "الأعضاء",
"Mobilizons licence": "رخصة Mobilizon",
"My account": "حسابي",
"My events": "فعالياتي",
"My identities": "هوياتي",
"Name": "الإسم",
"New note": "ملاحظة جديدة",
"New password": "الكلمة السرية الجديدة",
"No address defined": "لم يتم تحديد أي عنوان",
"No comment": "ليس هناك تعليقات",
"No comments yet": "ليس هناك أية تعليقات بعدُ",
"No end date": "مِن دون تاريخ نهاية",
"No events found": "لم يتم العثور على أية فعالية",
"No group found": "لم يتم العثور على أي فريق",
"No groups found": "لم يتم العثور على أي فريق",
"No results for \"{queryText}\"": "ليس هناك أية نتيجة لِـ \"{queryText}\"",
"Notes": "الملاحظات",
"Number of places": "عدد الأماكن",
"OK": "حسنًا",
"Old password": "الكلمة السرية القديمة",
"On {date}": "يوم {date}",
"On {date} ending at {endTime}": "يوم {date} يتنهي على {endTime}",
"On {date} from {startTime} to {endTime}": "يوم {date} مِن {startTime} إلى غاية {endTime}",
"One person is going": "No one is going | One person is going | {approved} persons are going",
"Open": "مفتوح",
"Organized by {name}": "يُنظّمُها {name}",
"Organizer": "المُنظِّم",
"Page not found": "الصفحة غير موجودة",
"Participants": "المُشارِكون",
"Participate": "شارِك",
"Participation approval": "تأكيد المشاركات",
"Password": "الكلمة السرية",
"Password (confirmation)": "الكلمة السرية (تأكيد)",
"Password change": "تغيير الكلمة السرية",
"Password reset": "تصفير الكلمة السرية",
"Past events": "الفعاليات المُنصرمة",
"Pick an identity": "اختر هوية",
"Please read the full rules": "يُرجى قراءة كافة القواعد",
"Please refresh the page and retry.": "يرجى انعاش الصفحة ثم أعد المحاولة.",
"Post a comment": "إضافة تعليق",
"Post a reply": "إضافة ردّ",
"Postal Code": "الرمز البريدي",
"Private event": "فعالية خاصة",
"Public comment moderation": "الإشراف على التعليقات العمومية",
"Public event": "فعالية للعامة",
"Publish": "انشرها",
"Published events": "الفعاليات المنشورة",
"Region": "المنطقة",
"Register": "إنشاء حساب",
"Register an account on Mobilizon!": "إنشاء حساب على Mobilizon!",
"Registration is currently closed.": "التسجيلات مُغلقة حاليا.",
"Reject": "رفض",
"Rejected participations": "المشاركات المرفوضة",
"Reply": "رد",
"Report": "أبلغ",
"Report this comment": "الإبلاغ عن هذا التعليق",
"Report this event": "الإبلاغ عن هذه الفعالية",
"Reported": "م الإبلاغ عنه",
"Reported by": "أبلغ عنه",
"Reports": "التقارير",
"Requests": "الطلبات",
"Resend confirmation email": "إعادة ارسال بريد التأكيد",
"Reset my password": "صفّر كلمتي السرية",
"Save": "حفظ",
"Save draft": "حفظ المسودة",
"Search": "البحث",
"Search events, groups, etc.": "البحث عن فعاليات أو فِرق إلخ.",
"Search results: \"{search}\"": "نتائج البحث: \"{search}\"",
"Searching…": "البحث جارٍ…",
"Send the report": "ارسال التقرير",
"Share this event": "شارك الفعالية",
"Show map": "اعرض الخريطة",
"Show remaining number of places": "عرض الأماكن المتبقيّة",
"Sign up": "التسجيل",
"Software to the people": "برمجيات للناس",
"Street": "شارع",
"The draft event has been updated": "تم تحديث مسودّة الفعالية",
"The event has been created as a draft": "تم إنشاء الفعالية كمسودّة",
"The event has been published": "تم نشر الفعالية",
"The event has been updated": "تم تحديث الفعالية",
"The event has been updated and published": "تم تحديث الفعالية ونشرها",
"The page you're looking for doesn't exist.": "الصفحة التي تبحث عنها غير موجودة.",
"The password was successfully changed": "تم تعديل الكلمة السرية بنجاح",
"These events may interest you": "قد تهُمّك هذه الفعاليات",
"This is a demonstration site to test the beta version of Mobilizon.": "هذا موقع تجريبي للنسخة التجريبية لـ Mobilizon.",
"Title": "العنوان",
"To change the world, change the software": "غيّر العالَم بتغيير البرنامج",
"Type": "النوع",
"Unfortunately, this instance isn't opened to registrations": "لسوء الحظ ، التسجيلات مُغلَقة على مثيل الخادم هذا",
"Unknown": "مجهول",
"Unknown error.": "خطأ مجهول.",
"Unsaved changes": "التغييرات غير مُحتَفَظ بها",
"Upcoming": "قادمة",
"Update event {name}": "تحديث الفعالية {name}",
"Update my event": "تعديل فعاليتي",
"Updated": "تم تحديثه",
"Username": "إسم المستخدم",
"Users": "المستخدِمون",
"View event page": "عرض صفحة الفعالية",
"View everything": "عرض الكل",
"Waiting list": "قائمة الإنتظار",
"Warning": "تنبيه",
"Website / URL": "موقع الويب / الرابط",
"Welcome back {username}!": "أهلا بك ثانيةً {username}!",
"Welcome back!": "أهلًا بك ثانيةً!",
"Welcome on your administration panel": "أهلا على لوحك الإداري",
"Welcome to Mobilizon, {username}!": "مرحبًا بك إلى موبيليزون ، {username}!",
"Who can view this event and participate": "من يمكنه رؤية هذه الفعالية والمشاركة فيها",
"World map": "خريطة العالَم",
"Write something…": "اكتب شيئا ما…",
"You can't remove your last identity.": "ليس بإمكانك حذف آخِر هوية لك.",
"You don't follow any instances yet.": "في الوقت الحالي أنت لا تُتابِع أي مثيل خادم.",
"You have cancelled your participation": "لقد ألغيتَ مشاركتك",
"You need to login.": "يجب عليك الولوج.",
"Your account has been validated": "لقد تم تأكيد حسابك",
"Your account is being validated": "جارٍ تأكيد حسابك",
"[This comment has been deleted]": "[لقد حُذِف هذا التعليق]",
"as {identity}": "كـ {identity}",
"e.g. 10 Rue Jangot": "مثال : 10 شارع جانغو",
"its source code is public": "الشفرة المصدرية متاحة للجميع",
"on our blog": "على مدوّنتنا",
"resend confirmation email": "إعادة إرسال بريد التأكيد",
"respect of the fundamental freedoms": "احترام الحريات الأساسية",
"with another identity…": "بهوية أخرى…",
"{approved} / {total} seats": "{approved} / {total} أماكن",
"© The OpenStreetMap Contributors": "© مساهمو ومساهمات OpenStreetMap"
"A validation email was sent to {email}": "لقد تم إرسال رسالة إلكترونية للتأكيد إلى {email}",
"Abandon edition": "إلغاء التحرير",
"About": "عن",
"About Mobilizon": "عن Mobilizon",
"About this event": "عن هذه الفعالية",
"About this instance": "عن مثيل الخادم هذا",
"Accepted": "تم قبوله",
"Account settings": "إعدادات الحساب",
"Add": "إضافة",
"Add a note": "إضافة ملاحظة",
"Add an address": "إضافة عنوان",
"Add an instance": "إضافة مثيل خادم",
"Add some tags": "أضف بعض الوسوم",
"Additional comments": "تعليقات إضافية",
"Admin settings": "إعدادات المدير",
"Admin settings successfully saved.": "تم حفظ إعدادات المدير بنجاح.",
"Administration": "الإدارة",
"Allow all comments": "السماح بكافة التعليقات",
"Allow registrations": "السماح بإنشاء حسابات",
"An error has occurred.": "حدث هناك خطأ.",
"Anonymous participations": "المشاركات المجهولة",
"Approve": "قبول",
"Are you sure you want to cancel your participation at event \"{title}\"?": "هل أنت متأكد مِن أنك تريد الغاء مشاركتك في فعالية \"{title}\"؟",
"Avatar": "الصورة الرمزية",
"By @{username}": "حسب @{username}",
"Cancel": "الغاء",
"Cancel creation": "إلغاء الإنشاء",
"Cancel edition": "إلغاء التحرير",
"Cancel my participation request…": "إلغاء طلب مشارَكتي…",
"Cancel my participation…": "إلغاء مشارَكتي…",
"Cancelled: Won't happen": "تم إلغاؤها : لن تُجرى",
"Category": "الفئة",
"Change": "تعديل",
"Change my identity…": "تغيير هويتي…",
"Change my password": "تغيير كلمتي السرية",
"Change password": "تعديل الكلمة السرية",
"Clear": "امسح",
"Click to select": "اضغط للإختيار",
"Click to upload": "اضغط للتحميل",
"Comment deleted": "تم حذف التعليق",
"Comments": "التعليقات",
"Comments have been closed.": "تم إغلاق التعليقات.",
"Confirm my particpation": "تأكيد مشاركتي",
"Confirmed: Will happen": "مؤكّدة : سيتمّ إجراؤها",
"Continue editing": "مواصلة التحرير",
"Country": "البلد",
"Create": "انشاء",
"Create a new event": "انشاء فعالية جديدة",
"Create a new group": "إنشاء فريق جديد",
"Create a new identity": "إنشاء هوية جديدة",
"Create and manage several identities from the same account": "انشاء وإدارة هويات متعددة بحساب واحد",
"Create group": "إنشاء فريق",
"Create my event": "انشئ فعاليتي",
"Create my group": "انشئ فريقي",
"Create my profile": "انشئ ملفي التعريفي",
"Create, edit or delete events": "انشاء وتعديل وحدف الفعاليات",
"Creator": "المُنشئ",
"Dashboard": "لوح التحكم",
"Date": "التاريخ",
"Date and time settings": "إعدادات التاريخ والوقت",
"Date parameters": "إعدادات التاريخ",
"Delete": "حذف",
"Delete Comment": "احذف التعليق",
"Delete Event": "حذف الفعالية",
"Delete event": "حذف الفعالية",
"Delete this identity": "حذف هذه الهوية",
"Delete your identity": "احذف هويتك",
"Delete {eventTitle}": "احذف {eventTitle}",
"Delete {preferredUsername}": "حذف {preferredUsername}",
"Deleting comment": "جارٍ حذف التعليق",
"Deleting event": "حذف الفعالية",
"Description": "الوصف",
"Didn't receive the instructions ?": "لم تتلقّ التعليمات؟",
"Display name": "الإسم المعروض",
"Display participation price": "عرض سعر المشارَكة",
"Domain": "النطاق",
"Draft": "مسودة",
"Drafts": "المسودات",
"Edit": "تحرير",
"Eg: Stockholm, Dance, Chess…": "مثال: تونس ، رقص ، شطرنج…",
"Email": "البريد الإلكتروني",
"Ends on…": "ينتهي في…",
"Enjoy discovering Mobilizon!": "تمتّعوا عبر استكشاف Mobilizon!",
"Enter the link URL": "ادخل عنوان الرابط",
"Error while communicating with the server.": "خطأ عند الإتصال بالخادم.",
"Error while validating account": "خطأ أثناء تأكيد الحساب",
"Event": "فعالية",
"Event cancelled": "أُلغِيَت الفعالية",
"Event creation": "إنشاء الفعاليات",
"Event edition": "تعديل الفعاليات",
"Event list": "قائمة الفعاليات",
"Event not found.": "لم يتم العثور على الفعالية.",
"Event page settings": "خيارات صفحة الفعالية",
"Event to be confirmed": "في انتظار تأكيد الفعالية",
"Events": "الفعاليات",
"Ex: test.mobilizon.org": "مثال : test.mobilizon.org",
"Exclude": "إقصاء",
"Explore": "استكشاف",
"Featured events": "الفعاليات على الأولى",
"Features": "الميزات",
"Find an address": "البحث عن عنوان",
"Find an instance": "البحث عن مثيل خادم",
"Followers": "المتابِعون",
"Followings": "المتابَعون",
"For instance: London, Taekwondo, Architecture…": "مثال : لندن، تايكواندو، معمار…",
"Forgot your password ?": "هل نسيت كلمتك السرية؟",
"From the {startDate} at {startTime} to the {endDate}": "بداية مِن {startDate} at {startTime} إلى غاية {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "مِن {startDate} على {startTime} إلى غاية {endDate} على {endTime}",
"From the {startDate} to the {endDate}": "بداية مِن {startDate} إلى غاية {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "إلتقاء ⋅ تنظيم ⋅ حشد",
"General information": "معلومات عامة",
"Getting location": "جارٍ الحصول على الموقع",
"Going as {name}": "كـ {name}",
"Group List": "قائمة الفِرَق",
"Group full name": "الإسم الكامل للفريق",
"Group name": "اسم الفريق",
"Group {displayName} created": "تم إنشاء الفريق {displayName}",
"Groups": "الفِرَق",
"Headline picture": "الصورة على الصفحة الأولى",
"Hide replies": "اخفاء الردود",
"I create an identity": "أنشيء هوية",
"I participate": "أشارِك",
"I want to approve every participation request": "أريد أن أوافق على كل طلب مشاركة",
"Identity {displayName} created": "تم إنشاء الهوية {displayName}",
"Identity {displayName} deleted": "تم حذف هذه الهوية {displayName}",
"Identity {displayName} updated": "تم تحديث الهوية {displayName}",
"Instances": "مثيلات الخوادم",
"Last published event": "آخِر فعالية تم نشرها",
"Last week": "الأسبوع الماضي",
"Learn more": "معرفة المزيد",
"Learn more about Mobilizon": "معرفة المزيد عن Mobilizon",
"Leave event": "إلغاء مشاركتي في الفعالية",
"Leaving event \"{title}\"": "إلغاء مشاركتي في الفعالية \"{title}\"",
"License": "الرخصة",
"Limited number of places": "عدد الأماكن محدود",
"Load more": "تحميل المزيد",
"Locality": "البلدية",
"Log in": "لِج",
"Log out": "الخروج",
"Login": "لِج",
"Login on Mobilizon!": "الولوج إلى Mobilizon!",
"Manage participations": "إدارة المشارَكات",
"Members": "الأعضاء",
"Mobilizons licence": "رخصة Mobilizon",
"My account": "حسابي",
"My events": "فعالياتي",
"My identities": "هوياتي",
"Name": "الإسم",
"New note": "ملاحظة جديدة",
"New password": "الكلمة السرية الجديدة",
"No address defined": "لم يتم تحديد أي عنوان",
"No comment": "ليس هناك تعليقات",
"No comments yet": "ليس هناك أية تعليقات بعدُ",
"No end date": "مِن دون تاريخ نهاية",
"No events found": "لم يتم العثور على أية فعالية",
"No group found": "لم يتم العثور على أي فريق",
"No groups found": "لم يتم العثور على أي فريق",
"No results for \"{queryText}\"": "ليس هناك أية نتيجة لِـ \"{queryText}\"",
"Notes": "الملاحظات",
"Number of places": "عدد الأماكن",
"OK": "حسنًا",
"Old password": "الكلمة السرية القديمة",
"On {date}": "يوم {date}",
"On {date} ending at {endTime}": "يوم {date} يتنهي على {endTime}",
"On {date} from {startTime} to {endTime}": "يوم {date} مِن {startTime} إلى غاية {endTime}",
"One person is going": "No one is going | One person is going | {approved} persons are going",
"Open": "مفتوح",
"Organized by {name}": "يُنظّمُها {name}",
"Organizer": "المُنظِّم",
"Page not found": "الصفحة غير موجودة",
"Participants": "المُشارِكون",
"Participate": "شارِك",
"Participation approval": "تأكيد المشاركات",
"Password": "الكلمة السرية",
"Password (confirmation)": "الكلمة السرية (تأكيد)",
"Password change": "تغيير الكلمة السرية",
"Password reset": "تصفير الكلمة السرية",
"Past events": "الفعاليات المُنصرمة",
"Pick an identity": "اختر هوية",
"Please read the full rules": "يُرجى قراءة كافة القواعد",
"Please refresh the page and retry.": "يرجى انعاش الصفحة ثم أعد المحاولة.",
"Post a comment": "إضافة تعليق",
"Post a reply": "إضافة ردّ",
"Postal Code": "الرمز البريدي",
"Private event": "فعالية خاصة",
"Public comment moderation": "الإشراف على التعليقات العمومية",
"Public event": "فعالية للعامة",
"Publish": "انشرها",
"Published events": "الفعاليات المنشورة",
"Region": "المنطقة",
"Register": "إنشاء حساب",
"Register an account on Mobilizon!": "إنشاء حساب على Mobilizon!",
"Registration is currently closed.": "التسجيلات مُغلقة حاليا.",
"Reject": "رفض",
"Rejected participations": "المشاركات المرفوضة",
"Reply": "رد",
"Report": "أبلغ",
"Report this comment": "الإبلاغ عن هذا التعليق",
"Report this event": "الإبلاغ عن هذه الفعالية",
"Reported": "م الإبلاغ عنه",
"Reported by": "أبلغ عنه",
"Reports": "التقارير",
"Requests": "الطلبات",
"Resend confirmation email": "إعادة ارسال بريد التأكيد",
"Reset my password": "صفّر كلمتي السرية",
"Save": "حفظ",
"Save draft": "حفظ المسودة",
"Search": "البحث",
"Search events, groups, etc.": "البحث عن فعاليات أو فِرق إلخ.",
"Search results: \"{search}\"": "نتائج البحث: \"{search}\"",
"Searching…": "البحث جارٍ…",
"Send the report": "ارسال التقرير",
"Share this event": "شارك الفعالية",
"Show map": "اعرض الخريطة",
"Show remaining number of places": "عرض الأماكن المتبقيّة",
"Sign up": "التسجيل",
"Software to the people": "برمجيات للناس",
"Street": "شارع",
"The draft event has been updated": "تم تحديث مسودّة الفعالية",
"The event has been created as a draft": "تم إنشاء الفعالية كمسودّة",
"The event has been published": "تم نشر الفعالية",
"The event has been updated": "تم تحديث الفعالية",
"The event has been updated and published": "تم تحديث الفعالية ونشرها",
"The page you're looking for doesn't exist.": "الصفحة التي تبحث عنها غير موجودة.",
"The password was successfully changed": "تم تعديل الكلمة السرية بنجاح",
"These events may interest you": "قد تهُمّك هذه الفعاليات",
"This is a demonstration site to test the beta version of Mobilizon.": "هذا موقع تجريبي للنسخة التجريبية لـ Mobilizon.",
"Title": "العنوان",
"To change the world, change the software": "غيّر العالَم بتغيير البرنامج",
"Type": "النوع",
"Unfortunately, this instance isn't opened to registrations": "لسوء الحظ ، التسجيلات مُغلَقة على مثيل الخادم هذا",
"Unknown": "مجهول",
"Unknown error.": "خطأ مجهول.",
"Unsaved changes": "التغييرات غير مُحتَفَظ بها",
"Upcoming": "قادمة",
"Update event {name}": "تحديث الفعالية {name}",
"Update my event": "تعديل فعاليتي",
"Updated": "تم تحديثه",
"Username": "إسم المستخدم",
"Users": "المستخدِمون",
"View event page": "عرض صفحة الفعالية",
"View everything": "عرض الكل",
"Waiting list": "قائمة الإنتظار",
"Warning": "تنبيه",
"Website / URL": "موقع الويب / الرابط",
"Welcome back {username}!": "أهلا بك ثانيةً {username}!",
"Welcome back!": "أهلًا بك ثانيةً!",
"Welcome on your administration panel": "أهلا على لوحك الإداري",
"Welcome to Mobilizon, {username}!": "مرحبًا بك إلى موبيليزون ، {username}!",
"Who can view this event and participate": "من يمكنه رؤية هذه الفعالية والمشاركة فيها",
"World map": "خريطة العالَم",
"Write something…": "اكتب شيئا ما…",
"You can't remove your last identity.": "ليس بإمكانك حذف آخِر هوية لك.",
"You don't follow any instances yet.": "في الوقت الحالي أنت لا تُتابِع أي مثيل خادم.",
"You have cancelled your participation": "لقد ألغيتَ مشاركتك",
"You need to login.": "يجب عليك الولوج.",
"Your account has been validated": "لقد تم تأكيد حسابك",
"Your account is being validated": "جارٍ تأكيد حسابك",
"[This comment has been deleted]": "[لقد حُذِف هذا التعليق]",
"as {identity}": "كـ {identity}",
"e.g. 10 Rue Jangot": "مثال : 10 شارع جانغو",
"its source code is public": "الشفرة المصدرية متاحة للجميع",
"on our blog": "على مدوّنتنا",
"resend confirmation email": "إعادة إرسال بريد التأكيد",
"respect of the fundamental freedoms": "احترام الحريات الأساسية",
"with another identity…": "بهوية أخرى…",
"{approved} / {total} seats": "{approved} / {total} أماكن",
"© The OpenStreetMap Contributors": "© مساهمو ومساهمات OpenStreetMap"
}

View File

@@ -1,203 +1,203 @@
{
"<b>Please do not use it in any real way.</b>": "<b>Калі ласка, не выкарыстоўвайце яго ні для чаго сапраўднага.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Зручны, незалежны і этычны інструмент для сходаў, арганізацыі і мабілізацыі.",
"A validation email was sent to {email}": "На {email} дасланы ліст для пацвярджэння",
"Abandon edition": "Адмовіцца ад рэдагавання",
"About": "Інфармацыя",
"About Mobilizon": "Пра Mobilizon",
"About this event": "Пра гэту падзею",
"About this instance": "Пра гэты сервер",
"Accepted": "Прынята",
"Add": "Дадаць",
"Add a note": "Дадаць нататку",
"Add an address": "Дадаць адрас",
"Add an instance": "Дадаць сервер",
"Add some tags": "Дадаць цэтлікі",
"Add to my calendar": "Дадаць у календар",
"Additional comments": "Дадатковыя каментарыі",
"Administration": "Адміністрацыя",
"All the places have already been taken": "Усе месцы занятыя|Даступнае адно месца|Даступныя {places} месцы|Даступна {places} месцаў",
"Allow all comments": "Дазволіць усе каментарыі",
"An error has occurred.": "Адбылася памылка.",
"Approve": "Пацвердзіць",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Вы сапраўды хочаце <b>выдаліць</b> гэты каментарый? Гэта дзеянне нельга адмяніць.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Вы сапраўды жадаеце <b>выдаліць</b> гэту падзею? Гэта дзеянне нельга адмяніць. Магчыма, варта замест гэтага пагаварыць з аўтарам ці аўтаркай падзеі ці адрэдагаваць падзею.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Вы сапраўды хочаце адмяніць стварэнне падзеі? Вы страціце ўсе свае рэдагаванні.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Вы сапраўды хочаце адмяніць рэдагаванне падзеі? Вы страціце ўсе рэдагаванні.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Вы сапраўды хочаце адмовіцца ад удзелу ў падзеі «{title}»?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Вы сапраўды хочаце выдаліць гэту падзею? Гэта дзеянне нельга адмяніць.",
"Avatar": "Аватар",
"Before you can login, you need to click on the link inside it to validate your account": "Каб увайсці з уліковым запісам, патрэбна спачатку перайсці па спасылцы, якая прыйшла вам у лісце",
"By @{username}": "Ад @{username}",
"Cancel": "Адмяніць",
"Cancel creation": "Адмяніць стварэнне",
"Cancel edition": "Адмяніць рэдагаванне",
"Cancel my participation request…": "Адмяніць мой запыт на ўдзел…",
"Cancel my participation…": "Адмяніць мой удзел…",
"Cancelled: Won't happen": "Адменена: не адбудзецца",
"Category": "Катэгорыя",
"Change": "Змяніць",
"Change my identity…": "Змяніць маю ідэнтычнасць…",
"Change my password": "Змяніць мой пароль",
"Change password": "Змяніць пароль",
"Clear": "Ачысціць",
"Click to select": "Націсніце, каб выбраць",
"Click to upload": "Націсніце, каб запампаваць",
"Close": "Закрыць",
"Close comments for all (except for admins)": "Закрыць каментарыі для ўсіх (акрамя адміністрацыі)",
"Closed": "Закрыта",
"Comment deleted": "Каментарый выдалены",
"Comment from @{username} reported": "Паведамленне пра праблемы з каментарыям @{username} дасланае",
"Comments": "Каментарыі",
"Comments have been closed.": "Каментарыі закрытыя.",
"Confirm my particpation": "Пацвердзіць мой удзел",
"Confirmed: Will happen": "Пацверджана: адбудзецца",
"Continue editing": "Працягнуць рэдагаванне",
"Country": "Краіна",
"Create": "Стварыць",
"Create a new event": "Стварыць новую падзею",
"Create a new group": "Стварыць новую групу",
"Create a new identity": "Стварыць новую ідэнтычнасць",
"Create and manage several identities from the same account": "Стварайце некалькі ідэнтычнасцяў і кіруйце імі з аднаго ўліковага запісу",
"Create group": "Стварыць групу",
"Create my event": "Стварыць падзею",
"Create my group": "Стварыць групу",
"Create my profile": "Стварыць профіль",
"Create token": "Стварыць токен",
"Create, edit or delete events": "Стварайце, рэдагуйце і выдаляйце падзеі",
"Creator": "Стваральнік/стваральніца",
"Current identity has been changed to {identityName} in order to manage this event.": "Бягучая ідэнтычнасць змененая на {identityName}, каб можна было рэдагаваць гэту падзею.",
"Dashboard": "Панэль кіравання",
"Date": "Дата",
"Date and time settings": "Наладкі даты і часу",
"Date parameters": "Параметры даты",
"Delete": "Выдаліць",
"Delete Comment": "Выдаліць каментарый",
"Delete Event": "Выдаліць падзею",
"Delete event": "Выдаліць падзею",
"Delete this identity": "Выдаліць гэту ідэнтычнасць",
"Delete your identity": "Выдаліць ідэнтычнасць",
"Delete {eventTitle}": "Выдаліць {eventTitle}",
"Delete {preferredUsername}": "Выдаліць {preferredUsername}",
"Deleting comment": "Выдаліць каментарый",
"Deleting event": "Выдаліць падзею",
"Description": "Апісанне",
"Didn't receive the instructions ?": "Не атрымалі інструкцыі?",
"Display name": "Адлюстравальнае імя",
"Display participation price": "Паказваць цану ўдзелу",
"Domain": "Дамен",
"Draft": "Чарнавік",
"Drafts": "Чарнавікі",
"Edit": "Рэдагаваць",
"Eg: Stockholm, Dance, Chess…": "Напр.: Стакгольм, танцы, шахматы…",
"Either the account is already validated, either the validation token is incorrect.": "Або уліковы запіс ужо пацверджаны, або апазнавальны код для пацвярджэння некарэктны.",
"Email": "Электронная пошта",
"Ends on…": "Заканчваецца…",
"Enjoy discovering Mobilizon!": "Зычым прыемнага знаёмства з функцыямі Mobilizon!",
"Enter the link URL": "Увядзіце адрас URL",
"Error while communicating with the server.": "Памылка падчас звязку з серверам.",
"Error while saving report.": "Памылка падчас запісу паведамлення пра праблемы.",
"Error while validating account": "Памылка падчас пацвярджэння ўліковага запісу",
"Event": "Падзея",
"Event already passed": "Падзея ўжо прайшла",
"Event cancelled": "Падзея адмененая",
"Event creation": "Стварэнне падзеі",
"Event edition": "Рэдагаванне падзеі",
"Event list": "Спіс падзей",
"Event not found.": "Падзея не знойдзеная.",
"Event page settings": "Наладкі старонкі падзеі",
"Event to be confirmed": "Падзея чакае пацвярджэння",
"Event {eventTitle} deleted": "Падзея {eventTitle} выдаленая",
"Event {eventTitle} reported": "Паведамленне пра праблемы з падзеяй {eventTitle} дасланае",
"Events": "Падзеі",
"Ex: test.mobilizon.org": "Напр.: test.mobilizon.org",
"Exclude": "Вылучыць",
"Explore": "Агляд",
"Featured events": "Прапанаваныя падзеі",
"Features": "Магчымасці",
"Find an address": "Знайсці адрас",
"Find an instance": "Знайсці сервер",
"Followers": "Падпісчыкі",
"Followings": "Падпіскі",
"For instance: London, Taekwondo, Architecture…": "Напр.: Мінск, тхэквандо, архітэктура…",
"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?": "І святкаванне дня нараджэння з сябрамі, і марш за клімату — для чаго б мы не збіраліся, наша арганізацыя <b>у пастцы платформ тэхнічных гігантаў</b>. Як арганізоўвацца, як сказаць «Я прыду» без <b>перадачы дадзеных</b> Фэйсбуку ці <b>абмежаванняў</b> ЎКантакце?",
"From the {startDate} at {startTime} to the {endDate}": "Ад {startDate}, {startTime} да {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Ад {startDate}, {startTime} да {endDate}, {endTime}",
"From the {startDate} to the {endDate}": "Ад {startDate} да {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Сход ⋅ Арганізацыя ⋅ Мабілізацыя",
"General information": "Агульная інфармацыя",
"Getting location": "Атрыманне месцапалажэння",
"Going as {name}": "Іду як {name}",
"Group List": "Спіс груп",
"Group full name": "Поўная назва групы",
"Group name": "Назва групы",
"Group {displayName} created": "Створаная група {displayName}",
"Groups": "Групы",
"Headline picture": "Ілюстрацыя да загалоўка",
"Hide replies": "Прыхаваць адказы",
"I create an identity": "Я ствараю ідэнтычнасць",
"I participate": "Я прымаю ўдзел",
"I want to approve every participation request": "Я хачу пацвярджаць кожны запыт на ўдзел",
"Identity {displayName} created": "Створаная ідэнтычнасць {displayName}",
"Identity {displayName} deleted": "Выдаленая ідэнтычнасць {displayName}",
"Identity {displayName} updated": "Ідэнтычнасць {displayName} абноўленая",
"If an account with this email exists, we just sent another confirmation email to {email}": "Калі ўліковы запіс з гэтым адрасам існуе, мы толькі што даслалі ліст на {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Калі гэтая ідэнтычнасць — адміністратар нейкіх груп, спачатку трэба выдаліць гэтыя групы, а потым можна будзе выдаліць гэта ідэнтычнасць.",
"Impossible to login, your email or password seems incorrect.": "Немагчыма ўвайсці, памылка ці ў адрасе, ці ў паролі.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Пакуль што разумейце, што гэта праграма (пакуль што) недаробленая. Болей інфармацыі {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Mobilizon дазваляе супольнасцям вызваліцца ад паслуг тэхнічных гігантаў і стварыць<b>уласную платформу для падзей</b>.",
"Instances": "Серверы",
"Join {instance}, a Mobilizon instance": "Прыяднайцеся да {instance}, сервера Mobilizon",
"Last published event": "Апошняя апублікаваная падзея",
"Last week": "На мінулым тыдні",
"Learn more": "Даведацца болей",
"Learn more about Mobilizon": "Даведацца болей аб Mobilizon",
"Leave event": "Выйсці з падзеі",
"Leaving event \"{title}\"": "Выхад з падзеі «{title}»",
"Let's create a new common": "Давайце створым новыя магчымасці для ўсіх",
"License": "Ліцэнзія",
"Limited number of places": "Абмежаваная колькасць месцаў",
"Load more": "Паказаць болей",
"Locality": "Месца",
"Log in": "Увайсці",
"Log out": "Выйсці",
"Login": "Увайсці",
"Login on Mobilizon!": "Уваход у Mobilizon!",
"Manage participations": "Кіраванне ўдзеламі",
"Mark as resolved": "Пазначыць як гатовае",
"Members": "Сябры",
"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 — гэта вольнае праграмнае забеспячэнне, якое дазваляе супольнасцям стварыць<b>уласную прастору</b> для публікацыі падзей, каб не залежаць ад тэхнічных гігантаў.",
"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 зараз распрацоўваецца, мы будзем рэгулярна абнаўляць гэты сайт і дадаваць магчымасці да выхаду <b>версіі праграмы 1 у першай палове 2020 года</b>.",
"Mobilizons licence": "Ліцэнзія Mobilizon",
"Moderated comments (shown after approval)": "Каментарыі ў мадэрацыі (з'явяцца пасля адабрэння)",
"My account": "Мой уліковы запіс",
"My events": "Мае падзеі",
"My identities": "Мае ідэнтычнасці",
"Name": "Імя",
"New note": "Новая нататка",
"New password": "Новы пароль",
"No actors found": "Дзеячы не знойдзеныя",
"No address defined": "Адрас не вызначаны",
"No closed reports yet": "Пакуль што закрытых паведамленняў пра праблемы няма",
"No comment": "Без каментарыяў",
"No comments yet": "Каментарыяў пакуль што няма",
"No end date": "Без даты заканчэння",
"No events found": "Падзеі не знойдзеныя",
"No group found": "Групы не знойдзеныя",
"No groups found": "Групы не знойдзеныя",
"No instance follows your instance yet.": "Сервераў, якія падпісаныя на ваш сервер, пакуль што няма.",
"No instance to approve|Approve instance|Approve {number} instances": "Няма сервераў для ўхвалення|Ухваліць сервер|Ухваліць {number} сервера|Ухваліць {number} сервераў",
"No instance to reject|Reject instance|Reject {number} instances": "Няма серверам для адмаўлення|Адмовіць серверу|Адмовіць {number} серверам|Адмовіць {number} серверам",
"No instance to remove|Remove instance|Remove {number} instances": "Няма сервераў для выдалення|Выдаліць сервер|Выдаліць {number} сервера|Выдаліць {number} сервера",
"No open reports yet": "Адкрытых паведамленняў пра праблемы няма",
"No resolved reports yet": "Вырашаных праблем, пра якія былі паведамленні, няма",
"No results for \"{queryText}\"": "Рэзультатаў па «{queryText}» няма",
"No user account with this email was found. Maybe you made a typo?": "Уліковых запісаў з гэтым адрасам электроннай пошты не знойдзена. Памылка друку?",
"Notes": "Нататкі",
"Number of places": "Колькасць месцаў",
"OK": "OK",
"Old password": "Стары пароль",
"Register for an event by choosing one of your identities": "Рэгіструйцеся на падзеі, выбіраючы любую з сваіх ідэнтычнасцяў",
"This is a demonstration site to test the beta version of Mobilizon.": "Гэта дэманстрацыйны сайт для праверкі бэта-версіі Mobilizon."
"<b>Please do not use it in any real way.</b>": "<b>Калі ласка, не выкарыстоўвайце яго ні для чаго сапраўднага.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Зручны, незалежны і этычны інструмент для сходаў, арганізацыі і мабілізацыі.",
"A validation email was sent to {email}": "На {email} дасланы ліст для пацвярджэння",
"Abandon edition": "Адмовіцца ад рэдагавання",
"About": "Інфармацыя",
"About Mobilizon": "Пра Mobilizon",
"About this event": "Пра гэту падзею",
"About this instance": "Пра гэты сервер",
"Accepted": "Прынята",
"Add": "Дадаць",
"Add a note": "Дадаць нататку",
"Add an address": "Дадаць адрас",
"Add an instance": "Дадаць сервер",
"Add some tags": "Дадаць цэтлікі",
"Add to my calendar": "Дадаць у календар",
"Additional comments": "Дадатковыя каментарыі",
"Administration": "Адміністрацыя",
"All the places have already been taken": "Усе месцы занятыя|Даступнае адно месца|Даступныя {places} месцы|Даступна {places} месцаў",
"Allow all comments": "Дазволіць усе каментарыі",
"An error has occurred.": "Адбылася памылка.",
"Approve": "Пацвердзіць",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Вы сапраўды хочаце <b>выдаліць</b> гэты каментарый? Гэта дзеянне нельга адмяніць.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Вы сапраўды жадаеце <b>выдаліць</b> гэту падзею? Гэта дзеянне нельга адмяніць. Магчыма, варта замест гэтага пагаварыць з аўтарам ці аўтаркай падзеі ці адрэдагаваць падзею.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Вы сапраўды хочаце адмяніць стварэнне падзеі? Вы страціце ўсе свае рэдагаванні.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Вы сапраўды хочаце адмяніць рэдагаванне падзеі? Вы страціце ўсе рэдагаванні.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Вы сапраўды хочаце адмовіцца ад удзелу ў падзеі «{title}»?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Вы сапраўды хочаце выдаліць гэту падзею? Гэта дзеянне нельга адмяніць.",
"Avatar": "Аватар",
"Before you can login, you need to click on the link inside it to validate your account": "Каб увайсці з уліковым запісам, патрэбна спачатку перайсці па спасылцы, якая прыйшла вам у лісце",
"By @{username}": "Ад @{username}",
"Cancel": "Адмяніць",
"Cancel creation": "Адмяніць стварэнне",
"Cancel edition": "Адмяніць рэдагаванне",
"Cancel my participation request…": "Адмяніць мой запыт на ўдзел…",
"Cancel my participation…": "Адмяніць мой удзел…",
"Cancelled: Won't happen": "Адменена: не адбудзецца",
"Category": "Катэгорыя",
"Change": "Змяніць",
"Change my identity…": "Змяніць маю ідэнтычнасць…",
"Change my password": "Змяніць мой пароль",
"Change password": "Змяніць пароль",
"Clear": "Ачысціць",
"Click to select": "Націсніце, каб выбраць",
"Click to upload": "Націсніце, каб запампаваць",
"Close": "Закрыць",
"Close comments for all (except for admins)": "Закрыць каментарыі для ўсіх (акрамя адміністрацыі)",
"Closed": "Закрыта",
"Comment deleted": "Каментарый выдалены",
"Comment from @{username} reported": "Паведамленне пра праблемы з каментарыям @{username} дасланае",
"Comments": "Каментарыі",
"Comments have been closed.": "Каментарыі закрытыя.",
"Confirm my particpation": "Пацвердзіць мой удзел",
"Confirmed: Will happen": "Пацверджана: адбудзецца",
"Continue editing": "Працягнуць рэдагаванне",
"Country": "Краіна",
"Create": "Стварыць",
"Create a new event": "Стварыць новую падзею",
"Create a new group": "Стварыць новую групу",
"Create a new identity": "Стварыць новую ідэнтычнасць",
"Create and manage several identities from the same account": "Стварайце некалькі ідэнтычнасцяў і кіруйце імі з аднаго ўліковага запісу",
"Create group": "Стварыць групу",
"Create my event": "Стварыць падзею",
"Create my group": "Стварыць групу",
"Create my profile": "Стварыць профіль",
"Create token": "Стварыць токен",
"Create, edit or delete events": "Стварайце, рэдагуйце і выдаляйце падзеі",
"Creator": "Стваральнік/стваральніца",
"Current identity has been changed to {identityName} in order to manage this event.": "Бягучая ідэнтычнасць змененая на {identityName}, каб можна было рэдагаваць гэту падзею.",
"Dashboard": "Панэль кіравання",
"Date": "Дата",
"Date and time settings": "Наладкі даты і часу",
"Date parameters": "Параметры даты",
"Delete": "Выдаліць",
"Delete Comment": "Выдаліць каментарый",
"Delete Event": "Выдаліць падзею",
"Delete event": "Выдаліць падзею",
"Delete this identity": "Выдаліць гэту ідэнтычнасць",
"Delete your identity": "Выдаліць ідэнтычнасць",
"Delete {eventTitle}": "Выдаліць {eventTitle}",
"Delete {preferredUsername}": "Выдаліць {preferredUsername}",
"Deleting comment": "Выдаліць каментарый",
"Deleting event": "Выдаліць падзею",
"Description": "Апісанне",
"Didn't receive the instructions ?": "Не атрымалі інструкцыі?",
"Display name": "Адлюстравальнае імя",
"Display participation price": "Паказваць цану ўдзелу",
"Domain": "Дамен",
"Draft": "Чарнавік",
"Drafts": "Чарнавікі",
"Edit": "Рэдагаваць",
"Eg: Stockholm, Dance, Chess…": "Напр.: Стакгольм, танцы, шахматы…",
"Either the account is already validated, either the validation token is incorrect.": "Або уліковы запіс ужо пацверджаны, або апазнавальны код для пацвярджэння некарэктны.",
"Email": "Электронная пошта",
"Ends on…": "Заканчваецца…",
"Enjoy discovering Mobilizon!": "Зычым прыемнага знаёмства з функцыямі Mobilizon!",
"Enter the link URL": "Увядзіце адрас URL",
"Error while communicating with the server.": "Памылка падчас звязку з серверам.",
"Error while saving report.": "Памылка падчас запісу паведамлення пра праблемы.",
"Error while validating account": "Памылка падчас пацвярджэння ўліковага запісу",
"Event": "Падзея",
"Event already passed": "Падзея ўжо прайшла",
"Event cancelled": "Падзея адмененая",
"Event creation": "Стварэнне падзеі",
"Event edition": "Рэдагаванне падзеі",
"Event list": "Спіс падзей",
"Event not found.": "Падзея не знойдзеная.",
"Event page settings": "Наладкі старонкі падзеі",
"Event to be confirmed": "Падзея чакае пацвярджэння",
"Event {eventTitle} deleted": "Падзея {eventTitle} выдаленая",
"Event {eventTitle} reported": "Паведамленне пра праблемы з падзеяй {eventTitle} дасланае",
"Events": "Падзеі",
"Ex: test.mobilizon.org": "Напр.: test.mobilizon.org",
"Exclude": "Вылучыць",
"Explore": "Агляд",
"Featured events": "Прапанаваныя падзеі",
"Features": "Магчымасці",
"Find an address": "Знайсці адрас",
"Find an instance": "Знайсці сервер",
"Followers": "Падпісчыкі",
"Followings": "Падпіскі",
"For instance: London, Taekwondo, Architecture…": "Напр.: Мінск, тхэквандо, архітэктура…",
"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?": "І святкаванне дня нараджэння з сябрамі, і марш за клімату — для чаго б мы не збіраліся, наша арганізацыя <b>у пастцы платформ тэхнічных гігантаў</b>. Як арганізоўвацца, як сказаць «Я прыду» без <b>перадачы дадзеных</b> Фэйсбуку ці <b>абмежаванняў</b> ЎКантакце?",
"From the {startDate} at {startTime} to the {endDate}": "Ад {startDate}, {startTime} да {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Ад {startDate}, {startTime} да {endDate}, {endTime}",
"From the {startDate} to the {endDate}": "Ад {startDate} да {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Сход ⋅ Арганізацыя ⋅ Мабілізацыя",
"General information": "Агульная інфармацыя",
"Getting location": "Атрыманне месцапалажэння",
"Going as {name}": "Іду як {name}",
"Group List": "Спіс груп",
"Group full name": "Поўная назва групы",
"Group name": "Назва групы",
"Group {displayName} created": "Створаная група {displayName}",
"Groups": "Групы",
"Headline picture": "Ілюстрацыя да загалоўка",
"Hide replies": "Прыхаваць адказы",
"I create an identity": "Я ствараю ідэнтычнасць",
"I participate": "Я прымаю ўдзел",
"I want to approve every participation request": "Я хачу пацвярджаць кожны запыт на ўдзел",
"Identity {displayName} created": "Створаная ідэнтычнасць {displayName}",
"Identity {displayName} deleted": "Выдаленая ідэнтычнасць {displayName}",
"Identity {displayName} updated": "Ідэнтычнасць {displayName} абноўленая",
"If an account with this email exists, we just sent another confirmation email to {email}": "Калі ўліковы запіс з гэтым адрасам існуе, мы толькі што даслалі ліст на {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Калі гэтая ідэнтычнасць — адміністратар нейкіх груп, спачатку трэба выдаліць гэтыя групы, а потым можна будзе выдаліць гэта ідэнтычнасць.",
"Impossible to login, your email or password seems incorrect.": "Немагчыма ўвайсці, памылка ці ў адрасе, ці ў паролі.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Пакуль што разумейце, што гэта праграма (пакуль што) недаробленая. Болей інфармацыі {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Mobilizon дазваляе супольнасцям вызваліцца ад паслуг тэхнічных гігантаў і стварыць<b>уласную платформу для падзей</b>.",
"Instances": "Серверы",
"Join {instance}, a Mobilizon instance": "Прыяднайцеся да {instance}, сервера Mobilizon",
"Last published event": "Апошняя апублікаваная падзея",
"Last week": "На мінулым тыдні",
"Learn more": "Даведацца болей",
"Learn more about Mobilizon": "Даведацца болей аб Mobilizon",
"Leave event": "Выйсці з падзеі",
"Leaving event \"{title}\"": "Выхад з падзеі «{title}»",
"Let's create a new common": "Давайце створым новыя магчымасці для ўсіх",
"License": "Ліцэнзія",
"Limited number of places": "Абмежаваная колькасць месцаў",
"Load more": "Паказаць болей",
"Locality": "Месца",
"Log in": "Увайсці",
"Log out": "Выйсці",
"Login": "Увайсці",
"Login on Mobilizon!": "Уваход у Mobilizon!",
"Manage participations": "Кіраванне ўдзеламі",
"Mark as resolved": "Пазначыць як гатовае",
"Members": "Сябры",
"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 — гэта вольнае праграмнае забеспячэнне, якое дазваляе супольнасцям стварыць<b>уласную прастору</b> для публікацыі падзей, каб не залежаць ад тэхнічных гігантаў.",
"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 зараз распрацоўваецца, мы будзем рэгулярна абнаўляць гэты сайт і дадаваць магчымасці да выхаду <b>версіі праграмы 1 у першай палове 2020 года</b>.",
"Mobilizons licence": "Ліцэнзія Mobilizon",
"Moderated comments (shown after approval)": "Каментарыі ў мадэрацыі (з'явяцца пасля адабрэння)",
"My account": "Мой уліковы запіс",
"My events": "Мае падзеі",
"My identities": "Мае ідэнтычнасці",
"Name": "Імя",
"New note": "Новая нататка",
"New password": "Новы пароль",
"No actors found": "Дзеячы не знойдзеныя",
"No address defined": "Адрас не вызначаны",
"No closed reports yet": "Пакуль што закрытых паведамленняў пра праблемы няма",
"No comment": "Без каментарыяў",
"No comments yet": "Каментарыяў пакуль што няма",
"No end date": "Без даты заканчэння",
"No events found": "Падзеі не знойдзеныя",
"No group found": "Групы не знойдзеныя",
"No groups found": "Групы не знойдзеныя",
"No instance follows your instance yet.": "Сервераў, якія падпісаныя на ваш сервер, пакуль што няма.",
"No instance to approve|Approve instance|Approve {number} instances": "Няма сервераў для ўхвалення|Ухваліць сервер|Ухваліць {number} сервера|Ухваліць {number} сервераў",
"No instance to reject|Reject instance|Reject {number} instances": "Няма серверам для адмаўлення|Адмовіць серверу|Адмовіць {number} серверам|Адмовіць {number} серверам",
"No instance to remove|Remove instance|Remove {number} instances": "Няма сервераў для выдалення|Выдаліць сервер|Выдаліць {number} сервера|Выдаліць {number} сервера",
"No open reports yet": "Адкрытых паведамленняў пра праблемы няма",
"No resolved reports yet": "Вырашаных праблем, пра якія былі паведамленні, няма",
"No results for \"{queryText}\"": "Рэзультатаў па «{queryText}» няма",
"No user account with this email was found. Maybe you made a typo?": "Уліковых запісаў з гэтым адрасам электроннай пошты не знойдзена. Памылка друку?",
"Notes": "Нататкі",
"Number of places": "Колькасць месцаў",
"OK": "OK",
"Old password": "Стары пароль",
"Register for an event by choosing one of your identities": "Рэгіструйцеся на падзеі, выбіраючы любую з сваіх ідэнтычнасцяў",
"This is a demonstration site to test the beta version of Mobilizon.": "Гэта дэманстрацыйны сайт для праверкі бэта-версіі Mobilizon."
}

View File

@@ -1,445 +1,445 @@
{
"<b>Please do not use it in any real way.</b>": "<b>No ho facis servir més que proves, sisplau</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Una eina senzilla, emancipatòria i ètica per a reunir-nos, organitzar-nos i mobilitzar-nos.",
"A validation email was sent to {email}": "S'ha enviat un mail de validació a {email}",
"Abandon edition": "Canceŀla l'edició",
"About": "Quant a",
"About Mobilizon": "Quant a Mobilizon",
"About this event": "Sobre aquesta activitat",
"About this instance": "Quant a aquesta instància",
"Accepted": "Acceptada",
"Account": "Compte",
"Account settings": "Ajustaments de compte",
"Add": "Afegeix",
"Add a note": "Afegeix una nota",
"Add an address": "Afegeix una adreça",
"Add an instance": "Afegeix una instància",
"Add some tags": "Afegeix algunes etiquetes",
"Add to my calendar": "Afegeix al meu calendari",
"Additional comments": "Altres comentaris",
"Admin": "Administrador",
"Admin settings successfully saved.": "La configuració de l'administrador s'ha desat correctament.",
"Administration": "Administració",
"All the places have already been taken": "No hi ha més places disponibles|Hi ha una plaça disponible|Hi ha {places} disponibles",
"Allow all comments": "Permet tots els comentaris",
"Allow registrations": "Permetre registres",
"An error has occurred.": "Hi ha hagut un error.",
"Anonymous participant": "Participant anònim",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Els participants anònims hauran de confirmar la seva participació a través del correu electrònic.",
"Anonymous participations": "Participacions anònimes",
"Approve": "Aprova",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Segur que voleu suprimir tot el compte? Ho perdràs tot. Les identitats, la configuració, els esdeveniments creats, els missatges i les participacions desapareixeran per sempre.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Segur que vols <b>esborrar</b> aquest comentari? Aquesta acció és irreversible.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Segur que vols <b>esborrar</b> aquesta activitat? Aquesta acció és irreversible. En comptes d'això, pots parlar amb la persona creadora de l'activitat o modificar l'activitat.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Segur que vols esborrar aquesta activitat? Perdràs tots els canvis.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Segur que vols canceŀlar l'edició? Perdràs tots els canvis que hagis fet.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Segur que vols deixar de participar a l'activitat \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Segur que vols esborrar aquesta activitat? Aquesta acció és irreversible.",
"Avatar": "Avatar",
"Back to previous page": "Tornar a la pàgina anterior",
"Before you can login, you need to click on the link inside it to validate your account": "Per a validar el compte i poder entrar, has de clicar l'enllaç que t'hem enviat en el mail",
"By @{username}": "De @{username}",
"Cancel": "Canceŀla",
"Cancel anonymous participation": "Cancelar la participació anònima",
"Cancel creation": "Canceŀla la creació",
"Cancel edition": "Canceŀla l'edició",
"Cancel my participation request…": "Canceŀla la meva soŀlicitud de participació…",
"Cancel my participation…": "Canceŀla la meva participació…",
"Cancelled: Won't happen": "Canceŀlada: No es farà",
"Category": "Categoria",
"Change": "Canvia-la",
"Change my email": "Canviar el meu correu",
"Change my identity…": "Canvia la meva identitat…",
"Change my password": "Canvia la contrasenya",
"Change password": "Canvia la contrasenya",
"Clear": "Esborra",
"Click to select": "Clica per triar",
"Click to upload": "Clica per pujar",
"Close": "Deshabilita",
"Close comments for all (except for admins)": "Deshabilita els comentaris per a tothom excepte admins",
"Closed": "Deshabilitats",
"Comment deleted": "S'ha esborrat el comentari",
"Comment from @{username} reported": "S'ha denunciat un comentari de @{username}",
"Comments": "Comentaris",
"Comments have been closed.": "S'han tancat els comentaris.",
"Confirm my participation": "Confirmar la meva participació",
"Confirm my particpation": "Confirma la meva participació",
"Confirmed: Will happen": "Confirmada: Es farà",
"Continue editing": "Continua editant",
"Country": "País/estat",
"Create": "Crea",
"Create a new event": "Crea una activitat nova",
"Create a new group": "Crea un grup nou",
"Create a new identity": "Crea una nova identitat",
"Create and manage several identities from the same account": "Crea i gestiona diverses identitats des del mateix compte",
"Create group": "Crea un grup",
"Create my event": "Crea l'activitat",
"Create my group": "Crea el grup",
"Create my profile": "Crea el perfil",
"Create token": "Crea un token",
"Create, edit or delete events": "Crea, edita o esborra activitats",
"Creator": "Identitat creadora",
"Current identity has been changed to {identityName} in order to manage this event.": "La identitat actual ha canviat a a {identityName} per tal de gestionar aquesta activitat.",
"Current page": "Pàgina actual",
"Custom": "Personalitzar",
"Custom URL": "URL personalitzada",
"Custom text": "Text personalitzat",
"Dashboard": "Tauler de control",
"Date": "Data",
"Date and time settings": "Configuració de data i hora",
"Date parameters": "Paràmetres de la data",
"Default": "Predeterminats",
"Default Mobilizon.org terms": "Termes predeterminats de Mobilizon.org",
"Delete": "Esborra-ho",
"Delete Comment": "Esborra el comentari",
"Delete Event": "Esborra l'activitat",
"Delete account": "Eliminar el compte",
"Delete event": "Esborra l'activitat",
"Delete everything": "Eliminar-ho tot",
"Delete my account": "Eliminar el meu compte",
"Delete this identity": "Esborra aquesta identitat",
"Delete your identity": "Esborra la teva identitat",
"Delete {eventTitle}": "Esborra {eventTitle}",
"Delete {preferredUsername}": "Esborra {preferredUsername}",
"Deleting comment": "S'està esborrant el comentari",
"Deleting event": "S'està esborrant l'activitat",
"Deleting my account will delete all of my identities.": "Al suprimir el compte, se suprimeixen totes les identitats.",
"Deleting your Mobilizon account": "Eliminar el vostre compte de Mobilizon",
"Description": "Descripció",
"Didn't receive the instructions ?": "No has rebut les instruccions?",
"Display name": "Nom per mostrar",
"Display participation price": "Preu per participar",
"Domain": "Domini",
"Draft": "Esborrany",
"Drafts": "Esborranys",
"Edit": "Edita",
"Eg: Stockholm, Dance, Chess…": "Ex.: Vilafranca, dansa, escacs…",
"Either on the {instance} instance or on another instance.": "Ja sigui a la instància {instant} o a una altra instància.",
"Either the account is already validated, either the validation token is incorrect.": "O bé el compte ja ha estat validat, o bé el codi de validació és incorrecte.",
"Either the email has already been changed, either the validation token is incorrect.": "O el correu electrònic ja s'ha canviat, o el testimoni de validació és incorrecte.",
"Either the participation has already been validated, either the validation token is incorrect.": "O la participació ja s'ha validat o bé el testimoni de validació és incorrecte.",
"Email": "Email",
"Ends on…": "Acaba al…",
"Enjoy discovering Mobilizon!": "Que gaudeixis explorant Mobilizon!",
"Enter the link URL": "Introdueix la URL de l'enllaç",
"Error while changing email": "Error al canviar el correu electrònic",
"Error while communicating with the server.": "S'ha produït un error a l'hora de comunicar-se amb el servidor.",
"Error while saving report.": "S'ha produït un error a l'hora de desar la denúncia.",
"Error while validating account": "S'ha produït un error a l'hora de validar el compte",
"Error while validating participation": "Error al validar la participació",
"Event": "Activitat",
"Event already passed": "L'activitat ja ha passat",
"Event cancelled": "S'ha canceŀlat l'activitat",
"Event creation": "Crear esdeveniment",
"Event edition": "Edició de l'esdeveniment",
"Event list": "Llista d'esdeveniments",
"Event not found.": "No s'ha trobat l'activitat.",
"Event page settings": "Configuració de la pàgina d'activitat",
"Event to be confirmed": "L'activitat no està confirmada",
"Event {eventTitle} deleted": "S'ha esborrat {eventTitle}",
"Event {eventTitle} reported": "S'ha denunciat {eventTitle}",
"Events": "Activitats",
"Ex: test.mobilizon.org": "Ex.: test.mobilizon.org",
"Exclude": "Exclou",
"Explore": "Explora",
"Failed to save admin settings": "Error al guardar la configuració d'administració",
"Featured events": "Activitats destacades",
"Features": "Característiques",
"Federation": "Federació",
"Find an address": "Cerca una adreça",
"Find an instance": "Cerca una instància",
"Followers": "Seguidors/es",
"Followings": "Seguint",
"For instance: London, Taekwondo, Architecture…": "Per exemple: Lleida, Ioga, Història…",
"Forgot your password ?": "Has oblidat la contrasenya?",
"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?": "Des d'una festa d'aniversari amb amistats i família, a una manifestació contra el canvi climàtic, ara mateix, les nostres trobades estan <b>atrapades dins de plataformes de gegants de la informàtica</b>. Com podem organitzar, clicar \"Hi aniré\", sense <b>proporcionar dades privades</b> a Facebook o bé <b>quedar-nos lligades</b> a Meetup?",
"From the {startDate} at {startTime} to the {endDate}": "Des de {startDate} a {startTime} fins a {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Des de {startDate} a {startTime} fins a {endDate} a {endTime}",
"From the {startDate} to the {endDate}": "Des de {startDate} fins a {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Trobem-nos ⋅ Organitzem-nos ⋅ Mobilitzem-nos",
"General": "General",
"General information": "Informació general",
"Getting location": "Obtenció d'ubicació",
"Go": "Anar",
"Going as {name}": "Hi assisteixes com a {name}",
"Group List": "Llista del grup",
"Group full name": "Nom llarg del grup",
"Group name": "Nom del grup",
"Group {displayName} created": "S'ha creat el grup {displayName}",
"Groups": "Grups",
"Headline picture": "Imatge de capçalera",
"Hide replies": "Amaga les respostes",
"I create an identity": "Creo una identitat",
"I don't have a Mobilizon account": "No tinc un compte de Mobilizon",
"I have a Mobilizon account": "Tinc un compte de Mobilizon",
"I have an account on another Mobilizon instance.": "Tinc un compte de Mobilizon d'una altra instància.",
"I participate": "Participo",
"I want to allow people to participate without an account.": "Vull permetre que tothom. participi sense un compte.",
"I want to approve every participation request": "Vull aprovar cada soŀlicitud de participació",
"Identity {displayName} created": "S'ha creat la identitat {displayName}",
"Identity {displayName} deleted": "S'ha esborrat la identitat {displayName}",
"Identity {displayName} updated": "S'ha actualitzat la identitat {displayName}",
"If an account with this email exists, we just sent another confirmation email to {email}": "Si existeix un compte amb aquest email, simplement enviem un altre email de confirmació a {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Si aquesta identitat és l'única administradora d'algun grup, has d'esborrar els grups abans de poder esborrar la identitat.",
"If you want, you may send a message to the event organizer here.": "Si voleu, aquí podeu enviar un missatge a l'organitzador d'esdeveniments.",
"Impossible to login, your email or password seems incorrect.": "No s'ha pogut iniciar la sessió, el mail o contrasenya semblen incorrectes.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Mentrestant, tingues en compte que el software no està acabat, encara. Més info {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Instaŀlar Mobilizon permet a les comunitats d'alliberar-se dels serveis de les grans multinacionals creant <b>la seva pròpia agenda coŀlaborativa</b>.",
"Instance Description": "Descripció de la instància",
"Instance Name": "Nom de la instància",
"Instance Terms": "Condiciones de la instància",
"Instance Terms Source": "Font de les condicions de la instància",
"Instance Terms URL": "URL de les condicions de la instància",
"Instance settings": "Configuracions de la instància",
"Instances": "Instàncies",
"Join {instance}, a Mobilizon instance": "Uneix-te a {instance}, una instància de Mobilizon",
"Last published event": "Última activitat publicada",
"Last week": "La setmana passada",
"Learn more": "Més informació",
"Learn more about Mobilizon": "Més informació sobre Mobilizon",
"Leave event": "Deixar lesdeveniment",
"Leaving event \"{title}\"": "Deixar lesdeveniment \"{title}\"",
"Let's create a new common": "Creem un nou procomú",
"License": "Llicència",
"Limited number of places": "Places limitades",
"Load more": "Carrega'n més",
"Locality": "Localitat",
"Log in": "Inicia sessió",
"Log out": "Tanca la sessió",
"Login": "Inicia sessió",
"Login on Mobilizon!": "Entra a Mobilizon!",
"Login on {instance}": "Connectar-se a",
"Manage participations": "Gestiona les participacions",
"Mark as resolved": "Marca com resolta",
"Members": "Membres",
"Message": "Missatge",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon és una xarxa federada. Podeu interactuar amb aquest esdeveniment des dun servidor diferent.",
"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 és una peça de programari lliure que permet a les comunitats de crear <b>els seus propis espais</b> per publicar activitats per tal d'emancipar-se més dels gegants tecnològics.",
"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 està en desenvolupament. Hi anirem afegint funcionalitats amb actualitzacions freqüents fins a la <b>versió 1.0, a la primera meitat del 2020%</b>.",
"Mobilizons licence": "Llicència de Mobilizon",
"Moderated comments (shown after approval)": "Comentaris moderats (mostrats després de ser aprovats)",
"Moderation": "Moderació",
"Moderation log": "Registre de la moderació",
"My account": "El meu compte",
"My events": "Les meves activitats",
"My identities": "Les meves identitats",
"Name": "Nom",
"New email": "Nou correu electrònic",
"New note": "Nota nova",
"New password": "Contrasenya nova",
"New profile": "Nou perfil",
"Next page": "Pàgina següent",
"No actors found": "No s'ha trobat cap actor",
"No address defined": "No s'ha definit l'adreça",
"No closed reports yet": "Encara no hi ha informes tancats",
"No comment": "Sense comentaris",
"No comments yet": "Encara no hi ha comentaris",
"No end date": "Sense data de finalització",
"No events found": "No s'ha trobat cap esdeveniment",
"No group found": "No s'ha trobat cap grup",
"No groups found": "No s'han trobat grups",
"No instance follows your instance yet.": "Encara no hi ha cap instància que segueixi la teva.",
"No instance to approve|Approve instance|Approve {number} instances": "No hi ha cap instància per aprovar|Aprova la instància|Aprova les {number} instàncies",
"No instance to reject|Reject instance|Reject {number} instances": "No hi ha cap instància per rebutjar|Rebutja la instància|Rebutja les {number} instàncies",
"No instance to remove|Remove instance|Remove {number} instances": "No hi ha cap instància per esborrar|Esborra la instància|Esborra les {number} instàncies",
"No message": "Sense missatges",
"No notification settings yet": "Encara no hi ha configuració de les modificacions",
"No open reports yet": "No hi ha cap denúncia oberta",
"No resolved reports yet": "No hi ha cap denúncia resolta",
"No results for \"{queryText}\"": "No s'ha trobat cap resultat per \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "No s'ha trobat cap usuària amb aquest email. Comprova que l'hagis escrit bé?",
"Notes": "Notes",
"Number of places": "Nombre de places",
"OK": "OK",
"Old password": "Contrasenya vella",
"On {date}": "A {data}",
"On {date} ending at {endTime}": "A {date} i acaba a {endTime}",
"On {date} from {startTime} to {endTime}": "A {date} de {startTime} a {endTime}",
"On {date} starting at {startTime}": "A {date} i comença a {startTime}",
"One person is going": "Ningú s'hi ha apuntat|S'hi ha apuntat 1 persona|S'hi han apuntat {approved} persones",
"Only accessible through link and search (private)": "Només accessible amb enllaç i cerca (privat)",
"Only alphanumeric characters and underscores are supported.": "Només acceptem caràcters alfanumèrics i el guió baix.",
"Open": "Obre",
"Opened reports": "Denúncies obertes",
"Organized": "Organitzat",
"Organized by {name}": "Organitzat per {name}",
"Organizer": "Organitzadora",
"Otherwise this identity will just be removed from the group administrators.": "Sinó, aquesta identitat serà esborrada del grup d'administració.",
"Page limited to my group (asks for auth)": "La pàgina està restringida al meu grup (demana autenticació)",
"Page not found": "No s'ha trobat la pàgina",
"Participant already was rejected.": "El participant ja va ser rebutjat.",
"Participant has already been approved as participant.": "Aquesta persona ja ha estat aprovada com a participant.",
"Participants": "Participants",
"Participate": "Participa",
"Participation approval": "Aprovació de participació",
"Participation requested!": "S'ha enviat la soŀlicitud per participar-hi!",
"Password": "Contrasenya",
"Password (confirmation)": "Contrasenya (confirmació)",
"Password change": "Canvi de contrasenya",
"Password reset": "Restabliment de contrasenya",
"Past events": "Activitats passades",
"Pending": "Pendent",
"Pick an identity": "Tria una identitat",
"Please check your spam folder if you didn't receive the email.": "Comprova la teva carpeta de brossa si no t'ha arribat el mail a la safata d'entrada.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Si creus que és un error, contacta amb les administradores d'aquesta instància de Mobilizon.",
"Please make sure the address is correct and that the page hasn't been moved.": "Assegura't que l'adreça és correcta i que la pàgina no s'ha mogut.",
"Please read the full rules": "Llegeix totes les regles, sisplau",
"Please refresh the page and retry.": "Refresca la pàgina i torna-ho a provar.",
"Post a comment": "Publica un comentari",
"Post a reply": "Publica una resposta",
"Postal Code": "Codi postal",
"Private event": "Activitat privada",
"Private feeds": "Fluxos privats",
"Public RSS/Atom Feed": "Fluxos RSS/Atom públics",
"Public comment moderation": "Moderació de comentaris públics",
"Public event": "Activitat pública",
"Public feeds": "Fluxos públics",
"Public iCal Feed": "Flux iCal públic",
"Publish": "Publica",
"Published events": "Activitats publicades",
"RSS/Atom Feed": "Flux RSS/Atom",
"Read Framasofts statement of intent on the Framablog": "Llegeix la declaració d'intencions de Framasoft al seu blog Framablog",
"Region": "Regió",
"Register": "Registra't",
"Register an account on Mobilizon!": "Crea un compte a Mobilizon!",
"Register for an event by choosing one of your identities": "Apunta't a una activitat amb una de les teves identitats",
"Registration is currently closed.": "El registre està tancat.",
"Registrations are restricted by whitelisting.": "El registre de comptes està restringit per llista d'acceptació.",
"Reject": "Rebutja",
"Rejected": "Rebutjades",
"Rejected participations": "Participacions rebutjades",
"Reopen": "Reobre",
"Reply": "Respon",
"Report": "Denuncia",
"Report this comment": "Denuncia aquest comentari",
"Report this event": "Denuncia aquesta activitat",
"Reported": "Denunciada",
"Reported by": "Denunciada per",
"Reported by someone on {domain}": "Denunciada per algú a {domain}",
"Reported by {reporter}": "Denunciada per {reporter}",
"Reported identity": "Identitat denunciada",
"Reports": "Denúncies",
"Requests": "Soŀlicituds",
"Resend confirmation email": "Reenvia el correu de confirmació",
"Reset my password": "Restableix la meva contrasenya",
"Resolved": "Resolts",
"Save": "Desa",
"Save draft": "Desa l'esborrany",
"Search": "Cerca",
"Search events, groups, etc.": "Cerca activitats, grups, etc.",
"Search results: \"{search}\"": "Resultats de cerca: \"{search}\"",
"Searching…": "S'està cercant…",
"Send me an email to reset my password": "Envia'm un correu per restablir la meva contrasenya",
"Send me the confirmation email once again": "Envia'm el correu de confirmació un altre cop",
"Send the report": "Envia la denúncia",
"Share this event": "Comparteix aquesta activitat",
"Show map": "Mostra el mapa",
"Show remaining number of places": "Mostra el nombre de places disponibles",
"Show the time when the event begins": "Mostra l'hora d'inici de l'activitat",
"Show the time when the event ends": "Mostra l'hora final de l'activitat",
"Sign up": "Crea un compte",
"Software to the people": "El software serà sempre nostre",
"Starts on…": "Comença a …",
"Status": "Estat",
"Street": "Carrer",
"Tentative: Will be confirmed later": "Provisional: Ho confirmaran més endavant",
"The content came from another server. Transfer an anonymous copy of the report?": "El contingut ha arribat des d'un altre servidor. Vols enviar-hi una còpia anònima de la denúncia?",
"The current identity doesn't have any permission on this event. You should probably change it.": "La identitat actual no té cap permís sobre aquesta activitat. Pot ser que ho vulguis canviar.",
"The draft event has been updated": "S'ha actualitzat l'esborrany",
"The event has been created as a draft": "S'ha creat l'activitat com a esborrany",
"The event has been published": "S'ha publicat l'activitat",
"The event has been updated": "L'activitat s'ha actualitzat",
"The event has been updated and published": "L'activitat s'ha actualitzat i publicat",
"The event organizer didn't add any description.": "L'organització de l'activitat no ha afegit cap descripció.",
"The event title will be ellipsed.": "S'abreujarà el títol de l'activitat.",
"The page you're looking for doesn't exist.": "La pàgina que buscaves no existeix.",
"The password was successfully changed": "S'ha canviat amb èxit la contrasenya",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "S'enviarà la denúncia a les persones moderadores de la teva instància. Pots explicar aquí a sota per què denuncies aquest contingut.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "El compte al qual intentes accedir encara no està confirmat. Comprova el teu correu a la safata d'entrada i, si cal, a la de brossa.",
"There are {participants} participants.": "Hi ha {participants} participants.",
"These events may interest you": "Pot ser que t'interessin aquestes activitats",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Aquesta instaŀlació (o \"instància\") es pot {interconnect} fàcilment, gràcies al {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Aquesta instància no té el registre obert, però en pots buscar una altra.",
"This is a demonstration site to test the beta version of Mobilizon.": "Aquesta és una instància de proves i demostració de la versió beta de Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Això farà que s'esborrin o s'anonimitzin tots els continguts (activitats, comentaris, missatges, participacions…) que s'hagin creat des d'aquesta identitat.",
"Title": "Títol",
"To achieve your registration, please create a first identity profile.": "Per tal de completar el registre, has de crear un perfil d'identitat.",
"To change the world, change the software": "Per canviar el món, comença pel software",
"To confirm, type your event title \"{eventTitle}\"": "Per confirmar, escriu el títol de l'activitat \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Per confirmar, escriu el nom de la identitat \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transfereix a {outsideDomain}",
"Type": "Escriu",
"Unfortunately, this instance isn't opened to registrations": "Malauradament, aquesta instància no està oberta a nous comptes",
"Unfortunately, your participation request was rejected by the organizers.": "Malauradament, l'organització de l'activitat ha rebutjat la teva soŀlicitud de participació.",
"Unknown": "Desconegut",
"Unknown actor": "Agent desconegut/da",
"Unknown error.": "Error desconegut.",
"Unsaved changes": "Canvis sense desar",
"Upcoming": "Properament",
"Update event {name}": "Actualitza l'activitat {name}",
"Update my event": "Actualitza l'activitat",
"Updated": "S'ha actualitzat",
"Username": "Nom d'usuària",
"Users": "Usuàries",
"View a reply": "|Mostra la resposta|Mostra les {totalReplies} resposta",
"View event page": "Mostra la pàgina de l'activitat",
"View everything": "Mostra-ho tot",
"View page on {hostname} (in a new window)": "mostra la pàgina a {hostname} (s'obrirà en una pestanya nova)",
"Visible everywhere on the web (public)": "Visible a tot arreu (públic)",
"Waiting for organization team approval.": "Pendent de l'aprovació de l'equip d'organització.",
"Waiting list": "Llista d'espera",
"Warning": "Alerta",
"We just sent an email to {email}": "S'acaba d'enviar un correu 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>.": "Volem desenvolupar un <b>procomú digital</b>, que tothom pugui fer-se seu i que respecti la <b>privacitat i l'activisme per disseny</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.": "No podem canviar el món des de Facebook, les eines de l'amo no desmuntaran la casa de l'amo. L'eina que somiem no la desenvoluparà el capitalisme perquè no en podria treure rendiment. És una oportunitat per construir una internet millor.",
"Website / URL": "Web / URL",
"Welcome back {username}!": "Bentornat/da {username}!",
"Welcome back!": "Bentornat/da!",
"Welcome on your administration panel": "Benvingut/da al tauler d'administració",
"Welcome to Mobilizon, {username}!": "Benvingut/da a Mobilizon, {username}!",
"Who can view this event and participate": "Qui pot veure i participar en aquesta activitat",
"World map": "Mapamundi",
"Write something…": "Escriu alguna cosa …",
"You and one other person are going to this event": "Per ara ets l'única persona que hi assistirà|Tu i una altra persona hi assistireu|Tu i {approved} persones més hi assistireu.",
"You are already a participant of this event.": "Ja figures com a participant d'aquesta activitat.",
"You are already logged-in.": "Ja tens una sessió iniciada.",
"You can add tags by hitting the Enter key or by adding a comma": "Pots afegir etiquetes prement Enter o afegint una coma",
"You can try another search term or drag and drop the marker on the map": "Pots provar amb altres paraules de cerca o arrossegar l'indicador al mapa",
"You can't remove your last identity.": "No pots esborrar la teva única identitat.",
"You don't follow any instances yet.": "Encara no pots seguir cap instància.",
"You have been disconnected": "S'ha desconnectat la sessió",
"You have cancelled your participation": "Has canceŀlat la teva participació",
"You have one event in {days} days.": "No tens cap activitat en {days} dies|Tens una activitat en {days} dies.|Tens {count} activitats en {days} dies",
"You have one event today.": "No tens cap activitat avui|Avui tens una activitat|Avui tens {count} activitats",
"You have one event tomorrow.": "No tens cap activitat per demà|Demà tens una activitat|Demà tens {count} activitats",
"You may also ask to {resend_confirmation_email}.": "També pots demanar {resend_confirmation_email}.",
"You need to login.": "Has d'iniciar sessió.",
"Your account has been validated": "El teu compte ha estat validat",
"Your account is being validated": "El teu compte està sent validat",
"Your account is nearly ready, {username}": "El teu compte està gairebé apunt, {username}",
"Your email is not whitelisted, you can't register.": "El teu correu no està a la llista d'acceptats, no pots crear un compte.",
"Your local administrator resumed its policy:": "L'administració d'aquesta instància resumeix així la seva política:",
"Your participation has been confirmed": "S'ha confirmat la teva participació",
"Your participation has been rejected": "S'ha denegat la teva participació",
"Your participation has been requested": "S'ha soŀlicitat la teva participació",
"Your participation status has been changed": "Ha canviat l'estat de participació",
"[This comment has been deleted]": "[Comentari esborrat]",
"[deleted]": "[esborrat]",
"a decentralised federation protocol": "un protocol de descentralitzat de federació",
"as {identity}": "com a {identity}",
"e.g. 10 Rue Jangot": "ex.: 13 Rue del Percebe",
"firstDayOfWeek": "0",
"iCal Feed": "Flux iCal",
"interconnect with others like it": "interconnecta amb altres com aquest",
"its source code is public": "el codi font és públic",
"on our blog": "al nostre blog",
"resend confirmation email": "reenvia el mail de confirmació",
"respect of the fundamental freedoms": "respecte per les llibertats fonamentals",
"with another identity…": "amb una altra identitat…",
"{approved} / {total} seats": "{approved} / {total} places",
"{count} participants": "Cap participant per ara|Un/a participant|{count} participants",
"{count} requests waiting": "{count} soŀlicituds pendents",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garanteix {respect} de la gent que el farà servir . Com que {source}, qualsevol amb els coneixements adequats pot auditar-lo, cosa que en garanteix la transparència.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Les persones contribuïdores de Mobilizon {date} - Fet amb Elixir, Phoenix, VueJS, una mica d'amor i algunes setmanes",
"© The OpenStreetMap Contributors": "© Les persones contribuïdores d'OpenStreetMap"
"<b>Please do not use it in any real way.</b>": "<b>No ho facis servir més que proves, sisplau</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Una eina senzilla, emancipatòria i ètica per a reunir-nos, organitzar-nos i mobilitzar-nos.",
"A validation email was sent to {email}": "S'ha enviat un mail de validació a {email}",
"Abandon edition": "Canceŀla l'edició",
"About": "Quant a",
"About Mobilizon": "Quant a Mobilizon",
"About this event": "Sobre aquesta activitat",
"About this instance": "Quant a aquesta instància",
"Accepted": "Acceptada",
"Account": "Compte",
"Account settings": "Ajustaments de compte",
"Add": "Afegeix",
"Add a note": "Afegeix una nota",
"Add an address": "Afegeix una adreça",
"Add an instance": "Afegeix una instància",
"Add some tags": "Afegeix algunes etiquetes",
"Add to my calendar": "Afegeix al meu calendari",
"Additional comments": "Altres comentaris",
"Admin": "Administrador",
"Admin settings successfully saved.": "La configuració de l'administrador s'ha desat correctament.",
"Administration": "Administració",
"All the places have already been taken": "No hi ha més places disponibles|Hi ha una plaça disponible|Hi ha {places} disponibles",
"Allow all comments": "Permet tots els comentaris",
"Allow registrations": "Permetre registres",
"An error has occurred.": "Hi ha hagut un error.",
"Anonymous participant": "Participant anònim",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Els participants anònims hauran de confirmar la seva participació a través del correu electrònic.",
"Anonymous participations": "Participacions anònimes",
"Approve": "Aprova",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Segur que voleu suprimir tot el compte? Ho perdràs tot. Les identitats, la configuració, els esdeveniments creats, els missatges i les participacions desapareixeran per sempre.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Segur que vols <b>esborrar</b> aquest comentari? Aquesta acció és irreversible.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Segur que vols <b>esborrar</b> aquesta activitat? Aquesta acció és irreversible. En comptes d'això, pots parlar amb la persona creadora de l'activitat o modificar l'activitat.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Segur que vols esborrar aquesta activitat? Perdràs tots els canvis.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Segur que vols canceŀlar l'edició? Perdràs tots els canvis que hagis fet.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Segur que vols deixar de participar a l'activitat \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Segur que vols esborrar aquesta activitat? Aquesta acció és irreversible.",
"Avatar": "Avatar",
"Back to previous page": "Tornar a la pàgina anterior",
"Before you can login, you need to click on the link inside it to validate your account": "Per a validar el compte i poder entrar, has de clicar l'enllaç que t'hem enviat en el mail",
"By @{username}": "De @{username}",
"Cancel": "Canceŀla",
"Cancel anonymous participation": "Cancelar la participació anònima",
"Cancel creation": "Canceŀla la creació",
"Cancel edition": "Canceŀla l'edició",
"Cancel my participation request…": "Canceŀla la meva soŀlicitud de participació…",
"Cancel my participation…": "Canceŀla la meva participació…",
"Cancelled: Won't happen": "Canceŀlada: No es farà",
"Category": "Categoria",
"Change": "Canvia-la",
"Change my email": "Canviar el meu correu",
"Change my identity…": "Canvia la meva identitat…",
"Change my password": "Canvia la contrasenya",
"Change password": "Canvia la contrasenya",
"Clear": "Esborra",
"Click to select": "Clica per triar",
"Click to upload": "Clica per pujar",
"Close": "Deshabilita",
"Close comments for all (except for admins)": "Deshabilita els comentaris per a tothom excepte admins",
"Closed": "Deshabilitats",
"Comment deleted": "S'ha esborrat el comentari",
"Comment from @{username} reported": "S'ha denunciat un comentari de @{username}",
"Comments": "Comentaris",
"Comments have been closed.": "S'han tancat els comentaris.",
"Confirm my participation": "Confirmar la meva participació",
"Confirm my particpation": "Confirma la meva participació",
"Confirmed: Will happen": "Confirmada: Es farà",
"Continue editing": "Continua editant",
"Country": "País/estat",
"Create": "Crea",
"Create a new event": "Crea una activitat nova",
"Create a new group": "Crea un grup nou",
"Create a new identity": "Crea una nova identitat",
"Create and manage several identities from the same account": "Crea i gestiona diverses identitats des del mateix compte",
"Create group": "Crea un grup",
"Create my event": "Crea l'activitat",
"Create my group": "Crea el grup",
"Create my profile": "Crea el perfil",
"Create token": "Crea un token",
"Create, edit or delete events": "Crea, edita o esborra activitats",
"Creator": "Identitat creadora",
"Current identity has been changed to {identityName} in order to manage this event.": "La identitat actual ha canviat a a {identityName} per tal de gestionar aquesta activitat.",
"Current page": "Pàgina actual",
"Custom": "Personalitzar",
"Custom URL": "URL personalitzada",
"Custom text": "Text personalitzat",
"Dashboard": "Tauler de control",
"Date": "Data",
"Date and time settings": "Configuració de data i hora",
"Date parameters": "Paràmetres de la data",
"Default": "Predeterminats",
"Default Mobilizon.org terms": "Termes predeterminats de Mobilizon.org",
"Delete": "Esborra-ho",
"Delete Comment": "Esborra el comentari",
"Delete Event": "Esborra l'activitat",
"Delete account": "Eliminar el compte",
"Delete event": "Esborra l'activitat",
"Delete everything": "Eliminar-ho tot",
"Delete my account": "Eliminar el meu compte",
"Delete this identity": "Esborra aquesta identitat",
"Delete your identity": "Esborra la teva identitat",
"Delete {eventTitle}": "Esborra {eventTitle}",
"Delete {preferredUsername}": "Esborra {preferredUsername}",
"Deleting comment": "S'està esborrant el comentari",
"Deleting event": "S'està esborrant l'activitat",
"Deleting my account will delete all of my identities.": "Al suprimir el compte, se suprimeixen totes les identitats.",
"Deleting your Mobilizon account": "Eliminar el vostre compte de Mobilizon",
"Description": "Descripció",
"Didn't receive the instructions ?": "No has rebut les instruccions?",
"Display name": "Nom per mostrar",
"Display participation price": "Preu per participar",
"Domain": "Domini",
"Draft": "Esborrany",
"Drafts": "Esborranys",
"Edit": "Edita",
"Eg: Stockholm, Dance, Chess…": "Ex.: Vilafranca, dansa, escacs…",
"Either on the {instance} instance or on another instance.": "Ja sigui a la instància {instant} o a una altra instància.",
"Either the account is already validated, either the validation token is incorrect.": "O bé el compte ja ha estat validat, o bé el codi de validació és incorrecte.",
"Either the email has already been changed, either the validation token is incorrect.": "O el correu electrònic ja s'ha canviat, o el testimoni de validació és incorrecte.",
"Either the participation has already been validated, either the validation token is incorrect.": "O la participació ja s'ha validat o bé el testimoni de validació és incorrecte.",
"Email": "Email",
"Ends on…": "Acaba al…",
"Enjoy discovering Mobilizon!": "Que gaudeixis explorant Mobilizon!",
"Enter the link URL": "Introdueix la URL de l'enllaç",
"Error while changing email": "Error al canviar el correu electrònic",
"Error while communicating with the server.": "S'ha produït un error a l'hora de comunicar-se amb el servidor.",
"Error while saving report.": "S'ha produït un error a l'hora de desar la denúncia.",
"Error while validating account": "S'ha produït un error a l'hora de validar el compte",
"Error while validating participation": "Error al validar la participació",
"Event": "Activitat",
"Event already passed": "L'activitat ja ha passat",
"Event cancelled": "S'ha canceŀlat l'activitat",
"Event creation": "Crear esdeveniment",
"Event edition": "Edició de l'esdeveniment",
"Event list": "Llista d'esdeveniments",
"Event not found.": "No s'ha trobat l'activitat.",
"Event page settings": "Configuració de la pàgina d'activitat",
"Event to be confirmed": "L'activitat no està confirmada",
"Event {eventTitle} deleted": "S'ha esborrat {eventTitle}",
"Event {eventTitle} reported": "S'ha denunciat {eventTitle}",
"Events": "Activitats",
"Ex: test.mobilizon.org": "Ex.: test.mobilizon.org",
"Exclude": "Exclou",
"Explore": "Explora",
"Failed to save admin settings": "Error al guardar la configuració d'administració",
"Featured events": "Activitats destacades",
"Features": "Característiques",
"Federation": "Federació",
"Find an address": "Cerca una adreça",
"Find an instance": "Cerca una instància",
"Followers": "Seguidors/es",
"Followings": "Seguint",
"For instance: London, Taekwondo, Architecture…": "Per exemple: Lleida, Ioga, Història…",
"Forgot your password ?": "Has oblidat la contrasenya?",
"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?": "Des d'una festa d'aniversari amb amistats i família, a una manifestació contra el canvi climàtic, ara mateix, les nostres trobades estan <b>atrapades dins de plataformes de gegants de la informàtica</b>. Com podem organitzar, clicar \"Hi aniré\", sense <b>proporcionar dades privades</b> a Facebook o bé <b>quedar-nos lligades</b> a Meetup?",
"From the {startDate} at {startTime} to the {endDate}": "Des de {startDate} a {startTime} fins a {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Des de {startDate} a {startTime} fins a {endDate} a {endTime}",
"From the {startDate} to the {endDate}": "Des de {startDate} fins a {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Trobem-nos ⋅ Organitzem-nos ⋅ Mobilitzem-nos",
"General": "General",
"General information": "Informació general",
"Getting location": "Obtenció d'ubicació",
"Go": "Anar",
"Going as {name}": "Hi assisteixes com a {name}",
"Group List": "Llista del grup",
"Group full name": "Nom llarg del grup",
"Group name": "Nom del grup",
"Group {displayName} created": "S'ha creat el grup {displayName}",
"Groups": "Grups",
"Headline picture": "Imatge de capçalera",
"Hide replies": "Amaga les respostes",
"I create an identity": "Creo una identitat",
"I don't have a Mobilizon account": "No tinc un compte de Mobilizon",
"I have a Mobilizon account": "Tinc un compte de Mobilizon",
"I have an account on another Mobilizon instance.": "Tinc un compte de Mobilizon d'una altra instància.",
"I participate": "Participo",
"I want to allow people to participate without an account.": "Vull permetre que tothom. participi sense un compte.",
"I want to approve every participation request": "Vull aprovar cada soŀlicitud de participació",
"Identity {displayName} created": "S'ha creat la identitat {displayName}",
"Identity {displayName} deleted": "S'ha esborrat la identitat {displayName}",
"Identity {displayName} updated": "S'ha actualitzat la identitat {displayName}",
"If an account with this email exists, we just sent another confirmation email to {email}": "Si existeix un compte amb aquest email, simplement enviem un altre email de confirmació a {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Si aquesta identitat és l'única administradora d'algun grup, has d'esborrar els grups abans de poder esborrar la identitat.",
"If you want, you may send a message to the event organizer here.": "Si voleu, aquí podeu enviar un missatge a l'organitzador d'esdeveniments.",
"Impossible to login, your email or password seems incorrect.": "No s'ha pogut iniciar la sessió, el mail o contrasenya semblen incorrectes.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Mentrestant, tingues en compte que el software no està acabat, encara. Més info {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Instaŀlar Mobilizon permet a les comunitats d'alliberar-se dels serveis de les grans multinacionals creant <b>la seva pròpia agenda coŀlaborativa</b>.",
"Instance Description": "Descripció de la instància",
"Instance Name": "Nom de la instància",
"Instance Terms": "Condiciones de la instància",
"Instance Terms Source": "Font de les condicions de la instància",
"Instance Terms URL": "URL de les condicions de la instància",
"Instance settings": "Configuracions de la instància",
"Instances": "Instàncies",
"Join {instance}, a Mobilizon instance": "Uneix-te a {instance}, una instància de Mobilizon",
"Last published event": "Última activitat publicada",
"Last week": "La setmana passada",
"Learn more": "Més informació",
"Learn more about Mobilizon": "Més informació sobre Mobilizon",
"Leave event": "Deixar lesdeveniment",
"Leaving event \"{title}\"": "Deixar lesdeveniment \"{title}\"",
"Let's create a new common": "Creem un nou procomú",
"License": "Llicència",
"Limited number of places": "Places limitades",
"Load more": "Carrega'n més",
"Locality": "Localitat",
"Log in": "Inicia sessió",
"Log out": "Tanca la sessió",
"Login": "Inicia sessió",
"Login on Mobilizon!": "Entra a Mobilizon!",
"Login on {instance}": "Connectar-se a",
"Manage participations": "Gestiona les participacions",
"Mark as resolved": "Marca com resolta",
"Members": "Membres",
"Message": "Missatge",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon és una xarxa federada. Podeu interactuar amb aquest esdeveniment des dun servidor diferent.",
"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 és una peça de programari lliure que permet a les comunitats de crear <b>els seus propis espais</b> per publicar activitats per tal d'emancipar-se més dels gegants tecnològics.",
"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 està en desenvolupament. Hi anirem afegint funcionalitats amb actualitzacions freqüents fins a la <b>versió 1.0, a la primera meitat del 2020%</b>.",
"Mobilizons licence": "Llicència de Mobilizon",
"Moderated comments (shown after approval)": "Comentaris moderats (mostrats després de ser aprovats)",
"Moderation": "Moderació",
"Moderation log": "Registre de la moderació",
"My account": "El meu compte",
"My events": "Les meves activitats",
"My identities": "Les meves identitats",
"Name": "Nom",
"New email": "Nou correu electrònic",
"New note": "Nota nova",
"New password": "Contrasenya nova",
"New profile": "Nou perfil",
"Next page": "Pàgina següent",
"No actors found": "No s'ha trobat cap actor",
"No address defined": "No s'ha definit l'adreça",
"No closed reports yet": "Encara no hi ha informes tancats",
"No comment": "Sense comentaris",
"No comments yet": "Encara no hi ha comentaris",
"No end date": "Sense data de finalització",
"No events found": "No s'ha trobat cap esdeveniment",
"No group found": "No s'ha trobat cap grup",
"No groups found": "No s'han trobat grups",
"No instance follows your instance yet.": "Encara no hi ha cap instància que segueixi la teva.",
"No instance to approve|Approve instance|Approve {number} instances": "No hi ha cap instància per aprovar|Aprova la instància|Aprova les {number} instàncies",
"No instance to reject|Reject instance|Reject {number} instances": "No hi ha cap instància per rebutjar|Rebutja la instància|Rebutja les {number} instàncies",
"No instance to remove|Remove instance|Remove {number} instances": "No hi ha cap instància per esborrar|Esborra la instància|Esborra les {number} instàncies",
"No message": "Sense missatges",
"No notification settings yet": "Encara no hi ha configuració de les modificacions",
"No open reports yet": "No hi ha cap denúncia oberta",
"No resolved reports yet": "No hi ha cap denúncia resolta",
"No results for \"{queryText}\"": "No s'ha trobat cap resultat per \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "No s'ha trobat cap usuària amb aquest email. Comprova que l'hagis escrit bé?",
"Notes": "Notes",
"Number of places": "Nombre de places",
"OK": "OK",
"Old password": "Contrasenya vella",
"On {date}": "A {data}",
"On {date} ending at {endTime}": "A {date} i acaba a {endTime}",
"On {date} from {startTime} to {endTime}": "A {date} de {startTime} a {endTime}",
"On {date} starting at {startTime}": "A {date} i comença a {startTime}",
"One person is going": "Ningú s'hi ha apuntat|S'hi ha apuntat 1 persona|S'hi han apuntat {approved} persones",
"Only accessible through link and search (private)": "Només accessible amb enllaç i cerca (privat)",
"Only alphanumeric characters and underscores are supported.": "Només acceptem caràcters alfanumèrics i el guió baix.",
"Open": "Obre",
"Opened reports": "Denúncies obertes",
"Organized": "Organitzat",
"Organized by {name}": "Organitzat per {name}",
"Organizer": "Organitzadora",
"Otherwise this identity will just be removed from the group administrators.": "Sinó, aquesta identitat serà esborrada del grup d'administració.",
"Page limited to my group (asks for auth)": "La pàgina està restringida al meu grup (demana autenticació)",
"Page not found": "No s'ha trobat la pàgina",
"Participant already was rejected.": "El participant ja va ser rebutjat.",
"Participant has already been approved as participant.": "Aquesta persona ja ha estat aprovada com a participant.",
"Participants": "Participants",
"Participate": "Participa",
"Participation approval": "Aprovació de participació",
"Participation requested!": "S'ha enviat la soŀlicitud per participar-hi!",
"Password": "Contrasenya",
"Password (confirmation)": "Contrasenya (confirmació)",
"Password change": "Canvi de contrasenya",
"Password reset": "Restabliment de contrasenya",
"Past events": "Activitats passades",
"Pending": "Pendent",
"Pick an identity": "Tria una identitat",
"Please check your spam folder if you didn't receive the email.": "Comprova la teva carpeta de brossa si no t'ha arribat el mail a la safata d'entrada.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Si creus que és un error, contacta amb les administradores d'aquesta instància de Mobilizon.",
"Please make sure the address is correct and that the page hasn't been moved.": "Assegura't que l'adreça és correcta i que la pàgina no s'ha mogut.",
"Please read the full rules": "Llegeix totes les regles, sisplau",
"Please refresh the page and retry.": "Refresca la pàgina i torna-ho a provar.",
"Post a comment": "Publica un comentari",
"Post a reply": "Publica una resposta",
"Postal Code": "Codi postal",
"Private event": "Activitat privada",
"Private feeds": "Fluxos privats",
"Public RSS/Atom Feed": "Fluxos RSS/Atom públics",
"Public comment moderation": "Moderació de comentaris públics",
"Public event": "Activitat pública",
"Public feeds": "Fluxos públics",
"Public iCal Feed": "Flux iCal públic",
"Publish": "Publica",
"Published events": "Activitats publicades",
"RSS/Atom Feed": "Flux RSS/Atom",
"Read Framasofts statement of intent on the Framablog": "Llegeix la declaració d'intencions de Framasoft al seu blog Framablog",
"Region": "Regió",
"Register": "Registra't",
"Register an account on Mobilizon!": "Crea un compte a Mobilizon!",
"Register for an event by choosing one of your identities": "Apunta't a una activitat amb una de les teves identitats",
"Registration is currently closed.": "El registre està tancat.",
"Registrations are restricted by whitelisting.": "El registre de comptes està restringit per llista d'acceptació.",
"Reject": "Rebutja",
"Rejected": "Rebutjades",
"Rejected participations": "Participacions rebutjades",
"Reopen": "Reobre",
"Reply": "Respon",
"Report": "Denuncia",
"Report this comment": "Denuncia aquest comentari",
"Report this event": "Denuncia aquesta activitat",
"Reported": "Denunciada",
"Reported by": "Denunciada per",
"Reported by someone on {domain}": "Denunciada per algú a {domain}",
"Reported by {reporter}": "Denunciada per {reporter}",
"Reported identity": "Identitat denunciada",
"Reports": "Denúncies",
"Requests": "Soŀlicituds",
"Resend confirmation email": "Reenvia el correu de confirmació",
"Reset my password": "Restableix la meva contrasenya",
"Resolved": "Resolts",
"Save": "Desa",
"Save draft": "Desa l'esborrany",
"Search": "Cerca",
"Search events, groups, etc.": "Cerca activitats, grups, etc.",
"Search results: \"{search}\"": "Resultats de cerca: \"{search}\"",
"Searching…": "S'està cercant…",
"Send me an email to reset my password": "Envia'm un correu per restablir la meva contrasenya",
"Send me the confirmation email once again": "Envia'm el correu de confirmació un altre cop",
"Send the report": "Envia la denúncia",
"Share this event": "Comparteix aquesta activitat",
"Show map": "Mostra el mapa",
"Show remaining number of places": "Mostra el nombre de places disponibles",
"Show the time when the event begins": "Mostra l'hora d'inici de l'activitat",
"Show the time when the event ends": "Mostra l'hora final de l'activitat",
"Sign up": "Crea un compte",
"Software to the people": "El software serà sempre nostre",
"Starts on…": "Comença a …",
"Status": "Estat",
"Street": "Carrer",
"Tentative: Will be confirmed later": "Provisional: Ho confirmaran més endavant",
"The content came from another server. Transfer an anonymous copy of the report?": "El contingut ha arribat des d'un altre servidor. Vols enviar-hi una còpia anònima de la denúncia?",
"The current identity doesn't have any permission on this event. You should probably change it.": "La identitat actual no té cap permís sobre aquesta activitat. Pot ser que ho vulguis canviar.",
"The draft event has been updated": "S'ha actualitzat l'esborrany",
"The event has been created as a draft": "S'ha creat l'activitat com a esborrany",
"The event has been published": "S'ha publicat l'activitat",
"The event has been updated": "L'activitat s'ha actualitzat",
"The event has been updated and published": "L'activitat s'ha actualitzat i publicat",
"The event organizer didn't add any description.": "L'organització de l'activitat no ha afegit cap descripció.",
"The event title will be ellipsed.": "S'abreujarà el títol de l'activitat.",
"The page you're looking for doesn't exist.": "La pàgina que buscaves no existeix.",
"The password was successfully changed": "S'ha canviat amb èxit la contrasenya",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "S'enviarà la denúncia a les persones moderadores de la teva instància. Pots explicar aquí a sota per què denuncies aquest contingut.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "El compte al qual intentes accedir encara no està confirmat. Comprova el teu correu a la safata d'entrada i, si cal, a la de brossa.",
"There are {participants} participants.": "Hi ha {participants} participants.",
"These events may interest you": "Pot ser que t'interessin aquestes activitats",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Aquesta instaŀlació (o \"instància\") es pot {interconnect} fàcilment, gràcies al {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Aquesta instància no té el registre obert, però en pots buscar una altra.",
"This is a demonstration site to test the beta version of Mobilizon.": "Aquesta és una instància de proves i demostració de la versió beta de Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Això farà que s'esborrin o s'anonimitzin tots els continguts (activitats, comentaris, missatges, participacions…) que s'hagin creat des d'aquesta identitat.",
"Title": "Títol",
"To achieve your registration, please create a first identity profile.": "Per tal de completar el registre, has de crear un perfil d'identitat.",
"To change the world, change the software": "Per canviar el món, comença pel software",
"To confirm, type your event title \"{eventTitle}\"": "Per confirmar, escriu el títol de l'activitat \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Per confirmar, escriu el nom de la identitat \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transfereix a {outsideDomain}",
"Type": "Escriu",
"Unfortunately, this instance isn't opened to registrations": "Malauradament, aquesta instància no està oberta a nous comptes",
"Unfortunately, your participation request was rejected by the organizers.": "Malauradament, l'organització de l'activitat ha rebutjat la teva soŀlicitud de participació.",
"Unknown": "Desconegut",
"Unknown actor": "Agent desconegut/da",
"Unknown error.": "Error desconegut.",
"Unsaved changes": "Canvis sense desar",
"Upcoming": "Properament",
"Update event {name}": "Actualitza l'activitat {name}",
"Update my event": "Actualitza l'activitat",
"Updated": "S'ha actualitzat",
"Username": "Nom d'usuària",
"Users": "Usuàries",
"View a reply": "|Mostra la resposta|Mostra les {totalReplies} resposta",
"View event page": "Mostra la pàgina de l'activitat",
"View everything": "Mostra-ho tot",
"View page on {hostname} (in a new window)": "mostra la pàgina a {hostname} (s'obrirà en una pestanya nova)",
"Visible everywhere on the web (public)": "Visible a tot arreu (públic)",
"Waiting for organization team approval.": "Pendent de l'aprovació de l'equip d'organització.",
"Waiting list": "Llista d'espera",
"Warning": "Alerta",
"We just sent an email to {email}": "S'acaba d'enviar un correu 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>.": "Volem desenvolupar un <b>procomú digital</b>, que tothom pugui fer-se seu i que respecti la <b>privacitat i l'activisme per disseny</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.": "No podem canviar el món des de Facebook, les eines de l'amo no desmuntaran la casa de l'amo. L'eina que somiem no la desenvoluparà el capitalisme perquè no en podria treure rendiment. És una oportunitat per construir una internet millor.",
"Website / URL": "Web / URL",
"Welcome back {username}!": "Bentornat/da {username}!",
"Welcome back!": "Bentornat/da!",
"Welcome on your administration panel": "Benvingut/da al tauler d'administració",
"Welcome to Mobilizon, {username}!": "Benvingut/da a Mobilizon, {username}!",
"Who can view this event and participate": "Qui pot veure i participar en aquesta activitat",
"World map": "Mapamundi",
"Write something…": "Escriu alguna cosa …",
"You and one other person are going to this event": "Per ara ets l'única persona que hi assistirà|Tu i una altra persona hi assistireu|Tu i {approved} persones més hi assistireu.",
"You are already a participant of this event.": "Ja figures com a participant d'aquesta activitat.",
"You are already logged-in.": "Ja tens una sessió iniciada.",
"You can add tags by hitting the Enter key or by adding a comma": "Pots afegir etiquetes prement Enter o afegint una coma",
"You can try another search term or drag and drop the marker on the map": "Pots provar amb altres paraules de cerca o arrossegar l'indicador al mapa",
"You can't remove your last identity.": "No pots esborrar la teva única identitat.",
"You don't follow any instances yet.": "Encara no pots seguir cap instància.",
"You have been disconnected": "S'ha desconnectat la sessió",
"You have cancelled your participation": "Has canceŀlat la teva participació",
"You have one event in {days} days.": "No tens cap activitat en {days} dies|Tens una activitat en {days} dies.|Tens {count} activitats en {days} dies",
"You have one event today.": "No tens cap activitat avui|Avui tens una activitat|Avui tens {count} activitats",
"You have one event tomorrow.": "No tens cap activitat per demà|Demà tens una activitat|Demà tens {count} activitats",
"You may also ask to {resend_confirmation_email}.": "També pots demanar {resend_confirmation_email}.",
"You need to login.": "Has d'iniciar sessió.",
"Your account has been validated": "El teu compte ha estat validat",
"Your account is being validated": "El teu compte està sent validat",
"Your account is nearly ready, {username}": "El teu compte està gairebé apunt, {username}",
"Your email is not whitelisted, you can't register.": "El teu correu no està a la llista d'acceptats, no pots crear un compte.",
"Your local administrator resumed its policy:": "L'administració d'aquesta instància resumeix així la seva política:",
"Your participation has been confirmed": "S'ha confirmat la teva participació",
"Your participation has been rejected": "S'ha denegat la teva participació",
"Your participation has been requested": "S'ha soŀlicitat la teva participació",
"Your participation status has been changed": "Ha canviat l'estat de participació",
"[This comment has been deleted]": "[Comentari esborrat]",
"[deleted]": "[esborrat]",
"a decentralised federation protocol": "un protocol de descentralitzat de federació",
"as {identity}": "com a {identity}",
"e.g. 10 Rue Jangot": "ex.: 13 Rue del Percebe",
"firstDayOfWeek": "0",
"iCal Feed": "Flux iCal",
"interconnect with others like it": "interconnecta amb altres com aquest",
"its source code is public": "el codi font és públic",
"on our blog": "al nostre blog",
"resend confirmation email": "reenvia el mail de confirmació",
"respect of the fundamental freedoms": "respecte per les llibertats fonamentals",
"with another identity…": "amb una altra identitat…",
"{approved} / {total} seats": "{approved} / {total} places",
"{count} participants": "Cap participant per ara|Un/a participant|{count} participants",
"{count} requests waiting": "{count} soŀlicituds pendents",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garanteix {respect} de la gent que el farà servir . Com que {source}, qualsevol amb els coneixements adequats pot auditar-lo, cosa que en garanteix la transparència.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Les persones contribuïdores de Mobilizon {date} - Fet amb Elixir, Phoenix, VueJS, una mica d'amor i algunes setmanes",
"© The OpenStreetMap Contributors": "© Les persones contribuïdores d'OpenStreetMap"
}

View File

@@ -1,473 +1,418 @@
{
"<b>Please do not use it in any real way.</b>": "<b>Bitte benutze diese Seite nicht für tatsächliche Veranstaltungsplanung.</b>",
"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",
"Accepted": "Akzeptiert",
"Account": "Konto",
"Account settings": "Kontoeinstellungen",
"Add": "Hinzufügen",
"Add a note": "Notiz hinzufügen",
"Add an address": "Adresse hinzufügen",
"Add an instance": "Instanz hinzufügen",
"Add some tags": "Füge Tags hinzu",
"Add to my calendar": "Zu meinem Kalender hinzufügen",
"Additional comments": "Zusätzliche Kommentare",
"Admin": "Admin",
"Admin settings": "Admineinstellungen",
"Admin settings successfully saved.": "Admineinstellungen erfolgreich gespeichert.",
"Administration": "Administration",
"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",
"Allow registrations": "Erlaube Registrierungen",
"An error has occurred.": "Ein Fehler ist aufgetreten.",
"Anonymous participant": "Anonyme Teilnehmer",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyme Teilnehmer(innen) werden gebeten, ihre Teilnahme per E-Mail zu bestätigen.",
"Anonymous participations": "Anonyme Teilnehmer",
"Approve": "Bestätigen",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Bist du dir sicher, dass du den gesamten Account löschen möchtest? Du verlierst dadurch alles. Identitäten, Einstellungen, erstellte Events, Nachrichten, Teilnahmen sind dann für immer verschwunden.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Bist du sicher, dass du diesen Kommentar <b>löschen</b> willst? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Bist du sicher, dass du diese Veranstaltung <b>löschen</b> willst? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to 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",
"Back to previous page": "Zurück zur vorherigen Seite",
"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 @{username}": "Nach @{username}",
"Cancel": "Abbrechen",
"Cancel anonymous participation": "Anonyme Teilnahme 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": "Abgesagt: Wird nicht stattfinden",
"Category": "Kategorie",
"Change": "Ändern",
"Change my email": "E-Mail ä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": "Schließen",
"Close comments for all (except for admins)": "Schließe die Kommentare für alle (außer für Administratoren)",
"Closed": "Geschlossen",
"Comment deleted": "Kommentar gelöscht",
"Comment from @{username} reported": "Kommentar von @{username} gemeldet",
"Comments": "Kommentare",
"Comments have been closed.": "Kommentierung ist beendet",
"Comments on the event page": "Kommentare auf der Veranstaltungs-Seite",
"Confirm my participation": "Meine Teilnahme zusagen",
"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.",
"Current page": "Aktuelle Seite",
"Custom": "Benutzerdefiniert",
"Custom URL": "benutzerdefiniert URL",
"Custom text": "benutzerdefiniert Text",
"Dashboard": "Dashboard",
"Date": "Datum",
"Date and time settings": "Datums- und Uhrzeiteinstellungen",
"Date parameters": "Datumsoptionen",
"Default": "Standard",
"Delete": "Löschen",
"Delete Comment": "Kommentar löschen",
"Delete Event": "Veranstaltung löschen",
"Delete account": "Account löschen",
"Delete event": "Event löschen",
"Delete everything": "Alles löschen",
"Delete my account": "Meinen Account 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}",
"Deleting comment": "Lösche Kommentar",
"Deleting event": "Lösche Event",
"Deleting my account will delete all of my identities.": "Löschen meines Accounts wird all meine Identitäten löschen.",
"Deleting your Mobilizon account": "Lösche dein Mobilizon Konto",
"Description": "Beschreibung",
"Didn't receive the instructions ?": "Bestätigung nicht erhalten?",
"Display name": "Namen einzeigen",
"Display participation price": "Teilnahmegebühr anzeigen",
"Domain": "Domain",
"Draft": "Entwurf",
"Drafts": "Entwürfe",
"Edit": "Bearbeiten",
"Eg: Stockholm, Dance, Chess…": "z.B.: Berlin, Tanzen, Schach…",
"Either on the {instance} instance or on another instance.": "Entweder auf der {instance} Instanz oder auf einer andere Instanz.",
"Either the account is already validated, either the validation token is incorrect.": "Der Account ist bereits bestätigt, oder der Bestätigungstoken ist abgelaufen.",
"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 changing email": "Ein Fehler ist beim ändern der E-Mail aufgetreten.",
"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",
"Error while validating participation": "Fehler bei Bestätigung des Teilnahme aufgetreten",
"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",
"Ex: test.mobilizon.org": "Bsp.: test.mobilizon.org",
"Exclude": "Ausschließen",
"Explore": "Entdecken",
"Failed to save admin settings": "Admin Einstellungen konnten nicht gespeichert werden",
"Featured events": "Vorgestellte Veranstaltungen",
"Features": "Funktionen",
"Federation": "Föderation",
"Find an address": "Adresse finden",
"Find an instance": "Eine Instanz finden",
"Followers": "Follower*innen",
"Followings": "Verfolgend",
"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",
"Go": "Los",
"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",
"Hide replies": "Antworten ausblenden",
"I create an identity": "Ich erstelle eine Identität",
"I don't have a Mobilizon account": "Ich habe kein Mobilizon Konto",
"I have a Mobilizon account": "Ich habe ein Mobilizon Konto",
"I have an account on another Mobilizon instance.": "Ich habe ein Konto auf einer anderen Mobilizoninstanz.",
"I participate": "Ich nehme teil",
"I want to allow people to participate without an account.": "Ich möchte Usern erlauben ohne Konto teilzunehmen.",
"I want to approve every participation request": "Ich 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.",
"Instance Description": "Beschreibung der Instanz",
"Instance Name": "Instanzname",
"Instance Terms": "Nutzungsbedingungen der Instanz",
"Instance Terms Source": "Nutzungsbedingungen der Instanz",
"Instance Terms URL": "Nutzungsbedingungen der Instanz URL",
"Instance settings": "Einstellungen der Instanz",
"Instances": "Instanzen",
"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!",
"Login on {instance}": "Einloggen {instance}",
"Manage participations": "Teilnehmer Verwalten",
"Mark as resolved": "Als gelöst markieren",
"Members": "Mitglieder",
"Message": "Nachricht",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon ist ein föderierte Netzwerk. Du kannst mit dieser Veranstaltung aus verschiedenen Server interagiert.",
"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)",
"Moderation": "Moderation",
"My account": "Mein Account",
"My events": "Meine Veranstaltungen",
"My identities": "Meine Identitäten",
"Name": "Name",
"New email": "Neue E-Mail",
"New note": "Neue Notiz",
"New password": "Neues Passwort",
"New profile": "Neue Profil",
"Next page": "Nächste Seite",
"No address defined": "Keine Adresse festgelegt",
"No comment": "Kein Kommentar",
"No comments yet": "Noch keine Kommentare",
"No end date": "Keine Enddatum",
"No events found": "Keine Veranstaltungen gefunden",
"No group found": "Keine Gruppe gefunden",
"No groups found": "Keine Gruppen gefunden",
"No instance follows your instance yet.": "Noch keine Instanz folgt deiner Instanz",
"No instance to approve|Approve instance|Approve {number} instances": "",
"No message": "Kein Nachricht",
"No participant to approve|Approve participant|Approve {number} participants": "Keine Teilnehmer zu bestätigen|Teilnehmer bestätigen| {count} Teilnehmer bestätigen",
"No participant to reject|Reject participant|Reject {number} participants": "Keine Teilnehmer abzulehnen|Teilnehmer ablehnen|{number} Teilnehmern ablehnen",
"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?",
"Notes": "Notizen",
"Notifications": "Benachrichtigungen",
"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)",
"Only alphanumeric characters and underscores are supported.": "Nur alphanumerische Zeichen und Unterstriche sind unterstützt.",
"Open": "Offen",
"Opened reports": "Geöffnete Meldungen",
"Or": "Oder",
"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": "Seite",
"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": "Teilnehmer",
"Participant already was rejected.": "Teilnehmer wurde bereits abgelehnt.",
"Participant has already been approved as participant.": "Teilnehmer wurde bereits bestätigt.",
"Participants": "Teilnehmer",
"Participate": "Teilnehmen",
"Participate using your email address": "Nehme mit deiner E-Mail Adresse teil",
"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",
"Pending": "Ausstehend",
"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",
"Post a comment": "Schreibe einen Kommentar",
"Post a reply": "Schreibe eine Antwort",
"Postal Code": "Postleitzahl",
"Preferences": "Einstellungen",
"Previous page": "Vorherigen Seite",
"Privacy Policy": "Datenschutzerklärung",
"Private event": "Private Veranstaltung",
"Private feeds": "Private Feeds",
"Profiles": "Profile",
"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 allowed, anyone can register.": "Veranstaltung zugesagt, jede kann registrieren.",
"Registration is closed.": "Registrierung geschlossen.",
"Registration is currently closed.": "Registrierungen sind aktuell geschlossen.",
"Registrations are restricted by whitelisting.": "Registrierung ist durch eine Whitelist beschränkt.",
"Reject": "Ablehnen",
"Rejected": "Abgelehnt",
"Rejected participations": "Abgelehnte Teilnahmen",
"Reopen": "Wieder öffnen",
"Reply": "Antworten",
"Report": "Melden",
"Report this comment": "Diesen Kommentar melden",
"Report this event": "Diese Veranstaltung melden",
"Reported": "Gemeldet",
"Reported by": "Gemeldet von",
"Reported by someone on {domain}": "Gemeldet von jemandem auf {domain}",
"Reported by {reporter}": "Gemeldet von {reporter}",
"Reports": "Meldungen",
"Requests": "Anfragen",
"Resend confirmation email": "Bestätigungsmail erneut senden",
"Reset my password": "Mein Passwort zurücksetzen",
"Resolved": "Gelöst",
"Role": "Benutzerrolle",
"Save": "Speichern",
"Save draft": "Entwurf speichern",
"Search": "Suche",
"Search events, groups, etc.": "Durchsuche Veranstaltungen, Gruppen, etc.",
"Search results: \"{search}\"": "Suchergebnisse: \"{search}\"",
"Searching…": "Suche…",
"Send email": "E-Mail senden",
"Send me an email to reset my password": "Sende mir eine E-Mail, um mein Passwort zurückzusetzen",
"Send me the confirmation email once again": "Sende mir noch eine Bestätigungsmail",
"Send the report": "Meldung senden",
"Settings": "Einstellungen",
"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",
"Terms": "Nutzungsbedingungen",
"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 current password is invalid": "Das Passwort ist ungültig.",
"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 organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "Der Veranstalter der Veranstaltung will die Teilnahmen manuell bestätigen. Willst Du einen Grund hinzufügen warum Du diese Veranstaltung teilnehmen möchtest ?",
"The event organizer didn't add any description.": "Der Organisator hat keine Beschreibung hinzugefügt.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Der Veranstalter der Veranstaltung will die Teilnahmen manuell bestätigen. Wenn Du ohne Konto teilnehmen möchtest, bitte erklärt warum Du diese Veranstaltung teilnehmen möchtest.",
"The event title will be ellipsed.": "Der Titel der Veranstaltung wird verkürzt dargestellt.",
"The new email doesn't seem to be valid": "Die neue E-Mail scheint nicht valide zu sein.",
"The new email must be different": "Der neue E-Mail muss unterschiedlich sein",
"The new password must be different": "Das neue Passwort muss unterschiedlich sein",
"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.",
"There will be no way to recover your data.": "Es gibt keinen Weg deine Daten wiederherszustellen.",
"These events may interest you": "Diese Veranstaltungen könnten dich interessieren",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Diese Mobilizon Instanz und diesen Veranstalter akzeptieren anonyme Teilnahmen, aber eine Bestätigung per E-Mail ist erforderlich.",
"This information is saved only on your computer. Click for details": "Diese Information ist nur auf deinem Computer gespeichert. Klicke für mehr Details.",
"This 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",
"Type": "Typ",
"URL": "URL",
"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": "Unbekannt",
"Unknown error.": "Unbekannter Fehler.",
"Unsaved changes": "Nicht gespeicherte Änderungen",
"Upcoming": "Demnächst",
"Update event {name}": "Event {name} aktualisieren",
"Update my event": "Meine Veranstaltungen aktualisieren",
"Updated": "Aktualisiert",
"Username": "Nutzername",
"Users": "Nutzer",
"View a reply": "|Eine Rückmeldung sehen|{totalReplies} Rückmeldungen sehen",
"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 will redirect you to your instance in order to interact with this event": "Du wirst zu auf deiner Instanz weitergeleitet damit mit dieser Veranstaltung zu interagieren",
"We wont change the world from Facebook. The tool we dream of, surveillance capitalism corporations wont develop it, as they couldnt profit from it. This is an opportunity to build something better, by taking another approach.": "Wir werden nicht aus Facebook heraus die Welt verändern können. Firmen des Überwachungs-Kaptialismus haben keinerlei Interesse an einem Werkzeug, wie dem, 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 are participating in this event anonymously": "Du teilnimmst anonym diese Veranstaltung",
"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 don't follow any instances yet.": "Du folgst noch keinen Instanzen.",
"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.",
"You will be redirected to the original instance": "Du wirst auf der Original Instanz weitergeleitet",
"You wish to participate to the following event": "Du möchtest an die folgenden Veranstaltungen teilnehmen",
"You'll receive a confirmation email.": "Du wirst einen Bestätigungsmail bekommen.",
"Your account has been successfully deleted": "Dein Konto wurde erfolgreich gelöscht.",
"Your account has been validated": "Dein Account wurde validiert",
"Your account is being validated": "Dein Account wird validiert",
"Your account is nearly ready, {username}": "Dein Account ist fast bereit, {username}",
"Your current email is {email}. You use it to log in.": "Deine aktuell E-Mail ist {email}. Nutz er um einzulogen.",
"Your email has been changed": "Deine E-Mail wurde geändert.",
"Your email is being changed": "Deine E-Mail wird geändert",
"Your email is not whitelisted, you can't register.": "Deine E-Mail-Adresse ist nicht gewhitelisted, du kannst dich nicht registrieren.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Deine E-Mail ist nur benutzt um zu bestätigen dass Du eine echt Person bist und um Dir eventuell Aktualisierungen dieser Veranstaltung zu schicken.",
"Your federated identity": "Deine föderiert Identität",
"Your local administrator resumed its policy:": "Deine lokale Administration setzt den Betrieb fort:",
"Your participation has been confirmed": "Deine Teilnahme wurde bestätigt",
"Your participation has been rejected": "Deine Teilnahme wurde abgelehnt",
"Your participation has been requested": "Deine Teilnahme wurde angefragt",
"Your participation has been validated": "Deine Teilnahme wurde validiert",
"Your participation is being validated": "Deine Teilnahme wird validiert",
"Your participation status has been changed": "Dein Teilnahmestatus hat sich geändert.",
"[This comment has been deleted]": "[Dieser Kommentar wurde gelöscht]",
"[deleted]": "[gelöscht]",
"a decentralised federation protocol": "eins dezentralisiertem Föderatons-Protokoll",
"as {identity}": "als {identity}",
"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",
"profile@instance": "profil@instanz",
"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.…",
"{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"
}
"<b>Please do not use it in any real way.</b>": "<b>Bitte benutze diese Seite nicht für tatsächliche Veranstaltungsplanung.</b>",
"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",
"Accepted": "Akzeptiert",
"Account settings": "Kontoeinstellungen",
"Add": "Hinzufügen",
"Add a note": "Notiz hinzufügen",
"Add an address": "Adresse hinzufügen",
"Add an instance": "Instanz hinzufügen",
"Add some tags": "Füge Tags hinzu",
"Add to my calendar": "Zu meinem Kalender hinzufügen",
"Additional comments": "Zusätzliche Kommentare",
"Admin settings": "Admineinstellungen",
"Admin settings successfully saved.": "Admineinstellungen erfolgreich gespeichert.",
"Administration": "Administration",
"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",
"Allow registrations": "Erlaube Registrierungen",
"An error has occurred.": "Ein Fehler ist aufgetreten.",
"Anonymous participations": "Anonyme Teilnehmer",
"Approve": "Bestätigen",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Bist du dir sicher, dass du den gesamten Account löschen möchtest? Du verlierst dadurch alles. Identitäten, Einstellungen, erstellte Events, Nachrichten, Teilnahmen sind dann für immer verschwunden.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Bist du sicher, dass du diesen Kommentar <b>löschen</b> willst? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Bist du sicher, dass du diese Veranstaltung <b>löschen</b> willst? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to 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",
"Back to previous page": "Zurück zur vorherigen Seite",
"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 @{username}": "Nach @{username}",
"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": "Abgesagt: Wird nicht stattfinden",
"Category": "Kategorie",
"Change": "Ändern",
"Change my email": "E-Mail ä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": "Schließen",
"Close comments for all (except for admins)": "Schließe die Kommentare für alle (außer für Administratoren)",
"Closed": "Geschlossen",
"Comment deleted": "Kommentar gelöscht",
"Comment from @{username} reported": "Kommentar von @{username} gemeldet",
"Comments": "Kommentare",
"Comments have been closed.": "Kommentierung ist beendet",
"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.",
"Dashboard": "Dashboard",
"Date": "Datum",
"Date and time settings": "Datums- und Uhrzeiteinstellungen",
"Date parameters": "Datumsoptionen",
"Default": "Standard",
"Delete": "Löschen",
"Delete Comment": "Kommentar löschen",
"Delete Event": "Veranstaltung löschen",
"Delete account": "Account löschen",
"Delete event": "Event löschen",
"Delete everything": "Alles löschen",
"Delete my account": "Meinen Account 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}",
"Deleting comment": "Lösche Kommentar",
"Deleting event": "Lösche Event",
"Deleting my account will delete all of my identities.": "Löschen meines Accounts wird all meine Identitäten löschen.",
"Deleting your Mobilizon account": "Lösche dein Mobilizon Konto",
"Description": "Beschreibung",
"Didn't receive the instructions ?": "Bestätigung nicht erhalten?",
"Display name": "Namen einzeigen",
"Display participation price": "Teilnahmegebühr anzeigen",
"Domain": "Domain",
"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 changing email": "Ein Fehler ist beim ändern der E-Mail aufgetreten.",
"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",
"Ex: test.mobilizon.org": "Bsp.: test.mobilizon.org",
"Exclude": "Ausschließen",
"Explore": "Entdecken",
"Failed to save admin settings": "Admin Einstellungen konnten nicht gespeichert werden",
"Featured events": "Vorgestellte Veranstaltungen",
"Features": "Funktionen",
"Find an address": "Adresse finden",
"Find an instance": "Eine Instanz finden",
"Followers": "Follower*innen",
"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",
"Go": "Los",
"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",
"Hide replies": "Antworten ausblenden",
"I create an identity": "Ich erstelle eine Identität",
"I don't have a Mobilizon account": "Ich habe kein Mobilizon Konto",
"I have a Mobilizon account": "Ich habe ein Mobilizon Konto",
"I have an account on another Mobilizon instance.": "Ich habe ein Konto auf einer anderen Mobilizoninstanz.",
"I participate": "Ich nehme teil",
"I want to allow people to participate without an account.": "Ich möchte Usern erlauben ohne Konto teilzunehmen.",
"I want to approve every participation request": "Ich 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.",
"Instance Description": "Beschreibung der Instanz",
"Instance Name": "Instanzname",
"Instances": "Instanzen",
"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!",
"Login on {instance}": "Einloggen {instance}",
"Manage participations": "Teilnehmer Verwalten",
"Mark as resolved": "Als gelöst markieren",
"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 email": "Neue E-Mail",
"New note": "Neue Notiz",
"New password": "Neues Passwort",
"No address defined": "Keine Adresse festgelegt",
"No comment": "Kein Kommentar",
"No comments yet": "Noch keine Kommentare",
"No end date": "Keine Enddatum",
"No events found": "Keine Veranstaltungen gefunden",
"No group found": "Keine Gruppe gefunden",
"No groups found": "Keine Gruppen gefunden",
"No instance follows your instance yet.": "Noch keine Instanz folgt deiner Instanz",
"No instance to approve|Approve instance|Approve {number} instances": "",
"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?",
"Notes": "Notizen",
"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)",
"Only alphanumeric characters and underscores are supported.": "Nur alphanumerische Zeichen und Unterstriche sind unterstützt.",
"Open": "Offen",
"Opened reports": "Geöffnete Meldungen",
"Or": "Oder",
"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",
"Participate using your email address": "Nehme mit deiner E-Mail Adresse teil",
"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",
"Post a comment": "Schreibe einen Kommentar",
"Post a reply": "Schreibe eine Antwort",
"Postal Code": "Postleitzahl",
"Privacy Policy": "Datenschutzerklärung",
"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 closed.": "Registrierung geschlossen.",
"Registration is currently closed.": "Registrierungen sind aktuell geschlossen.",
"Registrations are restricted by whitelisting.": "Registrierung ist durch eine Whitelist beschränkt.",
"Reject": "Ablehnen",
"Rejected": "Abgelehnt",
"Rejected participations": "Abgelehnte Teilnahmen",
"Reopen": "Wieder öffnen",
"Reply": "Antworten",
"Report": "Melden",
"Report this comment": "Diesen Kommentar melden",
"Report this event": "Diese Veranstaltung melden",
"Reported": "Gemeldet",
"Reported by": "Gemeldet von",
"Reported by someone on {domain}": "Gemeldet von jemandem auf {domain}",
"Reported by {reporter}": "Gemeldet von {reporter}",
"Reports": "Meldungen",
"Requests": "Anfragen",
"Resend confirmation email": "Bestätigungsmail erneut senden",
"Reset my password": "Mein Passwort zurücksetzen",
"Resolved": "Gelöst",
"Save": "Speichern",
"Save draft": "Entwurf speichern",
"Search": "Suche",
"Search events, groups, etc.": "Durchsuche Veranstaltungen, Gruppen, etc.",
"Search results: \"{search}\"": "Suchergebnisse: \"{search}\"",
"Searching…": "Suche",
"Send email": "E-Mail senden",
"Send me an email to reset my password": "Sende mir eine E-Mail, um mein Passwort zurückzusetzen",
"Send me the confirmation email once again": "Sende mir noch eine Bestätigungsmail",
"Send the report": "Meldung senden",
"Settings": "Einstellungen",
"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 current password is invalid": "Das Passwort ist ungültig.",
"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 new email doesn't seem to be valid": "Die neue E-Mail scheint nicht valide zu sein.",
"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.",
"There will be no way to recover your data.": "Es gibt keinen Weg deine Daten wiederherszustellen.",
"These events may interest you": "Diese Veranstaltungen könnten dich interessieren",
"This information is saved only on your computer. Click for details": "Diese Information ist nur auf deinem Computer gespeichert. Klicke für mehr Details.",
"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",
"URL": "URL",
"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",
"Updated": "Aktualisiert",
"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 don't follow any instances yet.": "Du folgst noch keinen Instanzen.",
"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 successfully deleted": "Dein Konto wurde erfolgreich gelöscht.",
"Your account has been validated": "Dein Account wurde validiert",
"Your account is being validated": "Dein Account wird validiert",
"Your account is nearly ready, {username}": "Dein Account ist fast bereit, {username}",
"Your email has been changed": "Deine E-Mail wurde geändert.",
"Your email is being changed": "Deine E-Mail wird geändert",
"Your email is not whitelisted, you can't register.": "Deine E-Mail-Adresse ist nicht gewhitelisted, du kannst dich nicht registrieren.",
"Your local administrator resumed its policy:": "Deine lokale Administration setzt den Betrieb fort:",
"Your participation has been confirmed": "Deine Teilnahme wurde bestätigt",
"Your participation has been rejected": "Deine Teilnahme wurde abgelehnt",
"Your participation has been requested": "Deine Teilnahme wurde angefragt",
"Your participation status has been changed": "Dein Teilnahmestatus hat sich geändert.",
"[This comment has been deleted]": "[Dieser Kommentar wurde gelöscht]",
"[deleted]": "[gelöscht]",
"a decentralised federation protocol": "eins dezentralisiertem Föderatons-Protokoll",
"as {identity}": "als {identity}",
"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.…",
"{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"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,499 +1,499 @@
{
"<b>Please do not use it in any real way.</b>": "<b>Por favor, no lo use de ninguna manera real</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Una herramienta fácil de usar, emancipadora y ética, para reunir, organizar y movilizar.",
"A validation email was sent to {email}": "Un correo electrónico de confirmación fue enviado a {email}",
"Abandon edition": "Abandonar la edición",
"About": "Acerca de",
"About Mobilizon": "A propósito de Mobilizon",
"About this event": "Acerca este evento",
"About this instance": "Acerca de esta instancia",
"Accepted": "Aceptado",
"Account": "Cuenta",
"Account settings": "Configuración de la cuenta",
"Add": "Añadir",
"Add a note": "Añade una nota",
"Add an address": "Añade una dirección",
"Add an instance": "Añade una instancia",
"Add some tags": "Añade algunas etiquetas",
"Add to my calendar": "Añadir a mi calendario",
"Additional comments": "Comentarios adicionales",
"Admin": "Administrador",
"Admin settings": "Ajustes de administración",
"Admin settings successfully saved.": "Ajustes de administración guardados correctamente.",
"Administration": "Administración",
"All the places have already been taken": "Todos los plazas han sido ocupados | Un plazas aún está disponible | {lugares} plazas aún están disponibles",
"Allow all comments": "Permitir todos los comentarios",
"Allow registrations": "Permitir registros",
"An error has occurred.": "Se ha producido un error.",
"Anonymous participant": "Participante anónimo",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Los participantes anónimos deberán confirmar su participación por correo electrónico.",
"Anonymous participations": "Participaciones anónimas",
"Approve": "Aprobar",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "¿Estás realmente seguro de que deseas eliminar toda tu cuenta? Lo perderás todo. Las identidades, la configuración, los eventos creados, los mensajes y las participaciones desaparecerán para siempre.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "¿Estás seguro de que quieres <b> eliminar </b> este comentario? Esta acción no se puede deshacer.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "¿Estás seguro de que quieres <b> eliminar </b> este evento? Esta acción no se puede deshacer. Es posible que desee entablar una conversación con el creador del evento o editar el evento en su lugar.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "¿Seguro que quieres cancelar la creación del evento? Perderás todas las modificaciones.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "¿Seguro que quieres cancelar la edición del evento? Perderás todas las modificaciones.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "¿Está seguro de que desea cancelar su participación en el evento \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "¿Seguro que quieres eliminar este evento? Esta acción no se puede revertir.",
"Avatar": "Avatar",
"Back to previous page": "Volver a la página anterior",
"Before you can login, you need to click on the link inside it to validate your account": "Antes de iniciar sesión, debe hacer clic en el enlace que se encuentra dentro para validar su cuenta",
"By @{username}": "Por @{username}",
"Cancel": "Cancelar",
"Cancel anonymous participation": "Cancelar participación anónima",
"Cancel creation": "Cancelar creación",
"Cancel edition": "Cancelar edición",
"Cancel my participation request…": "Cancelar mi solicitud de participación …",
"Cancel my participation…": "Cancelar mi participación …",
"Cancelled: Won't happen": "Cancelado: no sucederá",
"Category": "Categoría",
"Change": "Cambiar",
"Change my email": "Cambiar mi correo electrónico",
"Change my identity…": "Cambiar mi identidad …",
"Change my password": "Cambiar mi contraseña",
"Clear": "Limpiar",
"Click to select": "Haz clic para selaccionar",
"Click to upload": "Haz clic para subir (upload)",
"Close": "Cerrar",
"Close comments for all (except for admins)": "Cerrar comentarios para todos (excepto para administradores)",
"Closed": "Cerrado",
"Comment deleted": "Comentario borrado",
"Comment from @{username} reported": "Comentario de @{username} declarado",
"Comments": "Comentarios",
"Comments have been closed.": "Los comentarios han sido cerrados.",
"Confirm my participation": "Confirma mi participación",
"Confirm my particpation": "Confirmar mi participación",
"Confirmed: Will happen": "Confirmado: sucederá",
"Continue editing": "Continua editando",
"Country": "País",
"Create": "Crear",
"Create a new event": "Crear un nuevo evento",
"Create a new group": "Crear un nuevo grupo",
"Create a new identity": "Crear una nueva identidad",
"Create and manage several identities from the same account": "Crear y administrar varias identidades desde la misma cuenta",
"Create group": "Crear un grupo",
"Create my event": "Crear mi evento",
"Create my group": "Crear mi grupo",
"Create my profile": "Crear mi perfil",
"Create token": "Crear token",
"Create, edit or delete events": "Crear, editar o eliminar eventos",
"Creator": "Creador",
"Current identity has been changed to {identityName} in order to manage this event.": "La identidad actual se ha cambiado a {identityName} para gestionar este evento.",
"Current page": "Página actual",
"Custom": "Personalizado",
"Custom URL": "URL personalizada",
"Custom text": "Texto personalizado",
"Dashboard": "Panel de control",
"Date": "Fecha",
"Date and time settings": "Configuración de fecha y hora",
"Date parameters": "Parámetros de fecha",
"Default": "Valor predeterminados",
"Default Mobilizon.org terms": "Términos predeterminados de Mobilizon.org",
"Delete": "Eliminar",
"Delete Comment": "Eliminar comentario",
"Delete Event": "Eliminar evento",
"Delete account": "Eliminar cuenta",
"Delete event": "Eliminar evento",
"Delete everything": "Eliminar todo",
"Delete my account": "Eliminar mi cuenta",
"Delete this identity": "Eliminar esta identidad",
"Delete your identity": "Eliminar tu identidad",
"Delete {eventTitle}": "Eliminar {eventTitle}",
"Delete {preferredUsername}": "Eliminar {preferredUsername}",
"Deleting comment": "Eliminando comentario",
"Deleting event": "Eliminando evento",
"Deleting my account will delete all of my identities.": "Eliminar mi cuenta eliminará todas mis identidades.",
"Deleting your Mobilizon account": "Eliminando tu cuenta de Mobilizon",
"Description": "Descripción",
"Didn't receive the instructions ?": "¿No recibiste las instrucciones?",
"Display name": "Mostrar nombre",
"Display participation price": "Mostrar precio de participación",
"Domain": "Dominio",
"Draft": "Borrador",
"Drafts": "Borradores",
"Edit": "Editar",
"Eg: Stockholm, Dance, Chess…": "Ej .: Estocolmo, Danza, Ajedrez …",
"Either on the {instance} instance or on another instance.": "Ya sea en la instancia {instancia} o en otra instancia.",
"Either the account is already validated, either the validation token is incorrect.": "O la cuenta ya está validada, o bien el testigo de validación es incorrecto.",
"Either the email has already been changed, either the validation token is incorrect.": "O el correo electrónico ya se ha cambiado, o bien el token de validación es incorrecto.",
"Either the participation has already been validated, either the validation token is incorrect.": "O la participación ya ha sido validada, o bien el token de validación es incorrecto.",
"Email": "Correo elecxtrónico",
"Ends on…": "Termina en …",
"Enjoy discovering Mobilizon!": "¡Disfruta descubriendo Mobilizon!",
"Enter the link URL": "Introduzca la URL del enlace",
"Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Introduzca sus propios términos. Etiquetas HTML permitidas. Los términos de Mobilizon.org se proporcionan como plantilla.",
"Error while changing email": "Error al cambiar el correo electrónico",
"Error while communicating with the server.": "Error al comunicarse con el servidor.",
"Error while saving report.": "Error al guardar el informe.",
"Error while validating account": "Error al validar la cuenta",
"Error while validating participation": "Error al validar la participación",
"Event": "Evento",
"Event already passed": "Evento ya pasado",
"Event cancelled": "Evento cancelado",
"Event creation": "Creación de evento",
"Event edition": "Edición del evento",
"Event list": "Lista de eventos",
"Event not found.": "Evento no encontrado.",
"Event page settings": "Configuración de la página del evento",
"Event to be confirmed": "Evento por confirmar",
"Event {eventTitle} deleted": "Evento {eventTitle} eliminado",
"Event {eventTitle} reported": "Evento {eventTitle} declarado",
"Events": "Eventos",
"Ex: test.mobilizon.org": "Ej: test.mobilizon.org",
"Exclude": "Excluir",
"Explore": "Explorar",
"Failed to save admin settings": "Error al guardar la configuración de administrador",
"Featured events": "Eventos particulares",
"Features": "Caracteristicas",
"Federation": "Federación",
"Find an address": "Buscar una dirección",
"Find an instance": "Buscar una instancia",
"Followers": "Seguidores",
"Followings": "Seguimientos",
"For instance: London, Taekwondo, Architecture…": "Por ejemplo: Londres, Taekwondo, Arquitectura …",
"Forgot your password ?": "¿Olvidaste tu contraseña ?",
"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?": "Desde una fiesta de cumpleaños con amigos y familiares hasta una marcha por el cambio climático, en este momento, nuestras reuniones están <b> atrapadas dentro de las plataformas de los gigantes tecnológicos </b>. ¿Cómo podemos organizarnos, cómo podemos hacer clic en \"Asistir\", sin <b> proporcionar datos privados </b> a Facebook o <b> encerrarnos </b> dentro de MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "Desde {startDate} en {startTime} hasta {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Desde el {startDate} en {startTime} hasta el {endDate} en {endTime}",
"From the {startDate} to the {endDate}": "Desde el {startDate} hasta el {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Reúna ⋅ Organice ⋅ Movilice",
"General": "General",
"General information": "Información general",
"Getting location": "Obtener ubicación",
"Go": "Ir",
"Going as {name}": "Ir como {nombre}",
"Group List": "Lista de grupo",
"Group full name": "Nombre completo del grupo",
"Group name": "Nombre del grupo",
"Group {displayName} created": "Grupo {displayName} creado",
"Groups": "Grupos",
"Headline picture": "Imagen del titular",
"Hide replies": "Ocultar respuestas",
"I create an identity": "Crear una identidad",
"I don't have a Mobilizon account": "No tengo una cuenta de Mobilizon",
"I have a Mobilizon account": "Tengo una cuenta de Mobilizon",
"I have an account on another Mobilizon instance.": "Tengo una cuenta en otra instancia de Mobilizon.",
"I participate": "Yo participo",
"I want to allow people to participate without an account.": "Quiero permitir que las personas participen sin una cuenta.",
"I want to approve every participation request": "Quiero aprobar cada solicitud de participación",
"Identity {displayName} created": "Identidad {displayName} creada",
"Identity {displayName} deleted": "Identidad {displayName} eliminada",
"Identity {displayName} updated": "Identidad {displayName} actualizada",
"If an account with this email exists, we just sent another confirmation email to {email}": "Si existe una cuenta con este correo electrónico, acabamos de enviar otro correo electrónico de confirmación a {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Si esta identidad es el único administrador de algún grupo, debe eliminarlo antes de poder eliminar esta identidad.",
"If you want, you may send a message to the event organizer here.": "Si lo desea, puede enviar un mensaje al organizador del evento aquí.",
"Impossible to login, your email or password seems incorrect.": "Imposible iniciar sesión, su correo electrónico o contraseña parece incorrecta.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Mientras tanto, tenga en cuenta que el software no está (todavía) terminado. Más información {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "La instalación de Mobilizon permitirá a las comunidades liberarse de los servicios de los gigantes tecnológicos creando <b> su propia plataforma de eventos </b>.",
"Instance Description": "Descripción de instancia",
"Instance Name": "Nombre de instancia",
"Instance Terms": "Términos de Instancia",
"Instance Terms Source": "Fuente de Términos de Instancia",
"Instance Terms URL": "URL de Términos de Instancia",
"Instance settings": "Configuraciones de instancia",
"Instances": "Instancias",
"Join {instance}, a Mobilizon instance": "Únase a {instancia}, una instancia de Mobilizon",
"Last published event": "Último evento publicado",
"Last week": "La semana pasada",
"Learn more": "Aprende más",
"Learn more about Mobilizon": "Conoce más sobre Mobilizon",
"Leave event": "Dejar evento",
"Leaving event \"{title}\"": "Saliendo del evento \"{title}\"",
"Let's create a new common": "Creemos un nuevo \"bien común\"",
"License": "Licencia",
"Limited number of places": "Número limitado de plazas",
"Load more": "Carga más",
"Locality": "Localidad",
"Log in": "Iniciar sesión",
"Log out": "Cerrar sesión",
"Login": "Iniciar sesión",
"Login on Mobilizon!": "¡Inicia sesión en Mobilizon!",
"Login on {instance}": "Inicia sesión en {instancia}",
"Manage participations": "Administrar participaciones",
"Mark as resolved": "Marca como resuelto",
"Members": "Miembros",
"Message": "Mensaje",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon es una red federada. Puede interactuar con este evento desde un servidor diferente.",
"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 software gratuito/libre que permitirá a las comunidades crear <b> sus propios espacios </b> para publicar eventos con el fin de emanciparse mejor de los gigantes tecnológicos.",
"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 está en desarrollo, añadiremos nuevas funciones a este sitio durante las actualizaciones regulares, hasta el lanzamiento de la <b> versión 1 del software en la primera mitad de 2020 </b>.",
"Mobilizons licence": "Licencia de Mobilizon",
"Moderated comments (shown after approval)": "Comentarios moderados (mostrados después de la aprobación)",
"Moderation": "Moderación",
"Moderation log": "Registro de moderación",
"My account": "Mi cuenta",
"My events": "Mis eventos",
"My identities": "Mis identidades",
"Name": "Nombre",
"New email": "Nuevo correo electrónico",
"New note": "Nueva nota",
"New password": "Nueva contraseña",
"New profile": "Nuevo perfil",
"Next page": "Siguiente página",
"No actors found": "No se encontraron actores",
"No address defined": "Ninguna dirección definida",
"No closed reports yet": "Aún no hay informes cerrados",
"No comment": "Sin comentarios",
"No comments yet": "Sin comentarios aún",
"No end date": "Sin fecha de finalización",
"No events found": "No se encontraron eventos",
"No group found": "Ningún grupo encontrado",
"No groups found": "No se encontraron grupos",
"No instance follows your instance yet.": "Ninguna instancia sigue a tu instancia todavía.",
"No instance to approve|Approve instance|Approve {number} instances": "No hay instancia para aprobar|Aprobar instancia|Aprobar {número} instancias",
"No instance to reject|Reject instance|Reject {number} instances": "Ninguna instancia para rechazar | Rechazar instancia | Rechazar {número} instancias",
"No instance to remove|Remove instance|Remove {number} instances": "No hay instancias para eliminar|Eliminar instancias|Eliminar {número} instancias",
"No message": "Sin mensaje",
"No notification settings yet": "Aún no hay configuración de notificaciones",
"No open reports yet": "Aún no hay informes abiertos",
"No participant to approve|Approve participant|Approve {number} participants": "Ningún participante debe aprobar|Aprobar participante|Aprobar {number} participantes",
"No participant to reject|Reject participant|Reject {number} participants": "Ningún participante que rechazar|Rechazar participante|Rechazar {number} participantes",
"No preferences yet": "Aún no hay preferencias",
"No resolved reports yet": "Aún no hay informes resueltos",
"No results for \"{queryText}\"": "No hay resultados para \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "No se encontró ninguna cuenta de usuario con este correo electrónico. Tal vez hiciste un error tipográfico?",
"Notes": "Notas",
"Notifications": "Notificaciones",
"Number of places": "Numero de plazas",
"OK": "OK",
"Old password": "Contraseña anterior",
"On {date}": "el {date}",
"On {date} ending at {endTime}": "El {fecha} que termina en {endTime}",
"On {date} from {startTime} to {endTime}": "El {fecha} de {startTime} a {endTime}",
"On {date} starting at {startTime}": "El {fecha} a partir de {startTime}",
"One person is going": "Nadie va|Una persona va|personas {approved} van",
"Only accessible through link and search (private)": "Solo accesible a través de enlace y búsqueda (privado)",
"Only alphanumeric characters and underscores are supported.": "Solo se admiten caracteres alfanuméricos y guiones bajos.",
"Open": "Abrir",
"Opened reports": "Informes abiertos",
"Or": "O",
"Organized": "Organizado",
"Organized by {name}": "Organizado por {name}",
"Organizer": "Organizador",
"Other software may also support this.": "Otro software también puede soportar esto.",
"Otherwise this identity will just be removed from the group administrators.": "De lo contrario, esta identidad solo se eliminará de los administradores del grupo.",
"Page": "Página",
"Page limited to my group (asks for auth)": "Página limitada a mi grupo (solicita autenticación)",
"Page not found": "Página no encontrada",
"Participant": "Participante",
"Participant already was rejected.": "El participante ya fue rechazado.",
"Participant has already been approved as participant.": "El participante ya ha sido aprobado como participante.",
"Participants": "Participantes",
"Participate": "Participar",
"Participate using your email address": "Participa usando tu dirección de correo electrónico",
"Participation approval": "Aprobación de la participación",
"Participation confirmation": "Confirmación de participación",
"Participation requested!": "¡Participación solicitada!",
"Password": "Contraseña",
"Password (confirmation)": "Confirmación de contraseña)",
"Password reset": "Restablecimiento de contraseña",
"Past events": "Eventos pasados",
"Pending": "Pendiente",
"Pick an identity": "Elige una identidad",
"Please check your spam folder if you didn't receive the email.": "Verifique su carpeta de correo no deseado (spam) si no recibió el correo electrónico.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Póngase en contacto con el administrador de Mobilizon de esta instancia si cree que esto es un error.",
"Please enter your password to confirm this action.": "Introduzca su contraseña para confirmar esta acción.",
"Please make sure the address is correct and that the page hasn't been moved.": "Asegúrese de que la dirección sea correcta y que la página no se haya movido.",
"Please read the full rules": "Por favor lea las reglas completas",
"Please refresh the page and retry.": "Actualice la página y vuelva a intentarlo.",
"Post a comment": "Publicar un comentario",
"Post a reply": "Publica una respuesta",
"Postal Code": "Código postal",
"Preferences": "Preferencias",
"Previous page": "Pagina anterior",
"Privacy Policy": "Política de privacidad",
"Private event": "Evento privado",
"Private feeds": "Feeds privados",
"Profiles": "Perfiles",
"Public RSS/Atom Feed": "RSS/Atom Feed público",
"Public comment moderation": "Moderación de comentarios públicos",
"Public event": "Evento público",
"Public feeds": "Feeds públicos",
"Public iCal Feed": "Feed público de iCal",
"Publish": "Publicar",
"Published events": "Eventos publicados",
"RSS/Atom Feed": "RSS/Atom Feed",
"Read Framasofts statement of intent on the Framablog": "Lea la declaración de intenciones de Framasoft en el Framablog",
"Redirecting to event…": "Redirigiendo al evento …",
"Region": "Región",
"Register": "Registrar",
"Register an account on Mobilizon!": "¡Registre una cuenta en Mobilizon!",
"Register for an event by choosing one of your identities": "Regístrese para un evento eligiendo una de sus identidades",
"Registration is allowed, anyone can register.": "El registro está permitido, cualquiera puede registrarse.",
"Registration is closed.": "El registro está cerrado.",
"Registration is currently closed.": "El registro está actualmente cerrado.",
"Registrations are restricted by whitelisting.": "Los registros están restringidos por la lista blanca.",
"Reject": "Rechazar",
"Rejected": "Rechazado",
"Rejected participations": "Participaciones rechazadas",
"Reopen": "Reabrir",
"Reply": "Respuesta",
"Report": "Declarar",
"Report this comment": "Informar de este comentario",
"Report this event": "Informa de este evento",
"Reported": "Declarado",
"Reported by": "Declarado por",
"Reported by someone on {domain}": "Declarado por alguien en {dominio}",
"Reported by {reporter}": "Declarado por {reporter}",
"Reported identity": "Identidad declarada",
"Reports": "Declaraciones",
"Requests": "Solicitudes",
"Resend confirmation email": "Reenviar correo electrónico de confirmación",
"Reset my password": "Restablecer mi contraseña",
"Resolved": "Resuelto",
"Resource provided is not an URL": "El recurso proporcionado no es una URL",
"Role": "Rol",
"Save": "Guardar",
"Save draft": "Guardar borrador",
"Search": "Buscar",
"Search events, groups, etc.": "Buscar eventos, grupos, etc.",
"Search results: \"{search}\"": "Resultados de búsqueda: \"{search}\"",
"Searching…": "Buscando…",
"Send email": "Enviar correo electrónico",
"Send me an email to reset my password": "Enviarme un correo electrónico para restablecer mi contraseña",
"Send me the confirmation email once again": "Envíame el correo electrónico de confirmación una vez más",
"Send the report": "Enviar el informe",
"Set an URL to a page with your own terms.": "Establezca una URL a una página con sus propios términos.",
"Settings": "Configuraciones",
"Share this event": "Comparte este event",
"Show map": "Mostrar mapa",
"Show remaining number of places": "Muestra el número restante de plazas",
"Show the time when the event begins": "Muestra la hora en que comienza el evento",
"Show the time when the event ends": "Muestra la hora en que finaliza el evento",
"Sign up": "Regístrate",
"Software to the people": "Software para la gente",
"Starts on…": "Comienza en …",
"Status": "Estado",
"Street": "Calle",
"Tentative: Will be confirmed later": "Intento: se confirmará más tarde",
"Terms": "Condiciones",
"The account's email address was changed. Check your emails to verify it.": "Se cambió la dirección de correo electrónico de la cuenta. Revise sus correos electrónicos para verificarlo.",
"The actual number of participants may differ, as this event is hosted on another instance.": "El número real de participantes puede diferir ya que este evento se aloja en otra instancia.",
"The content came from another server. Transfer an anonymous copy of the report?": "El contenido vino de otro servidor. ¿Transferir una copia anónima del informe?",
"The current identity doesn't have any permission on this event. You should probably change it.": "La identidad actual no tiene ningún permiso para este evento. Probablemente deberías cambiarlo.",
"The current password is invalid": "La contraseña actual no es válida",
"The draft event has been updated": "El borrador del evento ha sido actualizado",
"The event has been created as a draft": "El evento ha sido creado como borrador",
"The event has been published": "El evento ha sido publicado",
"The event has been updated": "El evento ha sido actualizado",
"The event has been updated and published": "El evento ha sido actualizado y publicado",
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "El organizador del evento ha elegido validar las participaciones manualmente. ¿Desea agregar una pequeña nota para explicar por qué desea participar en este evento?",
"The event organizer didn't add any description.": "El organizador del evento no agregó ninguna descripción.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "El organizador del evento aprueba manualmente las participaciones. Dado que ha elegido participar sin una cuenta, explique por qué desea participar en este evento.",
"The event title will be ellipsed.": "El título del evento será elipsado.",
"The new email doesn't seem to be valid": "El nuevo correo electrónico no parece ser válido",
"The new email must be different": "El nuevo correo electrónico debe ser diferente",
"The new password must be different": "La nueva contraseña debe ser diferente",
"The page you're looking for doesn't exist.": "La página que estás buscando no existe.",
"The password provided is invalid": "La contraseña proporcionada no es válida",
"The password was successfully changed": "La contraseña fue cambiada con éxito",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "El informe se enviará a los moderadores de su instancia. Puede explicar por qué declara este contenido a continuación.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "La cuenta de usuario que está intentando iniciar sesión aún no se ha confirmado. Verifique su bandeja de entrada de correo electrónico y eventualmente su carpeta de correo no deseado.",
"The {default_terms} will be used. They will be translated in the user's language.": "Se utilizarán los {default_terms}. Se traducirán en el idioma del usuario.",
"There are {participants} participants.": "Hay {participantes} participantes.",
"There will be no way to recover your data.": "No habrá forma de recuperar sus datos.",
"These events may interest you": "Estos eventos pueden interesarte",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Esta instancia de Mobilizon y este organizador de eventos permiten participaciones anónimas pero requieren validación mediante confirmación por correo electrónico.",
"This email is already registered as participant for this event": "Este correo electrónico ya está registrado como participante para este evento",
"This information is saved only on your computer. Click for details": "Esta información se guarda solo en su computadora. Haga clic para más detalles",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Esta instalación (llamada \"instancia\") puede fácilmente {interconnect}, gracias a {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Esta instancia no está abierta a registros pero puede registrarse en otras instancias.",
"This is a demonstration site to test the beta version of Mobilizon.": "Este es un sitio de demostración para probar la versión beta de Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Esto eliminará/anonimizará todo el contenido (eventos, comentarios, mensajes, participaciones ...) creado con esta identidad.",
"Title": "Título",
"To achieve your registration, please create a first identity profile.": "Para conseguir su registro, cree un primer perfil de identidad.",
"To change the world, change the software": "Para cambiar el mundo, cambia el software",
"To confirm, type your event title \"{eventTitle}\"": "Para confirmar, escriba el título de su evento \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Para confirmar, escriba su nombre de usuario de identidad \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transferir a {outsideDomain}",
"Type": "Tipo",
"URL": "URL",
"Unfortunately, this instance isn't opened to registrations": "Desafortunadamente, esta instancia no está abierta a registros",
"Unfortunately, your participation request was rejected by the organizers.": "Lamentablemente, su solicitud de participación fue rechazada por los organizadores.",
"Unknown": "Desconocido",
"Unknown actor": "Actor desconocido",
"Unknown error.": "Error desconocido.",
"Unsaved changes": "Cambios no guardados",
"Upcoming": "Próximo",
"Update event {name}": "Actualizar evento {name}",
"Update my event": "Actualizar mi evento",
"Updated": "Actualizado",
"Username": "Nombre de usuario",
"Users": "Los usuarios",
"View a reply": "|Ver una respuesta|Ver {totalReplies} respuestas",
"View event page": "Ver página del evento",
"View everything": "Ver todo",
"View page on {hostname} (in a new window)": "Ver página en {hostname} (en una nueva ventana)",
"Visible everywhere on the web (public)": "Visible en todas partes de la web (público)",
"Waiting for organization team approval.": "Esperando la aprobación del equipo de la organización.",
"Waiting list": "Lista de espera",
"Warning": "Advertencia",
"We just sent an email to {email}": "Acabamos de enviar un correo electrónico 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>.": "Queremos desarrollar un <b> común digital </b>, que todos puedan hacer suyo, que respete la <b> privacidad y activismo por diseño </b>.",
"We will redirect you to your instance in order to interact with this event": "Lo redirigiremos a su instancia para interactuar con este evento",
"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.": "No cambiaremos el mundo de Facebook. La herramienta con la que soñamos, las corporaciones de capitalismo de vigilancia no la desarrollarán ya que no podrían beneficiarse de ella. Esta es una oportunidad para construir algo mejor, adoptando otro enfoque.",
"Website / URL": "Sitio web / URL",
"Welcome back {username}!": "¡Bienvenido de nuevo {username}!",
"Welcome back!": "¡Bienvenido de nuevo!",
"Welcome on your administration panel": "Bienvenido en tu panel de administración",
"Welcome to Mobilizon, {username}!": "¡Bienvenido a Mobilizon, {username}!",
"Who can view this event and participate": "Quién puede ver este evento y participar",
"World map": "Mapa del mundo",
"Write something…": "Escribe algo…",
"You and one other person are going to this event": "Eres el único que va a este evento|Usted y otra persona asistirán a este evento|Usted y las personas {approved}asistirán a este evento.",
"You are already a participant of this event.": "Ya eres un participante de este evento.",
"You are participating in this event anonymously": "Estás participando en este evento de forma anónima",
"You are participating in this event anonymously but didn't confirm participation": "Participas en este evento de forma anónima pero no has confirmado la participación",
"You can add tags by hitting the Enter key or by adding a comma": "Puede agregar etiquetas presionando la tecla Intro o agregando una coma",
"You can try another search term or drag and drop the marker on the map": "Puedes probar con otro término de búsqueda o arrastrar y soltar el marcador en el mapa",
"You can't remove your last identity.": "No puedes eliminar tu última identidad.",
"You don't follow any instances yet.": "Todavía no sigues ninguna instancia.",
"You have been disconnected": "Has sido desconectado",
"You have cancelled your participation": "Has cancelado tu participación",
"You have one event in {days} days.": "No tienes eventos en {days} días|Tienes un evento en {days} días. |Tienes {count} eventos en {days} días",
"You have one event today.": "No tienes eventos hoy|Tienes un evento hoy.|Tienes {count} eventos hoy",
"You have one event tomorrow.": "No tienes eventos mañana|Tienes un evento mañana.|Tienes {count} eventos mañana",
"You may also ask to {resend_confirmation_email}.": "También puede solicitar {resend_confirmation_email}.",
"You need to login.": "Necesitas iniciar sesión.",
"You will be redirected to the original instance": "Serás redirigido a la instancia original",
"You wish to participate to the following event": "Desea participar en el siguiente evento",
"You'll receive a confirmation email.": "Recibirá un correo electrónico de confirmación.",
"Your account has been successfully deleted": "Su cuenta ha sido eliminada exitosamente",
"Your account has been validated": "Su cuenta ha sido validada",
"Your account is being validated": "Su cuenta esta siendo validada",
"Your account is nearly ready, {username}": "Su cuenta está casi lista, {username}",
"Your current email is {email}. You use it to log in.": "Su correo electrónico actual es {correo electrónico}. Lo usas para iniciar sesión.",
"Your email has been changed": "Su correo ha sido cambiado",
"Your email is being changed": "Su correo electrónico está siendo cambiado",
"Your email is not whitelisted, you can't register.": "Su correo electrónico no está en la lista blanca, no puede registrarse.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Su correo electrónico solo se utilizará para confirmar que es una persona real y enviarle actualizaciones eventuales para este evento. NO se transmitirá a otras instancias ni al organizador del evento.",
"Your federated identity": "Su identidad federada",
"Your local administrator resumed its policy:": "Su administrador local reanudó su política:",
"Your participation has been confirmed": "Su participación ha sido confirmada",
"Your participation has been rejected": "Su participación ha sido rechazada",
"Your participation has been requested": "Su participación ha sido solicitada",
"Your participation has been validated": "Su participación ha sido validada",
"Your participation is being validated": "Tu participación está siendo validada",
"Your participation status has been changed": "Su estado de participación ha cambiado",
"[This comment has been deleted]": "[Este comentario ha sido eliminado]",
"[deleted]": "[eliminado]",
"a decentralised federation protocol": "un protocolo de federación descentralizado",
"as {identity}": "como {identity}",
"default Mobilizon terms": "términos predeterminados de Mobilizon",
"e.g. 10 Rue Jangot": "e.j. 10 Rue Jangot",
"firstDayOfWeek": "0",
"iCal Feed": "iCal Feed",
"interconnect with others like it": "interconectarse con otros como él",
"its source code is public": "su código fuente es público",
"on our blog": "en nuestro blog",
"profile@instance": "perfil@instancia",
"resend confirmation email": "reenviar correo electrónico de confirmación",
"respect of the fundamental freedoms": "respeto de las libertades fundamentales",
"with another identity…": "con otra identidad …",
"{approved} / {total} seats": "Asientos {approved}/{total}",
"{count} participants": "Aún no hay participantes|Un participante|{count} participantes",
"{count} requests waiting": "{count} solicitudes en espera",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantiza {respect} de las personas que lo usarán. Desde {source}, cualquiera puede auditarlo, lo que garantiza su transparencia.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© The Mobilizon Contributors {date} - Hecho con Elixir, Phoenix, VueJS y con un poco de amor y algunas semanas",
"© The OpenStreetMap Contributors": "© The OpenStreetMap Contributors"
"<b>Please do not use it in any real way.</b>": "<b>Por favor, no lo use de ninguna manera real</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Una herramienta fácil de usar, emancipadora y ética, para reunir, organizar y movilizar.",
"A validation email was sent to {email}": "Un correo electrónico de confirmación fue enviado a {email}",
"Abandon edition": "Abandonar la edición",
"About": "Acerca de",
"About Mobilizon": "A propósito de Mobilizon",
"About this event": "Acerca este evento",
"About this instance": "Acerca de esta instancia",
"Accepted": "Aceptado",
"Account": "Cuenta",
"Account settings": "Configuración de la cuenta",
"Add": "Añadir",
"Add a note": "Añade una nota",
"Add an address": "Añade una dirección",
"Add an instance": "Añade una instancia",
"Add some tags": "Añade algunas etiquetas",
"Add to my calendar": "Añadir a mi calendario",
"Additional comments": "Comentarios adicionales",
"Admin": "Administrador",
"Admin settings": "Ajustes de administración",
"Admin settings successfully saved.": "Ajustes de administración guardados correctamente.",
"Administration": "Administración",
"All the places have already been taken": "Todos los plazas han sido ocupados | Un plazas aún está disponible | {lugares} plazas aún están disponibles",
"Allow all comments": "Permitir todos los comentarios",
"Allow registrations": "Permitir registros",
"An error has occurred.": "Se ha producido un error.",
"Anonymous participant": "Participante anónimo",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Los participantes anónimos deberán confirmar su participación por correo electrónico.",
"Anonymous participations": "Participaciones anónimas",
"Approve": "Aprobar",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "¿Estás realmente seguro de que deseas eliminar toda tu cuenta? Lo perderás todo. Las identidades, la configuración, los eventos creados, los mensajes y las participaciones desaparecerán para siempre.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "¿Estás seguro de que quieres <b> eliminar </b> este comentario? Esta acción no se puede deshacer.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "¿Estás seguro de que quieres <b> eliminar </b> este evento? Esta acción no se puede deshacer. Es posible que desee entablar una conversación con el creador del evento o editar el evento en su lugar.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "¿Seguro que quieres cancelar la creación del evento? Perderás todas las modificaciones.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "¿Seguro que quieres cancelar la edición del evento? Perderás todas las modificaciones.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "¿Está seguro de que desea cancelar su participación en el evento \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "¿Seguro que quieres eliminar este evento? Esta acción no se puede revertir.",
"Avatar": "Avatar",
"Back to previous page": "Volver a la página anterior",
"Before you can login, you need to click on the link inside it to validate your account": "Antes de iniciar sesión, debe hacer clic en el enlace que se encuentra dentro para validar su cuenta",
"By @{username}": "Por @{username}",
"Cancel": "Cancelar",
"Cancel anonymous participation": "Cancelar participación anónima",
"Cancel creation": "Cancelar creación",
"Cancel edition": "Cancelar edición",
"Cancel my participation request…": "Cancelar mi solicitud de participación …",
"Cancel my participation…": "Cancelar mi participación …",
"Cancelled: Won't happen": "Cancelado: no sucederá",
"Category": "Categoría",
"Change": "Cambiar",
"Change my email": "Cambiar mi correo electrónico",
"Change my identity…": "Cambiar mi identidad …",
"Change my password": "Cambiar mi contraseña",
"Clear": "Limpiar",
"Click to select": "Haz clic para selaccionar",
"Click to upload": "Haz clic para subir (upload)",
"Close": "Cerrar",
"Close comments for all (except for admins)": "Cerrar comentarios para todos (excepto para administradores)",
"Closed": "Cerrado",
"Comment deleted": "Comentario borrado",
"Comment from @{username} reported": "Comentario de @{username} declarado",
"Comments": "Comentarios",
"Comments have been closed.": "Los comentarios han sido cerrados.",
"Confirm my participation": "Confirma mi participación",
"Confirm my particpation": "Confirmar mi participación",
"Confirmed: Will happen": "Confirmado: sucederá",
"Continue editing": "Continua editando",
"Country": "País",
"Create": "Crear",
"Create a new event": "Crear un nuevo evento",
"Create a new group": "Crear un nuevo grupo",
"Create a new identity": "Crear una nueva identidad",
"Create and manage several identities from the same account": "Crear y administrar varias identidades desde la misma cuenta",
"Create group": "Crear un grupo",
"Create my event": "Crear mi evento",
"Create my group": "Crear mi grupo",
"Create my profile": "Crear mi perfil",
"Create token": "Crear token",
"Create, edit or delete events": "Crear, editar o eliminar eventos",
"Creator": "Creador",
"Current identity has been changed to {identityName} in order to manage this event.": "La identidad actual se ha cambiado a {identityName} para gestionar este evento.",
"Current page": "Página actual",
"Custom": "Personalizado",
"Custom URL": "URL personalizada",
"Custom text": "Texto personalizado",
"Dashboard": "Panel de control",
"Date": "Fecha",
"Date and time settings": "Configuración de fecha y hora",
"Date parameters": "Parámetros de fecha",
"Default": "Valor predeterminados",
"Default Mobilizon.org terms": "Términos predeterminados de Mobilizon.org",
"Delete": "Eliminar",
"Delete Comment": "Eliminar comentario",
"Delete Event": "Eliminar evento",
"Delete account": "Eliminar cuenta",
"Delete event": "Eliminar evento",
"Delete everything": "Eliminar todo",
"Delete my account": "Eliminar mi cuenta",
"Delete this identity": "Eliminar esta identidad",
"Delete your identity": "Eliminar tu identidad",
"Delete {eventTitle}": "Eliminar {eventTitle}",
"Delete {preferredUsername}": "Eliminar {preferredUsername}",
"Deleting comment": "Eliminando comentario",
"Deleting event": "Eliminando evento",
"Deleting my account will delete all of my identities.": "Eliminar mi cuenta eliminará todas mis identidades.",
"Deleting your Mobilizon account": "Eliminando tu cuenta de Mobilizon",
"Description": "Descripción",
"Didn't receive the instructions ?": "¿No recibiste las instrucciones?",
"Display name": "Mostrar nombre",
"Display participation price": "Mostrar precio de participación",
"Domain": "Dominio",
"Draft": "Borrador",
"Drafts": "Borradores",
"Edit": "Editar",
"Eg: Stockholm, Dance, Chess…": "Ej .: Estocolmo, Danza, Ajedrez …",
"Either on the {instance} instance or on another instance.": "Ya sea en la instancia {instancia} o en otra instancia.",
"Either the account is already validated, either the validation token is incorrect.": "O la cuenta ya está validada, o bien el testigo de validación es incorrecto.",
"Either the email has already been changed, either the validation token is incorrect.": "O el correo electrónico ya se ha cambiado, o bien el token de validación es incorrecto.",
"Either the participation has already been validated, either the validation token is incorrect.": "O la participación ya ha sido validada, o bien el token de validación es incorrecto.",
"Email": "Correo elecxtrónico",
"Ends on…": "Termina en …",
"Enjoy discovering Mobilizon!": "¡Disfruta descubriendo Mobilizon!",
"Enter the link URL": "Introduzca la URL del enlace",
"Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Introduzca sus propios términos. Etiquetas HTML permitidas. Los términos de Mobilizon.org se proporcionan como plantilla.",
"Error while changing email": "Error al cambiar el correo electrónico",
"Error while communicating with the server.": "Error al comunicarse con el servidor.",
"Error while saving report.": "Error al guardar el informe.",
"Error while validating account": "Error al validar la cuenta",
"Error while validating participation": "Error al validar la participación",
"Event": "Evento",
"Event already passed": "Evento ya pasado",
"Event cancelled": "Evento cancelado",
"Event creation": "Creación de evento",
"Event edition": "Edición del evento",
"Event list": "Lista de eventos",
"Event not found.": "Evento no encontrado.",
"Event page settings": "Configuración de la página del evento",
"Event to be confirmed": "Evento por confirmar",
"Event {eventTitle} deleted": "Evento {eventTitle} eliminado",
"Event {eventTitle} reported": "Evento {eventTitle} declarado",
"Events": "Eventos",
"Ex: test.mobilizon.org": "Ej: test.mobilizon.org",
"Exclude": "Excluir",
"Explore": "Explorar",
"Failed to save admin settings": "Error al guardar la configuración de administrador",
"Featured events": "Eventos particulares",
"Features": "Caracteristicas",
"Federation": "Federación",
"Find an address": "Buscar una dirección",
"Find an instance": "Buscar una instancia",
"Followers": "Seguidores",
"Followings": "Seguimientos",
"For instance: London, Taekwondo, Architecture…": "Por ejemplo: Londres, Taekwondo, Arquitectura …",
"Forgot your password ?": "¿Olvidaste tu contraseña ?",
"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?": "Desde una fiesta de cumpleaños con amigos y familiares hasta una marcha por el cambio climático, en este momento, nuestras reuniones están <b> atrapadas dentro de las plataformas de los gigantes tecnológicos </b>. ¿Cómo podemos organizarnos, cómo podemos hacer clic en \"Asistir\", sin <b> proporcionar datos privados </b> a Facebook o <b> encerrarnos </b> dentro de MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "Desde {startDate} en {startTime} hasta {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Desde el {startDate} en {startTime} hasta el {endDate} en {endTime}",
"From the {startDate} to the {endDate}": "Desde el {startDate} hasta el {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Reúna ⋅ Organice ⋅ Movilice",
"General": "General",
"General information": "Información general",
"Getting location": "Obtener ubicación",
"Go": "Ir",
"Going as {name}": "Ir como {nombre}",
"Group List": "Lista de grupo",
"Group full name": "Nombre completo del grupo",
"Group name": "Nombre del grupo",
"Group {displayName} created": "Grupo {displayName} creado",
"Groups": "Grupos",
"Headline picture": "Imagen del titular",
"Hide replies": "Ocultar respuestas",
"I create an identity": "Crear una identidad",
"I don't have a Mobilizon account": "No tengo una cuenta de Mobilizon",
"I have a Mobilizon account": "Tengo una cuenta de Mobilizon",
"I have an account on another Mobilizon instance.": "Tengo una cuenta en otra instancia de Mobilizon.",
"I participate": "Yo participo",
"I want to allow people to participate without an account.": "Quiero permitir que las personas participen sin una cuenta.",
"I want to approve every participation request": "Quiero aprobar cada solicitud de participación",
"Identity {displayName} created": "Identidad {displayName} creada",
"Identity {displayName} deleted": "Identidad {displayName} eliminada",
"Identity {displayName} updated": "Identidad {displayName} actualizada",
"If an account with this email exists, we just sent another confirmation email to {email}": "Si existe una cuenta con este correo electrónico, acabamos de enviar otro correo electrónico de confirmación a {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Si esta identidad es el único administrador de algún grupo, debe eliminarlo antes de poder eliminar esta identidad.",
"If you want, you may send a message to the event organizer here.": "Si lo desea, puede enviar un mensaje al organizador del evento aquí.",
"Impossible to login, your email or password seems incorrect.": "Imposible iniciar sesión, su correo electrónico o contraseña parece incorrecta.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Mientras tanto, tenga en cuenta que el software no está (todavía) terminado. Más información {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "La instalación de Mobilizon permitirá a las comunidades liberarse de los servicios de los gigantes tecnológicos creando <b> su propia plataforma de eventos </b>.",
"Instance Description": "Descripción de instancia",
"Instance Name": "Nombre de instancia",
"Instance Terms": "Términos de Instancia",
"Instance Terms Source": "Fuente de Términos de Instancia",
"Instance Terms URL": "URL de Términos de Instancia",
"Instance settings": "Configuraciones de instancia",
"Instances": "Instancias",
"Join {instance}, a Mobilizon instance": "Únase a {instancia}, una instancia de Mobilizon",
"Last published event": "Último evento publicado",
"Last week": "La semana pasada",
"Learn more": "Aprende más",
"Learn more about Mobilizon": "Conoce más sobre Mobilizon",
"Leave event": "Dejar evento",
"Leaving event \"{title}\"": "Saliendo del evento \"{title}\"",
"Let's create a new common": "Creemos un nuevo \"bien común\"",
"License": "Licencia",
"Limited number of places": "Número limitado de plazas",
"Load more": "Carga más",
"Locality": "Localidad",
"Log in": "Iniciar sesión",
"Log out": "Cerrar sesión",
"Login": "Iniciar sesión",
"Login on Mobilizon!": "¡Inicia sesión en Mobilizon!",
"Login on {instance}": "Inicia sesión en {instancia}",
"Manage participations": "Administrar participaciones",
"Mark as resolved": "Marca como resuelto",
"Members": "Miembros",
"Message": "Mensaje",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon es una red federada. Puede interactuar con este evento desde un servidor diferente.",
"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 software gratuito/libre que permitirá a las comunidades crear <b> sus propios espacios </b> para publicar eventos con el fin de emanciparse mejor de los gigantes tecnológicos.",
"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 está en desarrollo, añadiremos nuevas funciones a este sitio durante las actualizaciones regulares, hasta el lanzamiento de la <b> versión 1 del software en la primera mitad de 2020 </b>.",
"Mobilizons licence": "Licencia de Mobilizon",
"Moderated comments (shown after approval)": "Comentarios moderados (mostrados después de la aprobación)",
"Moderation": "Moderación",
"Moderation log": "Registro de moderación",
"My account": "Mi cuenta",
"My events": "Mis eventos",
"My identities": "Mis identidades",
"Name": "Nombre",
"New email": "Nuevo correo electrónico",
"New note": "Nueva nota",
"New password": "Nueva contraseña",
"New profile": "Nuevo perfil",
"Next page": "Siguiente página",
"No actors found": "No se encontraron actores",
"No address defined": "Ninguna dirección definida",
"No closed reports yet": "Aún no hay informes cerrados",
"No comment": "Sin comentarios",
"No comments yet": "Sin comentarios aún",
"No end date": "Sin fecha de finalización",
"No events found": "No se encontraron eventos",
"No group found": "Ningún grupo encontrado",
"No groups found": "No se encontraron grupos",
"No instance follows your instance yet.": "Ninguna instancia sigue a tu instancia todavía.",
"No instance to approve|Approve instance|Approve {number} instances": "No hay instancia para aprobar|Aprobar instancia|Aprobar {número} instancias",
"No instance to reject|Reject instance|Reject {number} instances": "Ninguna instancia para rechazar | Rechazar instancia | Rechazar {número} instancias",
"No instance to remove|Remove instance|Remove {number} instances": "No hay instancias para eliminar|Eliminar instancias|Eliminar {número} instancias",
"No message": "Sin mensaje",
"No notification settings yet": "Aún no hay configuración de notificaciones",
"No open reports yet": "Aún no hay informes abiertos",
"No participant to approve|Approve participant|Approve {number} participants": "Ningún participante debe aprobar|Aprobar participante|Aprobar {number} participantes",
"No participant to reject|Reject participant|Reject {number} participants": "Ningún participante que rechazar|Rechazar participante|Rechazar {number} participantes",
"No preferences yet": "Aún no hay preferencias",
"No resolved reports yet": "Aún no hay informes resueltos",
"No results for \"{queryText}\"": "No hay resultados para \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "No se encontró ninguna cuenta de usuario con este correo electrónico. Tal vez hiciste un error tipográfico?",
"Notes": "Notas",
"Notifications": "Notificaciones",
"Number of places": "Numero de plazas",
"OK": "OK",
"Old password": "Contraseña anterior",
"On {date}": "el {date}",
"On {date} ending at {endTime}": "El {fecha} que termina en {endTime}",
"On {date} from {startTime} to {endTime}": "El {fecha} de {startTime} a {endTime}",
"On {date} starting at {startTime}": "El {fecha} a partir de {startTime}",
"One person is going": "Nadie va|Una persona va|personas {approved} van",
"Only accessible through link and search (private)": "Solo accesible a través de enlace y búsqueda (privado)",
"Only alphanumeric characters and underscores are supported.": "Solo se admiten caracteres alfanuméricos y guiones bajos.",
"Open": "Abrir",
"Opened reports": "Informes abiertos",
"Or": "O",
"Organized": "Organizado",
"Organized by {name}": "Organizado por {name}",
"Organizer": "Organizador",
"Other software may also support this.": "Otro software también puede soportar esto.",
"Otherwise this identity will just be removed from the group administrators.": "De lo contrario, esta identidad solo se eliminará de los administradores del grupo.",
"Page": "Página",
"Page limited to my group (asks for auth)": "Página limitada a mi grupo (solicita autenticación)",
"Page not found": "Página no encontrada",
"Participant": "Participante",
"Participant already was rejected.": "El participante ya fue rechazado.",
"Participant has already been approved as participant.": "El participante ya ha sido aprobado como participante.",
"Participants": "Participantes",
"Participate": "Participar",
"Participate using your email address": "Participa usando tu dirección de correo electrónico",
"Participation approval": "Aprobación de la participación",
"Participation confirmation": "Confirmación de participación",
"Participation requested!": "¡Participación solicitada!",
"Password": "Contraseña",
"Password (confirmation)": "Confirmación de contraseña)",
"Password reset": "Restablecimiento de contraseña",
"Past events": "Eventos pasados",
"Pending": "Pendiente",
"Pick an identity": "Elige una identidad",
"Please check your spam folder if you didn't receive the email.": "Verifique su carpeta de correo no deseado (spam) si no recibió el correo electrónico.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Póngase en contacto con el administrador de Mobilizon de esta instancia si cree que esto es un error.",
"Please enter your password to confirm this action.": "Introduzca su contraseña para confirmar esta acción.",
"Please make sure the address is correct and that the page hasn't been moved.": "Asegúrese de que la dirección sea correcta y que la página no se haya movido.",
"Please read the full rules": "Por favor lea las reglas completas",
"Please refresh the page and retry.": "Actualice la página y vuelva a intentarlo.",
"Post a comment": "Publicar un comentario",
"Post a reply": "Publica una respuesta",
"Postal Code": "Código postal",
"Preferences": "Preferencias",
"Previous page": "Pagina anterior",
"Privacy Policy": "Política de privacidad",
"Private event": "Evento privado",
"Private feeds": "Feeds privados",
"Profiles": "Perfiles",
"Public RSS/Atom Feed": "RSS/Atom Feed público",
"Public comment moderation": "Moderación de comentarios públicos",
"Public event": "Evento público",
"Public feeds": "Feeds públicos",
"Public iCal Feed": "Feed público de iCal",
"Publish": "Publicar",
"Published events": "Eventos publicados",
"RSS/Atom Feed": "RSS/Atom Feed",
"Read Framasofts statement of intent on the Framablog": "Lea la declaración de intenciones de Framasoft en el Framablog",
"Redirecting to event…": "Redirigiendo al evento …",
"Region": "Región",
"Register": "Registrar",
"Register an account on Mobilizon!": "¡Registre una cuenta en Mobilizon!",
"Register for an event by choosing one of your identities": "Regístrese para un evento eligiendo una de sus identidades",
"Registration is allowed, anyone can register.": "El registro está permitido, cualquiera puede registrarse.",
"Registration is closed.": "El registro está cerrado.",
"Registration is currently closed.": "El registro está actualmente cerrado.",
"Registrations are restricted by whitelisting.": "Los registros están restringidos por la lista blanca.",
"Reject": "Rechazar",
"Rejected": "Rechazado",
"Rejected participations": "Participaciones rechazadas",
"Reopen": "Reabrir",
"Reply": "Respuesta",
"Report": "Declarar",
"Report this comment": "Informar de este comentario",
"Report this event": "Informa de este evento",
"Reported": "Declarado",
"Reported by": "Declarado por",
"Reported by someone on {domain}": "Declarado por alguien en {dominio}",
"Reported by {reporter}": "Declarado por {reporter}",
"Reported identity": "Identidad declarada",
"Reports": "Declaraciones",
"Requests": "Solicitudes",
"Resend confirmation email": "Reenviar correo electrónico de confirmación",
"Reset my password": "Restablecer mi contraseña",
"Resolved": "Resuelto",
"Resource provided is not an URL": "El recurso proporcionado no es una URL",
"Role": "Rol",
"Save": "Guardar",
"Save draft": "Guardar borrador",
"Search": "Buscar",
"Search events, groups, etc.": "Buscar eventos, grupos, etc.",
"Search results: \"{search}\"": "Resultados de búsqueda: \"{search}\"",
"Searching…": "Buscando…",
"Send email": "Enviar correo electrónico",
"Send me an email to reset my password": "Enviarme un correo electrónico para restablecer mi contraseña",
"Send me the confirmation email once again": "Envíame el correo electrónico de confirmación una vez más",
"Send the report": "Enviar el informe",
"Set an URL to a page with your own terms.": "Establezca una URL a una página con sus propios términos.",
"Settings": "Configuraciones",
"Share this event": "Comparte este event",
"Show map": "Mostrar mapa",
"Show remaining number of places": "Muestra el número restante de plazas",
"Show the time when the event begins": "Muestra la hora en que comienza el evento",
"Show the time when the event ends": "Muestra la hora en que finaliza el evento",
"Sign up": "Regístrate",
"Software to the people": "Software para la gente",
"Starts on…": "Comienza en …",
"Status": "Estado",
"Street": "Calle",
"Tentative: Will be confirmed later": "Intento: se confirmará más tarde",
"Terms": "Condiciones",
"The account's email address was changed. Check your emails to verify it.": "Se cambió la dirección de correo electrónico de la cuenta. Revise sus correos electrónicos para verificarlo.",
"The actual number of participants may differ, as this event is hosted on another instance.": "El número real de participantes puede diferir ya que este evento se aloja en otra instancia.",
"The content came from another server. Transfer an anonymous copy of the report?": "El contenido vino de otro servidor. ¿Transferir una copia anónima del informe?",
"The current identity doesn't have any permission on this event. You should probably change it.": "La identidad actual no tiene ningún permiso para este evento. Probablemente deberías cambiarlo.",
"The current password is invalid": "La contraseña actual no es válida",
"The draft event has been updated": "El borrador del evento ha sido actualizado",
"The event has been created as a draft": "El evento ha sido creado como borrador",
"The event has been published": "El evento ha sido publicado",
"The event has been updated": "El evento ha sido actualizado",
"The event has been updated and published": "El evento ha sido actualizado y publicado",
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "El organizador del evento ha elegido validar las participaciones manualmente. ¿Desea agregar una pequeña nota para explicar por qué desea participar en este evento?",
"The event organizer didn't add any description.": "El organizador del evento no agregó ninguna descripción.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "El organizador del evento aprueba manualmente las participaciones. Dado que ha elegido participar sin una cuenta, explique por qué desea participar en este evento.",
"The event title will be ellipsed.": "El título del evento será elipsado.",
"The new email doesn't seem to be valid": "El nuevo correo electrónico no parece ser válido",
"The new email must be different": "El nuevo correo electrónico debe ser diferente",
"The new password must be different": "La nueva contraseña debe ser diferente",
"The page you're looking for doesn't exist.": "La página que estás buscando no existe.",
"The password provided is invalid": "La contraseña proporcionada no es válida",
"The password was successfully changed": "La contraseña fue cambiada con éxito",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "El informe se enviará a los moderadores de su instancia. Puede explicar por qué declara este contenido a continuación.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "La cuenta de usuario que está intentando iniciar sesión aún no se ha confirmado. Verifique su bandeja de entrada de correo electrónico y eventualmente su carpeta de correo no deseado.",
"The {default_terms} will be used. They will be translated in the user's language.": "Se utilizarán los {default_terms}. Se traducirán en el idioma del usuario.",
"There are {participants} participants.": "Hay {participantes} participantes.",
"There will be no way to recover your data.": "No habrá forma de recuperar sus datos.",
"These events may interest you": "Estos eventos pueden interesarte",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Esta instancia de Mobilizon y este organizador de eventos permiten participaciones anónimas pero requieren validación mediante confirmación por correo electrónico.",
"This email is already registered as participant for this event": "Este correo electrónico ya está registrado como participante para este evento",
"This information is saved only on your computer. Click for details": "Esta información se guarda solo en su computadora. Haga clic para más detalles",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Esta instalación (llamada \"instancia\") puede fácilmente {interconnect}, gracias a {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Esta instancia no está abierta a registros pero puede registrarse en otras instancias.",
"This is a demonstration site to test the beta version of Mobilizon.": "Este es un sitio de demostración para probar la versión beta de Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Esto eliminará/anonimizará todo el contenido (eventos, comentarios, mensajes, participaciones ...) creado con esta identidad.",
"Title": "Título",
"To achieve your registration, please create a first identity profile.": "Para conseguir su registro, cree un primer perfil de identidad.",
"To change the world, change the software": "Para cambiar el mundo, cambia el software",
"To confirm, type your event title \"{eventTitle}\"": "Para confirmar, escriba el título de su evento \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Para confirmar, escriba su nombre de usuario de identidad \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transferir a {outsideDomain}",
"Type": "Tipo",
"URL": "URL",
"Unfortunately, this instance isn't opened to registrations": "Desafortunadamente, esta instancia no está abierta a registros",
"Unfortunately, your participation request was rejected by the organizers.": "Lamentablemente, su solicitud de participación fue rechazada por los organizadores.",
"Unknown": "Desconocido",
"Unknown actor": "Actor desconocido",
"Unknown error.": "Error desconocido.",
"Unsaved changes": "Cambios no guardados",
"Upcoming": "Próximo",
"Update event {name}": "Actualizar evento {name}",
"Update my event": "Actualizar mi evento",
"Updated": "Actualizado",
"Username": "Nombre de usuario",
"Users": "Los usuarios",
"View a reply": "|Ver una respuesta|Ver {totalReplies} respuestas",
"View event page": "Ver página del evento",
"View everything": "Ver todo",
"View page on {hostname} (in a new window)": "Ver página en {hostname} (en una nueva ventana)",
"Visible everywhere on the web (public)": "Visible en todas partes de la web (público)",
"Waiting for organization team approval.": "Esperando la aprobación del equipo de la organización.",
"Waiting list": "Lista de espera",
"Warning": "Advertencia",
"We just sent an email to {email}": "Acabamos de enviar un correo electrónico 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>.": "Queremos desarrollar un <b> común digital </b>, que todos puedan hacer suyo, que respete la <b> privacidad y activismo por diseño </b>.",
"We will redirect you to your instance in order to interact with this event": "Lo redirigiremos a su instancia para interactuar con este evento",
"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.": "No cambiaremos el mundo de Facebook. La herramienta con la que soñamos, las corporaciones de capitalismo de vigilancia no la desarrollarán ya que no podrían beneficiarse de ella. Esta es una oportunidad para construir algo mejor, adoptando otro enfoque.",
"Website / URL": "Sitio web / URL",
"Welcome back {username}!": "¡Bienvenido de nuevo {username}!",
"Welcome back!": "¡Bienvenido de nuevo!",
"Welcome on your administration panel": "Bienvenido en tu panel de administración",
"Welcome to Mobilizon, {username}!": "¡Bienvenido a Mobilizon, {username}!",
"Who can view this event and participate": "Quién puede ver este evento y participar",
"World map": "Mapa del mundo",
"Write something…": "Escribe algo…",
"You and one other person are going to this event": "Eres el único que va a este evento|Usted y otra persona asistirán a este evento|Usted y las personas {approved}asistirán a este evento.",
"You are already a participant of this event.": "Ya eres un participante de este evento.",
"You are participating in this event anonymously": "Estás participando en este evento de forma anónima",
"You are participating in this event anonymously but didn't confirm participation": "Participas en este evento de forma anónima pero no has confirmado la participación",
"You can add tags by hitting the Enter key or by adding a comma": "Puede agregar etiquetas presionando la tecla Intro o agregando una coma",
"You can try another search term or drag and drop the marker on the map": "Puedes probar con otro término de búsqueda o arrastrar y soltar el marcador en el mapa",
"You can't remove your last identity.": "No puedes eliminar tu última identidad.",
"You don't follow any instances yet.": "Todavía no sigues ninguna instancia.",
"You have been disconnected": "Has sido desconectado",
"You have cancelled your participation": "Has cancelado tu participación",
"You have one event in {days} days.": "No tienes eventos en {days} días|Tienes un evento en {days} días. |Tienes {count} eventos en {days} días",
"You have one event today.": "No tienes eventos hoy|Tienes un evento hoy.|Tienes {count} eventos hoy",
"You have one event tomorrow.": "No tienes eventos mañana|Tienes un evento mañana.|Tienes {count} eventos mañana",
"You may also ask to {resend_confirmation_email}.": "También puede solicitar {resend_confirmation_email}.",
"You need to login.": "Necesitas iniciar sesión.",
"You will be redirected to the original instance": "Serás redirigido a la instancia original",
"You wish to participate to the following event": "Desea participar en el siguiente evento",
"You'll receive a confirmation email.": "Recibirá un correo electrónico de confirmación.",
"Your account has been successfully deleted": "Su cuenta ha sido eliminada exitosamente",
"Your account has been validated": "Su cuenta ha sido validada",
"Your account is being validated": "Su cuenta esta siendo validada",
"Your account is nearly ready, {username}": "Su cuenta está casi lista, {username}",
"Your current email is {email}. You use it to log in.": "Su correo electrónico actual es {correo electrónico}. Lo usas para iniciar sesión.",
"Your email has been changed": "Su correo ha sido cambiado",
"Your email is being changed": "Su correo electrónico está siendo cambiado",
"Your email is not whitelisted, you can't register.": "Su correo electrónico no está en la lista blanca, no puede registrarse.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Su correo electrónico solo se utilizará para confirmar que es una persona real y enviarle actualizaciones eventuales para este evento. NO se transmitirá a otras instancias ni al organizador del evento.",
"Your federated identity": "Su identidad federada",
"Your local administrator resumed its policy:": "Su administrador local reanudó su política:",
"Your participation has been confirmed": "Su participación ha sido confirmada",
"Your participation has been rejected": "Su participación ha sido rechazada",
"Your participation has been requested": "Su participación ha sido solicitada",
"Your participation has been validated": "Su participación ha sido validada",
"Your participation is being validated": "Tu participación está siendo validada",
"Your participation status has been changed": "Su estado de participación ha cambiado",
"[This comment has been deleted]": "[Este comentario ha sido eliminado]",
"[deleted]": "[eliminado]",
"a decentralised federation protocol": "un protocolo de federación descentralizado",
"as {identity}": "como {identity}",
"default Mobilizon terms": "términos predeterminados de Mobilizon",
"e.g. 10 Rue Jangot": "e.j. 10 Rue Jangot",
"firstDayOfWeek": "0",
"iCal Feed": "iCal Feed",
"interconnect with others like it": "interconectarse con otros como él",
"its source code is public": "su código fuente es público",
"on our blog": "en nuestro blog",
"profile@instance": "perfil@instancia",
"resend confirmation email": "reenviar correo electrónico de confirmación",
"respect of the fundamental freedoms": "respeto de las libertades fundamentales",
"with another identity…": "con otra identidad …",
"{approved} / {total} seats": "Asientos {approved}/{total}",
"{count} participants": "Aún no hay participantes|Un participante|{count} participantes",
"{count} requests waiting": "{count} solicitudes en espera",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantiza {respect} de las personas que lo usarán. Desde {source}, cualquiera puede auditarlo, lo que garantiza su transparencia.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© The Mobilizon Contributors {date} - Hecho con Elixir, Phoenix, VueJS y con un poco de amor y algunas semanas",
"© The OpenStreetMap Contributors": "© The OpenStreetMap Contributors"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,41 +0,0 @@
import ar from './ar';
import be from './be';
import ca from './ca';
import cs from './cs';
import de from './de';
import en_US from './en_US';
import es from './es';
import fi from './fi';
import fr_FR from './fr_FR';
import it from './it';
import ja from './ja';
import nl from './nl';
import oc from './oc';
import pl from './pl';
import pt from './pt';
import pt_BR from './pt_BR';
import ru from './ru';
import sv from './sv';
export default {
ar,
be,
ca,
cs,
de,
en: en_US,
en_US,
es,
fi,
fr: fr_FR,
fr_FR,
it,
ja,
nl,
oc,
pl,
pt,
pt_BR,
ru,
sv
}

43
js/src/i18n/index.ts Normal file
View File

@@ -0,0 +1,43 @@
/* eslint-disable @typescript-eslint/camelcase */
import ar from "./ar.json";
import be from "./be.json";
import ca from "./ca.json";
import cs from "./cs.json";
import de from "./de.json";
import en_US from "./en_US.json";
import es from "./es.json";
import fi from "./fi.json";
import fr_FR from "./fr_FR.json";
import it from "./it.json";
import ja from "./ja.json";
import nl from "./nl.json";
import oc from "./oc.json";
import pl from "./pl.json";
import pt from "./pt.json";
import pt_BR from "./pt_BR.json";
import ru from "./ru.json";
import sv from "./sv.json";
export default {
ar,
be,
ca,
cs,
de,
en: en_US,
en_US,
es,
fi,
fr: fr_FR,
fr_FR,
it,
ja,
nl,
oc,
pl,
pt,
pt_BR,
ru,
sv,
};

View File

@@ -1,14 +1,14 @@
{
"Add": "Aggiungi",
"Add an address": "Aggiungi un indirizzo",
"Add to my calendar": "Aggiungi al mio calendario",
"Allow all comments": "Permetti tutti i commenti",
"An error has occurred.": "C'è stato un errore.",
"Cancel": "Cancella",
"Cancel creation": "Cancella creazione",
"Change": "Cambia",
"Change my password": "Cambia la mia password",
"Change password": "Cambia password",
"Comments": "Commenti",
"Confirm my particpation": "Conferma la mia partecipazione"
"Add": "Aggiungi",
"Add an address": "Aggiungi un indirizzo",
"Add to my calendar": "Aggiungi al mio calendario",
"Allow all comments": "Permetti tutti i commenti",
"An error has occurred.": "C'è stato un errore.",
"Cancel": "Cancella",
"Cancel creation": "Cancella creazione",
"Change": "Cambia",
"Change my password": "Cambia la mia password",
"Change password": "Cambia password",
"Comments": "Commenti",
"Confirm my particpation": "Conferma la mia partecipazione"
}

View File

@@ -1,326 +1,326 @@
{
"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 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 @{username}": "Door @{username}",
"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",
"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…",
"{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"
"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 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 @{username}": "Door @{username}",
"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",
"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…",
"{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"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,305 +1,305 @@
{
"<b>Please do not use it in any real way.</b>": "<b>Nie wykorzystuj go do żadnych rzeczywistych celów.</b>",
"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",
"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 @{username}": "Od @{username}",
"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ą)",
"Comment from @{username} reported": "Zgłoszono komentarz @{username}",
"Comments": "Komentarze",
"Comments have been closed.": "Zamknięto 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ę…",
"Enjoy discovering Mobilizon!": "Ciesz się z odkrywania Mobilizon!",
"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",
"Hide replies": "Ukryj odpowiedzi",
"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 comments yet": "Nie ma jeszcze komentarzy",
"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.",
"Post a comment": "Wyślij komentarz",
"Post a reply": "Umieść odpowiedź",
"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": "Zarejestruj się",
"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": "Odrzucono",
"Rejected participations": "Odrzuceni uczestnicy",
"Report": "Zgłoś",
"Report this comment": "Zgłoś ten komentarz",
"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",
"Show the time when the event ends": "Pokaż czas zakończenia wydarzenia",
"Sign up": "Zarejestruj się",
"Software to the people": "Oprogramowanie dla ludzi",
"Starts on…": "Rozpoczyna się…",
"Status": "Stan",
"Street": "Ulica",
"Tentative: Will be confirmed later": "Niepewne: zostanie potwierdzone później",
"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",
"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"
"<b>Please do not use it in any real way.</b>": "<b>Nie wykorzystuj go do żadnych rzeczywistych celów.</b>",
"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",
"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 @{username}": "Od @{username}",
"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ą)",
"Comment from @{username} reported": "Zgłoszono komentarz @{username}",
"Comments": "Komentarze",
"Comments have been closed.": "Zamknięto 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ę…",
"Enjoy discovering Mobilizon!": "Ciesz się z odkrywania Mobilizon!",
"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",
"Hide replies": "Ukryj odpowiedzi",
"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 comments yet": "Nie ma jeszcze komentarzy",
"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.",
"Post a comment": "Wyślij komentarz",
"Post a reply": "Umieść odpowiedź",
"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": "Zarejestruj się",
"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": "Odrzucono",
"Rejected participations": "Odrzuceni uczestnicy",
"Report": "Zgłoś",
"Report this comment": "Zgłoś ten komentarz",
"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",
"Show the time when the event ends": "Pokaż czas zakończenia wydarzenia",
"Sign up": "Zarejestruj się",
"Software to the people": "Oprogramowanie dla ludzi",
"Starts on…": "Rozpoczyna się…",
"Status": "Stan",
"Street": "Ulica",
"Tentative: Will be confirmed later": "Niepewne: zostanie potwierdzone później",
"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",
"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"
}

View File

@@ -1,448 +1,448 @@
{
"<b>Please do not use it in any real way.</b>": "<b>Por favor, não use isso para fins reais.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Uma ferramenta de convívio, emancipadora e ética, para se reunir, se organizar e se mobilizar.",
"A validation email was sent to {email}": "Um email de confirmação foi enviado ao {email}",
"Abandon edition": "Abandonar a edição",
"About": "Sobre",
"About Mobilizon": "Sobre Mobilizon",
"About this event": "Sobre este evento",
"About this instance": "Sobre esta instância",
"Accepted": "Aceitado",
"Add": "Adicionar",
"Add a note": "Adicionar uma nota",
"Add an address": "Adicionar um endereço",
"Add an instance": "Adicionar uma instância",
"Add some tags": "Adicionar etiquetas",
"Add to my calendar": "Adicionar no meu calendário",
"Additional comments": "Adicionar comentários",
"Admin settings": "Configuração do administrador",
"Admin settings successfully saved.": "Configurações do administrador salvadas com sucesso.",
"Administration": "Administração",
"All the places have already been taken": "Todos os lugares foram ocupados |Um lugar ainda está disponível|{places}lugares estão ainda disponíveis",
"Allow all comments": "Permitir todos comentários",
"Allow registrations": "Permitir inscrições",
"An error has occurred.": "Ocorreu um erro.",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Os participantes anônimos deverão confirmar sua participação por email.",
"Anonymous participations": "Participações anônimas",
"Approve": "Aprovar",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Você está seguro que quer <b>apagar</b> este comentário? Esta ação não pode ser desfeita.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Você está seguro que quer <b>apagar</b> este evento? Esta ação não pode ser desfeita. Talvez você queira tentar uma conversa com o criador do evento ou, então, editar este evento.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Você está seguro que quer cancelar a criação do evento? Você perderá todas as modificações.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Você está seguro que quer cancelar a edição do evento? Você perderá todas as modificações.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Você está seguro que quer cancelar a sua participação no evento \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Você está seguro que quer apagar este evento? Esta ação não pode ser desfeita.",
"Avatar": "Avatar",
"Back to previous page": "Voltar à página anterior",
"Before you can login, you need to click on the link inside it to validate your account": "Antes de você poder começar, você precisa clicar no link que está no interior para validar a sua conta",
"By @{username}": "Por @{username}",
"Cancel": "Cancelar",
"Cancel anonymous participation": "Cancelar participação anônima",
"Cancel creation": "Cancelar a criação",
"Cancel edition": "Cancelar a edição",
"Cancel my participation request…": "Cancelar o meu pedido de participação…",
"Cancel my participation…": "Cancelar minha participação…",
"Cancelled: Won't happen": "Cancelado: Não irá acontecer",
"Category": "Categoria",
"Change": "Modificar",
"Change my identity…": "Mudar minha identidade…",
"Change my password": "Mudar minha senha",
"Change password": "Mudar a senha",
"Clear": "Limpar",
"Click to select": "Clique para selecionar",
"Click to upload": "Click para subir",
"Close": "Fechar",
"Close comments for all (except for admins)": "Fechar comentários para todos (exceto para administradores)",
"Closed": "Fechar",
"Comment deleted": "Comentário apagado",
"Comment from @{username} reported": "Comentário de @{username} reportado",
"Comments": "Comentários",
"Comments have been closed.": "Os comentários foram fechados.",
"Confirm my particpation": "Confirmar minha participação",
"Confirmed: Will happen": "Confirmado: Irá acontecer",
"Continue editing": "Continuar a edição",
"Country": "País",
"Create": "Criar",
"Create a new event": "Criar novo evento",
"Create a new group": "Criar novo grupo",
"Create a new identity": "Criar nova identidade",
"Create and manage several identities from the same account": "Criar e administrar várias identidades da mesma conta",
"Create group": "Criar grupo",
"Create my event": "Criar meu evento",
"Create my group": "Criar meu grupo",
"Create my profile": "Criar meu perfil",
"Create token": "Criar token",
"Create, edit or delete events": "Criar, editar ou apagar eventos",
"Creator": "Criador",
"Current identity has been changed to {identityName} in order to manage this event.": "A identidade atual foi modificada para {identityName} para poder administrar este evento.",
"Custom": "Personalizar",
"Custom URL": "URL personalizada",
"Custom text": "Texto personalizado",
"Dashboard": "Painel de controle",
"Date": "Data",
"Date and time settings": "Configuração da data e hora",
"Date parameters": "Parâmetros da data",
"Default": "Padrão",
"Default Mobilizon.org terms": "Termos de uso padrão do Mobilizon.org",
"Delete": "Apagar",
"Delete Comment": "Apagar comentário",
"Delete Event": "Apagar o Evento",
"Delete event": "Apagar um Evento",
"Delete this identity": "Apagar esta identidade",
"Delete your identity": "Apagar a sua identidade",
"Delete {eventTitle}": "Apagar {eventTitle}",
"Delete {preferredUsername}": "Apagar {preferredUsername}",
"Deleting comment": "Apagar comentário",
"Deleting event": "Apagar evento",
"Description": "Descrição",
"Didn't receive the instructions ?": "Você não recebeu as instruções?",
"Display name": "Mostrar nome",
"Display participation price": "Mostrar um preço de participação",
"Domain": "Domínio",
"Draft": "Rascunho",
"Drafts": "Rascunhos",
"Edit": "Editar",
"Eg: Stockholm, Dance, Chess…": "Exemplo: São Paulo, Brasília, Salvador…",
"Either on the {instance} instance or on another instance.": "Tanto na instância {instance} como em outra instância.",
"Either the account is already validated, either the validation token is incorrect.": "Ou a conta já está validada, ou o token de validação está incorreto.",
"Either the participation has already been validated, either the validation token is incorrect.": "Oi a participação já foi validada, ou o token de validação está incorreto.",
"Email": "Email",
"Ends on…": "Termina em…",
"Enjoy discovering Mobilizon!": "Divirta-se descobrindo Mobilizon!",
"Enter the link URL": "Insira o link URL",
"Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Insira seus próprios termos. tags HTML são autorizadas. Os termos do Mobilizon.org são oferecidos como um exemplo apenas.",
"Error while communicating with the server.": "Erro ao comunicar com o servidor.",
"Error while saving report.": "Erro ao salvar o relatório.",
"Error while validating account": "Erro ao validar a conta",
"Error while validating participation": "Erro ao validar a participação",
"Event": "Evento",
"Event already passed": "Evento já ocorreu",
"Event cancelled": "Evento cancelado",
"Event creation": "Criação de evento",
"Event edition": "Edição de evento",
"Event list": "Lista de eventos",
"Event not found.": "Evento não encontrado.",
"Event page settings": "Configuração da página do evento",
"Event to be confirmed": "Evento a ser confirmado",
"Event {eventTitle} deleted": "Evento {eventTitle} foi apagado",
"Event {eventTitle} reported": "Evento {eventTitle} foi reportado",
"Events": "Eventos",
"Ex: test.mobilizon.org": "Ex: test.mobilizon.org",
"Exclude": "Excluir",
"Explore": "Explorar",
"Failed to save admin settings": "Falha ao salvar configurações do administrador",
"Featured events": "Eventos em destaque",
"Features": "Funcionalidades",
"Find an address": "Encontrar um endereço",
"Find an instance": "Encontrar uma instância",
"Followers": "Seguidores",
"Followings": "Seguindo",
"For instance: London, Taekwondo, Architecture…": "Por exemplo: Londres, Taekwondo, Arquitetura…",
"Forgot your password ?": "Esqueceu a senha?",
"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?": "Desde um aniversário com amigos e família até uma marcha pela mudança do clima, exatamente agora, right now, os bons motivos para nos juntarmos <b>Presos pelos gigantes da tecnologia</b>. Como nós podemos nos organizar, como nós podemos clicar, \"Participar\" sem <b>dar nossos dados</b> para o Facebook <b>que nos prende</b> dentro do MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "De {startDate} às {startTime} até {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "De {startDate} às {startTime} até {endDate} às {endTime}",
"From the {startDate} to the {endDate}": "De {startDate} até {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Reunir⋅ Organizar⋅ Mobilizar",
"General information": "Informações gerais",
"Getting location": "Obter localização",
"Go": "Vamos",
"Going as {name}": "Indo como {name}",
"Group List": "Lista de grupos",
"Group full name": "Nome completo do grupo",
"Group name": "Nome do grupo",
"Group {displayName} created": "Grupo {displayName} criado",
"Groups": "Grupos",
"Headline picture": "Imagem de manchete",
"Hide replies": "Esconder as respostas",
"I create an identity": "Eu crio uma identidade",
"I don't have a Mobilizon account": "Eu não tenho uma conta Mobilizon",
"I have a Mobilizon account": "Eu tenho uma conta Mobilizon",
"I have an account on another Mobilizon instance.": "Eu tenho uma conta numa outra instância Mobilizon.",
"I participate": "Eu participo",
"I want to allow people to participate without an account.": "Eu quero permitir pessoas participarem sem uma conta.",
"I want to approve every participation request": "Eu quero aprovar cada pedido de participação",
"Identity {displayName} created": "Identidade {displayName} criada",
"Identity {displayName} deleted": "Identidade {displayName} apagada",
"Identity {displayName} updated": "Identidade {displayName} atualizada",
"If an account with this email exists, we just sent another confirmation email to {email}": "Se uma conta com esse email existe, nós acabamos de enviar um outro email de confirmação para {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Se esta identidade é o único administrador de alguns grupos, você precisa apagar esses grupos antes de poder apagar esta identidade.",
"Impossible to login, your email or password seems incorrect.": "Impossível fazer login, seu e-mail ou senha parecem estar incorreto.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Enquanto isso, favor considerar que o aplicativo não está (ainda) terminado. Mais informações {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "instalar Mobilizon possibilitará às comunidades de se libertarem dos serviços de grandes empresas de tecnologia criando, elas mesmas, <b>suas próprias plataformas</b>.",
"Instance Description": "Descrição da instância",
"Instance Name": "Nome da instância",
"Instance Terms": "Termos de uso da instância",
"Instance Terms Source": "Termos básicos de uso da instância",
"Instance Terms URL": "URL dos termos de uso da instância",
"Instances": "Instâncias",
"Join {instance}, a Mobilizon instance": "Junte-se à {instance}, uma instância Mobilizon",
"Last published event": "Último evento publicado",
"Last week": "Última semana",
"Learn more": "Saiba mais",
"Learn more about Mobilizon": "Saiba mais sobre Mobilizon",
"Leave event": "Deixar o evento",
"Leaving event \"{title}\"": "Deixar o evento \"{title}\"",
"Let's create a new common": "Vamos criar um novo Common",
"License": "Licença",
"Limited number of places": "Número de lugares limitados",
"Load more": "Ver mais",
"Locality": "Localidade",
"Log in": "Entrar",
"Log out": "Sair",
"Login": "Entrar",
"Login on Mobilizon!": "Entrar no Mobilizon!",
"Login on {instance}": "Entrar em {instance}",
"Manage participations": "Gerenciar participações",
"Mark as resolved": "Marcar como resolvido",
"Members": "Membros",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon é uma rede federada. Você pode interagir com este evento através de um outro servidor.",
"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 é um aplicativo livre/gratuito que permitirá às comunidades de criarem <b>seus próprios espaços</b> para publicarem eventos para se emanciparem dos grandes gigantes da tecnologia.",
"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 está em desenvolvimento, nós iremos adicionar novas funcionalidades neste site durante atualizações regulares, até o lançamento da <b>versão 1 do aplicativo no primeiro semestre de 2020</b>.",
"Mobilizons licence": "A licença Mobilizon",
"Moderated comments (shown after approval)": "Comentários moderados (mostrados após aprovação)",
"My account": "Minha conta",
"My events": "Meus eventos",
"My identities": "Minhas identidades",
"Name": "Nome",
"New note": "Nova nota",
"New password": "Nova senha",
"No actors found": "Nenhum ator encontrado",
"No address defined": "Nenhum endereço definido",
"No closed reports yet": "Nenhum relatório fechado ainda",
"No comment": "Nenhum comentário",
"No comments yet": "Nenhum comentário ainda",
"No end date": "Não há data final",
"No events found": "Nenhum evento encontrado",
"No group found": "Nenhum grupo encontrado",
"No groups found": "Nenhum grupo encontrado",
"No instance follows your instance yet.": "Nenhuma instância seguindo sua instância ainda.",
"No instance to approve|Approve instance|Approve {number} instances": "Nenhuma instância para aprovar|Aprovar instância|Aprovar {number} instâncias",
"No instance to reject|Reject instance|Reject {number} instances": "Nenhuma instância a rejeitar|Rejeitar instância|Rejeitar {number} instâncias",
"No instance to remove|Remove instance|Remove {number} instances": "Nenhuma instância para remover|Remover instância|Remover {number} instâncias",
"No open reports yet": "Nenhum relatório aberto ainda",
"No resolved reports yet": "Nenhum relatório resolvido ainda",
"No results for \"{queryText}\"": "Não há resultado para \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "Nenhuma conta de usuário com este e-mail foi encontrado. Talvez você esqueceu ou trocou alguma letra?",
"Notes": "Notas",
"Number of places": "Número de lugares",
"OK": "OK",
"Old password": "senha antiga",
"On {date}": "Em {date}",
"On {date} ending at {endTime}": "Em {date} terminando às {endTime}",
"On {date} from {startTime} to {endTime}": "Em {date} de {startTime} até {endTime}",
"On {date} starting at {startTime}": "Em {date} começando às {startTime}",
"One person is going": "Ninguém irá| Uma pessoa irá | {approved} pessoas irão",
"Only accessible through link and search (private)": "Acessível somente através de um link e busca (privada)",
"Only alphanumeric characters and underscores are supported.": "Apenas letras e números e sublinhado (underscore) é aceito.",
"Open": "Aberto",
"Opened reports": "Relatórios abertos",
"Or": "Ou",
"Organized": "Organizado",
"Organized by {name}": "Organizado por {name}",
"Organizer": "Organizador",
"Other software may also support this.": "Outros aplicativos talvez também suportem esta funcionalidade.",
"Otherwise this identity will just be removed from the group administrators.": "Caso contrário, esta identidade será removida do grupo de administradores.",
"Page limited to my group (asks for auth)": "Acesso limitado ao meu grupo (solicite o acesso)",
"Page not found": "Página não encontrada",
"Participant already was rejected.": "Participante já foi rejeitado.",
"Participant has already been approved as participant.": "o participante já foi aprovado como participante.",
"Participants": "Participantes",
"Participate": "Participar",
"Participate using your email address": "Participar utilizando o seu endereço de email",
"Participation approval": "Aprovação de participação",
"Participation requested!": "Participação solicitada!",
"Password": "Senha",
"Password (confirmation)": "Senha (confirmação)",
"Password change": "Mudança de senha",
"Password reset": "Reinicializar a senha",
"Past events": "Eventos realizados",
"Pending": "Pendente",
"Pick an identity": "Escolha uma identidade",
"Please check your spam folder if you didn't receive the email.": "Favor verificar sua caixa de spam caso não tenha recebido o email.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Contate o administrador desta instância Mobilizon se você pensa se tratar de um erro.",
"Please make sure the address is correct and that the page hasn't been moved.": "Favor certificar-se de que o endereço está correto e de que a página não foi movida.",
"Please read the full rules": "Favor leia todas as regras",
"Please refresh the page and retry.": "Favor atualizar a página e tentar novamente.",
"Post a comment": "Adicione um comentário",
"Post a reply": "Envie uma resposta",
"Postal Code": "Código Postal",
"Privacy Policy": "Política de privacidade",
"Private event": "Evento privado",
"Private feeds": "Feeds Privados",
"Public RSS/Atom Feed": "RSS público/Atom feed",
"Public comment moderation": "Moderação de comentários públicos",
"Public event": "Evento público",
"Public feeds": "Feeds públicos",
"Public iCal Feed": "Feed iCal público",
"Publish": "Publicar",
"Published events": "Eventos publicados",
"RSS/Atom Feed": "RSS/Feed Atom",
"Read Framasofts statement of intent on the Framablog": "Leia a declaração de intenção da Associação Framasoft em Framablog",
"Redirecting to event…": "Redirecionando para o evento…",
"Region": "Região",
"Register": "Inscrever",
"Register an account on Mobilizon!": "Registrar uma conta no Mobilizon!",
"Register for an event by choosing one of your identities": "Inscrever-se num evento escolhendo uma de suas identidades",
"Registration is allowed, anyone can register.": "Inscrições autorizadas, qualquer um pode se inscrever.",
"Registration is closed.": "Inscrições fechadas.",
"Registration is currently closed.": "Inscrições estão atualmente fechadas.",
"Registrations are restricted by whitelisting.": "Inscrições são restritas aos membros da lista branca.",
"Reject": "Rejeitar",
"Rejected": "Rejeitado",
"Rejected participations": "Participantes rejeitados",
"Reopen": "Reabrir",
"Reply": "Responder",
"Report": "Relatar",
"Report this comment": "Relatar este comentário",
"Report this event": "Relatar este evento",
"Reported": "Reportado",
"Reported by": "Relatado por",
"Reported by someone on {domain}": "Relatado por alguém em {domain}",
"Reported by {reporter}": "Relatado por {reporter}",
"Reported identity": "Identidade reportada",
"Reports": "Relatórios",
"Requests": "Solicitações",
"Resend confirmation email": "Enviar um novo email de confirmação",
"Reset my password": "Recuperar a senha",
"Resolved": "Resolvido",
"Resource provided is not an URL": "O recurso oferecido não é um URL",
"Save": "Salvar",
"Save draft": "Salvar rascunho",
"Search": "Buscar",
"Search events, groups, etc.": "Buscar eventos, grupos, etc.",
"Search results: \"{search}\"": "Resultados da busca: \"{search}\"",
"Searching…": "Buscando…",
"Send email": "Enviar email",
"Send me an email to reset my password": "Envie-me um e-mail para eu reiniciar minha senha",
"Send me the confirmation email once again": "Envie-me o email de confirmação novamente",
"Send the report": "Enviar o relato",
"Set an URL to a page with your own terms.": "Insira um URL apontando para uma página contendo os seus próprios termos.",
"Settings": "Parâmetros",
"Share this event": "Compartilhar este evento",
"Show map": "Mostrar mapa",
"Show remaining number of places": "Mostrar o número de lugares restantes",
"Show the time when the event begins": "Mostrar o horário de início do evento",
"Show the time when the event ends": "Mostrar o horário que o evento termina",
"Sign up": "Registrar",
"Software to the people": "Aplicativos para as pessoas",
"Starts on…": "Começa em…",
"Status": "Status",
"Street": "Rua",
"Tentative: Will be confirmed later": "Provisório: será confirmado mais tarde",
"Terms": "Termos de uso",
"The actual number of participants may differ, as this event is hosted on another instance.": "O número atual de participantes talvez difiram, já que este evento é hospedado em outra instância.",
"The content came from another server. Transfer an anonymous copy of the report?": "O conteúdo vem de um outro servidor. Transferir uma cópia anônima do relatório?",
"The current identity doesn't have any permission on this event. You should probably change it.": "O identidade atual não tem permissão neste evento. Você deverá provavelmente mudar isso.",
"The draft event has been updated": "O rascunho do evento foi atualizado",
"The event has been created as a draft": "Evento criado como um rascunho",
"The event has been published": "Evento publicado",
"The event has been updated": "Evento atualizado",
"The event has been updated and published": "Evento atualizado e publicado",
"The event organizer didn't add any description.": "O organizador do evento não inseriu nenhuma descrição.",
"The event title will be ellipsed.": "O título do evento será reticulado.",
"The page you're looking for doesn't exist.": "A página que você procura não existe.",
"The password was successfully changed": "A senha foi modificada com sucesso",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "O relato será enviado aos moderadores da sua instância. Você pode explicar o por que você relatou o conteúdo abaixo.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "A conta de usuário que você utiliza para entrar não foi confirmada ainda. Verifique sua caixa de emails e, eventualmente, a sua caixa de spam.",
"The {default_terms} will be used. They will be translated in the user's language.": "Os {default_terms} será usado. Eles serão traduzidos no idioma do usuário.",
"There are {participants} participants.": "Há {participants} participantes.",
"These events may interest you": "Estes eventos talvez te interessem",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Esta instância Mobilizon e o organizador deste evento permitem participantes anônimos, mas solicita a validação através da confirmação do email.",
"This email is already registered as participant for this event": "Este email ja está registrado como participante deste evento",
"This information is saved only on your computer. Click for details": "Esta informação é salva apenas no seu computador. Clique para mais detalhes",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Esta instalação (chamada “instância“) pode facilmente {interconnect}, graças a {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Esta instância não está aberta para registros, mas você pode se registrar em outras instâncias.",
"This is a demonstration site to test the beta version of Mobilizon.": "Este é um site teste de demonstração da versão beta do Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Isto irá apagar / tornar anônimo todo o conteúdo (eventos, comentários, mensagens, participantes...) criados por esta identidade.",
"Title": "Título",
"To achieve your registration, please create a first identity profile.": "Para concluir sua inscrição, favor criar seu primeiro perfil de identidade.",
"To change the world, change the software": "Para mudar o mundo, mude o aplicativo",
"To confirm, type your event title \"{eventTitle}\"": "Para confirmar, insira o título do seu evento \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Para confirmar, insira o nome da identidade \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transferir para {outsideDomain}",
"Type": "Tipo",
"URL": "URL",
"Unfortunately, this instance isn't opened to registrations": "Infelizmente, esta instância não está aberta para registros",
"Unfortunately, your participation request was rejected by the organizers.": "Infelizmente, seu pedido de participação foi rejeitado pelos organizadores.",
"Unknown": "Desconhecido",
"Unknown actor": "Ator desconhecido",
"Unknown error.": "Erro desconhecido.",
"Unsaved changes": "Modificações não salvas",
"Upcoming": "Em breve",
"Update event {name}": "Atualizar evento {name}",
"Update my event": "Atualizar meu evento",
"Updated": "Atualizado",
"Username": "Nome de usuário",
"Users": "Usuários",
"View a reply": "Nenhuma resposta|Ver uma resposta|Ver {totalReplies} respostas",
"View event page": "Ver a página do evento",
"View everything": "Ver tudo",
"View page on {hostname} (in a new window)": "Ver a página em {hostname} (numa nova janela)",
"Visible everywhere on the web (public)": "Visível a todo mundo na web (público)",
"Waiting for organization team approval.": "Aguardando pela aprovação da equipe de organização.",
"Waiting list": "Lista de espera",
"Warning": "Atenção",
"We just sent an email to {email}": "Acabamos de enviar um email para {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>.": "Queremos criar um <b>bem comum (commons) digital </b>, onde cada qual possa se apropriar e fazer o seu também, respeitando <b>a privacidade e o ativismo como base</b>.",
"We will redirect you to your instance in order to interact with this event": "Iremos redirecionar você para sua instância para você interagir com este evento",
"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.": "Nós não mudarmos o mundo pelo Facebook. A ferramenta que nós sonhamos não será criada pelas corporações do capitalismo de vigilância, já que eles não teriam lucro com ela. Esta é uma oportunidade para construirmos algo melhor, adotando uma outra abordagem.",
"Website / URL": "Website / URL",
"Welcome back {username}!": "Bem-vindo(a) novamente {username}!",
"Welcome back!": "Bem-vindo de volta!",
"Welcome on your administration panel": "Bem-vindo ao seu painel de administração",
"Welcome to Mobilizon, {username}!": "Bem-vindo(a) ao Mobilizon, {username}!",
"Who can view this event and participate": "Quem pode ver este evento e participar",
"World map": "Mapa mundi",
"Write something…": "Escreva qualquer coisa…",
"You and one other person are going to this event": "Você é o único que está indo neste evento|Você e uma outra pessoa estão indo neste evento | Você e {approved} pessoas estão indo neste evento.",
"You are already a participant of this event.": "Você já participa deste evento.",
"You are participating in this event anonymously": "Você participa deste evento de forma anônima",
"You are participating in this event anonymously but didn't confirm participation": "Você participa deste evento de forma anônima, mas você não confirmou a sua participação",
"You can add tags by hitting the Enter key or by adding a comma": "Você pode adicionar etiquetas pressionando Enter ou adicionando uma vírgula",
"You can try another search term or drag and drop the marker on the map": "Você pode tentar inserir outro termo de busca ou arrastar o marcador do mapa",
"You can't remove your last identity.": "Você não pode remover a sua última identidade.",
"You don't follow any instances yet.": "Você não segue nenhuma instância ainda.",
"You have been disconnected": "Você foi disconectado",
"You have cancelled your participation": "Você cancelou a sua participação",
"You have one event in {days} days.": "Você não tem eventos nos próximos {days} dias. |Você tem um evento em {days} dias. | Você tem {count} eventos em {days} dias",
"You have one event today.": "Você não tem evento hoje | Você tem um evento hoje. | Você tem {count} eventos hoje",
"You have one event tomorrow.": "Você não tem eventos amanhã | Você tem um evento amanhã. | Você tem {count} eventos amanhã",
"You may also ask to {resend_confirmation_email}.": "Você pode também pedir para {resend_confirmation_email}.",
"You need to login.": "Você precisa entrar (fazer login).",
"You will be redirected to the original instance": "Você será redirecionado para a instância original",
"You wish to participate to the following event": "Você deseja participar do seguinte evento",
"Your account has been validated": "Sua conta foi validada",
"Your account is being validated": "Sua conta esta sendo validada",
"Your account is nearly ready, {username}": "Sua conta está quase pronta, {username}",
"Your email is not whitelisted, you can't register.": "Seu email não está na lista branca, você não pode se registrar.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Seu email será usado apenas para confirmar que você é uma pessoa real e para enviar à você eventuais atualizações para este evento. Ele NÃO será transmitido a outras instâncias ou ao organizador do evento.",
"Your federated identity": "Sua identidade federada",
"Your local administrator resumed its policy:": "Seus administrador local resumiu sua política assim:",
"Your participation has been confirmed": "Sua participação foi confirmada",
"Your participation has been rejected": "Sua participação foi rejeitada",
"Your participation has been requested": "Sua participação foi solicitada",
"Your participation has been validated": "Sua participação foi validada",
"Your participation is being validated": "Sua participação está sendo validada",
"Your participation status has been changed": "O status da sua participação foi modificado",
"[This comment has been deleted]": "[Este comentário foi apagado]",
"[deleted]": "[apagado]",
"a decentralised federation protocol": "um protocolo de federação descentralizada",
"as {identity}": "como {identity}",
"default Mobilizon terms": "Termos de utilização padrão do Mobilizon.org",
"e.g. 10 Rue Jangot": "por exemplo: 10 Rue Jangot",
"firstDayOfWeek": "1",
"iCal Feed": "Feed iCal",
"interconnect with others like it": "Interconectar com outros como este",
"its source code is public": "seu código fonte é público",
"on our blog": "no nosso blog",
"profile@instance": "perfil@instance",
"resend confirmation email": "Reenviar email de confirmação",
"respect of the fundamental freedoms": "o respeito às liberdades fundamentais",
"with another identity…": "com uma outra identidade…",
"{approved} / {total} seats": "{approved} / {total} lugares",
"{count} participants": "Nenhum participante ainda | Um participante | {count} participantes",
"{count} requests waiting": "Uma solução aguardando | {count} solicitações aguardando",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantir o {respect} das pessoas que irão usar, Uma vez que {source}, qualquer um pode auditar isso, o que garante a transparência.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Os colaboradores Mobilizon {date} - Feito com Elixir, Phoenix, VueJS & e com um pouco de amor em algumas semanas",
"© The OpenStreetMap Contributors": "© Os colaboradores OpenStreetMap"
"<b>Please do not use it in any real way.</b>": "<b>Por favor, não use isso para fins reais.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Uma ferramenta de convívio, emancipadora e ética, para se reunir, se organizar e se mobilizar.",
"A validation email was sent to {email}": "Um email de confirmação foi enviado ao {email}",
"Abandon edition": "Abandonar a edição",
"About": "Sobre",
"About Mobilizon": "Sobre Mobilizon",
"About this event": "Sobre este evento",
"About this instance": "Sobre esta instância",
"Accepted": "Aceitado",
"Add": "Adicionar",
"Add a note": "Adicionar uma nota",
"Add an address": "Adicionar um endereço",
"Add an instance": "Adicionar uma instância",
"Add some tags": "Adicionar etiquetas",
"Add to my calendar": "Adicionar no meu calendário",
"Additional comments": "Adicionar comentários",
"Admin settings": "Configuração do administrador",
"Admin settings successfully saved.": "Configurações do administrador salvadas com sucesso.",
"Administration": "Administração",
"All the places have already been taken": "Todos os lugares foram ocupados |Um lugar ainda está disponível|{places}lugares estão ainda disponíveis",
"Allow all comments": "Permitir todos comentários",
"Allow registrations": "Permitir inscrições",
"An error has occurred.": "Ocorreu um erro.",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Os participantes anônimos deverão confirmar sua participação por email.",
"Anonymous participations": "Participações anônimas",
"Approve": "Aprovar",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Você está seguro que quer <b>apagar</b> este comentário? Esta ação não pode ser desfeita.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.": "Você está seguro que quer <b>apagar</b> este evento? Esta ação não pode ser desfeita. Talvez você queira tentar uma conversa com o criador do evento ou, então, editar este evento.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Você está seguro que quer cancelar a criação do evento? Você perderá todas as modificações.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Você está seguro que quer cancelar a edição do evento? Você perderá todas as modificações.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Você está seguro que quer cancelar a sua participação no evento \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Você está seguro que quer apagar este evento? Esta ação não pode ser desfeita.",
"Avatar": "Avatar",
"Back to previous page": "Voltar à página anterior",
"Before you can login, you need to click on the link inside it to validate your account": "Antes de você poder começar, você precisa clicar no link que está no interior para validar a sua conta",
"By @{username}": "Por @{username}",
"Cancel": "Cancelar",
"Cancel anonymous participation": "Cancelar participação anônima",
"Cancel creation": "Cancelar a criação",
"Cancel edition": "Cancelar a edição",
"Cancel my participation request…": "Cancelar o meu pedido de participação…",
"Cancel my participation…": "Cancelar minha participação…",
"Cancelled: Won't happen": "Cancelado: Não irá acontecer",
"Category": "Categoria",
"Change": "Modificar",
"Change my identity…": "Mudar minha identidade…",
"Change my password": "Mudar minha senha",
"Change password": "Mudar a senha",
"Clear": "Limpar",
"Click to select": "Clique para selecionar",
"Click to upload": "Click para subir",
"Close": "Fechar",
"Close comments for all (except for admins)": "Fechar comentários para todos (exceto para administradores)",
"Closed": "Fechar",
"Comment deleted": "Comentário apagado",
"Comment from @{username} reported": "Comentário de @{username} reportado",
"Comments": "Comentários",
"Comments have been closed.": "Os comentários foram fechados.",
"Confirm my particpation": "Confirmar minha participação",
"Confirmed: Will happen": "Confirmado: Irá acontecer",
"Continue editing": "Continuar a edição",
"Country": "País",
"Create": "Criar",
"Create a new event": "Criar novo evento",
"Create a new group": "Criar novo grupo",
"Create a new identity": "Criar nova identidade",
"Create and manage several identities from the same account": "Criar e administrar várias identidades da mesma conta",
"Create group": "Criar grupo",
"Create my event": "Criar meu evento",
"Create my group": "Criar meu grupo",
"Create my profile": "Criar meu perfil",
"Create token": "Criar token",
"Create, edit or delete events": "Criar, editar ou apagar eventos",
"Creator": "Criador",
"Current identity has been changed to {identityName} in order to manage this event.": "A identidade atual foi modificada para {identityName} para poder administrar este evento.",
"Custom": "Personalizar",
"Custom URL": "URL personalizada",
"Custom text": "Texto personalizado",
"Dashboard": "Painel de controle",
"Date": "Data",
"Date and time settings": "Configuração da data e hora",
"Date parameters": "Parâmetros da data",
"Default": "Padrão",
"Default Mobilizon.org terms": "Termos de uso padrão do Mobilizon.org",
"Delete": "Apagar",
"Delete Comment": "Apagar comentário",
"Delete Event": "Apagar o Evento",
"Delete event": "Apagar um Evento",
"Delete this identity": "Apagar esta identidade",
"Delete your identity": "Apagar a sua identidade",
"Delete {eventTitle}": "Apagar {eventTitle}",
"Delete {preferredUsername}": "Apagar {preferredUsername}",
"Deleting comment": "Apagar comentário",
"Deleting event": "Apagar evento",
"Description": "Descrição",
"Didn't receive the instructions ?": "Você não recebeu as instruções?",
"Display name": "Mostrar nome",
"Display participation price": "Mostrar um preço de participação",
"Domain": "Domínio",
"Draft": "Rascunho",
"Drafts": "Rascunhos",
"Edit": "Editar",
"Eg: Stockholm, Dance, Chess…": "Exemplo: São Paulo, Brasília, Salvador…",
"Either on the {instance} instance or on another instance.": "Tanto na instância {instance} como em outra instância.",
"Either the account is already validated, either the validation token is incorrect.": "Ou a conta já está validada, ou o token de validação está incorreto.",
"Either the participation has already been validated, either the validation token is incorrect.": "Oi a participação já foi validada, ou o token de validação está incorreto.",
"Email": "Email",
"Ends on…": "Termina em…",
"Enjoy discovering Mobilizon!": "Divirta-se descobrindo Mobilizon!",
"Enter the link URL": "Insira o link URL",
"Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Insira seus próprios termos. tags HTML são autorizadas. Os termos do Mobilizon.org são oferecidos como um exemplo apenas.",
"Error while communicating with the server.": "Erro ao comunicar com o servidor.",
"Error while saving report.": "Erro ao salvar o relatório.",
"Error while validating account": "Erro ao validar a conta",
"Error while validating participation": "Erro ao validar a participação",
"Event": "Evento",
"Event already passed": "Evento já ocorreu",
"Event cancelled": "Evento cancelado",
"Event creation": "Criação de evento",
"Event edition": "Edição de evento",
"Event list": "Lista de eventos",
"Event not found.": "Evento não encontrado.",
"Event page settings": "Configuração da página do evento",
"Event to be confirmed": "Evento a ser confirmado",
"Event {eventTitle} deleted": "Evento {eventTitle} foi apagado",
"Event {eventTitle} reported": "Evento {eventTitle} foi reportado",
"Events": "Eventos",
"Ex: test.mobilizon.org": "Ex: test.mobilizon.org",
"Exclude": "Excluir",
"Explore": "Explorar",
"Failed to save admin settings": "Falha ao salvar configurações do administrador",
"Featured events": "Eventos em destaque",
"Features": "Funcionalidades",
"Find an address": "Encontrar um endereço",
"Find an instance": "Encontrar uma instância",
"Followers": "Seguidores",
"Followings": "Seguindo",
"For instance: London, Taekwondo, Architecture…": "Por exemplo: Londres, Taekwondo, Arquitetura…",
"Forgot your password ?": "Esqueceu a senha?",
"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?": "Desde um aniversário com amigos e família até uma marcha pela mudança do clima, exatamente agora, right now, os bons motivos para nos juntarmos <b>Presos pelos gigantes da tecnologia</b>. Como nós podemos nos organizar, como nós podemos clicar, \"Participar\" sem <b>dar nossos dados</b> para o Facebook <b>que nos prende</b> dentro do MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "De {startDate} às {startTime} até {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "De {startDate} às {startTime} até {endDate} às {endTime}",
"From the {startDate} to the {endDate}": "De {startDate} até {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Reunir⋅ Organizar⋅ Mobilizar",
"General information": "Informações gerais",
"Getting location": "Obter localização",
"Go": "Vamos",
"Going as {name}": "Indo como {name}",
"Group List": "Lista de grupos",
"Group full name": "Nome completo do grupo",
"Group name": "Nome do grupo",
"Group {displayName} created": "Grupo {displayName} criado",
"Groups": "Grupos",
"Headline picture": "Imagem de manchete",
"Hide replies": "Esconder as respostas",
"I create an identity": "Eu crio uma identidade",
"I don't have a Mobilizon account": "Eu não tenho uma conta Mobilizon",
"I have a Mobilizon account": "Eu tenho uma conta Mobilizon",
"I have an account on another Mobilizon instance.": "Eu tenho uma conta numa outra instância Mobilizon.",
"I participate": "Eu participo",
"I want to allow people to participate without an account.": "Eu quero permitir pessoas participarem sem uma conta.",
"I want to approve every participation request": "Eu quero aprovar cada pedido de participação",
"Identity {displayName} created": "Identidade {displayName} criada",
"Identity {displayName} deleted": "Identidade {displayName} apagada",
"Identity {displayName} updated": "Identidade {displayName} atualizada",
"If an account with this email exists, we just sent another confirmation email to {email}": "Se uma conta com esse email existe, nós acabamos de enviar um outro email de confirmação para {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Se esta identidade é o único administrador de alguns grupos, você precisa apagar esses grupos antes de poder apagar esta identidade.",
"Impossible to login, your email or password seems incorrect.": "Impossível fazer login, seu e-mail ou senha parecem estar incorreto.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Enquanto isso, favor considerar que o aplicativo não está (ainda) terminado. Mais informações {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "instalar Mobilizon possibilitará às comunidades de se libertarem dos serviços de grandes empresas de tecnologia criando, elas mesmas, <b>suas próprias plataformas</b>.",
"Instance Description": "Descrição da instância",
"Instance Name": "Nome da instância",
"Instance Terms": "Termos de uso da instância",
"Instance Terms Source": "Termos básicos de uso da instância",
"Instance Terms URL": "URL dos termos de uso da instância",
"Instances": "Instâncias",
"Join {instance}, a Mobilizon instance": "Junte-se à {instance}, uma instância Mobilizon",
"Last published event": "Último evento publicado",
"Last week": "Última semana",
"Learn more": "Saiba mais",
"Learn more about Mobilizon": "Saiba mais sobre Mobilizon",
"Leave event": "Deixar o evento",
"Leaving event \"{title}\"": "Deixar o evento \"{title}\"",
"Let's create a new common": "Vamos criar um novo Common",
"License": "Licença",
"Limited number of places": "Número de lugares limitados",
"Load more": "Ver mais",
"Locality": "Localidade",
"Log in": "Entrar",
"Log out": "Sair",
"Login": "Entrar",
"Login on Mobilizon!": "Entrar no Mobilizon!",
"Login on {instance}": "Entrar em {instance}",
"Manage participations": "Gerenciar participações",
"Mark as resolved": "Marcar como resolvido",
"Members": "Membros",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon é uma rede federada. Você pode interagir com este evento através de um outro servidor.",
"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 é um aplicativo livre/gratuito que permitirá às comunidades de criarem <b>seus próprios espaços</b> para publicarem eventos para se emanciparem dos grandes gigantes da tecnologia.",
"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 está em desenvolvimento, nós iremos adicionar novas funcionalidades neste site durante atualizações regulares, até o lançamento da <b>versão 1 do aplicativo no primeiro semestre de 2020</b>.",
"Mobilizons licence": "A licença Mobilizon",
"Moderated comments (shown after approval)": "Comentários moderados (mostrados após aprovação)",
"My account": "Minha conta",
"My events": "Meus eventos",
"My identities": "Minhas identidades",
"Name": "Nome",
"New note": "Nova nota",
"New password": "Nova senha",
"No actors found": "Nenhum ator encontrado",
"No address defined": "Nenhum endereço definido",
"No closed reports yet": "Nenhum relatório fechado ainda",
"No comment": "Nenhum comentário",
"No comments yet": "Nenhum comentário ainda",
"No end date": "Não há data final",
"No events found": "Nenhum evento encontrado",
"No group found": "Nenhum grupo encontrado",
"No groups found": "Nenhum grupo encontrado",
"No instance follows your instance yet.": "Nenhuma instância seguindo sua instância ainda.",
"No instance to approve|Approve instance|Approve {number} instances": "Nenhuma instância para aprovar|Aprovar instância|Aprovar {number} instâncias",
"No instance to reject|Reject instance|Reject {number} instances": "Nenhuma instância a rejeitar|Rejeitar instância|Rejeitar {number} instâncias",
"No instance to remove|Remove instance|Remove {number} instances": "Nenhuma instância para remover|Remover instância|Remover {number} instâncias",
"No open reports yet": "Nenhum relatório aberto ainda",
"No resolved reports yet": "Nenhum relatório resolvido ainda",
"No results for \"{queryText}\"": "Não há resultado para \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "Nenhuma conta de usuário com este e-mail foi encontrado. Talvez você esqueceu ou trocou alguma letra?",
"Notes": "Notas",
"Number of places": "Número de lugares",
"OK": "OK",
"Old password": "senha antiga",
"On {date}": "Em {date}",
"On {date} ending at {endTime}": "Em {date} terminando às {endTime}",
"On {date} from {startTime} to {endTime}": "Em {date} de {startTime} até {endTime}",
"On {date} starting at {startTime}": "Em {date} começando às {startTime}",
"One person is going": "Ninguém irá| Uma pessoa irá | {approved} pessoas irão",
"Only accessible through link and search (private)": "Acessível somente através de um link e busca (privada)",
"Only alphanumeric characters and underscores are supported.": "Apenas letras e números e sublinhado (underscore) é aceito.",
"Open": "Aberto",
"Opened reports": "Relatórios abertos",
"Or": "Ou",
"Organized": "Organizado",
"Organized by {name}": "Organizado por {name}",
"Organizer": "Organizador",
"Other software may also support this.": "Outros aplicativos talvez também suportem esta funcionalidade.",
"Otherwise this identity will just be removed from the group administrators.": "Caso contrário, esta identidade será removida do grupo de administradores.",
"Page limited to my group (asks for auth)": "Acesso limitado ao meu grupo (solicite o acesso)",
"Page not found": "Página não encontrada",
"Participant already was rejected.": "Participante já foi rejeitado.",
"Participant has already been approved as participant.": "o participante já foi aprovado como participante.",
"Participants": "Participantes",
"Participate": "Participar",
"Participate using your email address": "Participar utilizando o seu endereço de email",
"Participation approval": "Aprovação de participação",
"Participation requested!": "Participação solicitada!",
"Password": "Senha",
"Password (confirmation)": "Senha (confirmação)",
"Password change": "Mudança de senha",
"Password reset": "Reinicializar a senha",
"Past events": "Eventos realizados",
"Pending": "Pendente",
"Pick an identity": "Escolha uma identidade",
"Please check your spam folder if you didn't receive the email.": "Favor verificar sua caixa de spam caso não tenha recebido o email.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Contate o administrador desta instância Mobilizon se você pensa se tratar de um erro.",
"Please make sure the address is correct and that the page hasn't been moved.": "Favor certificar-se de que o endereço está correto e de que a página não foi movida.",
"Please read the full rules": "Favor leia todas as regras",
"Please refresh the page and retry.": "Favor atualizar a página e tentar novamente.",
"Post a comment": "Adicione um comentário",
"Post a reply": "Envie uma resposta",
"Postal Code": "Código Postal",
"Privacy Policy": "Política de privacidade",
"Private event": "Evento privado",
"Private feeds": "Feeds Privados",
"Public RSS/Atom Feed": "RSS público/Atom feed",
"Public comment moderation": "Moderação de comentários públicos",
"Public event": "Evento público",
"Public feeds": "Feeds públicos",
"Public iCal Feed": "Feed iCal público",
"Publish": "Publicar",
"Published events": "Eventos publicados",
"RSS/Atom Feed": "RSS/Feed Atom",
"Read Framasofts statement of intent on the Framablog": "Leia a declaração de intenção da Associação Framasoft em Framablog",
"Redirecting to event…": "Redirecionando para o evento…",
"Region": "Região",
"Register": "Inscrever",
"Register an account on Mobilizon!": "Registrar uma conta no Mobilizon!",
"Register for an event by choosing one of your identities": "Inscrever-se num evento escolhendo uma de suas identidades",
"Registration is allowed, anyone can register.": "Inscrições autorizadas, qualquer um pode se inscrever.",
"Registration is closed.": "Inscrições fechadas.",
"Registration is currently closed.": "Inscrições estão atualmente fechadas.",
"Registrations are restricted by whitelisting.": "Inscrições são restritas aos membros da lista branca.",
"Reject": "Rejeitar",
"Rejected": "Rejeitado",
"Rejected participations": "Participantes rejeitados",
"Reopen": "Reabrir",
"Reply": "Responder",
"Report": "Relatar",
"Report this comment": "Relatar este comentário",
"Report this event": "Relatar este evento",
"Reported": "Reportado",
"Reported by": "Relatado por",
"Reported by someone on {domain}": "Relatado por alguém em {domain}",
"Reported by {reporter}": "Relatado por {reporter}",
"Reported identity": "Identidade reportada",
"Reports": "Relatórios",
"Requests": "Solicitações",
"Resend confirmation email": "Enviar um novo email de confirmação",
"Reset my password": "Recuperar a senha",
"Resolved": "Resolvido",
"Resource provided is not an URL": "O recurso oferecido não é um URL",
"Save": "Salvar",
"Save draft": "Salvar rascunho",
"Search": "Buscar",
"Search events, groups, etc.": "Buscar eventos, grupos, etc.",
"Search results: \"{search}\"": "Resultados da busca: \"{search}\"",
"Searching…": "Buscando…",
"Send email": "Enviar email",
"Send me an email to reset my password": "Envie-me um e-mail para eu reiniciar minha senha",
"Send me the confirmation email once again": "Envie-me o email de confirmação novamente",
"Send the report": "Enviar o relato",
"Set an URL to a page with your own terms.": "Insira um URL apontando para uma página contendo os seus próprios termos.",
"Settings": "Parâmetros",
"Share this event": "Compartilhar este evento",
"Show map": "Mostrar mapa",
"Show remaining number of places": "Mostrar o número de lugares restantes",
"Show the time when the event begins": "Mostrar o horário de início do evento",
"Show the time when the event ends": "Mostrar o horário que o evento termina",
"Sign up": "Registrar",
"Software to the people": "Aplicativos para as pessoas",
"Starts on…": "Começa em…",
"Status": "Status",
"Street": "Rua",
"Tentative: Will be confirmed later": "Provisório: será confirmado mais tarde",
"Terms": "Termos de uso",
"The actual number of participants may differ, as this event is hosted on another instance.": "O número atual de participantes talvez difiram, já que este evento é hospedado em outra instância.",
"The content came from another server. Transfer an anonymous copy of the report?": "O conteúdo vem de um outro servidor. Transferir uma cópia anônima do relatório?",
"The current identity doesn't have any permission on this event. You should probably change it.": "O identidade atual não tem permissão neste evento. Você deverá provavelmente mudar isso.",
"The draft event has been updated": "O rascunho do evento foi atualizado",
"The event has been created as a draft": "Evento criado como um rascunho",
"The event has been published": "Evento publicado",
"The event has been updated": "Evento atualizado",
"The event has been updated and published": "Evento atualizado e publicado",
"The event organizer didn't add any description.": "O organizador do evento não inseriu nenhuma descrição.",
"The event title will be ellipsed.": "O título do evento será reticulado.",
"The page you're looking for doesn't exist.": "A página que você procura não existe.",
"The password was successfully changed": "A senha foi modificada com sucesso",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "O relato será enviado aos moderadores da sua instância. Você pode explicar o por que você relatou o conteúdo abaixo.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "A conta de usuário que você utiliza para entrar não foi confirmada ainda. Verifique sua caixa de emails e, eventualmente, a sua caixa de spam.",
"The {default_terms} will be used. They will be translated in the user's language.": "Os {default_terms} será usado. Eles serão traduzidos no idioma do usuário.",
"There are {participants} participants.": "Há {participants} participantes.",
"These events may interest you": "Estes eventos talvez te interessem",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Esta instância Mobilizon e o organizador deste evento permitem participantes anônimos, mas solicita a validação através da confirmação do email.",
"This email is already registered as participant for this event": "Este email ja está registrado como participante deste evento",
"This information is saved only on your computer. Click for details": "Esta informação é salva apenas no seu computador. Clique para mais detalhes",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Esta instalação (chamada “instância“) pode facilmente {interconnect}, graças a {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Esta instância não está aberta para registros, mas você pode se registrar em outras instâncias.",
"This is a demonstration site to test the beta version of Mobilizon.": "Este é um site teste de demonstração da versão beta do Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Isto irá apagar / tornar anônimo todo o conteúdo (eventos, comentários, mensagens, participantes...) criados por esta identidade.",
"Title": "Título",
"To achieve your registration, please create a first identity profile.": "Para concluir sua inscrição, favor criar seu primeiro perfil de identidade.",
"To change the world, change the software": "Para mudar o mundo, mude o aplicativo",
"To confirm, type your event title \"{eventTitle}\"": "Para confirmar, insira o título do seu evento \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Para confirmar, insira o nome da identidade \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transferir para {outsideDomain}",
"Type": "Tipo",
"URL": "URL",
"Unfortunately, this instance isn't opened to registrations": "Infelizmente, esta instância não está aberta para registros",
"Unfortunately, your participation request was rejected by the organizers.": "Infelizmente, seu pedido de participação foi rejeitado pelos organizadores.",
"Unknown": "Desconhecido",
"Unknown actor": "Ator desconhecido",
"Unknown error.": "Erro desconhecido.",
"Unsaved changes": "Modificações não salvas",
"Upcoming": "Em breve",
"Update event {name}": "Atualizar evento {name}",
"Update my event": "Atualizar meu evento",
"Updated": "Atualizado",
"Username": "Nome de usuário",
"Users": "Usuários",
"View a reply": "Nenhuma resposta|Ver uma resposta|Ver {totalReplies} respostas",
"View event page": "Ver a página do evento",
"View everything": "Ver tudo",
"View page on {hostname} (in a new window)": "Ver a página em {hostname} (numa nova janela)",
"Visible everywhere on the web (public)": "Visível a todo mundo na web (público)",
"Waiting for organization team approval.": "Aguardando pela aprovação da equipe de organização.",
"Waiting list": "Lista de espera",
"Warning": "Atenção",
"We just sent an email to {email}": "Acabamos de enviar um email para {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>.": "Queremos criar um <b>bem comum (commons) digital </b>, onde cada qual possa se apropriar e fazer o seu também, respeitando <b>a privacidade e o ativismo como base</b>.",
"We will redirect you to your instance in order to interact with this event": "Iremos redirecionar você para sua instância para você interagir com este evento",
"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.": "Nós não mudarmos o mundo pelo Facebook. A ferramenta que nós sonhamos não será criada pelas corporações do capitalismo de vigilância, já que eles não teriam lucro com ela. Esta é uma oportunidade para construirmos algo melhor, adotando uma outra abordagem.",
"Website / URL": "Website / URL",
"Welcome back {username}!": "Bem-vindo(a) novamente {username}!",
"Welcome back!": "Bem-vindo de volta!",
"Welcome on your administration panel": "Bem-vindo ao seu painel de administração",
"Welcome to Mobilizon, {username}!": "Bem-vindo(a) ao Mobilizon, {username}!",
"Who can view this event and participate": "Quem pode ver este evento e participar",
"World map": "Mapa mundi",
"Write something…": "Escreva qualquer coisa…",
"You and one other person are going to this event": "Você é o único que está indo neste evento|Você e uma outra pessoa estão indo neste evento | Você e {approved} pessoas estão indo neste evento.",
"You are already a participant of this event.": "Você já participa deste evento.",
"You are participating in this event anonymously": "Você participa deste evento de forma anônima",
"You are participating in this event anonymously but didn't confirm participation": "Você participa deste evento de forma anônima, mas você não confirmou a sua participação",
"You can add tags by hitting the Enter key or by adding a comma": "Você pode adicionar etiquetas pressionando Enter ou adicionando uma vírgula",
"You can try another search term or drag and drop the marker on the map": "Você pode tentar inserir outro termo de busca ou arrastar o marcador do mapa",
"You can't remove your last identity.": "Você não pode remover a sua última identidade.",
"You don't follow any instances yet.": "Você não segue nenhuma instância ainda.",
"You have been disconnected": "Você foi disconectado",
"You have cancelled your participation": "Você cancelou a sua participação",
"You have one event in {days} days.": "Você não tem eventos nos próximos {days} dias. |Você tem um evento em {days} dias. | Você tem {count} eventos em {days} dias",
"You have one event today.": "Você não tem evento hoje | Você tem um evento hoje. | Você tem {count} eventos hoje",
"You have one event tomorrow.": "Você não tem eventos amanhã | Você tem um evento amanhã. | Você tem {count} eventos amanhã",
"You may also ask to {resend_confirmation_email}.": "Você pode também pedir para {resend_confirmation_email}.",
"You need to login.": "Você precisa entrar (fazer login).",
"You will be redirected to the original instance": "Você será redirecionado para a instância original",
"You wish to participate to the following event": "Você deseja participar do seguinte evento",
"Your account has been validated": "Sua conta foi validada",
"Your account is being validated": "Sua conta esta sendo validada",
"Your account is nearly ready, {username}": "Sua conta está quase pronta, {username}",
"Your email is not whitelisted, you can't register.": "Seu email não está na lista branca, você não pode se registrar.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Seu email será usado apenas para confirmar que você é uma pessoa real e para enviar à você eventuais atualizações para este evento. Ele NÃO será transmitido a outras instâncias ou ao organizador do evento.",
"Your federated identity": "Sua identidade federada",
"Your local administrator resumed its policy:": "Seus administrador local resumiu sua política assim:",
"Your participation has been confirmed": "Sua participação foi confirmada",
"Your participation has been rejected": "Sua participação foi rejeitada",
"Your participation has been requested": "Sua participação foi solicitada",
"Your participation has been validated": "Sua participação foi validada",
"Your participation is being validated": "Sua participação está sendo validada",
"Your participation status has been changed": "O status da sua participação foi modificado",
"[This comment has been deleted]": "[Este comentário foi apagado]",
"[deleted]": "[apagado]",
"a decentralised federation protocol": "um protocolo de federação descentralizada",
"as {identity}": "como {identity}",
"default Mobilizon terms": "Termos de utilização padrão do Mobilizon.org",
"e.g. 10 Rue Jangot": "por exemplo: 10 Rue Jangot",
"firstDayOfWeek": "1",
"iCal Feed": "Feed iCal",
"interconnect with others like it": "Interconectar com outros como este",
"its source code is public": "seu código fonte é público",
"on our blog": "no nosso blog",
"profile@instance": "perfil@instance",
"resend confirmation email": "Reenviar email de confirmação",
"respect of the fundamental freedoms": "o respeito às liberdades fundamentais",
"with another identity…": "com uma outra identidade…",
"{approved} / {total} seats": "{approved} / {total} lugares",
"{count} participants": "Nenhum participante ainda | Um participante | {count} participantes",
"{count} requests waiting": "Uma solução aguardando | {count} solicitações aguardando",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantir o {respect} das pessoas que irão usar, Uma vez que {source}, qualquer um pode auditar isso, o que garante a transparência.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Os colaboradores Mobilizon {date} - Feito com Elixir, Phoenix, VueJS & e com um pouco de amor em algumas semanas",
"© The OpenStreetMap Contributors": "© Os colaboradores OpenStreetMap"
}

View File

@@ -1,351 +1,351 @@
{
"<b>Please do not use it in any real way.</b>": "<b>Använd gärna inte det på riktigt.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Ett användarvänligt, frigörande och etiskt verktyg för att samlas, organisera och mobilisera.",
"A validation email was sent to {email}": "Ett valideringsmail skickades till {email}",
"Abandon 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",
"Accepted": "Accepterad",
"Account settings": "Kontoinställningar",
"Add": "Lägg till",
"Add a note": "Lägg till en kommentar",
"Add an address": "Lägg till en adress",
"Add an instance": "Lägg till en instans",
"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 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",
"Allow registrations": "Tillåt kontoregistrering",
"An error has occurred.": "Ett fel har uppstått.",
"Approve": "Godkänn",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Är du säker på att du vill <b>radera</b> den här kommentaren? Detta kan inte ångras.",
"Are you sure you want to 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 @{username}": "Av @{username}",
"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": "Stäng",
"Close comments for all (except for admins)": "Stäng kommentarerna för alla (förutom administratörer)",
"Closed": "Stängd",
"Comment deleted": "Kommentar raderad",
"Comment from @{username} reported": "Kommentaren från @{username} har anmälts",
"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.",
"Dashboard": "Kontrollpanel",
"Date": "Datum",
"Date and time settings": "Datum- och tidsinställningar",
"Date parameters": "Datumparametrar",
"Delete": "Radera",
"Delete Comment": "Radera kommentar",
"Delete Event": "Radera evenemang",
"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}",
"Deleting comment": "Radera kommentar",
"Deleting event": "Raderar evenemang",
"Description": "Beskrivning",
"Didn't receive the instructions ?": "Fick inte instruktionerna?",
"Display name": "Visa namn",
"Display participation price": "Visa pris för deltagande",
"Domain": "Domän",
"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",
"Ex: test.mobilizon.org": "T.ex: test.mobilizon.org",
"Exclude": "Exkludera",
"Explore": "Utforska",
"Featured events": "Utvalda evenemang",
"Features": "Utvalda",
"Find an address": "Hitta en adress",
"Find an instance": "Hitta en instans",
"Followers": "Följare",
"For instance: London, Taekwondo, Architecture…": "Till exempel: London, Taekwondo, Arkitektur…",
"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",
"Getting location": "Hämtar plats",
"Going as {name}": "Går under namnet {name}",
"Group List": "Grupplista",
"Group full name": "Gruppnamn (hela)",
"Group name": "Gruppnamn",
"Group {displayName} created": "Gruppen {displayName} har skapats",
"Groups": "Grupper",
"Headline picture": "Huvudbild",
"Hide replies": "Dölj svar",
"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",
"On {date}": "Den {date}",
"On {date} ending at {endTime}": "Den {date}, slut klockan {endTime}",
"On {date} from {startTime} to {endTime}": "Den {date} från {startTime} till {endTime}",
"On {date} starting at {startTime}": "Den {date} med start klockan {startTime}",
"One person is going": "Ingen kommer|En person kommer|{approved} personer kommer",
"Only accessible through link and search (private)": "Endast tillgänglig via länk och sök (privat)",
"Only alphanumeric characters and underscores are supported.": "Endast bokstäver, siffror och understreck stöds.",
"Opened reports": "Öppnade rapporter",
"Organized": "Organiserad",
"Organized by {name}": "Organiserad av {namn}",
"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",
"Username": "Användarnamn",
"Users": "Användare",
"View event page": "Visa evenemangsidan",
"View everything": "Visa allt",
"View page on {hostname} (in a new window)": "Visa sidan hos {hostname} (öppnas i ett nytt fönster)",
"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",
"Write something…": "Skriv något …",
"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 can try another search term or drag and drop the marker on the map": "Du kan försöka med ett annat sökord eller dra och släpp markören på kartan",
"You can't remove your last identity.": "Du kan inte ta bort din sista identitet.",
"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…",
"{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",
"© The OpenStreetMap Contributors": "© Alla bidragsgivare till OpenStreetMap"
"<b>Please do not use it in any real way.</b>": "<b>Använd gärna inte det på riktigt.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Ett användarvänligt, frigörande och etiskt verktyg för att samlas, organisera och mobilisera.",
"A validation email was sent to {email}": "Ett valideringsmail skickades till {email}",
"Abandon 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",
"Accepted": "Accepterad",
"Account settings": "Kontoinställningar",
"Add": "Lägg till",
"Add a note": "Lägg till en kommentar",
"Add an address": "Lägg till en adress",
"Add an instance": "Lägg till en instans",
"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 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",
"Allow registrations": "Tillåt kontoregistrering",
"An error has occurred.": "Ett fel har uppstått.",
"Approve": "Godkänn",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Är du säker på att du vill <b>radera</b> den här kommentaren? Detta kan inte ångras.",
"Are you sure you want to 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 @{username}": "Av @{username}",
"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": "Stäng",
"Close comments for all (except for admins)": "Stäng kommentarerna för alla (förutom administratörer)",
"Closed": "Stängd",
"Comment deleted": "Kommentar raderad",
"Comment from @{username} reported": "Kommentaren från @{username} har anmälts",
"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.",
"Dashboard": "Kontrollpanel",
"Date": "Datum",
"Date and time settings": "Datum- och tidsinställningar",
"Date parameters": "Datumparametrar",
"Delete": "Radera",
"Delete Comment": "Radera kommentar",
"Delete Event": "Radera evenemang",
"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}",
"Deleting comment": "Radera kommentar",
"Deleting event": "Raderar evenemang",
"Description": "Beskrivning",
"Didn't receive the instructions ?": "Fick inte instruktionerna?",
"Display name": "Visa namn",
"Display participation price": "Visa pris för deltagande",
"Domain": "Domän",
"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",
"Ex: test.mobilizon.org": "T.ex: test.mobilizon.org",
"Exclude": "Exkludera",
"Explore": "Utforska",
"Featured events": "Utvalda evenemang",
"Features": "Utvalda",
"Find an address": "Hitta en adress",
"Find an instance": "Hitta en instans",
"Followers": "Följare",
"For instance: London, Taekwondo, Architecture…": "Till exempel: London, Taekwondo, Arkitektur…",
"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",
"Getting location": "Hämtar plats",
"Going as {name}": "Går under namnet {name}",
"Group List": "Grupplista",
"Group full name": "Gruppnamn (hela)",
"Group name": "Gruppnamn",
"Group {displayName} created": "Gruppen {displayName} har skapats",
"Groups": "Grupper",
"Headline picture": "Huvudbild",
"Hide replies": "Dölj svar",
"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",
"On {date}": "Den {date}",
"On {date} ending at {endTime}": "Den {date}, slut klockan {endTime}",
"On {date} from {startTime} to {endTime}": "Den {date} från {startTime} till {endTime}",
"On {date} starting at {startTime}": "Den {date} med start klockan {startTime}",
"One person is going": "Ingen kommer|En person kommer|{approved} personer kommer",
"Only accessible through link and search (private)": "Endast tillgänglig via länk och sök (privat)",
"Only alphanumeric characters and underscores are supported.": "Endast bokstäver, siffror och understreck stöds.",
"Opened reports": "Öppnade rapporter",
"Organized": "Organiserad",
"Organized by {name}": "Organiserad av {namn}",
"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",
"Username": "Användarnamn",
"Users": "Användare",
"View event page": "Visa evenemangsidan",
"View everything": "Visa allt",
"View page on {hostname} (in a new window)": "Visa sidan hos {hostname} (öppnas i ett nytt fönster)",
"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",
"Write something…": "Skriv något …",
"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 can try another search term or drag and drop the marker on the map": "Du kan försöka med ett annat sökord eller dra och släpp markören på kartan",
"You can't remove your last identity.": "Du kan inte ta bort din sista identitet.",
"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…",
"{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",
"© The OpenStreetMap Contributors": "© Alla bidragsgivare till OpenStreetMap"
}

View File

@@ -1,16 +1,17 @@
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import Buefy from 'buefy';
import Component from 'vue-class-component';
import VueScrollTo from 'vue-scrollto';
import App from '@/App.vue';
import router from '@/router';
import { apolloProvider } from './vue-apollo';
import { NotifierPlugin } from '@/plugins/notifier';
import filters from '@/filters';
import VueMeta from 'vue-meta';
import { i18n } from '@/utils/i18n';
import Vue from "vue";
import Buefy from "buefy";
import Component from "vue-class-component";
import VueScrollTo from "vue-scrollto";
import VueMeta from "vue-meta";
import VTooltip from "v-tooltip";
import App from "./App.vue";
import router from "./router";
import { NotifierPlugin } from "./plugins/notifier";
import filters from "./filters";
import { i18n } from "./utils/i18n";
import apolloProvider from "./vue-apollo";
Vue.config.productionTip = false;
@@ -19,20 +20,21 @@ Vue.use(NotifierPlugin);
Vue.use(filters);
Vue.use(VueMeta);
Vue.use(VueScrollTo);
Vue.use(VTooltip);
// Register the router hooks with their names
Component.registerHooks([
'beforeRouteEnter',
'beforeRouteLeave',
'beforeRouteUpdate', // for vue-router 2.2+
"beforeRouteEnter",
"beforeRouteLeave",
"beforeRouteUpdate", // for vue-router 2.2+
]);
/* eslint-disable no-new */
new Vue({
router,
apolloProvider,
el: '#app',
template: '<App/>',
el: "#app",
template: "<App/>",
components: { App },
i18n,
});

View File

@@ -1,12 +1,12 @@
import { IActor } from '@/types/actor';
import { IEvent } from '@/types/event.model';
import { Component, Vue } from 'vue-property-decorator';
import { IActor } from "@/types/actor";
import { IEvent } from "@/types/event.model";
import { Component, Vue } from "vue-property-decorator";
@Component
export default class ActorMixin extends Vue {
actorIsOrganizer(actor: IActor, event: IEvent) {
console.log('actorIsOrganizer actor', actor.id);
console.log('actorIsOrganizer event', event);
static actorIsOrganizer(actor: IActor, event: IEvent) {
console.log("actorIsOrganizer actor", actor.id);
console.log("actorIsOrganizer event", event);
return event.organizerActor && actor.id === event.organizerActor.id;
}
}

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