Merge remote-tracking branch 'gitlab/dev' into weblate-fittrackee-fittrackee-client-administration
This commit is contained in:
commit
e2837821df
@ -20,6 +20,8 @@ The **GitHub** repository contains:
|
|||||||
- tests,
|
- tests,
|
||||||
- documentation (source and build).
|
- documentation (source and build).
|
||||||
|
|
||||||
|
Translations can be updated through [Weblate](https://hosted.weblate.org/engage/fittrackee/).
|
||||||
|
|
||||||
Continuous integration workflows run on **Github Actions** platform (on **push** and **pull requests**).
|
Continuous integration workflows run on **Github Actions** platform (on **push** and **pull requests**).
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,6 +26,10 @@ Examples for Android (non-exhaustive list):
|
|||||||
Maps are displayed using [Open Street Map](https://www.openstreetmap.org).
|
Maps are displayed using [Open Street Map](https://www.openstreetmap.org).
|
||||||
It is also possible to add a workout without a gpx file.
|
It is also possible to add a workout without a gpx file.
|
||||||
|
|
||||||
|
Translations can be updated through [Weblate](https://hosted.weblate.org/engage/fittrackee/).
|
||||||
|
Available languages:
|
||||||
|
[![Translation status](https://hosted.weblate.org/widgets/fittrackee/-/multi-auto.svg)](https://hosted.weblate.org/engage/fittrackee/)
|
||||||
|
|
||||||
**Still under heavy development (some features may be unstable).**
|
**Still under heavy development (some features may be unstable).**
|
||||||
(see [issues](https://github.com/SamR1/FitTrackee/issues) and [documentation](https://samr1.github.io/FitTrackee) for more information)
|
(see [issues](https://github.com/SamR1/FitTrackee/issues) and [documentation](https://samr1.github.io/FitTrackee) for more information)
|
||||||
|
|
||||||
|
2
fittrackee/dist/index.html
vendored
2
fittrackee/dist/index.html
vendored
@ -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.87c31c45.js"></script><script defer="defer" src="/static/js/app.f559f6b1.js"></script><link href="/static/css/app.0bee5448.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.9821bfa6.js"></script><script defer="defer" src="/static/js/app.3a71120c.js"></script><link href="/static/css/app.158f462d.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>
|
2
fittrackee/dist/service-worker.js
vendored
2
fittrackee/dist/service-worker.js
vendored
File diff suppressed because one or more lines are too long
2
fittrackee/dist/service-worker.js.map
vendored
2
fittrackee/dist/service-worker.js.map
vendored
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
1
fittrackee/dist/static/css/workouts.fa95a9cb.css
vendored
Normal file
1
fittrackee/dist/static/css/workouts.fa95a9cb.css
vendored
Normal file
File diff suppressed because one or more lines are too long
2
fittrackee/dist/static/js/app.3a71120c.js
vendored
Normal file
2
fittrackee/dist/static/js/app.3a71120c.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
fittrackee/dist/static/js/app.3a71120c.js.map
vendored
Normal file
1
fittrackee/dist/static/js/app.3a71120c.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
2
fittrackee/dist/static/js/app.f559f6b1.js
vendored
2
fittrackee/dist/static/js/app.f559f6b1.js
vendored
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
@ -1,2 +1,2 @@
|
|||||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[193],{9161:function(e,s,t){t.r(s),t.d(s,{default:function(){return A}});t(6699);var a=t(6252),r=t(2262),l=t(3577),o=t(3324),n=t(9996);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-d693c7da"]]);var Z=F,x=t(5630),D=t(8602),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}}]);
|
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[193],{9161:function(e,s,t){t.r(s),t.d(s,{default:function(){return A}});t(6699);var a=t(6252),r=t(2262),l=t(3577),o=t(3324),n=t(9996);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-d693c7da"]]);var Z=F,x=t(5630),D=t(8602),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.6987952e.js.map
|
//# sourceMappingURL=statistics.c817d0d3.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
fittrackee/dist/static/js/workouts.35d5ac47.js.map
vendored
Normal file
1
fittrackee/dist/static/js/workouts.35d5ac47.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,32 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block title %}Bestätige Dein Konto{% endblock %}
|
||||||
|
{% block preheader %}Verwendet diesen Link um Dein Konto zu bestätigen.{% endblock %}
|
||||||
|
{% block content %}<h1>Hallo {{username}},</h1>
|
||||||
|
<p>Du hast ein Konto bei FitTrackee angelegt. Verwende den unteren Button um Deine E-Mail Adresse zu bestätigen.</p>
|
||||||
|
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<a href="{{account_confirmation_url}}" class="f-fallback button button--green" target="_blank">Bestätige Deine E-Mail</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls die Kontoerstellung nicht von Dir initiiert wurde, ignoriere diese E-Mail bitte.
|
||||||
|
</p>
|
||||||
|
<p>Danke
|
||||||
|
<br>Dein FitTrackee Team</p>
|
||||||
|
<table class="body-sub" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p class="f-fallback sub">Falls Du Probleme mit dem oberen Button hast, kopiere diese URL und gebe sie in Deinen Webbrowser ein.</p>
|
||||||
|
<p class="f-fallback sub">{{account_confirmation_url}}</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>{% endblock %}
|
12
fittrackee/emails/templates/account_confirmation/de/body.txt
Normal file
12
fittrackee/emails/templates/account_confirmation/de/body.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Hallo {{username}},
|
||||||
|
|
||||||
|
Du hast ein Konto bei FitTrackee angelegt. Verwende den unteren Link um Deine E-Mail Adresse zu bestätigen.
|
||||||
|
|
||||||
|
Bestätige Deine E-Mail: {{ account_confirmation_url }}
|
||||||
|
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst..
|
||||||
|
{% endif %}Falls die Kontoerstellung nicht von Dir initiiert wurde, ignoriere diese E-Mail bitte.
|
||||||
|
|
||||||
|
Danke
|
||||||
|
Dein FitTrackee Team
|
||||||
|
{{fittrackee_url}}
|
@ -0,0 +1 @@
|
|||||||
|
FitTrackee - Bestätige Dein Konto
|
@ -2,7 +2,7 @@
|
|||||||
{% block title %}Confirm your account{% endblock %}
|
{% block title %}Confirm your account{% endblock %}
|
||||||
{% block preheader %}Use this link to confirm your account.{% endblock %}
|
{% block preheader %}Use this link to confirm your account.{% endblock %}
|
||||||
{% block content %}<h1>Hi {{username}},</h1>
|
{% block content %}<h1>Hi {{username}},</h1>
|
||||||
<p>You have created an account on FitTrackee account. Use the link below to confirm your address email.</p>
|
<p>You have created an account on FitTrackee. Use the button below to confirm your address email.</p>
|
||||||
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
@ -29,4 +29,4 @@
|
|||||||
<p class="f-fallback sub">{{account_confirmation_url}}</p>
|
<p class="f-fallback sub">{{account_confirmation_url}}</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>{% endblock %}
|
</table>{% endblock %}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
Hi {{username}},
|
Hi {{username}},
|
||||||
|
|
||||||
You have created an account on FitTrackee account. Use the link below to confirm your address email.
|
You have created an account on FitTrackee. Use the link below to confirm your address email.
|
||||||
|
|
||||||
Verify your email: {{ account_confirmation_url }}
|
Verify your email: {{ account_confirmation_url }}
|
||||||
|
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block title %}E-Mail Adresse geändert{% endblock %}
|
||||||
|
{% block preheader %}Deine E-Mail Adresse wure aktualisiert.{% endblock %}
|
||||||
|
{% block content %}<h1>Hallo {{username}},</h1>
|
||||||
|
<p>Du hast kürzlich beantragt, die E-Mail Adresse Deines FitTrackee Kontos zu ändern. Neue Adresse:</p>
|
||||||
|
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
{{new_email_address}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
Falls die Änderung der E-Mail Adresse nicht von Dir initiiert wurde, ändere bitte sofort Dein Passwort oder kontaktiere den Administrator, falls Dein Konto gesperrt ist.
|
||||||
|
</p>
|
||||||
|
<p>Danke
|
||||||
|
<br>
|
||||||
|
Dein FitTrackee Team
|
||||||
|
</p>{% endblock %}
|
@ -0,0 +1,10 @@
|
|||||||
|
Hallo {{username}},
|
||||||
|
|
||||||
|
Du hast kürzlich beantragt, die E-Mail Adresse Deines FitTrackee Kontos nach {{ new_email_address }} zu ändern.
|
||||||
|
|
||||||
|
Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
Falls die Änderung der E-Mail Adresse nicht von Dir initiiert wurde, ändere bitte sofort Dein Passwort oder kontaktiere den Administrator, falls Dein Konto gesperrt ist.
|
||||||
|
|
||||||
|
Danke
|
||||||
|
Dein FitTrackee Team
|
||||||
|
{{fittrackee_url}}
|
@ -0,0 +1 @@
|
|||||||
|
FitTrackee - E-Mail Adresse geändert
|
@ -0,0 +1,32 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block title %}Bestätige E-Mail Änderung{% endblock %}
|
||||||
|
{% block preheader %}Verwende den Link um die Änderung Deiner E-Mail Adresse zu bestätigen.{% endblock %}
|
||||||
|
{% block content %}<h1>Hallo {{username}},</h1>
|
||||||
|
<p>Du hast kürzlich beantragt, die E-Mail Adresse Deines FitTrackee Kontos zu ändern. Verwende den unteren Button um Deine Adresse zu bestätigen.</p>
|
||||||
|
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<a href="{{email_confirmation_url}}" class="f-fallback button button--green" target="_blank">Bestätige Deine E-Mail</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls die Änderung der E-Mail Adresse nicht von Dir initiiert wurde, ignoriere diese E-Mail bitte.
|
||||||
|
</p>
|
||||||
|
<p>Danke
|
||||||
|
<br>Dein FitTrackee Team</p>
|
||||||
|
<table class="body-sub" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p class="f-fallback sub">Falls Du Probleme mit dem oberen Button hast, kopiere diese URL und gebe sie in Deinen Webbrowser ein.</p>
|
||||||
|
<p class="f-fallback sub">{{email_confirmation_url}}</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>{% endblock %}
|
@ -0,0 +1,12 @@
|
|||||||
|
Hallo {{username}},
|
||||||
|
|
||||||
|
Du hast kürzlich beantragt, die E-Mail Adresse Deines FitTrackee Kontos zu ändern. Verwende den unteren Link um Deine Adresse zu bestätigen.
|
||||||
|
|
||||||
|
Bestätige Deine E-Mail: {{ email_confirmation_url }}
|
||||||
|
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls die Änderung der E-Mail Adresse nicht von Dir initiiert wurde, ignoriere diese E-Mail bitte.
|
||||||
|
|
||||||
|
Danke
|
||||||
|
Dein FitTrackee Team
|
||||||
|
{{fittrackee_url}}
|
@ -0,0 +1 @@
|
|||||||
|
FitTrackee - Bestätige E-Mail Änderung
|
13
fittrackee/emails/templates/password_change/de/body.html
Normal file
13
fittrackee/emails/templates/password_change/de/body.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block title %}Passwort geändert{% endblock %}
|
||||||
|
{% block preheader %}Dein Passwort wurde geändert.{% endblock %}
|
||||||
|
{% block content %}<h1>Hallo {{username}},</h1>
|
||||||
|
<p>Das Passwort Deines FitTrackee Kontos wurde geändert.</p>
|
||||||
|
<p>
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls die Änderung des Passworts nicht von Dir initiiert wurde, ändere bitte sofort Dein Passwort oder kontaktiere den Administrator, falls Dein Konto gesperrt ist.
|
||||||
|
</p>
|
||||||
|
<p>Danke
|
||||||
|
<br>
|
||||||
|
Dein FitTrackee Team
|
||||||
|
</p>{% endblock %}
|
10
fittrackee/emails/templates/password_change/de/body.txt
Normal file
10
fittrackee/emails/templates/password_change/de/body.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Hallo {{username}},
|
||||||
|
|
||||||
|
Das Passwort Deines FitTrackee Kontos wurde geändert.
|
||||||
|
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls die Änderung des Passworts nicht von Dir initiiert wurde, ändere bitte sofort Dein Passwort oder kontaktiere den Administrator, falls Dein Konto gesperrt ist.
|
||||||
|
|
||||||
|
Danke
|
||||||
|
Dein FitTrackee Team
|
||||||
|
{{fittrackee_url}}
|
@ -0,0 +1 @@
|
|||||||
|
FitTrackee - Passwort geändert
|
@ -0,0 +1,34 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block title %}Anfrage zum Zurücksetzen des Passworts{% endblock %}
|
||||||
|
{% block preheader %}Verwende den unteren Link um Dein Passwort zurückzusetzen. Der Link ist nur für {{ expiration_delay }} gültig.{% endblock %}
|
||||||
|
{% block content %}<h1>Hallo {{username}},</h1>
|
||||||
|
<p>Du hast kürzlich beantragt, das Passwort Deines FitTrackee Kontos zurückzusetzen. Verwende den unteren Button um es zurückzusetzen.
|
||||||
|
<strong>Der Link ist nur für {{ expiration_delay }} gültig.</strong>
|
||||||
|
</p>
|
||||||
|
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<a href="{{password_reset_url}}" class="f-fallback button button--green" target="_blank">Setze Dein Passwort zurück</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls Du das Zurücksetzen des Passworts nicht angefordert hast, igoniere diese E-Mail bitte.
|
||||||
|
</p>
|
||||||
|
<p>Danke
|
||||||
|
<br>Dein FitTrackee Team</p>
|
||||||
|
<table class="body-sub" role="presentation">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p class="f-fallback sub">Falls Du Probleme mit dem oberen Button hast, kopiere diese URL und gebe sie in Deinen Webbrowser ein.</p>
|
||||||
|
<p class="f-fallback sub">{{password_reset_url}}</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>{% endblock %}
|
@ -0,0 +1,12 @@
|
|||||||
|
Hallo {{username}},
|
||||||
|
|
||||||
|
Du hast kürzlich beantragt, das Passwort Deines FitTrackee Kontos zurückzusetzen. Verwende den unteren Link um es zurückzusetzen. Der Link ist nur für {{ expiration_delay }} gültig.
|
||||||
|
|
||||||
|
Setze Dein Passwort zurück: {{ password_reset_url }}
|
||||||
|
|
||||||
|
{% if operating_system and browser_name %}Zur Sicherheit: Diese Anfrage wurde von einem {{operating_system}} Gerät mit {{browser_name}} ausgelöst.
|
||||||
|
{% endif %}Falls Du das Zurücksetzen des Passworts nicht angefordert hast, igoniere diese E-Mail bitte.
|
||||||
|
|
||||||
|
Danke
|
||||||
|
Dein FitTrackee Team
|
||||||
|
{{fittrackee_url}}
|
@ -0,0 +1 @@
|
|||||||
|
FitTrackee - Anfrage zum Zurücksetzen des Passworts
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
expected_en_text_body = """Hi test,
|
expected_en_text_body = """Hi test,
|
||||||
|
|
||||||
You have created an account on FitTrackee account. Use the link below to confirm your address email.
|
You have created an account on FitTrackee. Use the link below to confirm your address email.
|
||||||
|
|
||||||
Verify your email: http://localhost/account-confirmation?token=xxx
|
Verify your email: http://localhost/account-confirmation?token=xxx
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ expected_en_html_body = """ <body>
|
|||||||
<td class="content-cell">
|
<td class="content-cell">
|
||||||
<div class="f-fallback">
|
<div class="f-fallback">
|
||||||
<h1>Hi test,</h1>
|
<h1>Hi test,</h1>
|
||||||
<p>You have created an account on FitTrackee account. Use the link below to confirm your address email.</p>
|
<p>You have created an account on FitTrackee. Use the button below to confirm your address email.</p>
|
||||||
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
padding: $default-padding;
|
padding: $default-padding;
|
||||||
.record {
|
.record {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
span {
|
span {
|
||||||
padding: 2px 5px;
|
padding: 2px 5px;
|
||||||
@ -73,6 +74,7 @@
|
|||||||
}
|
}
|
||||||
.record-value {
|
.record-value {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
white-space: nowrap;
|
||||||
padding-right: $default-padding * 2;
|
padding-right: $default-padding * 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,6 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ComputedRef, computed, ref, capitalize } from 'vue'
|
import { ComputedRef, computed, ref, capitalize } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
|
||||||
|
|
||||||
import UserPicture from '@/components/User/UserPicture.vue'
|
import UserPicture from '@/components/User/UserPicture.vue'
|
||||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||||
@ -90,7 +89,6 @@
|
|||||||
|
|
||||||
const emit = defineEmits(['menuInteraction'])
|
const emit = defineEmits(['menuInteraction'])
|
||||||
|
|
||||||
const { locale } = useI18n()
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
|
|
||||||
const authUser: ComputedRef<IAuthUserProfile> = computed(
|
const authUser: ComputedRef<IAuthUserProfile> = computed(
|
||||||
@ -113,8 +111,10 @@
|
|||||||
emit('menuInteraction', false)
|
emit('menuInteraction', false)
|
||||||
}
|
}
|
||||||
function updateLanguage(option: IDropdownOption) {
|
function updateLanguage(option: IDropdownOption) {
|
||||||
locale.value = option.value.toString()
|
store.dispatch(
|
||||||
store.commit(ROOT_STORE.MUTATIONS.UPDATE_LANG, option.value)
|
ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE,
|
||||||
|
option.value.toString()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
function logout() {
|
function logout() {
|
||||||
store.dispatch(AUTH_USER_STORE.ACTIONS.LOGOUT)
|
store.dispatch(AUTH_USER_STORE.ACTIONS.LOGOUT)
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
:query="query"
|
:query="query"
|
||||||
/>
|
/>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead :class="{ smaller: 'de' === currentLanguage }">
|
||||||
<tr>
|
<tr>
|
||||||
<th class="sport-col" />
|
<th class="sport-col" />
|
||||||
<th>{{ capitalize($t('workouts.WORKOUT', 1)) }}</th>
|
<th>{{ capitalize($t('workouts.WORKOUT', 1)) }}</th>
|
||||||
@ -79,7 +79,7 @@
|
|||||||
:display-hover="true"
|
:display-hover="true"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td class="workout-date">
|
||||||
<span class="cell-heading">
|
<span class="cell-heading">
|
||||||
{{ $t('workouts.DATE') }}
|
{{ $t('workouts.DATE') }}
|
||||||
</span>
|
</span>
|
||||||
@ -179,7 +179,7 @@
|
|||||||
import Pagination from '@/components/Common/Pagination.vue'
|
import Pagination from '@/components/Common/Pagination.vue'
|
||||||
import StaticMap from '@/components/Common/StaticMap.vue'
|
import StaticMap from '@/components/Common/StaticMap.vue'
|
||||||
import NoWorkouts from '@/components/Workouts/NoWorkouts.vue'
|
import NoWorkouts from '@/components/Workouts/NoWorkouts.vue'
|
||||||
import { WORKOUTS_STORE } from '@/store/constants'
|
import { ROOT_STORE, WORKOUTS_STORE } from '@/store/constants'
|
||||||
import { IPagination } from '@/types/api'
|
import { IPagination } from '@/types/api'
|
||||||
import { ITranslatedSport } from '@/types/sports'
|
import { ITranslatedSport } from '@/types/sports'
|
||||||
import { IAuthUserProfile } from '@/types/user'
|
import { IAuthUserProfile } from '@/types/user'
|
||||||
@ -214,6 +214,9 @@
|
|||||||
const pagination: ComputedRef<IPagination> = computed(
|
const pagination: ComputedRef<IPagination> = computed(
|
||||||
() => store.getters[WORKOUTS_STORE.GETTERS.WORKOUTS_PAGINATION]
|
() => store.getters[WORKOUTS_STORE.GETTERS.WORKOUTS_PAGINATION]
|
||||||
)
|
)
|
||||||
|
const currentLanguage: ComputedRef<string> = computed(
|
||||||
|
() => store.getters[ROOT_STORE.GETTERS.LANGUAGE]
|
||||||
|
)
|
||||||
let query: TWorkoutsPayload = getWorkoutsQuery(route.query)
|
let query: TWorkoutsPayload = getWorkoutsQuery(route.query)
|
||||||
const hoverWorkoutId: Ref<string | null> = ref(null)
|
const hoverWorkoutId: Ref<string | null> = ref(null)
|
||||||
|
|
||||||
@ -238,9 +241,14 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getWorkoutsQuery(newQuery: LocationQuery): TWorkoutsPayload {
|
function getWorkoutsQuery(newQuery: LocationQuery): TWorkoutsPayload {
|
||||||
const workoutQuery = getQuery(newQuery, orderByList, defaultOrder.order_by, {
|
const workoutQuery = getQuery(
|
||||||
defaultSort: defaultOrder.order,
|
newQuery,
|
||||||
})
|
orderByList,
|
||||||
|
defaultOrder.order_by,
|
||||||
|
{
|
||||||
|
defaultSort: defaultOrder.order,
|
||||||
|
}
|
||||||
|
)
|
||||||
Object.keys(newQuery)
|
Object.keys(newQuery)
|
||||||
.filter((k) => workoutsPayloadKeys.includes(k))
|
.filter((k) => workoutsPayloadKeys.includes(k))
|
||||||
.map((k) => {
|
.map((k) => {
|
||||||
@ -287,7 +295,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
.box {
|
.box {
|
||||||
padding: $default-padding $default-padding * 2;
|
padding: $default-padding $default-padding * 1.5;
|
||||||
@media screen and (max-width: $small-limit) {
|
@media screen and (max-width: $small-limit) {
|
||||||
&.empty-table {
|
&.empty-table {
|
||||||
display: none;
|
display: none;
|
||||||
@ -318,11 +326,22 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.workouts-table {
|
.workouts-table {
|
||||||
|
.smaller {
|
||||||
|
th {
|
||||||
|
font-size: 0.95em;
|
||||||
|
padding: $default-padding 0;
|
||||||
|
max-width: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
.sport-col {
|
.sport-col {
|
||||||
padding-right: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
.workout-title {
|
.workout-title {
|
||||||
max-width: 90px;
|
text-align: left;
|
||||||
|
width: 100px;
|
||||||
position: relative;
|
position: relative;
|
||||||
.fa-map-o {
|
.fa-map-o {
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
@ -347,14 +366,27 @@
|
|||||||
height: 20px;
|
height: 20px;
|
||||||
width: 20px;
|
width: 20px;
|
||||||
}
|
}
|
||||||
|
.workout-date {
|
||||||
|
max-width: 60px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
@media screen and (max-width: $small-limit) {
|
@media screen and (max-width: $small-limit) {
|
||||||
|
td,
|
||||||
|
.workout-date,
|
||||||
|
.workout-title {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
.sport-col {
|
.sport-col {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: $default-padding;
|
padding: $default-padding;
|
||||||
}
|
}
|
||||||
|
.workout-date {
|
||||||
|
max-width: initial;
|
||||||
|
}
|
||||||
.workout-title {
|
.workout-title {
|
||||||
max-width: initial;
|
max-width: initial;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
.workout-title:hover .static-map {
|
.workout-title:hover .static-map {
|
||||||
display: none;
|
display: none;
|
||||||
|
6
fittrackee_client/src/locales/de/about.json
Normal file
6
fittrackee_client/src/locales/de/about.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"CONTACT_ADMIN": "Kontaktiere den Administrator",
|
||||||
|
"FITTRACKEE_DESCRIPTION": "<strong>FitTrackee</strong> ist ein selbst-gehosteter Outdoor-Aktivitäts-Tracker.",
|
||||||
|
"FITTRACKEE_LICENSE": "unter {0} Lizenz",
|
||||||
|
"SOURCE_CODE": "Quellkode"
|
||||||
|
}
|
59
fittrackee_client/src/locales/de/administration.json
Normal file
59
fittrackee_client/src/locales/de/administration.json
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"ACTION": "Aktion",
|
||||||
|
"ACTIVATE_USER_ACCOUNT": "Aktiviere Konto",
|
||||||
|
"ACTIVE": "Aktiv",
|
||||||
|
"ADMIN_RIGHTS_DELETE_USER_ACCOUNT": "Hinzufügen/Entfernen von Administratorrechten, Lösche Nutzerkonto.",
|
||||||
|
"ADMIN": "Admin",
|
||||||
|
"ADMINISTRATION": "Administration",
|
||||||
|
"APPLICATION": "Anwendung",
|
||||||
|
"APP_CONFIG": {
|
||||||
|
"ADMIN_CONTACT": "Kontakt-E-Mail des Administrators",
|
||||||
|
"MAX_USERS_LABEL": "Max. Anzahl aktiver Nutzer",
|
||||||
|
"MAX_USERS_HELP": "Wenn 0, gibt es keine Registrierungslimitierung..",
|
||||||
|
"MAX_FILES_IN_ZIP_LABEL": "Max. Dateianzahl im zip Archiv",
|
||||||
|
"NO_CONTACT_EMAIL": "keine Kontakt-E-Mail",
|
||||||
|
"SINGLE_UPLOAD_MAX_SIZE_LABEL": "Max. Größe der hochgeladenen Dateien (in Mb)",
|
||||||
|
"TITLE": "Anwendungskonfiguration",
|
||||||
|
"ZIP_UPLOAD_MAX_SIZE_LABEL": "Max. Größe des zip Archives (in Mb)"
|
||||||
|
},
|
||||||
|
"BACK_TO_ADMIN": "Zurück zu Admin",
|
||||||
|
"CONFIRM_USER_ACCOUNT_DELETION": "Möchtest du wirklich das {0} Konto löschen? Alle Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.",
|
||||||
|
"CONFIRM_USER_PASSWORD_RESET": "Möchtest du wirklich das {0} Passwort zurücksetzen?",
|
||||||
|
"CURRENT_EMAIL": "Aktuelle E-Mail",
|
||||||
|
"DELETE_USER": "Lösche Nutzer",
|
||||||
|
"EMAIL_SENDING_DISABLED": "E-Mail-Versand ist deaktiviert.",
|
||||||
|
"ENABLE_DISABLE_SPORTS": "Aktivieren/Deaktivieren von Sportarten.",
|
||||||
|
"NEW_EMAIL": "Neue E-Mail",
|
||||||
|
"PASSWORD_RESET_SUCCESSFUL": "Das wasswort wurde zurückgesetzt.",
|
||||||
|
"REGISTRATION_DISABLED": "Registrierung ist derzeit deaktiviert.",
|
||||||
|
"REGISTRATION_ENABLED": "Registrierung ist derzeit aktiviert.",
|
||||||
|
"RESET_USER_PASSWORD": "Passwort zurücksetzen",
|
||||||
|
"SPORTS": {
|
||||||
|
"TABLE": {
|
||||||
|
"ACTIVE": "Aktiv",
|
||||||
|
"HAS_WORKOUTS": "Trainings existieren",
|
||||||
|
"IMAGE": "Bild",
|
||||||
|
"LABEL": "Titel"
|
||||||
|
},
|
||||||
|
"TITLE": "Sportarten Administration"
|
||||||
|
},
|
||||||
|
"UPDATE_APPLICATION_DESCRIPTION": "Aktualisiere Anwemdungskonfiguration (maximale Anzahl an registrierten Nutzern, maximale Dateigröße).",
|
||||||
|
"UPDATE_USER_EMAIL": "Aktualisiere E-Mail",
|
||||||
|
"USER": "Nutzer",
|
||||||
|
"USER_EMAIL_UPDATE_SUCCESSFUL": "Die E-Mail Adresse wurde aktualisiert.",
|
||||||
|
"USERS": {
|
||||||
|
"TABLE": {
|
||||||
|
"ADD_ADMIN_RIGHTS": "Administratorrechte hinzufügen",
|
||||||
|
"REMOVE_ADMIN_RIGHTS": "Administratorrechte entfernen"
|
||||||
|
},
|
||||||
|
"SELECTS": {
|
||||||
|
"ORDER_BY": {
|
||||||
|
"ADMIN": "Adminstatus",
|
||||||
|
"CREATED_AT": "Registrierungsdatum",
|
||||||
|
"IS_ACTIVE": "Accountstatus",
|
||||||
|
"USERNAME": "Nutzername",
|
||||||
|
"WORKOUTS_COUNT": "Trainingsanzahl"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
34
fittrackee_client/src/locales/de/api.json
Normal file
34
fittrackee_client/src/locales/de/api.json
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"ERROR": {
|
||||||
|
"UNKNOWN": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||||
|
"email: valid email must be provided": "E-Mail: Eine gültige E-Mail muss angegeben werden.",
|
||||||
|
"error on getting configuration": "Fehler beim Abrufen der Konfiguration.",
|
||||||
|
"error when updating configuration": "Fehler beim Aktualisieren der Konfiguration.",
|
||||||
|
"error, please try again or contact the administrator": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||||
|
"error, registration is disabled": "Fehler. Die Registrierung ist deaktiviert.",
|
||||||
|
"file extension not allowed": "Dateierweiterung ist nicht erlaubt.",
|
||||||
|
"file size is greater than the allowed size": "Die Datei ist größer als erlaubt.",
|
||||||
|
"invalid credentials": "Ungültige Anmeldedaten.",
|
||||||
|
"invalid payload": "Die bereitgestellten Daten sind ungültig.",
|
||||||
|
"invalid token, please log in again": "Ungültiges Token, bitte erneut anmelden.",
|
||||||
|
"invalid token, please request a new token": "Ungültiges Token, bitte erneut anmelden.",
|
||||||
|
"Network Error": "Netzwerkfehler.",
|
||||||
|
"new email must be different than curent email": "Die neue E-Mail muss sich von der aktuellen E-Mail unterscheiden.",
|
||||||
|
"no file part": "Keine Datei angegeben.",
|
||||||
|
"no selected file": "Keine Datei ausgewählt.",
|
||||||
|
"password: password and password confirmation do not match": "Passwort: Passwort und Passwortbestätigung stimmen nicht überein.",
|
||||||
|
"provide a valid auth token": "Gebe ein gültiges Authentifizierungstoken an.",
|
||||||
|
"sorry, that username is already taken": "Es tut mir leid, der Benutzername ist schon vergeben.",
|
||||||
|
"sport does not exist": "Sportart existiert nicht.",
|
||||||
|
"signature expired, please log in again": "Die Signatur ist abgelaufen. Bitte melde dich erneut an.",
|
||||||
|
"successfully registered": "Registrierung erfolgreich.",
|
||||||
|
"user does not exist": "Der Nutzer existiert nicht.",
|
||||||
|
"valid email must be provided for admin contact": "Um den Administrator zu kontaktieren, muss eine gültige E-Mail-Adresse angegeben werden.",
|
||||||
|
"you can not delete your account, no other user has admin rights": "Du kannst Dein Konto nicht löschen, da kein anderer Nutzer hat Administratorrechte besitzt.",
|
||||||
|
"you do not have permissions": "Du hast keine Berechtigung."
|
||||||
|
},
|
||||||
|
"PAGINATION": {
|
||||||
|
"PREVIOUS": "Vorhergehende",
|
||||||
|
"NEXT": "Nächste"
|
||||||
|
}
|
||||||
|
}
|
17
fittrackee_client/src/locales/de/buttons.json
Normal file
17
fittrackee_client/src/locales/de/buttons.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"ACCOUNT-CONFIRMATION-RESEND": "Bestätigungs-E-Mail erneut senden",
|
||||||
|
"BACK": "Zurück",
|
||||||
|
"CANCEL": "Abbrechen",
|
||||||
|
"CLEAR_FILTER": "Filter löschen",
|
||||||
|
"DELETE_MY_ACCOUNT": "Lösche meinen Account",
|
||||||
|
"DISABLE": "Deaktivieren",
|
||||||
|
"EDIT": "Editieren",
|
||||||
|
"ENABLE": "Aktivieren",
|
||||||
|
"FILTER": "Filter",
|
||||||
|
"LOGIN": "Einloggen",
|
||||||
|
"NO": "Nein",
|
||||||
|
"REGISTER": "Registrieren",
|
||||||
|
"RESET": "Zurücksetzen",
|
||||||
|
"SUBMIT": "Speichern",
|
||||||
|
"YES": "Ja"
|
||||||
|
}
|
23
fittrackee_client/src/locales/de/common.json
Normal file
23
fittrackee_client/src/locales/de/common.json
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"ABOUT": "Über",
|
||||||
|
"CONFIRMATION": "Bestätigung",
|
||||||
|
"CONTACT": "Kontakt",
|
||||||
|
"DAY": "Tag | Tage",
|
||||||
|
"DOCUMENTATION": "Dokumentation (en)",
|
||||||
|
"HOME": "Startseite",
|
||||||
|
"HERE": "hier",
|
||||||
|
"SELECTS": {
|
||||||
|
"ORDER_BY": {
|
||||||
|
"LABEL": "sortiert nach"
|
||||||
|
},
|
||||||
|
"ORDER": {
|
||||||
|
"LABEL": "sortieren",
|
||||||
|
"ASC": "aufsteigend",
|
||||||
|
"DESC": "absteigend"
|
||||||
|
},
|
||||||
|
"PER_PAGE": {
|
||||||
|
"LABEL": "pro Seite"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"TOTAL": "Insgesamt"
|
||||||
|
}
|
4
fittrackee_client/src/locales/de/dashboard.json
Normal file
4
fittrackee_client/src/locales/de/dashboard.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"DASHBOARD": "Dashboard",
|
||||||
|
"THIS_MONTH": "Dieser Monat"
|
||||||
|
}
|
25
fittrackee_client/src/locales/de/de.ts
Normal file
25
fittrackee_client/src/locales/de/de.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import AboutTranslations from './about.json'
|
||||||
|
import AdministrationTranslations from './administration.json'
|
||||||
|
import ApiTranslations from './api.json'
|
||||||
|
import ButtonsTranslations from './buttons.json'
|
||||||
|
import CommonTranslations from './common.json'
|
||||||
|
import DashboardTranslations from './dashboard.json'
|
||||||
|
import ErrorTranslations from './error.json'
|
||||||
|
import SportsTranslations from './sports.json'
|
||||||
|
import StatisticsTranslations from './statistics.json'
|
||||||
|
import UserTranslations from './user.json'
|
||||||
|
import WorkoutsTranslations from './workouts.json'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
about: AboutTranslations,
|
||||||
|
admin: AdministrationTranslations,
|
||||||
|
api: ApiTranslations,
|
||||||
|
buttons: ButtonsTranslations,
|
||||||
|
common: CommonTranslations,
|
||||||
|
dashboard: DashboardTranslations,
|
||||||
|
error: ErrorTranslations,
|
||||||
|
sports: SportsTranslations,
|
||||||
|
statistics: StatisticsTranslations,
|
||||||
|
user: UserTranslations,
|
||||||
|
workouts: WorkoutsTranslations,
|
||||||
|
}
|
9
fittrackee_client/src/locales/de/error.json
Normal file
9
fittrackee_client/src/locales/de/error.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"UNKNOWN": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||||
|
"APP_ERROR": "Bei der Anwendung scheinen einige Probleme aufgetreten zu sein.<br />Bitte versuche es später noch einmal oder kontaktiere den Administrator.",
|
||||||
|
"NOT_FOUND": {
|
||||||
|
"PAGE": "Seite nicht gefunden",
|
||||||
|
"WORKOUT": "Training nicht gefunden"
|
||||||
|
},
|
||||||
|
"SOMETHING_WRONG": "Etwas lief schief"
|
||||||
|
}
|
38
fittrackee_client/src/locales/de/sports.json
Normal file
38
fittrackee_client/src/locales/de/sports.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"Cycling (Sport)": {
|
||||||
|
"LABEL": "Radfahren (Sport)"
|
||||||
|
},
|
||||||
|
"Cycling (Transport)": {
|
||||||
|
"LABEL": "Radfahren (Pendeln)"
|
||||||
|
},
|
||||||
|
"Hiking": {
|
||||||
|
"LABEL": "Wandern"
|
||||||
|
},
|
||||||
|
"Mountain Biking": {
|
||||||
|
"LABEL": "Mountainbiken"
|
||||||
|
},
|
||||||
|
"Mountain Biking (Electric)": {
|
||||||
|
"LABEL": "Mountainbiken (elektrisch)"
|
||||||
|
},
|
||||||
|
"Rowing": {
|
||||||
|
"LABEL": "Rudern"
|
||||||
|
},
|
||||||
|
"Running": {
|
||||||
|
"LABEL": "Laufen"
|
||||||
|
},
|
||||||
|
"Skiing (Alpine)": {
|
||||||
|
"LABEL": "Skifahren (Alpin)"
|
||||||
|
},
|
||||||
|
"Skiing (Cross Country)": {
|
||||||
|
"LABEL": "Skifahren (Langlauf)"
|
||||||
|
},
|
||||||
|
"Snowshoes": {
|
||||||
|
"LABEL": "Schneeschuhe"
|
||||||
|
},
|
||||||
|
"Trail": {
|
||||||
|
"LABEL": "Trail"
|
||||||
|
},
|
||||||
|
"Walking": {
|
||||||
|
"LABEL": "Walking"
|
||||||
|
}
|
||||||
|
}
|
8
fittrackee_client/src/locales/de/statistics.json
Normal file
8
fittrackee_client/src/locales/de/statistics.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"STATISTICS": "Statistik",
|
||||||
|
"TIME_FRAMES": {
|
||||||
|
"week": "Woche",
|
||||||
|
"month": "Monat",
|
||||||
|
"year": "Jahr"
|
||||||
|
}
|
||||||
|
}
|
108
fittrackee_client/src/locales/de/user.json
Normal file
108
fittrackee_client/src/locales/de/user.json
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
{
|
||||||
|
"ACCOUNT_CONFIRMATION_NOT_RECEIVED": "Hast du keine Anweisungen erhalten?",
|
||||||
|
"ACCOUNT_CONFIRMATION_SENT": "Prüfe Deine E-Mail. Eine neue Bestätigungsemail wurde an die angegebene Adresse geschickt.",
|
||||||
|
"ADMIN": "Admin",
|
||||||
|
"ALREADY_HAVE_ACCOUNT": "Hast du bereits ein Konto?",
|
||||||
|
"CONFIRM_ACCOUNT_DELETION": "Möchtest Du Dein Konto wirklich löschen? Alle Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.",
|
||||||
|
"CURRENT_PASSWORD": "Aktuelles Passwort",
|
||||||
|
"EMAIL": "E-Mail",
|
||||||
|
"EMAIL_INFO": "Gebe eine gültige E-Mail-Adresse an.",
|
||||||
|
"ENTER_PASSWORD": "Gebe ein Passwort ein",
|
||||||
|
"FILTER_ON_USERNAME": "Nach Benutzernamen filtern",
|
||||||
|
"HIDE_PASSWORD": "Passwort verbergen",
|
||||||
|
"INVALID_TOKEN": "Ungültiges Token, bitte fordere ein neues Passworts an.",
|
||||||
|
"LANGUAGE": "Sprache",
|
||||||
|
"LOG_IN": "Anmelden",
|
||||||
|
"LOGIN": "Anmeldung",
|
||||||
|
"LOGOUT": "Abmelden",
|
||||||
|
"NEW_PASSWORD": "Neues Passwort",
|
||||||
|
"NO_USERS_FOUND": "Keine Nutzer gefunden.",
|
||||||
|
"PASSWORD": "Passwort",
|
||||||
|
"PASSWORD_INFO": "Mindestens 8 Zeichen sind erforderlich.",
|
||||||
|
"PASSWORD_FORGOTTEN": "Passwort vergessen?",
|
||||||
|
"PASSWORD_RESET": "Passwort zurücksetzen",
|
||||||
|
"PASSWORD_SENT_EMAIL_TEXT": "Prüfe Deine E-Mail. Wenn Deine Adresse in der Datenbank enthalten ist, wirst du eine E-Mail mit einem Link erhalten um Dein Passwort zurückzusetzen.",
|
||||||
|
"PASSWORD_STRENGTH": {
|
||||||
|
"WEAK": "schwach",
|
||||||
|
"AVERAGE": "mittel",
|
||||||
|
"GOOD": "gut",
|
||||||
|
"STRONG": "start",
|
||||||
|
"LABEL": "Passwortstärke",
|
||||||
|
"SUGGESTIONS": {
|
||||||
|
"l33t": "Vermeide vorhersehbare Buchstabenersetzungen wie {'@'} für a.",
|
||||||
|
"reverseWords": "Vermeide umgekehrte Schreibweisen gebräuchlicher Wörter.",
|
||||||
|
"allUppercase": "Schreibe einige, aber nicht alle Buchstaben groß.",
|
||||||
|
"capitalization": "Schreibe mehr als nur den ersten Buchstaben groß.",
|
||||||
|
"dates": "Vermeide Daten und Jahreszahlen, die mit Dir in Verbindung gebracht werden.",
|
||||||
|
"recentYears": "Vermeide Angabe von letzten Jahreszahlen.",
|
||||||
|
"associatedYears": "Vermeide Jahreszahlen, die mit Dir in Verbindung gebracht werden.",
|
||||||
|
"sequences": "Vermeide gebräuchliche Zeichenfolgen.",
|
||||||
|
"repeated": "Vermeide wiederholungen von Wörtern und Zeichen.",
|
||||||
|
"longerKeyboardPattern": "Verwende längere Tastaturmuster und ändere mehrmals die Schreibrichtung.",
|
||||||
|
"anotherWord": "Füge weitere weniger gebräuchliche Wörter hinzu.",
|
||||||
|
"useWords": "Verwenden Sie mehrere Wörter, aber vermeide gebräuchliche Ausdrücke.",
|
||||||
|
"noNeed": "Du kannst sichere Passwörter erstellen, ohne Symbole, Zahlen oder Großbuchstaben zu verwenden.",
|
||||||
|
"pwned": "Wenn Sie dieses Passwort auch anderweitig verwenden, sollten Sie es ändern."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PASSWORD_UPDATED": "Dein Passwort wurde aktualisiert. Klicke {0} um dich anzumelden.",
|
||||||
|
"PROFILE": {
|
||||||
|
"ACCOUNT_EDITION": "Kontoausgabe",
|
||||||
|
"BACK_TO_PROFILE": "Zurück zum Profil",
|
||||||
|
"BIO": "Biographie",
|
||||||
|
"BIRTH_DATE": "Geburtsdatum",
|
||||||
|
"EDIT": "Profil bearbeiten",
|
||||||
|
"EDIT_PREFERENCES": "Einstellungen ändern",
|
||||||
|
"EDIT_SPORTS_PREFERENCES": "Einstellungen für Sportarten ändern",
|
||||||
|
"ERRORED_EMAIL_UPDATE": "Bitte {0} um Deine E-Mail Adresse nochmals zu ändern oder kontaktiere den Administrator",
|
||||||
|
"FIRST_NAME": "Vorname",
|
||||||
|
"FIRST_DAY_OF_WEEK": "Erster Tag der Woche",
|
||||||
|
"LANGUAGE": "Sprache",
|
||||||
|
"LAST_NAME": "Nachname",
|
||||||
|
"LOCATION": "Ort",
|
||||||
|
"MONDAY": "Montag",
|
||||||
|
"PICTURE": "Bild",
|
||||||
|
"PICTURE_EDITION": "Bildausgabe",
|
||||||
|
"PICTURE_UPDATE": "Bild aktualisieren",
|
||||||
|
"PICTURE_REMOVE": "Bild entfernen",
|
||||||
|
"PREFERENCES_EDITION": "Einstellungsausgabe",
|
||||||
|
"PROFILE_EDITION": "Profil-Ausgabe",
|
||||||
|
"REGISTRATION_DATE": "Regirierungsdatum",
|
||||||
|
"SPORTS_EDITION": "Sportarten-Einstellungsausgabe",
|
||||||
|
"SUNDAY": "Sontag",
|
||||||
|
"TABS": {
|
||||||
|
"ACCOUNT": "Konto",
|
||||||
|
"PICTURE": "Bild",
|
||||||
|
"PREFERENCES": "Einstellungen",
|
||||||
|
"PROFILE": "Profil",
|
||||||
|
"SPORTS": "Sportarten"
|
||||||
|
},
|
||||||
|
"SPORT": {
|
||||||
|
"ACTION": "Aktion",
|
||||||
|
"COLOR": "Farbe",
|
||||||
|
"DISABLED_BY_ADMIN": "vom Admin deaktiviert",
|
||||||
|
"IS_ACTIVE": "aktiv",
|
||||||
|
"LABEL": "Titel",
|
||||||
|
"STOPPED_SPEED_THRESHOLD": "Geschwindigkeitsschwellenwert für Stopp"
|
||||||
|
},
|
||||||
|
"SUCCESSFUL_EMAIL_UPDATE": "Dein Konto wurde erfolgreich aktualisiert. Bitte prüfe Deine E-Mail um die neue E-Mail Adresse zu bestätigen.",
|
||||||
|
"SUCCESSFUL_REGISTRATION": "Dein Konto wurde erfolgreich erstellt.",
|
||||||
|
"SUCCESSFUL_REGISTRATION_WITH_EMAIL": "Ein Aktivierungslink für Dein Konto wurde an die angegebene E-Mail Adresse geschickt.",
|
||||||
|
"SUCCESSFUL_UPDATE": "Dein Konto wurde erfolgreich aktualisiert.",
|
||||||
|
"UNITS": {
|
||||||
|
"LABEL": "Einheiten für die Distanz",
|
||||||
|
"IMPERIAL": "Imperiales System (ft, mi)",
|
||||||
|
"METRIC": "Metrisches System (m, km)"
|
||||||
|
},
|
||||||
|
"TIMEZONE": "Zeitzone"
|
||||||
|
},
|
||||||
|
"REGISTER": "Registrieren",
|
||||||
|
"RESENT_ACCOUNT_CONFIRMATION": "Sende Email zur Kontobestätigung erneut",
|
||||||
|
"REGISTER_DISABLED": "Entschuldigung, die Registrierung ist deaktiviert.",
|
||||||
|
"RESET_PASSWORD": "Passwort zurücksetzen",
|
||||||
|
"SHOW_PASSWORD": "Passwort anzeigen",
|
||||||
|
"THIS_USER_ACCOUNT_IS_INACTIVE": "Dieser Account ist inaktiv.",
|
||||||
|
"USER_PICTURE": "Benutzerbild",
|
||||||
|
"USERNAME": "Nutzername",
|
||||||
|
"USERNAME_INFO": "3 bis 30 Zeichen sind erforderlich, nur alphanumerische Zeichen und der Unterstrich \"_\" sind erlaubt."
|
||||||
|
}
|
101
fittrackee_client/src/locales/de/workouts.json
Normal file
101
fittrackee_client/src/locales/de/workouts.json
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"ADD_WORKOUT": "Training hinzufügen",
|
||||||
|
"ANALYSIS": "Analyse",
|
||||||
|
"ASCENT": "Aufstieg",
|
||||||
|
"AVE_SPEED": "Durchschn. Geschwindigkeit",
|
||||||
|
"AVERAGE_SPEED": "Durchschnittsgeschwindigkeit",
|
||||||
|
"BACK_TO_WORKOUT": "zurück zum Training",
|
||||||
|
"DATE": "Datum",
|
||||||
|
"DESCENT": "Abstieg",
|
||||||
|
"DISPLAY_FILTERS": "zeige Filter",
|
||||||
|
"DISTANCE": "Entfernung",
|
||||||
|
"DURATION": "Dauer",
|
||||||
|
"EDIT_WORKOUT": "Training bearbeiten",
|
||||||
|
"ELEVATION": "Höhe",
|
||||||
|
"END": "Ende",
|
||||||
|
"FROM": "Von",
|
||||||
|
"GPX_FILE": ".gpx Datei",
|
||||||
|
"HIDE_FILTERS": "verberge Filter",
|
||||||
|
"LATEST_WORKOUTS": "Letzte Trainings",
|
||||||
|
"LOAD_MORE_WORKOUT": "Lade mehr Trainings",
|
||||||
|
"MAX_ALTITUDE": "maximale Höhe",
|
||||||
|
"MAX_FILES": "Maximale Dateianzahl",
|
||||||
|
"MAX_SIZE": "Maximalgröße",
|
||||||
|
"MAX_SPEED": "Max. Geschwindigkeit",
|
||||||
|
"MIN_ALTITUDE": "minimale Höhe",
|
||||||
|
"NEXT_SEGMENT": "Nächstes Segment",
|
||||||
|
"NEXT_WORKOUT": "Nächstes Training",
|
||||||
|
"NO_DATA_CLEANING": "Daten aus gpx, ohne Bereinigung",
|
||||||
|
"NO_FILE_PROVIDED": "Keine Datei angegeben",
|
||||||
|
"NO_FOLDER": "enthält keinen Ordner",
|
||||||
|
"NO_MAP": "Keine Karte",
|
||||||
|
"NO_NEXT_SEGMENT": "Kein nächstes Segment",
|
||||||
|
"NO_NEXT_WORKOUT": "Kein nächstes Training",
|
||||||
|
"NO_NOTES": "Keine Anmerkungen",
|
||||||
|
"NO_PREVIOUS_SEGMENT": "Kein vorheriges Segment",
|
||||||
|
"NO_PREVIOUS_WORKOUT": "Kein vorheriges Training",
|
||||||
|
"NO_RECORDS": "Keine Aufzeichnungen.",
|
||||||
|
"NO_WORKOUTS": "Keine Trainings.",
|
||||||
|
"NOTES": "Anmerkungen",
|
||||||
|
"PAUSES": "Pausen",
|
||||||
|
"PREVIOUS_SEGMENT": "Vorheriges Segment",
|
||||||
|
"PREVIOUS_WORKOUT": "Vorheriges Training",
|
||||||
|
"RECORD": "Aufzeichnung | Aufzeichnungen",
|
||||||
|
"RECORD_AS": "Durchschn. Geschwindigkeit",
|
||||||
|
"RECORD_FD": "Weiteste Entfernung",
|
||||||
|
"RECORD_LD": "Längste Dauer",
|
||||||
|
"RECORD_MS": "Max. Geschwindigkeit",
|
||||||
|
"REMAINING_CHARS": "remaining characters",
|
||||||
|
"SEGMENT": "Segment | Segmente",
|
||||||
|
"SPEED": "Geschwindigkeit",
|
||||||
|
"SPORT": "Sportart | Sportarten",
|
||||||
|
"START": "Start",
|
||||||
|
"START_AND_FINISH": "Start und Ziel",
|
||||||
|
"START_ELEVATION_AT_ZERO": "Höhenachse bei Null starten",
|
||||||
|
"TITLE": "Titel",
|
||||||
|
"TO": "bis",
|
||||||
|
"TOTAL_DURATION": "Gesamtdauer",
|
||||||
|
"UPLOAD_FIRST_WORKOUT": "Füge erstes Training hinzu!",
|
||||||
|
"WEATHER": {
|
||||||
|
"HUMIDITY": "Luftfeuchtigkeit",
|
||||||
|
"TEMPERATURE": "Temperatur",
|
||||||
|
"WIND": "Wind",
|
||||||
|
"WIND_DIRECTIONS": {
|
||||||
|
"N": "N",
|
||||||
|
"NNE": "NNO",
|
||||||
|
"NE": "NO",
|
||||||
|
"ENE": "ONO",
|
||||||
|
"E": "O",
|
||||||
|
"ESE": "OSO",
|
||||||
|
"SE": "SO",
|
||||||
|
"SSE": "SSO",
|
||||||
|
"S": "S",
|
||||||
|
"SSW": "SSW",
|
||||||
|
"SW": "SW",
|
||||||
|
"WSW": "WSW",
|
||||||
|
"W": "W",
|
||||||
|
"WNW": "WNW",
|
||||||
|
"NW": "NW",
|
||||||
|
"NNW": "NNW"
|
||||||
|
},
|
||||||
|
"DARK_SKY": {
|
||||||
|
"clear-day": "klarer Tag",
|
||||||
|
"clear-night": "klare Nacht",
|
||||||
|
"cloudy": "wolkig",
|
||||||
|
"fog": "Nebel",
|
||||||
|
"partly-cloudy-day": "teilweise bewölkter Tag",
|
||||||
|
"partly-cloudy-night": "teilweise bewölkte Nacht",
|
||||||
|
"rain": "Regen",
|
||||||
|
"sleet": "Schneeregen",
|
||||||
|
"snow": "Schnee",
|
||||||
|
"wind": "Wind"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"WITH_GPX": "mit .gpx Datei",
|
||||||
|
"WITHOUT_GPX": "ohne .gpx Datei",
|
||||||
|
"WORKOUT": "Training | Trainings",
|
||||||
|
"WORKOUT_DATE": "Trainingsdatum",
|
||||||
|
"WORKOUT_DELETION_CONFIRMATION": "Bist du sicher, dass du dieses Training löschen möchtest?",
|
||||||
|
"ZIP_ARCHIVE": ".zip Datei",
|
||||||
|
"ZIP_ARCHIVE_DESCRIPTION": "oder .zip Datei mit .gpx Dateien"
|
||||||
|
}
|
@ -2,7 +2,6 @@ import { ActionContext, ActionTree } from 'vuex'
|
|||||||
|
|
||||||
import authApi from '@/api/authApi'
|
import authApi from '@/api/authApi'
|
||||||
import api from '@/api/defaultApi'
|
import api from '@/api/defaultApi'
|
||||||
import createI18n from '@/i18n'
|
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
import {
|
import {
|
||||||
AUTH_USER_STORE,
|
AUTH_USER_STORE,
|
||||||
@ -32,8 +31,6 @@ import {
|
|||||||
} from '@/types/user'
|
} from '@/types/user'
|
||||||
import { handleError } from '@/utils'
|
import { handleError } from '@/utils'
|
||||||
|
|
||||||
const { locale } = createI18n.global
|
|
||||||
|
|
||||||
const removeAuthUserData = (
|
const removeAuthUserData = (
|
||||||
context: ActionContext<IAuthUserState, IRootState>
|
context: ActionContext<IAuthUserState, IRootState>
|
||||||
) => {
|
) => {
|
||||||
@ -126,11 +123,10 @@ export const actions: ActionTree<IAuthUserState, IRootState> &
|
|||||||
res.data.data
|
res.data.data
|
||||||
)
|
)
|
||||||
if (res.data.data.language) {
|
if (res.data.data.language) {
|
||||||
context.commit(
|
context.dispatch(
|
||||||
ROOT_STORE.MUTATIONS.UPDATE_LANG,
|
ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE,
|
||||||
res.data.data.language
|
res.data.data.language
|
||||||
)
|
)
|
||||||
locale.value = res.data.data.language
|
|
||||||
}
|
}
|
||||||
context.dispatch(SPORTS_STORE.ACTIONS.GET_SPORTS)
|
context.dispatch(SPORTS_STORE.ACTIONS.GET_SPORTS)
|
||||||
} else {
|
} else {
|
||||||
@ -251,12 +247,12 @@ export const actions: ActionTree<IAuthUserState, IRootState> &
|
|||||||
AUTH_USER_STORE.MUTATIONS.UPDATE_AUTH_USER_PROFILE,
|
AUTH_USER_STORE.MUTATIONS.UPDATE_AUTH_USER_PROFILE,
|
||||||
res.data.data
|
res.data.data
|
||||||
)
|
)
|
||||||
context.commit(
|
context
|
||||||
ROOT_STORE.MUTATIONS.UPDATE_LANG,
|
.dispatch(
|
||||||
res.data.data.language
|
ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE,
|
||||||
)
|
res.data.data.language
|
||||||
locale.value = res.data.data.language
|
)
|
||||||
router.push('/profile/preferences')
|
.then(() => router.push('/profile/preferences'))
|
||||||
} else {
|
} else {
|
||||||
handleError(context, null)
|
handleError(context, null)
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
import { ActionContext, ActionTree } from 'vuex'
|
import { ActionContext, ActionTree } from 'vuex'
|
||||||
|
|
||||||
import authApi from '@/api/authApi'
|
import authApi from '@/api/authApi'
|
||||||
|
import createI18n from '@/i18n'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
import { ROOT_STORE } from '@/store/constants'
|
import { ROOT_STORE } from '@/store/constants'
|
||||||
import { IRootActions, IRootState } from '@/store/modules/root/types'
|
import { IRootActions, IRootState } from '@/store/modules/root/types'
|
||||||
import { TAppConfigForm } from '@/types/application'
|
import { TAppConfigForm } from '@/types/application'
|
||||||
import { handleError } from '@/utils'
|
import { handleError } from '@/utils'
|
||||||
|
|
||||||
|
const { locale } = createI18n.global
|
||||||
|
|
||||||
export const actions: ActionTree<IRootState, IRootState> & IRootActions = {
|
export const actions: ActionTree<IRootState, IRootState> & IRootActions = {
|
||||||
[ROOT_STORE.ACTIONS.GET_APPLICATION_CONFIG](
|
[ROOT_STORE.ACTIONS.GET_APPLICATION_CONFIG](
|
||||||
context: ActionContext<IRootState, IRootState>
|
context: ActionContext<IRootState, IRootState>
|
||||||
@ -68,4 +71,12 @@ export const actions: ActionTree<IRootState, IRootState> & IRootActions = {
|
|||||||
})
|
})
|
||||||
.catch((error) => handleError(context, error))
|
.catch((error) => handleError(context, error))
|
||||||
},
|
},
|
||||||
|
[ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE](
|
||||||
|
context: ActionContext<IRootState, IRootState>,
|
||||||
|
language: string
|
||||||
|
): void {
|
||||||
|
document.querySelector('html')?.setAttribute('lang', language)
|
||||||
|
context.commit(ROOT_STORE.MUTATIONS.UPDATE_LANG, language)
|
||||||
|
locale.value = language
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ export enum RootActions {
|
|||||||
GET_APPLICATION_CONFIG = 'GET_APPLICATION_CONFIG',
|
GET_APPLICATION_CONFIG = 'GET_APPLICATION_CONFIG',
|
||||||
GET_APPLICATION_STATS = 'GET_APPLICATION_STATS',
|
GET_APPLICATION_STATS = 'GET_APPLICATION_STATS',
|
||||||
UPDATE_APPLICATION_CONFIG = 'UPDATE_APPLICATION_CONFIG',
|
UPDATE_APPLICATION_CONFIG = 'UPDATE_APPLICATION_CONFIG',
|
||||||
|
UPDATE_APPLICATION_LANGUAGE = 'UPDATE_APPLICATION_LANGUAGE',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum RootGetters {
|
export enum RootGetters {
|
||||||
|
@ -34,6 +34,10 @@ export interface IRootActions {
|
|||||||
context: ActionContext<IRootState, IRootState>,
|
context: ActionContext<IRootState, IRootState>,
|
||||||
payload: TAppConfigForm
|
payload: TAppConfigForm
|
||||||
): void
|
): void
|
||||||
|
[ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE](
|
||||||
|
context: ActionContext<IRootState, IRootState>,
|
||||||
|
langauge: string
|
||||||
|
): void
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IRootGetters {
|
export interface IRootGetters {
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
/* eslint-disable import/no-duplicates */
|
/* eslint-disable import/no-duplicates */
|
||||||
import { Locale } from 'date-fns'
|
import { Locale } from 'date-fns'
|
||||||
import { enUS, fr } from 'date-fns/locale'
|
import { de, enUS, fr } from 'date-fns/locale'
|
||||||
|
|
||||||
import createI18n from '@/i18n'
|
import createI18n from '@/i18n'
|
||||||
|
|
||||||
export const localeFromLanguage: Record<string, Locale> = {
|
export const localeFromLanguage: Record<string, Locale> = {
|
||||||
|
de: de,
|
||||||
en: enUS,
|
en: enUS,
|
||||||
fr: fr,
|
fr: fr,
|
||||||
}
|
}
|
||||||
|
|
||||||
export const languageLabels: Record<string, string> = {
|
export const languageLabels: Record<string, string> = {
|
||||||
|
de: 'Deutsch',
|
||||||
en: 'English',
|
en: 'English',
|
||||||
fr: 'Français',
|
fr: 'Français',
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user