Merge branch 'dev' into filter_workouts_by_name

This commit is contained in:
Sam 2023-04-08 11:12:33 +02:00
commit 5caecd5bef
121 changed files with 2702 additions and 1455 deletions

View File

@ -55,6 +55,9 @@ docker-build-client:
docker-check-all: docker-bandit docker-lint-all docker-type-check docker-test-client docker-test-python
docker-downgrade-db:
docker-compose -f docker-compose-dev.yml exec fittrackee $(DOCKER_FLASK) db downgrade --directory $(DOCKER_MIGRATIONS)
docker-init: docker-run docker-init-db docker-restart docker-run-workers
docker-init-db:

View File

@ -62,10 +62,10 @@ class BaseConfig:
'fr',
'de',
'it',
# 'nb', # disabled for now
'nb',
'nl',
# 'es', # disabled for now
# 'gl', # disabled for now
'es',
'gl',
]
OAUTH2_TOKEN_EXPIRES_IN = {
'authorization_code': 864000, # 10 days

View File

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/static/css/fork-awesome.min.css"/><link rel="stylesheet" href="/static/css/leaflet.css"/><title>FitTrackee</title><script defer="defer" src="/static/js/chunk-vendors.504d6d07.js"></script><script defer="defer" src="/static/js/app.101c16d4.js"></script><link href="/static/css/app.e504ceb2.css" rel="stylesheet"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="fittrackee_client"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but FitTrackee doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/static/css/fork-awesome.min.css"/><link rel="stylesheet" href="/static/css/leaflet.css"/><title>FitTrackee</title><script defer="defer" src="/static/js/chunk-vendors.01cb48d3.js"></script><script defer="defer" src="/static/js/app.fbd9f0c5.js"></script><link href="/static/css/app.5f8309dc.css" rel="stylesheet"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="fittrackee_client"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but FitTrackee doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +1,2 @@
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[328],{6e3:function(t,e,i){i.r(e),i.d(e,{default:function(){return _}});var a=i(6252),n=i(2262),s=i(8273),c=i(5801),r=i(9917);const S=t=>((0,a.dD)("data-v-64629971"),t=t(),(0,a.Cn)(),t),l={id:"admin",class:"view"},p={key:0,class:"container"},u=S((()=>(0,a._)("div",{id:"bottom"},null,-1)));var T=(0,a.aZ)({__name:"AdminView",setup(t){const e=(0,r.o)(),i=(0,a.Fl)((()=>e.getters[c.SY.GETTERS.APP_CONFIG])),S=(0,a.Fl)((()=>e.getters[c.SY.GETTERS.APP_STATS])),T=(0,a.Fl)((()=>e.getters[c.YN.GETTERS.IS_ADMIN])),d=(0,a.Fl)((()=>e.getters[c.YN.GETTERS.USER_LOADING]));return(0,a.wF)((()=>e.dispatch(c.SY.ACTIONS.GET_APPLICATION_STATS))),(t,e)=>{const c=(0,a.up)("router-view");return(0,a.wg)(),(0,a.iD)("div",l,[(0,n.SU)(d)?(0,a.kq)("",!0):((0,a.wg)(),(0,a.iD)("div",p,[(0,n.SU)(T)?((0,a.wg)(),(0,a.j4)(c,{key:0,appConfig:(0,n.SU)(i),appStatistics:(0,n.SU)(S)},null,8,["appConfig","appStatistics"])):((0,a.wg)(),(0,a.j4)(s.Z,{key:1})),u]))])}}}),d=i(3744);const o=(0,d.Z)(T,[["__scopeId","data-v-64629971"]]);var _=o}}]);
//# sourceMappingURL=admin.4313b7d9.js.map
//# sourceMappingURL=admin.9c006817.js.map

View File

