fix trail privacy (#719)
* fix trail privacy * adds privacy setting to integrations --------- Co-authored-by: Christian Beutel <>
This commit is contained in:
@@ -205,7 +205,7 @@ func syncTrailWithTours(app core.App, k *KomootApi, i KomootIntegration, user st
|
|||||||
app.Logger().Warn(fmt.Sprintf("Unable to generate GPX for tour '%s': %v", tour.Name, err))
|
app.Logger().Warn(fmt.Sprintf("Unable to generate GPX for tour '%s': %v", tour.Name, err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
trailid, err := createTrailFromTour(app, k, detailedTour, gpx, actor)
|
trailid, err := createTrailFromTour(app, k, detailedTour, gpx, user, actor, i.Privacy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.Logger().Warn(fmt.Sprintf("Unable to create trail for tour '%s': %v", tour.Name, err))
|
app.Logger().Warn(fmt.Sprintf("Unable to create trail for tour '%s': %v", tour.Name, err))
|
||||||
continue
|
continue
|
||||||
@@ -220,7 +220,7 @@ func syncTrailWithTours(app core.App, k *KomootApi, i KomootIntegration, user st
|
|||||||
return hasNewTours, nil
|
return hasNewTours, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTrailFromTour(app core.App, k *KomootApi, detailedTour *DetailedKomootTour, gpx *filesystem.File, actor string) (string, error) {
|
func createTrailFromTour(app core.App, k *KomootApi, detailedTour *DetailedKomootTour, gpx *filesystem.File, user string, actor string, privacy string) (string, error) {
|
||||||
trailid := security.RandomStringWithAlphabet(core.DefaultIdLength, core.DefaultIdAlphabet)
|
trailid := security.RandomStringWithAlphabet(core.DefaultIdLength, core.DefaultIdAlphabet)
|
||||||
|
|
||||||
collection, err := app.FindCollectionByNameOrId("trails")
|
collection, err := app.FindCollectionByNameOrId("trails")
|
||||||
@@ -266,10 +266,24 @@ func createTrailFromTour(app core.App, k *KomootApi, detailedTour *DetailedKomoo
|
|||||||
diffculty = "easy"
|
diffculty = "easy"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public := detailedTour.Status == "public"
|
||||||
|
if privacy == "settings" {
|
||||||
|
privacySettings := struct {
|
||||||
|
Trails string `json:"trails"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
settings, _ := app.FindFirstRecordByData("settings", "user", user)
|
||||||
|
err = settings.UnmarshalJSONField("privacy", &privacySettings)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
public = privacySettings.Trails == "public"
|
||||||
|
}
|
||||||
|
|
||||||
record.Load(map[string]any{
|
record.Load(map[string]any{
|
||||||
"id": trailid,
|
"id": trailid,
|
||||||
"name": detailedTour.Name,
|
"name": detailedTour.Name,
|
||||||
"public": detailedTour.Status == "public",
|
"public": public,
|
||||||
"distance": detailedTour.Distance,
|
"distance": detailedTour.Distance,
|
||||||
"elevation_gain": detailedTour.ElevationUp,
|
"elevation_gain": detailedTour.ElevationUp,
|
||||||
"elevation_loss": detailedTour.ElevationDown,
|
"elevation_loss": detailedTour.ElevationDown,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ type KomootIntegration struct {
|
|||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
Planned bool `json:"planned"`
|
Planned bool `json:"planned"`
|
||||||
Completed bool `json:"completed"`
|
Completed bool `json:"completed"`
|
||||||
|
Privacy string `json:"privacy"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoginResponse struct {
|
type LoginResponse struct {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ type StravaIntegration struct {
|
|||||||
AccessToken string `json:"accessToken,omitempty"`
|
AccessToken string `json:"accessToken,omitempty"`
|
||||||
RefreshToken string `json:"refreshToken,omitempty"`
|
RefreshToken string `json:"refreshToken,omitempty"`
|
||||||
ExpiresAt int64 `json:"expiresAt,omitempty"`
|
ExpiresAt int64 `json:"expiresAt,omitempty"`
|
||||||
|
Privacy string `json:"privacy"`
|
||||||
After string `json:"after,omitempty"`
|
After string `json:"after,omitempty"`
|
||||||
}
|
}
|
||||||
type StravaRoute struct {
|
type StravaRoute struct {
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ func SyncStrava(app core.App) error {
|
|||||||
app.Logger().Warn(warning)
|
app.Logger().Warn(warning)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
err = syncTrailsWithRoutes(app, r.AccessToken, userId, actorId, routes)
|
err = syncTrailsWithRoutes(app, stravaIntegration, r.AccessToken, userId, actorId, routes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
warning := fmt.Sprintf("error syncing strava routes with trails: %v\n", err)
|
warning := fmt.Sprintf("error syncing strava routes with trails: %v\n", err)
|
||||||
fmt.Print(warning)
|
fmt.Print(warning)
|
||||||
@@ -134,7 +134,7 @@ func SyncStrava(app core.App) error {
|
|||||||
app.Logger().Warn(warning)
|
app.Logger().Warn(warning)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
err = syncTrailsWithActivities(app, r.AccessToken, actorId, activities)
|
err = syncTrailsWithActivities(app, stravaIntegration, r.AccessToken, userId, actorId, activities)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
warning := fmt.Sprintf("error syncing strava activities with trails: %v", err)
|
warning := fmt.Sprintf("error syncing strava activities with trails: %v", err)
|
||||||
@@ -248,7 +248,7 @@ func fetchStravaActivities(accessToken string, page int, after int64) ([]StravaA
|
|||||||
return activities, nil
|
return activities, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncTrailsWithRoutes(app core.App, accessToken string, user string, actor string, routes []StravaRoute) error {
|
func syncTrailsWithRoutes(app core.App, i StravaIntegration, accessToken string, user string, actor string, routes []StravaRoute) error {
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": route.IDStr})
|
trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": route.IDStr})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -262,7 +262,7 @@ func syncTrailsWithRoutes(app core.App, accessToken string, user string, actor s
|
|||||||
app.Logger().Warn(fmt.Sprintf("Unable to fetch GPX for route '%s': %v", route.Name, err))
|
app.Logger().Warn(fmt.Sprintf("Unable to fetch GPX for route '%s': %v", route.Name, err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
trailid, err := createTrailFromRoute(app, route, gpx, actor)
|
trailid, err := createTrailFromRoute(app, route, gpx, user, actor, i.Privacy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.Logger().Warn(fmt.Sprintf("Unable to create trail for route '%s': %v", route.Name, err))
|
app.Logger().Warn(fmt.Sprintf("Unable to create trail for route '%s': %v", route.Name, err))
|
||||||
continue
|
continue
|
||||||
@@ -315,7 +315,7 @@ func fetchRouteGPX(route StravaRoute, accessToken string) (*filesystem.File, err
|
|||||||
return gpxFile, nil
|
return gpxFile, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTrailFromRoute(app core.App, route StravaRoute, gpx *filesystem.File, actor string) (string, error) {
|
func createTrailFromRoute(app core.App, route StravaRoute, gpx *filesystem.File, user string, actor string, privacy string) (string, error) {
|
||||||
trailid := security.RandomStringWithAlphabet(core.DefaultIdLength, core.DefaultIdAlphabet)
|
trailid := security.RandomStringWithAlphabet(core.DefaultIdLength, core.DefaultIdAlphabet)
|
||||||
|
|
||||||
collection, err := app.FindCollectionByNameOrId("trails")
|
collection, err := app.FindCollectionByNameOrId("trails")
|
||||||
@@ -348,11 +348,27 @@ func createTrailFromRoute(app core.App, route StravaRoute, gpx *filesystem.File,
|
|||||||
category = hikeCategory.Id
|
category = hikeCategory.Id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public := !route.Private
|
||||||
|
|
||||||
|
if privacy == "settings" {
|
||||||
|
privacySettings := struct {
|
||||||
|
Trails string `json:"trails"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
settings, _ := app.FindFirstRecordByData("settings", "user", user)
|
||||||
|
err = settings.UnmarshalJSONField("privacy", &privacySettings)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
public = privacySettings.Trails == "public"
|
||||||
|
}
|
||||||
|
|
||||||
record.Load(map[string]any{
|
record.Load(map[string]any{
|
||||||
"id": trailid,
|
"id": trailid,
|
||||||
"name": route.Name,
|
"name": route.Name,
|
||||||
"description": route.Description,
|
"description": route.Description,
|
||||||
"public": !route.Private,
|
"public": public,
|
||||||
"distance": route.Distance,
|
"distance": route.Distance,
|
||||||
"elevation_gain": route.ElevationGain,
|
"elevation_gain": route.ElevationGain,
|
||||||
"duration": route.EstimatedMovingTime,
|
"duration": route.EstimatedMovingTime,
|
||||||
@@ -404,7 +420,7 @@ func createWaypointsFromRoute(app core.App, route StravaRoute, user string, trai
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncTrailsWithActivities(app core.App, accessToken string, actor string, activities []StravaActivity) error {
|
func syncTrailsWithActivities(app core.App, i StravaIntegration, accessToken string, user string, actor string, activities []StravaActivity) error {
|
||||||
for _, activity := range activities {
|
for _, activity := range activities {
|
||||||
trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": strconv.Itoa(int(activity.ID))})
|
trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": strconv.Itoa(int(activity.ID))})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -423,7 +439,7 @@ func syncTrailsWithActivities(app core.App, accessToken string, actor string, ac
|
|||||||
app.Logger().Warn(fmt.Sprintf("Unable to fetch GPX for activity '%s': %v", activity.Name, err))
|
app.Logger().Warn(fmt.Sprintf("Unable to fetch GPX for activity '%s': %v", activity.Name, err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
err = createTrailFromActivity(app, detailedActivity, gpx, actor)
|
err = createTrailFromActivity(app, detailedActivity, gpx, user, actor, i.Privacy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.Logger().Warn(fmt.Sprintf("Unable to create trail from activity '%s': %v", activity.Name, err))
|
app.Logger().Warn(fmt.Sprintf("Unable to create trail from activity '%s': %v", activity.Name, err))
|
||||||
continue
|
continue
|
||||||
@@ -460,7 +476,7 @@ func fetchDetailedActivity(activity StravaActivity, accessToken string) (*Detail
|
|||||||
return &detailedActivity, nil
|
return &detailedActivity, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTrailFromActivity(app core.App, activity *DetailedStravaActivity, gpx *filesystem.File, user string) error {
|
func createTrailFromActivity(app core.App, activity *DetailedStravaActivity, gpx *filesystem.File, user string, actor string, privacy string) error {
|
||||||
if len(activity.StartLatlng) < 2 {
|
if len(activity.StartLatlng) < 2 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -526,10 +542,26 @@ func createTrailFromActivity(app core.App, activity *DetailedStravaActivity, gpx
|
|||||||
categoryId = category.Id
|
categoryId = category.Id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public := !activity.Private
|
||||||
|
|
||||||
|
if privacy == "settings" {
|
||||||
|
privacySettings := struct {
|
||||||
|
Trails string `json:"trails"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
settings, _ := app.FindFirstRecordByData("settings", "user", user)
|
||||||
|
err = settings.UnmarshalJSONField("privacy", &privacySettings)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
public = privacySettings.Trails == "public"
|
||||||
|
}
|
||||||
|
|
||||||
record.Load(map[string]any{
|
record.Load(map[string]any{
|
||||||
"name": activity.Name,
|
"name": activity.Name,
|
||||||
"description": activity.Description,
|
"description": activity.Description,
|
||||||
"public": !activity.Private,
|
"public": public,
|
||||||
"distance": activity.Distance,
|
"distance": activity.Distance,
|
||||||
"elevation_gain": activity.TotalElevationGain,
|
"elevation_gain": activity.TotalElevationGain,
|
||||||
"duration": activity.ElapsedTime,
|
"duration": activity.ElapsedTime,
|
||||||
@@ -540,7 +572,7 @@ func createTrailFromActivity(app core.App, activity *DetailedStravaActivity, gpx
|
|||||||
"lon": activity.StartLatlng[1],
|
"lon": activity.StartLatlng[1],
|
||||||
"difficulty": "easy",
|
"difficulty": "easy",
|
||||||
"category": categoryId,
|
"category": categoryId,
|
||||||
"author": user,
|
"author": actor,
|
||||||
})
|
})
|
||||||
|
|
||||||
if photo != nil {
|
if photo != nil {
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Modal from "$lib/components/base/modal.svelte";
|
import Modal from "$lib/components/base/modal.svelte";
|
||||||
|
import Select, {
|
||||||
|
type SelectItem,
|
||||||
|
} from "$lib/components/base/select.svelte";
|
||||||
import TextField from "$lib/components/base/text_field.svelte";
|
import TextField from "$lib/components/base/text_field.svelte";
|
||||||
import Toggle from "$lib/components/base/toggle.svelte";
|
import Toggle from "$lib/components/base/toggle.svelte";
|
||||||
import { KomootSchema } from "$lib/models/api/integration_schema";
|
import { KomootSchema } from "$lib/models/api/integration_schema";
|
||||||
@@ -20,6 +23,14 @@
|
|||||||
|
|
||||||
let modal: Modal;
|
let modal: Modal;
|
||||||
|
|
||||||
|
const privacySelectItems: SelectItem[] = [
|
||||||
|
{
|
||||||
|
text: $_("keep-original"),
|
||||||
|
value: "original",
|
||||||
|
},
|
||||||
|
{ text: $_("apply-user-settings"), value: "settings" },
|
||||||
|
];
|
||||||
|
|
||||||
export function openModal() {
|
export function openModal() {
|
||||||
errors.set({});
|
errors.set({});
|
||||||
modal.openModal();
|
modal.openModal();
|
||||||
@@ -36,6 +47,7 @@
|
|||||||
completed: integration?.komoot?.completed ?? true,
|
completed: integration?.komoot?.completed ?? true,
|
||||||
planned: integration?.komoot?.planned ?? true,
|
planned: integration?.komoot?.planned ?? true,
|
||||||
active: integration?.komoot?.active ?? false,
|
active: integration?.komoot?.active ?? false,
|
||||||
|
privacy: integration?.komoot?.privacy ?? "original",
|
||||||
},
|
},
|
||||||
extend: validator({
|
extend: validator({
|
||||||
schema: KomootSchema,
|
schema: KomootSchema,
|
||||||
@@ -70,13 +82,28 @@
|
|||||||
error={$errors.password}
|
error={$errors.password}
|
||||||
></TextField>
|
></TextField>
|
||||||
<div class="flex flex-wrap gap-x-4">
|
<div class="flex flex-wrap gap-x-4">
|
||||||
<Toggle name="planned" label={$_("planned-tours", { values: { n: 2 } })}
|
<Toggle
|
||||||
|
name="planned"
|
||||||
|
label={$_("planned-tours", { values: { n: 2 } })}
|
||||||
></Toggle>
|
></Toggle>
|
||||||
<Toggle
|
<Toggle
|
||||||
name="completed"
|
name="completed"
|
||||||
label={$_("completed-tours", { values: { n: 2 } })}
|
label={$_("completed-tours", { values: { n: 2 } })}
|
||||||
></Toggle>
|
></Toggle>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<Select
|
||||||
|
label={$_("privacy")}
|
||||||
|
items={privacySelectItems}
|
||||||
|
name="privacy"
|
||||||
|
></Select>
|
||||||
|
<p class="text-xs text-gray-500 max-w-lg">
|
||||||
|
{#if $d.privacy == "original"}
|
||||||
|
{$_("integration-privacy-hint-original")}
|
||||||
|
{:else}
|
||||||
|
{$_("integration-privacy-hint-user")}
|
||||||
|
{/if}
|
||||||
|
</p>
|
||||||
</form>
|
</form>
|
||||||
{/snippet}
|
{/snippet}
|
||||||
{#snippet footer()}
|
{#snippet footer()}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Datepicker from "$lib/components/base/datepicker.svelte";
|
import Datepicker from "$lib/components/base/datepicker.svelte";
|
||||||
import Modal from "$lib/components/base/modal.svelte";
|
import Modal from "$lib/components/base/modal.svelte";
|
||||||
|
import type { SelectItem } from "$lib/components/base/select.svelte";
|
||||||
|
import Select from "$lib/components/base/select.svelte";
|
||||||
import TextField from "$lib/components/base/text_field.svelte";
|
import TextField from "$lib/components/base/text_field.svelte";
|
||||||
import Toggle from "$lib/components/base/toggle.svelte";
|
import Toggle from "$lib/components/base/toggle.svelte";
|
||||||
import { StravaSchema } from "$lib/models/api/integration_schema";
|
import { StravaSchema } from "$lib/models/api/integration_schema";
|
||||||
@@ -21,6 +23,14 @@
|
|||||||
|
|
||||||
let modal: Modal;
|
let modal: Modal;
|
||||||
|
|
||||||
|
const privacySelectItems: SelectItem[] = [
|
||||||
|
{
|
||||||
|
text: $_("keep-original"),
|
||||||
|
value: "original",
|
||||||
|
},
|
||||||
|
{ text: $_("apply-user-settings"), value: "settings" },
|
||||||
|
];
|
||||||
|
|
||||||
export function openModal() {
|
export function openModal() {
|
||||||
errors.set({});
|
errors.set({});
|
||||||
modal.openModal();
|
modal.openModal();
|
||||||
@@ -38,6 +48,7 @@
|
|||||||
activities: integration?.strava?.activities ?? true,
|
activities: integration?.strava?.activities ?? true,
|
||||||
active: integration?.strava?.active ?? false,
|
active: integration?.strava?.active ?? false,
|
||||||
after: integration?.strava?.after,
|
after: integration?.strava?.after,
|
||||||
|
privacy: integration?.komoot?.privacy ?? "original",
|
||||||
},
|
},
|
||||||
extend: validator({
|
extend: validator({
|
||||||
schema: StravaSchema,
|
schema: StravaSchema,
|
||||||
@@ -85,12 +96,20 @@
|
|||||||
label={$_("activity", { values: { n: 2 } })}
|
label={$_("activity", { values: { n: 2 } })}
|
||||||
></Toggle>
|
></Toggle>
|
||||||
</div>
|
</div>
|
||||||
<p
|
|
||||||
class="text-xs text-gray-500 max-w-lg pt-4 pb-1 border-t border-input-border"
|
<Select
|
||||||
>
|
label={$_("privacy")}
|
||||||
{$_("strava-integration-after-date-hint")}
|
items={privacySelectItems}
|
||||||
|
name="privacy"
|
||||||
|
></Select>
|
||||||
|
<p class="text-xs text-gray-500 max-w-lg">
|
||||||
|
{#if $formData.privacy == "original"}
|
||||||
|
{$_("integration-privacy-hint-original")}
|
||||||
|
{:else}
|
||||||
|
{$_("integration-privacy-hint-user")}
|
||||||
|
{/if}
|
||||||
</p>
|
</p>
|
||||||
<div class="flex items-end relative gap-x-2">
|
<div class="flex items-end relative gap-x-2 pt-2 border-t border-input-border">
|
||||||
<Datepicker
|
<Datepicker
|
||||||
error={$errors.after}
|
error={$errors.after}
|
||||||
label={$_("after")}
|
label={$_("after")}
|
||||||
@@ -104,6 +123,11 @@
|
|||||||
><i class="fa fa-close"></i></button
|
><i class="fa fa-close"></i></button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
<p
|
||||||
|
class="text-xs text-gray-500 max-w-lg"
|
||||||
|
>
|
||||||
|
{$_("strava-integration-after-date-hint")}
|
||||||
|
</p>
|
||||||
</form>
|
</form>
|
||||||
{/snippet}
|
{/snippet}
|
||||||
{#snippet footer()}
|
{#snippet footer()}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Höhe",
|
"altitude": "Höhe",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "API Dokumentation",
|
"api-documentation": "API Dokumentation",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Sehenswürdigkeit",
|
"attraction": "Sehenswürdigkeit",
|
||||||
"author": "Autor",
|
"author": "Autor",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Synchronisiert Deine strava-Routen und -Aktivitäten regelmäßig mit wanderer.",
|
"integration-description-strava": "Synchronisiert Deine strava-Routen und -Aktivitäten regelmäßig mit wanderer.",
|
||||||
"integration-disabled": "Integration deaktiviert",
|
"integration-disabled": "Integration deaktiviert",
|
||||||
"integration-enabled": "Integration aktiviert",
|
"integration-enabled": "Integration aktiviert",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integrationen",
|
"integrations": "Integrationen",
|
||||||
"invalid-date": "Ungültiges Datum",
|
"invalid-date": "Ungültiges Datum",
|
||||||
"invalid-username": "Ungültiger Nutzername",
|
"invalid-username": "Ungültiger Nutzername",
|
||||||
"italian": "Italienisch",
|
"italian": "Italienisch",
|
||||||
"joined": "Beigetreten",
|
"joined": "Beigetreten",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Sprache",
|
"language": "Sprache",
|
||||||
"latitude": "Breitengrad",
|
"latitude": "Breitengrad",
|
||||||
"layer": "{n, plural, =1 {Ebene} other {Ebenen}}",
|
"layer": "{n, plural, =1 {Ebene} other {Ebenen}}",
|
||||||
@@ -344,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Route zuerst speichern",
|
"save-your-trail-first": "Route zuerst speichern",
|
||||||
"search-cities": "Städte suchen",
|
"search-cities": "Städte suchen",
|
||||||
"search-for-trails-places": "Suche nach Routen, Listen, Orten",
|
"search-for-trails-places": "Suche nach Routen, Listen, Orten",
|
||||||
|
"search-list": "Liste suchen",
|
||||||
"search-places": "Orte suchen",
|
"search-places": "Orte suchen",
|
||||||
"search-trails": "Route suchen",
|
"search-trails": "Route suchen",
|
||||||
"select-list": "Liste auswählen",
|
"select-list": "Liste auswählen",
|
||||||
@@ -403,10 +408,9 @@
|
|||||||
"top-speed": "Höchstgeschwindigkeit",
|
"top-speed": "Höchstgeschwindigkeit",
|
||||||
"tourism": "Tourismus",
|
"tourism": "Tourismus",
|
||||||
"trail": "{n, plural, =1 {Route} other {Routen}}",
|
"trail": "{n, plural, =1 {Route} other {Routen}}",
|
||||||
"trail-not-shared": "Mit niemandem geteilt",
|
|
||||||
"trail-not-in-list": "Trail gehört zu keiner Liste.",
|
"trail-not-in-list": "Trail gehört zu keiner Liste.",
|
||||||
|
"trail-not-shared": "Mit niemandem geteilt",
|
||||||
"trail-saved-successfully": "Route gespeichert",
|
"trail-saved-successfully": "Route gespeichert",
|
||||||
"search-list": "Liste suchen",
|
|
||||||
"trails-for-you": "Routen für dich",
|
"trails-for-you": "Routen für dich",
|
||||||
"tram-stop": "Tram Haltestelle",
|
"tram-stop": "Tram Haltestelle",
|
||||||
"unchanged": "unverändert",
|
"unchanged": "unverändert",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Altitude",
|
"altitude": "Altitude",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "API Documentation",
|
"api-documentation": "API Documentation",
|
||||||
|
"apply-user-settings": "Apply user settings",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Author",
|
"author": "Author",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
||||||
"integration-disabled": "integration disabled",
|
"integration-disabled": "integration disabled",
|
||||||
"integration-enabled": "integration enabled",
|
"integration-enabled": "integration enabled",
|
||||||
|
"integration-privacy-hint-original": "Imported trails will maintain the same visibility they have on the external platform. For example, if the original trail was public, it will be public in wanderer, even if trails are private by default according to your privacy settings.",
|
||||||
|
"integration-privacy-hint-user": "The original trail's visibility is discarded. Instead, the local privacy settings for trails are applied to all imported trails.",
|
||||||
"integrations": "Integrations",
|
"integrations": "Integrations",
|
||||||
"invalid-date": "Invalid Date",
|
"invalid-date": "Invalid Date",
|
||||||
"invalid-username": "Invalid username",
|
"invalid-username": "Invalid username",
|
||||||
"italian": "Italian",
|
"italian": "Italian",
|
||||||
"joined": "Joined",
|
"joined": "Joined",
|
||||||
|
"keep-original": "Keep original",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"latitude": "Latitude",
|
"latitude": "Latitude",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -344,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Save your trail first",
|
"save-your-trail-first": "Save your trail first",
|
||||||
"search-cities": "Search cities",
|
"search-cities": "Search cities",
|
||||||
"search-for-trails-places": "Search for trails, lists, places",
|
"search-for-trails-places": "Search for trails, lists, places",
|
||||||
|
"search-list": "Search list",
|
||||||
"search-places": "Search places",
|
"search-places": "Search places",
|
||||||
"search-trails": "Search trails",
|
"search-trails": "Search trails",
|
||||||
"select-list": "Select List",
|
"select-list": "Select List",
|
||||||
@@ -403,10 +408,9 @@
|
|||||||
"top-speed": "Top Speed",
|
"top-speed": "Top Speed",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Trail} other {Trails}}",
|
"trail": "{n, plural, =1 {Trail} other {Trails}}",
|
||||||
"trail-not-shared": "Not shared with anyone",
|
|
||||||
"trail-not-in-list": "Trail is not in any list",
|
"trail-not-in-list": "Trail is not in any list",
|
||||||
|
"trail-not-shared": "Not shared with anyone",
|
||||||
"trail-saved-successfully": "Trail saved successfully",
|
"trail-saved-successfully": "Trail saved successfully",
|
||||||
"search-list": "Search list",
|
|
||||||
"trails-for-you": "Trails for you",
|
"trails-for-you": "Trails for you",
|
||||||
"tram-stop": "Tram stop",
|
"tram-stop": "Tram stop",
|
||||||
"unchanged": "unchanged",
|
"unchanged": "unchanged",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Altitud",
|
"altitude": "Altitud",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "Documentación API",
|
"api-documentation": "Documentación API",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Autor",
|
"author": "Autor",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Sincroniza tus recorridos de Strava con Wanderer en intervalos regulares.",
|
"integration-description-strava": "Sincroniza tus recorridos de Strava con Wanderer en intervalos regulares.",
|
||||||
"integration-disabled": "integración deshabilitada",
|
"integration-disabled": "integración deshabilitada",
|
||||||
"integration-enabled": "integración habilitada",
|
"integration-enabled": "integración habilitada",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integraciones",
|
"integrations": "Integraciones",
|
||||||
"invalid-date": "Fecha no válida",
|
"invalid-date": "Fecha no válida",
|
||||||
"invalid-username": "Usuario no válido",
|
"invalid-username": "Usuario no válido",
|
||||||
"italian": "Italiano",
|
"italian": "Italiano",
|
||||||
"joined": "Afiliado",
|
"joined": "Afiliado",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Idioma",
|
"language": "Idioma",
|
||||||
"latitude": "Latitud",
|
"latitude": "Latitud",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Likes",
|
"likes": "Likes",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "¡Enlace copiado!",
|
"link-copied": "¡Enlace copiado!",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, one {}=1 {Lista} other {Listas}}",
|
"list": "{n, plural, one {}=1 {Lista} other {Listas}}",
|
||||||
"list-not-shared": "No compartido con ninguno",
|
"list-not-shared": "No compartido con ninguno",
|
||||||
"list-public-warning": "Todas las rutas en esta lista serán públicas.",
|
"list-public-warning": "Todas las rutas en esta lista serán públicas.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Guarda tu ruta primero",
|
"save-your-trail-first": "Guarda tu ruta primero",
|
||||||
"search-cities": "Buscar ciudades",
|
"search-cities": "Buscar ciudades",
|
||||||
"search-for-trails-places": "Busca rutas, lugares",
|
"search-for-trails-places": "Busca rutas, lugares",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Buscar lugares",
|
"search-places": "Buscar lugares",
|
||||||
"search-trails": "Buscar ruta",
|
"search-trails": "Buscar ruta",
|
||||||
"select-list": "Seleccionar Lista",
|
"select-list": "Seleccionar Lista",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Top Speed",
|
"top-speed": "Top Speed",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, one {}=1 {Ruta} other {Rutas}}",
|
"trail": "{n, plural, one {}=1 {Ruta} other {Rutas}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "No compartida con nadie",
|
"trail-not-shared": "No compartida con nadie",
|
||||||
"trail-saved-successfully": "Ruta guardada con éxito",
|
"trail-saved-successfully": "Ruta guardada con éxito",
|
||||||
"trails-for-you": "Rutas para ti",
|
"trails-for-you": "Rutas para ti",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Altuera",
|
"altitude": "Altuera",
|
||||||
"amenity": "Altimetria",
|
"amenity": "Altimetria",
|
||||||
"api-documentation": "API dokumentazioa",
|
"api-documentation": "API dokumentazioa",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Erakarmena",
|
"attraction": "Erakarmena",
|
||||||
"author": "Egilea",
|
"author": "Egilea",
|
||||||
"avatar": "Iruditxoa",
|
"avatar": "Iruditxoa",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Zure stravako ibilbideak wandererekin sinkronizatzen ditu aldian behin.",
|
"integration-description-strava": "Zure stravako ibilbideak wandererekin sinkronizatzen ditu aldian behin.",
|
||||||
"integration-disabled": "integrazioa desaktibatuta",
|
"integration-disabled": "integrazioa desaktibatuta",
|
||||||
"integration-enabled": "integrazioa aktibatuta",
|
"integration-enabled": "integrazioa aktibatuta",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integrazioak",
|
"integrations": "Integrazioak",
|
||||||
"invalid-date": "Data ez da zuzena",
|
"invalid-date": "Data ez da zuzena",
|
||||||
"invalid-username": "Erabiltzailea ez da zuzena",
|
"invalid-username": "Erabiltzailea ez da zuzena",
|
||||||
"italian": "Italiera",
|
"italian": "Italiera",
|
||||||
"joined": "Sartu da",
|
"joined": "Sartu da",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Hizkuntza",
|
"language": "Hizkuntza",
|
||||||
"latitude": "Latitudea",
|
"latitude": "Latitudea",
|
||||||
"layer": "{n, plural, one {}=1 {geruza} other {geruza}}",
|
"layer": "{n, plural, one {}=1 {geruza} other {geruza}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Atsegiteak",
|
"likes": "Atsegiteak",
|
||||||
"limited": "Mugatuta",
|
"limited": "Mugatuta",
|
||||||
"link-copied": "Esteka kopiatu da!",
|
"link-copied": "Esteka kopiatu da!",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, one {}=1 {zerrenda} other {zerrenda}}",
|
"list": "{n, plural, one {}=1 {zerrenda} other {zerrenda}}",
|
||||||
"list-not-shared": "Inorekin partekatu gabe",
|
"list-not-shared": "Inorekin partekatu gabe",
|
||||||
"list-public-warning": "Zerreda honetako ibilbide guztiak publiko bihurtuko dira.",
|
"list-public-warning": "Zerreda honetako ibilbide guztiak publiko bihurtuko dira.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Gorde zure ibilaldia lehenengo",
|
"save-your-trail-first": "Gorde zure ibilaldia lehenengo",
|
||||||
"search-cities": "Bilatu herriak",
|
"search-cities": "Bilatu herriak",
|
||||||
"search-for-trails-places": "Bilatu ibilbideak, zerrendak, tokiak",
|
"search-for-trails-places": "Bilatu ibilbideak, zerrendak, tokiak",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Bilatu tokiak",
|
"search-places": "Bilatu tokiak",
|
||||||
"search-trails": "Bilatu ibilaldiak",
|
"search-trails": "Bilatu ibilaldiak",
|
||||||
"select-list": "Aukeratu zerrenda",
|
"select-list": "Aukeratu zerrenda",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Gehienezko abiadura",
|
"top-speed": "Gehienezko abiadura",
|
||||||
"tourism": "Turismoa",
|
"tourism": "Turismoa",
|
||||||
"trail": "{n, plural, one {}=1 {ibilbide} other {ibilbide}}",
|
"trail": "{n, plural, one {}=1 {ibilbide} other {ibilbide}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Inorekin partekatu gabe",
|
"trail-not-shared": "Inorekin partekatu gabe",
|
||||||
"trail-saved-successfully": "Ibilbidea ondo gorde da",
|
"trail-saved-successfully": "Ibilbidea ondo gorde da",
|
||||||
"trails-for-you": "Zuretzako ibilbideak",
|
"trails-for-you": "Zuretzako ibilbideak",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Altitude",
|
"altitude": "Altitude",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "Documentation API",
|
"api-documentation": "Documentation API",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Auteur",
|
"author": "Auteur",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Synchronisez vos itinéraires et vos activités Strava avec wanderer à intervalles réguliers.",
|
"integration-description-strava": "Synchronisez vos itinéraires et vos activités Strava avec wanderer à intervalles réguliers.",
|
||||||
"integration-disabled": "Intégration désactivée",
|
"integration-disabled": "Intégration désactivée",
|
||||||
"integration-enabled": "Intégration activée",
|
"integration-enabled": "Intégration activée",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Intégrations",
|
"integrations": "Intégrations",
|
||||||
"invalid-date": "Date invalide",
|
"invalid-date": "Date invalide",
|
||||||
"invalid-username": "Nom d'utilisateur invalide",
|
"invalid-username": "Nom d'utilisateur invalide",
|
||||||
"italian": "Italien",
|
"italian": "Italien",
|
||||||
"joined": "Rejoint",
|
"joined": "Rejoint",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Langue",
|
"language": "Langue",
|
||||||
"latitude": "Latitude",
|
"latitude": "Latitude",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "\"J'aime\"",
|
"likes": "\"J'aime\"",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Lien copié !",
|
"link-copied": "Lien copié !",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Liste} other {Listes}}",
|
"list": "{n, plural, =1 {Liste} other {Listes}}",
|
||||||
"list-not-shared": "Non partagé avec quiconque",
|
"list-not-shared": "Non partagé avec quiconque",
|
||||||
"list-public-warning": "Tous les itinéraires de cette liste seront publics.",
|
"list-public-warning": "Tous les itinéraires de cette liste seront publics.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Enregistrez d'abord votre itinéraire",
|
"save-your-trail-first": "Enregistrez d'abord votre itinéraire",
|
||||||
"search-cities": "Recherche une ville",
|
"search-cities": "Recherche une ville",
|
||||||
"search-for-trails-places": "Chercher un itinéraire ou un lieu",
|
"search-for-trails-places": "Chercher un itinéraire ou un lieu",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Chercher des lieux",
|
"search-places": "Chercher des lieux",
|
||||||
"search-trails": "Chercher un itinéraire",
|
"search-trails": "Chercher un itinéraire",
|
||||||
"select-list": "Liste de choix",
|
"select-list": "Liste de choix",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Vitesse maximale",
|
"top-speed": "Vitesse maximale",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Itinéraire} other {Itinéraires}}",
|
"trail": "{n, plural, =1 {Itinéraire} other {Itinéraires}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "L'itinéraire n'a pas été partagé",
|
"trail-not-shared": "L'itinéraire n'a pas été partagé",
|
||||||
"trail-saved-successfully": "Itinéraire enregistrée",
|
"trail-saved-successfully": "Itinéraire enregistrée",
|
||||||
"trails-for-you": "Itinéraire pour vous",
|
"trails-for-you": "Itinéraire pour vous",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Magasság",
|
"altitude": "Magasság",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "API Dokumentáció",
|
"api-documentation": "API Dokumentáció",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Author",
|
"author": "Author",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
||||||
"integration-disabled": "integration disabled",
|
"integration-disabled": "integration disabled",
|
||||||
"integration-enabled": "integration enabled",
|
"integration-enabled": "integration enabled",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integrations",
|
"integrations": "Integrations",
|
||||||
"invalid-date": "Érvénytelen dátum",
|
"invalid-date": "Érvénytelen dátum",
|
||||||
"invalid-username": "Érvénytelen felhasználó",
|
"invalid-username": "Érvénytelen felhasználó",
|
||||||
"italian": "Olasz",
|
"italian": "Olasz",
|
||||||
"joined": "Joined",
|
"joined": "Joined",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Nyelf",
|
"language": "Nyelf",
|
||||||
"latitude": "Szélesség",
|
"latitude": "Szélesség",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Likes",
|
"likes": "Likes",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Link copied!",
|
"link-copied": "Link copied!",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Lista} other {Listák}}",
|
"list": "{n, plural, =1 {Lista} other {Listák}}",
|
||||||
"list-not-shared": "Not shared with anyone",
|
"list-not-shared": "Not shared with anyone",
|
||||||
"list-public-warning": "All trails in this list will become public.",
|
"list-public-warning": "All trails in this list will become public.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Először mentsd el a nyomvonaladat",
|
"save-your-trail-first": "Először mentsd el a nyomvonaladat",
|
||||||
"search-cities": "Városok keresése",
|
"search-cities": "Városok keresése",
|
||||||
"search-for-trails-places": "Nyomvonalak, helyek keresése",
|
"search-for-trails-places": "Nyomvonalak, helyek keresése",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Search places",
|
"search-places": "Search places",
|
||||||
"search-trails": "Nyomvonalak keresése",
|
"search-trails": "Nyomvonalak keresése",
|
||||||
"select-list": "Lista kiválasztása",
|
"select-list": "Lista kiválasztása",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Top Speed",
|
"top-speed": "Top Speed",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Útvonal} other {Útvonalak}}",
|
"trail": "{n, plural, =1 {Útvonal} other {Útvonalak}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Not shared with anyone",
|
"trail-not-shared": "Not shared with anyone",
|
||||||
"trail-saved-successfully": "Trail saved successfully",
|
"trail-saved-successfully": "Trail saved successfully",
|
||||||
"trails-for-you": "Útvonalak önnek",
|
"trails-for-you": "Útvonalak önnek",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Altitudine",
|
"altitude": "Altitudine",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "Documentazione API",
|
"api-documentation": "Documentazione API",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Autore",
|
"author": "Autore",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
||||||
"integration-disabled": "integration disabled",
|
"integration-disabled": "integration disabled",
|
||||||
"integration-enabled": "integration enabled",
|
"integration-enabled": "integration enabled",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integrations",
|
"integrations": "Integrations",
|
||||||
"invalid-date": "Data non valida",
|
"invalid-date": "Data non valida",
|
||||||
"invalid-username": "Nome utente non valido",
|
"invalid-username": "Nome utente non valido",
|
||||||
"italian": "Italiano",
|
"italian": "Italiano",
|
||||||
"joined": "Aggiunto",
|
"joined": "Aggiunto",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Lingua",
|
"language": "Lingua",
|
||||||
"latitude": "Latitudine",
|
"latitude": "Latitudine",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Likes",
|
"likes": "Likes",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Link copiato",
|
"link-copied": "Link copiato",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Lista} other {Liste}}",
|
"list": "{n, plural, =1 {Lista} other {Liste}}",
|
||||||
"list-not-shared": "Non condivisa",
|
"list-not-shared": "Non condivisa",
|
||||||
"list-public-warning": "Tutti i percorsi in questa lista diventeranno pubblici.",
|
"list-public-warning": "Tutti i percorsi in questa lista diventeranno pubblici.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Salva prima il tuo percorso",
|
"save-your-trail-first": "Salva prima il tuo percorso",
|
||||||
"search-cities": "Cerca città",
|
"search-cities": "Cerca città",
|
||||||
"search-for-trails-places": "Cerca percorsi, luoghi",
|
"search-for-trails-places": "Cerca percorsi, luoghi",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Search places",
|
"search-places": "Search places",
|
||||||
"search-trails": "Cerca percorsi",
|
"search-trails": "Cerca percorsi",
|
||||||
"select-list": "Seleziona lista",
|
"select-list": "Seleziona lista",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Top Speed",
|
"top-speed": "Top Speed",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Percorso} other {Percorsi}}",
|
"trail": "{n, plural, =1 {Percorso} other {Percorsi}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Percorso non condiviso con nessuno",
|
"trail-not-shared": "Percorso non condiviso con nessuno",
|
||||||
"trail-saved-successfully": "Percorso salvato con successo",
|
"trail-saved-successfully": "Percorso salvato con successo",
|
||||||
"trails-for-you": "Percorsi per te",
|
"trails-for-you": "Percorsi per te",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Hoogte",
|
"altitude": "Hoogte",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "API-documentatie",
|
"api-documentation": "API-documentatie",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Auteur",
|
"author": "Auteur",
|
||||||
"avatar": "Profielfoto",
|
"avatar": "Profielfoto",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Synchroniseert je Strava-routes en -activiteiten met Wanderer op regelmatige tijdstippen.",
|
"integration-description-strava": "Synchroniseert je Strava-routes en -activiteiten met Wanderer op regelmatige tijdstippen.",
|
||||||
"integration-disabled": "Integratie uitgeschakeld",
|
"integration-disabled": "Integratie uitgeschakeld",
|
||||||
"integration-enabled": "Integratie ingeschakeld",
|
"integration-enabled": "Integratie ingeschakeld",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integraties",
|
"integrations": "Integraties",
|
||||||
"invalid-date": "Ongeldige datum",
|
"invalid-date": "Ongeldige datum",
|
||||||
"invalid-username": "Ongeldige gebruikersnaam",
|
"invalid-username": "Ongeldige gebruikersnaam",
|
||||||
"italian": "Italiaans",
|
"italian": "Italiaans",
|
||||||
"joined": "Aangesloten",
|
"joined": "Aangesloten",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Taal",
|
"language": "Taal",
|
||||||
"latitude": "Breedtegraad",
|
"latitude": "Breedtegraad",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Vind-ik-leuks",
|
"likes": "Vind-ik-leuks",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Link gekopieerd",
|
"link-copied": "Link gekopieerd",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Lijst} other {Lijsten}}",
|
"list": "{n, plural, =1 {Lijst} other {Lijsten}}",
|
||||||
"list-not-shared": "Niet gedeeld met iemand",
|
"list-not-shared": "Niet gedeeld met iemand",
|
||||||
"list-public-warning": "Alle routes in deze lijst worden publiek",
|
"list-public-warning": "Alle routes in deze lijst worden publiek",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Bewaar je route eerst",
|
"save-your-trail-first": "Bewaar je route eerst",
|
||||||
"search-cities": "Zoeken naar steden",
|
"search-cities": "Zoeken naar steden",
|
||||||
"search-for-trails-places": "Zoek naar routes, lijsten en locaties",
|
"search-for-trails-places": "Zoek naar routes, lijsten en locaties",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Zoek plaatsen",
|
"search-places": "Zoek plaatsen",
|
||||||
"search-trails": "Zoek routes",
|
"search-trails": "Zoek routes",
|
||||||
"select-list": "Kies een lijst",
|
"select-list": "Kies een lijst",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Topsnelheid",
|
"top-speed": "Topsnelheid",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Route} other {Routes}}",
|
"trail": "{n, plural, =1 {Route} other {Routes}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Niet gedeeld met iemand",
|
"trail-not-shared": "Niet gedeeld met iemand",
|
||||||
"trail-saved-successfully": "Route succesvol bewaard",
|
"trail-saved-successfully": "Route succesvol bewaard",
|
||||||
"trails-for-you": "Routes voor jou",
|
"trails-for-you": "Routes voor jou",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Wysokość",
|
"altitude": "Wysokość",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "Dokumentacja API",
|
"api-documentation": "Dokumentacja API",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Autor",
|
"author": "Autor",
|
||||||
"avatar": "Awatar",
|
"avatar": "Awatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Synchronizuje trasy i aktywność z wanderer w równych odstępach.",
|
"integration-description-strava": "Synchronizuje trasy i aktywność z wanderer w równych odstępach.",
|
||||||
"integration-disabled": "integracja wyłączona",
|
"integration-disabled": "integracja wyłączona",
|
||||||
"integration-enabled": "integracja włączona",
|
"integration-enabled": "integracja włączona",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integracje",
|
"integrations": "Integracje",
|
||||||
"invalid-date": "Nieprawidłowa data",
|
"invalid-date": "Nieprawidłowa data",
|
||||||
"invalid-username": "Błędna nazwa użytkownika",
|
"invalid-username": "Błędna nazwa użytkownika",
|
||||||
"italian": "Włoski",
|
"italian": "Włoski",
|
||||||
"joined": "Dołączono",
|
"joined": "Dołączono",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Język",
|
"language": "Język",
|
||||||
"latitude": "Szerokość",
|
"latitude": "Szerokość",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Polubienia",
|
"likes": "Polubienia",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Link skopiowany!",
|
"link-copied": "Link skopiowany!",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Lista} other {Listy}}",
|
"list": "{n, plural, =1 {Lista} other {Listy}}",
|
||||||
"list-not-shared": "Nikomu nie udostępniony",
|
"list-not-shared": "Nikomu nie udostępniony",
|
||||||
"list-public-warning": "Wszystkie szlaki na tej liście staną się publiczne.",
|
"list-public-warning": "Wszystkie szlaki na tej liście staną się publiczne.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Najpierw zapisz swój szlak",
|
"save-your-trail-first": "Najpierw zapisz swój szlak",
|
||||||
"search-cities": "Szukaj miasta",
|
"search-cities": "Szukaj miasta",
|
||||||
"search-for-trails-places": "Szukaj szlaków lub miejsc",
|
"search-for-trails-places": "Szukaj szlaków lub miejsc",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Szukaj miejsc",
|
"search-places": "Szukaj miejsc",
|
||||||
"search-trails": "Szukaj szlaków",
|
"search-trails": "Szukaj szlaków",
|
||||||
"select-list": "Wybierz Listę",
|
"select-list": "Wybierz Listę",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Maksymalna prędkość",
|
"top-speed": "Maksymalna prędkość",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, one {Szlak} few {Szlaki} many {Szlaków}=1 {Szlak} other {Szlaki}}",
|
"trail": "{n, plural, one {Szlak} few {Szlaki} many {Szlaków}=1 {Szlak} other {Szlaki}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Szlak nie udostępniony",
|
"trail-not-shared": "Szlak nie udostępniony",
|
||||||
"trail-saved-successfully": "Szlak pomyślnie zapisany",
|
"trail-saved-successfully": "Szlak pomyślnie zapisany",
|
||||||
"trails-for-you": "Szlaki dla ciebie",
|
"trails-for-you": "Szlaki dla ciebie",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Altitude",
|
"altitude": "Altitude",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "Documentação da API",
|
"api-documentation": "Documentação da API",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Author",
|
"author": "Author",
|
||||||
"avatar": "Avatar",
|
"avatar": "Avatar",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
"integration-description-strava": "Syncs your strava routes & activities with wanderer in regular intervals.",
|
||||||
"integration-disabled": "integration disabled",
|
"integration-disabled": "integration disabled",
|
||||||
"integration-enabled": "integration enabled",
|
"integration-enabled": "integration enabled",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Integrations",
|
"integrations": "Integrations",
|
||||||
"invalid-date": "Data inválida",
|
"invalid-date": "Data inválida",
|
||||||
"invalid-username": "Nome de usuário inválido",
|
"invalid-username": "Nome de usuário inválido",
|
||||||
"italian": "Italiano",
|
"italian": "Italiano",
|
||||||
"joined": "Joined",
|
"joined": "Joined",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Língua",
|
"language": "Língua",
|
||||||
"latitude": "Latitude",
|
"latitude": "Latitude",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Likes",
|
"likes": "Likes",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Link copiado!",
|
"link-copied": "Link copiado!",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Lista} other {Listas}}",
|
"list": "{n, plural, =1 {Lista} other {Listas}}",
|
||||||
"list-not-shared": "Não partilhado com ninguém",
|
"list-not-shared": "Não partilhado com ninguém",
|
||||||
"list-public-warning": "All trails in this list will become public.",
|
"list-public-warning": "All trails in this list will become public.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Salve sua trilha primeiro",
|
"save-your-trail-first": "Salve sua trilha primeiro",
|
||||||
"search-cities": "Procurar cidades",
|
"search-cities": "Procurar cidades",
|
||||||
"search-for-trails-places": "Procurar trilhos, locais",
|
"search-for-trails-places": "Procurar trilhos, locais",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Search places",
|
"search-places": "Search places",
|
||||||
"search-trails": "Procurar trilhos",
|
"search-trails": "Procurar trilhos",
|
||||||
"select-list": "Selecionar lista",
|
"select-list": "Selecionar lista",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Top Speed",
|
"top-speed": "Top Speed",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Percurso} other {Percursos}}",
|
"trail": "{n, plural, =1 {Percurso} other {Percursos}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Não partilhado com ninguém",
|
"trail-not-shared": "Não partilhado com ninguém",
|
||||||
"trail-saved-successfully": "Percurso gravado com sucesso",
|
"trail-saved-successfully": "Percurso gravado com sucesso",
|
||||||
"trails-for-you": "Trilhos para si",
|
"trails-for-you": "Trilhos para si",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "Высота",
|
"altitude": "Высота",
|
||||||
"amenity": "Amenity",
|
"amenity": "Amenity",
|
||||||
"api-documentation": "Документация API",
|
"api-documentation": "Документация API",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "Attraction",
|
"attraction": "Attraction",
|
||||||
"author": "Автор",
|
"author": "Автор",
|
||||||
"avatar": "Аватар",
|
"avatar": "Аватар",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "Синхронизирует ваши данные со Strava.",
|
"integration-description-strava": "Синхронизирует ваши данные со Strava.",
|
||||||
"integration-disabled": "интеграция отключена",
|
"integration-disabled": "интеграция отключена",
|
||||||
"integration-enabled": "интеграция включена",
|
"integration-enabled": "интеграция включена",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "Интеграции",
|
"integrations": "Интеграции",
|
||||||
"invalid-date": "Неверная дата",
|
"invalid-date": "Неверная дата",
|
||||||
"invalid-username": "Некорректное имя пользователя",
|
"invalid-username": "Некорректное имя пользователя",
|
||||||
"italian": "Итальянский",
|
"italian": "Итальянский",
|
||||||
"joined": "Зарегистрирован",
|
"joined": "Зарегистрирован",
|
||||||
|
"keep-original": "",
|
||||||
"language": "Язык",
|
"language": "Язык",
|
||||||
"latitude": "Широта",
|
"latitude": "Широта",
|
||||||
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
"layer": "{n, plural, =1 {Layer} other {Layers}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "Лайков",
|
"likes": "Лайков",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "Ссылка скопирована!",
|
"link-copied": "Ссылка скопирована!",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {Список} other {Списки}}",
|
"list": "{n, plural, =1 {Список} other {Списки}}",
|
||||||
"list-not-shared": "Нет общего доступа",
|
"list-not-shared": "Нет общего доступа",
|
||||||
"list-public-warning": "Все треки в списке станут публичными.",
|
"list-public-warning": "Все треки в списке станут публичными.",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "Сначала сохраните трек",
|
"save-your-trail-first": "Сначала сохраните трек",
|
||||||
"search-cities": "Поиск по городам",
|
"search-cities": "Поиск по городам",
|
||||||
"search-for-trails-places": "Поиск треков, списков, мест",
|
"search-for-trails-places": "Поиск треков, списков, мест",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "Поиск мест",
|
"search-places": "Поиск мест",
|
||||||
"search-trails": "Поиск треков",
|
"search-trails": "Поиск треков",
|
||||||
"select-list": "Выбрать список",
|
"select-list": "Выбрать список",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "Макс. скорость",
|
"top-speed": "Макс. скорость",
|
||||||
"tourism": "Tourism",
|
"tourism": "Tourism",
|
||||||
"trail": "{n, plural, =1 {Трек} other {Треки}}",
|
"trail": "{n, plural, =1 {Трек} other {Треки}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "Нет общего доступа",
|
"trail-not-shared": "Нет общего доступа",
|
||||||
"trail-saved-successfully": "Трек сохранён",
|
"trail-saved-successfully": "Трек сохранён",
|
||||||
"trails-for-you": "Треки для вас",
|
"trails-for-you": "Треки для вас",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"altitude": "海拔",
|
"altitude": "海拔",
|
||||||
"amenity": "友好性",
|
"amenity": "友好性",
|
||||||
"api-documentation": "API 文档",
|
"api-documentation": "API 文档",
|
||||||
|
"apply-user-settings": "",
|
||||||
"attraction": "景点",
|
"attraction": "景点",
|
||||||
"author": "作者",
|
"author": "作者",
|
||||||
"avatar": "头像",
|
"avatar": "头像",
|
||||||
@@ -206,11 +207,14 @@
|
|||||||
"integration-description-strava": "定期与strava同步您的wanderer路线和活动。",
|
"integration-description-strava": "定期与strava同步您的wanderer路线和活动。",
|
||||||
"integration-disabled": "整合已停用",
|
"integration-disabled": "整合已停用",
|
||||||
"integration-enabled": "整合已启用",
|
"integration-enabled": "整合已启用",
|
||||||
|
"integration-privacy-hint-original": "",
|
||||||
|
"integration-privacy-hint-user": "",
|
||||||
"integrations": "整合",
|
"integrations": "整合",
|
||||||
"invalid-date": "无效日期",
|
"invalid-date": "无效日期",
|
||||||
"invalid-username": "无效用户名",
|
"invalid-username": "无效用户名",
|
||||||
"italian": "意大利语",
|
"italian": "意大利语",
|
||||||
"joined": "已加入",
|
"joined": "已加入",
|
||||||
|
"keep-original": "",
|
||||||
"language": "语言",
|
"language": "语言",
|
||||||
"latitude": "纬度",
|
"latitude": "纬度",
|
||||||
"layer": "{n, plural, =1 {层} other {层}}",
|
"layer": "{n, plural, =1 {层} other {层}}",
|
||||||
@@ -220,6 +224,7 @@
|
|||||||
"likes": "赞",
|
"likes": "赞",
|
||||||
"limited": "Limited",
|
"limited": "Limited",
|
||||||
"link-copied": "链接已复制",
|
"link-copied": "链接已复制",
|
||||||
|
"linked-lists": "",
|
||||||
"list": "{n, plural, =1 {列表} other {列表}}",
|
"list": "{n, plural, =1 {列表} other {列表}}",
|
||||||
"list-not-shared": "未与任何人分享",
|
"list-not-shared": "未与任何人分享",
|
||||||
"list-public-warning": "此列表中的所有轨迹都将被公开。",
|
"list-public-warning": "此列表中的所有轨迹都将被公开。",
|
||||||
@@ -343,6 +348,7 @@
|
|||||||
"save-your-trail-first": "先保存你的路线",
|
"save-your-trail-first": "先保存你的路线",
|
||||||
"search-cities": "搜索城市",
|
"search-cities": "搜索城市",
|
||||||
"search-for-trails-places": "搜索路线、地点",
|
"search-for-trails-places": "搜索路线、地点",
|
||||||
|
"search-list": "",
|
||||||
"search-places": "搜索地点",
|
"search-places": "搜索地点",
|
||||||
"search-trails": "搜索路线",
|
"search-trails": "搜索路线",
|
||||||
"select-list": "选择列表",
|
"select-list": "选择列表",
|
||||||
@@ -402,6 +408,7 @@
|
|||||||
"top-speed": "最高速度",
|
"top-speed": "最高速度",
|
||||||
"tourism": "旅游",
|
"tourism": "旅游",
|
||||||
"trail": "{n, plural, =1 {路线} other {路线}}",
|
"trail": "{n, plural, =1 {路线} other {路线}}",
|
||||||
|
"trail-not-in-list": "",
|
||||||
"trail-not-shared": "未与任何人分享",
|
"trail-not-shared": "未与任何人分享",
|
||||||
"trail-saved-successfully": "路线保存成功",
|
"trail-saved-successfully": "路线保存成功",
|
||||||
"trails-for-you": "推荐路线",
|
"trails-for-you": "推荐路线",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ const StravaSchema = z.object({
|
|||||||
activities: z.boolean(),
|
activities: z.boolean(),
|
||||||
active: z.boolean(),
|
active: z.boolean(),
|
||||||
after: z.string().date().optional(),
|
after: z.string().date().optional(),
|
||||||
|
privacy: z.enum(["original", "settings"])
|
||||||
})
|
})
|
||||||
|
|
||||||
const KomootSchema = z.object({
|
const KomootSchema = z.object({
|
||||||
@@ -16,6 +17,7 @@ const KomootSchema = z.object({
|
|||||||
completed: z.boolean(),
|
completed: z.boolean(),
|
||||||
planned: z.boolean(),
|
planned: z.boolean(),
|
||||||
active: z.boolean(),
|
active: z.boolean(),
|
||||||
|
privacy: z.enum(["original", "settings"])
|
||||||
})
|
})
|
||||||
|
|
||||||
const IntegrationCreateSchema = z.object({
|
const IntegrationCreateSchema = z.object({
|
||||||
@@ -30,4 +32,4 @@ const IntegrationUpdateSchema = z.object({
|
|||||||
komoot: KomootSchema.optional().nullable()
|
komoot: KomootSchema.optional().nullable()
|
||||||
}) satisfies ZodType<Partial<Integration>>
|
}) satisfies ZodType<Partial<Integration>>
|
||||||
|
|
||||||
export { StravaSchema, IntegrationCreateSchema, IntegrationUpdateSchema, KomootSchema };
|
export { StravaSchema, IntegrationCreateSchema, IntegrationUpdateSchema, KomootSchema };
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export interface StravaIntegration extends BaseIntegration {
|
|||||||
refreshToken?: string;
|
refreshToken?: string;
|
||||||
expiresAt?: number;
|
expiresAt?: number;
|
||||||
after?: string
|
after?: string
|
||||||
|
privacy: "original" | "settings"
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface KomootIntegration extends BaseIntegration {
|
export interface KomootIntegration extends BaseIntegration {
|
||||||
@@ -19,6 +20,7 @@ export interface KomootIntegration extends BaseIntegration {
|
|||||||
password: string,
|
password: string,
|
||||||
completed: boolean,
|
completed: boolean,
|
||||||
planned: boolean
|
planned: boolean
|
||||||
|
privacy: "original" | "settings"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ const publicRoutes = [
|
|||||||
"/api/v1/category",
|
"/api/v1/category",
|
||||||
"/api/v1/auth/oauth",
|
"/api/v1/auth/oauth",
|
||||||
"/register",
|
"/register",
|
||||||
"/auth"
|
"/auth",
|
||||||
|
"/.well-known"
|
||||||
]
|
]
|
||||||
|
|
||||||
export function isRouteProtected(url: URL | undefined) {
|
export function isRouteProtected(url: URL | undefined) {
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ export async function PUT(event: RequestEvent) {
|
|||||||
trail.location ??= location;
|
trail.location ??= location;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trail.public = event.locals.settings.privacy.trails == "public"
|
||||||
|
|
||||||
// const log = new SummitLog(trail.date as string, {
|
// const log = new SummitLog(trail.date as string, {
|
||||||
// distance: trail.distance,
|
// distance: trail.distance,
|
||||||
// elevation_gain: trail.elevation_gain,
|
// elevation_gain: trail.elevation_gain,
|
||||||
|
|||||||
Reference in New Issue
Block a user