Merge branch 'master' of framagit.org:/les/gancio into feat/geolocation_allow_to_change_providers_merge

This commit is contained in:
sedum 2022-12-06 00:07:57 +01:00
commit 96694d3d58
22 changed files with 173 additions and 358 deletions

View file

@ -1,27 +1,31 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
### UNRELEASED ### 1.6.0 - 30 nov '22
- new plugin system - fix #177 - new plugin system - fix #177
- new "publish on telegram" plugin: (thanks @fadelkon) - new "publish on telegram" plugin: (thanks @fadelkon)
- i18n refactoring
- people can now choose the language displayed - fix #171 - people can now choose the language displayed - fix #171
- fix place "[Object]" issue - #194
- live search
- admin could choose a custom fallback image - fix #195 - admin could choose a custom fallback image - fix #195
- it is now possible NOT to enter the end time of an event - fix #188 - it is now possible NOT to enter the end time of an event - fix #188
- Wordpress plugin now supports MU installation - live search
- add nominatim / openstreetmap feature (thanks @sedum)
- improve event import - improve event import
- new chinese translation
- new portuguese translation
- add Apple touch icon - fix #200 - add Apple touch icon - fix #200
- improve navbar layout - add nominatim / openstreetmap search feature (thanks @sedum)
- improve event layout
- new hide calendar option - new hide calendar option
- new hide thumbs from homepage option - new hide thumbs from homepage option
- linkable admin tab
- friendly instances label is now customizable (thanks @sedum)
- i18n refactoring
- Wordpress plugin now supports MU installation
- new chinese translation
- new portuguese translation
- improve navbar layout
- improve event layout
- complete oauth2 refactoring - complete oauth2 refactoring
- fix ics unique uuid
- fix place "[Object]" issue - #194
- fix random restart while downloading random media - fix random restart while downloading random media
- fix mobile dialog layout - fix mobile dialog layout
- urlencode place and tag urls
### 1.5.6 - 22 set '22 ### 1.5.6 - 22 set '22

View file