@ -1 +1 @@
{"version":3,"file":"static/js/admin.4313b7d9.js","mappings":"mOAGA,MAAMA,EAAeC,KAAMC,EAAAA,EAAAA,IAAa,mBAAmBD,EAAEA,KAAIE,EAAAA,EAAAA,MAAcF,GACzEG,EAAa,CACjBC,GAAI,QACJC,MAAO,QAEHC,EAAa,CACjBC,IAAK,EACLF,MAAO,aAEHG,EAA2BT,GAAa,KAAmBU,EAAAA,EAAAA,GAAoB,MAAO,CAAEL,GAAI,UAAY,MAAO,KAUrH,OAA4BM,EAAAA,EAAAA,IAAiB,CAC3CC,OAAQ,YACRC,MAAMC,GAEN,MAAMC,GAAQC,EAAAA,EAAAA,KAERC,GAAqCC,EAAAA,EAAAA,KACzC,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,cAEhBC,GAA6CH,EAAAA,EAAAA,KACjD,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,aAEhBE,GAAuCJ,EAAAA,EAAAA,KAC3C,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,YAEhBC,GAAoCN,EAAAA,EAAAA,KACxC,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,gBAKxB,OAFEE,EAAAA,EAAAA,KAAc,IAAMV,EAAMW,SAASN,EAAAA,GAAAA,QAAAA,yBAE9B,CAACO,EAAUC,KAChB,MAAMC,GAAyBC,EAAAA,EAAAA,IAAkB,eAEjD,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAO5B,EAAY,EACzD6B,EAAAA,EAAAA,IAAOT,IAWLU,EAAAA,EAAAA,IAAoB,IAAI,KAVvBH,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAOzB,EAAY,EACnD0B,EAAAA,EAAAA,IAAOX,KACHS,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaN,EAAwB,CAClDrB,IAAK,EACLS,WAAWgB,EAAAA,EAAAA,IAAOhB,GAClBI,eAAeY,EAAAA,EAAAA,IAAOZ,IACrB,KAAM,EAAG,CAAC,YAAa,qBACzBU,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaC,EAAAA,EAAU,CAAE5B,IAAK,KACjDC,MAGN,CAEJ,I,UCvDA,MAAM4B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,YAAY,qBAEvE,O","sources":["webpack://fittrackee_client/./src/views/AdminView.vue?67de","webpack://fittrackee_client/./src/views/AdminView.vue"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-64629971\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n id: \"admin\",\n class: \"view\"\n}\nconst _hoisted_2 = {\n key: 0,\n class: \"container\"\n}\nconst _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { id: \"bottom\" }, null, -1))\n\nimport { computed, ComputedRef, onBeforeMount } from 'vue'\n\n import NotFound from '@/components/Common/NotFound.vue'\n import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'\n import { TAppConfig, IAppStatistics } from '@/types/application'\n import { useStore } from '@/use/useStore'\n\n \nexport default /*#__PURE__*/_defineComponent({\n __name: 'AdminView',\n setup(__props) {\n\n const store = useStore()\n\n const appConfig: ComputedRef<TAppConfig> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n )\n const appStatistics: ComputedRef<IAppStatistics> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_STATS]\n )\n const isAuthUserAmin: ComputedRef<boolean> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.IS_ADMIN]\n )\n const userLoading: ComputedRef<boolean> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]\n )\n\n onBeforeMount(() => store.dispatch(ROOT_STORE.ACTIONS.GET_APPLICATION_STATS))\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (!_unref(userLoading))\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n (_unref(isAuthUserAmin))\n ? (_openBlock(), _createBlock(_component_router_view, {\n key: 0,\n appConfig: _unref(appConfig),\n appStatistics: _unref(appStatistics)\n }, null, 8, [\"appConfig\", \"appStatistics\"]))\n : (_openBlock(), _createBlock(NotFound, { key: 1 })),\n _hoisted_3\n ]))\n : _createCommentVNode(\"\", true)\n ]))\n}\n}\n\n})","import script from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./AdminView.vue?vue&type=style&index=0&id=64629971&lang=scss&scoped=true\"\n\nimport exportComponent from \"/mnt/data-lnx/Devs/00_Perso/FitTrackee/fittrackee_client/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-64629971\"]])\n\nexport default __exports__"],"names":["_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_1","id","class","_hoisted_2","key","_hoisted_3","_createElementVNode","_defineComponent","__name","setup","__props","store","useStore","appConfig","computed","getters","ROOT_STORE","appStatistics","isAuthUserAmin","AUTH_USER_STORE","userLoading","onBeforeMount","dispatch","_ctx","_cache","_component_router_view","_resolveComponent","_openBlock","_createElementBlock","_unref","_createCommentVNode","_createBlock","NotFound","__exports__"],"sourceRoot":""}
{"version":3,"file":"static/js/admin.9c006817.js","mappings":"mOAGA,MAAMA,EAAeC,KAAMC,EAAAA,EAAAA,IAAa,mBAAmBD,EAAEA,KAAIE,EAAAA,EAAAA,MAAcF,GACzEG,EAAa,CACjBC,GAAI,QACJC,MAAO,QAEHC,EAAa,CACjBC,IAAK,EACLF,MAAO,aAEHG,EAA2BT,GAAa,KAAmBU,EAAAA,EAAAA,GAAoB,MAAO,CAAEL,GAAI,UAAY,MAAO,KAUrH,OAA4BM,EAAAA,EAAAA,IAAiB,CAC3CC,OAAQ,YACRC,MAAMC,GAEN,MAAMC,GAAQC,EAAAA,EAAAA,KAERC,GAAqCC,EAAAA,EAAAA,KACzC,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,cAEhBC,GAA6CH,EAAAA,EAAAA,KACjD,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,aAEhBE,GAAuCJ,EAAAA,EAAAA,KAC3C,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,YAEhBC,GAAoCN,EAAAA,EAAAA,KACxC,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,gBAKxB,OAFEE,EAAAA,EAAAA,KAAc,IAAMV,EAAMW,SAASN,EAAAA,GAAAA,QAAAA,yBAE9B,CAACO,EAAUC,KAChB,MAAMC,GAAyBC,EAAAA,EAAAA,IAAkB,eAEjD,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAO5B,EAAY,EACzD6B,EAAAA,EAAAA,IAAOT,IAWLU,EAAAA,EAAAA,IAAoB,IAAI,KAVvBH,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAOzB,EAAY,EACnD0B,EAAAA,EAAAA,IAAOX,KACHS,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaN,EAAwB,CAClDrB,IAAK,EACLS,WAAWgB,EAAAA,EAAAA,IAAOhB,GAClBI,eAAeY,EAAAA,EAAAA,IAAOZ,IACrB,KAAM,EAAG,CAAC,YAAa,qBACzBU,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaC,EAAAA,EAAU,CAAE5B,IAAK,KACjDC,MAGN,CAEJ,I,UCvDA,MAAM4B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,YAAY,qBAEvE,O","sources":["webpack://fittrackee_client/./src/views/AdminView.vue?67de","webpack://fittrackee_client/./src/views/AdminView.vue"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-64629971\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n id: \"admin\",\n class: \"view\"\n}\nconst _hoisted_2 = {\n key: 0,\n class: \"container\"\n}\nconst _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { id: \"bottom\" }, null, -1))\n\nimport { computed, ComputedRef, onBeforeMount } from 'vue'\n\n import NotFound from '@/components/Common/NotFound.vue'\n import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'\n import { TAppConfig, IAppStatistics } from '@/types/application'\n import { useStore } from '@/use/useStore'\n\n \nexport default /*#__PURE__*/_defineComponent({\n __name: 'AdminView',\n setup(__props) {\n\n const store = useStore()\n\n const appConfig: ComputedRef<TAppConfig> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n )\n const appStatistics: ComputedRef<IAppStatistics> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_STATS]\n )\n const isAuthUserAmin: ComputedRef<boolean> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.IS_ADMIN]\n )\n const userLoading: ComputedRef<boolean> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]\n )\n\n onBeforeMount(() => store.dispatch(ROOT_STORE.ACTIONS.GET_APPLICATION_STATS))\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (!_unref(userLoading))\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n (_unref(isAuthUserAmin))\n ? (_openBlock(), _createBlock(_component_router_view, {\n key: 0,\n appConfig: _unref(appConfig),\n appStatistics: _unref(appStatistics)\n }, null, 8, [\"appConfig\", \"appStatistics\"]))\n : (_openBlock(), _createBlock(NotFound, { key: 1 })),\n _hoisted_3\n ]))\n : _createCommentVNode(\"\", true)\n ]))\n}\n}\n\n})","import script from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./AdminView.vue?vue&type=style&index=0&id=64629971&lang=scss&scoped=true\"\n\nimport exportComponent from \"/mnt/data-lnx/Devs/00_Perso/FitTrackee/fittrackee_client/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-64629971\"]])\n\nexport default __exports__"],"names":["_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_1","id","class","_hoisted_2","key","_hoisted_3","_createElementVNode","_defineComponent","__name","setup","__props","store","useStore","appConfig","computed","getters","ROOT_STORE","appStatistics","isAuthUserAmin","AUTH_USER_STORE","userLoading","onBeforeMount","dispatch","_ctx","_cache","_component_router_view","_resolveComponent","_openBlock","_createElementBlock","_unref","_createCommentVNode","_createBlock","NotFound","__exports__"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +1,2 @@
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[845],{4264:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});r(7658);var n=r(6252),a=r(2262),s=r(3577),u=r(2201),o=r(7167),c=r(5801),i=r(9917);const l={key:0,id:"account-confirmation",class:"center-card with-margin"},E={class:"error-message"};var _=(0,n.aZ)({__name:"AccountConfirmationView",setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),_=(0,i.o)(),d=(0,n.Fl)((()=>_.getters[c.SY.GETTERS.ERROR_MESSAGES])),S=(0,n.Fl)((()=>t.query.token));function m(){S.value?_.dispatch(c.YN.ACTIONS.CONFIRM_ACCOUNT,{token:S.value}):r.push("/")}return(0,n.wF)((()=>m())),(0,n.Ah)((()=>_.commit(c.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(e,t)=>{const r=(0,n.up)("router-link");return(0,a.SU)(d)?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n.Wm)(r,{class:"links",to:"/account-confirmation/resend"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("buttons.ACCOUNT-CONFIRMATION-RESEND"))+"? ",1)])),_:1})])])):(0,n.kq)("",!0)}}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-785df978"]]);var m=S},8793:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});r(7658);var n=r(6252),a=r(2262),s=r(3577),u=r(2201),o=r(7167),c=r(5801),i=r(9917);const l={key:0,id:"email-update",class:"center-card with-margin"},E={class:"error-message"};var _=(0,n.aZ)({__name:"EmailUpdateView",setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),_=(0,i.o)(),d=(0,n.Fl)((()=>_.getters[c.YN.GETTERS.AUTH_USER_PROFILE])),S=(0,n.Fl)((()=>_.getters[c.YN.GETTERS.IS_AUTHENTICATED])),m=(0,n.Fl)((()=>_.getters[c.SY.GETTERS.ERROR_MESSAGES])),p=(0,n.Fl)((()=>t.query.token));function R(){p.value?_.dispatch(c.YN.ACTIONS.CONFIRM_EMAIL,{token:p.value,refreshUser:S.value}):r.push("/")}return(0,n.wF)((()=>R())),(0,n.Ah)((()=>_.commit(c.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(0,n.YP)((()=>m.value),(e=>{d.value.username&&e&&r.push("/")})),(e,t)=>{const r=(0,n.up)("router-link"),u=(0,n.up)("i18n-t");return(0,a.SU)(m)&&!(0,a.SU)(d).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n._)("span",null,[(0,n.Wm)(u,{keypath:"user.PROFILE.ERRORED_EMAIL_UPDATE"},{default:(0,n.w5)((()=>[(0,n.Wm)(r,{to:"/login"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("user.LOG_IN")),1)])),_:1})])),_:1})])])])):(0,n.kq)("",!0)}}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-8c2ec9ce"]]);var m=S},1133:function(e,t,r){r.r(t),r.d(t,{default:function(){return d}});var n=r(6252),a=r(2262),s=r(5801),u=r(9917);const o=e=>((0,n.dD)("data-v-6646c65e"),e=e(),(0,n.Cn)(),e),c={key:0,id:"profile",class:"view"},i=o((()=>(0,n._)("div",{id:"bottom"},null,-1)));var l=(0,n.aZ)({__name:"ProfileView",setup(e){const t=(0,u.o)(),r=(0,n.Fl)((()=>t.getters[s.YN.GETTERS.AUTH_USER_PROFILE]));return(e,t)=>{const s=(0,n.up)("router-view");return(0,a.SU)(r).username?((0,n.wg)(),(0,n.iD)("div",c,[(0,n.Wm)(s,{user:(0,a.SU)(r)},null,8,["user"]),i])):(0,n.kq)("",!0)}}}),E=r(3744);const _=(0,E.Z)(l,[["__scopeId","data-v-6646c65e"]]);var d=_},9453:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(6252),a=r(2262),s=r(2201),u=r(2179),o=r(1585),c=r(5801),i=r(9917);const l={key:0,id:"user",class:"view"},E={class:"box"};var _=(0,n.aZ)({__name:"UserView",props:{fromAdmin:{type:Boolean}},setup(e){const t=e,{fromAdmin:r}=(0,a.BK)(t),_=(0,s.yj)(),d=(0,i.o)(),S=(0,n.Fl)((()=>d.getters[c.RT.GETTERS.USER]));return(0,n.wF)((()=>{_.params.username&&"string"===typeof _.params.username&&d.dispatch(c.RT.ACTIONS.GET_USER,_.params.username)})),(0,n.Jd)((()=>{d.dispatch(c.RT.ACTIONS.EMPTY_USER)})),(e,t)=>(0,a.SU)(S).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(u.Z,{user:(0,a.SU)(S)},null,8,["user"]),(0,n._)("div",E,[(0,n.Wm)(o.Z,{user:(0,a.SU)(S),"from-admin":(0,a.SU)(r)},null,8,["user","from-admin"])])])):(0,n.kq)("",!0)}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-af7007f4"]]);var m=S}}]);
//# sourceMappingURL=profile.98e985f4.js.map
//# sourceMappingURL=profile.d284fee8.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +1,2 @@
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[193],{7885:function(e,s,t){t.r(s),t.d(s,{default:function(){return A}});var a=t(6252),r=t(2262),l=t(3577),o=(t(7658),t(9150)),n=t(436);const c={class:"chart-menu"},i={class:"chart-arrow"},u={class:"time-frames custom-checkboxes-group"},d={class:"time-frames-checkboxes custom-checkboxes"},p=["id","name","checked","onInput"],m={class:"chart-arrow"};var v=(0,a.aZ)({__name:"StatsMenu",emits:["arrowClick","timeFrameUpdate"],setup(e,{emit:s}){const t=(0,r.iH)("month"),o=["week","month","year"];function n(e){t.value=e,s("timeFrameUpdate",e)}return(e,r)=>((0,a.wg)(),(0,a.iD)("div",c,[(0,a._)("div",i,[(0,a._)("i",{class:"fa fa-chevron-left","aria-hidden":"true",onClick:r[0]||(r[0]=e=>s("arrowClick",!0))})]),(0,a._)("div",u,[(0,a._)("div",d,[((0,a.wg)(),(0,a.iD)(a.HY,null,(0,a.Ko)(o,(s=>(0,a._)("div",{class:"time-frame custom-checkbox",key:s},[(0,a._)("label",null,[(0,a._)("input",{type:"radio",id:s,name:s,checked:t.value===s,onInput:e=>n(s)},null,40,p),(0,a._)("span",null,(0,l.zw)(e.$t(`statistics.TIME_FRAMES.${s}`)),1)])]))),64))])]),(0,a._)("div",m,[(0,a._)("i",{class:"fa fa-chevron-right","aria-hidden":"true",onClick:r[1]||(r[1]=e=>s("arrowClick",!1))})])]))}}),k=t(3744);const _=(0,k.Z)(v,[["__scopeId","data-v-22d55de2"]]);var S=_,w=t(631);const f={class:"sports-menu"},h=["id","name","checked","onInput"],U={class:"sport-label"};var b=(0,a.aZ)({__name:"StatsSportsMenu",props:{userSports:null,selectedSportIds:{default:()=>[]}},emits:["selectedSportIdsUpdate"],setup(e,{emit:s}){const t=e,{t:n}=(0,o.QT)(),c=(0,a.f3)("sportColors"),{selectedSportIds:i}=(0,r.BK)(t),u=(0,a.Fl)((()=>(0,w.xH)(t.userSports,n)));function d(e){s("selectedSportIdsUpdate",e)}return(e,s)=>{const t=(0,a.up)("SportImage");return(0,a.wg)(),(0,a.iD)("div",f,[((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)((0,r.SU)(u),(e=>((0,a.wg)(),(0,a.iD)("label",{type:"checkbox",key:e.id,style:(0,l.j5)({color:e.color?e.color:(0,r.SU)(c)[e.label]})},[(0,a._)("input",{type:"checkbox",id:e.id,name:e.label,checked:(0,r.SU)(i).includes(e.id),onInput:s=>d(e.id)},null,40,h),(0,a.Wm)(t,{"sport-label":e.label,color:e.color},null,8,["sport-label","color"]),(0,a._)("span",U,(0,l.zw)(e.translatedLabel),1)],4)))),128))])}}});const I=b;var g=I,T=t(9318);const y={key:0,id:"user-statistics"};var C=(0,a.aZ)({__name:"index",props:{sports:null,user:null},setup(e){const s=e,{t:t}=(0,o.QT)(),{sports:l,user:c}=(0,r.BK)(s),i=(0,r.iH)("month"),u=(0,r.iH)(v(i.value)),d=(0,a.Fl)((()=>(0,w.xH)(s.sports,t))),p=(0,r.iH)(_(s.sports));function m(e){i.value=e,u.value=v(i.value)}function v(e){return(0,T.aZ)(new Date,e,s.user.weekm)}function k(e){u.value=(0,T.FN)(u.value,e,s.user.weekm)}function _(e){return e.map((e=>e.id))}function f(e){p.value.includes(e)?p.value=p.value.filter((s=>s!==e)):p.value.push(e)}return(0,a.YP)((()=>s.sports),(e=>{p.value=_(e)})),(e,s)=>(0,r.SU)(d)?((0,a.wg)(),(0,a.iD)("div",y,[(0,a.Wm)(S,{onTimeFrameUpdate:m,onArrowClick:k}),(0,a.Wm)(n.Z,{sports:(0,r.SU)(l),user:(0,r.SU)(c),chartParams:u.value,"displayed-sport-ids":p.value,fullStats:!0},null,8,["sports","user","chartParams","displayed-sport-ids"]),(0,a.Wm)(g,{"selected-sport-ids":p.value,"user-sports":(0,r.SU)(l),onSelectedSportIdsUpdate:f},null,8,["selected-sport-ids","user-sports"])])):(0,a.kq)("",!0)}});const F=(0,k.Z)(C,[["__scopeId","data-v-30799d13"]]);var Z=F,x=t(5630),D=t(5801),H=t(9917);const E={id:"statistics",class:"view"},R={key:0,class:"container"};var W=(0,a.aZ)({__name:"StatisticsView",setup(e){const s=(0,H.o)(),t=(0,a.Fl)((()=>s.getters[D.YN.GETTERS.AUTH_USER_PROFILE])),o=(0,a.Fl)((()=>s.getters[D.O8.GETTERS.SPORTS].filter((e=>t.value.sports_list.includes(e.id)))));return(e,s)=>{const n=(0,a.up)("Card");return(0,a.wg)(),(0,a.iD)("div",E,[(0,r.SU)(t).username?((0,a.wg)(),(0,a.iD)("div",R,[(0,a.Wm)(n,null,{title:(0,a.w5)((()=>[(0,a.Uk)((0,l.zw)(e.$t("statistics.STATISTICS")),1)])),content:(0,a.w5)((()=>[(0,a.Wm)(Z,{class:(0,l.C_)({"stats-disabled":0===(0,r.SU)(t).nb_workouts}),user:(0,r.SU)(t),sports:(0,r.SU)(o)},null,8,["class","user","sports"])])),_:1}),0===(0,r.SU)(t).nb_workouts?((0,a.wg)(),(0,a.j4)(x.Z,{key:0})):(0,a.kq)("",!0)])):(0,a.kq)("",!0)])}}});const P=(0,k.Z)(W,[["__scopeId","data-v-2e341d4e"]]);var A=P}}]);
//# sourceMappingURL=statistics.5228e1ba.js.map
//# sourceMappingURL=statistics.3b4abef2.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -8,21 +8,23 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2023-03-12 07:50+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2023-03-15 13:40+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/fittrackee/"
"fittrackee-api-emails/es/>\n"
"Language: es\n"
"Language-Team: es <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.12.1\n"
#: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1
#, python-format
msgid "Hi %(username)s,"
msgstr ""
msgstr "Hola %(username)s,"
#: fittrackee/emails/templates/account_confirmation/body.txt:6
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:3
@ -35,41 +37,43 @@ msgid ""
"For security, this request was received from a %(operating_system)s "
"device using %(browser_name)s."
msgstr ""
"Por seguridad, esta solicitud se ha recibido desde un dispositivo "
"%(operating_system)s usando %(browser_name)s."
#: fittrackee/emails/templates/layout.html:221
#: fittrackee/emails/templates/layout.txt:5
msgid "Thanks,"
msgstr ""
msgstr "Gracias,"
#: fittrackee/emails/templates/layout.html:222
#: fittrackee/emails/templates/layout.txt:6
msgid "The FitTrackee Team"
msgstr ""
msgstr "El Equipo FitTrackee"
#: fittrackee/emails/templates/account_confirmation/body.html:2
#: fittrackee/emails/templates/account_confirmation/subject.txt:1
msgid "Confirm your account"
msgstr ""
msgstr "Confirmar mi cuenta"
#: fittrackee/emails/templates/account_confirmation/body.html:3
msgid "Use this link to confirm your account."
msgstr ""
msgstr "Usa este enlace para confirmar tu cuenta."
#: fittrackee/emails/templates/account_confirmation/body.html:4
#: fittrackee/emails/templates/account_confirmation/body.txt:1
msgid "You have created an account on FitTrackee."
msgstr ""
msgstr "Has creado una cuenta en FitTrackee."
#: fittrackee/emails/templates/account_confirmation/body.html:4
msgid "Use the button below to confirm your address email."
msgstr ""
msgstr "Usa el botón inferior para confirmar tu dirección de correo."
#: fittrackee/emails/templates/account_confirmation/body.html:11
#: fittrackee/emails/templates/account_confirmation/body.txt:4
#: fittrackee/emails/templates/email_update_to_new_email/body.html:11
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:4
msgid "Verify your email"
msgstr ""
msgstr "Verifica tu email"
#: fittrackee/emails/templates/account_confirmation/body.html:18
#: fittrackee/emails/templates/account_confirmation/body.txt:7
@ -77,6 +81,7 @@ msgid ""
"If this account creation wasn't initiated by you, please ignore this "
"email."
msgstr ""
"Si no has iniciado la creación de esta cuenta, por favor ignora este correo."
#: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
@ -86,34 +91,36 @@ msgid ""
"If you're having trouble with the button above, copy and paste the URL "
"below into your web browser."
msgstr ""
"Si tienes problemas con el botón superior, copia y pega la URL inferior en "
"tu navegador web."
#: fittrackee/emails/templates/account_confirmation/body.txt:2
msgid "Use the link below to confirm your address email."
msgstr ""
msgstr "Usa la dirección inferior para confirmar tu dirección de correo."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr ""
msgstr "Tu archivo está listo para ser descargado"
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr ""
msgstr "Tienes un enlace de descarga disponible en tu cuenta."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr ""
msgstr "Has solicitado la exportación de tu cuenta en FitTrackee."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr ""
msgstr "El archivo está listo para ser descargado desde tu cuenta."
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr ""
msgstr "Descarga tu archivo"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
@ -121,15 +128,17 @@ msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
"Si no has solicitado la exportación, cambia inmediatamente la contraseña o "
"contacta con la administración si tu cuenta está bloqueada."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed"
msgstr ""
msgstr "Email cambiado"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:3
msgid "Your email is being updated."
msgstr ""
msgstr "Tu email ha sido actualizado."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:4
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:1
@ -137,6 +146,8 @@ msgid ""
"You recently requested to change your email address for your FitTrackee "
"account to:"
msgstr ""
"Recientemente has solicitado cambiar tu dirección de correo en tu instancia "
"FitTrackee a:"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:18
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:4
@ -144,15 +155,17 @@ msgid ""
"If this email change wasn't initiated by you, please change your password"
" immediately or contact your administrator if your account is locked."
msgstr ""
"Si no has solicitado este cambio de email, por favor cambia inmediatamente "
"tu contraseña o contacta con la administración si tu cuenta está bloqueada."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:2
#: fittrackee/emails/templates/email_update_to_new_email/subject.txt:1
msgid "Confirm email change"
msgstr ""
msgstr "Confirma el cambio de email"
#: fittrackee/emails/templates/email_update_to_new_email/body.html:3
msgid "Use this link to confirm email change."
msgstr ""
msgstr "Usa este enlace para confirmar el cambio de email."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:1
@ -160,33 +173,35 @@ msgid ""
"You recently requested to change your email address for your FitTrackee "
"account."
msgstr ""
"Has solicitado recientemente cambiar la dirección de email de tu cuenta "
"FitTrackee."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4
msgid "Use the button below to confirm this address."
msgstr ""
msgstr "Usa el botón inferior para confirmar esta dirección."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:18
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:7
msgid "If this email change wasn't initiated by you, please ignore this email."
msgstr ""
msgstr "Si no has iniciado este cambio, por favor ignora este correo."
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:2
msgid "Use the link below to confirm this address."
msgstr ""
msgstr "Usa el enlace inferior para confirmar esta dirección."
#: fittrackee/emails/templates/password_change/body.html:2
#: fittrackee/emails/templates/password_change/subject.txt:1
msgid "Password changed"
msgstr ""
msgstr "Contraseña cambiada"
#: fittrackee/emails/templates/password_change/body.html:3
msgid "Your password has been changed."
msgstr ""
msgstr "Tu contraseña ha sido cambiada."
#: fittrackee/emails/templates/password_change/body.html:4
#: fittrackee/emails/templates/password_change/body.txt:1
msgid "The password for your FitTrackee account has been changed."
msgstr ""
msgstr "La contraseña de tu cuenta FitTrackee ha sido cambiada."
#: fittrackee/emails/templates/password_change/body.html:5
#: fittrackee/emails/templates/password_change/body.txt:4
@ -195,11 +210,13 @@ msgid ""
"password immediately or contact your administrator if your account is "
"locked."
msgstr ""
"Si no has iniciado este cambio de contraseña, por favor cambia la contraseña "
"ahora mismo o contacta con la administración si la cuenta está bloqueada."
#: fittrackee/emails/templates/password_reset_request/body.html:2
#: fittrackee/emails/templates/password_reset_request/subject.txt:1
msgid "Password reset request"
msgstr ""
msgstr "Solicitud de cambio de contraseña"
#: fittrackee/emails/templates/password_reset_request/body.html:3
#, python-format
@ -207,33 +224,37 @@ msgid ""
"Use this link to reset your password. The link is only valid for "
"%(expiration_delay)s."
msgstr ""
"Usa este enlace para cambiar tu contraseña. Este enlace será válido durante "
"%(expiration_delay)s."
#: fittrackee/emails/templates/password_reset_request/body.html:4
#: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "You recently requested to reset your password for your FitTrackee account."
msgstr ""
"Recientemente has solicitado cambiar la contraseña de tu cuenta FitTrackee."
#: fittrackee/emails/templates/password_reset_request/body.html:4
msgid "Use the button below to reset it."
msgstr ""
msgstr "Usa el botón inferior para restablecerla."
#: fittrackee/emails/templates/password_reset_request/body.html:5
#: fittrackee/emails/templates/password_reset_request/body.txt:2
#, python-format
msgid "This password reset link is only valid for %(expiration_delay)s."
msgstr ""
"Este enlace para restablecer la contraseña sólo será válido durante "
"%(expiration_delay)s."
#: fittrackee/emails/templates/password_reset_request/body.html:13
#: fittrackee/emails/templates/password_reset_request/body.txt:4
msgid "Reset your password"
msgstr ""
msgstr "Restablecer contraseña"
#: fittrackee/emails/templates/password_reset_request/body.html:20
#: fittrackee/emails/templates/password_reset_request/body.txt:7
msgid "If you did not request a password reset, please ignore this email."
msgstr ""
msgstr "Si no has solicitado restablecer la contraseña, ignora este email."
#: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "Use the link below to reset it."
msgstr ""
msgstr "Usa el enlace inferior para restablecerla."

