Merge branch 'main' of https://framagit.org/framasoft/mobilizon into fomo-3.1.0

This commit is contained in:
johndoe4 2023-05-30 17:53:49 +02:00
commit f898936e2a
78 changed files with 1785 additions and 1327 deletions

4
.husky/pre-commit Executable file
View file

@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
cd js
yarn run lint-staged

View file

@ -41,3 +41,4 @@ FE1EEB91EA633570F703B251AE2D4D4E
E7967805C1EA5301F2722C7BDB2F25F3
BDFB0FB1AAF69C18212CBCFD42F8B717
40220A533CCACB3A1CE9DBF1A8A430A1
EEB29D1DDA3A3015BC645A989B5BD38E

View file

@ -5,6 +5,53 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 3.1.0-rc.2 (2023-05-30)
### Bug Fixes
* **apps:** fix device flow authorization process ([9a457fb](https://framagit.org/framasoft/mobilizon/commits/9a457fb011b77b27dc465f1bc7327a08f554ccfb))
* **apps:** fix typo in redirect_uri parameter ([5664625](https://framagit.org/framasoft/mobilizon/commits/5664625c1c57ccba947400475414c1301d4bf955))
* **apps:** show scope from device activation in authorize device view ([c9d2074](https://framagit.org/framasoft/mobilizon/commits/c9d20748a4dd3e0687515f4776335d0ec9bdfcdc))
* **front:** fix homepage event and groups cards snapping ([8809db5](https://framagit.org/framasoft/mobilizon/commits/8809db582ccf45fcd477f46dcf70e106720626a8))
* **front:** fix selecting addresses in autocomplete ([e0488dd](https://framagit.org/framasoft/mobilizon/commits/e0488dd87ffc0184162a2ff67a13717e6263d56d))
## 3.1.0-rc.1 (2023-05-30)
### Bug Fixes
* **discussionlistitem:** remove unecessary parameter in vue router target ([779812c](https://framagit.org/framasoft/mobilizon/-/commit779812c746cf722dd86bcc0ad3bc58e558c13223))
* **emails:** make sure group notification emails are only sent once per email ([927e95f](https://framagit.org/framasoft/mobilizon/-/commit927e95f387653c7d620e9051c30843ba49c2d65c))
* **frontend:** event edition UI improvements ([0e14a36](https://framagit.org/framasoft/mobilizon/-/commit0e14a36c6d30ebe386b2136d29539f3b3e914efc))
* **frontend:** only show map on event edition when we have an address or we want to put in details ([02867e6](https://framagit.org/framasoft/mobilizon/-/commit02867e6e1482ac8770f94fd2bd00174bb31fbdc7))
* **front:** fix showing current group avatar & banners ([20b4aaa](https://framagit.org/framasoft/mobilizon/-/commit20b4aaabc97080e85cb68fd03393379c7ef82d95))
* **front:** fix showing current identity avatar & banners ([d0f4721](https://framagit.org/framasoft/mobilizon/-/commitd0f4721925d0c50340d6db8a4e9f4d3e4ca01457))
* **front:** improve UI of the glossary page ([d47b69d](https://framagit.org/framasoft/mobilizon/-/commitd47b69d6caa7c4405ab2e573ba407f9b2450c3bb))
* **front:** increase padding next to arrow down in `<select>` elements ([94f186c](https://framagit.org/framasoft/mobilizon/-/commit94f186ce5080316cd633e0344651b0050c2f14d4))
* **front:** remove cache-only for ABOUT GraphQL details on homepage ([6858bcb](https://framagit.org/framasoft/mobilizon/-/commit6858bcbbda6d8527bd15b9138e7bb30c5ead72d7))
* **front:** remove leftover console.logs ([6da0dba](https://framagit.org/framasoft/mobilizon/-/commit6da0dba0fd6d071ce5978802104538d0c2ef7dae))
* **front:** reset page number to 1 when search criteria changes ([d73bafe](https://framagit.org/framasoft/mobilizon/-/commitd73bafec97cd7d8eda887d21870427262befab0f)), closes [#1272](https://framagit.org/framasoft/mobilizon/-/issues/1272)
* **front:** various UI improvements for group page ([b097567](https://framagit.org/framasoft/mobilizon/-/commitb0975672c1c06ace364cf47bfcfa39db9c3b712b))
* **graphql:** fix calling GET_GROUP ([2933ee0](https://framagit.org/framasoft/mobilizon/-/commit2933ee06791a24dbf8c8b2a2eabc67f71e56f361))
* **group:** rephrase "Public Page" to "Announcements", as all posts are not necessary public ([b0a564f](https://framagit.org/framasoft/mobilizon/-/commitb0a564f64f72f40b6bb9560f9bc0fbea5d099fd7)), closes [#900](https://framagit.org/framasoft/mobilizon/-/issues/900)
* **i18n:** fix Swedish translations error that prevented Participate button from showing up ([643a5b5](https://framagit.org/framasoft/mobilizon/-/commit643a5b5921f91fed6a9f674c0ab3a36bf2d05835)), closes [#1281](https://framagit.org/framasoft/mobilizon/-/issues/1281)
* **rich media:** fix error handling when resource preview URL leads to empty parsed data ([850b4e2](https://framagit.org/framasoft/mobilizon/-/commit850b4e2a735e335c4737caa8b60e190613e778ef)), closes [#1279](https://framagit.org/framasoft/mobilizon/-/issues/1279)
* **sharepostmodal:** only show the share warning message if the post is accessible by link ([8e626dc](https://framagit.org/framasoft/mobilizon/-/commit8e626dce7807640a89770e50ca2621d34d6a5d97))
### Features
* **front:** improve padding on event tags ([7fa452d](https://framagit.org/framasoft/mobilizon/-/commit7fa452d9e3f9bb2443e571c9a32eaed51e32480a))
* **front:** make admin profile view linkable directly with parameters ([08ce7e2](https://framagit.org/framasoft/mobilizon/-/commit08ce7e26b73045279261ab87a14cb4f3dab5df1e))
* **front:** make profile members link to profile on group admin view and the reverse ([96129d2](https://framagit.org/framasoft/mobilizon/-/commit96129d2339133027220d3b5fcb1c52f84bcc5cbb))
* **front:** make profiles and group admin views default to local ([3e0324d](https://framagit.org/framasoft/mobilizon/-/commit3e0324d36ec5a8aa388e6b5d598a6f9a0c596797))
* **front:** redirect user to homepage on disconnect when currently on private page ([d5a6df9](https://framagit.org/framasoft/mobilizon/-/commitd5a6df9940fb458c5dbaee149015c02ebc370c6b)), closes [#1278](https://framagit.org/framasoft/mobilizon/-/issues/1278)
* **front:** show skeleton content on event view until the event is loaded ([dc3b93f](https://framagit.org/framasoft/mobilizon/-/commitdc3b93ffb5a4b072aec792533fd6e4b58ed7a893))
* **i18n:** activate croatian language ([94182ae](https://framagit.org/framasoft/mobilizon/-/commit94182aed2d8a22d00534f6376dfda2658bc8ba7e))
* **i18n:** activate japanese language ([6bd8034](https://framagit.org/framasoft/mobilizon/-/commit6bd8034fe816a432c3547de6d1ad8a18e73dc314)), closes [#1293](https://framagit.org/framasoft/mobilizon/-/issues/1293)
* **post:** show post visibily in PostListItem component ([ec7ca4d](https://framagit.org/framasoft/mobilizon/-/commitec7ca4ddf18a38cf6f51d38b540eecc9858f3c98))
## 3.1.0-beta.2 (2023-05-23)
### Bug Fixes
@ -18,7 +65,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* **API:** Allow to create apps, with permissions and both Authorization Code Flow and Device Flow
* **addresses:** Allow to enter manual addresses ([85d643d](https://framagit.org/framasoft/mobilizon/-/commit/85d643d0ecd5e7504f32953b9ed1509697b915e2))
* **docker:** Specify the folder where tzdata downloads data so that it can be used in a volume ([4bb0625](https://framagit.org/framasoft/mobilizon/-/commit/4bb062528f12be530a3754ca23c1bc6dbc862e5a)), closes [#1280](https://framagit.org/framasoft/mobilizon/issues/1280)
* **docker:** Specify the folder where tzdata downloads data so that it can be used in a volume ([4bb0625](https://framagit.org/framasoft/mobilizon/-/commit/4bb062528f12be530a3754ca23c1bc6dbc862e5a)), closes [#1280](https://framagit.org/framasoft/mobilizon/-/issues/1280)
* **spam:** Introduce checking new accounts, events & comments for spam with the help of Akismet ([317a343](https://framagit.org/framasoft/mobilizon/-/commit/317a3434b221a1a91b66d8443984269404863a8e))
* **rate-limiting:** Introduce rate-limiting on some endpoints ([c07ba3a5](https://framagit.org/framasoft/mobilizon/-/commit/c07ba3a5d19c419ef8aaf3ea9ca6e7f48e4f4487))
@ -36,17 +83,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* **back:** Various small fixes in backend ([2a57340](https://framagit.org/framasoft/mobilizon/-/commit/2a57340a82e414e69924ad89e8db9fc326742cc7))
* bind pagination current prop ([4bcf572](https://framagit.org/framasoft/mobilizon/-/commit/4bcf572c54d904587d0409e2eb68b4ca6cf48fec))
* **federation:** Account suspension should use actor in question as author and not relay actor ([79b48da](https://framagit.org/framasoft/mobilizon/-/commit/79b48da22209a8b2f1b234b8b8e121543a39b22b))
* **feeds:** Only provide future events in ICS/Atom feeds ([f3a4431](https://framagit.org/framasoft/mobilizon/-/commit/f3a443138a0e1e6cf34fc593f5c174d56c21e904)), closes [#1246](https://framagit.org/framasoft/mobilizon/issues/1246)
* **feeds:** Only provide future events in ICS/Atom feeds ([f3a4431](https://framagit.org/framasoft/mobilizon/-/commit/f3a443138a0e1e6cf34fc593f5c174d56c21e904)), closes [#1246](https://framagit.org/framasoft/mobilizon/-/issues/1246)
* Fix type of variable in navbar ([50ab531](https://framagit.org/framasoft/mobilizon/-/commit/50ab531156214f883cb03f785ccf65e3f19ef50e))
* **follow-instances:** Show correct error message when trying to follow already following actor ([d969c66](https://framagit.org/framasoft/mobilizon/-/commit/d969c6648f15e1ed280169a4c55d612bb002f03f))
* **front:** Fix about sections titles ([487f406](https://framagit.org/framasoft/mobilizon/-/commit/487f4069b14fde6304c9a42cec5b1c1af79814c5))
* **front:** Fix autocomplete attribute in o-inputitems after Oruga new version BC ([d2ba732](https://framagit.org/framasoft/mobilizon/-/commit/d2ba732b8b51986b739f6fbe3d74fa68e4b74ba0))
* **front:** Fix behaviour when deleting an event from event list ([cfd10ea](https://framagit.org/framasoft/mobilizon/-/commit/cfd10ea96078f03ad3b4f5682e37078ffae16ee4))
* **front:** Fix event list month order ([63c9ed6](https://framagit.org/framasoft/mobilizon/-/commit/63c9ed62de94d6d150798c949bad3d8a2dd4db23)), closes [#1244](https://framagit.org/framasoft/mobilizon/issues/1244)
* **front:** Fix instances list pagination ([8543204](https://framagit.org/framasoft/mobilizon/-/commit/8543204bd95de886d8d35bd491f23ecbc0a6ef8d)), closes [#1277](https://framagit.org/framasoft/mobilizon/issues/1277)
* **front:** Fix event list month order ([63c9ed6](https://framagit.org/framasoft/mobilizon/-/commit/63c9ed62de94d6d150798c949bad3d8a2dd4db23)), closes [#1244](https://framagit.org/framasoft/mobilizon/-/issues/1244)
* **front:** Fix instances list pagination ([8543204](https://framagit.org/framasoft/mobilizon/-/commit/8543204bd95de886d8d35bd491f23ecbc0a6ef8d)), closes [#1277](https://framagit.org/framasoft/mobilizon/-/issues/1277)
* **front:** Fix pagination display on dark mode ([4375438](https://framagit.org/framasoft/mobilizon/-/commit/4375438dc9fd2f1c5c9d7ed6670dde04f2da520f))
* **front:** Fix style of My Events participations ([35b07dc](https://framagit.org/framasoft/mobilizon/-/commit/35b07dceaa41c74c28ea49655b755e341f56df32))
* **front:** Focus report comment input in report modal ([2c28312](https://framagit.org/framasoft/mobilizon/-/commit/2c28312fc957901b86c2f3d1db8fc3376f505d37)), closes [#1236](https://framagit.org/framasoft/mobilizon/issues/1236)
* **front:** Focus report comment input in report modal ([2c28312](https://framagit.org/framasoft/mobilizon/-/commit/2c28312fc957901b86c2f3d1db8fc3376f505d37)), closes [#1236](https://framagit.org/framasoft/mobilizon/-/issues/1236)
* **front:** Handle "Failed to fetch dynamically imported module" errors by refreshing the page ([3d21a06](https://framagit.org/framasoft/mobilizon/-/commit/3d21a067897e4aa24f6404686ca6896044584796))
* **front:** Improve Delete account modal UI ([c420bbc](https://framagit.org/framasoft/mobilizon/-/commit/c420bbccc9bd1c348e41904e826dc49c71d7eeb4))
* **front:** Improve resend inscription instructions view and show error when appropriate ([5563052](https://framagit.org/framasoft/mobilizon/-/commit/55630527957d4f6a2e1e6845e64a92bc4794efc8))

View file

@ -1,6 +1,6 @@
{
"name": "mobilizon",
"version": "3.1.0-beta.2",
"version": "3.1.0-rc.2",
"private": true,
"scripts": {
"dev": "vite",
@ -14,7 +14,14 @@
"story:build": "histoire build",
"story:preview": "histoire preview",
"test": "vitest",
"coverage": "vitest run --coverage"
"coverage": "vitest run --coverage",
"prepare": "cd ../ && husky install"
},
"lint-staged": {
"**/*.{js,ts,vue}": [
"eslint --fix",
"prettier --write"
]
},
"dependencies": {
"@absinthe/socket": "^0.2.1",
@ -116,7 +123,9 @@
"eslint-plugin-vue": "^9.3.0",
"flush-promises": "^1.0.2",
"histoire": "^0.16.1",
"husky": "^8.0.3",
"jsdom": "^22.0.0",
"lint-staged": "^13.2.2",
"mock-apollo-client": "^1.1.0",
"prettier": "^2.2.1",
"prettier-eslint": "^15.0.1",
@ -124,7 +133,7 @@
"sass": "^1.34.1",
"typescript": "~5.0.0",
"vite": "^4.0.4",
"vite-plugin-pwa": "^0.14.1",
"vite-plugin-pwa": "^0.15.1",
"vitest": "^0.31.0",
"vue-i18n-extract": "^2.0.4"
}

View file

@ -42,13 +42,13 @@ body {
@apply bg-transparent text-black dark:text-white font-semibold py-2 px-4 border border-mbz-bluegreen dark:border-violet-3;
}
.btn-outlined-success {
@apply border-mbz-success;
@apply border-mbz-success hover:bg-mbz-success;
}
.btn-outlined-warning {
@apply bg-transparent border dark:text-white hover:dark:text-slate-900 hover:bg-mbz-warning border-mbz-warning;
}
.btn-outlined-danger {
@apply border-mbz-danger;
@apply border-mbz-danger hover:bg-mbz-danger;
}
.btn-outlined-text {
@apply bg-transparent hover:text-slate-900;

View file

@ -1,10 +1,10 @@
<template>
<router-link
class="flex gap-1 w-full items-center p-2 border-b-stone-200 border-b"
class="flex gap-1 w-full items-center p-2 border-b-stone-200 border-b bg-white dark:bg-transparent"
dir="auto"
:to="{
name: RouteName.DISCUSSION,
params: { slug: discussion.slug, id: discussion.id },
params: { slug: discussion.slug },
}"
>
<div class="">

View file

@ -3,7 +3,7 @@
class="mbz-card snap-center dark:bg-mbz-purple"
:class="{
'sm:flex sm:items-start': mode === 'row',
'sm:max-w-xs sm:w-[18rem] shrink-0 flex flex-col': mode === 'column',
'sm:max-w-xs w-[18rem] shrink-0 flex flex-col': mode === 'column',
}"
:to="to"
:isInternal="isInternal"
@ -129,8 +129,8 @@
{{
t(
"{count} participants",
event.participantStats?.participant,
{ count: event.participantStats?.participant }
{ count: event.participantStats?.participant },
event.participantStats?.participant
)
}}
</mobilizon-tag>

View file

@ -157,7 +157,10 @@
</footer>
</form>
</o-collapse>
<div class="map" v-if="!hideMap">
<div
class="map"
v-if="!hideMap && !disabled && (selected.geom || detailsAddress)"
>
<map-leaflet
:coords="selected.geom ?? defaultCoords"
:marker="mapMarkerValue"
@ -276,6 +279,7 @@ const setSelected = (newValue: IAddress | null) => {
if (!newValue) return;
console.debug("setting selected to model value");
Object.assign(selected, newValue);
emit("update:modelValue", selected);
};
const saveManualAddress = (): void => {

View file

@ -2,10 +2,10 @@
<LinkOrRouterLink
:to="to"
:isInternal="isInternal"
class="mbz-card shrink-0 dark:bg-mbz-purple dark:text-white rounded-lg shadow-lg flex items-center flex-col"
class="mbz-card snap-center shrink-0 dark:bg-mbz-purple dark:text-white rounded-lg shadow-lg flex items-center flex-col"
:class="{
'sm:flex-row': mode === 'row',
'sm:max-w-xs sm:w-[18rem] shrink-0 flex flex-col': mode === 'column',
'sm:max-w-xs w-[18rem] shrink-0 flex flex-col': mode === 'column',
}"
>
<div class="flex-none p-2 md:p-4">

View file

@ -1,6 +1,6 @@
<template>
<group-section
:title="t('Public page')"
:title="t('Announcements')"
icon="bullhorn"
:privateSection="false"
:route="{

View file

@ -8,7 +8,10 @@
}"
>
<template #default>
<div v-if="group?.resources?.elements?.length ?? 0 > 0" class="p-1">
<div
v-if="group?.resources?.elements?.length ?? 0 > 0"
class="p-1 bg-white dark:bg-transparent"
>
<div
v-for="resource in group?.resources?.elements ?? []"
:key="resource.id"

View file

@ -19,10 +19,10 @@
</div>
<slot name="subtitle" />
</div>
<!-- <div class="hidden sm:block" v-show="showScrollLeftButton">
<div class="hidden sm:block" v-show="showScrollLeftButton">
<button
@click="scrollLeft"
class="absolute inset-y-0 my-auto z-10 rounded-full bg-white dark:bg-transparent w-10 h-10 border border-shadowColor -left-5"
class="absolute inset-y-0 my-auto z-10 rounded-full bg-white dark:bg-transparent w-10 h-10 border border-shadowColor -left-5 ml-2"
>
<span class="">&lt;</span>
</button>
@ -34,6 +34,14 @@
<slot name="content" />
</div>
</div>
<div class="hidden sm:block" v-show="showScrollRightButton">
<button
@click="scrollRight"
class="absolute inset-y-0 my-auto z-10 rounded-full bg-white dark:bg-transparent w-10 h-10 border border-shadowColor -right-5"
>
<span class="">&gt;</span>
</button>
</div>
</div>
</template>
@ -53,8 +61,8 @@ const emit = defineEmits(["doGeoLoc"]);
const { t } = useI18n({ useScope: "global" });
// const showScrollRightButton = ref(true);
// const showScrollLeftButton = ref(false);
const showScrollRightButton = ref(true);
const showScrollLeftButton = ref(false);
// const scrollContainer = ref<any>();
@ -89,9 +97,9 @@ const { t } = useI18n({ useScope: "global" });
// evt.deltaY > 0 ? doScroll(evt, 300) : doScroll(evt, -300);
// };
// onMounted(async () => {
// scrollContainer.value.addEventListener("wheel", scrollHorizontalToVertical);
// });
onMounted(async () => {
scrollContainer.value.addEventListener("wheel", scrollHorizontalToVertical);
});
// onUnmounted(() => {
// if (scrollContainer.value) {

View file

@ -1,5 +1,15 @@
<template>
<div>
<div v-if="checkDevice">
<div class="rounded-lg bg-white dark:bg-zinc-900 shadow-xl my-6 p-4 pt-1">
<h1 class="text-3xl">
{{ t("Application authorized") }}
</h1>
<p>
{{ t("Check your device to continue. You may now close this window.") }}
</p>
</div>
</div>
<div v-else>
<h1 class="text-3xl">
{{ t("Autorize this application to access your account?") }}
</h1>
@ -68,7 +78,7 @@
<div class="flex gap-3 p-4">
<o-button
:disabled="collapses.length === 0"
@click="() => authorize()"
@click="() => (userCode ? authorizeDevice() : authorize())"
>{{ t("Authorize") }}</o-button
>
<o-button outlined tag="router-link" :to="{ name: RouteName.HOME }">{{
@ -84,10 +94,13 @@ import { useHead } from "@vueuse/head";
import { computed, ref } from "vue";
import { useI18n } from "vue-i18n";
import { useMutation } from "@vue/apollo-composable";
import { AUTORIZE_APPLICATION } from "@/graphql/application";
import {
AUTORIZE_APPLICATION,
AUTORIZE_DEVICE_APPLICATION,
} from "@/graphql/application";
import RouteName from "@/router/name";
import { IApplication } from "@/types/application.model";
import { scope } from "./scopes";
import { scope as oAuthScopes } from "./scopes";
import AlertCircle from "vue-material-design-icons/AlertCircle.vue";
const { t } = useI18n({ useScope: "global" });
@ -97,14 +110,16 @@ const props = defineProps<{
redirectURI?: string | null;
state?: string | null;
scope?: string | null;
userCode?: string;
}>();
const isOpen = ref<number>(-1);
const checkDevice = ref(false);
const collapses = computed(() =>
(props.scope ?? "")
.split(" ")
.map((localScope) => scope[localScope])
.map((localScope) => oAuthScopes[localScope])
.filter((localScope) => localScope)
);
@ -135,6 +150,37 @@ const authorize = () => {
});
};
const {
mutate: authorizeDeviceMutation,
onDone: onAuthorizeDeviceMutationDone,
} = useMutation<
{
authorizeDeviceApplication: {
clientId: string;
scope: string;
};
},
{
applicationClientId: string;
userCode: string;
}
>(AUTORIZE_DEVICE_APPLICATION);
const authorizeDevice = () => {
authorizeDeviceMutation({
applicationClientId: props.authApplication.clientId,
userCode: props.userCode ?? "",
});
};
onAuthorizeDeviceMutationDone(({ data }) => {
const localClientId = data?.authorizeDeviceApplication?.clientId;
const localScope = data?.authorizeDeviceApplication?.scope;
if (!localClientId || !localScope) return;
checkDevice.value = true;
});
onAuthorizeMutationDone(({ data }) => {
const code = data?.authorizeApplication?.code;
const localClientId = data?.authorizeApplication?.clientId;
@ -143,6 +189,11 @@ onAuthorizeMutationDone(({ data }) => {
if (!code || !localClientId || !localScope) return;
if (props.redirectURI === "urn:ietf:wg:oauth:2.0:oob") {
checkDevice.value = true;
return;
}
if (props.redirectURI) {
const params = new URLSearchParams(
Object.entries({

View file

@ -1,5 +1,5 @@
<template>
<div class="posts-wrapper">
<div class="posts-wrapper grid gap-4">
<post-list-item
v-for="post in posts"
:key="post.id"
@ -22,8 +22,6 @@ withDefaults(
</script>
<style lang="scss" scoped>
.posts-wrapper {
display: grid;
grid-gap: 20px;
grid-template: 1fr;
}
</style>

View file

@ -18,7 +18,7 @@
</h3>
<p class="flex gap-2">
<Clock />
<span dir="auto" class="" v-if="isBeforeLastWeek">{{
<span dir="auto" class="" v-if="publishedAt && isBeforeLastWeek">{{
formatDateTimeString(
publishedAt.toString(),
undefined,
@ -26,7 +26,7 @@
"short"
)
}}</span>
<span v-else>{{
<span v-else-if="publishedAt">{{
formatDistanceToNow(publishedAt, {
locale: dateFnsLocale,
addSuffix: true,
@ -47,6 +47,24 @@
</template>
</i18n-t>
</p>
<p
v-if="post.visibility === PostVisibility.UNLISTED"
class="flex gap-2 items-center"
>
<Link :size="16" />
{{ t("Accessible only by link") }}
</p>
<p
v-else-if="post.visibility === PostVisibility.PRIVATE"
class="flex gap-2 items-center"
>
<Lock :size="16" />
{{
t("Accessible only to members", {
group: post.attributedTo?.name,
})
}}
</p>
</div>
</router-link>
</template>
@ -61,7 +79,11 @@ import { formatDateTimeString } from "@/filters/datetime";
import Tag from "vue-material-design-icons/Tag.vue";
import AccountEdit from "vue-material-design-icons/AccountEdit.vue";
import Clock from "vue-material-design-icons/Clock.vue";
import Lock from "vue-material-design-icons/Lock.vue";
import Link from "vue-material-design-icons/Link.vue";
import MbzTag from "@/components/TagElement.vue";
import { PostVisibility } from "@/types/enums";
import { useI18n } from "vue-i18n";
const props = withDefaults(
defineProps<{
@ -71,34 +93,27 @@ const props = withDefaults(
{ isCurrentActorMember: false }
);
const { t } = useI18n({ useScope: "global" });
const dateFnsLocale = inject<Locale>("dateFnsLocale");
const postTags = computed(() => (props.post.tags ?? []).slice(0, 3));
const publishedAt = computed((): Date => {
return new Date((props.post.publishAt ?? props.post.insertedAt) as Date);
const publishedAt = computed((): Date | undefined => {
const date = props.post.publishAt ?? props.post.insertedAt;
if (!date) return undefined;
return new Date(date);
});
const isBeforeLastWeek = computed((): boolean => {
return isBefore(publishedAt.value, subWeeks(new Date(), 1));
return (
publishedAt.value !== undefined &&
isBefore(publishedAt.value, subWeeks(new Date(), 1))
);
});
</script>
<style lang="scss" scoped>
@use "@/styles/_mixins" as *;
// .post-minimalist-card-wrapper {
// display: grid;
// grid-gap: 5px 10px;
// grid-template-areas: "preview" "body";
// text-decoration: none;
// // width: 100%;
// // color: initial;
// // @include desktop {
// grid-template-columns: 200px 3fr;
// grid-template-areas: "preview body";
// // }
.title-info-wrapper {
.post-minimalist-title {
font-size: 18px;

View file

@ -7,7 +7,7 @@
>
<o-notification
variant="warning"
v-if="post.visibility !== PostVisibility.PUBLIC"
v-if="post.visibility === PostVisibility.UNLISTED"
:closable="false"
>
{{

View file

@ -1,5 +1,5 @@
<template>
<div class="resource-wrapper" dir="auto">
<div class="resource-wrapper bg-white dark:bg-transparent" dir="auto">
<router-link
:to="{
name: RouteName.RESOURCE_FOLDER,

View file

@ -1,7 +1,12 @@
<template>
<div class="flex flex-1 items-center w-full" dir="auto">
<div
class="flex flex-1 items-center w-full bg-white dark:bg-transparent"
dir="auto"
>
<a :href="resource.resourceUrl" target="_blank">
<div class="preview text-mbz-purple dark:text-mbz-purple-300">
<div
class="min-w-fit relative flex items-center justify-center text-mbz-purple dark:text-mbz-purple-300"
>
<div
v-if="
resource.type &&
@ -14,10 +19,12 @@
customSize="48"
/>
</div>
<div
class="preview-image"
<img
v-else-if="resource.metadata && resource.metadata.imageRemoteUrl"
:style="`background-image: url(${resource.metadata.imageRemoteUrl})`"
:src="resource.metadata.imageRemoteUrl"
alt=""
height="48"
width="48"
/>
<div class="preview-type" v-else>
<Link :size="48" />
@ -99,25 +106,6 @@ a {
overflow: hidden;
flex: 1;
.preview {
flex: 0 0 50px;
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 {
img.favicon {
display: inline-block;

View file

@ -34,7 +34,7 @@
import { computed, onMounted, ref } from "vue";
import { useI18n } from "vue-i18n";
type position =
type positionValues =
| "top-right"
| "top"
| "top-left"
@ -49,7 +49,7 @@ const props = withDefaults(
onAction?: () => any;
cancelText?: string | null;
variant?: string;
position?: position;
position?: positionValues;
pauseOnHover?: boolean;
indefinite?: boolean;
}>(),

View file

@ -35,7 +35,7 @@ export const AUTORIZE_APPLICATION = gql`
export const AUTORIZE_DEVICE_APPLICATION = gql`
mutation AuthorizeDeviceApplication(
$applicationClientId: String!
$userCode: String
$userCode: String!
) {
authorizeDeviceApplication(
clientId: $applicationClientId

View file

@ -707,7 +707,6 @@
"Public event": "فعالية للعامة",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "انشرها",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -707,7 +707,6 @@
"Public event": "Activitat pública",
"Public feeds": "Fluxos públics",
"Public iCal Feed": "Flux iCal públic",
"Public page": "Pàgina pública",
"Public preview": "Previsualització pública",
"Publication date": "Data de publicació",
"Publish": "Publica",

View file

@ -860,7 +860,6 @@
"Public event": "Veřejná událost",
"Public feeds": "Veřejné kanály",
"Public iCal Feed": "Veřejný iCal kanál",
"Public page": "Veřejná strana",
"Public preview": "Veřejný náhled",
"Publication date": "Datum zveřejnění",
"Publish": "Zveřejnit",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -841,7 +841,6 @@
"Public event": "Öffentliche Veranstaltung",
"Public feeds": "Öffentliche Feeds",
"Public iCal Feed": "Öffentlicher iCal-Feed",
"Public page": "Öffentliche Seite",
"Public preview": "Öffentliche Vorschau",
"Publication date": "Erstellungsdatum",
"Publish": "Veröffentlichen",

View file

@ -430,7 +430,6 @@
"Text": "Text",
"Upcoming events": "Upcoming events",
"Resources": "Resources",
"Public page": "Public page",
"Discussions": "Discussions",
"No public upcoming events": "No public upcoming events",
"Latest posts": "Latest posts",
@ -1564,5 +1563,6 @@
"This application will be allowed to publish and manage events, post and manage comments, participate to events, manage all of your groups, including group events, resources, posts and discussions. It will also be allowed to manage your account and profile settings.": "This application will be allowed to publish and manage events, post and manage comments, participate to events, manage all of your groups, including group events, resources, posts and discussions. It will also be allowed to manage your account and profile settings.",
"No apps authorized yet": "No apps authorized yet",
"You have been logged-out": "You have been logged-out",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely."
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.",
"Announcements": "Announcements"
}

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -810,7 +810,6 @@
"Public event": "Evento público",
"Public feeds": "Feeds públicos",
"Public iCal Feed": "Feed público de iCal",
"Public page": "Página pública",
"Public preview": "Vista previa pública",
"Publication date": "Fecha de publicación",
"Publish": "Publicar",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -707,7 +707,6 @@
"Public event": "Julkinen tapahtuma",
"Public feeds": "Julkiset syötteet",
"Public iCal Feed": "Julkinen iCal-syöte",
"Public page": "Julkinen sivu",
"Public preview": "Julkinen esikatselu",
"Publication date": "Julkaisupäivä",
"Publish": "Julkaise",

View file

@ -47,6 +47,17 @@
"Accept": "Accepter",
"Accept follow": "Accepter le suivi",
"Accepted": "Accepté",
"Access followed groups": "Accéder à la liste des groupes suivis",
"Access group activities": "Accéder aux activités des groupes",
"Access group discussions": "Accéder aux discussions des groupes",
"Access group events": "Accéder aux événements des groupes",
"Access group followers": "Accéder à la liste des abonnés des groupes",
"Access group members": "Accéder à la liste des membres des groupes",
"Access group memberships": "Accéder à la liste de vos adhésions à des groupes",
"Access group todo-lists": "Accéder aux listes de tâches des groupes",
"Access organized events": "Accéder à la liste de vos événements organisés",
"Access participations": "Accéder à la liste de vos participations",
"Access your group's resources": "Accéder aux ressources de vos groupes",
"Accessibility": "Accessibilité",
"Accessible only by link": "Accessible uniquement par lien",
"Accessible only to members": "Accessible uniquement aux membres",
@ -99,8 +110,10 @@
"An event from one of my groups has been published": "Un événement d'un de mes groupes a été publié",
"An event from one of my groups has been updated or deleted": "Un événement d'un de mes groupes a été mis à jour ou supprimé",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "Une instance est une version du logiciel Mobilizon fonctionnant sur un serveur. Une instance peut être gérée par n'importe qui avec le {mobilizon_software} ou d'autres applications fédérées, correspondant au « fediverse ». Cette instance se nomme {instance_name}. Mobilizon est un réseau fédéré de multiples instances (tout comme des serveurs email), des utilisateur·rice·s inscrites sur différentes instances peuvent communiquer bien qu'il·elle·s ne se soient pas enregistré·e·s sur la même instance.",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "Une « interface de programmation dapplication » ou « API » est un protocole de communication qui permet aux composants logiciels de communiquer entre eux. L'API Mobilizon, par exemple, peut permettre à des outils logiciels tiers de communiquer avec les instances Mobilizon pour effectuer certaines actions, telles que la publication d'événements en votre nom, automatiquement et à distance.",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events, automatically and remotely.": "Une « interface de programmation d'application » ou « API » est un protocole de communication qui permet à des composants logiciels de communiquer entre eux. L'API de Mobilizon, par exemple, peut permettre à des outils logiciels tiers de communiquer avec des instances de Mobilizon pour effectuer certaines actions, comme la publication d'événements, automatiquement et à distance.",
"And {number} comments": "Et {number} commentaires",
"Announcements": "Annonces",
"Announcements and mentions notifications are always sent straight away.": "Les notifications d'annonces et de mentions sont toujours envoyées directement.",
"Anonymous participant": "Participant⋅e anonyme",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Les participants anonymes devront confirmer leur participation par email.",
@ -113,8 +126,11 @@
"Anyone can request being a member, but an administrator needs to approve the membership.": "N'importe qui peut demander à être membre, mais un⋅e administrateur⋅ice devra approuver leur adhésion.",
"Anyone wanting to be a member from your group will be able to from your group page.": "N'importe qui voulant devenir membre pourra le faire depuis votre page de groupe.",
"Application": "Application",
"Application not found": "Application non trouvée",
"Application was revoked": "L'application a été révoquée",
"Apply filters": "Appliquer les filtres",
"Approve member": "Approuver le ou la membre",
"Apps": "Applications",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Êtes-vous vraiment certain⋅e de vouloir supprimer votre compte ? Vous allez tout perdre. Identités, paramètres, événements créés, messages et participations disparaîtront pour toujours.",
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Êtes-vous certain·e de vouloir <b>complètement supprimer</b> ce groupe ? Tous les membres - y compris ceux·elles sur d'autres instances - seront notifié·e·s et supprimé·e·s du groupe, et <b>toutes les données associées au groupe (événements, billets, discussions, todos…) seront irrémédiablement détruites</b>.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Êtes-vous certain⋅e de vouloir <b>supprimer</b> ce commentaire ? Cette action ne peut pas être annulée.",
@ -133,6 +149,10 @@
"Assigned to": "Assigné à",
"Atom feed for events and posts": "Flux Atom pour les événements et les billets",
"Attending": "Participant⋅e",
"Authorize": "Autoriser",
"Authorize application": "Autoriser l'application",
"Authorized on {authorization_date}": "Authorisée le {authorization_date}",
"Autorize this application to access your account?": "Autoriser cette application à accéder à votre compte ?",
"Avatar": "Avatar",
"Back to group list": "Retour à la liste des groupes",
"Back to homepage": "Retour à la page d'accueil",
@ -215,6 +235,7 @@
"Confirmed: Will happen": "Confirmé : aura lieu",
"Congratulations, your account is now created!": "Bravo, votre compte est dorénavant créé !",
"Contact": "Contact",
"Continue": "Continuer",
"Continue editing": "Continuer la modification",
"Cookies and Local storage": "Cookies et stockage local",
"Copy URL to clipboard": "Copier l'URL dans le presse-papiers",
@ -228,18 +249,23 @@
"Create a new group": "Créer un nouveau groupe",
"Create a new identity": "Créer une nouvelle identité",
"Create a new list": "Créer une nouvelle liste",
"Create a new metadata element": "Créer un nouvel élément de métadonnées",
"Create a new profile": "Créer un nouveau profil",
"Create a pad": "Créer un pad",
"Create a videoconference": "Créer une visio-conférence",
"Create an account": "Créer un compte",
"Create discussion": "Créer une discussion",
"Create event": "Créer un événement",
"Create feed tokens": "Créer des jetons de flux",
"Create group": "Créer un groupe",
"Create group discussions": "Créer des discussions de groupes",
"Create group resources": "Créer des ressources de groupes",
"Create identity": "Créer une identité",
"Create my event": "Créer mon événement",
"Create my group": "Créer mon groupe",
"Create my profile": "Créer mon profil",
"Create new links": "Créer de nouveaux liens",
"Create new profiles": "Créer des nouveaux profils",
"Create resource": "Créer une ressource",
"Create the discussion": "Créer la discussion",
"Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Créez des listes de choses à faire pour toutes les tâches que vous devez faire, attribuez les et fixez des dates d'échéance.",
@ -268,13 +294,20 @@
"Delete Comment": "Supprimer le commentaire",
"Delete Event": "Supprimer l'événement",
"Delete account": "Suppression du compte",
"Delete comments": "Supprimer des commentaires",
"Delete conversation": "Supprimer la conversation",
"Delete discussion": "Supprimer la discussion",
"Delete event": "Supprimer un événement",
"Delete events": "Supprimer des événements",
"Delete everything": "Tout supprimer",
"Delete feed tokens": "Supprimer les jetons de flux",
"Delete group": "Supprimer le groupe",
"Delete group discussions": "Supprimer des discussions de groupes",
"Delete group posts": "Supprimer des billets de groupes",
"Delete group resources": "Supprimer des ressources de groupes",
"Delete my account": "Supprimer mon compte",
"Delete post": "Supprimer le billet",
"Delete profiles": "Supprimer des profils",
"Delete this discussion": "Supprimer cette discussion",
"Delete this identity": "Supprimer cette identité",
"Delete your identity": "Supprimer votre identité",
@ -288,6 +321,7 @@
"Describe your event": "Décrivez votre événement",
"Description": "Description",
"Details": "Détails",
"Device activation": "Activation de l'appareil",
"Didn't receive the instructions?": "Vous n'avez pas reçu les instructions ?",
"Disabled": "Désactivé",
"Discussions": "Discussions",
@ -326,6 +360,7 @@
"Emails usually don't contain capitals, make sure you haven't made a typo.": "Les emails ne contiennent d'ordinaire pas de capitales, assurez-vous de n'avoir pas fait de faute de frappe.",
"Enabled": "Activé",
"Ends on…": "Se termine le…",
"Enter the code displayed on your device": "Saisissez le code affiché sur votre appareil",
"Enter the link URL": "Entrez l'URL du lien",
"Enter your email address below, and we'll email you instructions on how to change your password.": "Indiquez votre adresse e-mail ci-dessous. Nous vous enverrons des instructions concernant la modification de votre mot de passe.",
"Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Entrez votre propre politique de confidentialité. Les balises HTML sont autorisées. La {mobilizon_privacy_policy} est fournie comme modèle.",
@ -540,6 +575,7 @@
"Last published events": "Derniers événements publiés",
"Last seen on": "Vu pour la dernière fois",
"Last sign-in": "Dernière connexion",
"Last used on {last_used_date}": "Utilisée pour la dernière fois le {last_used_date}",
"Last week": "La semaine dernière",
"Latest posts": "Derniers billets",
"Learn more": "En apprendre plus",
@ -575,8 +611,14 @@
"Login status": "Statut de connexion",
"Main languages you/your moderators speak": "Principales langues parlées par vous / vos modérateurs",
"Make sure that all words are spelled correctly.": "Vérifiez lorthographe des termes de recherche.",
"Manage activity settings": "Gérer les paramètres d'activité",
"Manage event participations": "Gérer les participations aux événements",
"Manage group members": "Gérer les membres des groupes",
"Manage group memberships": "Gérer vos adhésions à des groupes",
"Manage participations": "Gérer les participations",
"Manage push notification settings": "Gérer les paramètres de notification push",
"Manually approve new followers": "Approuver les nouvelles demandes de suivi manuellement",
"Manually enter address": "Saisir manuellement l'adresse",
"Manually invite new members": "Inviter des nouveaux·elles membres manuellement",
"Map": "Carte",
"Mark as resolved": "Marquer comme résolu",
@ -606,6 +648,7 @@
"Moderation log": "Journaux de modération",
"Moderation logs": "Journaux de modération",
"Moderator": "Moderateur·ice",
"Modify all of your account's data": "Modifier toutes les données de votre compte",
"More options": "Plus d'options",
"Most recently published": "Publié récemment",
"Move": "Déplacer",
@ -620,6 +663,7 @@
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "REMARQUE : les conditions par défaut n'ont pas été vérifiées par un·e juriste et sont donc susceptibles de ne pas offrir une protection juridique complète dans toutes les situations pour un·e administrateur·rice d'instance qui les utilise. Elles ne sont pas non plus spécifiques à tous les pays et juridictions. Si vous n'êtes pas sûr·e, veuillez consulter un·e juriste.",
"Name": "Nom",
"Navigated to {pageTitle}": "Navigué vers {pageTitle}",
"Never used": "Jamais utilisée",
"New discussion": "Nouvelle discussion",
"New email": "Nouvelle adresse e-mail",
"New folder": "Nouveau dossier",
@ -634,6 +678,7 @@
"Next page": "Page suivante",
"Next week": "La semaine prochaine",
"No address defined": "Aucune adresse définie",
"No apps authorized yet": "Aucune application autorisée pour le moment",
"No categories with public upcoming events on this instance were found.": "Aucune catégorie avec des événements publics à venir n'a été trouvée.",
"No closed reports yet": "Aucun signalement fermé pour le moment",
"No comment": "Pas de commentaire",
@ -789,6 +834,7 @@
"Post a comment": "Ajouter un commentaire",
"Post a reply": "Envoyer une réponse",
"Post body": "Corps du billet",
"Post comments": "Poster des commentaires",
"Post {eventTitle} reported": "Billet {eventTitle} signalé",
"Postal Code": "Code postal",
"Posts": "Billets",
@ -816,10 +862,11 @@
"Public event": "Événement public",
"Public feeds": "Flux publics",
"Public iCal Feed": "Flux iCal public",
"Public page": "Page publique",
"Public preview": "Aperçu public",
"Publication date": "Date de publication",
"Publish": "Publier",
"Publish events": "Publier des événements",
"Publish group posts": "Publier des billets de groupes",
"Published by {name}": "Publié par {name}",
"Published events with <b>{comments}</b> comments and <b>{participations}</b> confirmed participations": "Événements publiés avec <b>{comments}</b> commentaires et <b>{participations}</b> participations confirmées",
"Published events with {comments} comments and {participations} confirmed participations": "Événements publiés avec {comments} commentaires et {participations} participations confirmées",
@ -827,6 +874,7 @@
"Quote": "Citation",
"RSS/Atom Feed": "Flux RSS/Atom",
"Radius": "Rayon",
"Read all of your account's data": "Lire toutes les données de votre compte",
"Recap every week": "Récapitulatif hebdomadaire",
"Receive one email for each activity": "Recevoir un e-mail à chaque activité",
"Receive one email per request": "Recevoir un e-mail par demande",
@ -852,6 +900,7 @@
"Remember my participation in this browser": "Se souvenir de ma participation dans ce navigateur",
"Remove": "Exclure",
"Remove link": "Enlever un lien",
"Remove uploaded media": "Supprimer des médias téléversés",
"Rename": "Renommer",
"Rename resource": "Renommer la ressource",
"Reopen": "Réouvrir",
@ -890,6 +939,7 @@
"Resources": "Ressources",
"Restricted": "Restreintes",
"Return to the group page": "Retourner à la page du groupe",
"Revoke": "Révoquer",
"Right now": "À l'instant",
"Role": "Rôle",
"Rules": "Règles",
@ -981,6 +1031,7 @@
"The actual number of participants may differ, as this event is hosted on another instance.": "Le nombre réel de participant⋅e⋅s peut être différent, car cet événement provient d'une autre instance.",
"The calc will be created on {service}": "Le calc sera créé sur {service}",
"The content came from another server. Transfer an anonymous copy of the report?": "Le contenu provient d'une autre instance. Transférer une copie anonyme du signalement ?",
"The device code is incorrect or no longer valid.": "Le code de l'appareil est incorrect ou n'est plus valide.",
"The draft event has been updated": "L'événement brouillon a été mis à jour",
"The event has a sign language interpreter": "L'événement a un interprète en langue des signes",
"The event has been created as a draft": "L'événement a été créé en tant que brouillon",
@ -1023,6 +1074,7 @@
"The post {post} was created by {profile}.": "Le billet {post} a été créé par {profile}.",
"The post {post} was deleted by {profile}.": "Le billet {post} a été supprimé par {profile}.",
"The post {post} was updated by {profile}.": "Le billet {post} a été mis à jour par {profile}.",
"The provided application was not found.": "L'application fournie n'a pas été trouvée.",
"The report contents (eventual comments and event) and the reported profile details will be transmitted to Akismet.": "Les contenus du signalement (les éventuels commentaires et événement) et les détails du profil signalé seront transmis à Akismet.",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Le signalement sera envoyé aux modérateur⋅ices de votre instance. Vous pouvez expliquer pourquoi vous signalez ce contenu ci-dessous.",
"The selected picture is too heavy. You need to select a file smaller than {size}.": "L'image sélectionnée est trop lourde. Vous devez sélectionner un fichier de moins de {size}.",
@ -1036,12 +1088,56 @@
"There is no activity yet. Start doing some things to see activity appear here.": "Il n'y a pas encore d'activité. Commencez par effectuer des actions pour voir des éléments s'afficher ici.",
"There will be no way to recover your data.": "Il n'y aura aucun moyen de récupérer vos données.",
"There's no discussions yet": "Il n'y a pas encore de discussions",
"These apps can access your account through the API. If you see here apps that you don't recognize, that don't work as expected or that you don't use anymore, you can revoke their access.": "Ces applications peuvent accéder à votre compte via l'API. Si vous voyez ici des applications que vous ne reconnaissez pas, qui ne fonctionnent pas comme prévu ou que vous n'utilisez plus, vous pouvez révoquer leur accès.",
"These events may interest you": "Ces événements peuvent vous intéresser",
"These feeds contain event data for the events for which any of your profiles is a participant or creator. You should keep these private. You can find feeds for specific profiles on each profile edition page.": "Ces flux contiennent des informations sur les événements pour lesquels n'importe lequel de vos profils est un⋅e participant⋅e ou un⋅e créateur⋅ice. Vous devriez les garder privés. Vous pouvez trouver des flux spécifiques à chaque profil sur la page d'édition des profils.",
"These feeds contain event data for the events for which this specific profile is a participant or creator. You should keep these private. You can find feeds for all of your profiles into your notification settings.": "Ces flux contiennent des informations sur les événements pour lesquels ce profil spécifique est un⋅e participant⋅e ou un⋅e créateur⋅ice. Vous devriez les garder privés. Vous pouvez trouver des flux pour l'ensemble de vos profils dans vos paramètres de notification.",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Cette instance Mobilizon et l'organisateur⋅ice de l'événement autorise les participations anonymes, mais requiert une validation à travers une confirmation par email.",
"This URL doesn't seem to be valid": "Cette URL ne semble pas être valide",
"This URL is not supported": "Cette URL n'est pas supportée",
"This application asks for the following permissions:": "Cette application demande les autorisations suivantes :",
"This application didn't ask for known permissions. It's likely the request is incorrect.": "Cette application n'a pas demandé d'autorisations connues. Il est probable que la demande soit incorrecte.",
"This application will be able to access all of your informations and post content. Make sure you only approve applications you trust.": "Cette application sera capable d'accéder à toutes vos informations et poster du contenu. Assurez-vous d'approuver uniquement des applications en lesquelles vous avez confiance.",
"This application will be allowed to access all of the groups you're a member of": "Cette application pourra accéder à tous les groupes dont vous êtes membres",
"This application will be allowed to access group activities in all of the groups you're a member of": "This application will be allowed to access group activities in all of the groups you're a member of",
"This application will be allowed to create feed tokens": "This application will be allowed to create feed tokens",
"This application will be allowed to create group discussions": "This application will be allowed to create group discussions",
"This application will be allowed to create new profiles for your account": "This application will be allowed to create new profiles for your account",
"This application will be allowed to create resources in all of the groups you're a member of": "Cette application pourra créer des ressources dans chacun des groupes dont vous êtes membre",
"This application will be allowed to delete comments": "This application will be allowed to delete comments",
"This application will be allowed to delete events": "Cette application pourra supprimer des événements",
"This application will be allowed to delete feed tokens": "This application will be allowed to delete feed tokens",
"This application will be allowed to delete group discussions": "This application will be allowed to delete group discussions",
"This application will be allowed to delete group posts": "Cette application pourra supprimer des billets de groupes",
"This application will be allowed to delete resources in all of the groups you're a member of": "Cette application pourra supprimer des ressources dans chacun des groupes dont vous êtes membre",
"This application will be allowed to delete your profiles": "This application will be allowed to delete your profiles",
"This application will be allowed to join and leave groups": "This application will be allowed to join and leave groups",
"This application will be allowed to list and access group discussions in all of the groups you're a member of": "This application will be allowed to list and access group discussions in all of the groups you're a member of",
"This application will be allowed to list and access group events in all of the groups you're a member of": "Cette application pourra lister et accéder aux événements des groupes dont vous êtes membre",
"This application will be allowed to list and access group todo-lists in all of the groups you're a member of": "This application will be allowed to list and access group todo-lists in all of the groups you're a member of",
"This application will be allowed to list and view the events you're participating to": "This application will be allowed to list and view the events you're participating to",
"This application will be allowed to list and view the groups you're a member of": "This application will be allowed to list and view the groups you're a member of",
"This application will be allowed to list and view the groups you're following": "This application will be allowed to list and view the groups you're following",
"This application will be allowed to list and view your organized events": "This application will be allowed to list and view your organized events",
"This application will be allowed to list group followers in all of the groups you're a member of": "This application will be allowed to list group followers in all of the groups you're a member of",
"This application will be allowed to list group members in all of the groups you're a member of": "This application will be allowed to list group members in all of the groups you're a member of",
"This application will be allowed to manage events participations": "Cette application sera autorisée à gérer vos participations à des événements",
"This application will be allowed to manage group members in all of the groups you're a member of": "This application will be allowed to manage group members in all of the groups you're a member of",
"This application will be allowed to manage your account activity settings": "Cette application sera autorisée à gérer vos paramètres d'activité",
"This application will be allowed to manage your account push notification settings": "Cette application sera autorisée à gérer vos paramètres de notification push",
"This application will be allowed to post comments": "This application will be allowed to post comments",
"This application will be allowed to publish and manage events, post and manage comments, participate to events, manage all of your groups, including group events, resources, posts and discussions. It will also be allowed to manage your account and profile settings.": "Cette application sera autorisée à publier et à gérer des événements, à publier et à gérer des commentaires, à participer à des événements, à gérer tous vos groupes, y compris les événements de groupe, les ressources, les messages et les discussions. Elle pourra également gérer les paramètres de votre compte et de votre profil.",
"This application will be allowed to publish events": "Cette application pourra publier des événements",
"This application will be allowed to publish group posts": "Cette application pourra publier des billets de groupes",
"This application will be allowed to remove uploaded media": "Cette application pourra supprimer des médias téléversés",
"This application will be allowed to see all of your events organized, the events you participate to, as well as every data from your groups.": "Cette application vous permettra de voir tous les événements que vous avez organisés, les événements auxquels vous participez, ainsi que toutes les données de vos groupes.",
"This application will be allowed to update comments": "This application will be allowed to update comments",
"This application will be allowed to update events": "Cette application pourra mettre à jour des événements",
"This application will be allowed to update group discussions": "This application will be allowed to update group discussions",
"This application will be allowed to update group posts": "Cette application pourra mettre à jour des billets de groupes",
"This application will be allowed to update resources in all of the groups you're a member of": "Cette application pourra mettre à jour des ressources dans chacun des groupes dont vous êtes membre",
"This application will be allowed to update your profiles": "This application will be allowed to update your profiles",
"This application will be allowed to upload media": "Cette application pourra téléverser des médias",
"This event has been cancelled.": "Cet événement a été annulé.",
"This event is accessible only through it's link. Be careful where you post this link.": "Cet événement est accessible uniquement à travers son lien. Faites attention où vous le diffusez.",
"This group doesn't have a description yet.": "Ce groupe n'a pas encore de description.",
@ -1125,12 +1221,19 @@
"Upcoming events from your groups": "Événements de vos groupes à venir",
"Update": "Éditer",
"Update app": "Mettre à jour",
"Update comments": "Mettre à jour des commentaires",
"Update discussion title": "Mettre à jour le titre de la discussion",
"Update event {name}": "Mettre à jour l'événement {name}",
"Update events": "Mettre à jour des événements",
"Update group": "Mettre à jour le groupe",
"Update group discussions": "Mettre à jour des discussions de groupes",
"Update group posts": "Mettre à jour des billets de groupes",
"Update group resources": "Mettre à jour des ressources de groupes",
"Update my event": "Mettre à jour mon événement",
"Update post": "Mettre à jour le billet",
"Update profiles": "Mettre à jour des profils",
"Updated": "Mis à jour",
"Upload media": "Téléverser des médias",
"Uploaded media size": "Taille des médias téléversés",
"Uploaded media total size": "Taille totale des médias téléversés",
"Use my location": "Utiliser ma position",
@ -1216,7 +1319,10 @@
"You are participating in this event anonymously but didn't confirm participation": "Vous participez à cet événement anonymement mais vous n'avez pas confirmé votre participation",
"You can add resources by using the button above.": "Vous pouvez ajouter des ressources en utilisant le bouton au dessus.",
"You can add tags by hitting the Enter key or by adding a comma": "Vous pouvez ajouter des tags en appuyant sur la touche Entrée ou bien en ajoutant une virgule",
"You can drag and drop the marker below to the desired location": "Vous pouvez faire glisser et déposer le marqueur ci-dessous à l'endroit souhaité",
"You can pick your timezone into your preferences.": "Vous pouvez choisir votre fuseau horaire dans vos préférences.",
"You can put any arbitrary content in this element. URLs will be clickable.": "Vous pouvez placer n'importe quel contenu arbitraire dans cet élément. Les URL seront cliquables.",
"You can try another search term or add the address details manually below.": "Vous pouvez essayer un autre terme de recherche ou ajouter manuellement les détails de l'adresse ci-dessous.",
"You can try another search term or drag and drop the marker on the map": "Vous pouvez essayer avec d'autres termes de recherche ou bien glisser et déposer le marqueur sur la carte",
"You can't change your password because you are registered through {provider}.": "Vous ne pouvez pas changer votre mot de passe car vous vous êtes enregistré via {provider}.",
"You can't use push notifications in this browser.": "Vous ne pouvez pas utiliser les notifications push dans ce navigateur.",
@ -1241,6 +1347,7 @@
"You excluded member {member}.": "Vous avez exclu le ou la membre {member}.",
"You have attended {count} events in the past.": "Vous n'avez participé à aucun événement par le passé.|Vous avez participé à un événement par le passé.|Vous avez participé à {count} événements par le passé.",
"You have been invited by {invitedBy} to the following group:": "Vous avez été invité par {invitedBy} à rejoindre le groupe suivant :",
"You have been logged-out": "Vous avez été déconnecté·e",
"You have been removed from this group's members.": "Vous avez été exclu⋅e des membres de ce groupe.",
"You have cancelled your participation": "Vous avez annulé votre participation",
"You have one event in {days} days.": "Vous n'avez pas d'événements dans {days} jours | Vous avez un événement dans {days} jours. | Vous avez {count} événements dans {days} jours",
@ -1258,6 +1365,7 @@
"You moved the resource {resource} into {new_path}.": "Vous avez déplacé la ressource {resource} dans {new_path}.",
"You moved the resource {resource} to the root folder.": "Vous avez déplacé la ressource {resource} dans le dossier racine.",
"You need to login.": "Vous devez vous connecter.",
"You need to provide the following code to your application. It will only be valid for a few minutes.": "Vous devez fournir le code suivant à votre application. Il sera seulement valide pendant quelques minutes.",
"You posted a comment on the event {event}.": "Vous avez posté un commentaire sur l'événement {event}.",
"You promoted the member {member} to an unknown role.": "Vous avez promu le ou la membre {member} à un role inconnu.",
"You promoted {member} to administrator.": "Vous avez promu {member} en tant qu'adminstrateur⋅ice.",
@ -1284,6 +1392,7 @@
"You will find here all the events you have created or of which you are a participant, as well as events organized by groups you follow or are a member of.": "Vous trouverez ici tous les événements que vous avez créé ou dont vous êtes un·e participant·e, ainsi que les événements organisés par les groupes que vous suivez ou dont vous êtes membre.",
"You will receive notifications about this group's public activity depending on %{notification_settings}.": "Vous recevrez des notifications à propos de l'activité publique de ce groupe en fonction de %{notification_settings}.",
"You wish to participate to the following event": "Vous souhaitez participer à l'événement suivant",
"You'll be able to revoke access for this application in your account settings.": "Vous pourrez révoquer l'accès pour cette applications dans les paramètres de votre compte.",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Vous recevrez un récapitulatif hebdomadaire chaque lundi pour les événements de la semaine, si vous en avez.",
"You'll need to change the URLs where there were previously entered.": "Vous devrez changer les URLs là où vous les avez entrées précédemment.",
"You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Vous aurez besoin de transmettre l'URL du groupe pour que d'autres personnes accèdent au profil du groupe. Le groupe ne sera pas trouvable dans la recherche de Mobilizon ni dans les moteurs de recherche habituels.",
@ -1294,6 +1403,7 @@
"Your account has been validated": "Votre compte a été validé",
"Your account is being validated": "Votre compte est en cours de validation",
"Your account is nearly ready, {username}": "Votre compte est presque prêt, {username}",
"Your application code": "Votre code d'application",
"Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.": "Votre ville ou région et le rayon seront uniquement utilisés pour vous suggérer des événements proches. Le rayon des événements proches sera calculé par rapport au centre administratif de la zone.",
"Your current email is {email}. You use it to log in.": "Votre adresse e-mail actuelle est {email}. Vous l'utilisez pour vous connecter.",
"Your email": "Votre adresse e-mail",
@ -1450,115 +1560,5 @@
"{username} was invited to {group}": "{username} a été invité à {group}",
"{user}'s follow request was accepted": "La demande de suivi de {user} a été acceptée",
"{user}'s follow request was rejected": "La demande de suivi de {user} a été rejetée",
"© The OpenStreetMap Contributors": "© Les Contributeur⋅ices OpenStreetMap",
"Autorize this application to access your account?": "Autoriser cette application à accéder à votre compte ?",
"This application will be able to access all of your informations and post content. Make sure you only approve applications you trust.": "Cette application sera capable d'accéder à toutes vos informations et poster du contenu. Assurez-vous d'approuver uniquement des applications en lesquelles vous avez confiance.",
"Authorize application": "Autoriser l'application",
"Authorize": "Autoriser",
"You'll be able to revoke access for this application in your account settings.": "Vous pourrez révoquer l'accès pour cette applications dans les paramètres de votre compte.",
"Read all of your account's data": "Lire toutes les données de votre compte",
"Modify all of your account's data": "Modifier toutes les données de votre compte",
"Publish events": "Publier des événements",
"This application will be allowed to publish events": "Cette application pourra publier des événements",
"Update events": "Mettre à jour des événements",
"This application will be allowed to update events": "Cette application pourra mettre à jour des événements",
"Delete events": "Supprimer des événements",
"This application will be allowed to delete events": "Cette application pourra supprimer des événements",
"Upload media": "Téléverser des médias",
"This application will be allowed to upload media": "Cette application pourra téléverser des médias",
"Remove uploaded media": "Supprimer des médias téléversés",
"This application will be allowed to remove uploaded media": "Cette application pourra supprimer des médias téléversés",
"Publish group posts": "Publier des billets de groupes",
"This application will be allowed to publish group posts": "Cette application pourra publier des billets de groupes",
"Update group posts": "Mettre à jour des billets de groupes",
"This application will be allowed to update group posts": "Cette application pourra mettre à jour des billets de groupes",
"Delete group posts": "Supprimer des billets de groupes",
"This application will be allowed to delete group posts": "Cette application pourra supprimer des billets de groupes",
"Access your group's resources": "Accéder aux ressources de vos groupes",
"This application will be allowed to access all of the groups you're a member of": "Cette application pourra accéder à tous les groupes dont vous êtes membres",
"Create group resources": "Créer des ressources de groupes",
"This application will be allowed to create resources in all of the groups you're a member of": "Cette application pourra créer des ressources dans chacun des groupes dont vous êtes membre",
"Update group resources": "Mettre à jour des ressources de groupes",
"This application will be allowed to update resources in all of the groups you're a member of": "Cette application pourra mettre à jour des ressources dans chacun des groupes dont vous êtes membre",
"Delete group resources": "Supprimer des ressources de groupes",
"This application will be allowed to delete resources in all of the groups you're a member of": "Cette application pourra supprimer des ressources dans chacun des groupes dont vous êtes membre",
"Access group events": "Accéder aux événements des groupes",
"This application will be allowed to list and access group events in all of the groups you're a member of": "Cette application pourra lister et accéder aux événements des groupes dont vous êtes membre",
"Access group discussions": "Accéder aux discussions des groupes",
"This application will be allowed to list and access group discussions in all of the groups you're a member of": "This application will be allowed to list and access group discussions in all of the groups you're a member of",
"Access group members": "Accéder à la liste des membres des groupes",
"This application will be allowed to list group members in all of the groups you're a member of": "This application will be allowed to list group members in all of the groups you're a member of",
"Access group followers": "Accéder à la liste des abonnés des groupes",
"This application will be allowed to list group followers in all of the groups you're a member of": "This application will be allowed to list group followers in all of the groups you're a member of",
"Access group activities": "Accéder aux activités des groupes",
"This application will be allowed to access group activities in all of the groups you're a member of": "This application will be allowed to access group activities in all of the groups you're a member of",
"Access group todo-lists": "Accéder aux listes de tâches des groupes",
"This application will be allowed to list and access group todo-lists in all of the groups you're a member of": "This application will be allowed to list and access group todo-lists in all of the groups you're a member of",
"Manage group memberships": "Gérer vos adhésions à des groupes",
"This application will be allowed to join and leave groups": "This application will be allowed to join and leave groups",
"Manage group members": "Gérer les membres des groupes",
"This application will be allowed to manage group members in all of the groups you're a member of": "This application will be allowed to manage group members in all of the groups you're a member of",
"Access organized events": "Accéder à la liste de vos événements organisés",
"This application will be allowed to list and view your organized events": "This application will be allowed to list and view your organized events",
"Access participations": "Accéder à la liste de vos participations",
"This application will be allowed to list and view the events you're participating to": "This application will be allowed to list and view the events you're participating to",
"Access group memberships": "Accéder à la liste de vos adhésions à des groupes",
"This application will be allowed to list and view the groups you're a member of": "This application will be allowed to list and view the groups you're a member of",
"Access followed groups": "Accéder à la liste des groupes suivis",
"This application will be allowed to list and view the groups you're following": "This application will be allowed to list and view the groups you're following",
"Create new profiles": "Créer des nouveaux profils",
"This application will be allowed to create new profiles for your account": "This application will be allowed to create new profiles for your account",
"Update profiles": "Mettre à jour des profils",
"This application will be allowed to update your profiles": "This application will be allowed to update your profiles",
"Delete profiles": "Supprimer des profils",
"This application will be allowed to delete your profiles": "This application will be allowed to delete your profiles",
"Post comments": "Poster des commentaires",
"This application will be allowed to post comments": "This application will be allowed to post comments",
"Update comments": "Mettre à jour des commentaires",
"This application will be allowed to update comments": "This application will be allowed to update comments",
"Delete comments": "Supprimer des commentaires",
"This application will be allowed to delete comments": "This application will be allowed to delete comments",
"Create group discussions": "Créer des discussions de groupes",
"This application will be allowed to create group discussions": "This application will be allowed to create group discussions",
"Update group discussions": "Mettre à jour des discussions de groupes",
"This application will be allowed to update group discussions": "This application will be allowed to update group discussions",
"Delete group discussions": "Supprimer des discussions de groupes",
"This application will be allowed to delete group discussions": "This application will be allowed to delete group discussions",
"Create feed tokens": "Créer des jetons de flux",
"This application will be allowed to create feed tokens": "This application will be allowed to create feed tokens",
"Delete feed tokens": "Supprimer les jetons de flux",
"This application will be allowed to delete feed tokens": "This application will be allowed to delete feed tokens",
"Manage event participations": "Gérer les participations aux événements",
"This application will be allowed to manage events participations": "Cette application sera autorisée à gérer vos participations à des événements",
"Manage activity settings": "Gérer les paramètres d'activité",
"This application will be allowed to manage your account activity settings": "Cette application sera autorisée à gérer vos paramètres d'activité",
"Manage push notification settings": "Gérer les paramètres de notification push",
"This application will be allowed to manage your account push notification settings": "Cette application sera autorisée à gérer vos paramètres de notification push",
"Apps": "Applications",
"Device activation": "Activation de l'appareil",
"Application not found": "Application non trouvée",
"The provided application was not found.": "L'application fournie n'a pas été trouvée.",
"Your application code": "Votre code d'application",
"You need to provide the following code to your application. It will only be valid for a few minutes.": "Vous devez fournir le code suivant à votre application. Il sera seulement valide pendant quelques minutes.",
"Enter the code displayed on your device": "Saisissez le code affiché sur votre appareil",
"Continue": "Continuer",
"The device code is incorrect or no longer valid.": "Le code de l'appareil est incorrect ou n'est plus valide.",
"These apps can access your account through the API. If you see here apps that you don't recognize, that don't work as expected or that you don't use anymore, you can revoke their access.": "Ces applications peuvent accéder à votre compte via l'API. Si vous voyez ici des applications que vous ne reconnaissez pas, qui ne fonctionnent pas comme prévu ou que vous n'utilisez plus, vous pouvez révoquer leur accès.",
"Last used on {last_used_date}": "Utilisée pour la dernière fois le {last_used_date}",
"Never used": "Jamais utilisée",
"Authorized on {authorization_date}": "Authorisée le {authorization_date}",
"Revoke": "Révoquer",
"Application was revoked": "L'application a été révoquée",
"Create a new metadata element": "Créer un nouvel élément de métadonnées",
"You can put any arbitrary content in this element. URLs will be clickable.": "Vous pouvez placer n'importe quel contenu arbitraire dans cet élément. Les URL seront cliquables.",
"You can try another search term or add the address details manually below.": "Vous pouvez essayer un autre terme de recherche ou ajouter manuellement les détails de l'adresse ci-dessous.",
"Manually enter address": "Saisir manuellement l'adresse",
"You can drag and drop the marker below to the desired location": "Vous pouvez faire glisser et déposer le marqueur ci-dessous à l'endroit souhaité",
"This application didn't ask for known permissions. It's likely the request is incorrect.": "Cette application n'a pas demandé d'autorisations connues. Il est probable que la demande soit incorrecte.",
"This application asks for the following permissions:": "Cette application demande les autorisations suivantes :",
"This application will be allowed to see all of your events organized, the events you participate to, as well as every data from your groups.": "Cette application vous permettra de voir tous les événements que vous avez organisés, les événements auxquels vous participez, ainsi que toutes les données de vos groupes.",
"This application will be allowed to publish and manage events, post and manage comments, participate to events, manage all of your groups, including group events, resources, posts and discussions. It will also be allowed to manage your account and profile settings.": "Cette application sera autorisée à publier et à gérer des événements, à publier et à gérer des commentaires, à participer à des événements, à gérer tous vos groupes, y compris les événements de groupe, les ressources, les messages et les discussions. Elle pourra également gérer les paramètres de votre compte et de votre profil.",
"No apps authorized yet": "Aucune application autorisée pour le moment",
"You have been logged-out": "Vous avez été déconnecté·e",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "Une « interface de programmation dapplication » ou « API » est un protocole de communication qui permet aux composants logiciels de communiquer entre eux. L'API Mobilizon, par exemple, peut permettre à des outils logiciels tiers de communiquer avec les instances Mobilizon pour effectuer certaines actions, telles que la publication d'événements en votre nom, automatiquement et à distance."
"© The OpenStreetMap Contributors": "© Les Contributeur⋅ices OpenStreetMap"
}

View file

@ -755,7 +755,6 @@
"Public event": "Tachartas poblach",
"Public feeds": "Inbhirean poblach",
"Public iCal Feed": "Inbhir iCal poblach",
"Public page": "Duilleag phoblach",
"Public preview": "Ro-shealladh poblach",
"Publication date": "Ceann-là an fhoillseachaidh",
"Publish": "Foillsich",

View file

@ -707,7 +707,6 @@
"Public event": "Evento público",
"Public feeds": "Fontes públicas",
"Public iCal Feed": "Fonte pública iCal",
"Public page": "Páxina pública",
"Public preview": "Vista previa pública",
"Publication date": "Data de publicación",
"Publish": "Publicar",

View file

@ -781,7 +781,6 @@
"Public event": "Javni događaj",
"Public feeds": "Javni feed",
"Public iCal Feed": "Javni iCal Feed",
"Public page": "Javna stranica",
"Public preview": "Javni pregled",
"Publication date": "Datum objave",
"Publish": "Objavi",

View file

@ -815,7 +815,6 @@
"Public event": "Nyilvános esemény",
"Public feeds": "Nyilvános hírforrások",
"Public iCal Feed": "Nyilvános iCal hírforrás",
"Public page": "Nyilvános oldal",
"Public preview": "Nyilvános előnézet",
"Publication date": "Közzététel dátuma",
"Publish": "Közzététel",

View file

@ -717,7 +717,6 @@
"Public event": "Acara publik",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "Tanggal publikasi",
"Publish": "Publikasikan",

View file

@ -815,7 +815,6 @@
"Public event": "Eventi pubblici",
"Public feeds": "Feed pubblici",
"Public iCal Feed": "Feed iCal pubblico",
"Public page": "Pagina pubblica",
"Public preview": "Anteprima pubblica",
"Publication date": "Data di pubblicazione",
"Publish": "Pubblica",

View file

@ -3,7 +3,7 @@
"(Masked)": "",
"(this folder)": "",
"(this link)": "",
"+ Add a resource": "",
"+ Add a resource": "+ リンクを追加する",
"+ Create a post": "+ 投稿を作成する",
"+ Create an event": "+ イベントを作成する",
"+ Start a discussion": "+ 議論を始める",
@ -24,8 +24,8 @@
"A new version is available.": "Mobilizionの新しいバージョンが利用可能です。",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "",
"A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "",
"A place to publish something to the whole world, your community or just your group members.": "",
"A place to store links to documents or resources of any type.": "",
"A place to publish something to the whole world, your community or just your group members.": "グループ内限定、サーバー内限定、またはインターネット全体に投稿できるスペースです。",
"A place to store links to documents or resources of any type.": "インターネットにあるもののリンクを記録できるページです。",
"A post has been published": "",
"A post has been updated": "",
"A practical tool": "実用的なツール",
@ -33,9 +33,9 @@
"A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "",
"A twitter account handle to follow for event updates": "",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "人を集めて計画して動員するための開放的で取り扱いが簡単で倫理的なソフトです。",
"A validation email was sent to {email}": "",
"A validation email was sent to {email}": "{email}に検証メールを送信しました",
"API": "API",
"Abandon editing": "",
"Abandon editing": "編集中止",
"About": "Mobilizonについて",
"About Mobilizon": "Mobilizonについて",
"About anonymous participation": "匿名参加について",
@ -58,7 +58,7 @@
"Active": "アクティブ",
"Activity": "",
"Actor": "役割",
"Add": "",
"Add": "追加",
"Add / Remove…": "追加/削除…",
"Add a contact": "連絡先を追加する",
"Add a new post": "新しい投稿をする",
@ -75,15 +75,15 @@
"Admin": "管理者",
"Admin dashboard": "管理者画面",
"Admin settings": "管理者設定",
"Admin settings successfully saved.": "",
"Admin settings successfully saved.": "管理設定を保存されました。",
"Administration": "管理",
"Administrator": "管理者",
"All": "全て",
"All activities": "全てのアクティビティ",
"All good, let's continue!": "",
"All the places have already been taken": "",
"Allow all comments from users with accounts": "",
"Allow registrations": "アカウント登録を許可する",
"All the places have already been taken": "すでに満員になりました",
"Allow all comments from users with accounts": "ログインしているユーザーはコメントができる",
"Allow registrations": "アカウント新規登録",
"An URL to an external ticketing platform": "",
"An error has occured while refreshing the page.": "ページを更新中にエラーが発生しました。",
"An error has occured. Sorry about that. You may try to reload the page.": "申し訳ありません、エラーが発生しました。再度ページを読み込んでみてください。",
@ -99,7 +99,7 @@
"And {number} comments": "",
"Announcements and mentions notifications are always sent straight away.": "",
"Anonymous participant": "匿名の参加者",
"Anonymous participants will be asked to confirm their participation through e-mail.": "",
"Anonymous participants will be asked to confirm their participation through e-mail.": "匿名参加者の参加の確認はメールで確認します。",
"Anonymous participations": "匿名の参加者",
"Any category": "全てのカテゴリー",
"Any day": "",
@ -109,19 +109,19 @@
"Anyone wanting to be a member from your group will be able to from your group page.": "",
"Application": "アプリケーション",
"Approve member": "",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "本当にアカウントのすべてを削除しますか?すべてのデータが削除されます。設定、アイデンティティー、作成したイベント、投稿、参加記録のすべてを削除したら取り戻すことができません。",
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "",
"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 discussion with the event creator or edit its event instead.": "",
"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 discussion with the event creator or edit its event instead.": "本当にこのイベントを<b>削除しますか?</b>取り戻すことができません。イベントの主催者と確認するか、イベントを編集することもあります。",
"Are you sure you want to <b>suspend</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "",
"Are you sure you want to <b>suspend</b> this group? As this group originates from instance {instance}, this will only remove local members and delete the local data, as well as rejecting all the future data.": "",
"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}\"?": "",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "イベント作成をやめますか?入力した情報がなくなります。",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "イベントの編集をやめますか?今までの変更した情報がなくなります。",
"Are you sure you want to cancel your participation at event \"{title}\"?": "イベントの「{title}」の参加を取り消しますか?",
"Are you sure you want to delete this entire discussion?": "本当に全ての議論を削除しますか?",
"Are you sure you want to delete this event? This action cannot be reverted.": "本当にこのイベントを削除しますか?このアクションを取り消すことはできません。",
"Are you sure you want to delete this event? This action cannot be reverted.": "本当にこのイベントを削除しますか?取り戻すことはできません。",
"Are you sure you want to delete this post? This action cannot be reverted.": "本当にこの投稿を削除しますか?このアクションは取り消しできません。",
"Are you sure you want to leave the group {groupName}? You'll loose access to this group's private content. This action cannot be undone.": "",
"Are you sure you want to leave the group {groupName}? You'll loose access to this group's private content. This action cannot be undone.": "本当に {groupName} から抜けますか?このグループのプライベート情報を見られなくなります。抜けたら取り戻すことができません。",
"As the event organizer has chosen to manually validate participation requests, your participation will be really confirmed only once you receive an email stating it's being accepted.": "",
"Ask your instance admin to {enable_feature}.": "{enable_feature}についてはインスタンス管理者にお問い合わせ下さい。",
"Assigned to": "",
@ -134,7 +134,7 @@
"Back to top": "ページトップに戻る",
"Back to user list": "ユーザーリストに戻る",
"Banner": "バナー",
"Before you can login, you need to click on the link inside it to validate your account.": "",
"Before you can login, you need to click on the link inside it to validate your account.": "ログインができるため、検証メールに書かれているリンクをクリックしてアカウントを検証する必要があります。",
"Begins on": "",
"Big Blue Button": "",
"Bold": "太字",
@ -147,7 +147,7 @@
"By {username}": "{username}より",
"Can be an email or a link, or just plain text.": "",
"Cancel": "キャンセル",
"Cancel anonymous participation": "",
"Cancel anonymous participation": "匿名参加をキャンセル",
"Cancel creation": "作成をキャンセル",
"Cancel discussion title edition": "議論タイトルの編集を止める",
"Cancel edition": "編集を取り消す",
@ -156,7 +156,7 @@
"Cancel my participation request…": "",
"Cancel my participation…": "",
"Cancelled": "キャンセルされました",
"Cancelled: Won't happen": "",
"Cancelled: Won't happen": "イベント中止:キャンセル",
"Category": "カテゴリー",
"Change": "変更",
"Change email": "メールアドレスを変更する",
@ -179,19 +179,19 @@
"Click for more information": "クリックして詳しい情報を知る",
"Click to upload": "クリックしてアップロードする",
"Close": "閉じる",
"Close comments for all (except for admins)": "",
"Closed": "閉じる",
"Close comments for all (except for admins)": "管理者以外のアカウントはコメントが不可にする",
"Closed": "停止",
"Comment body": "",
"Comment deleted": "コメントが削除されました。",
"Comment text can't be empty": "コメントのテキストは空白にはできません",
"Comments": "コメント",
"Comments are closed for everybody else.": "",
"Comments are closed for everybody else.": "他の方はコメント不可です。",
"Confirm my participation": "",
"Confirm my particpation": "",
"Confirm my particpation": "参加希望を確認する",
"Confirm participation": "",
"Confirmed": "確認されました",
"Confirmed at": "に確認されました",
"Confirmed: Will happen": "",
"Confirmed: Will happen": "確認済み:行う予定",
"Congratulations, your account is now created!": "おめでとうございます!あなたのアカウントが作成されました!",
"Contact": "お問い合わせ",
"Continue editing": "編集を続ける",
@ -265,12 +265,12 @@
"Demote": "",
"Description": "説明",
"Details": "詳細",
"Didn't receive the instructions?": "",
"Didn't receive the instructions?": "説明のメールが届いていないのですか?",
"Disabled": "無効",
"Discussions": "議論",
"Discussions list": "議論リスと",
"Display name": "表示名",
"Display participation price": "",
"Display participation price": "参加料金を表示する",
"Displayed nickname": "",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "",
"Do not receive any mail": "",
@ -282,7 +282,7 @@
"Draft": "下書き",
"Drafts": "下書き",
"Due on": "",
"Duplicate": "",
"Duplicate": "イベントを複製する",
"Edit": "編集",
"Edit post": "投稿を編集する",
"Edit profile {profile}": "",
@ -291,7 +291,7 @@
"Edited {relative_time} ago": "",
"Eg: Stockholm, Dance, Chess…": "",
"Either on the {instance} instance or on another instance.": "",
"Either the account is already validated, either the validation token is incorrect.": "",
"Either the account is already validated, either the validation token is incorrect.": "すでにアカウント検証済みか不正確な検証コードです。",
"Either the email has already been changed, either the validation token is incorrect.": "",
"Either the participation request has already been validated, either the validation token is incorrect.": "",
"Element title": "",
@ -301,7 +301,7 @@
"Email validate": "",
"Emails usually don't contain capitals, make sure you haven't made a typo.": "",
"Enabled": "有効",
"Ends on…": "",
"Ends on…": "...終了時間・日付",
"Enter the link URL": "URLのリンクを入力する",
"Enter your email address below, and we'll email you instructions on how to change your password.": "",
"Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "",
@ -377,7 +377,7 @@
"Framadate poll": "",
"From my groups": "",
"From the {startDate} at {startTime} to the {endDate}": "",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "開始:{startDate} の{startTime}時から、終了:{endDate}の{endTime}時まで",
"From the {startDate} to the {endDate}": "{startDate}から{endDate}まで",
"From yourself": "",
"Fully accessible with a wheelchair": "",
@ -386,10 +386,10 @@
"General information": "一般情報",
"General settings": "一般設定",
"Geolocation was not determined in time.": "",
"Getting location": "",
"Getting location": "場所検索中",
"Getting there": "",
"Glossary": "",
"Go": "",
"Go": "実行",
"Go to the event page": "イベントページにアクセス",
"Google Meet": "",
"Group": "グループ",
@ -425,9 +425,10 @@
"I don't have a Mobilizon account": "私はMobizilionアカウントを持っていません",
"I have a Mobilizon account": "私はMobizilionアカウントを持っています",
"I have an account on another Mobilizon instance.": "私は別のMobizilionインスタンスにアカウントを持っています。",
"I have an account on {instance}.": "{instance}のアカウントを持っています。",
"I participate": "",
"I want to allow people to participate without an account.": "",
"I want to approve every participation request": "",
"I want to allow people to participate without an account.": "アカウントなしで参加可能に設定する。",
"I want to approve every participation request": "すべての参加希望依頼を手動で許可する",
"I've been mentionned in a comment under an event": "",
"I've been mentionned in a group discussion": "",
"ICS feed for events": "イベントへのICSフィード",
@ -437,10 +438,10 @@
"Identity {displayName} created": "{displayName}のアイデンティティが作成されました",
"Identity {displayName} deleted": "{displayName}のアイデンティティが削除されました",
"Identity {displayName} updated": "{displayName}のアイデンティティが更新されました",
"If allowed by organizer": "",
"If allowed by organizer": "イベントの主催者が決める",
"If an account with this email exists, we just sent another confirmation email to {email}": "",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "",
"If you are being asked for your federated indentity, it's composed of your username and your instance. For instance, the federated identity for your first profile is:": "",
"If you are being asked for your federated indentity, it's composed of your username and your instance. For instance, the federated identity for your first profile is:": "連合のアイデンティティー、また連合のアカウントの場合はあなたのユーバー名とインスタンスのドメインです。例えば、一番最初に作成したプロフィールの連合のアイデンティティーは:",
"If you have opted for manual validation of participants, Mobilizon will send you an email to inform you of new participations to be processed. You can choose the frequency of these notifications below.": "",
"If you want, you may send a message to the event organizer here.": "",
"Ignore": "無視する",
@ -479,7 +480,7 @@
"Italic": "イタリック",
"Jitsi Meet": "",
"Join": "参加する",
"Join <b>{instance}</b>, a Mobilizon instance": "",
"Join <b>{instance}</b>, a Mobilizon instance": "Mobilizonで運している<b>{instance}</b>に参加しましょう",
"Join group": "グループに参加する",
"Join group {group}": "グループ{group}に参加する",
"Keep the entire conversation about a specific topic together on a single page.": "",
@ -495,22 +496,22 @@
"Learn more": "",
"Learn more about Mobilizon": "Mobilizonについて詳しく知る",
"Learn more about {instance}": "{instance}について詳しく知る",
"Leave": "グループを去る",
"Leave event": "",
"Leave group": "グループからる",
"Leaving event \"{title}\"": "",
"Leave": "抜ける",
"Leave event": "イベント参加を取り消す",
"Leave group": "グループから抜ける",
"Leaving event \"{title}\"": "「{title}」というイベント参加を取り消しています",
"Legal": "",
"Let's define a few settings": "",
"License": "ライセンス",
"Limited number of places": "",
"Limited number of places": "参加可能の人数制限あり",
"List title": "",
"Live": "",
"Load more": "",
"Load more": "もっと見る",
"Load more activities": "",
"Loading comments…": "コメントを読み込んでいます…",
"Local": "ローカル",
"Local time ({timezone})": "ローカルタイム({timezone})",
"Locality": "",
"Locality": "地方・エリア",
"Location": "場所",
"Log in": "ログイン",
"Log out": "ログアウト",
@ -519,7 +520,7 @@
"Login on {instance}": "{instance} にログイン",
"Login status": "ログイン状態",
"Main languages you/your moderators speak": "このインスタンスのモデレーターとあなたが話す言語",
"Manage participations": "",
"Manage participations": "参加者の管理",
"Manually approve new followers": "",
"Manually invite new members": "",
"Mark as resolved": "解決済みとしてマークする",
@ -540,7 +541,7 @@
"Mobilizon version": "Mobilizonのバージョン",
"Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "",
"Moderate new members": "新しいメンバーをモデレートする",
"Moderated comments (shown after approval)": "",
"Moderated comments (shown after approval)": "(管理人の承知した後に表示されている)承認済みの投稿",
"Moderation": "モデレーション",
"Moderation log": "モデレーションログ",
"Moderation logs": "モデレーションログ",
@ -551,6 +552,7 @@
"Move resource to {folder}": "",
"My account": "自分のアカウント",
"My events": "自分のイベント",
"My federated identity ends in {domain}": "連合のアカウントの最後の部分は{domain}",
"My groups": "自分のグループ",
"My identities": "自分のアイデンティティー",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "",
@ -569,7 +571,7 @@
"Next month": "来月",
"Next page": "次のページ",
"Next week": "来週",
"No address defined": "",
"No address defined": "住所なし",
"No closed reports yet": "",
"No comment": "コメントがありません。",
"No comments yet": "まだコメントがありません",
@ -594,7 +596,7 @@
"No message": "メッセージはありません",
"No moderation logs yet": "モデレーションログはまだありません",
"No more activity to display.": "",
"No one is participating|One person participating|{going} people participating": "",
"No one is participating|One person participating|{going} people participating": "参加者0人|参加者1人|参加者 {going} 人",
"No open reports yet": "",
"No organized events found": "主催しているイベントは見つかりませんでした",
"No organized events listed": "",
@ -627,25 +629,26 @@
"Notifications for manually approved participations to an event": "",
"Notify participants": "",
"Now, create your first profile:": "",
"Number of places": "",
"Number of places": "参加可能の人の数",
"OK": "OK",
"Old password": "古いパスワード",
"On {date}": "",
"On {date} ending at {endTime}": "",
"On {date} from {startTime} to {endTime}": "",
"On {date} starting at {startTime}": "",
"On {date}": "{date} に行う",
"On {date} ending at {endTime}": "{date} の {endTime} 時に終了",
"On {date} from {startTime} to {endTime}": "{date} の {startTime} 時から {endTime} 時まで",
"On {date} starting at {startTime}": "{date} の {startTime} 時から",
"On {instance} and other federated instances": "",
"Online": "オンライン",
"Online ticketing": "",
"Online upcoming events": "これからオンラインで行っているうイベント",
"Only accessible through link": "",
"Only accessible through link (private)": "",
"Only accessible through link (private)": "直接リンクのみで表示可能(非公開イベント)",
"Only accessible to members of the group": "",
"Only alphanumeric lowercased characters and underscores are supported.": "",
"Only group members can access discussions": "グループメンバーのみ議論に参加することができます",
"Only group moderators can create, edit and delete events.": "グループのモデレーターのみがイベントを作成、編集、削除できます。",
"Only group moderators can create, edit and delete posts.": "",
"Only registered users may fetch remote events from their URL.": "",
"Open": "",
"Open": "可能",
"Open a topic on our forum": "フォーラムでトピックを作成する",
"Open an issue on our bug tracker (advanced users)": "上級ユーザー向けバグトラッカー上でissueを開く",
"Opened reports": "",
@ -671,7 +674,7 @@
"Participants": "参加者",
"Participate": "参加する",
"Participate using your email address": "あなたのメールアドレスを使って参加する",
"Participation approval": "",
"Participation approval": "参加希望依頼の許可設定",
"Participation confirmation": "参加確認",
"Participation notifications": "",
"Participation requested!": "参加のリクエストをしました!",
@ -692,11 +695,11 @@
"Pick an instance": "インスタンスを選ぶ",
"Please add as many details as possible to help identify the problem.": "",
"Please check your spam folder if you didn't receive the email.": "",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "誤りがある場合、サーバーのMobilizonの管理人と連絡してください。",
"Please do not use it in any real way.": "本格的に利用することはご遠慮ください。",
"Please enter your password to confirm this action.": "このアクションの確認のため、パスワードを入力してください。",
"Please make sure the address is correct and that the page hasn't been moved.": "",
"Please read the {fullRules} published by {instance}'s administrators.": "{instance}の管理者によって作成された{fullRules}をお読み下さい。",
"Please make sure the address is correct and that the page hasn't been moved.": "リンクが正しいか、またはページが移動されていないかを確かめてください。",
"Please read the {fullRules} published by {instance}'s administrators.": "{instance}の管理者によって作成された {fullRules} をお読み下さい。",
"Post": "投稿",
"Post URL": "投稿URL",
"Post a comment": "コメントを投稿する",
@ -706,7 +709,7 @@
"Postal Code": "郵便番号",
"Posts": "投稿",
"Powered by Mobilizon": "",
"Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "",
"Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "{mobilizon}でサーバーが運用しています。© 2018 - {date} The Mobilizon Contributors - {contributors}の支援で作られています。",
"Preferences": "設定",
"Previous": "前",
"Previous month": "先月",
@ -724,11 +727,10 @@
"Promote": "",
"Public": "公開",
"Public RSS/Atom Feed": "公開RSS/Atomフィード",
"Public comment moderation": "",
"Public comment moderation": "公表の投稿の調整設定",
"Public event": "公開イベント",
"Public feeds": "公開フィード",
"Public iCal Feed": "公開iCalフィード",
"Public page": "公開ページ",
"Public preview": "公開プレビュー",
"Publication date": "",
"Publish": "投稿",
@ -751,16 +753,16 @@
"Register": "アカウント作成",
"Register an account on {instanceName}!": "",
"Register on this instance": "",
"Registration is allowed, anyone can register.": "アカウント登録は許可されており、どなたでも登録できます。",
"Registration is closed.": "アカウント登録は許可されていません。",
"Registration is currently closed.": "アカウント登録は、現在は許可されていません。",
"Registrations": "",
"Registrations are restricted by allowlisting.": "",
"Registration is allowed, anyone can register.": "制限なくアカウントの新規登録可能です。",
"Registration is closed.": "アカウントの新規登録が停止されています。",
"Registration is currently closed.": "アカウントの新規登録が停止中です。",
"Registrations": "アカウントの新規登録",
"Registrations are restricted by allowlisting.": "新規登録は管理者と事前連絡済みの方のみができます。",
"Reject": "拒否する",
"Reject member": "",
"Rejected": "拒否されました",
"Remember my participation in this browser": "",
"Remove": "削除",
"Remove": "削除/除外",
"Remove link": "リンクを削除する",
"Rename": "",
"Rename resource": "",
@ -790,7 +792,7 @@
"Reset password": "パスワードのリセット",
"Resolved": "",
"Resource provided is not an URL": "",
"Resources": "",
"Resources": "リンクの一覧表",
"Restricted": "",
"Return to the group page": "グループページに戻る",
"Right now": "",
@ -811,7 +813,7 @@
"Select languages": "言語を選ぶ",
"Select the activities for which you wish to receive an email or a push notification.": "",
"Send": "送信する",
"Send email": "メールを送る",
"Send email": "メールを送信する",
"Send feedback": "フィードバックを送信する",
"Send notification e-mails": "",
"Send password reset": "",
@ -827,19 +829,19 @@
"Short bio": "",
"Show map": "地図を表示",
"Show me where I am": "",
"Show remaining number of places": "",
"Show remaining number of places": "残りの参加できる人の数を表示する",
"Show the time when the event begins": "イベントの開始時刻を表示",
"Show the time when the event ends": "イベントの終了時刻を表示",
"Showing events before": "",
"Showing events starting on": "",
"Sign Language": "",
"Sign in with": "",
"Sign up": "アカウント作成",
"Sign up": "新規登録",
"Since you are a new member, private content can take a few minutes to appear.": "",
"Skip to main content": "",
"Social": "ソーシャル",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "",
"Starts on…": "",
"Starts on…": "開始は…",
"Status": "状態",
"Stop following instance": "インスタンスへのフォローを止める",
"Street": "通り",
@ -853,8 +855,8 @@
"Tag search": "タグ検索",
"Task lists": "タスクリスト",
"Technical details": "技術的詳細",
"Tentative": "",
"Tentative: Will be confirmed later": "",
"Tentative": "未定",
"Tentative: Will be confirmed later": "仮参加:確認待ち",
"Terms": "利用規約",
"Terms of service": "利用規約",
"Text": "文字",
@ -871,7 +873,7 @@
"The Zoom video teleconference URL": "Zoomでのテレビ会議用URL",
"The account's email address was changed. Check your emails to verify it.": "アカウントのメールアドレスが変更されました。メールをチェックして、メールアドレスの認証を行ってください。",
"The actual number of participants may differ, as this event is hosted on another instance.": "",
"The content came from another server. Transfer an anonymous copy of the report?": "",
"The content came from another server. Transfer an anonymous copy of the report?": "通報の内容は他のサーバーから送信されました。匿名で通報を送信しますか?",
"The draft event has been updated": "",
"The event has a sign language interpreter": "",
"The event has been created as a draft": "",
@ -883,9 +885,9 @@
"The event live video contains subtitles": "",
"The event live video does not contain subtitles": "",
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "",
"The event organizer didn't add any description.": "",
"The event organizer didn't add any description.": "イベントの主催者は記述を書いてない。",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "",
"The event title will be ellipsed.": "",
"The event title will be ellipsed.": "イベントのタイトルは省略されます。",
"The event will show as attributed to this group.": "",
"The event will show as attributed to this profile.": "",
"The event will show as attributed to your personal profile.": "",
@ -907,25 +909,25 @@
"The member was removed from the group {group}": "グループ{group}からメンバーが除外されました",
"The membership request from {profile} was rejected": "",
"The only way for your group to get new members is if an admininistrator invites them.": "",
"The organiser has chosen to close comments.": "",
"The page you're looking for doesn't exist.": "",
"The organiser has chosen to close comments.": "イベントの主催者がコメント不可に設定しています。",
"The page you're looking for doesn't exist.": "探しているページを見つかりません。",
"The password was successfully changed": "",
"The post {post} was created by {profile}.": "投稿{post}は{profile}によって作成されました。",
"The post {post} was deleted by {profile}.": "投稿{post}は{profile}によって削除されました。",
"The post {post} was updated by {profile}.": "投稿{post}は{profile}によって更新されました。",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "通報はあなたのサーバーの管理者に送信されます。通報の理由は下記で説明できます。",
"The selected picture is too heavy. You need to select a file smaller than {size}.": "",
"The technical details of the error can help developers solve the problem more easily. Please add them to your feedback.": "",
"The {default_privacy_policy} will be used. They will be translated in the user's language.": "",
"The {default_terms} will be used. They will be translated in the user's language.": "",
"There are {participants} participants.": "",
"There are {participants} participants.": "{participants} 人の参加者がいます。",
"There is no activity yet. Start doing some things to see activity appear here.": "",
"There will be no way to recover your data.": "",
"There's no discussions yet": "まだ議論はありません",
"These events may interest you": "",
"These events may interest you": "お勧めのイベント",
"These feeds contain event data for the events for which any of your profiles is a participant or creator. You should keep these private. You can find feeds for specific profiles on each profile edition page.": "",
"These feeds contain event data for the events for which this specific profile is a participant or creator. You should keep these private. You can find feeds for all of your profiles into your notification settings.": "",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "このサーバーとこのイベントの主催者が匿名参加可に設定していますが、検証メールで確認する必要があります。",
"This URL doesn't seem to be valid": "",
"This URL is not supported": "このURLはサポートされていません",
"This event has been cancelled.": "このイベントはキャンセルされました。",
@ -938,7 +940,7 @@
"This information is saved only on your computer. Click for details": "",
"This instance doesn't follow yours.": "このインスタンスはあなたをフォローしていません",
"This instance hasn't got push notifications enabled.": "このインスタンスではプッシュ通知が有効化されていません。",
"This instance isn't opened to registrations, but you can register on other instances.": "",
"This instance isn't opened to registrations, but you can register on other instances.": "このサーバーに新規登録できないのですが、ほかのサーバーに新規登録できます。",
"This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.": "",
"This is a demonstration site to test Mobilizon.": "",
"This is like your federated username (<code>{username}</code>) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "",
@ -953,8 +955,8 @@
"This week": "今週",
"This weekend": "今週末",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "",
"Time in your timezone ({timezone})": "",
"Times in your timezone ({timezone})": "",
"Time in your timezone ({timezone})": "あなたのタイムゾーン ({timezone})",
"Times in your timezone ({timezone})": "あなたのタイムゾーン ({timezone})",
"Timezone": "タイムゾーン",
"Timezone detected as {timezone}.": "",
"Title": "タイトル",
@ -964,8 +966,8 @@
"To create and manage multiples identities from a same account": "一つのアカウントで複数のプロフィールを作成と管理できる",
"To create and manage your events": "グループとイベントの作成と管理しやすい",
"To create or join an group and start organizing with other people": "新規グループ作成やあるグループに加入すると他人と計画を立つ",
"To follow groups and be informed of their latest events": "",
"To register for an event by choosing one of your identities": "",
"To follow groups and be informed of their latest events": "グループをフォローしてグループのイベントの通知もできる",
"To register for an event by choosing one of your identities": "作成したアイデンティティーでイベント参加できる",
"Today": "今日",
"Tomorrow": "明日",
"Tools": "ツール",
@ -994,7 +996,7 @@
"Unknown error.": "不明なエラーが発生しました。",
"Unknown value for the openness setting.": "",
"Unlogged participation": "",
"Unsaved changes": "",
"Unsaved changes": "まだ保存されていない編集があります",
"Unsubscribe to browser push notifications": "",
"Unsuspend": "",
"Upcoming": "",
@ -1020,6 +1022,7 @@
"View a reply": "",
"View account on {hostname} (in a new window)": "{hostname}でアカウントを見る (新しいウィンドウで開く)",
"View all": "全て見る",
"View all categories": "すべてのカテゴリーを表示する",
"View all events": "全てのイベントを見る",
"View all posts": "全ての投稿を見る",
"View event page": "イベントページを表示",
@ -1027,13 +1030,14 @@
"View full profile": "",
"View less": "",
"View more": "",
"View more online events": "オンラインのイベントをもっと見る",
"View page on {hostname} (in a new window)": "",
"View past events": "過去のイベントを見る",
"Visibility was set to an unknown value.": "公開範囲の設定に不明な値が設定されています。",
"Visibility was set to private.": "",
"Visibility was set to public.": "公開範囲がパブリックに設定されました。",
"Visible everywhere on the web": "",
"Visible everywhere on the web (public)": "",
"Visible everywhere on the web": "全インターネットから検索で見つけられることができる",
"Visible everywhere on the web (public)": "全インターネットから検索で見つけられることができる( 公開)",
"Waiting for organization team approval.": "",
"Warning": "警告",
"We couldn't save your participation inside this browser. Not to worry, you have successfully confirmed your participation, we just couldn't save it's status in this browser because of a technical issue.": "",
@ -1158,7 +1162,7 @@
"Your email has been changed": "あなたのEメールは変更されました",
"Your email is being changed": "",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "",
"Your federated identity": "",
"Your federated identity": "あなたの連合のアイデンティティーです",
"Your membership was approved by {profile}.": "",
"Your participation has been confirmed": "",
"Your participation has been rejected": "",
@ -1180,7 +1184,7 @@
"Zoom in": "拡大する",
"Zoom out": "縮小する",
"[This comment has been deleted by it's author]": "[このコメントは投稿者によって削除されました]",
"[This comment has been deleted]": "[このコメント削除されました]",
"[This comment has been deleted]": "[このコメント削除されました]",
"[deleted]": "[削除された]",
"a non-existent report": "",
"access to the group's private content as well": "",
@ -1200,7 +1204,7 @@
"full rules": "",
"group's upcoming public events": "",
"https://mensuel.framapad.org/p/some-secret-token": "",
"iCal Feed": "",
"iCal Feed": "iCalフェード",
"instance rules": "インスタンスルール",
"more than 1360 contributors": "1,360人以上のコントリビューター",
"profile@instance": "",
@ -1211,12 +1215,12 @@
"with another identity…": "",
"your notification settings": "あなたの通知設定",
"{'@'}{username}": "",
"{approved} / {total} seats": "",
"{approved} / {total} seats": "{approved} / {total} 人まで",
"{available}/{capacity} available places": "",
"{count} km": "",
"{count} members": "",
"{count} members or followers": "",
"{count} participants": "",
"{count} participants": "まだ参加者いない | 参加者1人 | 参加者 {count} 人",
"{count} requests waiting": "",
"{folder} - Resources": "",
"{group} activity timeline": "",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "Suffeɣ-d",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -713,7 +713,6 @@
"Public event": "Openbaar evenement",
"Public feeds": "Openbare feeds",
"Public iCal Feed": "Openbaar iCalfeed",
"Public page": "Publieke pagina",
"Public preview": "Openbare voorvertoning",
"Publication date": "Publicatiedatum",
"Publish": "Publiceren",

View file

@ -815,7 +815,6 @@
"Public event": "Offentleg hending",
"Public feeds": "Offentlege straumar",
"Public iCal Feed": "Offentleg iCal-straum",
"Public page": "Offentleg side",
"Public preview": "Offentleg førehandsvising",
"Publication date": "Lagt ut dato",
"Publish": "Legg ut",

View file

@ -707,7 +707,6 @@
"Public event": "Eveniment public",
"Public feeds": "Flux publics",
"Public iCal Feed": "Flux iCal public",
"Public page": "Pagina publica",
"Public preview": "Apercebut public",
"Publication date": "Data de publicacion",
"Publish": "Publicar",

View file

@ -707,7 +707,6 @@
"Public event": "Publiczne wydarzenie",
"Public feeds": "Publiczne strumienie",
"Public iCal Feed": "Publiczny strumień iCal",
"Public page": "Publiczna strona",
"Public preview": "",
"Publication date": "Data publikacji",
"Publish": "Publikuj",

View file

@ -707,7 +707,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -707,7 +707,6 @@
"Public event": "Evento público",
"Public feeds": "Feeds públicos",
"Public iCal Feed": "Feed iCal público",
"Public page": "Página pública",
"Public preview": "",
"Publication date": "Data da publicação",
"Publish": "Publicar",

View file

@ -707,7 +707,6 @@
"Public event": "Публичное мероприятие",
"Public feeds": "Публичные ленты",
"Public iCal Feed": "Публичная iCal-лента",
"Public page": "Публичная страница",
"Public preview": "Публичный предварительный просмотр",
"Publication date": "Дата публикации",
"Publish": "Опубликовать",

View file

@ -707,7 +707,6 @@
"Public event": "Javni dogodek",
"Public feeds": "Javni viri",
"Public iCal Feed": "Javni vir iCal",
"Public page": "Javna stran",
"Public preview": "",
"Publication date": "Datum objave",
"Publish": "Objavi",

View file

@ -708,7 +708,6 @@
"Public event": "Publikt evenemang",
"Public feeds": "Publika flöden",
"Public iCal Feed": "Publika iCal-flöde",
"Public page": "Publik sida",
"Public preview": "",
"Publication date": "",
"Publish": "Publicera",

View file

@ -815,7 +815,6 @@
"Public event": "公共活动",
"Public feeds": "公开推送",
"Public iCal Feed": "公开iCal推送",
"Public page": "公共页面",
"Public preview": "公开预览",
"Publication date": "发表日期",
"Publish": "发布",

View file

@ -735,7 +735,6 @@
"Public event": "",
"Public feeds": "",
"Public iCal Feed": "",
"Public page": "",
"Public preview": "",
"Publication date": "",
"Publish": "",

View file

@ -215,7 +215,7 @@ import { IPerson, displayName } from "@/types/actor";
import PictureUpload from "@/components/PictureUpload.vue";
import { MOBILIZON_INSTANCE_HOST } from "@/api/_entrypoint";
import RouteName from "@/router/name";
import { buildFileVariable } from "@/utils/image";
import { buildFileFromIMedia, buildFileVariable } from "@/utils/image";
import { changeIdentity } from "@/utils/identity";
import {
CREATE_FEED_TOKEN_ACTOR,
@ -237,6 +237,7 @@ import { Dialog } from "@/plugins/dialog";
import { Notifier } from "@/plugins/notifier";
import { AbsintheGraphQLErrors } from "@/types/errors.model";
import { ICurrentUser } from "@/types/current-user.model";
import { useHead } from "@vueuse/head";
const { t } = useI18n({ useScope: "global" });
const router = useRouter();
@ -245,7 +246,11 @@ const props = defineProps<{ isUpdate: boolean; identityName?: string }>();
const { currentActor } = useCurrentActorClient();
const { result: personResult, onError: onPersonError } = useQuery<{
const {
result: personResult,
onError: onPersonError,
onResult: onPersonResult,
} = useQuery<{
fetchPerson: IPerson;
}>(
FETCH_PERSON,
@ -257,6 +262,10 @@ const { result: personResult, onError: onPersonError } = useQuery<{
})
);
onPersonResult(async ({ data }) => {
avatarFile.value = await buildFileFromIMedia(data?.fetchPerson?.avatar);
});
onPersonError((err) => handleErrors(err as unknown as AbsintheGraphQLErrors));
const person = computed(() => personResult.value?.fetchPerson);
@ -285,24 +294,6 @@ watch(person, () => {
const avatarMaxSize = useAvatarMaxSize();
// error({ graphQLErrors }) {
// this.handleErrors(graphQLErrors);
// },
// metaInfo() {
// // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// // @ts-ignore
// const { isUpdate, identityName } = this;
// let title = t("Create a new profile") as string;
// if (isUpdate) {
// title = t("Edit profile {profile}", {
// profile: identityName,
// }) as string;
// }
// return {
// title,
// };
// },
const errors = ref<string[]>([]);
const avatarFile = ref<File | null>(null);
const showCopiedTooltip = reactive({ ics: false, atom: false });
@ -764,4 +755,16 @@ const breadcrumbsLinks = computed(
const updateUsername = (value: string) => {
identity.value.preferredUsername = convertToUsername(value);
};
useHead({
title: computed(() => {
let title = t("Create a new profile") as string;
if (isUpdate.value) {
title = t("Edit profile {profile}", {
profile: identityName.value,
}) as string;
}
return title;
}),
});
</script>

View file

@ -102,7 +102,7 @@ import RouteName from "@/router/name";
import EmptyContent from "@/components/Utils/EmptyContent.vue";
import { useQuery } from "@vue/apollo-composable";
import { useI18n } from "vue-i18n";
import { computed, ref } from "vue";
import { computed } from "vue";
import { useHead } from "@vueuse/head";
import {
useRouteQuery,

View file

@ -483,6 +483,7 @@
<span class="" v-if="event.draft === true">
<o-button
variant="primary"
class="!text-black hover:!text-white"
outlined
@click="createOrUpdateDraft"
:disabled="saving"

View file

@ -196,7 +196,7 @@ import RouteName from "@/router/name";
import { buildFileFromIMedia } from "@/utils/image";
import { useAvatarMaxSize, useBannerMaxSize } from "@/composition/config";
import { useI18n } from "vue-i18n";
import { computed, ref, watch, defineAsyncComponent, inject } from "vue";
import { computed, ref, defineAsyncComponent, inject } from "vue";
import { useGroup, useUpdateGroup } from "@/composition/apollo/group";
import {
useCurrentActorClient,
@ -262,38 +262,17 @@ const copyURL = async (): Promise<void> => {
}, 2000);
};
onGroupResult(({ data }) => {
onGroupResult(async ({ data }) => {
if (!data) return;
editableGroup.value = data.group;
});
watch(
group,
async (newGroup: IGroup | undefined, oldGroup: IGroup | undefined) => {
console.debug("watching group");
if (!newGroup) return;
try {
if (
oldGroup?.avatar !== undefined &&
oldGroup?.avatar !== newGroup?.avatar
) {
avatarFile.value = await buildFileFromIMedia(newGroup?.avatar);
}
if (
oldGroup?.banner !== undefined &&
oldGroup?.banner !== newGroup?.banner
) {
bannerFile.value = await buildFileFromIMedia(newGroup?.banner);
}
avatarFile.value = await buildFileFromIMedia(editableGroup.value?.avatar);
bannerFile.value = await buildFileFromIMedia(editableGroup.value?.banner);
} catch (e) {
// Catch errors while building media
console.error(e);
}
editableGroup.value = { ...newGroup };
},
{
immediate: true,
}
);
});
const buildVariables = computed(() => {
let avatarObj = {};

View file

@ -57,7 +57,12 @@
<o-button native-type="submit">{{ t("Continue") }}</o-button>
</div>
</form>
<AuthorizeApplication v-if="application" :auth-application="application" />
<AuthorizeApplication
v-if="application"
:auth-application="application"
:user-code="code"
:scope="scope"
/>
</div>
</template>
@ -85,11 +90,14 @@ const {
const inputs = reactive<string[]>([]);
const application = ref<IApplication | null>(null);
const scope = ref<string | null>(null);
onDeviceActivationDone(({ data }) => {
console.debug("onDeviceActivationDone", data);
const foundApplication = data?.deviceActivation?.application;
if (foundApplication) {
application.value = foundApplication;
scope.value = data?.deviceActivation?.scope;
}
});
@ -114,7 +122,11 @@ const error = ref<string | null>(null);
onDeviceActivationError(
({ graphQLErrors }: { graphQLErrors: AbsintheGraphQLErrors }) => {
if (graphQLErrors[0].status_code === 404) {
const err = graphQLErrors[0];
if (
err.status_code === 400 &&
err.code === "device_application_code_expired"
) {
error.value = t("The device code is incorrect or no longer valid.");
}
resetInputs();

View file

@ -78,13 +78,16 @@
})
}}
</span>
<span v-if="post.visibility === PostVisibility.UNLISTED" class="">
<o-icon icon="link" size="small" />
<span
v-if="post.visibility === PostVisibility.UNLISTED"
class="flex gap-2 items-center"
>
<Link :size="16" />
{{ t("Accessible only by link") }}
</span>
<span
v-else-if="post.visibility === PostVisibility.PRIVATE"
class=""
class="flex gap-2 items-center"
>
<Lock :size="16" />
{{
@ -275,6 +278,7 @@ import Pencil from "vue-material-design-icons/Pencil.vue";
import Delete from "vue-material-design-icons/Delete.vue";
import Share from "vue-material-design-icons/Share.vue";
import Flag from "vue-material-design-icons/Flag.vue";
import Link from "vue-material-design-icons/Link.vue";
import { Dialog } from "@/plugins/dialog";
import { useI18n } from "vue-i18n";
import { Notifier } from "@/plugins/notifier";

View file

@ -4,7 +4,7 @@ import { createRouter, createWebHistory, Router } from "vue-router";
import { routes } from "@/router";
import { CommentModeration, EventJoinOptions } from "@/types/enums";
import { InMemoryCache } from "@apollo/client/cache";
import { beforeEach, describe, expect, vi, it } from "vitest";
import { beforeEach, describe, expect, it } from "vitest";
import Oruga from "@oruga-ui/oruga-next";
import FloatingVue from "floating-vue";
@ -34,12 +34,7 @@ const eventData = {
describe("ParticipationSection", () => {
let wrapper: VueWrapper;
const generateWrapper = (
customProps: Record<string, unknown> = {},
baseData: Record<string, unknown> = {}
) => {
const cache = new InMemoryCache({ addTypename: false });
const generateWrapper = (customProps: Record<string, unknown> = {}) => {
wrapper = mount(ParticipationSection, {
stubs: {
ParticipationButton: true,

View file

@ -1,6 +1,6 @@
import { config, mount } from "@vue/test-utils";
import { mount } from "@vue/test-utils";
import PostListItem from "@/components/Post/PostListItem.vue";
import { vi, beforeEach, describe, it, expect } from "vitest";
import { beforeEach, describe, it, expect } from "vitest";
import { enUS } from "date-fns/locale";
import { routes } from "@/router";
import { createRouter, createWebHistory, Router } from "vue-router";

View file

@ -1,9 +1,7 @@
import { config, mount } from "@vue/test-utils";
import { mount } from "@vue/test-utils";
import ReportCard from "@/components/Report/ReportCard.vue";
import { ActorType } from "@/types/enums";
import { describe, expect, it } from "vitest";
import { createI18n } from "vue-i18n";
import en from "@/i18n/en_US.json";
const reportData = {
id: "1",

View file

@ -1,5 +1,7 @@
const useRouterMock = vi.fn(() => ({
push: () => {},
push: function () {
// do nothing
},
}));
import { config, mount } from "@vue/test-utils";

View file

@ -1,8 +1,14 @@
const useRouterMock = vi.fn(() => ({
push: () => {},
replace: () => {},
push: function () {
// do nothing
},
replace: function () {
// do nothing
},
}));
const useRouteMock = vi.fn(() => {});
const useRouteMock = vi.fn(function () {
// do nothing
});
import { config, mount, VueWrapper } from "@vue/test-utils";
import Login from "@/views/User/LoginView.vue";

View file

@ -1,5 +1,7 @@
const useRouterMock = vi.fn(() => ({
push: () => {},
push: function () {
// do nothing
},
}));
import { shallowMount, VueWrapper } from "@vue/test-utils";
@ -21,7 +23,6 @@ vi.mock("vue-router/dist/vue-router.mjs", () => ({
describe("App component", () => {
let wrapper: VueWrapper;
let mockClient: MockApolloClient | null;
let requestHandlers: Record<string, RequestHandler>;
const createComponent = (handlers = {}) => {
const cache = new InMemoryCache({ addTypename: false });
@ -31,8 +32,6 @@ describe("App component", () => {
resolvers: buildCurrentUserResolver(cache),
});
requestHandlers = { ...handlers };
wrapper = shallowMount(NavBar, {
// stubs: ["router-link", "router-view", "o-dropdown", "o-dropdown-item"],
global: {

File diff suppressed because it is too large Load diff

View file

@ -5,6 +5,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Application do
alias Mobilizon.Applications, as: ApplicationManager
alias Mobilizon.Applications.{Application, ApplicationDeviceActivation, ApplicationToken}
alias Mobilizon.GraphQL.Error
alias Mobilizon.Service.Auth.Applications
alias Mobilizon.Users.User
import Mobilizon.Web.Gettext, only: [dgettext: 2]
@ -17,7 +18,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Application do
@spec authorize(any(), map(), Absinthe.Resolution.t()) :: {:ok, map()} | {:error, String.t()}
def authorize(
_parent,
%{client_id: client_id, redirect_uri: redirect_uri, scope: scope, state: state},
%{client_id: client_id, redirect_uri: redirect_uri, scope: scope} = args,
%{context: %{current_user: %User{id: user_id}}}
) do
case Applications.autorize(client_id, redirect_uri, scope, user_id) do
@ -27,7 +28,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Application do
scope: scope,
authorization_code: code
}} ->
{:ok, %{code: code, state: state, client_id: client_id, scope: scope}}
{:ok, %{code: code, state: Map.get(args, :state), client_id: client_id, scope: scope}}
{:error, %Ecto.Changeset{} = err} ->
{:error, err}
@ -106,7 +107,12 @@ defmodule Mobilizon.GraphQL.Resolvers.Application do
{:ok, app_device_activation |> Map.from_struct() |> Map.take([:application, :id, :scope])}
{:error, :expired} ->
{:error, dgettext("errors", "The given user code has expired")}
{:error,
%Error{
message: dgettext("errors", "The given user code has expired"),
status_code: 400,
code: :device_application_code_expired
}}
{:error, :not_found} ->
{:error, dgettext("errors", "The given user code is invalid")}
@ -143,7 +149,12 @@ defmodule Mobilizon.GraphQL.Resolvers.Application do
)}
{:error, :expired} ->
{:error, dgettext("errors", "The given user code has expired")}
{:error,
%Error{
message: dgettext("errors", "The given user code has expired"),
status_code: 400,
code: :device_application_code_expired
}}
end
end

View file

@ -80,6 +80,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
}
} = _resolution
) do
Logger.debug("Getting resource for group with username #{username}")
with {:group, %Actor{id: group_id}} <- {:group, Actors.get_actor_by_name(username, :Group)},
{:member, true} <- {:member, Actors.is_member?(actor_id, group_id)},
{:resource, %Resource{} = resource} <-
@ -222,13 +224,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
{:ok, data} when is_map(data) ->
{:ok, struct(Metadata, data)}
{:error, :invalid_parsed_data} ->
{:error, _error_type, _} ->
{:error, dgettext("errors", "Unable to fetch resource details from this URL.")}
{:error, err} ->
Logger.warn("Error while fetching preview from #{inspect(resource_url)}")
Logger.debug(inspect(err))
{:error, :unknown_resource}
end
end

View file

@ -111,7 +111,7 @@ defmodule Mobilizon.GraphQL.Schema.AuthApplicationType do
resolve(&Application.activate_device/3)
end
@desc "Activate an user device"
@desc "Authorize an user device"
field :authorize_device_application, :auth_application do
arg(:client_id, non_null(:string), description: "The application's client_id")

View file

@ -29,19 +29,19 @@ defmodule Mobilizon.Service.RichMedia.Parser do
def parse(nil), do: {:error, "No URL provided"}
@spec parse(String.t()) :: {:ok, map()} | {:error, any()}
@spec parse(String.t()) :: {:ok, map()} | {:error, :http | :parsing | :unknown, any()}
def parse(url) do
case Cachex.fetch(:rich_media_cache, url, fn _ ->
case parse_url(url) do
{:ok, data} -> {:commit, data}
{:error, err} -> {:ignore, err}
{:error, error_type, error} -> {:ignore, {error_type, error}}
end
end) do
{status, value} when status in [:ok, :commit] ->
{:ok, value}
{_, err} ->
{:error, err}
{_, {error_type, err}} ->
{:error, error_type, err}
end
rescue
e ->
@ -56,7 +56,8 @@ defmodule Mobilizon.Service.RichMedia.Parser do
get_filename_from_headers(response_headers) || get_filename_from_url(url)
end
@spec parse_url(String.t(), Enum.t()) :: {:ok, map()} | {:error, any()}
@spec parse_url(String.t(), Enum.t()) ::
{:ok, map()} | {:error, :http | :parsing | :unknown, any()}
defp parse_url(url, options \\ []) do
user_agent = Keyword.get(options, :user_agent, default_user_agent(url))
headers = [{"User-Agent", user_agent}]
@ -64,13 +65,14 @@ defmodule Mobilizon.Service.RichMedia.Parser do
try do
with {:ok, _} <- prevent_local_address(url),
{:ok, %{body: body, status: code, headers: response_headers}}
{:fetch, {:ok, %{body: body, status: code, headers: response_headers}}}
when code in 200..299 <-
{:fetch,
RichMediaPreviewClient.get(
url,
headers: headers,
opts: @options
),
)},
{:is_html, _response_headers, true} <-
{:is_html, response_headers, is_html(response_headers)} do
body
@ -87,17 +89,17 @@ defmodule Mobilizon.Service.RichMedia.Parser do
{:ok, data}
{:ok, err} ->
{:fetch, {_, err}} ->
Logger.debug("HTTP error: #{inspect(err)}")
{:error, "HTTP error: #{inspect(err)}"}
{:error, :http, err}
{:error, err} ->
Logger.debug("HTTP error: #{inspect(err)}")
{:error, "HTTP error: #{inspect(err)}"}
Logger.debug("Parsing error: #{inspect(err)}")
{:error, :parsing, err}
end
rescue
e ->
{:error, "Parsing error: #{inspect(e)} #{inspect(__STACKTRACE__)}"}
{:error, :unknown, "Parsing error: #{inspect(e)} #{inspect(__STACKTRACE__)}"}
end
end
@ -228,7 +230,7 @@ defmodule Mobilizon.Service.RichMedia.Parser do
check_parsed_data(data, html, false)
else
Logger.debug("Found metadata was invalid or incomplete: #{inspect(data)}")
{:error, :invalid_parsed_data}
{:error, :parsing, :invalid_parsed_data}
end
end
@ -252,11 +254,11 @@ defmodule Mobilizon.Service.RichMedia.Parser do
validate_ip(host) do
{:ok, url}
else
{:error, "Host violates local access rules"}
{:error, :local_address, "Host violates local access rules"}
end
_ ->
{:error, "Could not detect any host"}
{:error, :no_host, "Could not detect any host"}
end
end
@ -302,6 +304,8 @@ defmodule Mobilizon.Service.RichMedia.Parser do
{:ok, data}
end
defp check_remote_picture_path({:error, _, _} = err), do: err
defp check_remote_picture_path(data), do: {:ok, data}
@spec format_url(String.t(), String.t()) :: String.t()

View file

@ -67,8 +67,8 @@ defmodule Mobilizon.Service.RichMedia.Parsers.OEmbed do
{:ok, data} <- Jason.decode(json),
data <-
data
|> Map.new(fn {k, v} -> {String.to_existing_atom(k), String.trim(v)} end)
|> Map.take(@oembed_allowed_attributes) do
|> Map.new(fn {k, v} -> {k, if(is_binary(v), do: String.trim(v), else: v)} end)
|> Map.take(Enum.map(@oembed_allowed_attributes, &to_string/1)) do
{:ok, data}
end
end

View file

@ -13,7 +13,7 @@ defmodule Mobilizon.Web.ApplicationController do
@spec create_application(Plug.Conn.t(), map()) :: Plug.Conn.t()
def create_application(
conn,
%{"name" => name, "redirect_uris" => redirect_uris, "scope" => scope} = args
%{"name" => name, "redirect_uri" => redirect_uris, "scope" => scope} = args
) do
ip = conn.remote_ip |> :inet.ntoa() |> to_string()
@ -33,7 +33,9 @@ defmodule Mobilizon.Web.ApplicationController do
conn
|> Plug.Conn.put_resp_header("cache-control", "no-store")
|> json(
Map.take(app, [:name, :website, :redirect_uris, :client_id, :client_secret, :scope])
app
|> Map.take([:name, :website, :client_id, :client_secret, :scope])
|> Map.put(:redirect_uri, app.redirect_uris)
)
{:error, :invalid_scope} ->

View file

@ -1,7 +1,7 @@
defmodule Mobilizon.Mixfile do
use Mix.Project
@version "3.1.0-beta.2"
@version "3.1.0-rc.2"
def project do
[
@ -133,7 +133,7 @@ defmodule Mobilizon.Mixfile do
{:phoenix_ecto, "~> 4.0"},
{:postgrex, ">= 0.17.1"},
{:phoenix_html, "~> 3.0"},
{:phoenix_live_view, "~> 0.18.3"},
{:phoenix_live_view, "~> 0.19.0"},
{:phoenix_view, "~> 2.0"},
{:gettext, "~> 0.20.0"},
{:cowboy, "~> 2.6"},

View file

@ -8,7 +8,7 @@
"cachex": {:hex, :cachex, "3.6.0", "14a1bfbeee060dd9bec25a5b6f4e4691e3670ebda28c8ba2884b12fe30b36bf8", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "ebf24e373883bc8e0c8d894a63bbe102ae13d918f790121f5cfe6e485cc8e2e2"},
"castore": {:hex, :castore, "1.0.2", "0c6292ecf3e3f20b7c88408f00096337c4bfd99bd46cc2fe63413ddbe45b3573", [:mix], [], "hexpm", "40b2dd2836199203df8500e4a270f10fc006cc95adc8a319e148dc3077391d96"},
"certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"},
"cldr_utils": {:hex, :cldr_utils, "2.23.1", "5c7df90f10b2ffe2519124f3c0cba1bfc0a303d91c34c2e130e86c4f7bf1840c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "42242882f76499fc28e59c80da8b832904cbe68ea50eeb42e65350b0dae7640c"},
"cldr_utils": {:hex, :cldr_utils, "2.24.0", "5b356769f2baf9dd25b166e9f1b2a5ce955d5b556bc07f56c959cfff1ec9543e", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "3fde251e0bbbe473230561019dd6c2958d82a10c134bb5b8b4e21a694196cf85"},
"codepagex": {:hex, :codepagex, "0.1.6", "49110d09a25ee336a983281a48ef883da4c6190481e0b063afe2db481af6117e", [:mix], [], "hexpm", "1521461097dde281edf084062f525a4edc6a5e49f4fd1f5ec41c9c4955d5bd59"},
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
@ -36,7 +36,7 @@
"elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"},
"elixir_make": {:hex, :elixir_make, "0.7.6", "67716309dc5d43e16b5abbd00c01b8df6a0c2ab54a8f595468035a50189f9169", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5a0569756b0f7873a77687800c164cca6dfc03a09418e6fcf853d78991f49940"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"erlport": {:git, "https://github.com/tcitworld/erlport.git", "04bcfd732fa458735001328b44e8b3a1764316a5", [branch: "0.10.1-compat"]},
"erlport": {:git, "https://github.com/tcitworld/erlport.git", "1f8f4b1a50ecdf7e959090fb566ac45c63c39b0b", [branch: "0.10.1-compat"]},
"eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"},
"ex_cldr": {:hex, :ex_cldr, "2.37.1", "6091fa719a7a96f9abee7aba186e63a906d504d08039cc8f0c683a0e71ee1bd7", [:mix], [{:cldr_utils, "~> 2.21", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}], "hexpm", "5d60c3288454bc966e404ea4f59531f7dbb570d7e927dce62f0ab8466713bf78"},
"ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.22.0", "016373c6725682851d752b72585581154926b2c8a20ee43e418479911dae0ff9", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_lists, "~> 2.10", [hex: :ex_cldr_lists, repo: "hexpm", optional: true]}, {:ex_cldr_numbers, "~> 2.31", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.16", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "c1c86de086009dce5786eb10fed0d351e52a844307c2ff0e83531f91d3268e8b"},
@ -110,8 +110,8 @@
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.1", "fe7a02387a7d26002a46b97e9879591efee7ebffe5f5e114fd196632e6e4a08d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ddccf8b4966180afe7630b105edb3402b1ca485e7468109540d262e842048ba4"},
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.18.18", "1f38fbd7c363723f19aad1a04b5490ff3a178e37daaf6999594d5f34796c47fc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a5810d0472f3189ede6d2a95bda7f31c6113156b91784a3426cb0ab6a6d85214"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.19.0", "de5643d03e3cdf5ff19cd45b5d14543a3b1ad8551d529f6b24246e88a6c6f1b8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a650b6f814c4f386314b98f1aebf92f8652649166612f84ef2e60a20894addfa"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.2", "a4950b63ace57720b0fc1c6da083c53346b36f99021de89595cc4f026288ff51", [:mix], [], "hexpm", "45741676a94c71f9afdfed9d22d49b6856c026ff504db04e3dc03a1d86f8201c"},
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"},
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
@ -134,7 +134,7 @@
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
"struct_access": {:hex, :struct_access, "1.1.2", "a42e6ceedd9b9ea090ee94a6da089d56e16f374dbbc010c3eebdf8be17df286f", [:mix], [], "hexpm", "e4c411dcc0226081b95709909551fc92b8feb1a3476108348ea7e3f6c12e586a"},
"sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"},
"swoosh": {:hex, :swoosh, "1.10.2", "77acdc1261de404b893e24224d47459d1b42deb02577c7b31514e0a720f949d6", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1736faf374ed49c6091845cdfd5b3a68c88c5f2bfd989447d12bffafc0dda03a"},
"swoosh": {:hex, :swoosh, "1.11.0", "00b4fff8c08347a47cc5cbe67d64df5aae0607a7a51171944f5b89216e2d62f5", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5e7c49b6259e50a5ed756517e23a7f916c0b73eb0752e864b1d83b28e2c204d9"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
"tesla": {:hex, :tesla, "1.7.0", "a62dda2f80d4f8a925eb7b8c5b78c461e0eb996672719fe1a63b26321a5f8b4e", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "2e64f01ebfdb026209b47bc651a0e65203fcff4ae79c11efb73c4852b00dc313"},
"timex": {:hex, :timex, "3.7.11", "bb95cb4eb1d06e27346325de506bcc6c30f9c6dea40d1ebe390b262fad1862d1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa"},
@ -144,7 +144,7 @@
"ueberauth_cas": {:hex, :ueberauth_cas, "2.3.1", "df45a1f2c5df8bc80191cbca4baeeed808d697702ec5ebe5bd5d5a264481752f", [:mix], [{:httpoison, "~> 1.8", [hex: :httpoison, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "5068ae2b9e217c2f05aa9a67483a6531e21ba0be9a6f6c8749bb7fd1599be321"},
"ueberauth_discord": {:hex, :ueberauth_discord, "0.7.0", "463f6dfe1ed10a76739331ce8e1dd3600ab611f10524dd828eb3aa50e76e9d43", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "d6f98ef91abb4ddceada4b7acba470e0e68c4d2de9735ff2f24172a8e19896b4"},
"ueberauth_facebook": {:hex, :ueberauth_facebook, "0.10.0", "0d607fbd1b7c6e0449981571027d869c2d156b8ad20c42e3672346678c05ccf1", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "bf8ce5d66b1c50da8abff77e8086c1b710bdde63f4acaef19a651ba43a9537a8"},
"ueberauth_github": {:hex, :ueberauth_github, "0.8.2", "6e12332172ebfadb6fbe2feaeddbd8c421f8ebf9d425d1367c2dce2a35f6bf21", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "98ed414ee313bd754135ab9689e8f16863c5691d11c8526800457cce6153d4e2"},
"ueberauth_github": {:hex, :ueberauth_github, "0.8.3", "1c478629b4c1dae446c68834b69194ad5cead3b6c67c913db6fdf64f37f0328f", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "ae0ab2879c32cfa51d7287a48219b262bfdab0b7ec6629f24160564247493cc6"},
"ueberauth_gitlab_strategy": {:hex, :ueberauth_gitlab_strategy, "0.4.0", "96605d304ebb87ce508eccbeb1f94da9ea1c9da20d8913771b6cf24a6cc6c633", [:mix], [{:oauth2, "~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "e86e2e794bb063c07c05a6b1301b73f2be3ba9308d8f47ecc4d510ef9226091e"},
"ueberauth_google": {:hex, :ueberauth_google, "0.10.2", "b85b3de6070e7bc71bbec3d4dbe2de805b004ae9c19efeb31531f9134ede4033", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.10.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "fcf987749db5e2d890240ce61223c61ee6ac1d638c3378bf1eeeb0e6332e5a12"},
"ueberauth_keycloak_strategy": {:hex, :ueberauth_keycloak_strategy, "0.4.0", "51e975874564ef4a6eb0044b9f0c6a08be4ba6086e62e41d385e7dd52fe9568b", [:mix], [{:oauth2, "~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "c03027937bddcbd9ff499e457f9bb05f79018fa321abf79ebcfed2af0007211b"},

View file

@ -504,7 +504,7 @@ msgstr "Profile non trouvé"
#: lib/graphql/resolvers/report.ex:48
#, elixir-autogen, elixir-format
msgid "Report not found"
msgstr "Groupe non trouvé"
msgstr "Signalement non trouvé"
#: lib/graphql/resolvers/resource.ex:172
#: lib/graphql/resolvers/resource.ex:199

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-25 07:56+0000\n"
"PO-Revision-Date: 2023-04-11 18:20+0000\n"
"PO-Revision-Date: 2023-05-27 13:05+0000\n"
"Last-Translator: Milo Ivir <mail@milotype.de>\n"
"Language-Team: Croatian <https://weblate.framasoft.org/projects/mobilizon/"
"backend/hr/>\n"
@ -13,7 +13,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.16.4\n"
"X-Generator: Weblate 4.17\n"
#: lib/web/templates/email/password_reset.html.heex:66
#, elixir-autogen, elixir-format
@ -644,7 +644,7 @@ msgstr ""
#, elixir-autogen, elixir-format
msgctxt "terms"
msgid "Questions or comments about the Service may be directed to us at %{contact}"
msgstr ""
msgstr "Pitanja ili komentare o usluzi možeš uputiti na %{contact}"
#: lib/web/templates/api/terms.html.heex:245
#, elixir-autogen, elixir-format
@ -944,7 +944,7 @@ msgstr "Upravljaj zahtjevima na čekanju"
#: lib/web/templates/email/registration_confirmation.text.eex:1
#, elixir-autogen, elixir-format
msgid "Nearly there!"
msgstr ""
msgstr "Skoro gotovo!"
#: lib/web/templates/email/email_changed_old.html.heex:18
#: lib/web/templates/email/email_changed_old.text.eex:1
@ -1145,7 +1145,7 @@ msgstr ""
#: lib/web/email/group.ex:107
#, elixir-autogen, elixir-format
msgid "The group %{group} has been suspended on %{instance}"
msgstr ""
msgstr "Grupa %{group} je suspendirana na instanci %{instance}"
#: lib/web/templates/api/terms.html.heex:64
#, elixir-autogen, elixir-format
@ -1286,27 +1286,27 @@ msgstr "Tvoje sudjelovanje događaju %{title} je potvrđeno"
#: lib/web/templates/email/report.html.heex:54
#, elixir-autogen, elixir-format
msgid "<b>%{reporter}</b> reported the following content."
msgstr ""
msgstr "<b>%{reporter}</b> je prijavio/la sljedeći sadržaj."
#: lib/web/templates/email/report.text.eex:5
#, elixir-autogen, elixir-format
msgid "Group %{group} was reported"
msgstr ""
msgstr "Grupa %{group} je prijavljena"
#: lib/web/templates/email/report.html.heex:71
#, elixir-autogen, elixir-format
msgid "Group reported"
msgstr ""
msgstr "Prijavljena grupa"
#: lib/web/templates/email/report.text.eex:7
#, elixir-autogen, elixir-format
msgid "Profile %{profile} was reported"
msgstr ""
msgstr "Profil %{profile} je prijavljen"
#: lib/web/templates/email/report.html.heex:81
#, elixir-autogen, elixir-format
msgid "Profile reported"
msgstr ""
msgstr "Prijavljen profil"
#: lib/web/templates/email/event_participation_confirmed.html.heex:61
#, elixir-autogen, elixir-format
@ -1318,12 +1318,12 @@ msgstr ""
#: lib/mobilizon/posts/post.ex:99
#, elixir-autogen, elixir-format
msgid "A text is required for the post"
msgstr ""
msgstr "Za objavu je potreban tekst"
#: lib/mobilizon/posts/post.ex:98
#, elixir-autogen, elixir-format
msgid "A title is required for the post"
msgstr ""
msgstr "Za objavu je potreban naslov"
#: lib/web/email/follow.ex:61
#, elixir-autogen, elixir-format
@ -1385,7 +1385,7 @@ msgstr "Ova stranica nije ispravna"
#: lib/web/templates/error/500_page.html.heex:50
#, elixir-autogen, elixir-format
msgid "We're sorry, but something went wrong on our end."
msgstr ""
msgstr "Žao nam je, ali se kod nas dogodila greška."
#: lib/web/templates/email/email.html.heex:109
#: lib/web/templates/email/email.text.eex:4
@ -1420,11 +1420,15 @@ msgstr "Feed za %{email} na %{instance}"
#, elixir-autogen, elixir-format
msgid "If the issue persists, you may contact the server administrator at %{contact}."
msgstr ""
"Ako se problem nastavi pojavljivati, možeš se obratiti administratoru "
"poslužitelja na %{contact}."
#: lib/web/templates/error/500_page.html.heex:59
#, elixir-autogen, elixir-format
msgid "If the issue persists, you may try to contact the server administrator."
msgstr ""
"Ako se problem nastavi pojavljivati, možeš se pokušati obratiti "
"administratoru poslužitelja."
#: lib/web/templates/error/500_page.html.heex:82
#, elixir-autogen, elixir-format
@ -1434,12 +1438,12 @@ msgstr "Tehnički detalji"
#: lib/web/templates/error/500_page.html.heex:52
#, elixir-autogen, elixir-format
msgid "The Mobilizon server %{instance} seems to be temporarily down."
msgstr ""
msgstr "Čini se da Mobilizon poslužitej %{instance} privremeno nije dostupan."
#: lib/service/export/feed.ex:72
#, elixir-autogen, elixir-format
msgid "Public feed for %{instance}"
msgstr ""
msgstr "Javni feed za %{instance}"
#: lib/graphql/resolvers/user.ex:350
#, elixir-autogen, elixir-format
@ -1469,6 +1473,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Your instance's moderation team has decided to suspend <b>%{group_name}</b> (%{group_address}). You are no longer a member of this group."
msgstr ""
"Tim za moderiranje tvoje instance je odlučio suspendirati grupu "
"<b>%{group_name}</b> (%{group_address}). Više nisi član ove grupe."
#: lib/web/templates/email/actor_suspension_participants.html.heex:18
#: lib/web/templates/email/actor_suspension_participants.text.eex:1
@ -1734,6 +1740,8 @@ msgstr "Tvoj zahtjev za članstvo u grupi %{group} je odbijen."
#, elixir-autogen, elixir-format
msgid "Your membership request for group %{link_start}<b>%{group}</b>%{link_end} has been rejected."
msgstr ""
"Tvoj zahtjev za članstvo u grupi %{link_start}<b>%{group}</b>%{link_end} je "
"odbijen."
#: lib/web/templates/email/group_membership_approval.text.eex:3
#, elixir-autogen, elixir-format
@ -1744,6 +1752,8 @@ msgstr "Tvoj zahtjev za članstvo u grupi %{group} je odobren."
#, elixir-autogen, elixir-format
msgid "Your membership request for group %{link_start}<b>%{group}</b>%{link_end} has been approved."
msgstr ""
"Tvoj zahtjev za članstvo u grupi %{link_start}<b>%{group}</b>%{link_end} je "
"odobren."
#: lib/web/templates/email/pending_participation_notification.html.heex:47
#: lib/web/templates/email/pending_participation_notification.text.eex:4
@ -1758,12 +1768,12 @@ msgstr[2] ""
#: lib/web/templates/email/admin_user_role_changed.text.eex:1
#, elixir-autogen, elixir-format
msgid "An administrator changed your role"
msgstr ""
msgstr "Jedan administrator je promijenio tvoju ulogu"
#: lib/web/email/admin.ex:122
#, elixir-autogen, elixir-format
msgid "An administrator confirmed your account on %{instance}"
msgstr ""
msgstr "Jedan administrator je potvrdio tvoj račun na instanci %{instance}"
#: lib/web/templates/email/admin_user_email_changed_new.html.heex:18
#: lib/web/templates/email/admin_user_email_changed_new.text.eex:1
@ -1772,23 +1782,26 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "An administrator manually changed the email attached to your account"
msgstr ""
"Jedan administrator je ručno promijenio priloženu e-mail adresu za tvoj račun"
#: lib/web/email/admin.ex:43
#: lib/web/email/admin.ex:70
#, elixir-autogen, elixir-format
msgid "An administrator manually changed the email attached to your account on %{instance}"
msgstr ""
"Jedan administrator je ručno promijenio priloženu e-mail adresu za tvoj "
"račun na instanci %{instance}"
#: lib/web/templates/email/admin_user_confirmation.html.heex:18
#: lib/web/templates/email/admin_user_confirmation.text.eex:1
#, elixir-autogen, elixir-format
msgid "An administrator manually confirmed your account"
msgstr ""
msgstr "Jedan administrator je ručno potvrdio tvoj račun"
#: lib/web/email/admin.ex:98
#, elixir-autogen, elixir-format
msgid "An administrator updated your role on %{instance}"
msgstr ""
msgstr "Jedan administrator je aktualizirao tvoju ulogu na instanci %{instance}"
#: lib/web/templates/email/email_changed_new.text.eex:3
#, elixir-autogen, elixir-format
@ -2105,4 +2118,4 @@ msgstr ""
#: lib/web/templates/email/group_member_removal.text.eex:1
#, elixir-autogen, elixir-format
msgid "Until next time!"
msgstr ""
msgstr "Vidimo se!"

View file

@ -24,7 +24,7 @@ defmodule Mobilizon.Web.ApplicationControllerTest do
conn
|> post("/apps", %{
"name" => "hello",
"redirect_uris" => "hello",
"redirect_uri" => "hello",
"scope" => "write nothing"
})
@ -46,14 +46,14 @@ defmodule Mobilizon.Web.ApplicationControllerTest do
conn
|> post("/apps", %{
"name" => name,
"redirect_uris" => Enum.join(redirect_uris, "\n"),
"redirect_uri" => Enum.join(redirect_uris, "\n"),
"scope" => scope,
"website" => website
})
assert %{
"name" => ^name,
"redirect_uris" => ^redirect_uris,
"redirect_uri" => ^redirect_uris,
"scope" => ^scope,
"website" => ^website,
"client_id" => _client_id,