From 9556bf4e60b75c542f67e3adcfddb2aeb9c25240 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Sun, 5 Aug 2018 09:36:18 +0200 Subject: [PATCH 01/51] New rest methods (subs-union, falsePositive) for mobile --- imports/api/FalsePositives/methods.js | 45 +++++++++++--------- imports/api/Fires/server/publications.js | 10 ++++- imports/api/Rest/Rest.js | 53 +++++++++++++++++++++++- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/imports/api/FalsePositives/methods.js b/imports/api/FalsePositives/methods.js index 7aa4ef1..85005ba 100644 --- a/imports/api/FalsePositives/methods.js +++ b/imports/api/FalsePositives/methods.js @@ -6,6 +6,29 @@ import FalsePositiveTypes from './FalsePositiveTypes'; import Fires from '../Fires/Fires'; import rateLimit from '../../modules/rate-limit'; +export function upsertFalsePositive(keyType, owner, fire) { + const fireType = fire.type; + if (fireType === 'vecinal') { + throw new Meteor.Error('500', 'No se puede marcar este tipo de fuego'); + } + const date = new Date(); + const formated = moment(date).format('YYYYMMDD'); + try { + const set = { + owner, + type: keyType, + when: date, + whendateformat: formated, + fireId: fire._id, + geo: fire.ourid + }; + return FalsePositives.upsert({ geo: fire.ourid, owner }, { $set: set }, { multi: false, upsert: true }); + } catch (exception) { + console.log(exception); + throw new Meteor.Error('500', exception); + } +} + Meteor.methods({ 'falsePositives.insert': function falsePositivesInsert(fireId, keyType) { check(fireId, Meteor.Collection.ObjectID); @@ -17,27 +40,9 @@ Meteor.methods({ } check(this.userId, String); const fire = Fires.findOne(fireId); + const owner = this.userId; if (fire) { - const fireType = fire.type; - if (fireType === 'vecinal') { - throw new Meteor.Error('500', 'No se puede marcar este tipo de fuego'); - } - const date = new Date(); - const formated = moment(date).format('YYYYMMDD'); - try { - const set = { - owner: this.userId, - type: keyType, - when: date, - whendateformat: formated, - fireId, - geo: fire.ourid - }; - return FalsePositives.upsert({ geo: fire.ourid, owner: this.userId }, { $set: set }, { multi: false, upsert: true }); - } catch (exception) { - console.log(exception); - throw new Meteor.Error('500', exception); - } + upsertFalsePositive(keyType, owner, fire); } else { throw new Meteor.Error('500', 'Fuego no encontrado'); } diff --git a/imports/api/Fires/server/publications.js b/imports/api/Fires/server/publications.js index fe315b0..2cce7b7 100644 --- a/imports/api/Fires/server/publications.js +++ b/imports/api/Fires/server/publications.js @@ -139,7 +139,7 @@ function logUrl(fireEnc, params) { ravenLogger.log(message); } -Meteor.publish('fireFromHash', function fireFromHash(fireEnc, params) { +export function fireFromHash(fireEnc, params) { check(fireEnc, String); check(params, Object); try { @@ -163,11 +163,17 @@ Meteor.publish('fireFromHash', function fireFromHash(fireEnc, params) { FiresCollection.schema.validate(unsealedFix); return findOrCreateFire(unsealedFix); /* console.log(`fires: ${fire.count()}`); - * return fire; */ + * return fire; */ } catch (e) { console.warn(e); logUrl(fireEnc, params); return this.ready(); } +} + +Meteor.publish('fireFromHash', function fireFromHashFunc(fireEnc, params) { + check(fireEnc, String); + check(params, Object); + return fireFromHash(fireEnc, params); }); diff --git a/imports/api/Rest/Rest.js b/imports/api/Rest/Rest.js index a5296ae..fec971d 100644 --- a/imports/api/Rest/Rest.js +++ b/imports/api/Rest/Rest.js @@ -9,6 +9,7 @@ import SiteSettings from '/imports/api/SiteSettings/SiteSettings'; import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires'; import { countRealFires } from '/imports/api/ActiveFires/server/countFires'; import { whichAreFalsePositives, firesUnion } from '/imports/api/FalsePositives/server/publications'; +import { fireFromHash } from '/imports/api/Fires/server/publications.js'; import FalsePositives from '/imports/api/FalsePositives/FalsePositives'; import Industries from '/imports/api/Industries/Industries'; import Subscriptions from '/imports/api/Subscriptions/Subscriptions'; @@ -16,7 +17,7 @@ import jsend from 'jsend'; import { Random } from 'meteor/random'; import { subscriptionsInsert } from '/imports/api/Subscriptions/methods.js'; import { Mongo } from 'meteor/mongo'; - +import { upsertFalsePositive } from '/imports/api/FalsePositives/methods.js'; const debug = false; const uptime = new Date(); @@ -394,4 +395,54 @@ if (!Meteor.settings.private.internalApiToken) { return jsend.success({ count: toRemove }); } }); + + apiV1.addRoute('status/subs-public-union/:token', { authRequired: false }, { + get: function get() { + const { token } = this.urlParams; + try { + check(token, String); + } catch (e) { + return defaultFailParams(e); + } + + const failed = checkAuthToken(token); + if (failed) return failed; + + const currentUnion = SiteSettings.findOne({ name: 'subs-public-union' }); + const userSubsBounds = SiteSettings.findOne({ name: 'subs-public-union-bounds' }); + + return jsend.success({ union: currentUnion, bounds: userSubsBounds }); + } + }); + + apiV1.addRoute('mobile/falsepositive', { authRequired: false }, { + post: function post() { + const { + token, + mobileToken, + sealed, + type + } = this.bodyParams; + try { + check(token, String); + check(mobileToken, String); + check(sealed, String); + check(type, String); + } catch (e) { + if (debug) console.log(e); + return defaultFailParams(e); + } + + const failed = checkAuthToken(token); + if (failed) return failed; + + const user = Meteor.users.findOne({ fireBaseToken: mobileToken }); + if (!user) return failMsg('User not found'); + + // TODO + const fire = fireFromHash(sealed, {}); + const result = upsertFalsePositive(type, user._id, fire); + return jsend.success({ upsert: result }); + } + }); } From 5429dfbc045452dcbf806164246c1a5756493030 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Sun, 5 Aug 2018 10:44:17 +0200 Subject: [PATCH 02/51] bind publish --- imports/api/Fires/server/publications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/api/Fires/server/publications.js b/imports/api/Fires/server/publications.js index 2cce7b7..03d95c3 100644 --- a/imports/api/Fires/server/publications.js +++ b/imports/api/Fires/server/publications.js @@ -175,5 +175,5 @@ export function fireFromHash(fireEnc, params) { Meteor.publish('fireFromHash', function fireFromHashFunc(fireEnc, params) { check(fireEnc, String); check(params, Object); - return fireFromHash(fireEnc, params); + return fireFromHash(fireEnc, params).bind(this); }); From 5e6271bb8846d054c2f1e205a682916347be0a05 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Sun, 5 Aug 2018 10:58:35 +0200 Subject: [PATCH 03/51] Trying to fix fireToHash func export --- imports/api/Fires/server/publications.js | 53 ++++++++++++------------ 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/imports/api/Fires/server/publications.js b/imports/api/Fires/server/publications.js index 03d95c3..acb4d1e 100644 --- a/imports/api/Fires/server/publications.js +++ b/imports/api/Fires/server/publications.js @@ -142,38 +142,37 @@ function logUrl(fireEnc, params) { export function fireFromHash(fireEnc, params) { check(fireEnc, String); check(params, Object); - try { - // console.log(fireEnc); - // const unsealed = Promise.await(urlEnc.decrypt(fireEnc)); - const unsealed = Promise.await(unsealW(fireEnc)); - if (unsealed === undefined) { - logUrl(fireEnc, params); - // https://guide.meteor.com/data-loading.html - return this.ready(); - } - const w = unsealed.when; - unsealed.when = new Date(w); - const c = unsealed.createdAt; - unsealed.createdAt = !c ? new Date() : new Date(c); - const u = unsealed.updatedAt; - unsealed.updatedAt = !u ? new Date() : new Date(u); - // console.log(unsealed); - // FIXME: - const unsealedFix = fixConfidence(unsealed); - FiresCollection.schema.validate(unsealedFix); - return findOrCreateFire(unsealedFix); - /* console.log(`fires: ${fire.count()}`); - * return fire; */ - } catch (e) { - console.warn(e); - logUrl(fireEnc, params); - return this.ready(); + // console.log(fireEnc); + // const unsealed = Promise.await(urlEnc.decrypt(fireEnc)); + const unsealed = Promise.await(unsealW(fireEnc)); + if (unsealed === undefined) { + throw Error('Undefined unsealed'); } + const w = unsealed.when; + unsealed.when = new Date(w); + const c = unsealed.createdAt; + unsealed.createdAt = !c ? new Date() : new Date(c); + const u = unsealed.updatedAt; + unsealed.updatedAt = !u ? new Date() : new Date(u); + // console.log(unsealed); + // FIXME: + const unsealedFix = fixConfidence(unsealed); + FiresCollection.schema.validate(unsealedFix); + return findOrCreateFire(unsealedFix); + /* console.log(`fires: ${fire.count()}`); + * return fire; */ } Meteor.publish('fireFromHash', function fireFromHashFunc(fireEnc, params) { check(fireEnc, String); check(params, Object); - return fireFromHash(fireEnc, params).bind(this); + try { + return fireFromHash(fireEnc, params); + } catch (e) { + console.warn(e); + logUrl(fireEnc, params); + // https://guide.meteor.com/data-loading.html + return this.ready(); + } }); From 759797e412e4779470c2d953cf5c4fee84642077 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Wed, 8 Aug 2018 08:42:52 +0200 Subject: [PATCH 04/51] Fix for rest method for false positive stats when no fires --- .../api/FalsePositives/server/publications.js | 7 +++++ imports/api/Rest/Rest.js | 28 +++++++++---------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/imports/api/FalsePositives/server/publications.js b/imports/api/FalsePositives/server/publications.js index ca66105..1816344 100644 --- a/imports/api/FalsePositives/server/publications.js +++ b/imports/api/FalsePositives/server/publications.js @@ -27,6 +27,13 @@ export const firesUnion = (fires) => { return union; }; +export const zoneToUnion = (lat, lon, distance) => { + const group = new L.FeatureGroup(); + const remap = [{ location: { lat, lon }, distance }]; + const union = calcUnion(remap, group, sub => sub); + return union; +}; + export const whichAreFalsePositives = (collection, union) => { const result = collection.find({ geo: { diff --git a/imports/api/Rest/Rest.js b/imports/api/Rest/Rest.js index fec971d..b5a7635 100644 --- a/imports/api/Rest/Rest.js +++ b/imports/api/Rest/Rest.js @@ -8,7 +8,7 @@ import { check } from 'meteor/check'; import SiteSettings from '/imports/api/SiteSettings/SiteSettings'; import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires'; import { countRealFires } from '/imports/api/ActiveFires/server/countFires'; -import { whichAreFalsePositives, firesUnion } from '/imports/api/FalsePositives/server/publications'; +import { whichAreFalsePositives, firesUnion, zoneToUnion } from '/imports/api/FalsePositives/server/publications'; import { fireFromHash } from '/imports/api/Fires/server/publications.js'; import FalsePositives from '/imports/api/FalsePositives/FalsePositives'; import Industries from '/imports/api/Industries/Industries'; @@ -166,22 +166,22 @@ if (!Meteor.settings.private.internalApiToken) { return result; } + let union; + // TODO only get real const firesA = fires.fetch(); - if (firesA.length > 0) { - const union = firesUnion(fires); - const falsePos = whichAreFalsePositives(FalsePositives, union); - const industries = whichAreFalsePositives(Industries, union); - result.fires = firesA; - result.industries = industries.fetch(); - result.falsePos = falsePos.fetch(); - return result; - } - // otherwise - return { - total: 0, real: 0, fires: [], falsePos: [], industries: [] - }; + if (firesA.length > 0) { + union = firesUnion(fires); + } else { + union = zoneToUnion(lat, lng, km); + } + const falsePos = whichAreFalsePositives(FalsePositives, union); + const industries = whichAreFalsePositives(Industries, union); + result.fires = firesA; + result.industries = industries.fetch(); + result.falsePos = falsePos.fetch(); + return result; } // Maps to: /api/v1/fires-in/:lat/:lng/:km From 15ed7e917ab07408da5c15cf936a35483dc21939 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Fri, 10 Aug 2018 09:07:05 +0200 Subject: [PATCH 05/51] Adding log to false positive --- imports/api/Rest/Rest.js | 1 + 1 file changed, 1 insertion(+) diff --git a/imports/api/Rest/Rest.js b/imports/api/Rest/Rest.js index b5a7635..f663d1f 100644 --- a/imports/api/Rest/Rest.js +++ b/imports/api/Rest/Rest.js @@ -441,6 +441,7 @@ if (!Meteor.settings.private.internalApiToken) { // TODO const fire = fireFromHash(sealed, {}); + console.log(`Marking fire as false positive: ${fire}`); const result = upsertFalsePositive(type, user._id, fire); return jsend.success({ upsert: result }); } From 8a741dc729f3afc8f0185d5c7e86ee9634ffd4ca Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Fri, 10 Aug 2018 11:12:33 +0200 Subject: [PATCH 06/51] Adding log to false positive --- imports/api/Rest/Rest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/api/Rest/Rest.js b/imports/api/Rest/Rest.js index f663d1f..dc47750 100644 --- a/imports/api/Rest/Rest.js +++ b/imports/api/Rest/Rest.js @@ -441,7 +441,7 @@ if (!Meteor.settings.private.internalApiToken) { // TODO const fire = fireFromHash(sealed, {}); - console.log(`Marking fire as false positive: ${fire}`); + console.log(`Marking fire as false positive: ${JSON.stringify(fire)}`); const result = upsertFalsePositive(type, user._id, fire); return jsend.success({ upsert: result }); } From bbdc53bda1d3fb85ddcd23a6c7ee00e9af033fc7 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Sat, 11 Aug 2018 08:15:04 +0200 Subject: [PATCH 07/51] More logs in Rest --- imports/api/Rest/Rest.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/imports/api/Rest/Rest.js b/imports/api/Rest/Rest.js index dc47750..14baca0 100644 --- a/imports/api/Rest/Rest.js +++ b/imports/api/Rest/Rest.js @@ -439,11 +439,14 @@ if (!Meteor.settings.private.internalApiToken) { const user = Meteor.users.findOne({ fireBaseToken: mobileToken }); if (!user) return failMsg('User not found'); - // TODO - const fire = fireFromHash(sealed, {}); - console.log(`Marking fire as false positive: ${JSON.stringify(fire)}`); - const result = upsertFalsePositive(type, user._id, fire); - return jsend.success({ upsert: result }); + console.log(`Marking hash fire as '${type}' false positive: ${sealed}`); + const fire = fireFromHash(sealed, { id: sealed }); + if (fire && typeof fire === 'object') { + console.log(`Marking fire as false positive: ${fire._id}`); + const result = upsertFalsePositive(type, user._id, fire); + return jsend.success({ upsert: result }); + } + return failMsg('Cannot mark fire as false positive'); } }); } From 3defbb01a2979f7850b4a2bf9b4d42c63d1c2dbb Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Wed, 15 Aug 2018 06:18:51 +0200 Subject: [PATCH 08/51] Fix for false positive rest call --- imports/api/Rest/Rest.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/imports/api/Rest/Rest.js b/imports/api/Rest/Rest.js index 14baca0..5166f12 100644 --- a/imports/api/Rest/Rest.js +++ b/imports/api/Rest/Rest.js @@ -440,8 +440,9 @@ if (!Meteor.settings.private.internalApiToken) { if (!user) return failMsg('User not found'); console.log(`Marking hash fire as '${type}' false positive: ${sealed}`); - const fire = fireFromHash(sealed, { id: sealed }); - if (fire && typeof fire === 'object') { + const fireC = fireFromHash(sealed, { id: sealed }); + if (fireC && typeof fireC === 'object') { + const fire = fireC.fetch()[0]; console.log(`Marking fire as false positive: ${fire._id}`); const result = upsertFalsePositive(type, user._id, fire); return jsend.success({ upsert: result }); From ffef42d19ad799dad26befd40eb6c71401c1ac05 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Wed, 15 Aug 2018 07:26:39 +0200 Subject: [PATCH 09/51] Added play button --- imports/ui/pages/Index/Index.js | 6 +++++- package-lock.json | 12 +++++++++++- package.json | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/imports/ui/pages/Index/Index.js b/imports/ui/pages/Index/Index.js index 5d6b130..6735852 100644 --- a/imports/ui/pages/Index/Index.js +++ b/imports/ui/pages/Index/Index.js @@ -11,6 +11,7 @@ import PropTypes from 'prop-types'; // import { Link } from 'react-router-dom'; // https://www.npmjs.com/package/react-resize-detector import ReactResizeDetector from 'react-resize-detector'; +import MobileStoreButton from 'react-mobile-store-button'; import _ from 'lodash'; import 'html5-device-mockups/dist/device-mockups.min.css'; import 'bootstrap-carousel-swipe/carousel-swipe'; @@ -20,7 +21,6 @@ import SubscriptionsMap from '/imports/ui/pages/Subscriptions/SubscriptionsMap'; import ShareIt from '/imports/ui/components/ShareIt/ShareIt'; import getFallbackLang from '/imports/modules/lang-fallback'; import FiresMap from '../FiresMap/FiresMap'; - import './Index.scss'; import './Index-custom.scss'; @@ -102,6 +102,7 @@ class Index extends Component { render() { const { t } = this.props; const title = `${t('AppName')}: ${t('Inicio')}`; + const androidUrl = 'https://play.google.com/store/apps/details?id=org.comunes.fires'; return (
@@ -181,6 +182,9 @@ class Index extends Component {

Siempre alerta a los fuegos en nuestro vecindario

{/* {this.props.t('Participa')} */} +

+ +

diff --git a/package-lock.json b/package-lock.json index 5a3aab1..6d65294 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6227,7 +6227,8 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true + "bundled": true, + "optional": true }, "json-schema": { "version": "0.2.3", @@ -17922,6 +17923,15 @@ "resolved": "https://registry.npmjs.org/react-leaflet-sidebarv2/-/react-leaflet-sidebarv2-0.5.1.tgz", "integrity": "sha512-HaEeIq3TfK1Hy7xIuX3hv895LNpu1xIBCgW+I1INrqX/95nNRw6ItNQOxmk0YO5ImrSaDeV6rDXKsAGojjngdg==" }, + "react-mobile-store-button": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/react-mobile-store-button/-/react-mobile-store-button-0.0.3.tgz", + "integrity": "sha512-fuMUeaR2yxOvPfYV2TOsQT+bzenEHGSg5PqKrCyn34m13loZEUf2BJuJ5J8k4EvWPHmljLDfc5dnGhaKd4qVTQ==", + "requires": { + "prop-types": "15.6.0", + "react": "16.2.0" + } + }, "react-overlays": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.4.tgz", diff --git a/package.json b/package.json index 0954e23..11f0684 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "react-leaflet-fullscreen": "0.0.6", "react-leaflet-google": "^3.2.1", "react-leaflet-sidebarv2": "^0.5.1", + "react-mobile-store-button": "0.0.3", "react-places-autocomplete": "^5.4.3", "react-progress-bar.js": "^0.2.3", "react-resize-detector": "^1.1.0", From 8e729a6939820b6b00766fe37014113bbee5c5b1 Mon Sep 17 00:00:00 2001 From: lupe bao reixa Date: Thu, 16 Aug 2018 09:03:22 +0000 Subject: [PATCH 10/51] Translated using Weblate (Galician) Currently translated at 100.0% (221 of 221 strings) --- public/locales/gl/common.json | 224 +++++++++++++++++++++++++++++++++- 1 file changed, 223 insertions(+), 1 deletion(-) diff --git a/public/locales/gl/common.json b/public/locales/gl/common.json index 0967ef4..bea98c9 100644 --- a/public/locales/gl/common.json +++ b/public/locales/gl/common.json @@ -1 +1,223 @@ -{} +{ + "fireDetected": "lume detectado {{when}}", + "fireDetectedAt": "lume detectado o {{when}}", + "Sí": "Si", + "No": "Non", + "AppName": "Tod@s contra o Lume", + "AppNameFull": "Tod@s contra o Lume!", + "AppDescrip": "Colaboración masiva contra os incendios", + "AppDescripLong": "Empregamos diferentes fontes de datos para notificarche os lumes activos nas túas zonas de interese", + "OrgName": "Comúns", + "OrgNameFull": "Asociación Comúns", + "Privacidad": "Privacidade", + "Términos": "Termos", + "Términos de Servicio": "Termos do Servizo", + "Inicio": "Inicio", + "Licencia": "Licencia", + "Cerrar sesión": "Pechar sesión", + "Registrarse": "Rexistrarse", + "Regístrate": "Rexístrate", + "Iniciar sesión": "Iniciar sesión", + "o regístrate con un correo": "ou rexístrate cun correo", + "o con un correo": "ou cun correo", + "Nombre": "Nome", + "Apellidos": "Apelidos", + "Correo electrónico": "Correo electrónico", + "Contraseña": "Contrasinal", + "¿Ya tienes un cuenta?": "Xa tes unha conta?", + "Usa al menos seis caracteres.": "Emprega polo menos seis caracteres.", + "Iniciar sesión con Google": "Iniciar sesión con Google", + "¿Olvidaste tu contraseña?": "Esqueciches o teu contrasinal?", + "¿No tienes una cuenta?": "Non tes unha conta?", + "Introduce tu correo abajo para recibir un enlace para resetear tu contraseña.": "Introduce o teu correo abaixo para recibir un enlace para resetear o teu contrasinal.", + "Recupera tu contraseña": "Recupera o teu contrasinal", + "¿Recuerdas tu contraseña?": "Lembras o teu contrasinal?", + "Necesitamos un correo aquí.": "Necesitamos un correo aquí.", + "¿Es este correo correcto?": "É iste correo correcto?", + "Necesitamos una contraseña aquí.": "Necesitamos un contrasinal aquí.", + "Bienvenid@ de nuevo": "Benvid@ de novo", + "Guardar perfíl": "Gardar perfil", + "Contraseña actual": "Contrasinal actual", + "Nueva contraseña": "Novo contrasinal", + "Editar perfíl": "Editar perfil", + "Editar perfíl en": "Editar perfil en", + "¡Perfíl actualizado!": "Perfil actualizado!", + "¿Cuál es tu nombre?": "Cal é o teu nome?", + "¿Cuál es tu apellido?": "Cal é o teu apelido?", + "Necesito tu contraseña si la quieres cambiar.": "Necesito o teu contrasinal se o queres cambiar.", + "Necesito tu nueva contraseña si la quieres cambiar.": "Necesito o teu novo contrasinal se o queres cambiar.", + "¿Es correcto este correo?": "É correcto iste correo?", + "verifyEmail": "Ei! pódesnos verificar o teu correo electrónico ({{email}})?", + "Reenviar email de verificación": "Reenviar email de verificación", + "checkVerificationEmail": "Comproba no teu correo {{email}} o enlace de verificación!", + "checkResetEmail": "Comproba no teu correo {{email}} o enlace de reseteo!", + "¡Listo, gracias!": "Listo, grazas!", + "Por favor, inténtalo otra vez.": "Por favor, téntao de novo.", + "Verificando...": "Verificando...", + "Introduce una nueva contraseña, por favor.": "Introduce un novo contrasinal, por favor.", + "Repite tu nueva contraseña, por favor.": "Repite o teu novo contrasinal, por favor.", + "Mmmm, tus contraseñas no coinciden. Inténtalo otra vez": "Mmmm, os teus contrasinais non coinciden. Téntao de novo", + "Para resetear tu contraseña, introduce una nueva debajo. Iniciarás la sesión con la nueva contraseña.": "Para resetear o teu contrasinal, introduce un novo debaixo. Iniciarás a sesión co novo contrasinal.", + "Resetea tu contraseña": "Resetea o teu contrasinal", + "Repite la nueva contraseña": "Repite o novo contrasinal", + "Resetea la contraseña y entra": "Resetea o contrasinal e entra", + "Uso de Cookies": "Emprego de Cookies", + "Utilizamos cookies para asegurar un mejor uso de nuestra web. Si continúas navegando, consideramos que aceptas su uso": "Empregamos cookies para asegurar un mellor uso da nosa web. Se continúas a navegar, consideramos que aceptas o seu uso", + "Participa": "Participa", + "activeFires": "Lumes activos", + "Fuegos activos": "Lumes activos", + "noActiveFireInMapCount": "Non hai lumes activos nesta zona do mapa. <1><0>{{countTotal}} lumes activos no mundo.", + "activeFireInMapCount": "En vermello, <1><0>{{count,number}} lumes activos. <3><0>{{countTotal,number}} lumes activos no mundo.", + "activeNeigFireInMapCount": "En laranxa, os lumes notificados polas/os nosas/os usuarias/os recentemente.", + "Centrar en tu ubicación": "Centrar na túa ubicación", + "Resaltar en verde el área vigilada por nuestros usuarios/as": "Resaltar en verde a área vixiada por as/os nosas/os usuarias/os", + "Resaltar los fuegos con un marcador": "Resaltar os lumes cun marcador", + "mapPrivacy": "<0>Para preservar a privacidade das/os nosas/os usuarias/os, os datos reflectidos están aleatoriamente alterados e son só orientativos.", + "Nuevas notificaciones de {{app}}": "Novas notificacións de {{app}}", + "Imágenes capturadas por los satélites de la NASA muestran el humo de grandes incendios que se extienden sobre el Océano Pacífico. La actividad del fuego está delineada en rojo.": "Imaxes capturadas polos satélites da NASA amosan o fume de grandes incendios que se estenden sobre o Océano Pacífico. A actividade do lume esta deliñada en vermello.", + "Todavía sin subscriptiones": "Aínda sen subscricións", + "Suscripción añadida": "Suscrición engadida", + "Suscripción actualizada": "Suscrición actualizada", + "Desuscrito": "Desuscrita", + "Mis zonas": "As miñas zonas", + "Nueva zona": "Nova zona", + "Suscribirme a fuegos en este radio": "Suscribirme a lumes neste radio", + "Suscribirme a este radio": "Suscribirme a iste radio", + "Créditos": "Créditos", + "Escribe aquí un lugar": "Escribe aquí un lugar", + "Indícanos la posición de la zona a vigilar (por ej. tu pueblo, una calle, etc):": "Indícanos a posición da zona a vixiar (por ex. a túa aldea, unha rúa, etc):", + "También puedes seleccionar la zona en el mapa arrastrando el puntero naranja.": "Tamén podes seleccionar a zona no mapa arrastrando o punteiro laranxa.", + "¿A que distancia a la redonda quieres recibir notificaciones de fuegos?": "A que distancia darredor queres recibir notificacións de lumes?", + "Pulsa para activar": "Preme para activar", + "Arrastrar para seleccionar otro punto": "Arrastrar para seleccionar outro punto", + "Mapa gris de OpenStreetMap": "Mapa gris de OpenStreetMap", + "Mapa color de OpenStreetMap": "Mapa cor de OpenStreetMap", + "Mapa de carreteras de Google": "Mapa de estradas de Google", + "Mapa de terreno de Google": "Mapa de terreo de Google", + "Mapa de satélite de Google": "Mapa de satélite de Google", + "Zona añadida": "Zona engadida", + "Añadir zona": "Engadir zona", + "Editar": "Editar", + "Suscripciones a alertas de fuegos en zonas de mi interés": "Suscricións a alertas de lumes en zonas do meu interese", + "En verde, áreas de las que recibirás alertas de fuegos": "En verde, áreas das que recibirás alertas de lumes", + "Terminar": "Rematar", + "Pulsa para borrar": "Preme para borrar", + "Pulsa aquí para borrar la zona": "Preme aquí para borrar a zona", + "Los fuegos activos se actualizan en tiempo cuasi real.": "Os lumes activos actualízanse en tempo cuasi real.", + "Somos muchos ojos": "Somos moitos ollos", + "Usa nuestro bot de Telegram para estar al tanto de los fuegos en tus área": "Emprega o noso bot do Telegram para estar ó tanto dos lumes na túa área", + "Otros dispositivos": "Outros dispositivos", + "support-us-home": "Estamos a desenvolver as nosas ferramentas para outros dispositivos. Podes <1>contribuír a facelo posible.", + "Software Libre": "Software Libre", + "Suscríbete a alertas de fuegos": "Suscríbete a alertas de lumes", + "Gracias por Participar": "Grazas por Participar", + "También puedes seguirnos en la web": "Tamén nos podes seguir na web", + "Participar": "Participar", + "Dejarás de recibir notificaciones de fuegos en esa área ¿Estás seguro/a? ": "Deixarás de recibir notificacións de lumes nesa área. Estás segura/o? ", + "Sobre los datos y imágenes usados": "Sobre os datos e imaxes empregados", + "dev-with-us-home": "Todo o noso traballo é <1>sofware libre. <3>Traductoræs e <5>desenvolvedoræs sempre benvid@s.", + "Política de Privacidad": "Política de Privacidade", + "No estás suscrito a fuegos en ninguna zona": "Non tes suscrición a lumes en ningunha zona", + "Iniciar sesión con Telegram": "Iniciar sesión con Telegram", + "Idioma": "Idioma", + "Comentarios": "Comentarios", + "Guardar": "Gardar", + "Responder": "Responder", + "Borrar": "Borrar", + "Añadir un comentario": "Engadir un comentario", + "Añadir una respuesta": "Engadir unha resposta", + "Añadir comentario": "Engadir comentario", + "Necesitas iniciar sesión para": "Precisas iniciar a sesión para", + "añadir comentarios": "engadir comentarios", + "puntuar comentarios": "puntuar comentarios", + "responder": "responder", + "Más comentarios": "Máis comentarios", + "Elige un lugar": "Escolle un lugar", + "Elige un radio de vigilancia": "Escolle un radio de vixiancia", + "Recibe alertas de fuegos en esa zona": "Recibe alertas de lumes nesa zona", + "Alerta cuando hay un fuego": "Alerta cando hai un lume", + "Anterior": "Anterior", + "Siguiente": "Seguinte", + "Siempre alerta a los fuegos en nuestro vecindario": "Alerta sempre dos lumes na nosa veciñanza", + "Información adicional sobre fuego detectado en {{where}} el {{when}}": "Información adicional sobre lume detectado en {{where}} o {{when}}", + "Información adicional sobre fuego detectado el {{when}}": "Información adicional sobre lume detectado o {{when}}", + "Coordenadas:": "Coordenadas:", + "Fuego detectado por satélites de la NASA <1>": "Lume detectado por satélites da NASA <1>", + "Puedes añadir un comentario si tienes información adicional sobre este fuego.": "Podes engadir un comentario se tes información adicional sobre este lume", + "Por ejemplo:": "Por exemplo:", + "si conoces esta zona y cómo acceder al fuego (esto puede de ser de ayuda para apagarlo si sigue activo o para investigarlo en un futuro)": "se coñeces esta zona e como acceder ó lume (isto pode ser de moita axuda para apagalo se segue activo ou para investigalo nun futuro)", + "si conoces el motivo por el que comenzó el fuego": "se coñeces o motivo polo que empezou o lume", + "si quieres denunciar algún tipo de ilegalidad, incluso anónimamente": "se queres denunciar algún tipo de ilegalidade, incluso anonimamente", + "o cualquier otra información": "ou calquera outra información", + "Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.": "Faga zoom nunha zona do seu interese se quere que os lumes se actualicen en tempo real.", + "Notificaciones": "Notificacións", + "Recibe nuestras notificaciones de fuegos por correo o en tu navegador": "Recibe as nosas notificacións de lumes por correo ou no teu navegador", + "Fuego notificado por uno de nuestros usuarios/as <1>": "Lume notificado por un/ha das/os nosas/os usuarias/os", + "No recibirás notificaciones de fuegos en este equipo, solo por correo": "Non recibirás notificacións de lumes neste equipo, só por correo", + "not-found": "Upppps: Esta páxina non existe", + "general-error-title": "Upppps: Algo saiu mal", + "general-error-description": "Estamos a investigar o problema, volve tentalo nun cachiño", + "Más información sobre este fuego": "Máis información sobre este lume", + "Última actualización, {{when}}": "Última actualización, {{when}}", + "termsAccept": "Acepto as <1>condicións de servizo deste sitio", + "Bienvenid@!": "Benvid@!", + "welcome": "Benvid@", + "Has iniciado sesión con {{service}} usando la dirección de correo {{email}}.": "Iniciaches a sesión con {{service}} usando a dirección de correo {{email}}.", + "Verifica tu dirección de correo": "Verifica a túa dirección de correo", + "Zonas vigiladas": "Zonas vixiladas", + "En verde, las zonas vigiladas por nuestros usuari@s actualmente": "En verde, as zonas vixiladas polas/os nosas/os usuarias/os actualmente", + "Actualizado <1>, último fuego detectado <3>.": "Actualizado <1>, último lume detectado <3>.", + "Tomamos nota, ¡gracias por colaborar!": "Tomamos nota, grazas por colaborar!", + "Indícanos de que tipo de fuego se trata y ayúdanos así a mejorar nuestras notificaciones:": "Indícanos de que tipo de lume se trata e axúdanos así a mellorar as nosas notificacións:", + "¿No es un fuego forestal?": "Non é un lume forestal?", + "Regístrate o inicia sesión para aportar información sobre este fuego": "Rexístrate ou inicia sesión para aportar información sobre este lume", + "Fuego no encontrado": "Lume non atopado", + "Es una industria": "É unha industria", + "Es una quema controlada": "É unha queima controlada", + "Parece una falsa alarma": "Parece unha falsa alarma", + "Fuegos activos en el mundo actualizados en tiempo real": "Lumes activos no mundo actualizados en tempo real", + "Información adicional sobre fuego": "Información adicional sobre o lume", + "CO2emisions": "Sabías que os lumes <1>producen tanto CO² como os coches e <3>aproximadamente ⅕ de tódalas nosas emisións ?", + "Ayúdanos a combatir el cambio climático y a proteger el medioambiente": "Axúdanos a combatir o cambio climático e a protexer o medioambiente", + "Fuego en La Tuna, Los Ángeles, Estados Unidos, septiembre de 2017": "Lume en La Tuna, Los Ángeles, Estados Unidos, setembro do 2017", + "Polución en la ciudad de Almaty, Kazakhstan, enero de 2014": "Polución na cidade de Almaty, Kazakhstan, xaneiro do 2014", + "Fuente": "Fonte", + "NASA": "NASA", + "nuestros usuarios/as": "as nosas/os usuarias/os", + "Pulsa para más información": "Preme para máis información", + "Detectado": "Detectado", + "Zonas vigiladas por nuestros usuari@s actualmente": "Zonas vixiadas pol@s nos@s usuari@s actualmente", + "Iniciar sesión con Facebook": "Iniciar sesión con Facebook", + "Elige un tipo": "Escolle un tipo", + "Puedes participar en las traducciones": "Podes participar nas traducións", + "Aceptar": "Aceptar", + "Por favor, escribe aquí tu feedback...": "Por favor, escribe aquí o teu feedback...", + "Feedback": "Feedback", + "Enviar": "Enviar", + "Tu correo": "O teu correo", + "Desconectado del servidor, reconectando en %delay% segundos.": "Desconectando di servidor, reconectando en %delay% segundos.", + "Desconectado del servidor, reconectando...": "Desconectado do servidor, reconectando...", + "Reintentar ahora": "Reintentar agora", + "Feedback recibido, gracias...": "Feedback recibido, grazas...", + "Parece que este fuego no es un fuego forestal.": "Parece que este lume non é un lume forestal.", + "Sobre nosotr@s": "Sobre nós", + "Nosotr@s": "Nós", + "Sobre '{{appName}}'": "Sobre '{{appName}}'", + "¿Vecindarios vigilando y combatiendo fuegos? ¿de qué va todo esto?": "Veciñanzas vixiando e combatendo lumes? de vai todo isto?", + "noActiveNeigFireInMap": "Non hai lumes notificados recentemente polas/os nosas/os usuarias/os nesta zona.", + "Es una industria (fuente: registro oficial)": "É unha industria (fonte: rexistro oficial)", + "Es una industria (fuente: nuestros usuarios/as)": "É unha industria (fonte as/os nosas/os usuarias/os):", + "Pantalla completa": "Pantalla completa", + "Salir de pantalla completa": "Saír da pantalla completa", + "Escribe un lugar para centrar el mapa": "Escribe un lugar para centrar o mapa", + "geo-not-perms-error": "Upppps: parece que non temos permiso para coñecer a túa ubicación", + "geo-not-avail-error": "Upppps: parece que a túa ubicación non está dispoñible", + "geo-not-timeout-error": "Upppps: o teu dispositivo está a tardar demasiado en coñecer a túa ubicación", + "Estás subscrito a una zona muy grande": "Suscribícheste a unha zona grande de máis", + "Lugar no encontrado": "Lugar non atopado", + "on-already-subscribed": "Upppps: Xa te suscribiras a esta zona antes", + "Cancelar": "Cancelar", + "Nota: Las nubes pueden entorpecer la detección de fuegos activos.": "Nota: As nubes poden entorpecer a detección de lumes activos.", + "Hay más información sobre un fuego": "Hai máis información sobre un lume", + "esDecirTalDia": "É dicir o {{date}}" +} From f608fc4d2883f2d2b04dbc4120bc742acd0ae319 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Thu, 16 Aug 2018 17:32:45 +0200 Subject: [PATCH 11/51] Enabling Galego in interface --- imports/startup/common/i18n.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/imports/startup/common/i18n.js b/imports/startup/common/i18n.js index 9be09fd..36bf759 100644 --- a/imports/startup/common/i18n.js +++ b/imports/startup/common/i18n.js @@ -3,6 +3,8 @@ import moment from 'moment'; // Load the js langs import es from 'meteor-accounts-t9n/build/es'; import en from 'meteor-accounts-t9n/build/en'; +// TODO +import gl from 'meteor-accounts-t9n/build/gl'; const backOpts = { // path where resources get loaded from @@ -21,7 +23,10 @@ const shouldDebug = (forceDebug && !Meteor.isProduction); const i18nOpts = { backend: backOpts, // lng: 'es', - fallbackLng: ['es', 'en'], + fallbackLng: { + gl: ['es'], + default: ['en'] + }, sendMissingTo: 'fallback', interpolation: { escapeValue: false, // not needed for react!! @@ -35,7 +40,7 @@ const i18nOpts = { return value; } }, - whitelist: ['es', 'en'], // allowed languages + whitelist: ['es', 'en', 'gl'], // allowed languages load: 'languageOnly', // 'es' o 'en', previously: 'all', // es-ES -> es, en-US -> en debug: shouldDebug, ns: 'common', From 9a31ab2457b71f30515b1cae6b5266aca773b665 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Thu, 16 Aug 2018 17:47:00 +0200 Subject: [PATCH 12/51] Commenting gl in t9 accounts --- imports/startup/common/i18n.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/imports/startup/common/i18n.js b/imports/startup/common/i18n.js index 36bf759..218e46d 100644 --- a/imports/startup/common/i18n.js +++ b/imports/startup/common/i18n.js @@ -3,8 +3,8 @@ import moment from 'moment'; // Load the js langs import es from 'meteor-accounts-t9n/build/es'; import en from 'meteor-accounts-t9n/build/en'; -// TODO -import gl from 'meteor-accounts-t9n/build/gl'; +// TODO ask for translation of this +// import gl from 'meteor-accounts-t9n/build/gl'; const backOpts = { // path where resources get loaded from From ed08563cad225e80f192bab68fdef96d5ea8a5d2 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Thu, 16 Aug 2018 17:48:58 +0200 Subject: [PATCH 13/51] Thanks for translation --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e686902..2f0dee2 100644 --- a/README.md +++ b/README.md @@ -51,4 +51,5 @@ GNU APLv3. See our [LICENSE](https://github.com/comunes/todos-contra-el-fuego-we ## Thanks & other acknowlegments -(...) +Thanks indeed to: +- Lupe Bao Reixa for Galician translation From dc5e38f8d52372576126915c6931f02c52bc5951 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Thu, 16 Aug 2018 19:04:46 +0200 Subject: [PATCH 14/51] gl fallback to es in T9 --- imports/startup/client/i18n.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/imports/startup/client/i18n.js b/imports/startup/client/i18n.js index 2fdc6b4..384053f 100644 --- a/imports/startup/client/i18n.js +++ b/imports/startup/client/i18n.js @@ -17,7 +17,7 @@ import i18nOpts from '../common/i18n'; const detectorOptions = { // order and from where user language should be detected - order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag'], + order: ['querystring', 'navigator', 'cookie', 'localStorage', 'htmlTag'], // keys or params to lookup language from lookupQuerystring: 'lng', @@ -61,6 +61,14 @@ if (sendMissing && Meteor.isDevelopment) { }; } +function setT9(lang) { + if (lang === 'gl') { + T9n.setLanguage('es'); + } else { + T9n.setLanguage(lang); + } +} + i18n.use(backend) .use(LngDetector) .use(Cache) @@ -75,7 +83,7 @@ i18n.use(backend) // document.title = t('AppName'); // Accounts translation // https://github.com/softwarerero/meteor-accounts-t9n - T9n.setLanguage(i18n.language); + setT9(i18n.language); // console.log(T9n.get('error.accounts.User not found')); moment.locale(i18n.language); @@ -104,7 +112,8 @@ Meteor.subscribe('userData'); // lang is there i18n.on('languageChanged', (lng) => { moment.locale(lng); - T9n.setLanguage(lng); + // TODO fix this when gl is translated + setT9(lng); Tracker.autorun((computation) => { if (Meteor.userId()) { // logged From e223ddb6439af1da2f7d4bbdfebad76a7c830e10 Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Thu, 16 Aug 2018 22:44:38 +0200 Subject: [PATCH 15/51] Preload langs --- imports/startup/common/i18n.js | 1 + 1 file changed, 1 insertion(+) diff --git a/imports/startup/common/i18n.js b/imports/startup/common/i18n.js index 218e46d..e6ecb61 100644 --- a/imports/startup/common/i18n.js +++ b/imports/startup/common/i18n.js @@ -41,6 +41,7 @@ const i18nOpts = { } }, whitelist: ['es', 'en', 'gl'], // allowed languages + preload: ['es', 'en', 'gl'], load: 'languageOnly', // 'es' o 'en', previously: 'all', // es-ES -> es, en-US -> en debug: shouldDebug, ns: 'common', From 829fae4f07d30bab1ffa9c63365df3422175b3cc Mon Sep 17 00:00:00 2001 From: "Vicente J. Ruiz Jurado" Date: Fri, 17 Aug 2018 05:39:03 +0200 Subject: [PATCH 16/51] Trying to get available list of langs in profile --- imports/startup/common/i18n.js | 1 - imports/ui/pages/Profile/Profile.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/imports/startup/common/i18n.js b/imports/startup/common/i18n.js index e6ecb61..218e46d 100644 --- a/imports/startup/common/i18n.js +++ b/imports/startup/common/i18n.js @@ -41,7 +41,6 @@ const i18nOpts = { } }, whitelist: ['es', 'en', 'gl'], // allowed languages - preload: ['es', 'en', 'gl'], load: 'languageOnly', // 'es' o 'en', previously: 'all', // es-ES -> es, en-US -> en debug: shouldDebug, ns: 'common', diff --git a/imports/ui/pages/Profile/Profile.js b/imports/ui/pages/Profile/Profile.js index 665e9d7..38614ac 100644 --- a/imports/ui/pages/Profile/Profile.js +++ b/imports/ui/pages/Profile/Profile.js @@ -202,7 +202,7 @@ class Profile extends React.Component { {langName[i18n.language]}
- {i18n.languages.map(lang => ( + {Object.keys(i18n.services.resourceStore.data).map(lang => (
- {Object.keys(i18n.services.resourceStore.data).map(lang => ( + {enabledLangs.map(lang => (