View File

@ -8,21 +8,23 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2023-03-12 07:50+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2023-03-22 17:40+0000\n"
"Last-Translator: \"josé m.\" <correoxm@disroot.org>\n"
"Language-Team: Galician <https://hosted.weblate.org/projects/fittrackee/"
"fittrackee-api-emails/gl/>\n"
"Language: gl\n"
"Language-Team: gl <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.12.1\n"
#: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1
#, python-format
msgid "Hi %(username)s,"
msgstr ""
msgstr "Ola %(username)s,"
#: fittrackee/emails/templates/account_confirmation/body.txt:6
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:3
@ -35,41 +37,43 @@ msgid ""
"For security, this request was received from a %(operating_system)s "
"device using %(browser_name)s."
msgstr ""
"Por seguridade, recibiuse a solicitude desde un dispositivo "
"%(operating_system)s usando %(browser_name)s."
#: fittrackee/emails/templates/layout.html:221
#: fittrackee/emails/templates/layout.txt:5
msgid "Thanks,"
msgstr ""
msgstr "Grazas,"
#: fittrackee/emails/templates/layout.html:222
#: fittrackee/emails/templates/layout.txt:6
msgid "The FitTrackee Team"
msgstr ""
msgstr "O Equipo FitTrackee"
#: fittrackee/emails/templates/account_confirmation/body.html:2
#: fittrackee/emails/templates/account_confirmation/subject.txt:1
msgid "Confirm your account"
msgstr ""
msgstr "Confirma a túa conta"
#: fittrackee/emails/templates/account_confirmation/body.html:3
msgid "Use this link to confirm your account."
msgstr ""
msgstr "Usa esta ligazón para confirmar a conta."
#: fittrackee/emails/templates/account_confirmation/body.html:4
#: fittrackee/emails/templates/account_confirmation/body.txt:1
msgid "You have created an account on FitTrackee."
msgstr ""
msgstr "Creaches unha conta en FitTrackee."
#: fittrackee/emails/templates/account_confirmation/body.html:4
msgid "Use the button below to confirm your address email."
msgstr ""
msgstr "Usa o botón inferior para confirmar o enderezo do teu correo."
#: fittrackee/emails/templates/account_confirmation/body.html:11
#: fittrackee/emails/templates/account_confirmation/body.txt:4
#: fittrackee/emails/templates/email_update_to_new_email/body.html:11
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:4
msgid "Verify your email"
msgstr ""
msgstr "Verifica o email"
#: fittrackee/emails/templates/account_confirmation/body.html:18
#: fittrackee/emails/templates/account_confirmation/body.txt:7
@ -77,6 +81,7 @@ msgid ""
"If this account creation wasn't initiated by you, please ignore this "
"email."
msgstr ""
"Se non iniciaches ti a creación da conta, ignora este correo electrónico."
#: fittrackee/emails/templates/account_confirmation/body.html:22
#: fittrackee/emails/templates/data_export_ready/body.html:22
@ -86,34 +91,36 @@ msgid ""
"If you're having trouble with the button above, copy and paste the URL "
"below into your web browser."
msgstr ""
"Se tes problemas co botón superior, copia e pega o URL inferior no teu "
"navegador web."
#: fittrackee/emails/templates/account_confirmation/body.txt:2
msgid "Use the link below to confirm your address email."
msgstr ""
msgstr "Usa a ligazón inferior para confirmar o teu enderezo de correo."
#: fittrackee/emails/templates/data_export_ready/body.html:2
#: fittrackee/emails/templates/data_export_ready/subject.txt:1
msgid "Your archive is ready to be downloaded"
msgstr ""
msgstr "O arquivo está listo para descargar"
#: fittrackee/emails/templates/data_export_ready/body.html:3
msgid "A download link is available in your account."
msgstr ""
msgstr "Tes unha ligazón de descarga dispoñible na túa conta."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:1
msgid "You have requested an export of your account on FitTrackee."
msgstr ""
msgstr "Solicitaches exportar a túa conta de FitTrackee."
#: fittrackee/emails/templates/data_export_ready/body.html:4
#: fittrackee/emails/templates/data_export_ready/body.txt:2
msgid "The archive is now ready to be downloaded from your account."
msgstr ""
msgstr "O arquivo está dispoñible na túa conta para ser descargado."
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr ""
msgstr "Descarga o teu arquivo"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
@ -121,15 +128,17 @@ msgid ""
"If you did not request the export, please change your password "
"immediately or contact your administrator if your account is locked."
msgstr ""
"Se non solicitaches a exportación, cambia agora mesmo o contrasinal ou "
"contacta coa administración se a conta está bloqueada."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed"
msgstr ""
msgstr "Email cambiado"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:3
msgid "Your email is being updated."
msgstr ""
msgstr "Estase actualizando o enderezo de email."
#: fittrackee/emails/templates/email_update_to_current_email/body.html:4
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:1
@ -137,6 +146,8 @@ msgid ""
"You recently requested to change your email address for your FitTrackee "
"account to:"
msgstr ""
"Recentemente solicitaches cambiar o enderezo de correo da túa conta "
"FitTrackee a:"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:18
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:4
@ -144,15 +155,17 @@ msgid ""
"If this email change wasn't initiated by you, please change your password"
" immediately or contact your administrator if your account is locked."
msgstr ""
"Se non solicitaches este cambio, cambia agora mesmo o contrasinal ou "
"contacta coa administración se a conta está bloqueada."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:2
#: fittrackee/emails/templates/email_update_to_new_email/subject.txt:1
msgid "Confirm email change"
msgstr ""
msgstr "Confirma o cambio de email"
#: fittrackee/emails/templates/email_update_to_new_email/body.html:3
msgid "Use this link to confirm email change."
msgstr ""
msgstr "Usa esta ligazón para confirmar o cambio."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:1
@ -160,33 +173,35 @@ msgid ""
"You recently requested to change your email address for your FitTrackee "
"account."
msgstr ""
"Recentemente solicitaches cambiar o enderezo de correo da túa conta "
"FitTrackee."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:4
msgid "Use the button below to confirm this address."
msgstr ""
msgstr "Usa o botón inferior para confirmar este enderezo."
#: fittrackee/emails/templates/email_update_to_new_email/body.html:18
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:7
msgid "If this email change wasn't initiated by you, please ignore this email."
msgstr ""
msgstr "Se non solicitaches este cambio, podes ignorar este correo."
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:2
msgid "Use the link below to confirm this address."
msgstr ""
msgstr "Usa a ligazón inferior para confirmar este enderezo."
#: fittrackee/emails/templates/password_change/body.html:2
#: fittrackee/emails/templates/password_change/subject.txt:1
msgid "Password changed"
msgstr ""
msgstr "Contrasinal cambiado"
#: fittrackee/emails/templates/password_change/body.html:3
msgid "Your password has been changed."
msgstr ""
msgstr "Realizouse o cambio de contrasinal."
#: fittrackee/emails/templates/password_change/body.html:4
#: fittrackee/emails/templates/password_change/body.txt:1
msgid "The password for your FitTrackee account has been changed."
msgstr ""
msgstr "Realizouse o cambio de contrasinal da túa conta FitTrackee."
#: fittrackee/emails/templates/password_change/body.html:5
#: fittrackee/emails/templates/password_change/body.txt:4
@ -195,11 +210,13 @@ msgid ""
"password immediately or contact your administrator if your account is "
"locked."
msgstr ""
"Se non solicitaches este cambio de contrasinal, cambia agora mesmo o "
"contrasinal ou contacta coa administración se a conta está bloqueada."
#: fittrackee/emails/templates/password_reset_request/body.html:2
#: fittrackee/emails/templates/password_reset_request/subject.txt:1
msgid "Password reset request"
msgstr ""
msgstr "Solicitude para restablecer contrasinal"
#: fittrackee/emails/templates/password_reset_request/body.html:3
#, python-format
@ -207,33 +224,37 @@ msgid ""
"Use this link to reset your password. The link is only valid for "
"%(expiration_delay)s."
msgstr ""
"Usa esta ligazón para restablecer o contrasinal. A ligazón será válida "
"durante %(expiration_delay)s."
#: fittrackee/emails/templates/password_reset_request/body.html:4
#: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "You recently requested to reset your password for your FitTrackee account."
msgstr ""
"Recentemente solicitaches cambiar o contrasinal da túa conta FitTrackee."
#: fittrackee/emails/templates/password_reset_request/body.html:4
msgid "Use the button below to reset it."
msgstr ""
msgstr "Usa o botón inferior para restablecela."
#: fittrackee/emails/templates/password_reset_request/body.html:5
#: fittrackee/emails/templates/password_reset_request/body.txt:2
#, python-format
msgid "This password reset link is only valid for %(expiration_delay)s."
msgstr ""
"A ligazón para restablecer o contrasinal será válido durante "
"%(expiration_delay)s."
#: fittrackee/emails/templates/password_reset_request/body.html:13
#: fittrackee/emails/templates/password_reset_request/body.txt:4
msgid "Reset your password"
msgstr ""
msgstr "Restablece o contrasinal"
#: fittrackee/emails/templates/password_reset_request/body.html:20
#: fittrackee/emails/templates/password_reset_request/body.txt:7
msgid "If you did not request a password reset, please ignore this email."
msgstr ""
msgstr "Se non solicitaches restablecer o contrasinal, ignora este correo."
#: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "Use the link below to reset it."
msgstr ""
msgstr "Usa a ligazón inferior para restablecelo."

View File

@ -8,21 +8,23 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-03-04 10:33+0100\n"
"PO-Revision-Date: 2022-10-31 10:19+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2023-03-13 06:42+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
"fittrackee/fittrackee-api-emails/nb_NO/>\n"
"Language: nb\n"
"Language-Team: nb <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.11.0\n"
#: fittrackee/emails/templates/layout.html:215
#: fittrackee/emails/templates/layout.txt:1
#, python-format
msgid "Hi %(username)s,"
msgstr ""
msgstr "Hei %(username)s,"
#: fittrackee/emails/templates/account_confirmation/body.txt:6
#: fittrackee/emails/templates/email_update_to_current_email/body.txt:3
@ -39,7 +41,7 @@ msgstr ""
#: fittrackee/emails/templates/layout.html:221
#: fittrackee/emails/templates/layout.txt:5
msgid "Thanks,"
msgstr ""
msgstr "Takk,"
#: fittrackee/emails/templates/layout.html:222
#: fittrackee/emails/templates/layout.txt:6
@ -49,11 +51,11 @@ msgstr ""
#: fittrackee/emails/templates/account_confirmation/body.html:2
#: fittrackee/emails/templates/account_confirmation/subject.txt:1
msgid "Confirm your account"
msgstr ""
msgstr "Bekreft kontoen din"
#: fittrackee/emails/templates/account_confirmation/body.html:3
msgid "Use this link to confirm your account."
msgstr ""
msgstr "Bruk denne lenken for å bekrefte kontoen din."
#: fittrackee/emails/templates/account_confirmation/body.html:4
#: fittrackee/emails/templates/account_confirmation/body.txt:1
@ -69,7 +71,7 @@ msgstr ""
#: fittrackee/emails/templates/email_update_to_new_email/body.html:11
#: fittrackee/emails/templates/email_update_to_new_email/body.txt:4
msgid "Verify your email"
msgstr ""
msgstr "Bekreft e-postadressen din"
#: fittrackee/emails/templates/account_confirmation/body.html:18
#: fittrackee/emails/templates/account_confirmation/body.txt:7
@ -113,7 +115,7 @@ msgstr ""
#: fittrackee/emails/templates/data_export_ready/body.html:11
#: fittrackee/emails/templates/data_export_ready/body.txt:4
msgid "Download your archive"
msgstr ""
msgstr "Last ned arkivet ditt"
#: fittrackee/emails/templates/data_export_ready/body.html:18
#: fittrackee/emails/templates/data_export_ready/body.txt:5
@ -125,7 +127,7 @@ msgstr ""
#: fittrackee/emails/templates/email_update_to_current_email/body.html:2
#: fittrackee/emails/templates/email_update_to_current_email/subject.txt:1
msgid "Email changed"
msgstr ""
msgstr "E-post endret"
#: fittrackee/emails/templates/email_update_to_current_email/body.html:3
msgid "Your email is being updated."
@ -177,7 +179,7 @@ msgstr ""
#: fittrackee/emails/templates/password_change/body.html:2
#: fittrackee/emails/templates/password_change/subject.txt:1
msgid "Password changed"
msgstr ""
msgstr "Passord endret"
#: fittrackee/emails/templates/password_change/body.html:3
msgid "Your password has been changed."
@ -226,7 +228,7 @@ msgstr ""
#: fittrackee/emails/templates/password_reset_request/body.html:13
#: fittrackee/emails/templates/password_reset_request/body.txt:4
msgid "Reset your password"
msgstr ""
msgstr "Tilbakestill passord ditt"
#: fittrackee/emails/templates/password_reset_request/body.html:20
#: fittrackee/emails/templates/password_reset_request/body.txt:7
@ -235,5 +237,4 @@ msgstr ""
#: fittrackee/emails/templates/password_reset_request/body.txt:1
msgid "Use the link below to reset it."
msgstr ""
msgstr "Bruk lenken nedenfor for å tilbakestille det."