@ -32,13 +32,13 @@ export default {
</script> </script>
<style> <style>
nav { nav {
background-image: linear-gradient(rgba(59, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), url(/headerimage.png); background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(20, 20, 20, 0.7)), url(/headerimage.png);
background-position: center center; background-position: center center;
background-size: cover; background-size: cover;
} }
.theme--light nav { .theme--light nav {
background-image: linear-gradient(to bottom, rgba(255,230,230,.95), rgba(250,250,250,.95)), url(/headerimage.png); background-image: linear-gradient(to bottom, rgba(230,230,230,.95), rgba(250,250,250,.95)), url(/headerimage.png);
} }
#title { #title {

View file

@ -3,12 +3,11 @@ v-col(cols=12)
.text-center .text-center
v-btn-toggle.v-col-6.flex-column.flex-sm-row(v-model='type' color='primary' @change='type => change("type", type)') v-btn-toggle.v-col-6.flex-column.flex-sm-row(v-model='type' color='primary' @change='type => change("type", type)')
v-btn(value='normal' label="normal") {{ $t('event.normal') }} v-btn(value='normal' label="normal") {{ $t('event.normal') }}
v-btn(value='multidate' label='multidate') {{ $t('event.multidate') }} v-btn(v-if='settings.allow_multidate_event' value='multidate' label='multidate') {{ $t('event.multidate') }}
v-btn(v-if='settings.allow_recurrent_event' value='recurrent' label="recurrent") {{ $t('event.recurrent') }} v-btn(v-if='settings.allow_recurrent_event' value='recurrent' label="recurrent") {{ $t('event.recurrent') }}
p {{ $t(`event.${type}_description`) }} p {{ $t(`event.${type}_description`) }}
v-btn-toggle.v-col-6.flex-column.flex-sm-row(v-if='type === "recurrent"' color='primary' :value='value.recurrent.frequency' @change='fq => change("frequency", fq)') v-btn-toggle.v-col-6.flex-column.flex-sm-row(v-if='type === "recurrent"' color='primary' :value='value.recurrent.frequency' @change='fq => change("frequency", fq)')
v-btn(v-for='f in frequencies' :key='f.value' :value='f.value') {{ f.text }} v-btn(v-for='f in frequencies' :key='f.value' :value='f.value') {{ f.text }}
@ -60,7 +59,7 @@ v-col(cols=12)
:allowedMinutes='allowedMinutes' :allowedMinutes='allowedMinutes'
format='24hr' format='24hr'
@click:minute='menuFromHour = false' @click:minute='menuFromHour = false'
@change='hr => change("fromHour", hr)') @input='hr => change("fromHour", hr)')
v-col.col-12.col-sm-6 v-col.col-12.col-sm-6
@ -88,7 +87,7 @@ v-col(cols=12)
:allowedMinutes='allowedMinutes' :allowedMinutes='allowedMinutes'
format='24hr' format='24hr'
@click:minute='menuDueHour = false' @click:minute='menuDueHour = false'
@change='hr => change("dueHour", hr)') @input='hr => change("dueHour", hr)')
List(v-if='type === "normal" && todayEvents.length' :events='todayEvents' :title='$t("event.same_day")') List(v-if='type === "normal" && todayEvents.length' :events='todayEvents' :title='$t("event.same_day")')
@ -235,6 +234,15 @@ export default {
} else if (what === 'dueHour') { } else if (what === 'dueHour') {
if (value) { if (value) {
this.value.due = this.value.due ? this.value.due : this.value.from this.value.due = this.value.due ? this.value.due : this.value.from
const [hour, minute] = value.split(':')
const [fromHour, fromMinute] = this.value.fromHour.split(':')
if (!this.value.multidate) {
if (hour < fromHour) {
this.value.due = dayjs(this.value.from).add(1, 'day').toDate()
} else {
this.value.due = dayjs(this.value.from).toDate()
}
}
} else { } else {
this.value.due = null this.value.due = null
} }

View file

@ -39,6 +39,10 @@ v-container
inset inset
:label="$t('admin.allow_anon_event')") :label="$t('admin.allow_anon_event')")
v-switch.mt-1(v-model='allow_multidate_event'
inset
:label="$t('admin.allow_multidate_event')")
v-switch.mt-1(v-model='allow_recurrent_event' v-switch.mt-1(v-model='allow_recurrent_event'
inset inset
:label="$t('admin.allow_recurrent_event')") :label="$t('admin.allow_recurrent_event')")
@ -115,6 +119,10 @@ export default {
get () { return this.settings.allow_recurrent_event }, get () { return this.settings.allow_recurrent_event },
set (value) { this.setSetting({ key: 'allow_recurrent_event', value }) } set (value) { this.setSetting({ key: 'allow_recurrent_event', value }) }
}, },
allow_multidate_event: {
get () { return this.settings.allow_multidate_event },
set (value) { this.setSetting({ key: 'allow_multidate_event', value }) }
},
recurrent_event_visible: { recurrent_event_visible: {
get () { return this.settings.recurrent_event_visible }, get () { return this.settings.recurrent_event_visible },
set (value) { this.setSetting({ key: 'recurrent_event_visible', value }) } set (value) { this.setSetting({ key: 'recurrent_event_visible', value }) }

View file

@ -16,6 +16,7 @@ v-container
:label="$t('admin.hide_calendar')") :label="$t('admin.hide_calendar')")
v-card-title {{$t('admin.default_images')}} v-card-title {{$t('admin.default_images')}}
v-card-subtitle(v-html="$t('admin.default_images_help')")
v-card-text v-card-text
v-row v-row
v-col(cols='4') v-col(cols='4')
@ -109,12 +110,13 @@ import { mdiDeleteForever, mdiRestore, mdiPlus, mdiChevronUp } from '@mdi/js'
export default { export default {
name: 'Theme', name: 'Theme',
data () { data () {
const t = new Date().getMilliseconds()
return { return {
mdiDeleteForever, mdiRestore, mdiPlus, mdiChevronUp, mdiDeleteForever, mdiRestore, mdiPlus, mdiChevronUp,
valid: false, valid: false,
logoKey: 0, logoKey: t,
fallbackImageKey: 0, fallbackImageKey: t,
headerImageKey: 0, headerImageKey: t,
link: { href: '', label: '' }, link: { href: '', label: '' },
linkModal: false linkModal: false
// menu: [false, false, false, false] // menu: [false, false, false, false]

@ -1 +1 @@
Subproject commit 12640461481cc39cdee8efa05e7fd02a6a60e99c Subproject commit 0486d0852db569b7064535f0d52709e06e9ecd1f

View file

@ -1 +0,0 @@
{}

View file

@ -192,6 +192,7 @@
"event_remove_ok": "Event removed", "event_remove_ok": "Event removed",
"allow_registration_description": "Allow open registrations?", "allow_registration_description": "Allow open registrations?",
"allow_anon_event": "Allow anonymous events (has to be confirmed)?", "allow_anon_event": "Allow anonymous events (has to be confirmed)?",
"allow_multidate_event": "Allow multi-day events",
"allow_recurrent_event": "Allow recurring events", "allow_recurrent_event": "Allow recurring events",
"allow_geolocation": "Allow events geolocation", "allow_geolocation": "Allow events geolocation",
"recurrent_event_visible": "Show recurring events by default", "recurrent_event_visible": "Show recurring events by default",
@ -265,6 +266,7 @@
"hide_thumbs": "Hide thumbs", "hide_thumbs": "Hide thumbs",
"hide_calendar": "Hide calendar", "hide_calendar": "Hide calendar",
"default_images": "Default images", "default_images": "Default images",
"default_images_help": "You have to <a href='/admin?tab=theme'>refresh</a> the page to see the changes.",
"blocked": "Blocked", "blocked": "Blocked",
"domain": "Domain", "domain": "Domain",
"known_users": "Known users", "known_users": "Known users",

View file

@ -98,7 +98,10 @@
"about": "Sobre el sitio", "about": "Sobre el sitio",
"close": "Cerrar", "close": "Cerrar",
"help_translate": "Ayuda a traducir", "help_translate": "Ayuda a traducir",
"calendar": "Calendario" "calendar": "Calendario",
"content": "Contenido",
"admin_actions": "Acciones de administrador",
"recurring_event_actions": "Acciones de eventos recurrentes"
}, },
"login": { "login": {
"description": "Entrando podrás publicar nuevos eventos.", "description": "Entrando podrás publicar nuevos eventos.",
@ -268,7 +271,12 @@
"smtp_use_sendmail": "Usar sendmail", "smtp_use_sendmail": "Usar sendmail",
"wrong_domain_warning": "El parámetro baseurl configurado en config.json <b>({baseurl})</b> difiere del que estás visitando <b>({url})</b>", "wrong_domain_warning": "El parámetro baseurl configurado en config.json <b>({baseurl})</b> difiere del que estás visitando <b>({url})</b>",
"new_collection": "Nueva colección", "new_collection": "Nueva colección",
"collections_description": "Las colecciones son agrupaciones de eventos por etiquetas y ubicaciones. Serán desplegadas en la página de inicio" "collections_description": "Las colecciones son agrupaciones de eventos por etiquetas y ubicaciones. Serán desplegadas en la página de inicio",
"domain": "Dominio",
"created_at": "Creado a las",
"blocked": "Bloqueado",
"known_users": "Usuarios conocidos",
"default_images_help": "Tienes que <a href='/admin?tab=theme'>actualizas</a> la página para ver los cambios."
}, },
"auth": { "auth": {
"not_confirmed": "Todavía no hemos confirmado este email…", "not_confirmed": "Todavía no hemos confirmado este email…",

View file

@ -25,7 +25,7 @@
"events": "Ekitaldiak", "events": "Ekitaldiak",
"places": "Lekuak", "places": "Lekuak",
"settings": "Aukerak", "settings": "Aukerak",
"actions": "Ekintzak", "actions": "Eragiketak",
"deactivate": "Desaktibatu", "deactivate": "Desaktibatu",
"remove_admin": "Kendu administratzaile baimena", "remove_admin": "Kendu administratzaile baimena",
"activate": "Aktibatu", "activate": "Aktibatu",
@ -95,7 +95,10 @@
"show_map": "Erakutsi mapa", "show_map": "Erakutsi mapa",
"calendar": "Egutegia", "calendar": "Egutegia",
"home": "Etxea", "home": "Etxea",
"about": "Honi buruz" "about": "Honi buruz",
"recurring_event_actions": "Ekitaldi errepikarien eragiketak",
"content": "Edukia",
"admin_actions": "Administratzaile eragiketak"
}, },
"login": { "login": {
"description": "Saioa hasten baduzu ekitaldi berriak sortu ahal izango dituzu.", "description": "Saioa hasten baduzu ekitaldi berriak sortu ahal izango dituzu.",
@ -265,7 +268,12 @@
"config_plugin": "Pluginaren konfigurazioa", "config_plugin": "Pluginaren konfigurazioa",
"fallback_image": "Lehenetsitako irudia", "fallback_image": "Lehenetsitako irudia",
"header_image": "Goiburuko irudia", "header_image": "Goiburuko irudia",
"default_images": "Lehenetsitako irudiak" "default_images": "Lehenetsitako irudiak",
"blocked": "Blokeatuta",
"domain": "Domeinua",
"default_images_help": "Orrialdea <a href='/admin?tab=theme'>freskatu</a> behar duzu aldaketak ikusteko.",
"known_users": "Erabiltzaile ezagunak",
"created_at": "Noiz sortua:"
}, },
"auth": { "auth": {
"not_confirmed": "Oraindik baieztatu gabe dago…", "not_confirmed": "Oraindik baieztatu gabe dago…",

View file

@ -93,7 +93,15 @@
"show_map": "Mostrar mapa", "show_map": "Mostrar mapa",
"latitude": "Latitude", "latitude": "Latitude",
"longitude": "Longitude", "longitude": "Longitude",
"getting_there": "Chegar lá" "getting_there": "Chegar lá",
"plugins": "Complementos",
"help_translate": "Axuda coa tradución",
"calendar": "Calendario",
"home": "Inicio",
"about": "Acerca de",
"content": "Contido",
"admin_actions": "Accións de Admin",
"recurring_event_actions": "Accións de eventos recurrentes"
}, },
"recover": { "recover": {
"not_valid_code": "Algo fallou." "not_valid_code": "Algo fallou."
@ -163,7 +171,9 @@
"alt_text_description": "Descrición para persoas con problemas de visión", "alt_text_description": "Descrición para persoas con problemas de visión",
"choose_focal_point": "Elixe onde centrar a atención", "choose_focal_point": "Elixe onde centrar a atención",
"remove_media_confirmation": "Confirmas a eliminación da imaxe?", "remove_media_confirmation": "Confirmas a eliminación da imaxe?",
"download_flyer": "Descargar folleto" "download_flyer": "Descargar folleto",
"address_description": "Cal é o enderezo?",
"address_description_osm": "Cal é o enderezo? (Contribuíntes a <a href='http://osm.org/copyright'>OpenStreetMap</a>)"
}, },
"admin": { "admin": {
"place_description": "Se escribiches mal o lugar ou enderezo, podes cambialo.<br/>Cambiará o enderezo de tódolos eventos actuais e pasados asociados a este lugar.", "place_description": "Se escribiches mal o lugar ou enderezo, podes cambialo.<br/>Cambiará o enderezo de tódolos eventos actuais e pasados asociados a este lugar.",
@ -247,8 +257,19 @@
"disable_admin_user_confirm": "Tes certeza de querer retirar os permisos de administración a {user}?", "disable_admin_user_confirm": "Tes certeza de querer retirar os permisos de administración a {user}?",
"sender_email": "Remitente", "sender_email": "Remitente",
"collections_description": "As coleccións son agrupamentos de eventos por etiqueta ou lugar. Pode ser mostrado na páxina de inicio", "collections_description": "As coleccións son agrupamentos de eventos por etiqueta ou lugar. Pode ser mostrado na páxina de inicio",
"enable_admin_user_confirm": "Tes a certeza de querer darlle permisos de administración a {user}?", "enable_admin_user_confirm": "Tes a certeza de engadir permiso de admin a {user}?",
"smtp_use_sendmail": "Usar sendmail" "smtp_use_sendmail": "Usar sendmail",
"config_plugin": "Configuración do complemento",
"known_users": "Usuarias coñecidas",
"created_at": "Creado o",
"fallback_image": "Imaxe por omisión",
"header_image": "Imaxe da cabeceira",
"hide_thumbs": "Agochar miniaturas",
"hide_calendar": "Agochar calendario",
"default_images": "Imaxes por defecto",
"blocked": "Bloqueado",
"domain": "Dominio",
"default_images_help": "Tes que <a href='/admin?tab=theme'>actualizar</a> a páxina para ver os cambios."
}, },
"auth": { "auth": {
"not_confirmed": "Aínda non foi confirmado…", "not_confirmed": "Aínda non foi confirmado…",

View file

@ -258,6 +258,11 @@
"hide_thumbs": "Nascondi immaginine", "hide_thumbs": "Nascondi immaginine",
"hide_calendar": "Nascondi calendario", "hide_calendar": "Nascondi calendario",
"default_images": "Immagini preimpostate", "default_images": "Immagini preimpostate",
"default_images_help": "Devi <a href='/admin?tab=theme'>aggiornare</a> la pagina per vedere le modifiche.",
"blocked": "Bloccato",
"domain": "Domini",
"known_users": "Utenti conosciuti",
"created_at": "Creato il",
"show_geolocation_setup": "Impostazioni geolocalizzazione e mappa", "show_geolocation_setup": "Impostazioni geolocalizzazione e mappa",
"geolocation_description": "<b>1. Definisci un fornitore per il servizio di georeferenziazione (geocodifica)</b>.<br>Al momento, tra quelli elencati nella <a href=\"https://wiki.openstreetmap.org/wiki/Nominatim#Alternatives_.2F_Third-party_providers\">wiki di OpenStreetMap</a>, è presente il supporto per i software <a href=\"https://github.com/osm-search/Nominatim\">Nominatim</a> e <a href=\"https://github.com/komoot/photon\">Photon</a>.<br>Puoi utilizzare una delle relative demo ufficiali copiandone il link nel campo 'Fornitore georeferenziazione':<ul><li>https://nominatim.openstreetmap.org/ <a href=\"https://operations.osmfoundation.org/policies/nominatim/\"> [Terms of Service]</a></li><li>https://photon.komoot.io/api/ <a href=\"https://photon.komoot.io/\"> [Terms of Service]</a></li></ul><br><b>2. Definisci un fornitore di layers per la mappa.</b><br>Qui puoi trovarne una lista: <a href=\"https://leaflet-extras.github.io/leaflet-providers/preview/\">https://leaflet-extras.github.io/leaflet-providers/preview/</a>", "geolocation_description": "<b>1. Definisci un fornitore per il servizio di georeferenziazione (geocodifica)</b>.<br>Al momento, tra quelli elencati nella <a href=\"https://wiki.openstreetmap.org/wiki/Nominatim#Alternatives_.2F_Third-party_providers\">wiki di OpenStreetMap</a>, è presente il supporto per i software <a href=\"https://github.com/osm-search/Nominatim\">Nominatim</a> e <a href=\"https://github.com/komoot/photon\">Photon</a>.<br>Puoi utilizzare una delle relative demo ufficiali copiandone il link nel campo 'Fornitore georeferenziazione':<ul><li>https://nominatim.openstreetmap.org/ <a href=\"https://operations.osmfoundation.org/policies/nominatim/\"> [Terms of Service]</a></li><li>https://photon.komoot.io/api/ <a href=\"https://photon.komoot.io/\"> [Terms of Service]</a></li></ul><br><b>2. Definisci un fornitore di layers per la mappa.</b><br>Qui puoi trovarne una lista: <a href=\"https://leaflet-extras.github.io/leaflet-providers/preview/\">https://leaflet-extras.github.io/leaflet-providers/preview/</a>",
"geocoding_provider_type": "Software fornitore georeferenziazione", "geocoding_provider_type": "Software fornitore georeferenziazione",

View file

@ -1,6 +1,6 @@
{ {
"common": { "common": {
"add_event": "Adicionar Evento", "add_event": "Adicionar evento",
"description": "Descrição", "description": "Descrição",
"send": "Enviar", "send": "Enviar",
"address": "Endereço", "address": "Endereço",
@ -13,7 +13,7 @@
"what": "O que", "what": "O que",
"media": "Media", "media": "Media",
"password": "Senha", "password": "Senha",
"register": "Registro", "register": "Registrar",
"remove": "Remover", "remove": "Remover",
"confirm": "Confirmar", "confirm": "Confirmar",
"events": "Eventos", "events": "Eventos",
@ -22,8 +22,8 @@
"edit": "Editar", "edit": "Editar",
"admin": "Admin", "admin": "Admin",
"places": "Lugares", "places": "Lugares",
"hide": "Esconder", "hide": "Ocultar",
"search": "Procurar", "search": "Buscar",
"info": "Info", "info": "Info",
"users": "Usuários", "users": "Usuários",
"share": "Compartilhar", "share": "Compartilhar",
@ -76,11 +76,11 @@
"logout_ok": "Deslogado", "logout_ok": "Deslogado",
"n_resources": "nenhum recurso|um recurso|{n} recursos", "n_resources": "nenhum recurso|um recurso|{n} recursos",
"embed": "Incorporar", "embed": "Incorporar",
"embed_title": "Incorpore este evento na sua página", "embed_title": "Incorpore este evento em sua página",
"embed_help": "Copie o código seguinte em sua página e o evento será apresentado desta maneira", "embed_help": "Copie o seguinte código em sua página e o evento será exibido desta maneira",
"displayname": "Nome de exibição", "displayname": "Nome de exibição",
"feed_url_copied": "Abra a URL do feed no seu leitor RSS", "feed_url_copied": "Abra a URL copiada do feed em seu leitor de RSS",
"follow_me_title": "Seguir atualizações a partir do Fediverso", "follow_me_title": "Siga as atualizações pelo Fediverso",
"tags": "Marcadores", "tags": "Marcadores",
"theme": "Tema", "theme": "Tema",
"reset": "Reiniciar", "reset": "Reiniciar",
@ -88,18 +88,27 @@
"collections": "Coleções", "collections": "Coleções",
"max_events": "N. máximo de eventos", "max_events": "N. máximo de eventos",
"label": "Etiqueta", "label": "Etiqueta",
"close": "Fechar" "close": "Fechar",
"plugins": "Plugins",
"help_translate": "Ajude a traduzir",
"show_map": "Mostrar mapa",
"calendar": "Calendário",
"home": "Início",
"about": "Sobre",
"content": "Conteúdo",
"admin_actions": "Ações de admin",
"recurring_event_actions": "Ações de eventos recorrentes"
}, },
"admin": { "admin": {
"user_block_confirm": "Você está certo que quer bloquer o usuário {user}?", "user_block_confirm": "Você está certo que quer bloquear o usuário {user}?",
"filter_instances": "Filtrar instâncias", "filter_instances": "Filtrar instâncias",
"user_add_help": "Um e-mail con instruções para confirmar a inscrição e escolher uma senha será enviada ao novo usuário", "user_add_help": "Um e-mail com instruções para confirmar a inscrição e escolher uma senha será enviada ao novo usuário",
"show_resource": "Mostrar recurso", "show_resource": "Mostrar recurso",
"block_user": "Bloquear usuário", "block_user": "Bloquear usuário",
"filter_users": "Filtrar usuários", "filter_users": "Filtrar usuários",
"hide_resource": "Ocultar recurso", "hide_resource": "Ocultar recurso",
"delete_resource": "Remover recurso", "delete_resource": "Remover recurso",
"delete_resource_confirm": "Você está certo que quer remover esse recurso?", "delete_resource_confirm": "Você está certo que quer remover este recurso?",
"show_smtp_setup": "Configurações de e-mail", "show_smtp_setup": "Configurações de e-mail",
"resources": "Recursos", "resources": "Recursos",
"delete_announcement_confirm": "Você está certo que quer remover o anúncio?", "delete_announcement_confirm": "Você está certo que quer remover o anúncio?",
@ -107,7 +116,7 @@
"collections_description": "Coleções são agrupamentos de eventos por marcadores e locais. Eles serão exibidos na página principal", "collections_description": "Coleções são agrupamentos de eventos por marcadores e locais. Eles serão exibidos na página principal",
"new_collection": "Nova coleção", "new_collection": "Nova coleção",
"disable_admin_user_confirm": "Você está certo que quer remover permissões de administração de {user}?", "disable_admin_user_confirm": "Você está certo que quer remover permissões de administração de {user}?",
"enable_admin_user_confirm": "Você está certo que quer adicionar permissões de administrador para {user}", "enable_admin_user_confirm": "Você está certo que quer adicionar permissões de administrador para {user}?",
"event_remove_ok": "Evento removido", "event_remove_ok": "Evento removido",
"smtp_description": "<ul><li>Administrador deve receber um e-mail quando um evento anônimo for adicionado (se habilitado).</li><li>Administrador deve receber um e-mail de requisição de registro (se habilitado).</li><li>Usuário deve receber um e-mail de solicitação de registro.</li><li>Usuário deve receber um e-mail de confirmação de registro.</li><li>Usuário deve recever um e-mail de confirmação quando registrado diretamente por um administrador.</li><li>Usuários devem receber um e-mail para recuperar a senha quando eles esquecerem ela</li></ul>", "smtp_description": "<ul><li>Administrador deve receber um e-mail quando um evento anônimo for adicionado (se habilitado).</li><li>Administrador deve receber um e-mail de requisição de registro (se habilitado).</li><li>Usuário deve receber um e-mail de solicitação de registro.</li><li>Usuário deve receber um e-mail de confirmação de registro.</li><li>Usuário deve recever um e-mail de confirmação quando registrado diretamente por um administrador.</li><li>Usuários devem receber um e-mail para recuperar a senha quando eles esquecerem ela</li></ul>",
"allow_registration_description": "Permitir registro aberto de usuários?", "allow_registration_description": "Permitir registro aberto de usuários?",
@ -138,7 +147,7 @@
"smtp_secure": "SMTP Seguro (TLS ou STARTTLS)", "smtp_secure": "SMTP Seguro (TLS ou STARTTLS)",
"smtp_use_sendmail": "Utilizar sendmail", "smtp_use_sendmail": "Utilizar sendmail",
"instance_place_help": "A etiqueta para exibir em outras instâncias", "instance_place_help": "A etiqueta para exibir em outras instâncias",
"delete_trusted_instance_confirm": "Você quer realmente remover esse item do menu de instâncias amigas?", "delete_trusted_instance_confirm": "Você quer realmente remover este item do menu de instâncias amigas?",
"sender_email": "E-mail do remetente", "sender_email": "E-mail do remetente",
"widget": "Widget", "widget": "Widget",
"wrong_domain_warning": "A baseurl configurado em config.json <b>({baseurl})</b> é diferente da que você está visitando <b>({url})</b>", "wrong_domain_warning": "A baseurl configurado em config.json <b>({baseurl})</b> é diferente da que você está visitando <b>({url})</b>",
@ -160,7 +169,7 @@
"allow_recurrent_event": "Permitir eventos recorrentes", "allow_recurrent_event": "Permitir eventos recorrentes",
"recurrent_event_visible": "Exibir eventos recorrentes por padrão", "recurrent_event_visible": "Exibir eventos recorrentes por padrão",
"user_blocked": "Usuário {user} bloqueado", "user_blocked": "Usuário {user} bloqueado",
"announcement_description": "Nesta seção você pode inserir um anúncio para ser exibido na página principal", "announcement_description": "Nesta seção você pode inserir anúncios que serão exibidos na página principal",
"description_description": "Exibido no cabeçalho próximo ao título", "description_description": "Exibido no cabeçalho próximo ao título",
"instance_place": "Local indicativo desta instância", "instance_place": "Local indicativo desta instância",
"is_dark": "Tema escuro", "is_dark": "Tema escuro",
@ -168,14 +177,26 @@
"new_announcement": "Novo anúncio", "new_announcement": "Novo anúncio",
"federation": "Federação / ActivityPub", "federation": "Federação / ActivityPub",
"smtp_test_success": "Um e-mail de teste foi enviado para {admin_email}, por favor verifique sua caixa de entrada", "smtp_test_success": "Um e-mail de teste foi enviado para {admin_email}, por favor verifique sua caixa de entrada",
"smtp_test_button": "Enviar e-mail de teste" "smtp_test_button": "Enviar e-mail de teste",
"allow_geolocation": "Permitir geolocalização de eventos",
"config_plugin": "Configuração de plugin",
"fallback_image": "Imagem alternativa",
"header_image": "Imagem de cabeçalho",
"hide_thumbs": "Ocultar miniaturas",
"default_images_help": "Você precisa <a href='/admin?tab=theme'>recarregar</a> a página para ver as mudanças.",
"domain": "Domínio",
"default_images": "Imagens padrão",
"known_users": "Usuários conhecidos",
"created_at": "Criado em",
"hide_calendar": "Ocultar calendário",
"blocked": "Bloqueado"
}, },
"event": { "event": {
"follow_me_description": "Uma das maneiras de se manter atualizado com os eventos publicados aqui em {title},\né seguir a conta <u>{account}</u> no Fediverso, por exemplo via Mastodon, e possivelmente adicionar recursos para um evento a partir de lá.<br/><br/>\nSe você nunca ouviu falar sobre Mastodon ou do Fediverso nós recomendamos ler <a href='https://www.savjee.be/videos/simply-explained/mastodon-and-fediverse-explained/'>este artigo</a>.<br/><br/>Entre com sua instância abaixo (e.g. mastodon.social)", "follow_me_description": "Uma das maneiras de se manter atualizado com os eventos publicados aqui em {title},\né seguir a conta <u>{account}</u> no Fediverso, por exemplo via Mastodon, e possivelmente adicionar recursos para um evento a partir de lá.<br/><br/>\nSe você nunca ouviu falar sobre Mastodon ou do Fediverso nós recomendamos ler <a href='https://www.savjee.be/videos/simply-explained/mastodon-and-fediverse-explained/'>este artigo</a>.<br/><br/>Entre com sua instância abaixo (e.g. mastodon.social)",
"saved": "Evento salvo", "saved": "Evento salvo",
"recurrent": "Recorrente", "recurrent": "Recorrente",
"ics": "ICS", "ics": "ICS",
"recurrent_1m_days": "|O {days} de cada mês|{days} de cada mês", "recurrent_1m_days": "Dia {days} de cada mês",
"interact_with_me": "Siga-me", "interact_with_me": "Siga-me",
"media_description": "Você pode adicionar um flyer (opcional)", "media_description": "Você pode adicionar um flyer (opcional)",
"same_day": "no mesmo dia", "same_day": "no mesmo dia",
@ -202,12 +223,12 @@
"normal_description": "Escolha o dia.", "normal_description": "Escolha o dia.",
"recurrent_1w_days": "A cada {days}", "recurrent_1w_days": "A cada {days}",
"each_week": "Toda semana", "each_week": "Toda semana",
"each_2w": "Todas outras semanas", "each_2w": "A cada duas semanas",
"each_month": "Cada mês", "each_month": "Todo mês",
"recurrent_2w_days": "{days} a cada dois", "recurrent_2w_days": "{days} a cada dois",
"recurrent_2m_days": "|Dia {days} a cada dois meses|Os dias {days} a cada dois meses", "recurrent_2m_days": "Dia {days} a cada dois meses",
"recurrent_1m_ordinal": "O {n} {days} de cada mês", "recurrent_1m_ordinal": "{n} {days} de cada mês",
"recurrent_2m_ordinal": "|O {n} {days} a cada dois meses|O {n} {days} a cada dois meses", "recurrent_2m_ordinal": "{n} {days} a cada dois meses",
"due": "até", "due": "até",
"from": "De", "from": "De",
"image_too_big": "A imagem não pode ser maior que 4MB", "image_too_big": "A imagem não pode ser maior que 4MB",
@ -219,7 +240,9 @@
"alt_text_description": "Descrição para pessoas com deficiências visuais", "alt_text_description": "Descrição para pessoas com deficiências visuais",
"choose_focal_point": "Escolha o ponto focal", "choose_focal_point": "Escolha o ponto focal",
"remove_media_confirmation": "Você confirma a remoção da imagem?", "remove_media_confirmation": "Você confirma a remoção da imagem?",
"download_flyer": "Baixar flyer" "download_flyer": "Baixar flyer",
"address_description": "Qual é o endereço?",
"address_description_osm": "Qual é o endereço? (contribuidores do <a href='http://osm.org/copyright'>OpenStreetMap</a>)"
}, },
"confirm": { "confirm": {
"not_valid": "Algo deu errado.", "not_valid": "Algo deu errado.",
@ -231,7 +254,7 @@
"insert_your_address": "Informe seu endereço de e-mail", "insert_your_address": "Informe seu endereço de e-mail",
"feed_description": "Para seguir as atualizações de um computador ou smartphone sem que você precise acessar essa página periodicamente, utilize um feeds RSS. </p>\n\n<p> Com feeds RSS você pode utilizar um app especial para receber atualizações de páginas que te interessam. É uma boa maneira de seguir muitas páginas rapidamente, sem a necessidade de criar contas de usuários ou outras complicações. </p>\n\n<li> Se você possui um Android, recomendamos <a href=\"https://f-droid.org/en/packages/net.frju.flym/\">Flym</a> ou Feeder </li>\n<li> Para iPhone / iPad você pode utilizar <a href=\"https://itunes.apple.com/ua/app/feeds4u/id1038456442?mt=8\"> Feed4U </a> </li>\n<li> Para desktop / laptop nós recomendamos Feedbro, que pode ser instalado no <a href=\"https://addons.mozilla.org/en-GB/firefox/addon/feedbroreader/\"> Firefox </a> ou <a href=\"https://chrome.google.com/webstore/detail/feedbro/mefgmmbdailogpfhfblcnnjfmnpnmdfa\"> Chrome </a>. </li>\n<br/>\nAdicionado este link ao seu leitor de RSS irá mantê-lo atualizado.", "feed_description": "Para seguir as atualizações de um computador ou smartphone sem que você precise acessar essa página periodicamente, utilize um feeds RSS. </p>\n\n<p> Com feeds RSS você pode utilizar um app especial para receber atualizações de páginas que te interessam. É uma boa maneira de seguir muitas páginas rapidamente, sem a necessidade de criar contas de usuários ou outras complicações. </p>\n\n<li> Se você possui um Android, recomendamos <a href=\"https://f-droid.org/en/packages/net.frju.flym/\">Flym</a> ou Feeder </li>\n<li> Para iPhone / iPad você pode utilizar <a href=\"https://itunes.apple.com/ua/app/feeds4u/id1038456442?mt=8\"> Feed4U </a> </li>\n<li> Para desktop / laptop nós recomendamos Feedbro, que pode ser instalado no <a href=\"https://addons.mozilla.org/en-GB/firefox/addon/feedbroreader/\"> Firefox </a> ou <a href=\"https://chrome.google.com/webstore/detail/feedbro/mefgmmbdailogpfhfblcnnjfmnpnmdfa\"> Chrome </a>. </li>\n<br/>\nAdicionado este link ao seu leitor de RSS irá mantê-lo atualizado.",
"ical_description": "Computadores e smartphones normalmente possuem aplicações de calendário capazes de importar um calendário remoto.", "ical_description": "Computadores e smartphones normalmente possuem aplicações de calendário capazes de importar um calendário remoto.",
"list_description": "Se você tem uma página e quer exibir uma lista de eventos, use o código seguinte", "list_description": "Se você tem uma página e quer exibir uma lista de eventos, use o seguinte código",
"email_description": "Você pode obter os eventos que te interessam através de e-mail." "email_description": "Você pode obter os eventos que te interessam através de e-mail."
}, },
"oauth": { "oauth": {
@ -263,7 +286,7 @@
}, },
"setup": { "setup": {
"https_warning": "Você está acessando por HTTP, lembre-se de alterar o valor de baseurl em config.json se você mudar para HTTPS!", "https_warning": "Você está acessando por HTTP, lembre-se de alterar o valor de baseurl em config.json se você mudar para HTTPS!",
"completed": "Configuração completada", "completed": "Configuração completa",
"start": "Iniciar", "start": "Iniciar",
"completed_description": "<p>Você pode agora autenticar-se com o seguinte usuário:<br/><br/>Usuário: <b>{email}</b><br/>Senha: <b>{password}<b/></p>", "completed_description": "<p>Você pode agora autenticar-se com o seguinte usuário:<br/><br/>Usuário: <b>{email}</b><br/>Senha: <b>{password}<b/></p>",
"copy_password_dialog": "Sim, você precisa copiar a senha!" "copy_password_dialog": "Sim, você precisa copiar a senha!"

View file

@ -1,293 +0,0 @@
{
"common": {
"embed_help": "将以下代码复制并粘贴到你的网站,此事件将像这样显示",
"follow": "关注",
"add_event": "添加事件",
"send": "发送",
"where": "地点",
"address": "地址",
"when": "时间",
"what": "事件",
"media": "媒体",
"login": "登录",
"email": "电子邮箱",
"register": "注册",
"description": "描述",
"hide": "隐藏",
"search": "搜索",
"confirm": "确认",
"admin": "管理员",
"users": "用户",
"events": "事件",
"actions": "操作",
"deactivate": "取消",
"remove_admin": "移除管理员",
"activate": "激活",
"save": "该村",
"logout": "登出",
"name": "名称",
"associate": "合作者",
"add": "添加",
"recover_password": "重置密码",
"enable": "启用",
"me": "你",
"ok": "完成",
"resources": "资源",
"n_resources": "无资源|1 个资源|{n} 个资源",
"displayname": "显示名称",
"copy_link": "复制链接",
"send_via_mail": "发送电子邮件",
"embed": "嵌入式页面",
"feed_url_copied": "在你的 RSS 阅读器中打开复制的链接",
"follow_me_title": "在 Fediverse 网络中关注更新",
"feed": "RSS 源",
"moderation": "中等",
"authorize": "认证",
"title": "标题",
"filter": "筛选",
"pause": "暂停",
"start": "开始",
"announcements": "公告",
"url": "URL",
"place": "地点",
"theme": "主题",
"label": "标签",
"collections": "收藏",
"max_events": "最大事件数",
"next": "下一个",
"export": "导出",
"remove": "移除",
"settings": "选项",
"logout_ok": "已登出",
"new_password": "新密码",
"new_user": "新用户",
"places": "地点",
"edit": "编辑",
"cancel": "取消",
"password": "密码",
"info": "信息",
"preview": "预览",
"share": "分享",
"edit_event": "编辑事件",
"copy": "复制",
"related": "相关",
"set_password": "设置密码",
"instances": "实例",
"activate_user": "已确认",
"federation": "联盟",
"add_to_calendar": "添加到日历",
"copied": "已复制",
"embed_title": "在你的网页上嵌入此事件",
"user": "用户",
"event": "事件",
"fediverse": "Fediverse 网络",
"skip": "跳过",
"delete": "移除",
"import": "导入",
"tags": "标签",
"close": "关闭",
"disable": "禁用",
"password_updated": "密码已修改。",
"reset": "重置"
},
"export": {
"list_description": "如果你有一个网站并希望展示一个事件列表,使用以下代码",
"email_description": "你可以通过发给你的电子邮件了解你感兴趣的事件。",
"insert_your_address": "输入你的电子邮箱地址",
"ical_description": "电脑和智能手机通常预装了能够导入远程日历的日历应用。",
"intro": "与那些竭尽全力保留用户和数据的非社交平台不同,我们认为信息和人一样,都必须是自由的。因此,即使不通过此网站,你仍可随时了解你想了解的事件之最新情况。",
"feed_description": "要想从电脑或智能手机上关注更新而无需定期打开本网站请使用RSS订阅。</p>\n\n<p>通过RSS订阅您可以使用一个特殊的应用程序来接收你感兴趣的网站的更新。这是一个快速关注许多网站的好方法不需要创建账户或做其他事。</p>\n\n<li> 如果您使用 Android我们推荐 <a href=\"https://f-droid.org/en/packages/net.frju.flym/\">Flym</a> 或 Feeder。</li>\n<li> 对于iPhone/iPad您可以使用 <a href=\"https://itunes.apple.com/ua/app/feeds4u/id1038456442?mt=8\">Feed4U</a> </li>\n<li> 对于台式机/笔记本电脑,我们推荐可在 <a href=\"https://addons.mozilla.org/en-GB/firefox/addon/feedbroreader/\">Firefox</a> 或 <a href=\"https://chrome.google.com/webstore/detail/feedbro/mefgmmbdailogpfhfblcnnjfmnpnmdfa\">Chrome</a> 上安装的 Feedbro。</li>\n<br/>\n将此链接添加到你的RSS阅读器中以获得最新信息。"
},
"register": {
"description": "社会运动应该组织起来,并自筹资金<br/>\n<br/>在你能发布内容之前,<strong>你的账户必须审核通过</strong>,考虑到<strong>你可以通过此网站发现现实中的人</strong>,请写一些东西告诉我们你希望发布什么。",
"error": "错误: ",
"complete": "注册必须经过确认。",
"first_user": "管理员已创建"
},
"event": {
"anon_description": "即使不登录或注册,你也可以创建事件,但必须等待一些人看到它,\n并确认这是一个合适的事件。此外你也不能够修改它。<br/><br/>\n你也可以 <a href='/login'>登录</a> 或 <a href='/register'>注册</a>。或者继续浏览以得到答案。 ",
"anon": "匿名",
"same_day": "在同一天",
"what_description": "标题",
"description_description": "描述",
"added": "事件已添加",
"saved": "事件已保存",
"added_anon": "事件已添加,等待确认。",
"updated": "事件已更新",
"where_description": "事件的地点在哪里?如果不存在,你可以创建一个。",
"confirmed": "事件已确认",
"not_found": "找不到事件",
"recurrent": "日常事件",
"edit_recurrent": "编辑日常事件:",
"show_recurrent": "日常事件",
"show_past": "以及过往的事件",
"multidate_description": "这是一个节日吗?选择它开始和结束的时间",
"multidate": "更多日期",
"normal_description": "选择日期。",
"recurrent_2w_days": "每 {days} 天一次",
"each_week": "每周",
"each_2w": "隔周一次",
"due": "直到",
"from": "来自",
"image_too_big": "图片不能大于 4MB",
"interact_with_me_at": "在 Fediverse 网络上与我互动",
"interact_with_me": "关注我",
"remove_recurrent_confirmation": "你确定要移除这个日常事件吗?\n过去的事件仍将被维护但不会再添加新事件。",
"import_URL": "从 URL 导入",
"import_ICS": "从 ICS 导入",
"ics": "ICS",
"alt_text_description": "为视觉障碍者提供的说明",
"choose_focal_point": "选择联络点",
"download_flyer": "下载传单",
"tag_description": "标签",
"media_description": "你可以添加一份传单(可选)",
"recurrent_description": "选择频率和日期",
"only_future": "仅限即将到来的事件",
"normal": "普通",
"recurrent_1w_days": "每 {days} 天",
"recurrent_1m_days": "|每月的第 {days} 天|每月的第 {days} 天",
"recurrent_1m_ordinal": "每月的第 {n} 个 {days}",
"each_month": "每月",
"follow_me_description": "一种对这里发布的 {title} 事件保持关注的方法,\n是在 Fediverse 网络,比如 Mastodon上关注 <u>{account}</u>,亦有可能通过此方式给此事件添加资源。<br/><br/>\n如果你没听说过 Mastodon 和 Fediverse我们建议你阅读 <a href='https://www.savjee.be/videos/simply-explained/mastodon-and-fediverse-explained/'>这篇文章</a>。<br/><br/>在下方输入你的实例名称例如mastodon.social",
"import_description": "你可以从其他平台和实例通过标准格式ICS 和 hCalendar导入事件",
"remove_media_confirmation": "你确认要删除图片吗?",
"remove_confirmation": "你确定要移除此事件吗?"
},
"login": {
"check_email": "检查你的电子邮箱收件箱和垃圾邮件箱。",
"not_registered": "还未注册?",
"forgot_password": "忘记密码了?",
"insert_email": "输入你的电子邮箱地址",
"error": "无法登录,检查你的登录信息。",
"ok": "已登录",
"description": "登录以发布新事件。"
},
"recover": {
"not_valid_code": "发生了一些错误。"
},
"admin": {
"delete_user": "移除",
"remove_admin": "移除管理员",
"disable_user_confirm": "你确定禁用 {user} 吗?",
"disable_admin_user_confirm": "你确定移除 {user} 的管理员权限吗?",
"user_remove_ok": "用户已移除",
"user_create_ok": "用户已创建",
"event_remove_ok": "事件已移除",
"allow_registration_description": "允许公众注册?",
"allow_anon_event": "允许发布匿名事件(需要确认)?",
"allow_recurrent_event": "允许日常事件",
"federation": "联邦社交网络 / ActivityPub",
"enable_federation": "启用联邦社交网络",
"add_instance": "添加实例",
"select_instance_timezone": "时区",
"enable_resources": "启用资源",
"hide_boost_bookmark": "隐藏助力/书签",
"block": "屏蔽",
"unblock": "解除屏蔽",
"instance_name": "实例名称",
"hide_resource": "隐藏资源",
"delete_resource_confirm": "你确定要删除此资源吗?",
"filter_instances": "筛选实例",
"resources": "资源",
"favicon": "图标",
"user_block_confirm": "你确定要屏蔽用户 {user} 吗?",
"delete_announcement_confirm": "你确定要移除这个公告吗?",
"announcement_remove_ok": "公告已移除",
"instance_locale": "默认语言",
"title_description": "这将被用作页面的标题和电子邮件的主题,以导出 RSS 和 ICS 源。",
"description_description": "在标题旁的页眉中显示",
"instance_place_help": "在其他的实例中显示的标签",
"delete_trusted_instance_confirm": "你确定要从友好实例菜单中删除此项目吗?",
"edit_place": "编辑地点",
"new_announcement": "新公告",
"show_smtp_setup": "电子邮件设置",
"smtp_port": "SMTP 端口",
"smtp_secure": "SMTP 安全协议TLS 或 STARTTLS",
"smtp_test_success": "一封测试邮件已发送至 {admin_mail},请检查你的收件箱",
"sender_email": "发件人",
"widget": "小组件",
"wrong_domain_warning": "在 config.json 中设置的 baseurl <b>{baseurl}</b> 与你正在访问的 <b>{url}</b> 不同",
"edit_collection": "编辑收藏",
"event_confirm_description": "你可以在此确认匿名用户提交的事件",
"recurrent_event_visible": "默认显示日常事件",
"place_description": "如果你弄错了地点或地址,你可以修改。<br/>与这个地点相关的当前和过去的所有事件都会改变地址。",
"delete_user_confirm": "你确定移除 {user} 吗?",
"enable_admin_user_confirm": "你确定授予 {user} 管理员权限吗",
"enable_federation_help": "这将允许从 Fediverse 上关注此实例",
"enable_resources_help": "允许从 Fediverse 为此事件添加资源",
"hide_boost_bookmark_help": "隐藏来自 Fediverse 上的助力和书签数量图标",
"block_user": "屏蔽用户",
"filter_users": "筛选用户",
"user_add_help": "一封带有确认订阅和设置密码指引的邮件将被发送给新用户",
"show_resource": "显示资源",
"delete_resource": "删除资源",
"user_blocked": "用户 {user} 已屏蔽",
"instance_block_confirm": "你确定要屏蔽实例 {instance} 吗?",
"announcement_description": "你可以在此段落插入显示于首页的公告",
"instance_timezone_description": "Gancio 被设计用来收集特定区域,比如一座城市所发生的事件。这里的所有事件将以所选择的时区显示。",
"instance_locale_description": "特定页面偏好的用户语言。有时信息必须以相同的语言对所有人显示(比如通过 ActivityPub 发布内容或发送一些电子邮件时)。在这种情况下将使用上面选择的语言。",
"instance_place": "该实例的指示性位置",
"trusted_instances_help": "友好实例的列表将被显示于页眉",
"footer_links": "页脚链接",
"smtp_description": "<ul><li>当匿名事件被添加时(如果启用),管理员应当收到邮件</li>管理员应当会受到注册请求邮件(如果启用)。<li></li><li>用户应当会受到注册请求邮件。</li><li>用户应当收到注册确认邮件。</li><li>当管理员直接订阅时,用户应当受到邮件。</li><li>用户忘记密码时应当收到密码重置邮件。</li></ul>",
"smtp_use_sendmail": "使用 sendmail",
"smtp_test_button": "发送测试邮件",
"new_collection": "新建收藏",
"collections_description": "收藏是按标签和地点分组的事件。它们将于主页上显示",
"enable_trusted_instances": "启用友好实例",
"add_trusted_instance": "添加一个友好实例",
"add_link": "添加链接",
"delete_footer_link_confirm": "确定移除此链接吗?",
"instance_name_help": "要关注的 ActivityPub 账号",
"is_dark": "暗色主题",
"smtp_hostname": "SMTP 主机名"
},
"auth": {
"fail": "无法登录。你确定密码正确吗?",
"not_confirmed": "尚未确认……"
},
"settings": {
"change_password": "修改密码",
"password_updated": "密码已修改。",
"remove_account_confirm": "你即将永久删除你的账号",
"update_confirm": "你希望保存你的修改吗?",
"remove_account": "按下下方的按钮后你的账号将被删除。你发布的事件不会删除。",
"danger_section": "危险段落"
},
"error": {
"email_taken": "此电子邮箱地址已被使用。",
"nick_taken": "此昵称已被使用。"
},
"confirm": {
"title": "用户确认",
"not_valid": "出现了一些错误。",
"valid": "你的账户已被确认,你现在可以 <a href=\"/login\">登录</a>"
},
"ordinal": {
"4": "第四",
"5": "第五",
"2": "第二",
"-1": "最后",
"1": "第一",
"3": "第三"
},
"validators": {
"required": "{fieldName} 是必填项",
"email": "输入有效的电子邮箱地址"
},
"oauth": {
"authorization_request": "应用 <code>{app}</code> 申请在 <code>{instance_name}</code> 上获得以下权限:",
"redirected_to": "在确认后你将被重定向到 <code>{url}</code>",
"scopes": {
"event:write": "添加与编辑你的事件"
}
},
"setup": {
"completed_description": "<p>你现在可以以以下用户登录<br/><br/>用户名:<b>{email}</b><br/>密码:<b>{password}<b/></p>",
"copy_password_dialog": "没错,你必须复制密码!",
"start": "开始",
"https_warning": "你正在使用 HTTP 访问,如果你切换到 HTTPS记得在 config.json 中修改 baseurl",
"completed": "安装完成"
},
"about": "\n <p><a href='https://gancio.org'>Gancio</a> 是为本地社区设计的的共享日程表。</p>\n "
}

View file

@ -1,6 +1,6 @@
{ {
"name": "gancio", "name": "gancio",
"version": "1.6.0-rc2", "version": "1.6.0-rc3",
"description": "A shared agenda for local communities", "description": "A shared agenda for local communities",
"author": "lesion", "author": "lesion",
"scripts": { "scripts": {

View file

@ -91,17 +91,33 @@ export default {
WhereInput, WhereInput,
DateInput DateInput
}, },
validate({ store }) { validate({ store, params, error }) {
return (store.state.auth.loggedIn || store.state.settings.allow_anon_event) // should we allow anon event?
if(!store.state.settings.allow_anon_event && !store.state.auth.loggedIn) {
return error({ statusCode: 401, message: 'Not allowed'})
}
// do not allow edit to anon users
if (params.edit && !store.state.auth.loggedIn) {
return error({ statusCode: 401, message: 'Not allowed'})
}
return true
}, },
async asyncData({ params, $axios, error }) { async asyncData({ params, $axios, error, $auth, store }) {
if (params.edit) { if (params.edit) {
const data = { event: { place: {}, media: [] } } const data = { event: { place: {}, media: [] } }
data.id = params.edit data.id = params.edit
data.edit = true data.edit = true
let event let event
try { try {
event = await $axios.$get('/event/' + data.id) event = await $axios.$get('/event/' + data.id)
if (!$auth.user.is_admin && $auth.user.id !== event.userId) {
error({ statusCode: 401, message: 'Not allowed' })
return {}
}
} catch (e) { } catch (e) {
error({ statusCode: 404, message: 'Event not found!' }) error({ statusCode: 404, message: 'Event not found!' })
return {} return {}

View file

@ -28,13 +28,13 @@ v-container#event.pa-0.pa-sm-2
.text-h6.p-location.h-adr(itemprop="location" itemscope itemtype="https://schema.org/Place") .text-h6.p-location.h-adr(itemprop="location" itemscope itemtype="https://schema.org/Place")
v-icon(v-text='mdiMapMarker' small) v-icon(v-text='mdiMapMarker' small)
nuxt-link.vcard.ml-2.p-name.text-decoration-none.text-button(itemprop="name" :to='`/place/${event.place.name}`') {{event.place && event.place.name}} nuxt-link.vcard.ml-2.p-name.text-decoration-none.text-button(itemprop="name" :to='`/place/${encodeURIComponent(event.place.name)}`') {{event.place && event.place.name}}
.text-caption.p-street-address(itemprop='address') {{event.place && event.place.address}} .text-caption.p-street-address(itemprop='address') {{event.place && event.place.address}}
//- tags, hashtags //- tags, hashtags
v-card-text.pt-0(v-if='event.tags && event.tags.length') v-card-text.pt-0(v-if='event.tags && event.tags.length')
v-chip.p-category.ml-1.mt-1(v-for='tag in event.tags' small label color='primary' v-chip.p-category.ml-1.mt-1(v-for='tag in event.tags' small label color='primary'
outlined :key='tag' :to='`/tag/${tag}`') {{tag}} outlined :key='tag' :to='`/tag/${encodeURIComponent(tag)}`') {{tag}}
v-divider v-divider
//- info & actions //- info & actions

View file

@ -32,7 +32,7 @@ export default {
async asyncData ({ $axios, params, error }) { async asyncData ({ $axios, params, error }) {
try { try {
const tag = params.tag const tag = params.tag
const events = await $axios.$get(`/tag/${tag}`) const events = await $axios.$get(`/tag/${encodeURIComponent(tag)}`)
return { events, tag } return { events, tag }
} catch (e) { } catch (e) {
error({ statusCode: 400, message: 'Error!' }) error({ statusCode: 400, message: 'Error!' })

View file

@ -88,6 +88,7 @@ const exportController = {
const start = tmpStart.utc(true).format('YYYY-M-D-H-m').split('-').map(Number) const start = tmpStart.utc(true).format('YYYY-M-D-H-m').split('-').map(Number)
const end = tmpEnd.utc(true).format('YYYY-M-D-H-m').split('-').map(Number) const end = tmpEnd.utc(true).format('YYYY-M-D-H-m').split('-').map(Number)
return { return {
uid: `${e.id}@${settings.hostname}`,
start, start,
end, end,
title: `[${settings.title}] ${e.title}`, title: `[${settings.title}] ${e.title}`,

View file

@ -27,6 +27,7 @@ const defaultSettings = {
instance_place: '', instance_place: '',
allow_registration: true, allow_registration: true,
allow_anon_event: true, allow_anon_event: true,
allow_multidate_event: true,
allow_recurrent_event: false, allow_recurrent_event: false,
recurrent_event_visible: false, recurrent_event_visible: false,
allow_geolocation: true, allow_geolocation: true,

View file

@ -80,6 +80,7 @@ module.exports = {
allow_registration: settings.allow_registration, allow_registration: settings.allow_registration,
allow_anon_event: settings.allow_anon_event, allow_anon_event: settings.allow_anon_event,
allow_recurrent_event: settings.allow_recurrent_event, allow_recurrent_event: settings.allow_recurrent_event,
allow_multidate_event: settings.allow_multidate_event,
recurrent_event_visible: settings.recurrent_event_visible, recurrent_event_visible: settings.recurrent_event_visible,
enable_federation: settings.enable_federation, enable_federation: settings.enable_federation,
enable_resources: settings.enable_resources, enable_resources: settings.enable_resources,
@ -125,7 +126,7 @@ module.exports = {
router.use('/fallbackimage.png', (req, res, next) => { router.use('/fallbackimage.png', (req, res, next) => {
const fallbackImagePath = settingsController.settings.fallback_image || './static/noimg.svg' const fallbackImagePath = settingsController.settings.fallback_image || './static/noimg.svg'
return express.static(fallbackImagePath, { maxAge: '1d' })(req, res, next) return express.static(fallbackImagePath)(req, res, next)
}) })
router.use('/headerimage.png', (req, res, next) => { router.use('/headerimage.png', (req, res, next) => {
@ -135,12 +136,12 @@ module.exports = {
router.use('/logo.png', (req, res, next) => { router.use('/logo.png', (req, res, next) => {
const logoPath = settingsController.settings.logo || './static/gancio' const logoPath = settingsController.settings.logo || './static/gancio'
return express.static(logoPath + '.png', {maxAge: '1d'})(req, res, next) return express.static(logoPath + '.png')(req, res, next)
}) })
router.use('/favicon.ico', (req, res, next) => { router.use('/favicon.ico', (req, res, next) => {
const faviconPath = res.locals.settings.logo ? res.locals.settings.logo + '.png' : './assets/favicon.ico' const faviconPath = res.locals.settings.logo ? res.locals.settings.logo + '.png' : './assets/favicon.ico'
return express.static(faviconPath, {maxAge: '1d'})(req, res, next) return express.static(faviconPath)(req, res, next)
}) })
return router return router

View file

@ -6,6 +6,7 @@ export const state = () => ({
instance_name: '', instance_name: '',
allow_registration: true, allow_registration: true,
allow_anon_event: true, allow_anon_event: true,
allow_multidate_event: true,
allow_recurrent_event: true, allow_recurrent_event: true,
recurrent_event_visible: false, recurrent_event_visible: false,
allow_geolocation: false, allow_geolocation: false,