Merge remote-tracking branch 'gitlab/dev' into weblate-fittrackee-fittrackee-client-administration

This commit is contained in:
Sam 2022-07-02 11:16:07 +02:00
commit e2837821df
59 changed files with 741 additions and 57 deletions

View File

@ -20,6 +20,8 @@ The **GitHub** repository contains:
- tests,
- 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**).

View File

@ -26,6 +26,10 @@ Examples for Android (non-exhaustive list):
Maps are displayed using [Open Street Map](https://www.openstreetmap.org).
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).**
(see [issues](https://github.com/SamR1/FitTrackee/issues) and [documentation](https://samr1.github.io/FitTrackee) for more information)

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.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>

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

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],{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

File diff suppressed because one or more lines are too long

View File

@ -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 %}

View 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}}

View File

@ -0,0 +1 @@
FitTrackee - Bestätige Dein Konto

View File

@ -2,7 +2,7 @@
{% block title %}Confirm your account{% endblock %}
{% block preheader %}Use this link to confirm your account.{% endblock %}
{% 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">
<tr>
<td align="center">
@ -29,4 +29,4 @@
<p class="f-fallback sub">{{account_confirmation_url}}</p>
</td>
</tr>
</table>{% endblock %}
</table>{% endblock %}

View File

@ -1,6 +1,6 @@
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 }}

View File

@ -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 %}

View File

@ -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}}

View File

@ -0,0 +1 @@
FitTrackee - E-Mail Adresse geändert

View File

@ -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 %}

View File

@ -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}}

View File

@ -0,0 +1 @@
FitTrackee - Bestätige E-Mail Änderung

View 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 %}

View 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}}

View File

@ -0,0 +1 @@
FitTrackee - Passwort geändert

View File

@ -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 %}

View File

@ -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}}

View File

@ -0,0 +1 @@
FitTrackee - Anfrage zum Zurücksetzen des Passworts

View File