View File

@ -0,0 +1,35 @@
"""add user preference to start elevation plots at zero
Revision ID: db58d195c5bf
Revises: 374a670efe23
Create Date: 2023-03-14 04:14:23.781672
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'db58d195c5bf'
down_revision = '374a670efe23'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('users', schema=None) as batch_op:
batch_op.add_column(sa.Column('start_elevation_at_zero', sa.Boolean(), nullable=True))
op.execute("UPDATE users SET start_elevation_at_zero = true")
op.alter_column('users', 'start_elevation_at_zero', nullable=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('users', schema=None) as batch_op:
batch_op.drop_column('start_elevation_at_zero')
# ### end Alembic commands ###

View File

@ -1482,6 +1482,7 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin):
language=input_language,
imperial_units=True,
display_ascent=False,
start_elevation_at_zero=False,
date_format='yyyy-MM-dd',
)
),
@ -1493,6 +1494,7 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin):
assert data['status'] == 'success'
assert data['message'] == 'user preferences updated'
assert data['data']['display_ascent'] is False
assert data['data']['start_elevation_at_zero'] is False
assert data['data']['imperial_units'] is True
assert data['data']['language'] == expected_language
assert data['data']['timezone'] == 'America/New_York'

View File

@ -869,6 +869,7 @@ def edit_user_preferences(auth_user: User) -> Union[Dict, HttpResponse]:
4,
6
],
"start_elevation_at_zero": true,
"timezone": "Europe/Paris",
"total_distance": 67.895,
"total_duration": "6:50:27",
@ -883,9 +884,9 @@ def edit_user_preferences(auth_user: User) -> Union[Dict, HttpResponse]:
:<json boolean display_ascent: display highest ascent records and total
:<json boolean imperial_units: display distance in imperial units
:<json string language: language preferences
:<json boolean start_elevation_at_zero: do elevation plots start at zero?
:<json string timezone: user time zone
:<json boolean weekm: does week start on Monday?
:<json boolean weekm: does week start on Monday?
:reqheader Authorization: OAuth 2.0 Bearer Token
@ -906,6 +907,7 @@ def edit_user_preferences(auth_user: User) -> Union[Dict, HttpResponse]:
'display_ascent',
'imperial_units',
'language',
'start_elevation_at_zero',
'timezone',
'weekm',
}
@ -916,6 +918,7 @@ def edit_user_preferences(auth_user: User) -> Union[Dict, HttpResponse]:
display_ascent = post_data.get('display_ascent')
imperial_units = post_data.get('imperial_units')
language = get_language(post_data.get('language'))
start_elevation_at_zero = post_data.get('start_elevation_at_zero')
timezone = post_data.get('timezone')
weekm = post_data.get('weekm')
@ -924,6 +927,7 @@ def edit_user_preferences(auth_user: User) -> Union[Dict, HttpResponse]:
auth_user.display_ascent = display_ascent
auth_user.imperial_units = imperial_units
auth_user.language = language
auth_user.start_elevation_at_zero = start_elevation_at_zero
auth_user.timezone = timezone
auth_user.weekm = weekm
db.session.commit()

View File

@ -59,6 +59,9 @@ class User(BaseModel):
confirmation_token = db.Column(db.String(255), nullable=True)
display_ascent = db.Column(db.Boolean, default=True, nullable=False)
accepted_policy_date = db.Column(db.DateTime, nullable=True)
start_elevation_at_zero = db.Column(
db.Boolean, default=True, nullable=False
)
def __repr__(self) -> str:
return f'<User {self.username!r}>'
@ -211,6 +214,7 @@ class User(BaseModel):
'display_ascent': self.display_ascent,
'imperial_units': self.imperial_units,
'language': self.language,
'start_elevation_at_zero': self.start_elevation_at_zero,
'timezone': self.timezone,
'weekm': self.weekm,
},

View File

@ -69,7 +69,7 @@ class VisualCrossing(BaseWeather):
self.api_key, '*****'
)
)
r = requests.get(url, params=self.params)
r = requests.get(url, params=self.params, timeout=10)
r.raise_for_status()
res = r.json()
weather = res['currentConditions']

View File

@ -853,7 +853,7 @@ def get_map_tile(s: str, z: str, x: str, y: str) -> Tuple[Response, int]:
y=secure_filename(y),
)
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:88.0)'}
response = requests.get(url, headers=headers)
response = requests.get(url, headers=headers, timeout=30)
return (
Response(
response.content,

View File

@ -12,7 +12,7 @@
},
"dependencies": {
"@tmcw/togeojson": "^5.6.0",
"@vue-leaflet/vue-leaflet": "^0.8.4",
"@vue-leaflet/vue-leaflet": "^0.9.0",
"@zxcvbn-ts/core": "^2.2.1",
"@zxcvbn-ts/language-common": "^2.0.1",
"@zxcvbn-ts/language-de": "^2.1.0",
@ -20,15 +20,15 @@
"@zxcvbn-ts/language-es-es": "^2.1.1",
"@zxcvbn-ts/language-fr": "^2.2.0",
"@zxcvbn-ts/language-it": "^2.1.0",
"axios": "^1.3.4",
"axios": "^1.3.5",
"chart.js": "^4.2.1",
"chartjs-plugin-datalabels": "^2.2.0",
"core-js": "^3.29.0",
"core-js": "^3.30.0",
"date-fns": "^2.29.3",
"date-fns-tz": "^2.0.0",
"leaflet": "^1.9.3",
"linkify-html": "^4.0.2",
"linkifyjs": "^4.0.2",
"linkify-html": "^4.1.1",
"linkifyjs": "^4.1.1",
"register-service-worker": "^1.7.1",
"sanitize-html": "^2.10.0",
"snarkdown": "^2.0.0",
@ -43,9 +43,9 @@
"@intlify/vue-i18n-loader": "^4.2.0",
"@types/chai": "^4.3.4",
"@types/mocha": "^10.0.1",
"@types/sanitize-html": "^2.8.1",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"@types/sanitize-html": "^2.9.0",
"@typescript-eslint/eslint-plugin": "^5.57.1",
"@typescript-eslint/parser": "^5.57.1",
"@vue/cli-plugin-babel": "~5.0.8",
"@vue/cli-plugin-eslint": "~5.0.8",
"@vue/cli-plugin-pwa": "~5.0.8",
@ -55,19 +55,19 @@
"@vue/cli-plugin-vuex": "~5.0.8",
"@vue/cli-service": "~5.0.8",
"@vue/eslint-config-typescript": "^11.0.2",
"@vue/test-utils": "^2.3.0",
"@vue/test-utils": "^2.3.2",
"chai": "^4.3.7",
"eslint": "8.35.0",
"eslint-config-prettier": "^8.6.0",
"eslint-import-resolver-typescript": "^3.5.3",
"eslint": "8.38.0",
"eslint-config-prettier": "^8.8.0",
"eslint-import-resolver-typescript": "^3.5.5",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.9.0",
"prettier": "^2.8.4",
"sass": "^1.58.3",
"sass-loader": "^13.2.0",
"typescript": "^4.9.5",
"vue-cli-plugin-i18n": "~2.3.1"
"eslint-plugin-vue": "^9.10.0",
"prettier": "^2.8.7",
"sass": "^1.61.0",
"sass-loader": "^13.2.2",
"typescript": "^5.0.4",
"vue-cli-plugin-i18n": "~2.3.2"
},
"eslintConfig": {
"root": true,

View File

@ -198,8 +198,9 @@
padding: 0 10px;
::v-deep(.dropdown-list) {
margin-left: -95px !important;
width: 115px !important;
z-index: 1000;
margin-left: -110px !important;
width: 131px !important;
}
}

View File

@ -19,6 +19,8 @@
</dd>
<dt>{{ $t('user.PROFILE.ASCENT_DATA') }}:</dt>
<dd>{{ $t(`common.${display_ascent}`) }}</dd>
<dt>{{ $t('user.PROFILE.ELEVATION_CHART_START.LABEL') }}:</dt>
<dd>{{ $t(`user.PROFILE.ELEVATION_CHART_START.${user.start_elevation_at_zero ? 'ZERO' : 'MIN_ALT'}`) }}</dd>
</dl>
<div class="profile-buttons">
<button @click="$router.push('/profile/edit/preferences')">

View File

@ -99,6 +99,26 @@
</label>
</div>
</div>
<div class="form-items form-checkboxes">
<span class="checkboxes-label">
{{ $t('user.PROFILE.ELEVATION_CHART_START.LABEL') }}
</span>
<div class="checkboxes">
<label v-for="status in startElevationAtZeroData" :key="status.label">
<input
type="radio"
:id="status.label"
:name="status.label"
:checked="status.value === userForm.start_elevation_at_zero"
:disabled="loading"
@input="updateStartElevationAtZero(status.value)"
/>
<span class="checkbox-label">
{{ $t(`user.PROFILE.ELEVATION_CHART_START.${status.label}`) }}
</span>
</label>
</div>
</div>
<div class="form-buttons">
<button class="confirm" type="submit">
{{ $t('buttons.SUBMIT') }}
@ -170,6 +190,16 @@
value: false,
},
]
const startElevationAtZeroData = [
{
label: 'ZERO',
value: true
},
{
label: 'MIN_ALT',
value: false
}
]
const loading = computed(
() => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]
)
@ -192,6 +222,7 @@
function updateUserForm(user: IAuthUserProfile) {
userForm.display_ascent = user.display_ascent
userForm.start_elevation_at_zero = user.start_elevation_at_zero ? user.start_elevation_at_zero : false
userForm.imperial_units = user.imperial_units ? user.imperial_units : false
userForm.language = user.language ? user.language : 'en'
userForm.timezone = user.timezone ? user.timezone : 'Europe/Paris'
@ -204,6 +235,9 @@
function updateTZ(value: string) {
userForm.timezone = value
}
function updateStartElevationAtZero(value: boolean) {
userForm.start_elevation_at_zero = value
}
function updateAscentDisplay(value: boolean) {
userForm.display_ascent = value
}

View File

@ -78,7 +78,7 @@
const { t } = useI18n()
const displayDistance = ref(true)
const beginElevationAtZero = ref(true)
const beginElevationAtZero = ref(props.authUser.start_elevation_at_zero)
const datasets: ComputedRef<IWorkoutChartData> = computed(() =>
getDatasets(props.workoutData.chartData, t, props.authUser.imperial_units)
)

View File

@ -6,18 +6,13 @@ import { createI18n, LocaleMessages, VueMessageType } from 'vue-i18n'
* The loaded `JSON` locale messages is pre-compiled by `@intlify/vue-i18n-loader`, which is integrated into `vue-cli-plugin-i18n`.
* See: https://github.com/intlify/vue-i18n-loader#rocket-i18n-resource-pre-compilation
*/
const disabledLanguages = ['nb', 'es', 'gl'] // to update after translations release
function loadLocaleMessages(): Record<string, LocaleMessages<VueMessageType>> {
const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.ts$/i)
const messages: Record<string, LocaleMessages<VueMessageType>> = {}
locales.keys().forEach((key) => {
const matched = key.match(/([A-Za-z0-9-_]+)\./i)
if (
matched &&
matched.length > 1 &&
!disabledLanguages.includes(matched[1])
) {
if (matched && matched.length > 1) {
const locale = matched[1]
messages[locale] = locales(key).default
}

View File

@ -69,6 +69,11 @@
"EDIT_PREFERENCES": "Edit preferences",
"EDIT_SPORTS_PREFERENCES": "Edit sports preferences",
"ERRORED_EMAIL_UPDATE": "Please {0} to change your email address again or contact the administrator",
"ELEVATION_CHART_START": {
"LABEL": "Elevation chart starts at",
"ZERO": "Zero",
"MIN_ALT": "Minimum altitude"
},
"FIRST_DAY_OF_WEEK": "First day of week",
"FIRST_NAME": "First name",
"LANGUAGE": "Language",

View File

@ -1,2 +1,8 @@
{
"ABOUT_THIS_INSTANCE": "Sobre esta instancia",
"CONTACT_ADMIN": "Contacta con la administración",
"FITTRACKEE_DESCRIPTION": "<strong>FitTrackee</strong> es un gestor de actividades en exterior autohospedado.",
"FITTRACKEE_LICENSE": "con licencia {0} ",
"SOURCE_CODE": "Código fuente",
"WEATHER_DATA_FROM": "Datos meteorología:"
}

View File

@ -1,2 +1,65 @@
{
"ABOUT": {
"DESCRIPTION": "Cualquier tipo de información adicional que pueda ser útil para tus usuarios. Puedes usar Markdown.",
"TEXT": "Información detallada sobre la instancia"
},
"ACTION": "Acción",
"ACTIVATE_USER_ACCOUNT": "Activar cuenta",
"ACTIVE": "Activa",
"ADMIN": "Admin",
"ADMINISTRATION": "Administración",
"ADMIN_RIGHTS_DELETE_USER_ACCOUNT": "Añadir/Retirar derechos de aministración, eliminar cuenta de usuario.",
"APPLICATION": "Aplicación",
"APP_CONFIG": {
"ADMIN_CONTACT": "Contacto por email con la administración",
"MAX_FILES_IN_ZIP_LABEL": "Núm. máximo de ficheros en el zip",
"MAX_USERS_HELP": "Si 0, no hay límite para los registros.",
"MAX_USERS_LABEL": "Núm. máximo de usuarios activos",
"NO_CONTACT_EMAIL": "sin email de contacto",
"SINGLE_UPLOAD_MAX_SIZE_LABEL": "Tamaño máx. de los ficheros subidos (en Mb)",
"TITLE": "Configuración de la aplicación",
"ZIP_UPLOAD_MAX_SIZE_LABEL": "Tamaño máx. del fichero zip (en Mb)"
},
"BACK_TO_ADMIN": "Volver a admin",
"CONFIRM_USER_ACCOUNT_DELETION": "¿Seguro que quieres eliminar la cuenta {0}? Se borrarán todos los datos y no será reversible.",
"CONFIRM_USER_PASSWORD_RESET": "¿Seguro que quieres restablecer la contraseña de {0}?",
"CURRENT_EMAIL": "Email actual",
"DELETE_USER": "Eliminar usuario",
"EMAIL_SENDING_DISABLED": "El envío de email está desactivado.",
"ENABLE_DISABLE_SPORTS": "Activar/desactivar deportes.",
"NEW_EMAIL": "Nuevo email",
"NO_TEXT_ENTERED": "No hay texto",
"PASSWORD_RESET_SUCCESSFUL": "Se ha restablecido la contraseña.",
"PRIVACY_POLICY_DESCRIPTION": "Añade tu propia política de privacidad o déjalo en blanco para usar una por defecto. Puedes usar Markdown.",
"REGISTRATION_DISABLED": "Actualmente está desactivada la creación de cuentas.",
"REGISTRATION_ENABLED": "Actualmente está abierta la creación de cuentas.",
"RESET_USER_PASSWORD": "Restablecer contraseña",
"SPORTS": {
"TABLE": {
"ACTIVE": "Activa",
"HAS_WORKOUTS": "ya existe el entrenamiento",
"IMAGE": "Imagen",
"LABEL": "Etiqueta"
},
"TITLE": "Administrar deportes"
},
"UPDATE_APPLICATION_DESCRIPTION": "Actualizar la configuración de la aplicación.",
"UPDATE_USER_EMAIL": "Actualizar email",
"USER": "usuario | usuarios",
"USERS": {
"SELECTS": {
"ORDER_BY": {
"ADMIN": "estatus de admin",
"CREATED_AT": "data de registro",
"IS_ACTIVE": "tipo de cuenta",
"USERNAME": "identificador",
"WORKOUTS_COUNT": "número de entramientos"
}
},
"TABLE": {
"ADD_ADMIN_RIGHTS": "Otorgar permiso de admin",
"REMOVE_ADMIN_RIGHTS": "Retirar permiso de admin"
}
},
"USER_EMAIL_UPDATE_SUCCESSFUL": "La dirección de email ha sido actualizada."
}

View File

@ -1,2 +1,41 @@
{
"ERROR": {
"Network Error": "Error en la red.",
"UNKNOWN": "Error. Inténtalo de nuevo o contacta con la administración.",
"at least one file in zip archive exceeds size limit, please check the archive": "Por lo menos uno de los ficheros dentro del archivo zip excede el límite de tamaño, comprueba el archivo.",
"completed request already exists": "Ya existe una solicitud de exportación completa.",
"email: valid email must be provided": "Email: debes proporcionar un email válido.",
"error during gpx file parsing": "Error al procesar el fichero gpx.",
"error during gpx processing": "Error en el procesado del gpx.",
"error on getting configuration": "Error al obtener la configuración.",
"error when saving workout": "Error al guardar el entrenamiento.",
"error when updating configuration": "Error al actualizar la configuración",
"error, please try again or contact the administrator": "Error, inténtalo de nuevo más tarde o contacta con la administración.",
"error, registration is disabled": "Error, no se permiten nuevos registros.",
"file extension not allowed": "Extensión de fichero no permitida.",
"file size is greater than the allowed size": "El tamaño del fichero es mayor del permitido.",
"invalid credentials": "Credenciales no válidas.",
"invalid payload": "Los datos proporcionados no son válidos.",
"invalid token, please log in again": "Token no válido, por favor vuelve a iniciar sesión.",
"invalid token, please request a new token": "Token no válido, inicia sesión de nuevo.",
"new email must be different than curent email": "El nuevo email tiene que ser diferente al email actual",
"no file part": "Sin fichero.",
"no selected file": "Sin fichero seleccionado.",
"ongoing request exists": "Ya existe una solicitud de exportación.",
"password: password and password confirmation do not match": "Contraseña: la contraseña y la confirmación no coinciden.",
"provide a valid auth token": "Proporciona un auth token válido.",
"signature expired, please log in again": "Firma caducada. Inicia sesión de nuevo.",
"sorry, that username is already taken": "Lo sentimos, pero el nombre de usuario ya está en uso.",
"sport does not exist": "No existe este deporte.",
"successfully registered": "Cuenta creada correctamente.",
"the number of files in the archive exceeds the limit": "El número de ficheros en el archivo excede el límite.",
"user does not exist": "No existe el usuario.",
"valid email must be provided for admin contact": "Debes proporcionar un email válido para el contacto de administración",
"you can not delete your account, no other user has admin rights": "No puedes eliminar tu cuenta, ninguna otra tiene permisos de administración.",
"you do not have permissions": "No tienes permiso."
},
"PAGINATION": {
"NEXT": "siguiente",
"PREVIOUS": "anterior"
}
}

View File

@ -1,2 +1,19 @@
{
"ACCOUNT-CONFIRMATION-RESEND": "Reenviar correo de confirmación",
"AUTHORIZE": "Autorizar",
"BACK": "Volver",
"CANCEL": "Cancelar",
"CLEAR_FILTER": "Eliminar filtros",
"DELETE_MY_ACCOUNT": "Eliminar mi cuenta",
"DISABLE": "Desactivar",
"EDIT": "Editar",
"ENABLE": "Activar",
"FILTER": "Filtro",
"LOGIN": "Acceder",
"NO": "No",
"REGISTER": "Crear cuenta",
"REQUEST_DATA_EXPORT": "Solicitar exportación de datos",
"RESET": "Restablecer",
"SUBMIT": "Enviar",
"YES": "Si"
}

View File

@ -1,2 +1,25 @@
{
"ABOUT": "acerca de",
"CONFIRMATION": "Confirmación",
"CONTACT": "contacto",
"DAY": "día | días",
"DISPLAYED": "Mostrado",
"DOCUMENTATION": "documentación",
"HERE": "aquí",
"HIDDEN": "Oculto",
"HOME": "Inicio",
"SELECTS": {
"ORDER": {
"ASC": "ascenso",
"DESC": "descenso",
"LABEL": "ordenar"
},
"ORDER_BY": {
"LABEL": "ordenar por"
},
"PER_PAGE": {
"LABEL": "por página"
}
},
"TOTAL": "Total"
}

View File

@ -1,2 +1,4 @@
{
"DASHBOARD": "Tablero",
"THIS_MONTH": "Este mes"
}

View File

@ -1,2 +1,9 @@
{
"APP_ERROR": "Parece que hay algún problema con la aplicación.<br />Por favor inténtalo de nuevo más tarde o contacta con la administración.",
"NOT_FOUND": {
"PAGE": "No se encuentra la página",
"WORKOUT": "No se encuentra el entrenamiento"
},
"SOMETHING_WRONG": "Ha habido un error",
"UNKNOWN": "Error. Inténtalo de nuevo o contacta con la administración."
}

View File

@ -1,2 +1,36 @@
{
"ADD_A_NEW_APP": "Añadir aplicación OAuth2",
"APP": {
"CLIENT_ID": "Id",
"CLIENT_SECRET": "Clave secreta",
"DESCRIPTION": "Descripción de la aplicación",
"ISSUE_AT": "Edición en",
"NAME": "Nombre de la aplicación",
"REDIRECT_URL": "URL de redirección",
"SCOPE": {
"LABEL": "Ámbito",
"application:write_DESCRIPTION": "concede permiso de escritura a la aplicación configurada.",
"profile:read_DESCRIPTION": "concede permiso de lectura a puntos de acceso <code>auth</code>.",
"profile:write_DESCRIPTION": "concede permiso de lectura a los puntos de acceso <code>auth</code>.",
"users:read_DESCRIPTION": "concede permiso de lectura a los puntos de acceso <code>users</code>.",
"users:write_DESCRIPTION": "concede permiso de escritura a los puntos de acceso <code>users</code>.",
"workouts:read_DESCRIPTION": "concede permiso de lectura a los puntos de acceso <code>workouts</code>.",
"workouts:write_DESCRIPTION": "concede permiso de escritura a los puntos de acceso <code>workouts</code>."
},
"URL": "URL de la aplicación"
},
"APPS_LIST": "Aplicaciones OAuth2",
"APP_CREATED_SUCCESSFULLY": "Aplicación creada correctamente. Asegúrate de que copias la clave secreta, no volverá a ser mostrada.",
"APP_DELETION_CONFIRMATION": "¿Estás seguro de que quieres eliminar esta app?",
"APP_REQUESTING_ACCESS": "La aplicación {0} solicita:",
"AUTHORIZE_APP": "¿Autorizar a {0} a usar tu cuenta?",
"COPY_TO_CLIPBOARD": "copiar al portapapeles",
"DELETE_APP": "Eliminar aplicación",
"NEW_APP": "Añadir una aplicación",
"NO_APP": "No se encuentra la aplicación!",
"NO_APPS": "sin aplicaciones",
"NO_DESCRIPTION": "sin descripción",
"REVOKE_ALL_TOKENS": "Revocar todas las claves",
"TOKENS_REVOCATION_CONFIRMATION": "¿Estás seguro de revocar todas las claves?",
"TOKENS_REVOKED": "Todas las claves asociadas han sido revocadas."
}

View File

@ -1 +1,38 @@
{}
{
"CONTENT": {
"ACCOUNT_DELETION": {
"CONTENT": "Puedes solicitar en cualquier momento la eliminación de tu cuenta yendo a esta dirección (tras iniciar sesión) y pulsando en el botón \"Eliminar mi Cuenta\" en los ajustes de la cuenta.",
"TITLE": "Eliminación de la cuenta"
},
"CHANGES_TO_OUR_PRIVACY_POLICY": {
"CONTENT": "Si decidimos cambiar nuestra política de privacidad, anunciaremos los cambios en esta página.\n\nEste documento está bajo licencia [CC-BY-SA](https://creativecommons.org/licenses/by-sa/4.0/). Adaptado de la política de privacidad original de [Discourse](https://github.com/discourse/discourse).",
"TITLE": "Cambios en la Política de Privacidad"
},
"DATA_COLLECTED": {
"CONTENT": "Recogemos la siguiente información:\n- Información de la cuenta (nombre de usuario, dirección de correo electrónico y contraseña). También información opcional de tu perfil como podría ser el nombre, apellido, fecha de nacimiento, localización, biografía y la imagen de perfil subida. \n- Ficheros [GPX](https://en.wikipedia.org/wiki/GPS_Exchange_Format). Estos ficheros contienen datos relacionados con tus actividades (coordenadas geográficas, fecha, distancia, duración, velocidades máxima y media, altitud, ritmo cardíaco...). Si non quieres exponer estos datos, bórralos antes de subirlos o bien añade los entrenamientos sin fichero GPX. \n- Datos de entrenamiento (deporte, título, fecha, duranción, distancia, ascenso, descenso, notas). \n- Información técnica (navegador y sistema operativo).",
"TITLE": "¿Qué información recopilamos?"
},
"INFORMATION_DISCLOSURE": {
"CONTENT": "No vendemos, negociamos o transferimos de otro modo a terceras partes los datos que te identifican personalmente.\n\nEsto no incluye a terceras partes que nos ayudan a gestionar nuestra web y darte servicio, siempre que esas terceras partes mantengan el compromiso de confidencialidad.\n\nPodríamos también liberar esta información si al hacerlo creemos que estamos cumpliendo con la ley, reforzando las políticas de nuestra web o protegiendo nuestros y vuestros derechos, propiedad o seguridad.\n\nCuando autorizas a una aplicación de terceros a usar tu cuenta, dependiendo del ámbito de los permisos concedidos, ésta podría acceder a la información de tu perfil o entrenamientos. Las aplicaciones nunca tienen acceso a tu contraseña.",
"TITLE": "¿Mostramos algún tipo de información a terceras partes externas?"
},
"INFORMATION_PROTECTION": {
"CONTENT": "Implementamos una variedad de medidas de seguridad para mantener tu información personal segura cuando escribes, envías o accedes a tu información personal.",
"TITLE": "¿De qué modo protegemos tu información?"
},
"INFORMATION_USAGE": {
"CONTENT": "Toda la información que recogemos de ti podría usarse para proporcionar las funciones básicas de **FitTrackee**: \n- Los ficheros GPX se usan para crear los entrenamientos, mostrar rutas en el mapa (con [OpenStreetMap](https://www.openstreetmap.org) y el servidor de imágenes de mapa configurado) y gráficos, crear miniaturas de mapa, calcular records e obtener datos de meteorología (si se configura el servicio). \n- Los entrenamientos e información de perfil no se muestran públicamente. Un usuario registrado sólo puede ver sus propios entrenamientos. \n- La dirección de correo electrónico proporcionada podría utilizarse para enviarte información o para confirmar las modificaciones en tu cuenta.",
"TITLE": "¿Para qué utilizamos tus datos?"
},
"SITE_USAGE_BY_CHILDREN": {
"CONTENT": "Si este servidor está en la UE o el AEE: nuestra web y servicios están dirigidos a personas de al menos 16 años de edad. Si no tienes 16 años cumplidos, por requerimiento de la [GDPR](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation) (General Data Protection Regulation) no uses este sitio web.\n\nSi este servidor está en EEUU de América: nuestra web, productos y servicios están orientados a personas de al menos 13 años de edad. Si no tienes 13 cumplidos, por requerimiento de la [COPPA](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act) (Children's Online Privacy Protection Act) no uses esta web.\n\nLos requerimientos legales pueden ser diferentes si este servidor se encuentra en otros lugares.",
"TITLE": "Uso de esta web por menores"
},
"YOUR_CONSENT": {
"CONTENT": "Al utilizar nuestra web, aceptas la política de privacidad de nuestra web.",
"TITLE": "Tu consentimiento"
}
},
"LAST_UPDATE": "Última actualización",
"TITLE": "política de privacidad"
}

View File

@ -1,2 +1,44 @@
{
"Cycling (Sport)": {
"LABEL": "Ciclismo (Deportivo)"
},
"Cycling (Transport)": {
"LABEL": "Ciclismo (Transporte)"
},
"Cycling (Virtual)": {
"LABEL": "Ciclismo (Virtual)"
},
"Hiking": {
"LABEL": "Senderismo"
},
"Mountain Biking": {
"LABEL": "Bicicleta por Montaña"
},
"Mountain Biking (Electric)": {
"LABEL": "Bicicleta (Eléctrica) por Montaña"
},
"Mountaineering": {
"LABEL": "Montañismo"
},
"Rowing": {
"LABEL": "Remo"
},
"Running": {
"LABEL": "Correr"
},
"Skiing (Alpine)": {
"LABEL": "Esquí (Alpino)"
},
"Skiing (Cross Country)": {
"LABEL": "Esquí de travesía"
},
"Snowshoes": {
"LABEL": "Raquetas de nieve"
},
"Trail": {
"LABEL": "Ruta"
},
"Walking": {
"LABEL": "Caminar"
}
}

View File

@ -1,2 +1,8 @@
{
"STATISTICS": "Estadísticas",
"TIME_FRAMES": {
"month": "mes",
"week": "semana",
"year": "año"
}
}

View File

@ -1,2 +1,128 @@
{
"ACCOUNT_CONFIRMATION_NOT_RECEIVED": "¿No has recibido instrucciones?",
"ACCOUNT_CONFIRMATION_SENT": "Comprueba el correo. Se ha enviado un nuevo email de confirmación a la dirección proporcionada.",
"ADMIN": "Admin",
"ALREADY_HAVE_ACCOUNT": "¿Ya tienes una cuenta?",
"CONFIRM_ACCOUNT_DELETION": "¿Seguro que quieres eliminar tu cuenta? Se borrarán todos los datos, la decisión no es reversible.",
"CURRENT_PASSWORD": "Contraseña actual",
"EMAIL": "Correo electrónico",
"EMAIL_INFO": "Escribe una dirección válida de correo.",
"ENTER_PASSWORD": "Escribe una contraseña",
"EXPORT_REQUEST": {
"DATA_EXPORT": "Exportar datos",
"DOWNLOAD_ARCHIVE": "Descargar archivo",
"GENERATING_LINK": "creando enlace...",
"ONLY_ONE_EXPORT_PER_DAY": "Puedes solicitar un archivo cada 24 horas",
"STATUS": {
"errored": "ha fallado (solicita una nueva exportación)",
"in_progress": "en progreso..."
}
},
"FILTER_ON_USERNAME": "Filtrar por nombre de usuario",
"HIDE_PASSWORD": "ocultar contraseña",
"INVALID_TOKEN": "Clave secreta no válida, solicita un nuevo restablecimiento de contraseña.",
"I_WANT_TO_DELETE_MY_ACCOUNT": "Quiero eliminar mi cuenta",
"LANGUAGE": "Idioma",
"LAST_PRIVACY_POLICY_TO_VALIDATE": "La política de privacidad ha sido actualizada, {0} antes de continuar.",
"LOGIN": "Acceder",
"LOGOUT": "Cerrar sesión",
"LOG_IN": "iniciar sesión",
"NEW_PASSWORD": "Nueva contraseña",
"NO_USERS_FOUND": "No hay usuarios.",
"PASSWORD": "Contraseña",
"PASSWORD_FORGOTTEN": "¿Has olvidado la contraseña?",
"PASSWORD_INFO": "Se requieren 8 caracteres como mínimo.",
"PASSWORD_RESET": "Restablecer la contraseña",
"PASSWORD_SENT_EMAIL_TEXT": "Comprueba tu email. Si la dirección está en nuestra base de datos recibirás un email con un enlace para restablecer tu contraseña.",
"PASSWORD_STRENGTH": {
"AVERAGE": "media",
"GOOD": "buena",
"LABEL": "fortaleza de la contraseña",
"STRONG": "fuerte",
"SUGGESTIONS": {
"allUppercase": "Usa alguna mayúscula, pero no todas.",
"anotherWord": "Añade más palabras poco comunes.",
"associatedYears": "Evita los años asociados a ti.",
"capitalization": "Usa alguna mayúscula más que en la primera.",
"dates": "Evita fechas y años que se puedan asociar a ti.",
"l33t": "Evita substituciones evidentes de letras como {'@'} por la a.",
"longerKeyboardPattern": "Usa patrones de teclado más largos y cambia de dirección de escritura varias veces.",
"noNeed": "Puedes crear contraseñas fuertes sin usar símbolos, números o letras mayúsculas.",
"pwned": "Si utilizas esta contraseña en otros lugares, deberías cambiarla.",
"recentYears": "Evita años recientes.",
"repeated": "Evita palabras y caracteres repetidos.",
"reverseWords": "Evita palabras del revés o palabras comunes.",
"sequences": "Evita secuencias comunes de caracteres.",
"useWords": "Usa varias palabras, pero evita frases comunes."
},
"WEAK": "débil"
},
"PASSWORD_UPDATED": "Se ha actualizado tu contraseña. Pulsa {0} para iniciar sesión.",
"PROFILE": {
"ACCOUNT_EDITION": "Edición de la cuenta",
"ASCENT_DATA": "Datos de ascensión (récords, total)",
"BACK_TO_PROFILE": "Volver al perfil",
"BIO": "Biografía",
"BIRTH_DATE": "Fecha de nacimiento",
"DATE_FORMAT": "Formato de la fecha",
"EDIT": "Editar perfil",
"EDIT_PREFERENCES": "Editar preferencias",
"EDIT_SPORTS_PREFERENCES": "Editar preferencias de los deportes",
"ERRORED_EMAIL_UPDATE": "Por favor, {0} para cambiar su dirección de correo electrónico de nuevo o póngase en contacto con el administrador",
"FIRST_DAY_OF_WEEK": "Primer día de la semana",
"FIRST_NAME": "Nombre",
"LANGUAGE": "Idioma",
"LAST_NAME": "Apellido",
"LOCATION": "Localización",
"MONDAY": "Lunes",
"PICTURE": "Fotografía",
"PICTURE_EDITION": "Editar la foto",
"PICTURE_REMOVE": "Eliminar la foto",
"PICTURE_UPDATE": "Actualizar la foto",
"PREFERENCES_EDITION": "Editar preferencias",
"PRIVACY-POLICY_EDITION": "Política de privacidad",
"PROFILE_EDITION": "Editar perfil",
"REGISTRATION_DATE": "Fecha de registro",
"SPORT": {
"ACTION": "acción",
"COLOR": "color",
"DISABLED_BY_ADMIN": "desactivada por admin",
"IS_ACTIVE": "activa",
"LABEL": "etiqueta",
"STOPPED_SPEED_THRESHOLD": "límite para detectar detención"
},
"SPORTS_EDITION": "Editar preferencias de los deportes",
"SUCCESSFUL_EMAIL_UPDATE": "Se ha actualizado correctamente tu cuenta. Comprueba tu email para confirmar tu nueva dirección de correo electrónico.",
"SUCCESSFUL_REGISTRATION": "Se ha creado correctamente tu cuenta.",
"SUCCESSFUL_REGISTRATION_WITH_EMAIL": "Se ha enviado un enlace en un email a tu correo electrónico para activar la cuenta.",
"SUCCESSFUL_UPDATE": "Tu cuenta ha sido actualizada correctamente.",
"SUNDAY": "Domingo",
"TABS": {
"ACCOUNT": "cuenta",
"APPS": "aplicaciones",
"PICTURE": "fotografía",
"PREFERENCES": "preferencias",
"PRIVACY-POLICY": "política de privacidad",
"PROFILE": "perfil",
"SPORTS": "deportes"
},
"TIMEZONE": "Zona horaria",
"UNITS": {
"IMPERIAL": "Sistema Imperial (ft, mi, mph, ºF)",
"LABEL": "Unidades de distancia",
"METRIC": "Sistema Métrico (m, km, m/s, ºC)"
}
},
"READ_AND_ACCEPT_PRIVACY_POLICY": "He leído y aceptado la {0}.",
"REGISTER": "Crear cuenta",
"REGISTER_DISABLED": "Lo sentimos, no se admiten nuevas cuentas.",
"RESENT_ACCOUNT_CONFIRMATION": "Reenviar email de confirmación de cuenta",
"RESET_PASSWORD": "Restablecer contraseña",
"REVIEW": "revisar",
"SHOW_PASSWORD": "mostrar contraseña",
"THIS_USER_ACCOUNT_IS_INACTIVE": "Esta cuenta de usuario no está activa.",
"USERNAME": "Nombre de usuario",
"USERNAME_INFO": "Se requieren entre 3 y 30 caracteres, sólo se permiten alfanuméricos y guión bajo \"_\".",
"USER_PICTURE": "foto del usuario",
"YOU_HAVE_ACCEPTED_PRIVACY_POLICY": "Has aceptado la {0}."
}

View File

@ -1,2 +1,105 @@
{
"ADD_WORKOUT": "Añadir entrenamiento",
"ANALYSIS": "análisis",
"ASCENT": "ascenso",
"AVERAGE_SPEED": "velocidad media",
"AVE_SPEED": "vel. media",
"BACK_TO_WORKOUT": "volver al entrenamiento",
"DATE": "fecha",
"DESCENT": "descenso",
"DISPLAY_FILTERS": "mostrar filtros",
"DISTANCE": "distancia",
"DURATION": "tiempo",
"EDIT_WORKOUT": "Editar el entranamiento",
"ELEVATION": "altitud",
"END": "fin",
"FROM": "desde",
"GPX_FILE": "fichero .gpx",
"HIDE_FILTERS": "ocultar filtros",
"INVALID_ASCENT_OR_DESCENT": "Debes proporcionar ambos valores de altura y tienen que ser igual o superior a 0.",
"INVALID_DISTANCE": "La distancia debe ser mayor de 0",
"INVALID_DURATION": "La duración debe ser mayor que 0 segundos",
"LATEST_WORKOUTS": "Últimos entrenamientos",
"LOAD_MORE_WORKOUT": "Cargar más entrenamientos",
"MAX_ALTITUDE": "altitud máxima",
"MAX_FILES": "máx. de ficheros",
"MAX_SIZE": "tamaño máximo",
"MAX_SPEED": "velocidad máxima",
"MIN_ALTITUDE": "altitud mínima",
"NEXT_SEGMENT": "Sin tramo siguiente",
"NEXT_WORKOUT": "Siguiente entrenamiento",
"NOTES": "notas",
"NO_DATA_CLEANING": "datos desde gpx, sin comprobar",
"NO_FILE_PROVIDED": "Sin fichero proporcionado",
"NO_FOLDER": "no hay carpeta dentro",
"NO_MAP": "Sin mapa",
"NO_NEXT_SEGMENT": "No hay tramo siguiente",
"NO_NEXT_WORKOUT": "No hay entrenamiento siguiente",
"NO_NOTES": "Sin notas",
"NO_PREVIOUS_SEGMENT": "No hay tramo anterior",
"NO_PREVIOUS_WORKOUT": "No hay entrenamiento anterior",
"NO_RECORDS": "Sin registros.",
"NO_WORKOUTS": "Sin entrenamientos.",
"PAUSES": "pausas",
"PREVIOUS_SEGMENT": "Tramo anterior",
"PREVIOUS_WORKOUT": "Entrenamiento anterior",
"RECORD": "registro | registros",
"RECORD_AS": "Vel. media",
"RECORD_FD": "Distancia mayor",
"RECORD_HA": "Ascenso mayor",
"RECORD_LD": "Duración más larga",
"RECORD_MS": "Velocidad máxima",
"REMAINING_CHARS": "caracteres restantes",
"SEGMENT": "tramo | tramos",
"SPEED": "velocidad",
"SPORT": "deporte | deportes",
"START": "inicio",
"START_AND_FINISH": "Inicio y final",
"START_ELEVATION_AT_ZERO": "poner la altitud de inicio en el cero del gráfico",
"TITLE": "título",
"TO": "para",
"TOTAL_DURATION": "duración total",
"UPLOAD_FIRST_WORKOUT": "Una subida!",
"WEATHER": {
"DARK_SKY": {
"clear-day": "día despejado",
"clear-night": "noche despejada",
"cloudy": "nublado",
"fog": "niebla",
"partly-cloudy-day": "día parcialmente nublado",
"partly-cloudy-night": "noche parcialmente nublada",
"rain": "lluvia",
"sleet": "granizo",
"snow": "nieve",
"wind": "viento"
},
"HUMIDITY": "humedad",
"TEMPERATURE": "temperatura",
"WIND": "viento",
"WIND_DIRECTIONS": {
"E": "E",
"ENE": "ENE",
"ESE": "ESE",
"N": "N",
"NE": "NE",
"NNE": "NNE",
"NNW": "NNO",
"NW": "NO",
"S": "S",
"SE": "SE",
"SSE": "SSE",
"SSW": "SSO",
"SW": "SO",
"W": "O",
"WNW": "ONO",
"WSW": "OSO"
}
},
"WITHOUT_GPX": "sin fichero .gpx",
"WITH_GPX": "con fichero .gpx",
"WORKOUT": "entrenamiento | entrenamientos",
"WORKOUT_DATE": "fecha del entrenamiento",
"WORKOUT_DELETION_CONFIRMATION": "¿Seguro que quieres eliminar este entrenamiento?",
"ZIP_ARCHIVE": "fichero .zip",
"ZIP_ARCHIVE_DESCRIPTION": "o fichero .zip que contiene ficheros .gpx"
}

View File

@ -21,7 +21,7 @@
"new email must be different than curent email": "La nouvelle addresse électronique doit être differente de l'adresse actuelle",
"no file part": "Pas de fichier fourni.",
"no selected file": "Pas de fichier sélectionné.",
"ongoing request exists": "Une demande d'export de données est en cours",
"ongoing request exists": "Une demande d'exportation de données existe déjà.",
"password: password and password confirmation do not match": "Mot de passe : les mots de passe saisis sont différents.",
"provide a valid auth token": "Merci de fournir un jeton de connexion valide.",
"signature expired, please log in again": "Signature expirée. Merci de vous reconnecter.",

View File

@ -68,6 +68,11 @@
"EDIT": "Modifier le profil",
"EDIT_PREFERENCES": "Modifier les préférences",
"EDIT_SPORTS_PREFERENCES": "Modifier les préférences des sports",
"ELEVATION_CHART_START": {
"LABEL": "Début de l'axe pour le graphe affichant l'altitude",
"ZERO": "0",
"MIN_ALT": "Altitude minimale"
},
"ERRORED_EMAIL_UPDATE": "Veuillez vous {0} pour changer de nouveau votre adresse électronique ou contacter l'administrateur",
"FIRST_DAY_OF_WEEK": "Premier jour de la semaine",
"FIRST_NAME": "Prénom",

View File

@ -1,2 +1,8 @@
{
"ABOUT_THIS_INSTANCE": "Acerca desta instancia",
"CONTACT_ADMIN": "Contacta coa administración",
"FITTRACKEE_DESCRIPTION": "<strong>FitTrackee</strong> é un xestor autohospedado de actividades en exterior.",
"FITTRACKEE_LICENSE": "con licenza {0} ",
"SOURCE_CODE": "Código fonte",
"WEATHER_DATA_FROM": "Datos meteoroloxía:"
}

View File

@ -1,2 +1,65 @@
{
"ABOUT": {
"DESCRIPTION": "Calquera información adicional que puidese ser útil para as túas usuarias. Podes usar Markdown.",
"TEXT": "Información detallada sobre a instancia"
},
"ACTION": "Acción",
"ACTIVATE_USER_ACCOUNT": "Activar conta",
"ACTIVE": "Activa",
"ADMIN": "Admin",
"ADMINISTRATION": "Administración",
"ADMIN_RIGHTS_DELETE_USER_ACCOUNT": "Engadir/Eliminar permiso de admin, eliminar conta de usuarias.",
"APPLICATION": "Aplicación",
"APP_CONFIG": {
"ADMIN_CONTACT": "Email de contacto da administración",
"MAX_FILES_IN_ZIP_LABEL": "Num. máximo ficheiros arquivo zip",
"MAX_USERS_HELP": "Se 0, non hai límite de rexistros.",
"MAX_USERS_LABEL": "Número máx. de usuarias activas",
"NO_CONTACT_EMAIL": "sen correo de contacto",
"SINGLE_UPLOAD_MAX_SIZE_LABEL": "Tamaño Máx. dos ficheiros subidos (en MB)",
"TITLE": "Configuración da aplicación",
"ZIP_UPLOAD_MAX_SIZE_LABEL": "Tamaño Máx. do arquivo zip (en MB)"
},
"BACK_TO_ADMIN": "Volver a admin",
"CONFIRM_USER_ACCOUNT_DELETION": "Tes a certeza de querer eliminar a conta {0}? Borraranse todos os datos, non hai volta atrás.",
"CONFIRM_USER_PASSWORD_RESET": "Tes certeza de querer restablecer o contrasinal de {0}?",
"CURRENT_EMAIL": "Email actual",
"DELETE_USER": "Eliminar usuaria",
"EMAIL_SENDING_DISABLED": "O envío de correos está desactivado.",
"ENABLE_DISABLE_SPORTS": "Activar/desactivar deportes.",
"NEW_EMAIL": "Novo email",
"NO_TEXT_ENTERED": "Non escribiches texto",
"PASSWORD_RESET_SUCCESSFUL": "Restableceuse o contrasinal.",
"PRIVACY_POLICY_DESCRIPTION": "Engade a túa propia política de privacidade ou déixaa baleira para usar unha por defecto. Podes usar Markdown.",
"REGISTRATION_DISABLED": "Actualmente non se poden crear máis contas.",
"REGISTRATION_ENABLED": "Actualmente pódense crear novas contas.",
"RESET_USER_PASSWORD": "Restablecer contrasinal",
"SPORTS": {
"TABLE": {
"ACTIVE": "Activo",
"HAS_WORKOUTS": "xa existe o adestramento",
"IMAGE": "Imaxe",
"LABEL": "Etiqueta"
},
"TITLE": "Administrar deportes"
},
"UPDATE_APPLICATION_DESCRIPTION": "Actualizar configuración da aplicación.",
"UPDATE_USER_EMAIL": "Actualizar email",
"USER": "usuaria | usuarias",
"USERS": {
"SELECTS": {
"ORDER_BY": {
"ADMIN": "rol de admin",
"CREATED_AT": "data de rexistro",
"IS_ACTIVE": "estado da conta",
"USERNAME": "identificador",
"WORKOUTS_COUNT": "número adestramentos"
}
},
"TABLE": {
"ADD_ADMIN_RIGHTS": "Conceder permisos admin",
"REMOVE_ADMIN_RIGHTS": "Retirar permisos admin"
}
},
"USER_EMAIL_UPDATE_SUCCESSFUL": "Actualizouse o enderezo de email."
}

View File

@ -1,2 +1,41 @@
{
"ERROR": {
"Network Error": "Erro na rede.",
"UNKNOWN": "Erro. Inténtao outra vez ou contacta coa administración.",
"at least one file in zip archive exceeds size limit, please check the archive": "Polo menos un ficheiro no arquivo .zip excede o tamaño máximo, comproba o arquivo.",
"completed request already exists": "Xa existe unha solicitude de exportación completa.",
"email: valid email must be provided": "Email: debes escribir un correo electrónico válido.",
"error during gpx file parsing": "Erro ao procesar o ficheiro gpx.",
"error during gpx processing": "Erro no procesado gpx.",
"error on getting configuration": "Erro ao obter a configuración.",
"error when saving workout": "Erro ao gardar o adestramento.",
"error when updating configuration": "Erro ao actualizar a configuración",
"error, please try again or contact the administrator": "Erro, inténtao outra vez ou contacta coa administración.",
"error, registration is disabled": "Erro, non se admiten novas usuarias.",
"file extension not allowed": "Non está permitida a extensión do ficheiro.",
"file size is greater than the allowed size": "O tamaño do ficheiro supera o tamaño permitido.",
"invalid credentials": "Credenciais incorrectas.",
"invalid payload": "Os datos proporcionados non son válidos.",
"invalid token, please log in again": "Token non válido, accede outra vez.",
"invalid token, please request a new token": "Token non válido, accede outra vez.",
"new email must be different than curent email": "O novo email ten que ser diferente ao actual",
"no file part": "Sen ficheiro proporcionado.",
"no selected file": "Sen ficheiro seleccionado.",
"ongoing request exists": "Xa existe unha solicitude de exportación de datos.",
"password: password and password confirmation do not match": "Contrasinal: o contrasinal e a súa confirmación non concordan.",
"provide a valid auth token": "Proporciona unha chave secreta válida.",
"signature expired, please log in again": "Caducou a sinatura. Accede outra vez.",
"sorry, that username is already taken": "Lamentámolo, o nome de usuaria xa está en uso.",
"sport does not exist": "Non existe o deporte.",
"successfully registered": "Conta creada correctamente.",
"the number of files in the archive exceeds the limit": "O número de ficheiros no arquivo supera o límite.",
"user does not exist": "Non existe a usuaria.",
"valid email must be provided for admin contact": "Hai que proporcionar un correo electrónico válido para contacto de administración",
"you can not delete your account, no other user has admin rights": "Non podes eliminar a túa conta, non hai outra usuaria con permisos de administración.",
"you do not have permissions": "Non tes permisos."
},
"PAGINATION": {
"NEXT": "seguinte",
"PREVIOUS": "anterior"
}
}

View File

@ -1,2 +1,19 @@
{
"ACCOUNT-CONFIRMATION-RESEND": "Volver a enviar un correo de confirmación",
"AUTHORIZE": "Autorizar",
"BACK": "Volver",
"CANCEL": "Cancelar",
"CLEAR_FILTER": "Limpar filtros",
"DELETE_MY_ACCOUNT": "Eliminar a miña conta",
"DISABLE": "Desactivar",
"EDIT": "Editar",
"ENABLE": "Activar",
"FILTER": "Filtro",
"LOGIN": "Acceder",
"NO": "Non",
"REGISTER": "Crear conta",
"REQUEST_DATA_EXPORT": "Solicitar exportación dos datos",
"RESET": "Restablecer",
"SUBMIT": "Enviar",
"YES": "Si"
}

View File

@ -1,2 +1,25 @@
{
"ABOUT": "acerca de",
"CONFIRMATION": "Confirmación",
"CONTACT": "contacto",
"DAY": "día | días",
"DISPLAYED": "Mostrado",
"DOCUMENTATION": "documentación",
"HERE": "aquí",
"HIDDEN": "Agochado",
"HOME": "Inicio",
"SELECTS": {
"ORDER": {
"ASC": "ascenso",
"DESC": "descenso",
"LABEL": "orde"
},
"ORDER_BY": {
"LABEL": "ordenar por"
},
"PER_PAGE": {
"LABEL": "por páxina"
}
},
"TOTAL": "Total"
}

View File

@ -1,2 +1,4 @@
{
"DASHBOARD": "Taboleiro",
"THIS_MONTH": "Este mes"
}

View File

@ -1,2 +1,9 @@
{
"APP_ERROR": "A aplicación atopou algún problema.<br />Inténtao máis tarde ou contacta coa administración.",
"NOT_FOUND": {
"PAGE": "Non se atopa a páxina",
"WORKOUT": "Non se atopa o adestramento"
},
"SOMETHING_WRONG": "Algo fallou",
"UNKNOWN": "Erro. Inténtao outra vez ou contacta coa administración."
}

View File

@ -1,2 +1,36 @@
{
"ADD_A_NEW_APP": "Engadir nova aplicación OAuth2",
"APP": {
"CLIENT_ID": "id",
"CLIENT_SECRET": "Chave secreta",
"DESCRIPTION": "Descrición da aplicación",
"ISSUE_AT": "Edición en",
"NAME": "Noma da aplicación",
"REDIRECT_URL": "URL de redirección",
"SCOPE": {
"LABEL": "Ámbitos",
"application:write_DESCRIPTION": "concede acceso a escritura na configuración da aplicación.",
"profile:read_DESCRIPTION": "concede acceso de lectura aos puntos de acceso <code>auth</code>.",
"profile:write_DESCRIPTION": "concede acceso de escritura aos puntos de acceso <code>auth</code>.",
"users:read_DESCRIPTION": "concede acceso de lectura aos puntos de acceso <code>users</code>.",
"users:write_DESCRIPTION": "concede acceso de escritura aos puntos de acceso <code>users</code>.",
"workouts:read_DESCRIPTION": "concede permiso de lectura aos puntos de acceso <code>workouts</code>.",
"workouts:write_DESCRIPTION": "concede permisos de escritura aos puntos de acceso <code>workouts</code>."
},
"URL": "URL da aplicación"
},
"APPS_LIST": "Aplicacións OAuth2",
"APP_CREATED_SUCCESSFULLY": "Creouse correctamente a aplicación. Pon coidado en gardar agora a chave secreta, non se volverá a mostrar.",
"APP_DELETION_CONFIRMATION": "Tes certeza de querer eliminar esta app?",
"APP_REQUESTING_ACCESS": "A aplicación {0} solicita:",
"AUTHORIZE_APP": "Autorizar a {0} a que use a túa conta?",
"COPY_TO_CLIPBOARD": "copiar ao portapapeis",
"DELETE_APP": "Eliminar aplicación",
"NEW_APP": "Engadir unha aplicación",
"NO_APP": "Non se atopa a aplicación!",
"NO_APPS": "sen aplicacións",
"NO_DESCRIPTION": "sen descrición",
"REVOKE_ALL_TOKENS": "Revogar todas as chaves",
"TOKENS_REVOCATION_CONFIRMATION": "Tes a certeza de querer eliminar todas as chaves de acceso?",
"TOKENS_REVOKED": "Foron revogadas todas as chaves de acceso asociadas."
}

View File

@ -1 +1,38 @@
{}
{
"CONTENT": {
"ACCOUNT_DELETION": {
"CONTENT": "Podes solicitar en todo momento a eliminación da túa conta indo a este enderezo (con sesión iniciada) e premendo no botón \"Eliminar a miña conta\" nos axustes da túa conta.",
"TITLE": "Eliminación da conta"
},
"CHANGES_TO_OUR_PRIVACY_POLICY": {
"CONTENT": "Se decidimos cambiar a nosa política de privacidade, publicaremos os cambios nesta páxina.\n\nEste documento está baixo licenza [CC-BY-SA](https://creativecommons.org/licenses/by-sa/4.0/). Adaptado do orixinal da política de privacidade de [Discourse](https://github.com/discourse/discourse).",
"TITLE": "Cambios na nosa Política de Privacidade"
},
"DATA_COLLECTED": {
"CONTENT": "Recollemos a seguinte información:\n- Información da conta (identificador, enderezo de email e contrasinal). Poderías engadir información adicional ao perfil como o nome, apelido, data de nacemento, localización, biografía e subir unha foto de perfil.\n- Ficheiros [GPX](https://en.wikipedia.org/wiki/GPS_Exchange_Format). Estes ficheiros conteñen datos relacionados coas túas actividades (coordenadas xeográficas, data, distancia, duración, velocidades máxima e media, altitude, pulso cardíaco...). Se non queres mostrar algún dos datos, elimínaos antes de subir ou engadir adestramentos con ficheiros GPX.\n- Datos do adestramento (deporte, título, data, duración, distancia, ascenso, descenso, notas).\n- Información técnica (nome do navegador e sistema operativo).",
"TITLE": "Que información recollemos?"
},
"INFORMATION_DISCLOSURE": {
"CONTENT": "Non vendemos, comerciamos ou transferimos doutro xeito a terceiras partes externas ningunha información que te identifique persoalmente.\n\nIsto non inclúe a terceiras partes de confianza que non axudan a xestionar e proporcionarche o noso servizo, mentras esas terceiras partes acepten manter confidencial esta información.\n\nPoderiamos liberar esta información sempre que ao facelo sexa acorde co cumprimento da ley, reforce as nosas políticas da web, ou protexa os nosos dereitos e seguridade ou os de outras persoas.\n\nCando autorizas a terceiras partes a usar a túa conta, dependendo dos permisos concedidos, podería acceder á túa información de perfil ou adestramentos. As aplicacións nunca teñen acceso ao teu contrasinal.",
"TITLE": "Mostramos algún tipo de información a terceiras partes externas?"
},
"INFORMATION_PROTECTION": {
"CONTENT": "Tomamos varias medidas de seguridade para gardar a túa información persoal cando inicias sesión, envías ou accedes á túa información persoal.",
"TITLE": "Como protexemos a túa información?"
},
"INFORMATION_USAGE": {
"CONTENT": "Toda a información que recollemos de ti pode ser usada para proporcionar o servizo básico de **FitTrackee**:\n- Os ficheiros GPX úsanse para crear adestramentos, mostrar rutas nun mapa (con OpenStreetMap](https://www.openstreetmap.org) e o servidor de teselas configurado) e gráficos, crear miniaturas do mapa, calcular records e obter datos meteorolóxicos (se está así establecido).\n- A información de perfil e adestramentos non se mostran publicamente. Unha usuaria rexistrada só pode ver os seus propios adestramentos.\n- O enderezo de correo electrónico que nos proporcionas podería ser usado para mandarche información ou confirmar as modificacións na conta.",
"TITLE": "Para que usamos a túa información?"
},
"SITE_USAGE_BY_CHILDREN": {
"CONTENT": "Se este servidor está na UE ou no EEA: a nosa web e servizos están dirixidos a persoas a partir dos 16 anos. Non uses esta web se non tes 16 anos, por requerimento da [GDPR](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation) (General Data Protection Regulation).\n\nSe este servidor está en EEUU de América: A nosa web, produtos e servizos están dirixidos a persoas a partir dos 13 anos. Se non tes 13 anos, por requerimento da [COPPA](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act) (Children's Online Privacy Protection Act), non uses esta web.\n\nOs requerimentos legais poderían ser diferentes se este servidor está baixo outra xurisdición.",
"TITLE": "Uso da web por menores"
},
"YOUR_CONSENT": {
"CONTENT": "Ao usar esta web, aceptas a política de privacidade desta web.",
"TITLE": "O teu consentimento"
}
},
"LAST_UPDATE": "Última actualización",
"TITLE": "política de privacidade"
}

View File

@ -1,2 +1,44 @@
{
"Cycling (Sport)": {
"LABEL": "Ciclismo (Deportivo)"
},
"Cycling (Transport)": {
"LABEL": "Ciclismo (Transporte)"
},
"Cycling (Virtual)": {
"LABEL": "Ciclismo (Virtual)"
},
"Hiking": {
"LABEL": "Sendeirismo"
},
"Mountain Biking": {
"LABEL": "Ciclismo por Montaña"
},
"Mountain Biking (Electric)": {
"LABEL": "Ciclismo por Montaña (Eléctrica)"
},
"Mountaineering": {
"LABEL": "Montañismo"
},
"Rowing": {
"LABEL": "Remo"
},
"Running": {
"LABEL": "Correr"
},
"Skiing (Alpine)": {
"LABEL": "Esquí (Alpino)"
},
"Skiing (Cross Country)": {
"LABEL": "Esquí (de travesía)"
},
"Snowshoes": {
"LABEL": "Raquetas de neve"
},
"Trail": {
"LABEL": "Trail"
},
"Walking": {
"LABEL": "Camiñar"
}
}

View File

@ -1,2 +1,8 @@
{
"STATISTICS": "Estatísticas",
"TIME_FRAMES": {
"month": "mes",
"week": "semana",
"year": "ano"
}
}

View File

@ -1,2 +1,128 @@
{
"ACCOUNT_CONFIRMATION_NOT_RECEIVED": "Non recibiches instrucións?",
"ACCOUNT_CONFIRMATION_SENT": "Comproba o correo. Enviouse un correo de confirmación ao enderezo proporcionado.",
"ADMIN": "Admin",
"ALREADY_HAVE_ACCOUNT": "Xa tes unha conta?",
"CONFIRM_ACCOUNT_DELETION": "Tes a certeza de querer eliminar a conta? Todos os datos serán borrados, e non poderás restablecelos.",
"CURRENT_PASSWORD": "Contrasinal actual",
"EMAIL": "Email",
"EMAIL_INFO": "Escribe un enderezo válido.",
"ENTER_PASSWORD": "Escribe un contrasinal",
"EXPORT_REQUEST": {
"DATA_EXPORT": "Exportar datos",
"DOWNLOAD_ARCHIVE": "Descargar arquivo",
"GENERATING_LINK": "creando ligazón...",
"ONLY_ONE_EXPORT_PER_DAY": "Podes solicitar un arquivo cada 24 horas",
"STATUS": {
"errored": "fallou (solicita outra exportación)",
"in_progress": "en progreso..."
}
},
"FILTER_ON_USERNAME": "Filtrar por identificador",
"HIDE_PASSWORD": "agochar contrasinal",
"INVALID_TOKEN": "Token non válido, solicita un novo restablecemento de contrasinal.",
"I_WANT_TO_DELETE_MY_ACCOUNT": "Quero eliminar a miña conta",
"LANGUAGE": "Idioma",
"LAST_PRIVACY_POLICY_TO_VALIDATE": "Actualizouse a política de privacidade, podes {0} antes de continuar.",
"LOGIN": "Acceso",
"LOGOUT": "Pechar sesión",
"LOG_IN": "acceder",
"NEW_PASSWORD": "Novo contrasinal",
"NO_USERS_FOUND": "Non hai usuarias.",
"PASSWORD": "Contrasinal",
"PASSWORD_FORGOTTEN": "Esqueciches o contrasinal?",
"PASSWORD_INFO": "Require 8 caracteres como mínimo.",
"PASSWORD_RESET": "Restablecer contrasinal",
"PASSWORD_SENT_EMAIL_TEXT": "Comproba o correo electrónico. Se o enderezo está na base de datos recibirás un correo cunha ligazón de restablecemento.",
"PASSWORD_STRENGTH": {
"AVERAGE": "media",
"GOOD": "boa",
"LABEL": "forza do contrasinal",
"STRONG": "forte",
"SUGGESTIONS": {
"allUppercase": "Inclúe algunha letra maiúscula, non todas.",
"anotherWord": "Engade máis palabras pouco comúns.",
"associatedYears": "Evita os anos que teñan relación contigo.",
"capitalization": "Usa máis maiúsculas que só na primeira letra.",
"dates": "Evita datas e anos que teñan relación contigo.",
"l33t": "Evita substitucións de letras que sexan evidentes como {'@'} polo a.",
"longerKeyboardPattern": "Usa patróns longos no teclado e cambia de dirección de escritura varias veces.",
"noNeed": "Podes crear contrasinais fortes sen usar símbolos, números ou letras maiúsculas.",
"pwned": "Se usas este contrasinal noutros lugares entón deberías cambialo.",
"recentYears": "Evita anos recentes.",
"repeated": "Evita palabras e caracteres repetidos.",
"reverseWords": "Evita palabras comúns escritas ao revés.",
"sequences": "Evita secuencias comúns de caracteres.",
"useWords": "Usa varias palabras, pero evita frases comúns."
},
"WEAK": "feble"
},
"PASSWORD_UPDATED": "Actualizouse o teu contrasinal. Preme en {0} para acceder.",
"PROFILE": {
"ACCOUNT_EDITION": "Edición da conta",
"ASCENT_DATA": "Datos de ascensión (gravacións, total)",
"BACK_TO_PROFILE": "Volver ao perfil",
"BIO": "Bio",
"BIRTH_DATE": "Data de nacemento",
"DATE_FORMAT": "Formato para as datas",
"EDIT": "Editar perfil",
"EDIT_PREFERENCES": "Editar preferencias",
"EDIT_SPORTS_PREFERENCES": "Editar preferencias dos deportes",
"ERRORED_EMAIL_UPDATE": "{0} para cambiar o enderezo de correo electrónico ou contacta coa administración",
"FIRST_DAY_OF_WEEK": "Primeiro día da semana",
"FIRST_NAME": "Nome",
"LANGUAGE": "Idioma",
"LAST_NAME": "Apelido",
"LOCATION": "Localización",
"MONDAY": "Luns",
"PICTURE": "Fotografía",
"PICTURE_EDITION": "Edición da foto",
"PICTURE_REMOVE": "Eliminar foto",
"PICTURE_UPDATE": "Actualizar foto",
"PREFERENCES_EDITION": "Editar preferencias",
"PRIVACY-POLICY_EDITION": "Política de privacidade",
"PROFILE_EDITION": "Edición do perfil",
"REGISTRATION_DATE": "Data de rexistro",
"SPORT": {
"ACTION": "acción",
"COLOR": "cor",
"DISABLED_BY_ADMIN": "desactivado por admin",
"IS_ACTIVE": "activa",
"LABEL": "etiqueta",
"STOPPED_SPEED_THRESHOLD": "limiar para detectar pausa"
},
"SPORTS_EDITION": "Edición das preferencias do deporte",
"SUCCESSFUL_EMAIL_UPDATE": "A conta actualizouse correctamente. Comproba o teu correo para confirmar o novo enderezo de correo electrónico.",
"SUCCESSFUL_REGISTRATION": "Creouse correctamente a conta.",
"SUCCESSFUL_REGISTRATION_WITH_EMAIL": "Enviouse un correo ao enderezo proporcionado cunha ligazón para activar a conta.",
"SUCCESSFUL_UPDATE": "Actualizouse correctamente a conta.",
"SUNDAY": "Domingo",
"TABS": {
"ACCOUNT": "conta",
"APPS": "apps",
"PICTURE": "imaxe",
"PREFERENCES": "preferencias",
"PRIVACY-POLICY": "política de privacidade",
"PROFILE": "perfil",
"SPORTS": "deportes"
},
"TIMEZONE": "Zona horaria",
"UNITS": {
"IMPERIAL": "Sistema Imperial (ft, mi, mph, ºF)",
"LABEL": "Unidades de distancia",
"METRIC": "Sistema Métrico (m, km, m/s, ºC)"
}
},
"READ_AND_ACCEPT_PRIVACY_POLICY": "Lin e acepto a {0}.",
"REGISTER": "Crear conta",
"REGISTER_DISABLED": "Lamentámolo, pero non se permiten novas contas.",
"RESENT_ACCOUNT_CONFIRMATION": "Reenviar o correo de confirmación de conta",
"RESET_PASSWORD": "Restablece o contrasinal",
"REVIEW": "revisar",
"SHOW_PASSWORD": "mostrar contrasinal",
"THIS_USER_ACCOUNT_IS_INACTIVE": "Esta conta de usuaria está desactivada.",
"USERNAME": "Identificador",
"USERNAME_INFO": "Require entre 3 e 30 caracteres, só se permiten alfanuméricos e o trazo baixo \"_\".",
"USER_PICTURE": "foto da usuaria",
"YOU_HAVE_ACCEPTED_PRIVACY_POLICY": "Aceptaches a {0}."
}

View File

@ -1,2 +1,105 @@
{
"ADD_WORKOUT": "Engadir adestramento",
"ANALYSIS": "análise",
"ASCENT": "ascenso",
"AVERAGE_SPEED": "velocidade media",
"AVE_SPEED": "vel. media",
"BACK_TO_WORKOUT": "volver ao adestramento",
"DATE": "data",
"DESCENT": "descenso",
"DISPLAY_FILTERS": "mostrar filtros",
"DISTANCE": "distancia",
"DURATION": "duración",
"EDIT_WORKOUT": "Editar adestramento",
"ELEVATION": "altitude",
"END": "fin",
"FROM": "desde",
"GPX_FILE": "ficheiro .gpx",
"HIDE_FILTERS": "agochar filtros",
"INVALID_ASCENT_OR_DESCENT": "Hai que proporcionar os dous valores de altitude e deben ser iguais o maiores que 0.",
"INVALID_DISTANCE": "A distancia debe ser superior a 0",
"INVALID_DURATION": "A duración debe superar os 0 segundos",
"LATEST_WORKOUTS": "Últimos adestramentos",
"LOAD_MORE_WORKOUT": "Cargar máis adestramentos",
"MAX_ALTITUDE": "Altitude máx.",
"MAX_FILES": "máx. de ficheiros",
"MAX_SIZE": "Tamaño máx.",
"MAX_SPEED": "Vel. máxima",
"MIN_ALTITUDE": "Altitude min.",
"NEXT_SEGMENT": "Non hai tramo seguinte",
"NEXT_WORKOUT": "Seguinte adestramento",
"NOTES": "notas",
"NO_DATA_CLEANING": "datos do gpx, sen adecentar",
"NO_FILE_PROVIDED": "Non hai ficheiro",
"NO_FOLDER": "sen cartafoles dentro",
"NO_MAP": "Sen mapa",
"NO_NEXT_SEGMENT": "Non hai tramo seguinte",
"NO_NEXT_WORKOUT": "Non hai adestramento seguinte",
"NO_NOTES": "Sen notas",
"NO_PREVIOUS_SEGMENT": "Non hai tramo anterior",
"NO_PREVIOUS_WORKOUT": "Non hai adestramento anterior",
"NO_RECORDS": "Sen rexistros.",
"NO_WORKOUTS": "Sen adestramentos.",
"PAUSES": "pausas",
"PREVIOUS_SEGMENT": "Tramo anterior",
"PREVIOUS_WORKOUT": "Adestramento anterior",
"RECORD": "rexistro | rexistros",
"RECORD_AS": "Vel. media",
"RECORD_FD": "A maior distancia",
"RECORD_HA": "O maior desnivel",
"RECORD_LD": "A duración máis longa",
"RECORD_MS": "Vel. máxima",
"REMAINING_CHARS": "caracteres restantes",
"SEGMENT": "tramo | tramos",
"SPEED": "velocidade",
"SPORT": "deporte | deportes",
"START": "inicio",
"START_AND_FINISH": "Inicio e fin",
"START_ELEVATION_AT_ZERO": "situar a altitude de inicio no cero da gráfica",
"TITLE": "título",
"TO": "a",
"TOTAL_DURATION": "duración total",
"UPLOAD_FIRST_WORKOUT": "Subiches un!",
"WEATHER": {
"DARK_SKY": {
"clear-day": "día despexado",
"clear-night": "noite despexada",
"cloudy": "nubrado",
"fog": "néboa",
"partly-cloudy-day": "día algo nubrado",
"partly-cloudy-night": "noite algo nubrada",
"rain": "chuvia",
"sleet": "sarabia",
"snow": "neve",
"wind": "vento"
},
"HUMIDITY": "humidade",
"TEMPERATURE": "temperatura",
"WIND": "vento",
"WIND_DIRECTIONS": {
"E": "L",
"ENE": "XAN",
"ESE": "LSL",
"N": "N",
"NE": "NL",
"NNE": "NNL",
"NNW": "NNO",
"NW": "NO",
"S": "S",
"SE": "SL",
"SSE": "SSL",
"SSW": "SSO",
"SW": "SO",
"W": "O",
"WNW": "ONO",
"WSW": "OSO"
}
},
"WITHOUT_GPX": "sen ficheiro .gpx",
"WITH_GPX": "con ficheiro .gpx",
"WORKOUT": "adestramento | adestramentos",
"WORKOUT_DATE": "data do adestramento",
"WORKOUT_DELETION_CONFIRMATION": "Tes certeza de querer borrar este adestramento?",
"ZIP_ARCHIVE": "ficheiro .zip",
"ZIP_ARCHIVE_DESCRIPTION": "ou ficheiro .zip que contén ficheiros .gpx"
}

View File

@ -16,6 +16,7 @@
"FROM": "da",
"GPX_FILE": "file .gpx",
"HIDE_FILTERS": "nascondi filtri",
"INVALID_ASCENT_OR_DESCENT": "Entrambi i valori di elevazione devono essere forniti ed essere maggiori o uguali a 0.",
"INVALID_DISTANCE": "La distanza dev'essere maggiore di 0",
"INVALID_DURATION": "La durata dev'essere maggiore di 0",
"LATEST_WORKOUTS": "Ultimi workout",
@ -42,7 +43,7 @@
"PAUSES": "pause",
"PREVIOUS_SEGMENT": "Segmento precedente",
"PREVIOUS_WORKOUT": "Workout precedente",
"RECORD": "record | records",
"RECORD": "record | record",
"RECORD_AS": "Vel. media",
"RECORD_FD": "Distanza più lunga",
"RECORD_HA": "Salita più alta",
@ -51,7 +52,7 @@
"REMAINING_CHARS": "caratteri rimanenti",
"SEGMENT": "segmento | segmenti",
"SPEED": "velocità",
"SPORT": "sport | sports",
"SPORT": "sport | sport",
"START": "inizio",
"START_AND_FINISH": "Inizio e fine",
"START_ELEVATION_AT_ZERO": "partenza asse elevazione a 0",
@ -96,7 +97,7 @@
},
"WITHOUT_GPX": "senza file .gpx",
"WITH_GPX": "con file .gpx",
"WORKOUT": "workout | workouts",
"WORKOUT": "allenamento / allenamenti",
"WORKOUT_DATE": "data workout",
"WORKOUT_DELETION_CONFIRMATION": "Sei sicuro di voler eliminare questo workout?",
"ZIP_ARCHIVE": "file .zip",

View File

@ -1,2 +1,6 @@
{
"ABOUT_THIS_INSTANCE": "Om denne instansen",
"CONTACT_ADMIN": "Kontakt administratoren",
"SOURCE_CODE": "Kildekode",
"WEATHER_DATA_FROM": "Værdata fra:"
}

View File

@ -1,2 +1,31 @@
{
"ABOUT": {
"TEXT": "Detaljert info om instansen"
},
"ACTION": "Handling",
"ACTIVE": "Aktiv",
"ADMINISTRATION": "Administrasjon",
"APPLICATION": "Program",
"CONFIRM_USER_PASSWORD_RESET": "Vil du tilbakestille {0} passord?",
"CURRENT_EMAIL": "Nåværende e-postadresse",
"DELETE_USER": "Slett bruker",
"NO_TEXT_ENTERED": "Ingen tekst innskrevet",
"PASSWORD_RESET_SUCCESSFUL": "Passordet har blitt tilbakestilt.",
"RESET_USER_PASSWORD": "Tilbakestill passord",
"SPORTS": {
"TABLE": {
"IMAGE": "Bilde",
"LABEL": "Etikett"
}
},
"USER": "bruker | brukere",
"USERS": {
"SELECTS": {
"ORDER_BY": {
"ADMIN": "administratorstatus",
"CREATED_AT": "registreringsdato",
"IS_ACTIVE": "kontostatus"
}
}
}
}

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