Restructure language files
This commit is contained in:
191
i18n/en.json
Normal file
191
i18n/en.json
Normal file
@@ -0,0 +1,191 @@
|
||||
{
|
||||
"action.back": "Back",
|
||||
"action.delete": "Delete",
|
||||
"action.save": "Save",
|
||||
"action.send": "Send",
|
||||
|
||||
"admin.config": "Config",
|
||||
"admin.create_success": "Created",
|
||||
"admin.delete_success": "Deleted",
|
||||
"admin.save_success": "Saved",
|
||||
"admin.title": "Admin Panel",
|
||||
"admin.toolbox": "Toolbox",
|
||||
"admin.upload": "Upload",
|
||||
|
||||
"credits.git": "Git Repository",
|
||||
"credits.license": "under GPLv3 license",
|
||||
"credits.project": "Spotty Project",
|
||||
|
||||
"email.confirmation.body_1": "Thank you for checking in on my wanderings :). I'll make sure to keep you posted on my progress along the trail.",
|
||||
"email.confirmation.body_2": "I usually check-in once a day, plus sometimes on special events, like successful peak ascents. I am using a GPS-based device (PLB) which does not require phone reception to work. Thus the messages should be pretty frequent, but, being awestruck by the beauty of nature, I could also just forget to send a signal once in a while. So do not worry if you don't receive anything for a couple of days.",
|
||||
"email.confirmation.body_3": "If I've posted some pictures recently, you should also get them in the same email.",
|
||||
"email.confirmation.conclusion": "See you down the road!",
|
||||
"email.confirmation.preheader": "Thanks for keeping in touch!",
|
||||
"email.confirmation.signature": "--François",
|
||||
"email.confirmation.subject": "Successful Registration",
|
||||
"email.confirmation.thanks_subject": "You're all set!",
|
||||
"email.unsubscribe": "PS: Changed your mind?",
|
||||
"email.unsubscribe_button": "Unsubscribe",
|
||||
"email.update.latest_news": "Latest news:",
|
||||
"email.update.preheader": "New position received",
|
||||
"email.update.subject": "Spotted!",
|
||||
"email.update.title": "Message",
|
||||
|
||||
"error.commit_db": "Issue committing to DB",
|
||||
"error.impossible_value": "Value \"$0\" is not possible for field \"$1\"",
|
||||
"error.no_auth": "No authorization",
|
||||
"error.unknown_field": "Field \"$0\" is unknown",
|
||||
|
||||
"feed.counter": "#$0",
|
||||
"feed.id": "Feed ID",
|
||||
"feed.last_update": "Last Spot Check",
|
||||
"feed.name": "Name",
|
||||
"feed.new": "New feed",
|
||||
"feed.plural": "Feeds",
|
||||
"feed.ref_id": "Ref. Feed ID",
|
||||
"feed.status": "Status",
|
||||
|
||||
"map.ign_france": "IGN (France)",
|
||||
"map.ign_spain": "IGN (Spain)",
|
||||
"map.linz": "LINZ",
|
||||
"map.natgeo": "National Geographic",
|
||||
"map.otm": "Open Topo Map",
|
||||
"map.outdoors": "Mapbox Outdoors",
|
||||
"map.satellite": "Satellite",
|
||||
"map.see_on_google": "See on Google Maps",
|
||||
"map.title": "Base Maps",
|
||||
"map.usgs": "USGS",
|
||||
|
||||
"media.add_on": "added on $0",
|
||||
"media.click_watch": "Click to watch video",
|
||||
"media.click_zoom": "Click to zoom",
|
||||
"media.comment_update": "Comment of media \"$0\" updated",
|
||||
"media.count": "Media $0 / $1",
|
||||
"media.image": "Picture",
|
||||
"media.image_taken": "taken on $0",
|
||||
"media.images": "Pictures",
|
||||
"media.nearby": "Nearby pictures",
|
||||
"media.no_id": "Missing Media ID in request",
|
||||
"media.video": "Video",
|
||||
"media.video_taken": "shot on $0",
|
||||
|
||||
"meta.locale": "en_NZ",
|
||||
"meta.page_og_desc": "Keep contact with François when he is off hiking",
|
||||
|
||||
"newsletter.email_exists": "This email is already subscribed. You can unsubscribe by clicking on the button above.",
|
||||
"newsletter.email_placeholder": "my@email.com",
|
||||
"newsletter.invalid_email": "It doesn't look like an email",
|
||||
"newsletter.subscribe": "Subscribe",
|
||||
"newsletter.subscribed": "Thanks! You'll receive a confirmation email shortly",
|
||||
"newsletter.subscribed_desc": "You're all set. We'll send you updates as soon as we get them",
|
||||
"newsletter.title": "Keep in touch!",
|
||||
"newsletter.unknown_email": "Unknown email address",
|
||||
"newsletter.unsubscribe": "Unsubscribe",
|
||||
"newsletter.unsubscribed": "Done. No more junk mail from us",
|
||||
"newsletter.unsubscribed_desc": "Write down your email address and we'll send you François' position as soon as we get it :)",
|
||||
|
||||
"post.copy_to_clipboard": "Copy direct link to clipboard",
|
||||
"post.link_copied": "Link copied!",
|
||||
"post.message": "Message",
|
||||
"post.name": "Name",
|
||||
"post.new_message": "New message",
|
||||
|
||||
"project.code_name": "Code name",
|
||||
"project.end": "End",
|
||||
"project.hikes": "Hikes",
|
||||
"project.id": "Project ID",
|
||||
"project.mode": "Mode",
|
||||
"project.modes.blog": "Active Project",
|
||||
"project.modes.histo": "Archived Project",
|
||||
"project.modes.previz": "Project in preparation",
|
||||
"project.new": "New Project",
|
||||
"project.plural": "Projects",
|
||||
"project.single": "Project",
|
||||
"project.start": "Start",
|
||||
"project.update_messages": "Update project messages",
|
||||
|
||||
"spot.id": "Spot ID",
|
||||
"spot.model": "Model",
|
||||
"spot.name": "Spot Name",
|
||||
"spot.plural": "Spots",
|
||||
"spot.ref_id": "Ref. Spot ID",
|
||||
|
||||
"stats.distance": "Distance",
|
||||
"stats.elevation": "Elevation",
|
||||
"stats.legend": "Legend",
|
||||
"stats.segment_length": "Segment length",
|
||||
"stats.type": "Track Type",
|
||||
|
||||
"time.city": "$0 Time",
|
||||
"time.date_time": "$0 at $1",
|
||||
"time.local": "$0 Local Time",
|
||||
"time.user": "$0 Your Time",
|
||||
"time.zone": "Time Zone",
|
||||
|
||||
"track.download": "Download GPX Track",
|
||||
"track.hitchhiking": "Hitchhiking",
|
||||
"track.main": "Main track",
|
||||
"track.off-track": "Off-track",
|
||||
|
||||
"unit.day": "day",
|
||||
"unit.day_short": "D",
|
||||
"unit.days": "days",
|
||||
"unit.hour": "h",
|
||||
|
||||
"upload.media.exists": "Picture $0 already exists",
|
||||
"upload.media.title": "Picture & Video Uploads",
|
||||
"upload.mode_archived": "Project \"$0\" is archived. No upload allowed",
|
||||
"upload.position.new": "New Position",
|
||||
"upload.position.title": "Additional Position",
|
||||
"upload.success": "$0 uploaded successfully",
|
||||
|
||||
"user.active": "Active Users",
|
||||
"user.clearance": "Clearance",
|
||||
"user.id": "User ID",
|
||||
"user.language": "Language",
|
||||
"user.name": "User Name",
|
||||
|
||||
"weather.type_1": "Blowing Or Drifting Snow",
|
||||
"weather.type_10": "Heavy Freezing Drizzle/Freezing Rain",
|
||||
"weather.type_11": "Light Freezing Drizzle/Freezing Rain",
|
||||
"weather.type_12": "Freezing Fog",
|
||||
"weather.type_13": "Heavy Freezing Rain",
|
||||
"weather.type_14": "Light Freezing Rain",
|
||||
"weather.type_15": "Funnel Cloud/Tornado",
|
||||
"weather.type_16": "Hail Showers",
|
||||
"weather.type_17": "Ice",
|
||||
"weather.type_18": "Lightning Without Thunder",
|
||||
"weather.type_19": "Mist",
|
||||
"weather.type_2": "Drizzle",
|
||||
"weather.type_20": "Precipitation In Vicinity",
|
||||
"weather.type_21": "Rain",
|
||||
"weather.type_22": "Heavy Rain And Snow",
|
||||
"weather.type_23": "Light Rain And Snow",
|
||||
"weather.type_24": "Rain Showers",
|
||||
"weather.type_25": "Heavy Rain",
|
||||
"weather.type_26": "Light Rain",
|
||||
"weather.type_27": "Sky Coverage Decreasing",
|
||||
"weather.type_28": "Sky Coverage Increasing",
|
||||
"weather.type_29": "Sky Unchanged",
|
||||
"weather.type_3": "Heavy Drizzle",
|
||||
"weather.type_30": "Smoke Or Haze",
|
||||
"weather.type_31": "Snow",
|
||||
"weather.type_32": "Snow And Rain Showers",
|
||||
"weather.type_33": "Snow Showers",
|
||||
"weather.type_34": "Heavy Snow",
|
||||
"weather.type_35": "Light Snow",
|
||||
"weather.type_36": "Squalls",
|
||||
"weather.type_37": "Thunderstorm",
|
||||
"weather.type_38": "Thunderstorm Without Precipitation",
|
||||
"weather.type_39": "Diamond Dust",
|
||||
"weather.type_4": "Light Drizzle",
|
||||
"weather.type_40": "Hail",
|
||||
"weather.type_41": "Overcast",
|
||||
"weather.type_42": "Partially cloudy",
|
||||
"weather.type_43": "Clear",
|
||||
"weather.type_5": "Heavy Drizzle/Rain",
|
||||
"weather.type_6": "Light Drizzle/Rain",
|
||||
"weather.type_7": "Duststorm",
|
||||
"weather.type_8": "Fog",
|
||||
"weather.type_9": "Freezing Drizzle/Freezing Rain"
|
||||
}
|
||||
191
i18n/es.json
Normal file
191
i18n/es.json
Normal file
@@ -0,0 +1,191 @@
|
||||
{
|
||||
"action.back": "Atrás",
|
||||
"action.delete": "Borrar",
|
||||
"action.save": "Guardar",
|
||||
"action.send": "Enviar",
|
||||
|
||||
"admin.config": "Configuración",
|
||||
"admin.create_success": "Creado",
|
||||
"admin.delete_success": "Eliminado",
|
||||
"admin.save_success": "Guardado",
|
||||
"admin.title": "Administración",
|
||||
"admin.toolbox": "Herramientas",
|
||||
"admin.upload": "Cargar",
|
||||
|
||||
"credits.git": "Repositorio de Git",
|
||||
"credits.license": "bajo licencia GPLv3",
|
||||
"credits.project": "Proyecto Spotty",
|
||||
|
||||
"email.confirmation.body_1": "Os agradezco mucho que sigais mi proyecto, y os intereseis de la evolucion. Os prometo que os mantendré informados sobre mi progreso.",
|
||||
"email.confirmation.body_2": "Normalmente envío un mensaje una vez al día. Cuando voy a lugares guays, envío uno extra (cimas, ese tipo de cosas). Estoy usando una dispositivo GPS para enviar la señal, por lo que no necesito una red telefónica para que funcione. Sin embargo, puede haber ocasiones en las que presione el botón. Por lo tanto, no se preocupe si no recibe mensajes durante uno o dos días.",
|
||||
"email.confirmation.body_3": "Cuando añada fotos en la página, también deberás encontrarlas en este correo electrónico.",
|
||||
"email.confirmation.conclusion": "¡Nos vemos en el camino!",
|
||||
"email.confirmation.preheader": "¡Gracias por mantenerte en contacto!",
|
||||
"email.confirmation.signature": "--François",
|
||||
"email.confirmation.subject": "Confirmación",
|
||||
"email.confirmation.thanks_subject": "¡Hecho!",
|
||||
"email.unsubscribe": "PD: ¿Demasiados correos electrónicos?",
|
||||
"email.unsubscribe_button": "Desinscribirse",
|
||||
"email.update.latest_news": "Últimas noticias:",
|
||||
"email.update.preheader": "¡Nueva posición!",
|
||||
"email.update.subject": "Nueva posición recibida",
|
||||
"email.update.title": "Mensaje",
|
||||
|
||||
"error.commit_db": "Error SQL",
|
||||
"error.impossible_value": "Valor \"$0\" no es posible para campo \"$1\"",
|
||||
"error.no_auth": "No autorización",
|
||||
"error.unknown_field": "Campo \"$0\" desconocido",
|
||||
|
||||
"feed.counter": "No. $0",
|
||||
"feed.id": "ID Feed",
|
||||
"feed.last_update": "Última actualización de Spot",
|
||||
"feed.name": "Descripción",
|
||||
"feed.new": "Nuevo feed",
|
||||
"feed.plural": "Feeds",
|
||||
"feed.ref_id": "ID Feed ref.",
|
||||
"feed.status": "Estado",
|
||||
|
||||
"map.ign_france": "IGN (Francia)",
|
||||
"map.ign_spain": "IGN (España)",
|
||||
"map.linz": "LINZ",
|
||||
"map.natgeo": "National Geographic",
|
||||
"map.otm": "Open Topo Map",
|
||||
"map.outdoors": "Mapbox Topo",
|
||||
"map.satellite": "Satélite",
|
||||
"map.see_on_google": "Ver la posición en Google Maps",
|
||||
"map.title": "Mapas de base",
|
||||
"map.usgs": "USGS",
|
||||
|
||||
"media.add_on": "Agregado el $0",
|
||||
"media.click_watch": "Haz clic para ver el video",
|
||||
"media.click_zoom": "Haz clic para ampliar",
|
||||
"media.comment_update": "Comentario \"$0\" actualizado",
|
||||
"media.count": "Media $0 de $1",
|
||||
"media.image": "Foto",
|
||||
"media.image_taken": "Foto tomada el $0",
|
||||
"media.images": "Fotos",
|
||||
"media.nearby": "Fotos cercanas",
|
||||
"media.no_id": "Falta el ID del sujeto",
|
||||
"media.video": "Video",
|
||||
"media.video_taken": "Video filmado el $0",
|
||||
|
||||
"meta.locale": "es_ES",
|
||||
"meta.page_og_desc": "Mantente en contacto con François durante sus aventuras a la montaña",
|
||||
|
||||
"newsletter.email_exists": "Esta dirección de correo electrónico ya está registrada. Puedes darte de baja haciendo clic en el botón de arriba.",
|
||||
"newsletter.email_placeholder": "nombre@email.com",
|
||||
"newsletter.invalid_email": "Esto no parece una dirección de correo electrónico",
|
||||
"newsletter.subscribe": "Suscribir",
|
||||
"newsletter.subscribed": "¡Gracias! Recibirás un correo electrónico de confirmación",
|
||||
"newsletter.subscribed_desc": "Todo esta listo. Te enviaremos noticias frescas en cuanto las recibamos. Prometido...",
|
||||
"newsletter.title": "Mantenerse en contacto",
|
||||
"newsletter.unknown_email": "Dirección de email desconocida",
|
||||
"newsletter.unsubscribe": "Desinscribirse",
|
||||
"newsletter.unsubscribed": "Está hecho. ¡No más spam!",
|
||||
"newsletter.unsubscribed_desc": "Anade tu dirección de correo electrónico y te enviaremos la posicion actualizada de François tan pronto como la recibamos :)",
|
||||
|
||||
"post.copy_to_clipboard": "Copiar el enlace",
|
||||
"post.link_copied": "¡Enlace copiado!",
|
||||
"post.message": "Mensaje",
|
||||
"post.name": "Nombre",
|
||||
"post.new_message": "Mensaje nuevo",
|
||||
|
||||
"project.code_name": "Nombre clave",
|
||||
"project.end": "Fin",
|
||||
"project.hikes": "Senderos",
|
||||
"project.id": "Proyecto ID",
|
||||
"project.mode": "Modo",
|
||||
"project.modes.blog": "Proyecto activo",
|
||||
"project.modes.histo": "Proyecto archivado",
|
||||
"project.modes.previz": "Proyecto en preparación",
|
||||
"project.new": "Nuevo proyecto",
|
||||
"project.plural": "Proyectos",
|
||||
"project.single": "Proyecto",
|
||||
"project.start": "Inicio",
|
||||
"project.update_messages": "Actualizar los mensajes del proyecto",
|
||||
|
||||
"spot.id": "ID Spot",
|
||||
"spot.model": "Modelo",
|
||||
"spot.name": "Spot",
|
||||
"spot.plural": "Spots",
|
||||
"spot.ref_id": "ID Spot ref.",
|
||||
|
||||
"stats.distance": "Distancia",
|
||||
"stats.elevation": "Elevación",
|
||||
"stats.legend": "Leyenda",
|
||||
"stats.segment_length": "Tamaño del segmento",
|
||||
"stats.type": "Tipo de sendero",
|
||||
|
||||
"time.city": "Hora de $0",
|
||||
"time.date_time": "$0 a la $1",
|
||||
"time.local": "$0 hora local",
|
||||
"time.user": "$0 en tu zona horaria",
|
||||
"time.zone": "Huso horario",
|
||||
|
||||
"track.download": "Descarga la ruta GPX",
|
||||
"track.hitchhiking": "Autostop",
|
||||
"track.main": "Camino principal",
|
||||
"track.off-track": "Variante",
|
||||
|
||||
"unit.day": "Día",
|
||||
"unit.day_short": "D",
|
||||
"unit.days": "Días",
|
||||
"unit.hour": "h",
|
||||
|
||||
"upload.media.exists": "La imagen $0 ya existe",
|
||||
"upload.media.title": "Cargar fotos y videos",
|
||||
"upload.mode_archived": "El proyecto \"$0\" esta archivado. No se puede cargar",
|
||||
"upload.position.new": "Nueva posición",
|
||||
"upload.position.title": "Subir posición",
|
||||
"upload.success": "$0 ha sido subido",
|
||||
|
||||
"user.active": "Usuarios activos",
|
||||
"user.clearance": "Nivel de autorización",
|
||||
"user.id": "ID del usuario",
|
||||
"user.language": "Idioma",
|
||||
"user.name": "Nombre",
|
||||
|
||||
"weather.type_1": "Nieve que sopla o a la deriva",
|
||||
"weather.type_10": "Fuerte llovizna helada / lluvia helada",
|
||||
"weather.type_11": "Llovizna helada ligera / lluvia helada",
|
||||
"weather.type_12": "Niebla helada",
|
||||
"weather.type_13": "Lluvia helada intensa",
|
||||
"weather.type_14": "Lluvia helada ligera",
|
||||
"weather.type_15": "Nube de embudo / Tornado",
|
||||
"weather.type_16": "Lluvias de granizo",
|
||||
"weather.type_17": "Hielo",
|
||||
"weather.type_18": "Rayo sin trueno",
|
||||
"weather.type_19": "Niebla",
|
||||
"weather.type_2": "Llovizna",
|
||||
"weather.type_20": "Precipitación en las proximidades",
|
||||
"weather.type_21": "Lluvia",
|
||||
"weather.type_22": "Fuertes lluvias y nieve",
|
||||
"weather.type_23": "Lluvia ligera y nieve",
|
||||
"weather.type_24": "Lluvias",
|
||||
"weather.type_25": "Lluvia Pesada",
|
||||
"weather.type_26": "Lluvia ligera",
|
||||
"weather.type_27": "Disminución de la cobertura del cielo",
|
||||
"weather.type_28": "Aumento de la cobertura del cielo",
|
||||
"weather.type_29": "Cielo sin cambios",
|
||||
"weather.type_3": "Llovizna fuerte",
|
||||
"weather.type_30": "Humo o neblina",
|
||||
"weather.type_31": "Nieve",
|
||||
"weather.type_32": "Lluvias y nieve",
|
||||
"weather.type_33": "Duchas de nieve",
|
||||
"weather.type_34": "Fuertes nevadas",
|
||||
"weather.type_35": "Nieve ligera",
|
||||
"weather.type_36": "Chubascos",
|
||||
"weather.type_37": "Tormenta",
|
||||
"weather.type_38": "Tormenta sin precipitaciones",
|
||||
"weather.type_39": "Polvo de diamante",
|
||||
"weather.type_4": "Llovizna ligera",
|
||||
"weather.type_40": "Granizo",
|
||||
"weather.type_41": "Nublado",
|
||||
"weather.type_42": "Parcialmente nublado",
|
||||
"weather.type_43": "Claro",
|
||||
"weather.type_5": "Fuerte llovizna / lluvia",
|
||||
"weather.type_6": "Llovizna ligera / Lluvia",
|
||||
"weather.type_7": "Tormenta de arena",
|
||||
"weather.type_8": "Niebla",
|
||||
"weather.type_9": "Llovizna helada / Lluvia helada"
|
||||
}
|
||||
191
i18n/fr.json
Normal file
191
i18n/fr.json
Normal file
@@ -0,0 +1,191 @@
|
||||
{
|
||||
"action.back": "Retour",
|
||||
"action.delete": "Supprimer",
|
||||
"action.save": "Sauvegarder",
|
||||
"action.send": "Envoyer",
|
||||
|
||||
"admin.config": "Paramètres",
|
||||
"admin.create_success": "Créé",
|
||||
"admin.delete_success": "Supprimé",
|
||||
"admin.save_success": "Sauvegardé",
|
||||
"admin.title": "Administration",
|
||||
"admin.toolbox": "Boite à outils",
|
||||
"admin.upload": "Uploader",
|
||||
|
||||
"credits.git": "Dépôt Git",
|
||||
"credits.license": "sous licence GPLv3",
|
||||
"credits.project": "Projet Spotty",
|
||||
|
||||
"email.confirmation.body_1": "C'est gentil de venir voir où j'en suis. Promis, je vous tiendrais au courant de mon avancée.",
|
||||
"email.confirmation.body_2": "En général, j'envoie un message une fois par jour. Lorsque je passe à des endroits sympas, j'en envoie un supplémentaire (ascension de sommets, ce genre de choses). J'utilise une balise GPS pour envoyer le signal, je n'ai donc pas besoin de réseau téléphonique pour que cela fonctionne. Cependant, il peut m'arriver d'appuyer sur le bouton. Donc pas de raison de s'inquiéter si vous ne recevez pas de messages pendant une journée ou deux.",
|
||||
"email.confirmation.body_3": "Si j'ai ajouté des photos sur le site récemment, vous devriez aussi les retrouver dans cet email.",
|
||||
"email.confirmation.conclusion": "A bientôt sur les chemins !",
|
||||
"email.confirmation.preheader": "Merci de rester en contact !",
|
||||
"email.confirmation.signature": "--François",
|
||||
"email.confirmation.subject": "Confirmation",
|
||||
"email.confirmation.thanks_subject": "C'est tout bon !",
|
||||
"email.unsubscribe": "PS: Trop d'emails ?",
|
||||
"email.unsubscribe_button": "Se désinscrire",
|
||||
"email.update.latest_news": "Dernières nouvelles :",
|
||||
"email.update.preheader": "Nouvelle position !",
|
||||
"email.update.subject": "Nouvelle position reçue",
|
||||
"email.update.title": "Message",
|
||||
|
||||
"error.commit_db": "Error lors de la requête SQL",
|
||||
"error.impossible_value": "La valeur \"$0\" n'est pas possible pour le champ \"$1\"",
|
||||
"error.no_auth": "Pas d'authorisation",
|
||||
"error.unknown_field": "Champ \"$0\" inconnu",
|
||||
|
||||
"feed.counter": "N°$0",
|
||||
"feed.id": "ID Feed",
|
||||
"feed.last_update": "Dernière vérification Spot",
|
||||
"feed.name": "Description",
|
||||
"feed.new": "Nouveau feed",
|
||||
"feed.plural": "Feeds",
|
||||
"feed.ref_id": "ID Feed ref.",
|
||||
"feed.status": "Statut",
|
||||
|
||||
"map.ign_france": "IGN (France)",
|
||||
"map.ign_spain": "IGN (Espagne)",
|
||||
"map.linz": "LINZ",
|
||||
"map.natgeo": "National Geographic",
|
||||
"map.otm": "Open Topo Map",
|
||||
"map.outdoors": "Mapbox Topo",
|
||||
"map.satellite": "Satellite",
|
||||
"map.see_on_google": "Voir la position sur Google Maps",
|
||||
"map.title": "Fonds de carte",
|
||||
"map.usgs": "USGS",
|
||||
|
||||
"media.add_on": "ajoutée le $0",
|
||||
"media.click_watch": "Click pour voir la vidéo",
|
||||
"media.click_zoom": "Click pour zoomer",
|
||||
"media.comment_update": "Commentaire du media \"$0\" mis-à-jour",
|
||||
"media.count": "Média $0 sur $1",
|
||||
"media.image": "Photo",
|
||||
"media.image_taken": "prise le $0",
|
||||
"media.images": "Photos",
|
||||
"media.nearby": "Photos prises dans le coin",
|
||||
"media.no_id": "ID du média manquant",
|
||||
"media.video": "Vidéo",
|
||||
"media.video_taken": "filmée le $0",
|
||||
|
||||
"meta.locale": "fr_CH",
|
||||
"meta.page_og_desc": "Gardez le contact avec François lorsqu'il part sur les chemins",
|
||||
|
||||
"newsletter.email_exists": "Cette adresse email est déjà enregistrée. Vous pouvez vous désinscrire en cliquant sur le bouton ci-dessus.",
|
||||
"newsletter.email_placeholder": "mon@email.com",
|
||||
"newsletter.invalid_email": "Ceci ne ressemble pas à une adresse email",
|
||||
"newsletter.subscribe": "S'abonner",
|
||||
"newsletter.subscribed": "Merci ! Tu vas recevoir un email de confirmation très bientôt",
|
||||
"newsletter.subscribed_desc": "C'est tout bon. On t'envoie des nouvelles fraiches dès qu'on les reçoit. Parole de scout.",
|
||||
"newsletter.title": "Rester en contact",
|
||||
"newsletter.unknown_email": "Adresse email inconnue",
|
||||
"newsletter.unsubscribe": "Se désinscrire",
|
||||
"newsletter.unsubscribed": "C'est fait. Fini le spam!",
|
||||
"newsletter.unsubscribed_desc": "Ajoute ton adresse email et on t'enverra la nouvelle position de François dès qu'on la reçoit :)",
|
||||
|
||||
"post.copy_to_clipboard": "Copie le lien dans le presse-papier",
|
||||
"post.link_copied": "Lien copié !",
|
||||
"post.message": "Message",
|
||||
"post.name": "Nom",
|
||||
"post.new_message": "Nouveau message",
|
||||
|
||||
"project.code_name": "Nom de code",
|
||||
"project.end": "Arrivée",
|
||||
"project.hikes": "Randonnées",
|
||||
"project.id": "ID projet",
|
||||
"project.mode": "Mode",
|
||||
"project.modes.blog": "Projet actif",
|
||||
"project.modes.histo": "Projet archivé",
|
||||
"project.modes.previz": "Projet en cours de préparation",
|
||||
"project.new": "Nouveau projet",
|
||||
"project.plural": "Projets",
|
||||
"project.single": "Projet",
|
||||
"project.start": "Départ",
|
||||
"project.update_messages": "Mettre à jour les messages du projet",
|
||||
|
||||
"spot.id": "ID Spot",
|
||||
"spot.model": "Modèle",
|
||||
"spot.name": "Spot",
|
||||
"spot.plural": "Spots",
|
||||
"spot.ref_id": "ID Spot ref.",
|
||||
|
||||
"stats.distance": "Distance",
|
||||
"stats.elevation": "Dénivelé",
|
||||
"stats.legend": "Légende",
|
||||
"stats.segment_length": "Taille du segment",
|
||||
"stats.type": "Type de rando",
|
||||
|
||||
"time.city": "heure de $0",
|
||||
"time.date_time": "$0 à $1",
|
||||
"time.local": "$0 heure locale",
|
||||
"time.user": "$0 dans votre fuseau horaire",
|
||||
"time.zone": "Fuseau horaire",
|
||||
|
||||
"track.download": "Télécharger la trace GPX",
|
||||
"track.hitchhiking": "Hors rando",
|
||||
"track.main": "Trajet principal",
|
||||
"track.off-track": "Variante",
|
||||
|
||||
"unit.day": "jour",
|
||||
"unit.day_short": "J",
|
||||
"unit.days": "jours",
|
||||
"unit.hour": "h",
|
||||
|
||||
"upload.media.exists": "l'image $0 existe déjà",
|
||||
"upload.media.title": "Uploader photos & vidéos",
|
||||
"upload.mode_archived": "Le projet \"$0\" a été archivé. Aucun upload possible",
|
||||
"upload.position.new": "Nouvelle position",
|
||||
"upload.position.title": "Position supplémentaire",
|
||||
"upload.success": "$0 a été uploadé",
|
||||
|
||||
"user.active": "Utilisateurs actifs",
|
||||
"user.clearance": "Niveau d'autorisation",
|
||||
"user.id": "ID Utilisateur",
|
||||
"user.language": "Langue",
|
||||
"user.name": "Nom",
|
||||
|
||||
"weather.type_1": "Poudrerie ou neige à la dérive",
|
||||
"weather.type_10": "Forte bruine verglaçante / pluie verglaçante",
|
||||
"weather.type_11": "Légère bruine verglaçante / pluie verglaçante",
|
||||
"weather.type_12": "Brouillard verglaçant",
|
||||
"weather.type_13": "Forte pluie verglaçante",
|
||||
"weather.type_14": "Légère pluie verglaçante",
|
||||
"weather.type_15": "Nuage d'entonnoir / Tornade",
|
||||
"weather.type_16": "Douches de grêle",
|
||||
"weather.type_17": "La glace",
|
||||
"weather.type_18": "Foudre sans tonnerre",
|
||||
"weather.type_19": "Brouillard",
|
||||
"weather.type_2": "Bruine",
|
||||
"weather.type_20": "Précipitations à proximité",
|
||||
"weather.type_21": "Pluie",
|
||||
"weather.type_22": "Forte pluie et neige",
|
||||
"weather.type_23": "Légère pluie et neige",
|
||||
"weather.type_24": "Averses de pluie",
|
||||
"weather.type_25": "Forte pluie",
|
||||
"weather.type_26": "Pluie légère",
|
||||
"weather.type_27": "Couverture du ciel en baisse",
|
||||
"weather.type_28": "Augmentation de la couverture du ciel",
|
||||
"weather.type_29": "Ciel inchangé",
|
||||
"weather.type_3": "Bruine lourde",
|
||||
"weather.type_30": "Fumée ou brume",
|
||||
"weather.type_31": "Neige",
|
||||
"weather.type_32": "Averses de neige et de pluie",
|
||||
"weather.type_33": "Douches de neige",
|
||||
"weather.type_34": "Beaucoup de neige",
|
||||
"weather.type_35": "Neige légère",
|
||||
"weather.type_36": "Grains",
|
||||
"weather.type_37": "Orage",
|
||||
"weather.type_38": "Orage sans précipitations",
|
||||
"weather.type_39": "La poussière de diamant",
|
||||
"weather.type_4": "Bruine légère",
|
||||
"weather.type_40": "Saluer",
|
||||
"weather.type_41": "Couvert",
|
||||
"weather.type_42": "Partiellement nuageux",
|
||||
"weather.type_43": "Clair",
|
||||
"weather.type_5": "Forte bruine / pluie",
|
||||
"weather.type_6": "Légère bruine / pluie",
|
||||
"weather.type_7": "Tempête de poussière",
|
||||
"weather.type_8": "Brouillard",
|
||||
"weather.type_9": "Bruine verglaçante / Pluie verglaçante"
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
locale = en_NZ
|
||||
page_og_desc = Keep contact with François when he is off hiking
|
||||
error_commit_db = Issue committing to DB
|
||||
unknown_field = Field "$0" is unknown
|
||||
impossible_value = Value "$0" is not possible for field "$1"
|
||||
|
||||
nav_back = Back
|
||||
|
||||
admin = Admin Panel
|
||||
admin_config = Config
|
||||
admin_upload = Upload
|
||||
save = Save
|
||||
admin_save_success = Saved
|
||||
admin_create_success= Created
|
||||
admin_delete_success= Deleted
|
||||
no_auth = No authorization
|
||||
|
||||
track_main = Main track
|
||||
track_off-track = Off-track
|
||||
track_hitchhiking = Hitchhiking
|
||||
track_download = Download GPX Track
|
||||
|
||||
upload_media_title = Picture & Video Uploads
|
||||
upload_pos_title = Additional Position
|
||||
upload_mode_archived= Project "$0" is archived. No upload allowed
|
||||
upload_success = $0 uploaded successfully
|
||||
upload_media_exist = Picture $0 already exists
|
||||
new_position = New Position
|
||||
|
||||
|
||||
post_message = Message
|
||||
post_name = Name
|
||||
post_new_message = New message
|
||||
and = and
|
||||
counter = #$0
|
||||
send = Send
|
||||
|
||||
maps = Base Maps
|
||||
map_satellite = Satellite
|
||||
map_otm = Open Topo Map
|
||||
map_ign_france = IGN (France)
|
||||
map_ign_spain = IGN (Spain)
|
||||
map_linz = LINZ
|
||||
map_usgs = USGS
|
||||
map_natgeo = National Geographic
|
||||
map_outdoors = Mapbox Outdoors
|
||||
|
||||
image = Picture
|
||||
images = Pictures
|
||||
image_taken = taken on $0
|
||||
video = Video
|
||||
video_taken = shot on $0
|
||||
add_on = added on $0
|
||||
click_watch = Click to watch video
|
||||
click_zoom = Click to zoom
|
||||
media_count = Media $0 / $1
|
||||
media_no_id = Missing Media ID in request
|
||||
media_comment_update= Comment of media "$0" updated
|
||||
see_on_google = See on Google Maps
|
||||
copy_to_clipboard = Copy direct link to clipboard
|
||||
link_copied = Link copied!
|
||||
|
||||
city_time = $0 Time
|
||||
local_time = $0 Local Time
|
||||
your_time = $0 Your Time
|
||||
date_time = $0 at $1
|
||||
time_zone = Time Zone
|
||||
|
||||
id_project = Project ID
|
||||
project = Project
|
||||
projects = Projects
|
||||
new_project = New Project
|
||||
update_project = Update project messages
|
||||
hikes = Hikes
|
||||
mode = Mode
|
||||
mode_previz = Project in preparation
|
||||
mode_blog = Active Project
|
||||
mode_histo = Archived Project
|
||||
code_name = Code name
|
||||
start = Start
|
||||
end = End
|
||||
feeds = Feeds
|
||||
id_feed = Feed ID
|
||||
ref_feed_id = Ref. Feed ID
|
||||
new_feed = New feed
|
||||
id_spot = Spot ID
|
||||
name = Name
|
||||
status = Status
|
||||
last_update = Last Spot Check
|
||||
ref_spot_id = Ref. Spot ID
|
||||
model = Model
|
||||
delete = Delete
|
||||
id_user = User ID
|
||||
user_name = User Name
|
||||
active_users = Active Users
|
||||
language = Language
|
||||
clearance = Clearance
|
||||
toolbox = Toolbox
|
||||
|
||||
unit_d = D
|
||||
unit_day = day
|
||||
unit_days = days
|
||||
unit_hour = h
|
||||
|
||||
newsletter = Keep in touch!
|
||||
nl_email_placeholder= my@email.com
|
||||
nl_invalid_email = It doesn't look like an email
|
||||
nl_subscribed_desc = You're all set. We'll send you updates as soon as we get them
|
||||
nl_unsubscribed_desc= Write down your email address and we'll send you François' position as soon as we get it :)
|
||||
nl_email_exists = This email is already subscribed. You can unsubscribe by clicking on the button above.
|
||||
nl_subscribe = Subscribe
|
||||
nl_subscribed = Thanks! You'll receive a confirmation email shortly
|
||||
nl_unsubscribe = Unsubscribe
|
||||
nl_unsubscribed = Done. No more junk mail from us
|
||||
nl_unknown_email = Unknown email address
|
||||
|
||||
email_unsubscribe = PS: Changed your mind?
|
||||
email_unsub_btn = Unsubscribe
|
||||
|
||||
email_conf_subject = Successful Registration
|
||||
conf_preheader = Thanks for keeping in touch!
|
||||
conf_thanks_sub = You're all set!
|
||||
conf_body_para_1 = Thank you for checking in on my wanderings :). I'll make sure to keep you posted on my progress along the trail.
|
||||
conf_body_para_2 = I usually check-in once a day, plus sometimes on special events, like successful peak ascents. I am using a GPS-based device (PLB) which does not require phone reception to work. Thus the messages should be pretty frequent, but, being awestruck by the beauty of nature, I could also just forget to send a signal once in a while. So do not worry if you don't receive anything for a couple of days.
|
||||
conf_body_para_3 = If I've posted some pictures recently, you should also get them in the same email.
|
||||
conf_body_conclusion= See you down the road!
|
||||
conf_signature = --François
|
||||
|
||||
email_update_subject= Spotted!
|
||||
update_preheader = New position received
|
||||
update_title = Message
|
||||
update_latest_news = Latest news:
|
||||
|
||||
distance = Distance
|
||||
elevation = Elevation
|
||||
segment_length = Segment length
|
||||
type = Track Type
|
||||
legend = Legend
|
||||
|
||||
credits_project = Spotty Project
|
||||
credits_git = Git Repository
|
||||
credits_license = under GPLv3 license
|
||||
|
||||
weather_type_1 = Blowing Or Drifting Snow
|
||||
weather_type_2 = Drizzle
|
||||
weather_type_3 = Heavy Drizzle
|
||||
weather_type_4 = Light Drizzle
|
||||
weather_type_5 = Heavy Drizzle/Rain
|
||||
weather_type_6 = Light Drizzle/Rain
|
||||
weather_type_7 = Duststorm
|
||||
weather_type_8 = Fog
|
||||
weather_type_9 = Freezing Drizzle/Freezing Rain
|
||||
weather_type_10 = Heavy Freezing Drizzle/Freezing Rain
|
||||
weather_type_11 = Light Freezing Drizzle/Freezing Rain
|
||||
weather_type_12 = Freezing Fog
|
||||
weather_type_13 = Heavy Freezing Rain
|
||||
weather_type_14 = Light Freezing Rain
|
||||
weather_type_15 = Funnel Cloud/Tornado
|
||||
weather_type_16 = Hail Showers
|
||||
weather_type_17 = Ice
|
||||
weather_type_18 = Lightning Without Thunder
|
||||
weather_type_19 = Mist
|
||||
weather_type_20 = Precipitation In Vicinity
|
||||
weather_type_21 = Rain
|
||||
weather_type_22 = Heavy Rain And Snow
|
||||
weather_type_23 = Light Rain And Snow
|
||||
weather_type_24 = Rain Showers
|
||||
weather_type_25 = Heavy Rain
|
||||
weather_type_26 = Light Rain
|
||||
weather_type_27 = Sky Coverage Decreasing
|
||||
weather_type_28 = Sky Coverage Increasing
|
||||
weather_type_29 = Sky Unchanged
|
||||
weather_type_30 = Smoke Or Haze
|
||||
weather_type_31 = Snow
|
||||
weather_type_32 = Snow And Rain Showers
|
||||
weather_type_33 = Snow Showers
|
||||
weather_type_34 = Heavy Snow
|
||||
weather_type_35 = Light Snow
|
||||
weather_type_36 = Squalls
|
||||
weather_type_37 = Thunderstorm
|
||||
weather_type_38 = Thunderstorm Without Precipitation
|
||||
weather_type_39 = Diamond Dust
|
||||
weather_type_40 = Hail
|
||||
weather_type_41 = Overcast
|
||||
weather_type_42 = Partially cloudy
|
||||
weather_type_43 = Clear
|
||||
@@ -1,185 +0,0 @@
|
||||
locale = es_ES
|
||||
page_og_desc = Mantente en contacto con François durante sus aventuras a la montaña
|
||||
error_commit_db = Error SQL
|
||||
unknown_field = Campo "$0" desconocido
|
||||
impossible_value = Valor "$0" no es posible para campo "$1"
|
||||
|
||||
nav_back = Atrás
|
||||
|
||||
admin = Administración
|
||||
admin_config = Configuración
|
||||
admin_upload = Cargar
|
||||
save = Guardar
|
||||
admin_save_success = Guardado
|
||||
admin_create_success= Creado
|
||||
admin_delete_success= Eliminado
|
||||
no_auth = No autorización
|
||||
|
||||
track_main = Camino principal
|
||||
track_off-track = Variante
|
||||
track_hitchhiking = Autostop
|
||||
track_download = Descarga la ruta GPX
|
||||
|
||||
upload_media_title = Cargar fotos y videos
|
||||
upload_pos_title = Subir posición
|
||||
upload_mode_archived= El proyecto "$0" esta archivado. No se puede cargar
|
||||
upload_success = $0 ha sido subido
|
||||
upload_media_exist = La imagen $0 ya existe
|
||||
new_position = Nueva posición
|
||||
|
||||
post_message = Mensaje
|
||||
post_name = Nombre
|
||||
post_new_message = Mensaje nuevo
|
||||
and = y
|
||||
counter = No. $0
|
||||
send = Enviar
|
||||
|
||||
maps = Mapas de base
|
||||
map_satellite = Satélite
|
||||
map_otm = Open Topo Map
|
||||
map_ign_france = IGN (Francia)
|
||||
map_ign_spain = IGN (España)
|
||||
map_linz = LINZ
|
||||
map_usgs = USGS
|
||||
map_natgeo = National Geographic
|
||||
map_outdoors = Mapbox Topo
|
||||
|
||||
image = Foto
|
||||
images = Fotos
|
||||
image_taken = Foto tomada el $0
|
||||
video = Video
|
||||
video_taken = Video filmado el $0
|
||||
add_on = Agregado el $0
|
||||
click_watch = Haz clic para ver el video
|
||||
click_zoom = Haz clic para ampliar
|
||||
media_count = Media $0 de $1
|
||||
media_no_id = Falta el ID del sujeto
|
||||
media_comment_update= Comentario "$0" actualizado
|
||||
see_on_google = Ver la posición en Google Maps
|
||||
copy_to_clipboard = Copiar el enlace
|
||||
link_copied = ¡Enlace copiado!
|
||||
|
||||
city_time = Hora de $0
|
||||
local_time = $0 hora local
|
||||
your_time = $0 en tu zona horaria
|
||||
date_time = $0 a la $1
|
||||
time_zone = Huso horario
|
||||
|
||||
id_project = Proyecto ID
|
||||
project = Proyecto
|
||||
projects = Proyectos
|
||||
new_project = Nuevo proyecto
|
||||
update_project = Actualizar los mensajes del proyecto
|
||||
hikes = Senderos
|
||||
mode = Modo
|
||||
mode_previz = Proyecto en preparación
|
||||
mode_blog = Proyecto activo
|
||||
mode_histo = Proyecto archivado
|
||||
code_name = Nombre clave
|
||||
start = Inicio
|
||||
end = Fin
|
||||
feeds = Feeds
|
||||
id_feed = ID Feed
|
||||
ref_feed_id = ID Feed ref.
|
||||
new_feed = Nuevo feed
|
||||
id_spot = ID Spot
|
||||
name = Descripción
|
||||
status = Estado
|
||||
last_update = Última actualización de Spot
|
||||
ref_spot_id = ID Spot ref.
|
||||
model = Modelo
|
||||
delete = Borrar
|
||||
id_user = ID del usuario
|
||||
user_name = Nombre
|
||||
active_users = Usuarios activos
|
||||
language = Idioma
|
||||
clearance = Nivel de autorización
|
||||
toolbox = Herramientas
|
||||
|
||||
unit_d = D
|
||||
unit_day = Día
|
||||
unit_days = Días
|
||||
unit_hour = h
|
||||
|
||||
newsletter = Mantenerse en contacto
|
||||
nl_email_placeholder= nombre@email.com
|
||||
nl_invalid_email = Esto no parece una dirección de correo electrónico
|
||||
nl_subscribed_desc = Todo esta listo. Te enviaremos noticias frescas en cuanto las recibamos. Prometido...
|
||||
nl_unsubscribed_desc= Anade tu dirección de correo electrónico y te enviaremos la posicion actualizada de François tan pronto como la recibamos :)
|
||||
nl_email_exists = Esta dirección de correo electrónico ya está registrada. Puedes darte de baja haciendo clic en el botón de arriba.
|
||||
nl_subscribe = Suscribir
|
||||
nl_subscribed = ¡Gracias! Recibirás un correo electrónico de confirmación
|
||||
nl_unsubscribe = Desinscribirse
|
||||
nl_unsubscribed = Está hecho. ¡No más spam!
|
||||
nl_unknown_email = Dirección de email desconocida
|
||||
|
||||
email_unsubscribe = PD: ¿Demasiados correos electrónicos?
|
||||
email_unsub_btn = Desinscribirse
|
||||
|
||||
email_conf_subject = Confirmación
|
||||
conf_preheader = ¡Gracias por mantenerte en contacto!
|
||||
conf_thanks_sub = ¡Hecho!
|
||||
conf_body_para_1 = Os agradezco mucho que sigais mi proyecto, y os intereseis de la evolucion. Os prometo que os mantendré informados sobre mi progreso.
|
||||
conf_body_para_2 = Normalmente envío un mensaje una vez al día. Cuando voy a lugares guays, envío uno extra (cimas, ese tipo de cosas). Estoy usando una dispositivo GPS para enviar la señal, por lo que no necesito una red telefónica para que funcione. Sin embargo, puede haber ocasiones en las que presione el botón. Por lo tanto, no se preocupe si no recibe mensajes durante uno o dos días.
|
||||
conf_body_para_3 = Cuando añada fotos en la página, también deberás encontrarlas en este correo electrónico.
|
||||
conf_body_conclusion= ¡Nos vemos en el camino!
|
||||
conf_signature = --François
|
||||
|
||||
email_update_subject= Nueva posición recibida
|
||||
update_preheader = ¡Nueva posición!
|
||||
update_title = Mensaje
|
||||
update_latest_news = Últimas noticias:
|
||||
|
||||
distance = Distancia
|
||||
elevation = Elevación
|
||||
segment_length = Tamaño del segmento
|
||||
type = Tipo de sendero
|
||||
legend = Leyenda
|
||||
|
||||
credits_project = Proyecto Spotty
|
||||
credits_git = Repositorio de Git
|
||||
credits_license = bajo licencia GPLv3
|
||||
|
||||
weather_type_1 Nieve que sopla o a la deriva
|
||||
weather_type_2 Llovizna
|
||||
weather_type_3 Llovizna fuerte
|
||||
weather_type_4 Llovizna ligera
|
||||
weather_type_5 Fuerte llovizna / lluvia
|
||||
weather_type_6 Llovizna ligera / Lluvia
|
||||
weather_type_7 Tormenta de arena
|
||||
weather_type_8 Niebla
|
||||
weather_type_9 Llovizna helada / Lluvia helada
|
||||
weather_type_10 Fuerte llovizna helada / lluvia helada
|
||||
weather_type_11 Llovizna helada ligera / lluvia helada
|
||||
weather_type_12 Niebla helada
|
||||
weather_type_13 Lluvia helada intensa
|
||||
weather_type_14 Lluvia helada ligera
|
||||
weather_type_15 Nube de embudo / Tornado
|
||||
weather_type_16 Lluvias de granizo
|
||||
weather_type_17 Hielo
|
||||
weather_type_18 Rayo sin trueno
|
||||
weather_type_19 Niebla
|
||||
weather_type_20 Precipitación en las proximidades
|
||||
weather_type_21 Lluvia
|
||||
weather_type_22 Fuertes lluvias y nieve
|
||||
weather_type_23 Lluvia ligera y nieve
|
||||
weather_type_24 Lluvias
|
||||
weather_type_25 Lluvia Pesada
|
||||
weather_type_26 Lluvia ligera
|
||||
weather_type_27 Disminución de la cobertura del cielo
|
||||
weather_type_28 Aumento de la cobertura del cielo
|
||||
weather_type_29 Cielo sin cambios
|
||||
weather_type_30 Humo o neblina
|
||||
weather_type_31 Nieve
|
||||
weather_type_32 Lluvias y nieve
|
||||
weather_type_33 Duchas de nieve
|
||||
weather_type_34 Fuertes nevadas
|
||||
weather_type_35 Nieve ligera
|
||||
weather_type_36 Chubascos
|
||||
weather_type_37 Tormenta
|
||||
weather_type_38 Tormenta sin precipitaciones
|
||||
weather_type_39 Polvo de diamante
|
||||
weather_type_40 Granizo
|
||||
weather_type_41 Nublado
|
||||
weather_type_42 Parcialmente nublado
|
||||
weather_type_43 Claro
|
||||
@@ -1,185 +0,0 @@
|
||||
locale = fr_CH
|
||||
page_og_desc = Gardez le contact avec François lorsqu'il part sur les chemins
|
||||
error_commit_db = Error lors de la requête SQL
|
||||
unknown_field = Champ "$0" inconnu
|
||||
impossible_value = La valeur "$0" n'est pas possible pour le champ "$1"
|
||||
|
||||
nav_back = Retour
|
||||
|
||||
admin = Administration
|
||||
admin_config = Paramètres
|
||||
admin_upload = Uploader
|
||||
save = Sauvegarder
|
||||
admin_save_success = Sauvegardé
|
||||
admin_create_success= Créé
|
||||
admin_delete_success= Supprimé
|
||||
no_auth = Pas d'authorisation
|
||||
|
||||
track_main = Trajet principal
|
||||
track_off-track = Variante
|
||||
track_hitchhiking = Hors rando
|
||||
track_download = Télécharger la trace GPX
|
||||
|
||||
upload_media_title = Uploader photos & vidéos
|
||||
upload_pos_title = Position supplémentaire
|
||||
upload_mode_archived= Le projet "$0" a été archivé. Aucun upload possible
|
||||
upload_success = $0 a été uploadé
|
||||
upload_media_exist = l'image $0 existe déjà
|
||||
new_position = Nouvelle position
|
||||
|
||||
post_message = Message
|
||||
post_name = Nom
|
||||
post_new_message = Nouveau message
|
||||
and = et
|
||||
counter = N°$0
|
||||
send = Envoyer
|
||||
|
||||
maps = Fonds de carte
|
||||
map_satellite = Satellite
|
||||
map_otm = Open Topo Map
|
||||
map_ign_france = IGN (France)
|
||||
map_ign_spain = IGN (Espagne)
|
||||
map_linz = LINZ
|
||||
map_usgs = USGS
|
||||
map_natgeo = National Geographic
|
||||
map_outdoors = Mapbox Topo
|
||||
|
||||
image = Photo
|
||||
images = Photos
|
||||
image_taken = prise le $0
|
||||
video = Vidéo
|
||||
video_taken = filmée le $0
|
||||
add_on = ajoutée le $0
|
||||
click_watch = Click pour voir la vidéo
|
||||
click_zoom = Click pour zoomer
|
||||
media_count = Média $0 sur $1
|
||||
media_no_id = ID du média manquant
|
||||
media_comment_update= Commentaire du media "$0" mis-à-jour
|
||||
see_on_google = Voir la position sur Google Maps
|
||||
copy_to_clipboard = Copie le lien dans le presse-papier
|
||||
link_copied = Lien copié !
|
||||
|
||||
city_time = heure de $0
|
||||
local_time = $0 heure locale
|
||||
your_time = $0 dans votre fuseau horaire
|
||||
date_time = $0 à $1
|
||||
time_zone = Fuseau horaire
|
||||
|
||||
id_project = ID projet
|
||||
project = Projet
|
||||
projects = Projets
|
||||
new_project = Nouveau projet
|
||||
update_project = Mettre à jour les messages du projet
|
||||
hikes = Randonnées
|
||||
mode = Mode
|
||||
mode_previz = Projet en cours de préparation
|
||||
mode_blog = Projet actif
|
||||
mode_histo = Projet archivé
|
||||
code_name = Nom de code
|
||||
start = Départ
|
||||
end = Arrivée
|
||||
feeds = Feeds
|
||||
id_feed = ID Feed
|
||||
ref_feed_id = ID Feed ref.
|
||||
new_feed = Nouveau feed
|
||||
id_spot = ID Spot
|
||||
name = Description
|
||||
status = Statut
|
||||
last_update = Dernière vérification Spot
|
||||
ref_spot_id = ID Spot ref.
|
||||
model = Modèle
|
||||
delete = Supprimer
|
||||
id_user = ID Utilisateur
|
||||
user_name = Nom
|
||||
active_users = Utilisateurs actifs
|
||||
language = Langue
|
||||
clearance = Niveau d'autorisation
|
||||
toolbox = Boite à outils
|
||||
|
||||
unit_d = J
|
||||
unit_day = jour
|
||||
unit_days = jours
|
||||
unit_hour = h
|
||||
|
||||
newsletter = Rester en contact
|
||||
nl_email_placeholder= mon@email.com
|
||||
nl_invalid_email = Ceci ne ressemble pas à une adresse email
|
||||
nl_subscribed_desc = C'est tout bon. On t'envoie des nouvelles fraiches dès qu'on les reçoit. Parole de scout.
|
||||
nl_unsubscribed_desc= Ajoute ton adresse email et on t'enverra la nouvelle position de François dès qu'on la reçoit :)
|
||||
nl_email_exists = Cette adresse email est déjà enregistrée. Vous pouvez vous désinscrire en cliquant sur le bouton ci-dessus.
|
||||
nl_subscribe = S'abonner
|
||||
nl_subscribed = Merci ! Tu vas recevoir un email de confirmation très bientôt
|
||||
nl_unsubscribe = Se désinscrire
|
||||
nl_unsubscribed = C'est fait. Fini le spam!
|
||||
nl_unknown_email = Adresse email inconnue
|
||||
|
||||
email_unsubscribe = PS: Trop d'emails ?
|
||||
email_unsub_btn = Se désinscrire
|
||||
|
||||
email_conf_subject = Confirmation
|
||||
conf_preheader = Merci de rester en contact !
|
||||
conf_thanks_sub = C'est tout bon !
|
||||
conf_body_para_1 = C'est gentil de venir voir où j'en suis. Promis, je vous tiendrais au courant de mon avancée.
|
||||
conf_body_para_2 = En général, j'envoie un message une fois par jour. Lorsque je passe à des endroits sympas, j'en envoie un supplémentaire (ascension de sommets, ce genre de choses). J'utilise une balise GPS pour envoyer le signal, je n'ai donc pas besoin de réseau téléphonique pour que cela fonctionne. Cependant, il peut m'arriver d'appuyer sur le bouton. Donc pas de raison de s'inquiéter si vous ne recevez pas de messages pendant une journée ou deux.
|
||||
conf_body_para_3 = Si j'ai ajouté des photos sur le site récemment, vous devriez aussi les retrouver dans cet email.
|
||||
conf_body_conclusion= A bientôt sur les chemins !
|
||||
conf_signature = --François
|
||||
|
||||
email_update_subject= Nouvelle position reçue
|
||||
update_preheader = Nouvelle position !
|
||||
update_title = Message
|
||||
update_latest_news = Dernières nouvelles :
|
||||
|
||||
distance = Distance
|
||||
elevation = Dénivelé
|
||||
segment_length = Taille du segment
|
||||
type = Type de rando
|
||||
legend = Légende
|
||||
|
||||
credits_project = Projet Spotty
|
||||
credits_git = Dépôt Git
|
||||
credits_license = sous licence GPLv3
|
||||
|
||||
weather_type_1 = Poudrerie ou neige à la dérive
|
||||
weather_type_2 = Bruine
|
||||
weather_type_3 = Bruine lourde
|
||||
weather_type_4 = Bruine légère
|
||||
weather_type_5 = Forte bruine / pluie
|
||||
weather_type_6 = Légère bruine / pluie
|
||||
weather_type_7 = Tempête de poussière
|
||||
weather_type_8 = Brouillard
|
||||
weather_type_9 = Bruine verglaçante / Pluie verglaçante
|
||||
weather_type_10 = Forte bruine verglaçante / pluie verglaçante
|
||||
weather_type_11 = Légère bruine verglaçante / pluie verglaçante
|
||||
weather_type_12 = Brouillard verglaçant
|
||||
weather_type_13 = Forte pluie verglaçante
|
||||
weather_type_14 = Légère pluie verglaçante
|
||||
weather_type_15 = Nuage d'entonnoir / Tornade
|
||||
weather_type_16 = Douches de grêle
|
||||
weather_type_17 = La glace
|
||||
weather_type_18 = Foudre sans tonnerre
|
||||
weather_type_19 = Brouillard
|
||||
weather_type_20 = Précipitations à proximité
|
||||
weather_type_21 = Pluie
|
||||
weather_type_22 = Forte pluie et neige
|
||||
weather_type_23 = Légère pluie et neige
|
||||
weather_type_24 = Averses de pluie
|
||||
weather_type_25 = Forte pluie
|
||||
weather_type_26 = Pluie légère
|
||||
weather_type_27 = Couverture du ciel en baisse
|
||||
weather_type_28 = Augmentation de la couverture du ciel
|
||||
weather_type_29 = Ciel inchangé
|
||||
weather_type_30 = Fumée ou brume
|
||||
weather_type_31 = Neige
|
||||
weather_type_32 = Averses de neige et de pluie
|
||||
weather_type_33 = Douches de neige
|
||||
weather_type_34 = Beaucoup de neige
|
||||
weather_type_35 = Neige légère
|
||||
weather_type_36 = Grains
|
||||
weather_type_37 = Orage
|
||||
weather_type_38 = Orage sans précipitations
|
||||
weather_type_39 = La poussière de diamant
|
||||
weather_type_40 = Saluer
|
||||
weather_type_41 = Couvert
|
||||
weather_type_42 = Partiellement nuageux
|
||||
weather_type_43 = Clair
|
||||
@@ -60,6 +60,7 @@ class Email extends PhpObject {
|
||||
$oPHPMailer->setFrom(Settings::MAIL_FROM, 'Spotty');
|
||||
$oPHPMailer->addReplyTo(Settings::MAIL_FROM, 'Spotty');
|
||||
|
||||
$bSuccess = true;
|
||||
foreach($this->asDests as $asDest) {
|
||||
//Message
|
||||
$this->oTemplate->setLanguage($asDest['language'], Spot::DEFAULT_LANG);
|
||||
@@ -72,7 +73,7 @@ class Email extends PhpObject {
|
||||
$oPHPMailer->addCustomHeader('List-Unsubscribe-Post','List-Unsubscribe=One-Click');
|
||||
|
||||
//Email Content
|
||||
$this->oTemplate->setTag('timezone', 'lang:city_time', self::getTimeZoneCity($asDest['timezone']));
|
||||
$this->oTemplate->setTag('timezone', 'lang:time.city', self::getTimeZoneCity($asDest['timezone']));
|
||||
$sHtmlMessage = $this->oTemplate->getMask();
|
||||
$sPlainMessage = strip_tags(str_replace('<br />', "\n", $sHtmlMessage));
|
||||
|
||||
@@ -86,11 +87,10 @@ class Email extends PhpObject {
|
||||
|
||||
//Content
|
||||
$oPHPMailer->isHTML(true);
|
||||
$oPHPMailer->Subject = $this->oTemplate->getTranslator()->getTranslation($this->sTemplateName.'_subject');
|
||||
$oPHPMailer->Subject = $this->oTemplate->getTranslator()->getTranslation($this->sTemplateName.'.subject');
|
||||
$oPHPMailer->Body = $sHtmlMessage;
|
||||
$oPHPMailer->AltBody = $sPlainMessage;
|
||||
|
||||
$bSuccess = true;
|
||||
try {
|
||||
$bSuccess = $bSuccess && $oPHPMailer->send();
|
||||
}
|
||||
|
||||
@@ -52,10 +52,10 @@ class Media extends PhpObject {
|
||||
$asData = array();
|
||||
if($this->iMediaId > 0) {
|
||||
$bResult = $this->oDb->updateRow(self::MEDIA_TABLE, $this->iMediaId, array('comment'=>$sComment));
|
||||
if(!$bResult) $sError = 'error_commit_db';
|
||||
if(!$bResult) $sError = 'error.commit_db';
|
||||
else $asData = $this->getInfo();
|
||||
}
|
||||
else $sError = 'media_no_id';
|
||||
else $sError = 'media.no_id';
|
||||
|
||||
return Spot::getResult(($sError==''), $sError, $asData);
|
||||
}
|
||||
@@ -101,11 +101,11 @@ class Media extends PhpObject {
|
||||
$sError = '';
|
||||
$asParams = array();
|
||||
if(!$this->isProjectEditable() && $sMethod!='sync') {
|
||||
$sError = 'upload_mode_archived';
|
||||
$sError = 'upload.mode_archived';
|
||||
$asParams[] = $this->oProject->getProjectCodeName();
|
||||
}
|
||||
elseif($this->oDb->pingValue(self::MEDIA_TABLE, array('filename'=>$sMediaName)) && $sMethod!='sync') {
|
||||
$sError = 'upload_media_exist';
|
||||
$sError = 'upload.media.exists';
|
||||
$asParams[] = $sMediaName;
|
||||
}
|
||||
else {
|
||||
@@ -131,7 +131,7 @@ class Media extends PhpObject {
|
||||
if($sMethod=='sync') $iMediaId = $this->oDb->insertUpdateRow(self::MEDIA_TABLE, $asDbInfo, array('filename'));
|
||||
else $iMediaId = $this->oDb->insertRow(self::MEDIA_TABLE, $asDbInfo);
|
||||
|
||||
if(!$iMediaId) $sError = 'error_commit_db';
|
||||
if(!$iMediaId) $sError = 'error.commit_db';
|
||||
else {
|
||||
$this->setMediaId($iMediaId);
|
||||
$asParams = $this->getInfo(); //Creates thumbnail
|
||||
|
||||
30
lib/Spot.php
30
lib/Spot.php
@@ -166,7 +166,7 @@ class Spot extends Main
|
||||
public function getAppMainPage() {
|
||||
|
||||
//Cache Page List
|
||||
$asPages = array_diff($this->asMasks, array('email_update', 'email_conf'));
|
||||
$asPages = array_diff($this->asMasks, array('email.update', 'email.confirmation'));
|
||||
if(!$this->oUser->checkUserClearance(User::CLEARANCE_ADMIN)) {
|
||||
$asPages = array_diff($asPages, array('admin', 'upload'));
|
||||
}
|
||||
@@ -231,11 +231,12 @@ class Spot extends Main
|
||||
}
|
||||
|
||||
private function sendEmail() {
|
||||
$oEmail = new Email($this->asContext['serv_name'], 'email_update');
|
||||
$oEmail = new Email($this->asContext['serv_name'], 'email.update');
|
||||
$oEmail->setDestInfo($this->oUser->getActiveUsersInfo());
|
||||
|
||||
//Add Position
|
||||
$asLastMessage = array_shift($this->getSpotMessages(array($this->oProject->getLastMessageId($this->getFeedConstraints(Feed::MSG_TABLE)))));
|
||||
$asSpotMessages = $this->getSpotMessages(array($this->oProject->getLastMessageId($this->getFeedConstraints(Feed::MSG_TABLE))));
|
||||
$asLastMessage = array_shift($asSpotMessages);
|
||||
$oEmail->oTemplate->setTags($asLastMessage);
|
||||
$oEmail->oTemplate->setTag('date_time', 'time:'.$asLastMessage['unix_time'], 'd/m/Y, H:i');
|
||||
|
||||
@@ -326,8 +327,8 @@ class Spot extends Main
|
||||
$asUserInfo = $this->oUser->getUserInfo();
|
||||
|
||||
//Send Confirmation Email
|
||||
if($asResult['result'] && $asResult['desc']=='lang:nl_subscribed') {
|
||||
$oConfEmail = new Email($this->asContext['serv_name'], 'email_conf');
|
||||
if($asResult['result'] && $asResult['desc']=='lang:newsletter.subscribed') {
|
||||
$oConfEmail = new Email($this->asContext['serv_name'], 'email.confirmation');
|
||||
$oConfEmail->setDestInfo($asUserInfo);
|
||||
$oConfEmail->send();
|
||||
}
|
||||
@@ -516,7 +517,7 @@ class Spot extends Main
|
||||
|
||||
$asResult = array_merge($asResult, $asMarkers);
|
||||
}
|
||||
else $sDesc = 'mode_histo';
|
||||
else $sDesc = 'project.modes.histo';
|
||||
|
||||
return self::getJsonResult(true, $sDesc, $asResult);
|
||||
}
|
||||
@@ -588,6 +589,7 @@ class Spot extends Main
|
||||
);
|
||||
|
||||
//Replace Array Key with Item ID
|
||||
$asFeeds = array();
|
||||
foreach($asFeedAttrs as $sType=>$asFeedAttr) {
|
||||
foreach($asFeedAttr as $asFeed) {
|
||||
$asFeeds[$sType][$asFeed['id_'.$sType]] = $asFeed;
|
||||
@@ -621,7 +623,7 @@ class Spot extends Main
|
||||
|
||||
$this->oUser->updateNickname($sName);
|
||||
}
|
||||
else $sDesc = 'mode_histo';
|
||||
else $sDesc = 'project.modes.histo';
|
||||
|
||||
return self::getJsonResult(($iPostId > 0), $sDesc);
|
||||
}
|
||||
@@ -647,7 +649,7 @@ class Spot extends Main
|
||||
$bSuccess = $this->sendEmail();
|
||||
$sDesc = $bSuccess?'mail_sent':'mail_failure';
|
||||
}
|
||||
else $sDesc = 'error_commit_db';
|
||||
else $sDesc = 'error.commit_db';
|
||||
|
||||
return self::getJsonResult($bSuccess, $sDesc);
|
||||
}
|
||||
@@ -674,7 +676,7 @@ class Spot extends Main
|
||||
$sDesc = '';
|
||||
$asResult = array();
|
||||
|
||||
if($this->oDb->isId($sField) && $sValue <= 0) return self::getJsonResult(false, $this->oLang->getTranslation('impossible_value', [$sValue, $sField]));
|
||||
if($this->oDb->isId($sField) && $sValue <= 0) return self::getJsonResult(false, $this->oLang->getTranslation('error.impossible_value', [$sValue, $sField]));
|
||||
|
||||
switch($sType) {
|
||||
case 'project':
|
||||
@@ -693,7 +695,7 @@ class Spot extends Main
|
||||
$bSuccess = $oProject->setActivePeriod($sValue.' 23:59:59', 'to');
|
||||
break;
|
||||
default:
|
||||
$sDesc = $this->oLang->getTranslation('unknown_field', $sField);
|
||||
$sDesc = $this->oLang->getTranslation('error.unknown_field', $sField);
|
||||
}
|
||||
$asResult = $oProject->getProject();
|
||||
$asResult['active_from'] = substr($asResult['active_from'], 0, 10);
|
||||
@@ -712,7 +714,7 @@ class Spot extends Main
|
||||
$bSuccess = $oFeed->setProjectId($sValue);
|
||||
break;
|
||||
default:
|
||||
$sDesc = $this->oLang->getTranslation('unknown_field', $sField);
|
||||
$sDesc = $this->oLang->getTranslation('error.unknown_field', $sField);
|
||||
}
|
||||
$asResult = $oFeed->getFeed();
|
||||
break;
|
||||
@@ -724,12 +726,12 @@ class Spot extends Main
|
||||
$sDesc = $asReturnCode['desc'];
|
||||
break;
|
||||
default:
|
||||
$sDesc = $this->oLang->getTranslation('unknown_field', $sField);
|
||||
$sDesc = $this->oLang->getTranslation('error.unknown_field', $sField);
|
||||
}
|
||||
$asResult = $this->oUser->getActiveUserInfo($iId);
|
||||
break;
|
||||
}
|
||||
if(!$bSuccess && $sDesc=='') $sDesc = Mask::LANG_PREFIX.'error_commit_db';
|
||||
if(!$bSuccess && $sDesc=='') $sDesc = Mask::LANG_PREFIX.'error.commit_db';
|
||||
|
||||
return self::getJsonResult($bSuccess, $sDesc, array($sType=>array($asResult)));
|
||||
}
|
||||
@@ -837,7 +839,7 @@ class Spot extends Main
|
||||
|
||||
$sDate = $oDate->format('d/m/Y');
|
||||
$sTime = $oDate->format('H:i');
|
||||
return $this->oLang->getTranslation('date_time', array($sDate, $sTime));
|
||||
return $this->oLang->getTranslation('time.date_time', array($sDate, $sTime));
|
||||
}
|
||||
|
||||
public static function getTimeZoneDayOffset($iTime, $sLocalTimeZone) {
|
||||
|
||||
@@ -38,7 +38,7 @@ class Uploader extends UploadHandler
|
||||
|
||||
//Check project mode
|
||||
if(!$this->oMedia->isProjectEditable()) {
|
||||
$file->error = $this->get_error_message('upload_mode_archived', array($this->oMedia->getProjectCodeName()));
|
||||
$file->error = $this->get_error_message('upload.mode_archived', array($this->oMedia->getProjectCodeName()));
|
||||
$bResult = false;
|
||||
}
|
||||
|
||||
|
||||
16
lib/User.php
16
lib/User.php
@@ -107,7 +107,7 @@ class User extends PhpObject {
|
||||
|
||||
if($iUserId > 0) {
|
||||
//Just log user in
|
||||
$sDesc = 'lang:nl_email_exists';
|
||||
$sDesc = 'lang:newsletter.email_exists';
|
||||
$bSuccess = true;
|
||||
}
|
||||
else {
|
||||
@@ -118,9 +118,9 @@ class User extends PhpObject {
|
||||
array('email')
|
||||
);
|
||||
|
||||
if($iUserId==0) $sDesc = 'lang:error_commit_db';
|
||||
if($iUserId==0) $sDesc = 'lang:error.commit_db';
|
||||
else {
|
||||
$sDesc = 'lang:nl_subscribed';
|
||||
$sDesc = 'lang:newsletter.subscribed';
|
||||
$bSuccess = true;
|
||||
}
|
||||
}
|
||||
@@ -150,16 +150,16 @@ class User extends PhpObject {
|
||||
if($bSelf || $this->checkUserClearance(self::CLEARANCE_ADMIN)) {
|
||||
if($this->getUserId() > 0) {
|
||||
$iUserId = $this->oDb->updateRow(self::USER_TABLE, $iUserId, array('active' => self::USER_INACTIVE));
|
||||
if($iUserId==0) $sDesc = 'lang:error_commit_db';
|
||||
if($iUserId==0) $sDesc = 'lang:error.commit_db';
|
||||
else {
|
||||
$sDesc = 'lang:nl_unsubscribed';
|
||||
$sDesc = 'lang:newsletter.unsubscribed';
|
||||
if($bSelf) $this->updateCookie(-60 * 60); //Set Cookie in the past, deleting it
|
||||
$bSuccess = true;
|
||||
}
|
||||
}
|
||||
else $sDesc = 'lang:nl_unknown_email';
|
||||
else $sDesc = 'lang:newsletter.unknown_email';
|
||||
}
|
||||
else $sDesc = 'lang:no_auth';
|
||||
else $sDesc = 'lang:error.no_auth';
|
||||
|
||||
return Spot::getResult($bSuccess, $sDesc);
|
||||
}
|
||||
@@ -196,7 +196,7 @@ class User extends PhpObject {
|
||||
if(!in_array($iClearance, self::CLEARANCES)) $sDesc = 'Setting wrong clearance "'.$iClearance.'" to user ID "'.$iUserId.'"';
|
||||
else {
|
||||
$iUserId = $this->oDb->updateRow(self::USER_TABLE, $iUserId, array('clearance'=>$iClearance));
|
||||
if(!$iUserId) $sDesc = 'lang:error_commit_db';
|
||||
if(!$iUserId) $sDesc = 'lang:error.commit_db';
|
||||
else $bSuccess = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,30 +2,30 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
|
||||
<title>[#]lang:email_conf_subject[#]</title>
|
||||
<title>[#]lang:email.confirmation.subject[#]</title>
|
||||
</head>
|
||||
<body>
|
||||
<span style="color: transparent; display: none !important; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">[#]lang:conf_preheader[#]</span>
|
||||
<span style="color: transparent; display: none !important; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">[#]lang:email.confirmation.preheader[#]</span>
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;max-width:600px;">
|
||||
<tr>
|
||||
<td width="20%"><img src="[#]local_server[#]images/icons/mstile-144x144.png" width="90%" border="0" alt="logo" /></td>
|
||||
<td><h1>[#]lang:conf_thanks_sub[#]</h1></td>
|
||||
<td><h1>[#]lang:email.confirmation.thanks_subject[#]</h1></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p align="justify">[#]lang:conf_body_para_1[#]</p>
|
||||
<p align="justify">[#]lang:conf_body_para_2[#]</p>
|
||||
<p align="justify">[#]lang:conf_body_para_3[#]</p>
|
||||
<p align="justify">[#]lang:email.confirmation.body_1[#]</p>
|
||||
<p align="justify">[#]lang:email.confirmation.body_2[#]</p>
|
||||
<p align="justify">[#]lang:email.confirmation.body_3[#]</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p>[#]lang:conf_body_conclusion[#]<br />[#]lang:conf_signature[#]</p>
|
||||
<p>[#]lang:email.confirmation.conclusion[#]<br />[#]lang:email.confirmation.signature[#]</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p>[#]lang:email_unsubscribe[#] <a href="[#]unsubscribe_link[#]" target="_blank" rel="noopener">[#]lang:email_unsub_btn[#]</a></p>
|
||||
<p>[#]lang:email.unsubscribe[#] <a href="[#]unsubscribe_link[#]" target="_blank" rel="noopener">[#]lang:email.unsubscribe_button[#]</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -2,14 +2,14 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
|
||||
<title>[#]lang:email_update_subject[#]</title>
|
||||
<title>[#]lang:email.update.subject[#]</title>
|
||||
</head>
|
||||
<body>
|
||||
<span style="color: transparent; display: none !important; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">[#]lang:update_preheader[#]</span>
|
||||
<span style="color: transparent; display: none !important; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">[#]lang:email.update.preheader[#]</span>
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;max-width:600px;">
|
||||
<tr>
|
||||
<td width="20%"><img src="[#]local_server[#]images/icons/mstile-144x144.png" width="90%" border="0" alt="logo" /></td>
|
||||
<td><h1>[#]lang:update_title[#] [#]type[#] #[#]displayed_id[#]</h1></td>
|
||||
<td><h1>[#]lang:email.update.title[#] [#]type[#] #[#]displayed_id[#]</h1></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
@@ -22,7 +22,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<h2>[#]lang:update_latest_news[#]</h2>
|
||||
<h2>[#]lang:email.update.latest_news[#]</h2>
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%">
|
||||
<!-- [PART] news [START] -->
|
||||
<tr>
|
||||
@@ -39,7 +39,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p>[#]lang:email_unsubscribe[#] <a href="[#]unsubscribe_link[#]" target="_blank" rel="noopener">[#]lang:email_unsub_btn[#]</a></p>
|
||||
<p>[#]lang:email.unsubscribe[#] <a href="[#]unsubscribe_link[#]" target="_blank" rel="noopener">[#]lang:email.unsubscribe_button[#]</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -56,7 +56,7 @@ export default {
|
||||
for(const [iKey, oNewElem] of Object.entries(aoNewElems)) {
|
||||
oNewElem.type = sType;
|
||||
this.elems[sType][oNewElem.id] = oNewElem;
|
||||
this.addFeedback('success', this.lang.get('admin_create_success'), {'create':sType});
|
||||
this.addFeedback('success', this.l('admin.create_success'), {'create':sType});
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -71,7 +71,7 @@ export default {
|
||||
this.api.get('admin_delete', asInputs)
|
||||
.then((asData) => {
|
||||
delete this.elems[asInputs.type][asInputs.id];
|
||||
this.addFeedback('success', this.lang.get('admin_delete_success'), asInputs);
|
||||
this.addFeedback('success', this.l('admin.delete_success'), asInputs);
|
||||
})
|
||||
.catch((sError) => {
|
||||
this.addFeedback('error', sError, asInputs);
|
||||
@@ -93,7 +93,7 @@ export default {
|
||||
this.api.get('admin_set', asInputs)
|
||||
.then((asData) => {
|
||||
this.elems[oElem.type][oElem.id][oEvent.target.name] = sNewVal;
|
||||
this.addFeedback('success', this.lang.get('admin_save_success'), asInputs);
|
||||
this.addFeedback('success', this.l('admin.save_success'), asInputs);
|
||||
})
|
||||
.catch((sError) => {
|
||||
oEvent.target.value = sOldVal;
|
||||
@@ -115,19 +115,19 @@ export default {
|
||||
</script>
|
||||
<template>
|
||||
<div id="admin">
|
||||
<a name="back" class="button" href="#project"><SpotIcon :icon="'back'" :text="l('nav_back')" /></a>
|
||||
<h1>{{ l('projects') }}</h1>
|
||||
<div id="project_section">
|
||||
<a name="back" class="button" href="#project"><SpotIcon :icon="'back'" :text="l('action.back')" /></a>
|
||||
<h1>{{ l('project.plural') }}</h1>
|
||||
<div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ l('id_project') }}</th>
|
||||
<th>{{ l('project') }}</th>
|
||||
<th>{{ l('mode') }}</th>
|
||||
<th>{{ l('code_name') }}</th>
|
||||
<th>{{ l('start') }}</th>
|
||||
<th>{{ l('end') }}</th>
|
||||
<th>{{ l('delete') }}</th>
|
||||
<th>{{ l('project.id') }}</th>
|
||||
<th>{{ l('project.single') }}</th>
|
||||
<th>{{ l('project.mode') }}</th>
|
||||
<th>{{ l('project.code_name') }}</th>
|
||||
<th>{{ l('project.start') }}</th>
|
||||
<th>{{ l('project.end') }}</th>
|
||||
<th>{{ l('action.delete') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -142,21 +142,21 @@ export default {
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<SpotButton :classes="'new'" :text="l('new_project')" :icon="'new'" @click="createElem('project')" />
|
||||
<SpotButton :classes="'new'" :text="l('project.new')" :icon="'new'" @click="createElem('project')" />
|
||||
</div>
|
||||
<h1>{{ l('feeds') }}</h1>
|
||||
<div id="feed_section">
|
||||
<h1>{{ l('feed.plural') }}</h1>
|
||||
<div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ l('id_feed') }}</th>
|
||||
<th>{{ l('ref_feed_id') }}</th>
|
||||
<th>{{ l('id_spot') }}</th>
|
||||
<th>{{ l('id_project') }}</th>
|
||||
<th>{{ l('name') }}</th>
|
||||
<th>{{ l('status') }}</th>
|
||||
<th>{{ l('last_update') }}</th>
|
||||
<th>{{ l('delete') }}</th>
|
||||
<th>{{ l('feed.id') }}</th>
|
||||
<th>{{ l('feed.ref_id') }}</th>
|
||||
<th>{{ l('spot.id') }}</th>
|
||||
<th>{{ l('project.id') }}</th>
|
||||
<th>{{ l('feed.name') }}</th>
|
||||
<th>{{ l('feed.status') }}</th>
|
||||
<th>{{ l('feed.last_update') }}</th>
|
||||
<th>{{ l('action.delete') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -172,17 +172,17 @@ export default {
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<SpotButton :classes="'new'" :text="l('new_feed')" :icon="'new'" @click="createElem('feed')" />
|
||||
<SpotButton :classes="'new'" :text="l('feed.new')" :icon="'new'" @click="createElem('feed')" />
|
||||
</div>
|
||||
<h1>Spots</h1>
|
||||
<div id="spot_section">
|
||||
<h1>{{ l('spot.plural') }}</h1>
|
||||
<div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ l('id_spot') }}</th>
|
||||
<th>{{ l('ref_spot_id') }}</th>
|
||||
<th>{{ l('name') }}</th>
|
||||
<th>{{ l('model') }}</th>
|
||||
<th>{{ l('spot.id') }}</th>
|
||||
<th>{{ l('spot.ref_id') }}</th>
|
||||
<th>{{ l('spot.name') }}</th>
|
||||
<th>{{ l('spot.model') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -195,17 +195,17 @@ export default {
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h1>{{ l('active_users') }}</h1>
|
||||
<div id="user_section">
|
||||
<h1>{{ l('user.active') }}</h1>
|
||||
<div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ l('id_user') }}</th>
|
||||
<th>{{ l('user_name') }}</th>
|
||||
<th>{{ l('language') }}</th>
|
||||
<th>{{ l('time_zone') }}</th>
|
||||
<th>{{ l('clearance') }}</th>
|
||||
<th>{{ l('delete') }}</th>
|
||||
<th>{{ l('user.id') }}</th>
|
||||
<th>{{ l('user.name') }}</th>
|
||||
<th>{{ l('user.language') }}</th>
|
||||
<th>{{ l('time.zone') }}</th>
|
||||
<th>{{ l('user.clearance') }}</th>
|
||||
<th>{{ l('action.delete') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -220,9 +220,9 @@ export default {
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h1>{{ l('toolbox') }}</h1>
|
||||
<h1>{{ l('admin.toolbox') }}</h1>
|
||||
<div id="toolbox">
|
||||
<SpotButton :classes="'refresh'" :text="l('update_project')" :icon="'refresh'" @click="updateProject" />
|
||||
<SpotButton :classes="'refresh'" :text="l('project.update_messages')" :icon="'refresh'" @click="updateProject" />
|
||||
</div>
|
||||
<div id="feedback" class="feedback">
|
||||
<p v-for="feedback in feedbacks" :class="feedback.type">{{ feedback.msg }}</p>
|
||||
|
||||
@@ -142,8 +142,8 @@ export default {
|
||||
iTimeMinutes = Math.floor(iHours * 4) * 15; //Round down to the closest 15 minutes
|
||||
}
|
||||
return '~ '
|
||||
+(iTimeDays>0?(iTimeDays+(iTimeDays%2==0?'':'½')+' '+this.lang.get(iTimeDays>1?'unit_days':'unit_day')):'') //Days
|
||||
+((iTimeHours>0 || iTimeDays==0)?iTimeHours+this.lang.get('unit_hour'):'') //Hours
|
||||
+(iTimeDays>0?(iTimeDays+(iTimeDays%2==0?'':'½')+' '+this.lang.get(iTimeDays>1?'unit.days':'unit.day')):'') //Days
|
||||
+((iTimeHours>0 || iTimeDays==0)?iTimeHours+this.lang.get('unit.hour'):'') //Hours
|
||||
+((iTimeDays>0 || iTimeMinutes==0)?'':iTimeMinutes); //Minutes
|
||||
|
||||
},
|
||||
@@ -537,14 +537,14 @@ export default {
|
||||
getGoogleMapsLink(asInfo) {
|
||||
return $('<a>', {
|
||||
href:'https://www.google.com/maps/place/'+asInfo.lat_dms+'+'+asInfo.lon_dms+'/@'+asInfo.latitude+','+asInfo.longitude+',10z',
|
||||
title: this.lang.get('see_on_google'),
|
||||
title: this.lang.get('map.see_on_google'),
|
||||
target: '_blank',
|
||||
rel: 'noreferrer noopener'
|
||||
}).text(asInfo.lat_dms+' '+asInfo.lon_dms);
|
||||
},
|
||||
async manageSubs() {
|
||||
var regexEmail = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||
if(!regexEmail.test(this.user.email)) this.nlFeedbacks.push({type:'error', 'msg':this.lang.get('nl_invalid_email')});
|
||||
if(!regexEmail.test(this.user.email)) this.nlFeedbacks.push({type:'error', 'msg':this.lang.get('newsletter.invalid_email')});
|
||||
else {
|
||||
this.api.get(this.nlAction, {'email': this.user.email, 'name': this.user.name})
|
||||
.then((asUser, sDesc) => {
|
||||
@@ -656,19 +656,19 @@ export default {
|
||||
<div class="settings-header">
|
||||
<div class="logo"><img width="289" height="72" src="images/logo_black.png" alt="Spotty" /></div>
|
||||
<div id="last_update" v-if="this.currProject.mode == this.consts.modes.blog && lastUpdate.unix_time > 0">
|
||||
<p><span><img src="images/spot-logo-only.svg" alt="" /></span><abbr :title="lastUpdate.formatted_time">{{ lang.get('last_update')+' '+lastUpdate.relative_time }}</abbr></p>
|
||||
<p><span><img src="images/spot-logo-only.svg" alt="" /></span><abbr :title="lastUpdate.formatted_time">{{ lang.get('feed.last_update')+' '+lastUpdate.relative_time }}</abbr></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-sections">
|
||||
<Simplebar id="settings-sections-scrollbox">
|
||||
<div class="settings-section">
|
||||
<h1><SpotIcon :icon="'project'" fixed-width :text="lang.get('hikes')" /></h1>
|
||||
<h1><SpotIcon :icon="'project'" fixed-width :text="lang.get('project.hikes')" /></h1>
|
||||
<div class="settings-section-body">
|
||||
<div class="radio" v-for="project in projects" :key="'project-'+project.id">
|
||||
<input type="radio" :id="'project-'+project.id" :value="project.codename" v-model="$parent.hash.items[0]" />
|
||||
<label :for="'project-'+project.id">
|
||||
<span>{{ project.name }}</span>
|
||||
<a class="download" :href="project.gpxfilepath" :title="lang.get('track_download')" @click.stop="()=>{}">
|
||||
<a class="download" :href="project.gpxfilepath" :title="lang.get('track.download')" @click.stop="()=>{}">
|
||||
<SpotIcon :icon="'download'" margin="left" />
|
||||
</a>
|
||||
</label>
|
||||
@@ -676,40 +676,40 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-section">
|
||||
<h1><SpotIcon :icon="'map'" fixed-width :text="lang.get('maps')" /></h1>
|
||||
<h1><SpotIcon :icon="'map'" fixed-width :text="lang.get('map.title')" /></h1>
|
||||
<div class="settings-section-body">
|
||||
<div class="radio" v-for="bm in baseMaps" :key="'map-'+bm.id_map">
|
||||
<input type="radio" :id="'map-'+bm.id_map" :value="bm.codename" v-model="baseMap" />
|
||||
<label :for="'map-'+bm.id_map">{{ lang.get('map_'+bm.codename) }}</label>
|
||||
<label :for="'map-'+bm.id_map">{{ lang.get('map.'+bm.codename) }}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-section newsletter">
|
||||
<h1><SpotIcon :icon="'newsletter'" fixed-width :text="lang.get('newsletter')" /></h1>
|
||||
<h1><SpotIcon :icon="'newsletter'" fixed-width :text="lang.get('newsletter.title')" /></h1>
|
||||
<div class="newsletter-form">
|
||||
<input type="email" name="email" id="email" :placeholder="lang.get('nl_email_placeholder')" v-model="user.email" :disabled="nlLoading || subscribed" />
|
||||
<SpotButton id="nl_btn" :classes="nlClasses" :title="lang.get('nl_'+nlAction)" :icon="nlAction" @click="manageSubs" />
|
||||
<input type="email" name="email" id="email" :placeholder="lang.get('newsletter.email_placeholder')" v-model="user.email" :disabled="nlLoading || subscribed" />
|
||||
<SpotButton id="nl_btn" :classes="nlClasses" :title="lang.get('newsletter.'+nlAction)" :icon="nlAction" @click="manageSubs" />
|
||||
</div>
|
||||
<div id="settings-feedback" class="feedback">
|
||||
<p v-for="feedback in nlFeedbacks" :class="feedback.type">
|
||||
<SpotIcon :icon="feedback.type" :text="feedback.msg" />
|
||||
</p>
|
||||
</div>
|
||||
{{ lang.get(subscribed?'nl_subscribed_desc':'nl_unsubscribed_desc') }}
|
||||
{{ lang.get('newsletter.'+(subscribed?'subscribed':'unsubscribed')+'_desc') }}
|
||||
</div>
|
||||
<div class="settings-section admin" v-if="user.hasClearance(consts.clearances.admin)">
|
||||
<h1><SpotIcon :icon="'admin'" fixed-width :text="lang.get('admin')" /></h1>
|
||||
<h1><SpotIcon :icon="'admin'" fixed-width :text="lang.get('admin.title')" /></h1>
|
||||
<div class="admin-actions">
|
||||
<a class="button" href="#admin"><SpotIcon :icon="'config'" :text="lang.get('admin_config')" /></a>
|
||||
<a class="button" href="#upload"><SpotIcon :icon="'upload'" :text="lang.get('admin_upload')" /></a>
|
||||
<a class="button" href="#admin"><SpotIcon :icon="'config'" :text="lang.get('admin.config')" /></a>
|
||||
<a class="button" href="#upload"><SpotIcon :icon="'upload'" :text="lang.get('admin.upload')" /></a>
|
||||
</div>
|
||||
</div>
|
||||
</Simplebar>
|
||||
</div>
|
||||
<div class="settings-footer">
|
||||
<a href="https://git.lutran.fr/franzz/spot" :title="lang.get('credits_git')" target="_blank" rel="noopener">
|
||||
<SpotIcon :icon="'credits'" :text="lang.get('credits_project')" />
|
||||
</a> {{ lang.get('credits_license') }}</div>
|
||||
<a href="https://git.lutran.fr/franzz/spot" :title="lang.get('credits.git')" target="_blank" rel="noopener">
|
||||
<SpotIcon :icon="'credits'" :text="lang.get('credits.project')" />
|
||||
</a> {{ lang.get('credits.license') }}</div>
|
||||
</div>
|
||||
<div :class="'map-control map-control-icon settings-control map-control-'+(isMobile()?'bottom':'top')" @click="toggleSettingsPanel">
|
||||
<SpotIcon :icon="settingsPanelOpen?'prev':'menu'" />
|
||||
@@ -717,7 +717,7 @@ export default {
|
||||
<div v-if="!isMobile()" id="legend" class="map-control settings-control map-control-bottom">
|
||||
<div v-for="(color, hikeType) in hikes.colors" class="track">
|
||||
<span class="line" :style="'background-color:'+color+'; height:'+hikes.width+'px;'"></span>
|
||||
<span class="desc">{{ lang.get('track_'+hikeType) }}</span>
|
||||
<span class="desc">{{ lang.get('track.'+hikeType) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="title" :class="'map-control settings-control map-control-'+(isMobile()?'bottom':'top')">
|
||||
@@ -728,7 +728,7 @@ export default {
|
||||
<Simplebar id="feed-panel" class="map-panel" ref="feedSimpleBar">
|
||||
<div id="feed-header">
|
||||
<ProjectPost v-if="modeHisto" :options="{type: 'archived', headerless: true}" />
|
||||
<ProjectPost v-else :options="{type: 'poster', relative_time: lang.get('post_new_message')}" />
|
||||
<ProjectPost v-else :options="{type: 'poster', relative_time: lang.get('post.new_message')}" />
|
||||
</div>
|
||||
<div id="feed-posts">
|
||||
<ProjectPost v-for="post in posts" :options="post" ref="posts" />
|
||||
|
||||
@@ -10,7 +10,7 @@ export default {
|
||||
<template>
|
||||
<a
|
||||
:href="'https://www.google.com/maps/place/'+options.lat_dms+'+'+options.lon_dms+'/@'+options.latitude+','+options.longitude+',10z'"
|
||||
:title="lang.get('see_on_google')"
|
||||
:title="lang.get('map.see_on_google')"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>{{ options.lat_dms+' '+options.lon_dms }}</a>
|
||||
|
||||
@@ -47,7 +47,7 @@ export default {
|
||||
:src="options.thumb_path"
|
||||
:width="options.width"
|
||||
:height="options.height"
|
||||
:title="lang.get((options.subtype == 'video')?'click_watch':'click_zoom')"
|
||||
:title="lang.get((options.subtype == 'video')?'media.click_watch':'media.click_zoom')"
|
||||
class="clickable"
|
||||
/>
|
||||
<span class="drill-icon"><spotIcon :icon="'drill-'+options.subtype" /></span>
|
||||
|
||||
@@ -31,7 +31,7 @@ export default {
|
||||
<div :class="'info-window '+type">
|
||||
<div class="header" v-if="type=='message'">
|
||||
<h1>
|
||||
<spotIcon :icon="'message'" size="lg" :text="lang.get('post_message')+' '+lang.get('counter', options.displayed_id)" />
|
||||
<spotIcon :icon="'message'" size="lg" :text="lang.get('feed.counter', options.displayed_id)" />
|
||||
<span class="message-type">({{ options.type }})</span>
|
||||
</h1>
|
||||
<div class="separator"></div>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
absTimeLocal: this.options.formatted_time_local,
|
||||
timeDiff: (this.options.formatted_time && this.options.formatted_time_local != this.options.formatted_time),
|
||||
anchorVisible: ['message', 'media', 'post'].includes(this.options.type),
|
||||
anchorTitle: this.lang.get('copy_to_clipboard'),
|
||||
anchorTitle: this.lang.get('post.copy_to_clipboard'),
|
||||
anchorIcon: 'link',
|
||||
popupRequested: false,
|
||||
mouseOverDrill: false,
|
||||
@@ -50,7 +50,7 @@
|
||||
return this.options.subtype || this.options.type;
|
||||
},
|
||||
displayedId() {
|
||||
return this.options.displayed_id?(this.lang.get('counter', this.options.displayed_id)):'';
|
||||
return this.options.displayed_id?(this.lang.get('feed.counter', this.options.displayed_id)):'';
|
||||
},
|
||||
drillMainIcon() {
|
||||
return this.mouseOverDrill?'drill-message':'marker';
|
||||
@@ -77,10 +77,10 @@
|
||||
methods: {
|
||||
copyAnchor() {
|
||||
copyTextToClipboard(this.consts.server+this.anchorLink);
|
||||
this.anchorTitle = this.lang.get('link_copied');
|
||||
this.anchorTitle = this.lang.get('post.link_copied');
|
||||
this.anchorIcon = 'copied';
|
||||
setTimeout(()=>{ //TODO animation
|
||||
this.anchorTitle = this.lang.get('copy_to_clipboard');
|
||||
this.anchorTitle = this.lang.get('post.copy_to_clipboard');
|
||||
this.anchorIcon = 'link';
|
||||
}, 5000);
|
||||
},
|
||||
@@ -152,9 +152,9 @@
|
||||
<spotIcon :icon="anchorIcon" margin="left" />
|
||||
</a>
|
||||
</div>
|
||||
<div class="time" @mouseleave="mouseOverHeader = false" @mouseover="mouseOverHeader = true" :title="timeDiff?lang.get('local_time', absTimeLocal):''">
|
||||
<div class="time" @mouseleave="mouseOverHeader = false" @mouseover="mouseOverHeader = true" :title="timeDiff?lang.get('time.local', absTimeLocal):''">
|
||||
<Transition name="fade" mode="out-in">
|
||||
<span v-if="mouseOverHeader">{{ timeDiff?lang.get('your_time', absTime):absTime }}</span>
|
||||
<span v-if="mouseOverHeader">{{ timeDiff?lang.get('time.user', absTime):absTime }}</span>
|
||||
<span v-else>{{ relTime }}</span>
|
||||
</Transition>
|
||||
</div>
|
||||
@@ -165,7 +165,7 @@
|
||||
<span v-if="options.weather_icon && options.weather_icon!='unknown'" class="weather clickable" :title="lang.get(options.weather_cond)">
|
||||
<spotIcon :icon="options.weather_icon" :text="Math.round(options.weather_temp)+'°C'" text-classes="temperature" />
|
||||
</span>
|
||||
<img class="staticmap clickable" :title="lang.get('click_zoom')" :src="options.static_img_url" />
|
||||
<img class="staticmap clickable" :title="lang.get('media.click_zoom')" :src="options.static_img_url" />
|
||||
<spotIconStack :mainClasses="'message drill-icon'" :iconMain="drillMainIcon" :iconSub="'footprint'" :icon-sub-transform="'rotate-270'" />
|
||||
<div class="comment">
|
||||
<p>
|
||||
@@ -190,15 +190,15 @@
|
||||
</p>
|
||||
</div>
|
||||
<div v-else-if="options.type == 'poster'" class="poster-form">
|
||||
<textarea ref="post" name="post" :placeholder="lang.get('post_message')" class="autoExpand" rows="1" v-model="postMessage"></textarea>
|
||||
<textarea ref="post" name="post" :placeholder="lang.get('post.message')" class="autoExpand" rows="1" v-model="postMessage"></textarea>
|
||||
<div class="poster-actions">
|
||||
<input type="text" name="name" :placeholder="lang.get('post_name')" v-model="user.name" />
|
||||
<spotButton name="submit" :aria-label="lang.get('send')" :title="lang.get('send')" :icon="'send'" @click="send()" :iconClasses="sending?'flicker':''" />
|
||||
<input type="text" name="name" :placeholder="lang.get('post.name')" v-model="user.name" />
|
||||
<spotButton name="submit" :aria-label="lang.get('action.send')" :title="lang.get('action.send')" :icon="'send'" @click="send()" :iconClasses="sending?'flicker':''" />
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="options.type == 'archived'">
|
||||
<p><spotIcon :icon="'success'" /></p>
|
||||
<p>{{ lang.get('mode_histo') }}</p>
|
||||
<p>{{ lang.get('project.modes.histo') }}</p>
|
||||
</div>
|
||||
<div v-else-if="options.type == 'loading'">
|
||||
<p class="flicker"><spotIcon :icon="'post'" /></p>
|
||||
|
||||
@@ -16,7 +16,7 @@ export default {
|
||||
inject: ['lang'],
|
||||
computed: {
|
||||
title() {
|
||||
if(this.localTime != this.siteTime) return this.lang.get('your_time', this.siteTime.slice(-5)) + ((this.offset != '0')?' ('+this.lang.get('unit_d')+this.offset+')':'');
|
||||
if(this.localTime != this.siteTime) return this.lang.get('time.user', this.siteTime.slice(-5)) + ((this.offset != '0')?' ('+this.lang.get('unit.day_short')+this.offset+')':'');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
if(!this.project.editable) {
|
||||
this.logs = [this.lang.get('upload_mode_archived', [this.project.name])];
|
||||
this.logs = [this.lang.get('upload.mode_archived', [this.project.name])];
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ export default {
|
||||
const uploadedFiles = response?.body?.files || [];
|
||||
uploadedFiles.forEach((uploadedFile) => {
|
||||
const hasError = Object.prototype.hasOwnProperty.call(uploadedFile, 'error');
|
||||
this.logs.push(hasError ? uploadedFile.error : this.lang.get('upload_success', [uploadedFile.name]));
|
||||
this.logs.push(hasError ? uploadedFile.error : this.lang.get('upload.success', [uploadedFile.name]));
|
||||
if(!hasError) this.files.push({...uploadedFile, content: ''});
|
||||
});
|
||||
});
|
||||
@@ -89,7 +89,7 @@ export default {
|
||||
id: oFile.id,
|
||||
content: oFile.content
|
||||
})
|
||||
.then((asData) => {this.logs.push(this.lang.get('media_comment_update', asData.filename));})
|
||||
.then((asData) => {this.logs.push(this.lang.get('media.comment_update', asData.filename));})
|
||||
.catch((sMsgId) => {this.logs.push(this.lang.get(sMsgId));});
|
||||
},
|
||||
addPosition() {
|
||||
@@ -118,8 +118,8 @@ export default {
|
||||
</script>
|
||||
<template>
|
||||
<div id="upload">
|
||||
<a name="back" class="button" href="#project"><SpotIcon :icon="'back'" :text="lang.get('nav_back')" /></a>
|
||||
<h1>{{ lang.get('upload_media_title') }}</h1>
|
||||
<a name="back" class="button" href="#project"><SpotIcon :icon="'back'" :text="lang.get('action.back')" /></a>
|
||||
<h1>{{ lang.get('upload.media.title') }}</h1>
|
||||
<h2>{{ this.project.name }}</h2>
|
||||
<div class="section" v-if="project.editable">
|
||||
<input id="fileupload" type="file" name="files[]" multiple accept=".gif,.jpg,.jpeg,.png,.mov,.mp4" @change="onFileChange" />
|
||||
@@ -132,12 +132,12 @@ export default {
|
||||
<div class="form">
|
||||
<input class="content" name="content" type="text" v-model="file.content" />
|
||||
<input class="id" name="id" type="hidden" :value="file.id" />
|
||||
<SpotButton :classes="'save'" :icon="'save'" :text="lang.get('save')" @click="addComment(file)" />
|
||||
<SpotButton :classes="'save'" :icon="'save'" :text="lang.get('action.save')" @click="addComment(file)" />
|
||||
</div>
|
||||
</div>
|
||||
<h1>{{ lang.get('upload_pos_title') }}</h1>
|
||||
<h1>{{ lang.get('upload.position.title') }}</h1>
|
||||
<div class="section location">
|
||||
<SpotButton :icon="'message'" :text="lang.get('new_position')" @click="addPosition()" />
|
||||
<SpotButton :icon="'message'" :text="lang.get('upload.position.new')" @click="addPosition()" />
|
||||
</div>
|
||||
<div class="section logs" v-if="logs.length > 0">
|
||||
<p class="log" v-for="log in logs">{{ log }}.</p>
|
||||
|
||||
33
src/masks/email.confirmation.html
Normal file
33
src/masks/email.confirmation.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
|
||||
<title>[#]lang:email.confirmation.subject[#]</title>
|
||||
</head>
|
||||
<body>
|
||||
<span style="color: transparent; display: none !important; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">[#]lang:email.confirmation.preheader[#]</span>
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;max-width:600px;">
|
||||
<tr>
|
||||
<td width="20%"><img src="[#]local_server[#]images/icons/mstile-144x144.png" width="90%" border="0" alt="logo" /></td>
|
||||
<td><h1>[#]lang:email.confirmation.thanks_subject[#]</h1></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p align="justify">[#]lang:email.confirmation.body_1[#]</p>
|
||||
<p align="justify">[#]lang:email.confirmation.body_2[#]</p>
|
||||
<p align="justify">[#]lang:email.confirmation.body_3[#]</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p>[#]lang:email.confirmation.conclusion[#]<br />[#]lang:email.confirmation.signature[#]</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p>[#]lang:email.unsubscribe[#] <a href="[#]unsubscribe_link[#]" target="_blank" rel="noopener">[#]lang:email.unsubscribe_button[#]</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
47
src/masks/email.update.html
Normal file
47
src/masks/email.update.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
|
||||
<title>[#]lang:email.update.subject[#]</title>
|
||||
</head>
|
||||
<body>
|
||||
<span style="color: transparent; display: none !important; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">[#]lang:email.update.preheader[#]</span>
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;max-width:600px;">
|
||||
<tr>
|
||||
<td width="20%"><img src="[#]local_server[#]images/icons/mstile-144x144.png" width="90%" border="0" alt="logo" /></td>
|
||||
<td><h1>[#]lang:email.update.title[#] [#]type[#] #[#]displayed_id[#]</h1></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<div style="background-color:#6dff58;color:#326526;border-radius:3px;padding:1rem;margin-top:1rem;display:inline-block;box-shadow: 2px 2px 3px 0px rgba(0,0,0,.5);">
|
||||
<a href="[#]local_server[#]" target="_blank" rel="noopener"><img style="border-radius:3px;" src="[#]marker_img_url[#]" alt="position" /></a>
|
||||
<br />[#]lat_dms[#] [#]lon_dms[#]
|
||||
<br />[#]date_time[#] ([#]timezone[#])
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<h2>[#]lang:email.update.latest_news[#]</h2>
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%">
|
||||
<!-- [PART] news [START] -->
|
||||
<tr>
|
||||
<td>
|
||||
<a href="[#]local_server[#]#project-[#]project[#]-[#]type[#]-[#]id[#]" target="_blank" rel="noopener" style="text-decoration:none;background-color:#EEE;color:#333;margin-bottom:1rem;border-radius:3px;padding:5%;display:inline-block;width:90%;box-shadow: 2px 2px 3px 0px rgba(0,0,0,.5);">
|
||||
<!-- [PART] media [START] --><img src="[#]local_server[#][#]thumb_path[#]" style="max-height:200px;image-orientation:from-image;" /><br /><span>[#]comment[#]</span><!-- [PART] media [END] -->
|
||||
<!-- [PART] post [START] --><span>[#]content[#]</span><br /><span style="margin-top:0.5em;float:right;">--[#]formatted_name[#]</span><!-- [PART] post [END] -->
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- [PART] news [END] -->
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<p>[#]lang:email.unsubscribe[#] <a href="[#]unsubscribe_link[#]" target="_blank" rel="noopener">[#]lang:email.unsubscribe_button[#]</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -3,13 +3,13 @@
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="[#]lang:page_og_desc[#]">
|
||||
<meta name="description" content="[#]lang:meta.page_og_desc[#]">
|
||||
<meta property="og:title" content="Spotty" />
|
||||
<meta property="og:description" content="[#]lang:page_og_desc[#]" />
|
||||
<meta property="og:description" content="[#]lang:meta.page_og_desc[#]" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="[#]server[#]" />
|
||||
<meta property="og:image" content="images/ogp.png" />
|
||||
<meta property="og:locale" content="[#]lang:locale[#]" />
|
||||
<meta property="og:locale" content="[#]lang:meta.locale[#]" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="images/icons/apple-touch-icon.png?v=GvmqYyKwbb">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="images/icons/favicon-32x32.png?v=GvmqYyKwbb">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="images/icons/favicon-16x16.png?v=GvmqYyKwbb">
|
||||
|
||||
Reference in New Issue
Block a user