@ -2,7 +2,7 @@
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
@ -47,7 +47,7 @@ expected_en_html_body = """ <body>
<td class="content-cell">
<div class="f-fallback">
<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">
<tr>
<td align="center">

View File

@ -64,6 +64,7 @@
padding: $default-padding;
.record {
display: flex;
align-items: center;
justify-content: space-between;
span {
padding: 2px 5px;
@ -73,6 +74,7 @@
}
.record-value {
font-weight: bold;
white-space: nowrap;
padding-right: $default-padding * 2;
}
}

View File

@ -79,7 +79,6 @@
<script setup lang="ts">
import { ComputedRef, computed, ref, capitalize } from 'vue'
import { useI18n } from 'vue-i18n'
import UserPicture from '@/components/User/UserPicture.vue'
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
@ -90,7 +89,6 @@
const emit = defineEmits(['menuInteraction'])
const { locale } = useI18n()
const store = useStore()
const authUser: ComputedRef<IAuthUserProfile> = computed(
@ -113,8 +111,10 @@
emit('menuInteraction', false)
}
function updateLanguage(option: IDropdownOption) {
locale.value = option.value.toString()
store.commit(ROOT_STORE.MUTATIONS.UPDATE_LANG, option.value)
store.dispatch(
ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE,
option.value.toString()
)
}
function logout() {
store.dispatch(AUTH_USER_STORE.ACTIONS.LOGOUT)

View File

@ -25,7 +25,7 @@
:query="query"
/>
<table>
<thead>
<thead :class="{ smaller: 'de' === currentLanguage }">
<tr>
<th class="sport-col" />
<th>{{ capitalize($t('workouts.WORKOUT', 1)) }}</th>
@ -79,7 +79,7 @@
:display-hover="true"
/>
</td>
<td>
<td class="workout-date">
<span class="cell-heading">
{{ $t('workouts.DATE') }}
</span>
@ -179,7 +179,7 @@
import Pagination from '@/components/Common/Pagination.vue'
import StaticMap from '@/components/Common/StaticMap.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 { ITranslatedSport } from '@/types/sports'
import { IAuthUserProfile } from '@/types/user'
@ -214,6 +214,9 @@
const pagination: ComputedRef<IPagination> = computed(
() => store.getters[WORKOUTS_STORE.GETTERS.WORKOUTS_PAGINATION]
)
const currentLanguage: ComputedRef<string> = computed(
() => store.getters[ROOT_STORE.GETTERS.LANGUAGE]
)
let query: TWorkoutsPayload = getWorkoutsQuery(route.query)
const hoverWorkoutId: Ref<string | null> = ref(null)
@ -238,9 +241,14 @@
}
function getWorkoutsQuery(newQuery: LocationQuery): TWorkoutsPayload {
const workoutQuery = getQuery(newQuery, orderByList, defaultOrder.order_by, {
defaultSort: defaultOrder.order,
})
const workoutQuery = getQuery(
newQuery,
orderByList,
defaultOrder.order_by,
{
defaultSort: defaultOrder.order,
}
)
Object.keys(newQuery)
.filter((k) => workoutsPayloadKeys.includes(k))
.map((k) => {
@ -287,7 +295,7 @@
width: 100%;
.box {
padding: $default-padding $default-padding * 2;
padding: $default-padding $default-padding * 1.5;
@media screen and (max-width: $small-limit) {
&.empty-table {
display: none;
@ -318,11 +326,22 @@
}
.workouts-table {
.smaller {
th {
font-size: 0.95em;
padding: $default-padding 0;
max-width: 100px;
}
}
td {
text-align: right;
}
.sport-col {
padding-right: 0;
padding: 0;
}
.workout-title {
max-width: 90px;
text-align: left;
width: 100px;
position: relative;
.fa-map-o {
font-size: 0.75em;
@ -347,14 +366,27 @@
height: 20px;
width: 20px;
}
.workout-date {
max-width: 60px;
text-align: left;
}
@media screen and (max-width: $small-limit) {
td,
.workout-date,
.workout-title {
text-align: center;
}
.sport-col {
display: flex;
justify-content: center;
padding: $default-padding;
}
.workout-date {
max-width: initial;
}
.workout-title {
max-width: initial;
width: 100%;
}
.workout-title:hover .static-map {
display: none;

View 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"
}

View 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"
}
}
}
}

View 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"
}
}

View 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"
}

View 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"
}

View File

@ -0,0 +1,4 @@
{
"DASHBOARD": "Dashboard",
"THIS_MONTH": "Dieser Monat"
}

View 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,
}

View 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"
}

View 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"
}
}

View File

@ -0,0 +1,8 @@
{
"STATISTICS": "Statistik",
"TIME_FRAMES": {
"week": "Woche",
"month": "Monat",
"year": "Jahr"
}
}

View 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."
}

View 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"
}

View File

@ -2,7 +2,6 @@ import { ActionContext, ActionTree } from 'vuex'
import authApi from '@/api/authApi'
import api from '@/api/defaultApi'
import createI18n from '@/i18n'
import router from '@/router'
import {
AUTH_USER_STORE,
@ -32,8 +31,6 @@ import {
} from '@/types/user'
import { handleError } from '@/utils'
const { locale } = createI18n.global
const removeAuthUserData = (
context: ActionContext<IAuthUserState, IRootState>
) => {
@ -126,11 +123,10 @@ export const actions: ActionTree<IAuthUserState, IRootState> &
res.data.data
)
if (res.data.data.language) {
context.commit(
ROOT_STORE.MUTATIONS.UPDATE_LANG,
context.dispatch(
ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE,
res.data.data.language
)
locale.value = res.data.data.language
}
context.dispatch(SPORTS_STORE.ACTIONS.GET_SPORTS)
} else {
@ -251,12 +247,12 @@ export const actions: ActionTree<IAuthUserState, IRootState> &
AUTH_USER_STORE.MUTATIONS.UPDATE_AUTH_USER_PROFILE,
res.data.data
)
context.commit(
ROOT_STORE.MUTATIONS.UPDATE_LANG,
res.data.data.language
)
locale.value = res.data.data.language
router.push('/profile/preferences')
context
.dispatch(
ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE,
res.data.data.language
)
.then(() => router.push('/profile/preferences'))
} else {
handleError(context, null)
}

View File

@ -1,12 +1,15 @@
import { ActionContext, ActionTree } from 'vuex'
import authApi from '@/api/authApi'
import createI18n from '@/i18n'
import router from '@/router'
import { ROOT_STORE } from '@/store/constants'
import { IRootActions, IRootState } from '@/store/modules/root/types'
import { TAppConfigForm } from '@/types/application'
import { handleError } from '@/utils'
const { locale } = createI18n.global
export const actions: ActionTree<IRootState, IRootState> & IRootActions = {
[ROOT_STORE.ACTIONS.GET_APPLICATION_CONFIG](
context: ActionContext<IRootState, IRootState>
@ -68,4 +71,12 @@ export const actions: ActionTree<IRootState, IRootState> & IRootActions = {
})
.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
},
}

View File

@ -2,6 +2,7 @@ export enum RootActions {
GET_APPLICATION_CONFIG = 'GET_APPLICATION_CONFIG',
GET_APPLICATION_STATS = 'GET_APPLICATION_STATS',
UPDATE_APPLICATION_CONFIG = 'UPDATE_APPLICATION_CONFIG',
UPDATE_APPLICATION_LANGUAGE = 'UPDATE_APPLICATION_LANGUAGE',
}
export enum RootGetters {

View File

@ -34,6 +34,10 @@ export interface IRootActions {
context: ActionContext<IRootState, IRootState>,
payload: TAppConfigForm
): void
[ROOT_STORE.ACTIONS.UPDATE_APPLICATION_LANGUAGE](
context: ActionContext<IRootState, IRootState>,
langauge: string
): void
}
export interface IRootGetters {

View File

@ -1,15 +1,17 @@
/* eslint-disable import/no-duplicates */
import { Locale } from 'date-fns'
import { enUS, fr } from 'date-fns/locale'
import { de, enUS, fr } from 'date-fns/locale'
import createI18n from '@/i18n'
export const localeFromLanguage: Record<string, Locale> = {
de: de,
en: enUS,
fr: fr,
}
export const languageLabels: Record<string, string> = {
de: 'Deutsch',
en: 'English',
fr: 'Français',
}