mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-13 07:40:59 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dc36c21c08 | |||
| 175413b3c1 | |||
| 030918cfa9 | |||
| 75d65ccb1b | |||
| def8b8a24d |
@@ -38,6 +38,10 @@ on:
|
||||
description: "Type MAJOR (all caps) to confirm a major release"
|
||||
type: string
|
||||
default: ''
|
||||
ci_from:
|
||||
description: 'Take ci-ok from this earlier commit instead of the one on main, when main differs from it only under .github/ (a fix to a release workflow needs no second test run)'
|
||||
type: string
|
||||
default: ''
|
||||
allow_stale_dialect:
|
||||
description: 'Ship without a dialect of its own even if the one on main is the original one or has under 90 days left'
|
||||
type: boolean
|
||||
@@ -87,6 +91,7 @@ jobs:
|
||||
# finished last to be green, so a later green run supersedes a flaky or
|
||||
# cancelled one. It prints the link of every run it counted.
|
||||
- name: Require a green ci-ok on the commit being released
|
||||
if: inputs.ci_from == ''
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
@@ -96,6 +101,36 @@ jobs:
|
||||
gh api "repos/$GITHUB_REPOSITORY/commits/$sha/check-runs?check_name=ci-ok&filter=all&per_page=100" > "$runs"
|
||||
node scripts/ci/ci-ok-verdict.mjs "$runs" "$sha"
|
||||
|
||||
# ci_from: main carries only workflow changes on top of a commit that
|
||||
# already passed. That commit must be an ancestor of main, everything
|
||||
# outside .github/ must be identical, and one of its ci-ok runs must be
|
||||
# green (its dev push, typically).
|
||||
- name: Require a green ci-ok on the commit main's code comes from
|
||||
if: inputs.ci_from != ''
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
CI_FROM: ${{ inputs.ci_from }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
from="$(git rev-parse --verify "$CI_FROM^{commit}")"
|
||||
if ! git merge-base --is-ancestor "$from" HEAD; then
|
||||
echo "::error::$from is not an ancestor of main."
|
||||
exit 1
|
||||
fi
|
||||
outside="$(git diff --name-only "$from" HEAD -- . ':(exclude).github/**')"
|
||||
if [ -n "$outside" ]; then
|
||||
echo "::error::main differs from $from outside .github/:"
|
||||
echo "$outside"
|
||||
exit 1
|
||||
fi
|
||||
green="$(gh api "repos/$GITHUB_REPOSITORY/commits/$from/check-runs?check_name=ci-ok&filter=all&per_page=100" \
|
||||
--jq '[.check_runs[] | select(.status == "completed" and .conclusion == "success")] | length')"
|
||||
if [ "$green" -lt 1 ]; then
|
||||
echo "::error::$from has no green ci-ok."
|
||||
exit 1
|
||||
fi
|
||||
echo "main differs from $from only under .github/, and $from has $green green ci-ok run(s)."
|
||||
|
||||
- name: Determine bump type and version
|
||||
id: bump
|
||||
env:
|
||||
|
||||
@@ -120,7 +120,9 @@ jobs:
|
||||
run: |
|
||||
set -uo pipefail
|
||||
cp "$FILE" src/nest/service-identity/registration-dialect.ts
|
||||
printf '%s\n' '{"extends": "./tsconfig.strict.json", "include": [],' \
|
||||
# TypeScript 6 includes no @types by default and the dialect imports nothing
|
||||
# from node, so checked on its own it would not know Buffer: name node here.
|
||||
printf '%s\n' '{"extends": "./tsconfig.strict.json", "compilerOptions": {"types": ["node"]}, "include": [],' \
|
||||
'"files": ["src/nest/service-identity/registration-dialect.ts"]}' > tsconfig.dialect-check.json
|
||||
if ! npx tsc -p tsconfig.dialect-check.json --noEmit --pretty false; then
|
||||
echo "::warning::The issuer's registration dialect for $VERSION does not type-check under the strict config."
|
||||
|
||||
@@ -36,7 +36,7 @@ TREK has grown from a travel planner into a whole ecosystem for trips: plan toge
|
||||
|
||||
<a href="https://github.com/liketrek/TREK"><img alt="Stars" src="https://img.shields.io/github/stars/liketrek/trek?style=for-the-badge&label=Stars&color=6B7280" /></a>
|
||||
|
||||
<sub>PUBLIC SERVICES PROUDLY SPONSORED BY</sub><br /><a href="https://cloud.dataforest.net/en?mtm_campaign=trek"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/sponsors/dataforest-light.svg" /><source media="(prefers-color-scheme: light)" srcset="docs/sponsors/dataforest-dark.svg" /><img src="docs/sponsors/dataforest-dark.svg" alt="dataforest cloud" height="30" /></picture></a>
|
||||
<sub>PUBLIC SERVICES PROUDLY SPONSORED BY</sub><br /><a href="https://cloud.dataforest.net/?mtm_campaign=trek"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/sponsors/dataforest-light.svg" /><source media="(prefers-color-scheme: light)" srcset="docs/sponsors/dataforest-dark.svg" /><img src="docs/sponsors/dataforest-dark.svg" alt="dataforest cloud" height="30" /></picture></a>
|
||||
</div>
|
||||
|
||||
---
|
||||
@@ -224,7 +224,7 @@ Most of what follows is an addon an admin switches on or off. Lists, Costs, Docu
|
||||
|
||||
<br />
|
||||
|
||||
<a href="https://cloud.dataforest.net/en?mtm_campaign=trek">
|
||||
<a href="https://cloud.dataforest.net/?mtm_campaign=trek">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="docs/sponsors/dataforest-light.svg" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="docs/sponsors/dataforest-dark.svg" />
|
||||
@@ -243,7 +243,7 @@ Thank you, dataforest, for backing open source this generously. 💚
|
||||
|
||||
<br />
|
||||
|
||||
<a href="https://cloud.dataforest.net/en?mtm_campaign=trek"><img alt="Visit dataforest cloud" src="https://img.shields.io/badge/Visit-dataforest_cloud-02C382?style=for-the-badge" /></a>
|
||||
<a href="https://cloud.dataforest.net/?mtm_campaign=trek"><img alt="Visit dataforest cloud" src="https://img.shields.io/badge/Visit-dataforest_cloud-02C382?style=for-the-badge" /></a>
|
||||
|
||||
Looking for a server for your own TREK? dataforest cloud is where TREK's own services live.
|
||||
|
||||
@@ -277,7 +277,7 @@ Open `http://localhost:3000`, or `http://<server-ip>:3000` from another machine.
|
||||
`COOKIE_SECURE=false` is only for trying TREK over plain HTTP: without it the browser drops the session cookie and the login does not stick. Once TREK sits behind HTTPS (see [Reverse Proxy](#reverse-proxy)), remove it.
|
||||
|
||||
> [!TIP]
|
||||
> **No server yet?** TREK's own public services run on [**dataforest cloud**](https://cloud.dataforest.net/en?mtm_campaign=trek), our infrastructure sponsor. A small seed is plenty for a TREK instance and is ready within a minute.
|
||||
> **No server yet?** TREK's own public services run on [**dataforest cloud**](https://cloud.dataforest.net/?mtm_campaign=trek), our infrastructure sponsor. A small seed is plenty for a TREK instance and is ready within a minute.
|
||||
|
||||
<div align="center">
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
apiVersion: v2
|
||||
name: trek
|
||||
version: 5.0.1
|
||||
version: 5.1.0
|
||||
description: Minimal Helm chart for TREK app
|
||||
appVersion: "5.0.1"
|
||||
appVersion: "5.1.0"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trek/client",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"engines": {
|
||||
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
||||
},
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
<svg width="310" height="48" viewBox="0 0 310 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M39.9361 44.5592H37.3496V40.5946H38.7949C39.6016 40.5946 40.1393 40.0905 40.1393 38.9477V32.7663C40.1393 30.1462 41.3157 28.7345 43.4989 28.0302C41.3157 27.3243 40.1393 25.9142 40.1393 23.2941V17.1127C40.1393 15.9699 39.6016 15.4673 38.7949 15.4673H37.3496V11.5027H39.9361C42.8252 11.5027 44.8403 13.2825 44.8403 16.1059V22.5898C44.8403 24.8738 46.2184 26.0166 48.5696 26.0166V30.0484C46.2184 30.0484 44.8403 31.1912 44.8403 33.4752V39.9591C44.8403 42.7809 42.8252 44.5607 39.9361 44.5607V44.5592Z" fill="white"/>
|
||||
<path d="M0 30.0453V26.0135C2.35125 26.0135 3.72931 24.8708 3.72931 22.5867V16.1028C3.72931 13.281 5.74445 11.4996 8.63347 11.4996H11.22V15.4642H9.77472C8.96806 15.4642 8.43028 15.9684 8.43028 17.1096V23.291C8.43028 25.9112 7.25389 27.3228 5.07069 28.0271C7.25389 28.733 8.43028 30.1431 8.43028 32.7633V38.9446C8.43028 40.0874 8.96806 40.5916 9.77472 40.5916H11.22V44.5562H8.63347C5.74445 44.5562 3.72931 42.7763 3.72931 39.9545V33.4706C3.72931 31.1866 2.35125 30.0438 0 30.0438V30.0453Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.2855 0.076416L32.7769 8.5678L28.8169 12.5263L24.284 7.99336L19.7511 12.5263L15.7926 8.5678L24.284 0.076416H24.2855Z" fill="#02C382"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.2855 11.7119L34.4055 21.8319L30.4471 25.7904L24.2855 19.6289L18.124 25.7904L14.1655 21.8319L24.2855 11.7119Z" fill="#02C382"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.2856 23.3475L36.0342 35.0961L32.0757 39.0561L24.2871 31.2675L16.4985 39.0561L12.54 35.0961L24.2887 23.3475H24.2856Z" fill="#02C382"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.4867 47.8958V37.3129H27.086V47.8958H21.4867Z" fill="white"/>
|
||||
<path d="M216.808 36.4329H211.635V23.9357H208.444V19.635H211.635V14.4283H216.808V19.635H220V23.9357H216.808V36.4329Z" fill="white"/>
|
||||
<path d="M192.671 31.1239H197.575C197.643 32.3003 198.516 33.0046 200.095 33.0046C201.673 33.0046 202.446 32.4332 202.446 31.5593C202.446 31.0552 202.177 30.5174 200.933 30.2485L197.843 29.5763C194.752 28.904 193.241 27.5611 193.241 24.6049C193.241 21.1108 196.231 19.0957 200.263 19.0957C204.294 19.0957 206.881 21.3797 206.881 24.7729H201.977C201.977 23.6302 201.271 22.8586 200.029 22.8586C198.853 22.8586 198.115 23.4636 198.115 24.3711C198.115 25.1442 198.753 25.5811 199.928 25.85L203.052 26.5222C205.807 27.1272 207.319 28.4029 207.319 31.0918C207.319 34.6867 204.262 36.8699 199.894 36.8699C195.527 36.8699 192.671 34.5186 192.671 31.1254V31.1239Z" fill="white"/>
|
||||
<path d="M182.351 36.8699C177.279 36.8699 173.65 33.1742 173.65 28.0011C173.65 22.8281 177.178 19.0988 182.25 19.0988C187.322 19.0988 190.816 22.5592 190.816 28.0347V29.3456L178.622 29.4128C178.924 31.6296 180.168 32.6715 182.452 32.6715C184.4 32.6715 185.778 31.9657 186.147 30.7572H190.884C190.279 34.4865 186.953 36.8714 182.351 36.8714V36.8699ZM182.284 23.2971C180.235 23.2971 179.092 24.2046 178.689 26.2197H185.677C185.677 24.4383 184.366 23.2971 182.284 23.2971Z" fill="white"/>
|
||||
<path d="M172.433 19.6351V24.5056H170.787C167.831 24.5056 166.051 25.8164 166.051 29.1424V36.433H160.878V19.6687H165.749L166.017 22.1544C166.723 20.5074 168.201 19.3998 170.453 19.3998C171.058 19.3998 171.728 19.467 172.434 19.6351H172.433Z" fill="white"/>
|
||||
<path d="M139.367 28.0011C139.367 22.6936 143.264 19.1323 148.639 19.1323C154.014 19.1323 157.878 22.6936 157.878 28.0011C157.878 33.3086 153.98 36.8362 148.639 36.8362C143.298 36.8362 139.367 33.3086 139.367 28.0011ZM144.574 27.9675C144.574 30.5204 146.219 32.2009 148.639 32.2009C151.059 32.2009 152.671 30.5219 152.671 27.9675C152.671 25.413 151.025 23.7676 148.639 23.7676C146.253 23.7676 144.574 25.4466 144.574 27.9675Z" fill="white"/>
|
||||
<path d="M126.917 19.635H129.235V18.2906C129.235 13.2856 131.855 11.1008 136.122 11.1008C136.828 11.1008 137.634 11.1681 138.44 11.3025V15.7376H136.994C134.878 15.7376 134.408 16.8468 134.408 18.2906V19.635H138.44V23.9357H134.408V36.4329H129.235V23.9357H126.917V19.635Z" fill="white"/>
|
||||
<path d="M114.606 36.8699C111.045 36.8699 108.828 34.7875 108.828 31.4951C108.828 28.4045 111.011 26.4901 115.043 26.1876L119.746 25.8179V25.549C119.746 23.9021 118.737 23.0297 116.89 23.0297C114.707 23.0297 113.531 23.87 113.531 25.381H109.23C109.23 21.5844 112.354 19.0988 117.158 19.0988C121.961 19.0988 124.783 21.8197 124.783 26.6246V36.4344H120.215L119.879 34.2176C119.341 35.7622 117.124 36.8714 114.605 36.8714L114.606 36.8699ZM116.42 33.0397C118.401 33.0397 119.779 32.065 119.779 30.1507V29.2432L117.159 29.4785C114.909 29.6801 114.102 30.1843 114.102 31.2583C114.102 32.4683 114.842 33.0382 116.42 33.0382V33.0397Z" fill="white"/>
|
||||
<path d="M104.017 36.4329H98.8441V23.9357H95.6526V19.635H98.8441V14.4283H104.017V19.635H107.209V23.9357H104.017V36.4329Z" fill="white"/>
|
||||
<path d="M83.5052 36.8699C79.944 36.8699 77.7272 34.7875 77.7272 31.4951C77.7272 28.4045 79.9104 26.4901 83.9422 26.1876L88.6462 25.8179V25.549C88.6462 23.9021 87.6379 23.0297 85.7908 23.0297C83.6076 23.0297 82.4312 23.87 82.4312 25.381H78.1305C78.1305 21.5844 81.2548 19.0988 86.0581 19.0988C90.8615 19.0988 93.6833 21.8197 93.6833 26.6246V36.4344H89.1137L88.7776 34.2176C88.2398 35.7622 86.023 36.8714 83.5037 36.8714L83.5052 36.8699ZM85.3187 33.0397C87.3002 33.0397 88.6783 32.065 88.6783 30.1507V29.2432L86.0581 29.4785C83.8077 29.6801 83.0011 30.1843 83.0011 31.2583C83.0011 32.4683 83.7405 33.0382 85.3187 33.0382V33.0397Z" fill="white"/>
|
||||
<path d="M63.9986 36.8699C59.1617 36.8699 56.0374 33.4431 56.0374 28.1356C56.0374 22.8281 59.2289 19.0988 64.3347 19.0988C66.4171 19.0988 68.4001 19.9391 69.3733 21.1812V11.1024H74.5464V36.433H69.6758L69.4069 34.2834C68.4994 35.828 66.4171 36.8699 63.9986 36.8699ZM65.2407 32.1323C67.6592 32.1323 69.3397 30.4533 69.3397 27.9324C69.3397 25.4116 67.6607 23.7326 65.2407 23.7326C62.8207 23.7326 61.2425 25.4452 61.2425 27.9324C61.2425 30.4196 62.7871 32.1323 65.2407 32.1323Z" fill="white"/>
|
||||
<path d="M228.377 28.3024C228.377 26.6 228.702 25.1104 229.351 23.8336C230.023 22.5344 230.942 21.5264 232.107 20.8096C233.294 20.0704 234.671 19.7008 236.239 19.7008C238.121 19.7008 239.7 20.2048 240.977 21.2128C242.276 22.2208 243.083 23.5648 243.396 25.2448H241.078C240.764 24.1248 240.171 23.2624 239.297 22.6576C238.423 22.0528 237.415 21.7504 236.273 21.7504C235.198 21.7504 234.235 22.0192 233.383 22.5568C232.532 23.0944 231.86 23.856 231.367 24.8416C230.897 25.8048 230.662 26.9472 230.662 28.2688C230.662 29.568 230.886 30.6992 231.334 31.6624C231.782 32.6256 232.409 33.376 233.215 33.9136C234.044 34.4512 235.007 34.72 236.105 34.72C237.337 34.72 238.401 34.4176 239.297 33.8128C240.193 33.1856 240.798 32.3456 241.111 31.2928H243.463C243.217 32.3904 242.747 33.3536 242.052 34.1824C241.358 35.0112 240.495 35.6608 239.465 36.1312C238.457 36.5792 237.337 36.8032 236.105 36.8032C234.559 36.8032 233.204 36.456 232.039 35.7616C230.897 35.0448 230.001 34.048 229.351 32.7712C228.702 31.4944 228.377 30.0048 228.377 28.3024Z" fill="white"/>
|
||||
<path d="M249.395 36.4H247.076V11.9056H249.395V36.4Z" fill="white"/>
|
||||
<path d="M253.183 28.2688C253.183 26.5888 253.542 25.1104 254.258 23.8336C254.975 22.5568 255.961 21.5488 257.215 20.8096C258.47 20.0704 259.881 19.7008 261.449 19.7008C263.039 19.7008 264.45 20.0704 265.682 20.8096C266.937 21.5488 267.922 22.5568 268.639 23.8336C269.356 25.1104 269.714 26.5888 269.714 28.2688C269.714 29.904 269.356 31.3712 268.639 32.6704C267.922 33.9472 266.937 34.9552 265.682 35.6944C264.45 36.4336 263.039 36.8032 261.449 36.8032C259.881 36.8032 258.47 36.4336 257.215 35.6944C255.961 34.9552 254.975 33.9472 254.258 32.6704C253.542 31.3712 253.183 29.904 253.183 28.2688ZM255.535 28.2352C255.535 29.512 255.782 30.6432 256.274 31.6288C256.79 32.592 257.484 33.3536 258.358 33.9136C259.254 34.4512 260.284 34.72 261.449 34.72C262.614 34.72 263.633 34.4512 264.506 33.9136C265.402 33.3536 266.097 32.592 266.59 31.6288C267.105 30.6432 267.362 29.512 267.362 28.2352C267.362 26.9808 267.105 25.872 266.59 24.9088C266.097 23.9456 265.402 23.184 264.506 22.624C263.633 22.064 262.614 21.784 261.449 21.784C260.284 21.784 259.254 22.064 258.358 22.624C257.484 23.184 256.79 23.9456 256.274 24.9088C255.782 25.872 255.535 26.9808 255.535 28.2352Z" fill="white"/>
|
||||
<path d="M284.453 20.1376H286.771V36.4H284.755L284.453 33.6448C284.005 34.5856 283.254 35.3472 282.202 35.9296C281.171 36.512 280.018 36.8032 278.741 36.8032C276.837 36.8032 275.37 36.1984 274.339 34.9888C273.331 33.7792 272.827 32.1888 272.827 30.2176V20.104H275.179V29.4784C275.179 31.4048 275.571 32.76 276.355 33.544C277.162 34.328 278.203 34.72 279.48 34.72C281.048 34.72 282.269 34.216 283.142 33.208C284.016 32.1776 284.453 30.6992 284.453 28.7728V20.1376Z" fill="white"/>
|
||||
<path d="M297.656 36.8032C296.088 36.8032 294.744 36.4336 293.624 35.6944C292.504 34.9552 291.642 33.9472 291.037 32.6704C290.432 31.3712 290.13 29.9152 290.13 28.3024C290.13 26.6672 290.432 25.2 291.037 23.9008C291.642 22.6016 292.504 21.5824 293.624 20.8432C294.767 20.0816 296.144 19.7008 297.757 19.7008C299.101 19.7008 300.288 19.992 301.319 20.5744C302.372 21.1568 303.178 22.0416 303.738 23.2288V11.9056H306.056V36.4H304.04L303.805 33.0736C303.223 34.328 302.394 35.2688 301.319 35.896C300.244 36.5008 299.023 36.8032 297.656 36.8032ZM298.06 34.6864C299.269 34.6864 300.288 34.4176 301.117 33.88C301.946 33.32 302.584 32.5584 303.032 31.5952C303.48 30.6096 303.704 29.4896 303.704 28.2352C303.704 26.9808 303.48 25.872 303.032 24.9088C302.584 23.9456 301.946 23.184 301.117 22.624C300.288 22.064 299.269 21.784 298.06 21.784C296.895 21.784 295.887 22.064 295.036 22.624C294.207 23.184 293.568 23.9456 293.12 24.9088C292.695 25.872 292.482 26.9808 292.482 28.2352C292.482 29.4896 292.695 30.6096 293.12 31.5952C293.568 32.5584 294.207 33.32 295.036 33.88C295.887 34.4176 296.895 34.6864 298.06 34.6864Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.7 KiB |
@@ -0,0 +1,23 @@
|
||||
<svg width="258" height="40" viewBox="0 0 258 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M33.28 37.1326H31.1245V33.8288H32.3289C33.0011 33.8288 33.4493 33.4087 33.4493 32.4564V27.3052C33.4493 25.1218 34.4296 23.9454 36.2489 23.3584C34.4296 22.7703 33.4493 21.5951 33.4493 19.4117V14.2605C33.4493 13.3082 33.0011 12.8894 32.3289 12.8894H31.1245V9.58553H33.28C35.6875 9.58553 37.3668 11.0688 37.3668 13.4215V18.8248C37.3668 20.7281 38.5151 21.6804 40.4745 21.6804V25.0403C38.5151 25.0403 37.3668 25.9926 37.3668 27.896V33.2992C37.3668 35.6507 35.6875 37.1339 33.28 37.1339V37.1326Z" fill="#1E302D"/>
|
||||
<path d="M0 25.0377V21.6779C1.95937 21.6779 3.10775 20.7256 3.10775 18.8222V13.419C3.10775 11.0675 4.78704 9.58298 7.19456 9.58298H9.35V12.8868H8.1456C7.47338 12.8868 7.02523 13.3069 7.02523 14.258V19.4091C7.02523 21.5926 6.04491 22.769 4.22558 23.3559C6.04491 23.9441 7.02523 25.1192 7.02523 27.3027V32.4538C7.02523 33.4061 7.47338 33.8263 8.1456 33.8263H9.35V37.1301H7.19456C4.78704 37.1301 3.10775 35.6469 3.10775 33.2954V27.8921C3.10775 25.9888 1.95937 25.0365 0 25.0365V25.0377Z" fill="#1E302D"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2381 0.063694L27.3142 7.13985L24.0142 10.4386L20.2368 6.66115L16.4594 10.4386L13.1606 7.13985L20.2368 0.063694H20.2381Z" fill="#02C382"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.238 9.75996L28.6714 18.1933L25.3726 21.492L20.238 16.3574L15.1034 21.492L11.8047 18.1933L20.238 9.75996Z" fill="#02C382"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2382 19.4563L30.0287 29.2468L26.7299 32.5468L20.2394 26.0562L13.7489 32.5468L10.4502 29.2468L20.2407 19.4563H20.2382Z" fill="#02C382"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.9058 39.9132V31.0941H22.5718V39.9132H17.9058Z" fill="#1E302D"/>
|
||||
<path d="M180.674 30.3608H176.363V19.9464H173.703V16.3625H176.363V12.0236H180.674V16.3625H183.333V19.9464H180.674V30.3608Z" fill="#1E302D"/>
|
||||
<path d="M160.559 25.9366H164.646C164.702 26.9169 165.43 27.5038 166.745 27.5038C168.06 27.5038 168.705 27.0277 168.705 26.2994C168.705 25.8793 168.481 25.4311 167.444 25.2071L164.869 24.6469C162.293 24.0867 161.034 22.9676 161.034 20.5041C161.034 17.5924 163.526 15.9131 166.885 15.9131C170.245 15.9131 172.401 17.8164 172.401 20.6441H168.314C168.314 19.6918 167.726 19.0488 166.691 19.0488C165.71 19.0488 165.095 19.553 165.095 20.3093C165.095 20.9535 165.627 21.3176 166.607 21.5417L169.21 22.1019C171.506 22.606 172.766 23.6691 172.766 25.9098C172.766 28.9056 170.218 30.7249 166.579 30.7249C162.939 30.7249 160.559 28.7655 160.559 25.9378V25.9366Z" fill="#1E302D"/>
|
||||
<path d="M151.959 30.7249C147.732 30.7249 144.708 27.6451 144.708 23.3343C144.708 19.0234 147.648 15.9156 151.875 15.9156C156.102 15.9156 159.014 18.7993 159.014 23.3623V24.4546L148.851 24.5107C149.103 26.358 150.14 27.2263 152.043 27.2263C153.666 27.2263 154.815 26.6381 155.123 25.631H159.07C158.565 28.7388 155.794 30.7262 151.959 30.7262V30.7249ZM151.903 19.4142C150.196 19.4142 149.243 20.1705 148.907 21.8498H154.731C154.731 20.3653 153.638 19.4142 151.903 19.4142Z" fill="#1E302D"/>
|
||||
<path d="M143.694 16.3625V20.4213H142.323C139.859 20.4213 138.376 21.5137 138.376 24.2853V30.3608H134.065V16.3905H138.124L138.348 18.4619C138.936 17.0895 140.167 16.1664 142.044 16.1664C142.548 16.1664 143.107 16.2225 143.695 16.3625H143.694Z" fill="#1E302D"/>
|
||||
<path d="M116.139 23.3343C116.139 18.9113 119.387 15.9436 123.866 15.9436C128.345 15.9436 131.565 18.9113 131.565 23.3343C131.565 27.7572 128.317 30.6969 123.866 30.6969C119.415 30.6969 116.139 27.7572 116.139 23.3343ZM120.478 23.3062C120.478 25.4337 121.849 26.8341 123.866 26.8341C125.883 26.8341 127.226 25.435 127.226 23.3062C127.226 21.1775 125.855 19.8064 123.866 19.8064C121.877 19.8064 120.478 21.2056 120.478 23.3062Z" fill="#1E302D"/>
|
||||
<path d="M105.764 16.3625H107.696V15.2421C107.696 11.0713 109.879 9.2507 113.435 9.2507C114.023 9.2507 114.695 9.30672 115.366 9.41875V13.1147H114.162C112.399 13.1147 112.006 14.039 112.006 15.2421V16.3625H115.366V19.9464H112.006V30.3608H107.696V19.9464H105.764V16.3625Z" fill="#1E302D"/>
|
||||
<path d="M95.505 30.7249C92.5373 30.7249 90.6899 28.9896 90.6899 26.246C90.6899 23.6704 92.5093 22.0751 95.8691 21.823L99.7879 21.5149V21.2909C99.7879 19.9184 98.9476 19.1914 97.4083 19.1914C95.589 19.1914 94.6087 19.8917 94.6087 21.1508H91.0248C91.0248 17.987 93.6284 15.9156 97.6311 15.9156C101.634 15.9156 103.985 18.1831 103.985 22.1872V30.362H100.179L99.8986 28.5147C99.4505 29.8019 97.6031 30.7262 95.5037 30.7262L95.505 30.7249ZM97.0162 27.5331C98.6675 27.5331 99.8159 26.7208 99.8159 25.1256V24.3693L97.6324 24.5654C95.7571 24.7335 95.0848 25.1536 95.0848 26.0486C95.0848 27.0569 95.7011 27.5318 97.0162 27.5318V27.5331Z" fill="#1E302D"/>
|
||||
<path d="M86.6809 30.3608H82.37V19.9464H79.7104V16.3625H82.37V12.0236H86.6809V16.3625H89.3405V19.9464H86.6809V30.3608Z" fill="#1E302D"/>
|
||||
<path d="M69.5875 30.7249C66.6198 30.7249 64.7725 28.9896 64.7725 26.246C64.7725 23.6704 66.5918 22.0751 69.9516 21.823L73.8716 21.5149V21.2909C73.8716 19.9184 73.0314 19.1914 71.4921 19.1914C69.6728 19.1914 68.6925 19.8917 68.6925 21.1508H65.1086C65.1086 17.987 67.7122 15.9156 71.7149 15.9156C75.7177 15.9156 78.0692 18.1831 78.0692 22.1872V30.362H74.2612L73.9811 28.5147C73.533 29.8019 71.6857 30.7262 69.5862 30.7262L69.5875 30.7249ZM71.0987 27.5331C72.75 27.5331 73.8984 26.7208 73.8984 25.1256V24.3693L71.7149 24.5654C69.8396 24.7335 69.1674 25.1536 69.1674 26.0486C69.1674 27.0569 69.7836 27.5318 71.0987 27.5318V27.5331Z" fill="#1E302D"/>
|
||||
<path d="M53.3321 30.7249C49.3013 30.7249 46.6978 27.8692 46.6978 23.4463C46.6978 19.0234 49.3574 15.9156 53.6122 15.9156C55.3475 15.9156 57.0001 16.6159 57.8111 17.6509V9.25197H62.1219V30.3608H58.0631L57.8391 28.5695C57.0828 29.8566 55.3475 30.7249 53.3321 30.7249ZM54.3672 26.7769C56.3826 26.7769 57.7831 25.3777 57.7831 23.277C57.7831 21.1763 56.3839 19.7771 54.3672 19.7771C52.3505 19.7771 51.0354 21.2043 51.0354 23.277C51.0354 25.3497 52.3225 26.7769 54.3672 26.7769Z" fill="#1E302D"/>
|
||||
<path d="M190.314 23.5854C190.314 22.1667 190.585 20.9254 191.126 19.8614C191.686 18.7787 192.451 17.9387 193.422 17.3414C194.411 16.7254 195.559 16.4174 196.866 16.4174C198.434 16.4174 199.75 16.8374 200.814 17.6774C201.897 18.5174 202.569 19.6374 202.83 21.0374H200.898C200.637 20.104 200.142 19.3854 199.414 18.8814C198.686 18.3774 197.846 18.1254 196.894 18.1254C195.998 18.1254 195.195 18.3494 194.486 18.7974C193.777 19.2454 193.217 19.88 192.806 20.7014C192.414 21.504 192.218 22.456 192.218 23.5574C192.218 24.64 192.405 25.5827 192.778 26.3854C193.151 27.188 193.674 27.8134 194.346 28.2614C195.037 28.7094 195.839 28.9334 196.754 28.9334C197.781 28.9334 198.667 28.6814 199.414 28.1774C200.161 27.6547 200.665 26.9547 200.926 26.0774H202.886C202.681 26.992 202.289 27.7947 201.71 28.4854C201.131 29.176 200.413 29.7174 199.554 30.1094C198.714 30.4827 197.781 30.6694 196.754 30.6694C195.466 30.6694 194.337 30.38 193.366 29.8014C192.414 29.204 191.667 28.3734 191.126 27.3094C190.585 26.2454 190.314 25.004 190.314 23.5854Z" fill="#1E302D"/>
|
||||
<path d="M207.829 30.3334H205.897V9.92135H207.829V30.3334Z" fill="#1E302D"/>
|
||||
<path d="M210.986 23.5574C210.986 22.1574 211.285 20.9254 211.882 19.8614C212.479 18.7974 213.301 17.9574 214.346 17.3414C215.391 16.7254 216.567 16.4174 217.874 16.4174C219.199 16.4174 220.375 16.7254 221.402 17.3414C222.447 17.9574 223.269 18.7974 223.866 19.8614C224.463 20.9254 224.762 22.1574 224.762 23.5574C224.762 24.92 224.463 26.1427 223.866 27.2254C223.269 28.2894 222.447 29.1294 221.402 29.7454C220.375 30.3614 219.199 30.6694 217.874 30.6694C216.567 30.6694 215.391 30.3614 214.346 29.7454C213.301 29.1294 212.479 28.2894 211.882 27.2254C211.285 26.1427 210.986 24.92 210.986 23.5574ZM212.946 23.5294C212.946 24.5934 213.151 25.536 213.562 26.3574C213.991 27.16 214.57 27.7947 215.298 28.2614C216.045 28.7094 216.903 28.9334 217.874 28.9334C218.845 28.9334 219.694 28.7094 220.422 28.2614C221.169 27.7947 221.747 27.16 222.158 26.3574C222.587 25.536 222.802 24.5934 222.802 23.5294C222.802 22.484 222.587 21.56 222.158 20.7574C221.747 19.9547 221.169 19.32 220.422 18.8534C219.694 18.3867 218.845 18.1534 217.874 18.1534C216.903 18.1534 216.045 18.3867 215.298 18.8534C214.57 19.32 213.991 19.9547 213.562 20.7574C213.151 21.56 212.946 22.484 212.946 23.5294Z" fill="#1E302D"/>
|
||||
<path d="M237.044 16.7814H238.976V30.3334H237.296L237.044 28.0374C236.67 28.8214 236.045 29.456 235.168 29.9414C234.309 30.4267 233.348 30.6694 232.284 30.6694C230.697 30.6694 229.474 30.1654 228.616 29.1574C227.776 28.1494 227.356 26.824 227.356 25.1814V16.7534H229.316V24.5654C229.316 26.1707 229.642 27.3 230.296 27.9534C230.968 28.6067 231.836 28.9334 232.9 28.9334C234.206 28.9334 235.224 28.5134 235.952 27.6734C236.68 26.8147 237.044 25.5827 237.044 23.9774V16.7814Z" fill="#1E302D"/>
|
||||
<path d="M248.047 30.6694C246.74 30.6694 245.62 30.3614 244.687 29.7454C243.754 29.1294 243.035 28.2894 242.531 27.2254C242.027 26.1427 241.775 24.9294 241.775 23.5854C241.775 22.2227 242.027 21 242.531 19.9174C243.035 18.8347 243.754 17.9854 244.687 17.3694C245.639 16.7347 246.787 16.4174 248.131 16.4174C249.251 16.4174 250.24 16.66 251.099 17.1454C251.976 17.6307 252.648 18.368 253.115 19.3574V9.92135H255.047V30.3334H253.367L253.171 27.5614C252.686 28.6067 251.995 29.3907 251.099 29.9134C250.203 30.4174 249.186 30.6694 248.047 30.6694ZM248.383 28.9054C249.391 28.9054 250.24 28.6814 250.931 28.2334C251.622 27.7667 252.154 27.132 252.527 26.3294C252.9 25.508 253.087 24.5747 253.087 23.5294C253.087 22.484 252.9 21.56 252.527 20.7574C252.154 19.9547 251.622 19.32 250.931 18.8534C250.24 18.3867 249.391 18.1534 248.383 18.1534C247.412 18.1534 246.572 18.3867 245.863 18.8534C245.172 19.32 244.64 19.9547 244.267 20.7574C243.912 21.56 243.735 22.484 243.735 23.5294C243.735 24.5747 243.912 25.508 244.267 26.3294C244.64 27.132 245.172 27.7667 245.863 28.2334C246.572 28.6814 247.412 28.9054 248.383 28.9054Z" fill="#1E302D"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.7 KiB |
@@ -899,7 +899,6 @@
|
||||
"src/components/Roadtrip/useVehicleRange.test.ts",
|
||||
"src/components/Roadtrip/useVehicleRange.ts",
|
||||
"src/components/Roadtrip/vehicleRange.ts",
|
||||
"src/components/Settings/AboutTab.tsx",
|
||||
"src/components/Settings/AccountTab.test.tsx",
|
||||
"src/components/Settings/AccountTab.tsx",
|
||||
"src/components/Settings/AirTrailConnectionSection.test.tsx",
|
||||
@@ -991,9 +990,6 @@
|
||||
"src/components/Studio/useBookPresence.ts",
|
||||
"src/components/Studio/useBookStore.ts",
|
||||
"src/components/Studio/useSpreadInteraction.ts",
|
||||
"src/components/SystemNotices/ReleaseNoticeModal.test.tsx",
|
||||
"src/components/SystemNotices/ReleaseNoticeModal.tsx",
|
||||
"src/components/SystemNotices/ReleaseNoticeVisuals.tsx",
|
||||
"src/components/SystemNotices/SystemNoticeBanner.extra.test.tsx",
|
||||
"src/components/SystemNotices/SystemNoticeBanner.test.tsx",
|
||||
"src/components/SystemNotices/SystemNoticeBanner.tsx",
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
"components/Roadtrip/dayColors.ts": 8,
|
||||
"components/Roadtrip/nightBookend.ts": 1,
|
||||
"components/Roadtrip/stopKinds.ts": 1,
|
||||
"components/Settings/AboutTab.tsx": 3,
|
||||
"components/Settings/AboutTab.tsx": 5,
|
||||
"components/Settings/AccountTab.tsx": 2,
|
||||
"components/Settings/AppearanceSettingsTab.tsx": 1,
|
||||
"components/Settings/PasskeysSection.tsx": 1,
|
||||
|
||||
@@ -60,7 +60,8 @@ describe('AboutTab', () => {
|
||||
it('FE-COMP-ABOUT-009: all external links have rel="noopener noreferrer"', () => {
|
||||
render(<AboutTab appVersion="2.9.10" />);
|
||||
const links = document.querySelectorAll('a');
|
||||
expect(links).toHaveLength(6);
|
||||
// Six tiles, and the sponsor panel: its logo, its button and the name in its title and body.
|
||||
expect(links).toHaveLength(10);
|
||||
links.forEach((link) => {
|
||||
expect(link).toHaveAttribute('rel', 'noopener noreferrer');
|
||||
});
|
||||
@@ -130,4 +131,24 @@ describe('AboutTab', () => {
|
||||
expect(link.style.borderColor).toBe('');
|
||||
expect(link.style.boxShadow).toBe('');
|
||||
});
|
||||
|
||||
it('FE-COMP-ABOUT-018: the sponsor panel links dataforest cloud wherever it is named, with both logos bundled', () => {
|
||||
render(<AboutTab appVersion="1.0.0" />);
|
||||
const links = document.querySelectorAll('a[href="https://cloud.dataforest.net/?mtm_campaign=trek"]');
|
||||
// The logo tile, the call to action, and the brand name in the title and in the body.
|
||||
expect(links).toHaveLength(4);
|
||||
for (const link of links) {
|
||||
expect(link).toHaveAttribute('target', '_blank');
|
||||
expect(link).toHaveAttribute('rel', 'noopener noreferrer');
|
||||
}
|
||||
const logos = [...document.querySelectorAll('img')].map((img) => img.getAttribute('src'));
|
||||
expect(logos).toEqual(
|
||||
expect.arrayContaining(['/brands/dataforest-cloud.svg', '/brands/dataforest-cloud-dark.svg'])
|
||||
);
|
||||
// Served by TREK itself: opening Settings must not reach a third party.
|
||||
expect(logos.every((src) => src?.startsWith('/'))).toBe(true);
|
||||
expect(screen.getByText('Place search')).toBeInTheDocument();
|
||||
expect(screen.getByText('Address search')).toBeInTheDocument();
|
||||
expect(screen.getByText('Routing')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,16 +1,30 @@
|
||||
import { BookOpen, Bug, Coffee, ExternalLink, Github, Heart, Info, Lightbulb } from 'lucide-react';
|
||||
import {
|
||||
ArrowUpRight,
|
||||
BookOpen,
|
||||
Bug,
|
||||
Coffee,
|
||||
ExternalLink,
|
||||
Github,
|
||||
Heart,
|
||||
Info,
|
||||
Lightbulb,
|
||||
MapPin,
|
||||
Route,
|
||||
Search,
|
||||
} from 'lucide-react';
|
||||
import React, { type CSSProperties, type ReactNode } from 'react';
|
||||
import { useTranslation } from '../../i18n';
|
||||
import { useAuthStore } from '../../store/authStore';
|
||||
import { fs } from '../shared/DialogShell';
|
||||
import Section from './Section';
|
||||
import { StatusPill } from './settingsKit';
|
||||
import { fs } from '../shared/DialogShell';
|
||||
import { useAuthStore } from '../../store/authStore';
|
||||
|
||||
interface Props {
|
||||
appVersion: string;
|
||||
}
|
||||
|
||||
const DISCORD_PATH = 'M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z';
|
||||
const DISCORD_PATH =
|
||||
'M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z';
|
||||
|
||||
// The services' own colours: each tile takes its brand on hover and in its icon square.
|
||||
const BRAND = {
|
||||
@@ -27,7 +41,8 @@ const SIGNAL = {
|
||||
} as const;
|
||||
|
||||
/** Tile chrome that reads the tile's colour from `--tile`: the border and a faint ring on hover. */
|
||||
const TILE_HOVER = 'hover:border-[color:var(--tile)] hover:shadow-[0_0_0_1px_color-mix(in_srgb,var(--tile)_14%,transparent)]';
|
||||
const TILE_HOVER =
|
||||
'hover:border-[color:var(--tile)] hover:shadow-[0_0_0_1px_color-mix(in_srgb,var(--tile)_14%,transparent)]';
|
||||
/** The icon square in the tile's colour. */
|
||||
const TILE_ICON = 'bg-[color-mix(in_srgb,var(--tile)_12%,transparent)] text-[color:var(--tile)]';
|
||||
|
||||
@@ -36,7 +51,13 @@ const TILE_ICON = 'bg-[color-mix(in_srgb,var(--tile)_12%,transparent)] text-[col
|
||||
* external-link mark on the right. The border picks up the tile's colour while
|
||||
* the pointer is on it.
|
||||
*/
|
||||
function LinkTile({ href, color, icon, title, hint }: {
|
||||
function LinkTile({
|
||||
href,
|
||||
color,
|
||||
icon,
|
||||
title,
|
||||
hint,
|
||||
}: {
|
||||
href: string;
|
||||
/** A brand colour or a theme token, handed to the classes as `--tile`. */
|
||||
color?: string;
|
||||
@@ -53,19 +74,133 @@ function LinkTile({ href, color, icon, title, hint }: {
|
||||
style={color ? ({ '--tile': color } as CSSProperties) : undefined}
|
||||
>
|
||||
{icon && (
|
||||
<span className={`grid h-10 w-10 flex-none place-items-center rounded-[12px] ${color ? TILE_ICON : 'bg-surface-tertiary text-content-secondary'}`}>
|
||||
<span
|
||||
className={`grid h-10 w-10 flex-none place-items-center rounded-[12px] ${color ? TILE_ICON : 'bg-surface-tertiary text-content-secondary'}`}
|
||||
>
|
||||
{icon}
|
||||
</span>
|
||||
)}
|
||||
<div className="min-w-0 flex-1">
|
||||
<div className="truncate font-semibold text-content" style={fs(13, 'body')}>{title}</div>
|
||||
<div className="truncate text-content-faint" style={fs(11.5)}>{hint}</div>
|
||||
<div className="truncate font-semibold text-content" style={fs(13, 'body')}>
|
||||
{title}
|
||||
</div>
|
||||
<div className="truncate text-content-faint" style={fs(11.5)}>
|
||||
{hint}
|
||||
</div>
|
||||
</div>
|
||||
<ExternalLink size={14} className="flex-none text-content-faint" />
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
const DATAFOREST_HREF = 'https://cloud.dataforest.net/?mtm_campaign=trek';
|
||||
const DATAFOREST_NAME = 'dataforest cloud';
|
||||
const DATAFOREST = '#02C382'; // theme-lint-disable: brand colour (dataforest cloud)
|
||||
|
||||
/** The sponsor's name, linked wherever a line names it: it is a brand and reads the same in every language. */
|
||||
function withDataforestLink(text: string): ReactNode {
|
||||
const parts = text.split(DATAFOREST_NAME);
|
||||
if (parts.length === 1) return text;
|
||||
return parts.flatMap((part, i) =>
|
||||
i === 0
|
||||
? [part]
|
||||
: [
|
||||
<a
|
||||
key={i}
|
||||
href={DATAFOREST_HREF}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-[color:var(--df)] no-underline hover:underline"
|
||||
>
|
||||
{DATAFOREST_NAME}
|
||||
</a>,
|
||||
part,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The sponsor of TREK's own servers, across the whole section: what runs there
|
||||
* and a way to visit them. The logo ships with TREK, so opening Settings sends
|
||||
* nothing to a third party.
|
||||
*/
|
||||
function DataforestBanner() {
|
||||
const { t } = useTranslation();
|
||||
const services = [
|
||||
{ icon: <MapPin size={12} />, label: t('settings.about.sponsor.search') },
|
||||
{ icon: <Search size={12} />, label: t('settings.about.sponsor.address') },
|
||||
{ icon: <Route size={12} />, label: t('settings.about.sponsor.routing') },
|
||||
];
|
||||
return (
|
||||
<div
|
||||
className="relative overflow-hidden rounded-[18px] border border-[color:color-mix(in_srgb,var(--df)_28%,var(--border-primary))] bg-surface-card shadow-sm"
|
||||
style={{ '--df': DATAFOREST } as CSSProperties}
|
||||
>
|
||||
{/* The glow and the faint grid: a server room seen from far away, in the sponsor's green. */}
|
||||
<div
|
||||
aria-hidden="true"
|
||||
className="pointer-events-none absolute inset-0 bg-[radial-gradient(70%_120%_at_0%_0%,color-mix(in_srgb,var(--df)_16%,transparent)_0%,transparent_60%),radial-gradient(50%_90%_at_100%_100%,color-mix(in_srgb,var(--df)_10%,transparent)_0%,transparent_70%)]"
|
||||
/>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
className="pointer-events-none absolute inset-0 opacity-[0.35] [background-image:radial-gradient(color-mix(in_srgb,var(--df)_35%,transparent)_1px,transparent_1px)] [background-size:16px_16px] [mask-image:linear-gradient(90deg,transparent_0%,#000_55%,#000_100%)]"
|
||||
/>
|
||||
|
||||
<div className="relative flex flex-col gap-5 p-5 md:flex-row md:items-center">
|
||||
{/* The sponsor's own logo, one for each theme, served from TREK itself. */}
|
||||
<a
|
||||
href={DATAFOREST_HREF}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
aria-label={DATAFOREST_NAME}
|
||||
className="flex h-[76px] w-full flex-none items-center justify-center rounded-[16px] bg-[color-mix(in_srgb,var(--df)_7%,var(--bg-card))] px-5 shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--df)_26%,transparent)] transition-shadow duration-200 hover:shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--df)_55%,transparent)] md:w-[220px]"
|
||||
>
|
||||
<img src="/brands/dataforest-cloud.svg" alt="" className="h-7 w-auto dark:hidden" />
|
||||
<img src="/brands/dataforest-cloud-dark.svg" alt="" className="hidden h-7 w-auto dark:block" />
|
||||
</a>
|
||||
|
||||
<div className="min-w-0 flex-1">
|
||||
<div className="font-bold uppercase tracking-[.12em] text-[color:var(--df)]" style={fs(10.5)}>
|
||||
{t('settings.about.sponsor.eyebrow')}
|
||||
</div>
|
||||
<div className="mt-1 font-semibold text-content" style={fs(16, 'subtitle')}>
|
||||
{withDataforestLink(t('settings.about.sponsor.title'))}
|
||||
</div>
|
||||
<p className="m-0 mt-1 leading-relaxed text-content-secondary" style={fs(12.5, 'body')}>
|
||||
{withDataforestLink(t('settings.about.sponsor.body'))}
|
||||
</p>
|
||||
<div className="mt-3 flex flex-wrap gap-2">
|
||||
{services.map((s) => (
|
||||
<span
|
||||
key={s.label}
|
||||
className="inline-flex items-center gap-1.5 rounded-full border border-edge bg-surface-secondary px-2.5 py-1 font-medium text-content-secondary"
|
||||
style={fs(11.5)}
|
||||
>
|
||||
<span className="text-[color:var(--df)]">{s.icon}</span>
|
||||
{s.label}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a
|
||||
href={DATAFOREST_HREF}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="group inline-flex flex-none items-center gap-2 self-start rounded-full bg-[color:var(--df)] px-4 py-2.5 font-semibold text-[#04150e] no-underline shadow-[0_8px_20px_-10px_var(--df)] transition-[filter,transform] duration-200 hover:-translate-y-px hover:brightness-105 md:self-center" // theme-lint-disable: ink on the sponsor's green
|
||||
style={fs(13, 'body')}
|
||||
>
|
||||
{t('settings.about.sponsor.cta')}
|
||||
<ArrowUpRight
|
||||
size={15}
|
||||
className="transition-transform duration-200 group-hover:-translate-y-px group-hover:translate-x-px"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function AboutTab({ appVersion }: Props): React.ReactElement {
|
||||
const { t } = useTranslation();
|
||||
const managed = useAuthStore((s) => s.managed);
|
||||
@@ -124,11 +259,11 @@ export default function AboutTab({ appVersion }: Props): React.ReactElement {
|
||||
<LinkTile
|
||||
href="https://discord.gg/NhZBDSd4qW"
|
||||
color={BRAND.discord}
|
||||
icon={(
|
||||
icon={
|
||||
<svg width="19" height="19" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
||||
<path d={DISCORD_PATH} />
|
||||
</svg>
|
||||
)}
|
||||
}
|
||||
title="Discord"
|
||||
hint="Join the community"
|
||||
/>
|
||||
@@ -156,6 +291,10 @@ export default function AboutTab({ appVersion }: Props): React.ReactElement {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* TREK's own servers, and who sponsors them. It asks nothing of the reader, so
|
||||
a hosted instance shows it too. */}
|
||||
<DataforestBanner />
|
||||
|
||||
{/* What replaces the grids above. AGPL §13 asks for the source to be
|
||||
offered prominently to whoever uses the software over a network, and a
|
||||
customer of a hosted instance is exactly that reader. The support and
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// FE-RN-001 to FE-RN-016
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import { render, screen } from '../../../tests/helpers/render'
|
||||
import userEvent from '@testing-library/user-event'
|
||||
import { ReleaseNoticeModal } from './ReleaseNoticeModal'
|
||||
import type { SystemNoticeDTO } from '../../store/systemNoticeStore'
|
||||
// FE-RN-001 to FE-RN-020
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
import { render, screen } from '../../../tests/helpers/render';
|
||||
import type { SystemNoticeDTO } from '../../store/systemNoticeStore';
|
||||
import { ReleaseNoticeModal } from './ReleaseNoticeModal';
|
||||
|
||||
/** A notice shaped like the release-notes registry entry, with the pieces a test needs to vary. */
|
||||
function releaseNotice(overrides: Partial<SystemNoticeDTO> = {}): SystemNoticeDTO {
|
||||
@@ -42,182 +42,249 @@ function releaseNotice(overrides: Partial<SystemNoticeDTO> = {}): SystemNoticeDT
|
||||
supportTextKey: 'rel.support',
|
||||
},
|
||||
...overrides,
|
||||
} as SystemNoticeDTO
|
||||
} as SystemNoticeDTO;
|
||||
}
|
||||
|
||||
function renderModal(notice = releaseNotice(), handlers: Partial<{
|
||||
onDismiss: () => void; onCTA: () => void; onSecondaryCTA: () => void
|
||||
}> = {}) {
|
||||
const onDismiss = handlers.onDismiss ?? vi.fn()
|
||||
const onCTA = handlers.onCTA ?? vi.fn()
|
||||
const onSecondaryCTA = handlers.onSecondaryCTA ?? vi.fn()
|
||||
type Release = NonNullable<SystemNoticeDTO['release']>;
|
||||
|
||||
/** The fixture with a few fields of its release block replaced. */
|
||||
function withRelease(patch: Partial<Release>): SystemNoticeDTO {
|
||||
const n = releaseNotice();
|
||||
return { ...n, release: { ...(n.release as Release), ...patch } };
|
||||
}
|
||||
|
||||
function renderModal(
|
||||
notice = releaseNotice(),
|
||||
handlers: Partial<{
|
||||
onDismiss: () => void;
|
||||
onCTA: () => void;
|
||||
onSecondaryCTA: () => void;
|
||||
}> = {}
|
||||
) {
|
||||
const onDismiss = handlers.onDismiss ?? vi.fn();
|
||||
const onCTA = handlers.onCTA ?? vi.fn();
|
||||
const onSecondaryCTA = handlers.onSecondaryCTA ?? vi.fn();
|
||||
const view = render(
|
||||
<ReleaseNoticeModal
|
||||
notice={notice}
|
||||
visible
|
||||
onDismiss={onDismiss}
|
||||
onCTA={onCTA}
|
||||
onSecondaryCTA={onSecondaryCTA}
|
||||
/>
|
||||
)
|
||||
return { ...view, onDismiss, onCTA, onSecondaryCTA }
|
||||
<ReleaseNoticeModal notice={notice} visible onDismiss={onDismiss} onCTA={onCTA} onSecondaryCTA={onSecondaryCTA} />
|
||||
);
|
||||
return { ...view, onDismiss, onCTA, onSecondaryCTA };
|
||||
}
|
||||
|
||||
describe('ReleaseNoticeModal', () => {
|
||||
it('FE-RN-001: renders nothing for a notice without a release block', () => {
|
||||
const { container } = renderModal(releaseNotice({ release: undefined }))
|
||||
expect(container.querySelector('.rn-overlay')).toBeNull()
|
||||
})
|
||||
const { container } = renderModal(releaseNotice({ release: undefined }));
|
||||
expect(container.querySelector('.rn-overlay')).toBeNull();
|
||||
});
|
||||
|
||||
it('FE-RN-002: shows the version as a plain figure, not a translation key', () => {
|
||||
renderModal()
|
||||
expect(screen.getByText('4.3.0')).toBeInTheDocument()
|
||||
})
|
||||
renderModal();
|
||||
expect(screen.getByText('4.3.0')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('FE-RN-003: renders one card per feature, each with its drawing', () => {
|
||||
renderModal()
|
||||
expect(screen.getByText('rel.f1.title')).toBeInTheDocument()
|
||||
expect(document.querySelectorAll('.rn-feature')).toHaveLength(3)
|
||||
expect(document.querySelector('.rn-vis-tours')).not.toBeNull()
|
||||
expect(document.querySelector('.rn-vis-studio')).not.toBeNull()
|
||||
expect(document.querySelector('.rn-vis-assist')).not.toBeNull()
|
||||
})
|
||||
renderModal();
|
||||
expect(screen.getByText('rel.f1.title')).toBeInTheDocument();
|
||||
expect(document.querySelectorAll('.rn-feature')).toHaveLength(3);
|
||||
expect(document.querySelector('.rn-vis-tours')).not.toBeNull();
|
||||
expect(document.querySelector('.rn-vis-studio')).not.toBeNull();
|
||||
expect(document.querySelector('.rn-vis-assist')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('FE-RN-004: splits the note body on the blank line into separate paragraphs', () => {
|
||||
const n = releaseNotice()
|
||||
const n = releaseNotice();
|
||||
// The translation stub echoes the key, so drive the split through a real value.
|
||||
n.release!.note.bodyKey = 'first paragraph\n\nsecond paragraph'
|
||||
renderModal(n)
|
||||
expect(screen.getByText('first paragraph')).toBeInTheDocument()
|
||||
expect(screen.getByText('second paragraph')).toBeInTheDocument()
|
||||
})
|
||||
n.release!.note.bodyKey = 'first paragraph\n\nsecond paragraph';
|
||||
renderModal(n);
|
||||
expect(screen.getByText('first paragraph')).toBeInTheDocument();
|
||||
expect(screen.getByText('second paragraph')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('FE-RN-005: omits the foot when the release has neither a footnote nor notes', () => {
|
||||
renderModal()
|
||||
expect(document.querySelector('.rn-release-foot')).toBeNull()
|
||||
})
|
||||
renderModal();
|
||||
expect(document.querySelector('.rn-release-foot')).toBeNull();
|
||||
});
|
||||
|
||||
it('FE-RN-006: shows the footnote and the notes link when both are present', () => {
|
||||
const n = releaseNotice()
|
||||
n.release!.footnoteKey = 'rel.footnote'
|
||||
n.release!.notes = { labelKey: 'rel.notes', href: 'https://example.test/notes' }
|
||||
renderModal(n)
|
||||
expect(screen.getByText('rel.footnote')).toBeInTheDocument()
|
||||
const link = screen.getByRole('link', { name: /rel\.notes/ })
|
||||
expect(link).toHaveAttribute('href', 'https://example.test/notes')
|
||||
expect(link).toHaveAttribute('target', '_blank')
|
||||
expect(link).toHaveAttribute('rel', 'noopener noreferrer')
|
||||
})
|
||||
const n = releaseNotice();
|
||||
n.release!.footnoteKey = 'rel.footnote';
|
||||
n.release!.notes = { labelKey: 'rel.notes', href: 'https://example.test/notes' };
|
||||
renderModal(n);
|
||||
expect(screen.getByText('rel.footnote')).toBeInTheDocument();
|
||||
const link = screen.getByRole('link', { name: /rel\.notes/ });
|
||||
expect(link).toHaveAttribute('href', 'https://example.test/notes');
|
||||
expect(link).toHaveAttribute('target', '_blank');
|
||||
expect(link).toHaveAttribute('rel', 'noopener noreferrer');
|
||||
});
|
||||
|
||||
it('FE-RN-007: dismisses from the close button and from the backdrop', async () => {
|
||||
const user = userEvent.setup()
|
||||
const onDismiss = vi.fn()
|
||||
renderModal(releaseNotice(), { onDismiss })
|
||||
const user = userEvent.setup();
|
||||
const onDismiss = vi.fn();
|
||||
renderModal(releaseNotice(), { onDismiss });
|
||||
|
||||
await user.click(screen.getByRole('button', { name: 'Close' }))
|
||||
expect(onDismiss).toHaveBeenCalledTimes(1)
|
||||
await user.click(screen.getByRole('button', { name: 'Close' }));
|
||||
expect(onDismiss).toHaveBeenCalledTimes(1);
|
||||
|
||||
await user.click(document.querySelector('.rn-overlay')!)
|
||||
expect(onDismiss).toHaveBeenCalledTimes(2)
|
||||
})
|
||||
await user.click(document.querySelector('.rn-overlay')!);
|
||||
expect(onDismiss).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
it('FE-RN-008: a click inside the panel does not dismiss', async () => {
|
||||
const user = userEvent.setup()
|
||||
const onDismiss = vi.fn()
|
||||
renderModal(releaseNotice(), { onDismiss })
|
||||
await user.click(screen.getByText('rel.note.title'))
|
||||
expect(onDismiss).not.toHaveBeenCalled()
|
||||
})
|
||||
const user = userEvent.setup();
|
||||
const onDismiss = vi.fn();
|
||||
renderModal(releaseNotice(), { onDismiss });
|
||||
await user.click(screen.getByText('rel.note.title'));
|
||||
expect(onDismiss).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('FE-RN-009: a non-dismissible notice has no close button and an inert backdrop', async () => {
|
||||
const user = userEvent.setup()
|
||||
const onDismiss = vi.fn()
|
||||
renderModal(releaseNotice({ dismissible: false }), { onDismiss })
|
||||
expect(screen.queryByRole('button', { name: 'Close' })).toBeNull()
|
||||
await user.click(document.querySelector('.rn-overlay')!)
|
||||
expect(onDismiss).not.toHaveBeenCalled()
|
||||
})
|
||||
const user = userEvent.setup();
|
||||
const onDismiss = vi.fn();
|
||||
renderModal(releaseNotice({ dismissible: false }), { onDismiss });
|
||||
expect(screen.queryByRole('button', { name: 'Close' })).toBeNull();
|
||||
await user.click(document.querySelector('.rn-overlay')!);
|
||||
expect(onDismiss).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('FE-RN-010: wires each support button to its own handler', async () => {
|
||||
const user = userEvent.setup()
|
||||
const onCTA = vi.fn()
|
||||
const onSecondaryCTA = vi.fn()
|
||||
renderModal(releaseNotice(), { onCTA, onSecondaryCTA })
|
||||
const user = userEvent.setup();
|
||||
const onCTA = vi.fn();
|
||||
const onSecondaryCTA = vi.fn();
|
||||
renderModal(releaseNotice(), { onCTA, onSecondaryCTA });
|
||||
|
||||
await user.click(screen.getByRole('button', { name: /rel\.bmc/ }))
|
||||
expect(onCTA).toHaveBeenCalledTimes(1)
|
||||
expect(onSecondaryCTA).not.toHaveBeenCalled()
|
||||
await user.click(screen.getByRole('button', { name: /rel\.bmc/ }));
|
||||
expect(onCTA).toHaveBeenCalledTimes(1);
|
||||
expect(onSecondaryCTA).not.toHaveBeenCalled();
|
||||
|
||||
await user.click(screen.getByRole('button', { name: /rel\.kofi/ }))
|
||||
expect(onSecondaryCTA).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
await user.click(screen.getByRole('button', { name: /rel\.kofi/ }));
|
||||
expect(onSecondaryCTA).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('FE-RN-011: labels the dialog with the headline and describes it with the intro', () => {
|
||||
renderModal()
|
||||
const dialog = screen.getByRole('dialog')
|
||||
expect(dialog).toHaveAttribute('aria-modal', 'true')
|
||||
expect(dialog).toHaveAttribute('aria-labelledby', 'notice-title-release-notes')
|
||||
expect(dialog).toHaveAttribute('aria-describedby', 'notice-body-release-notes')
|
||||
expect(document.getElementById('notice-title-release-notes')).toHaveTextContent('rel.headline')
|
||||
expect(document.getElementById('notice-body-release-notes')).toHaveTextContent('rel.intro')
|
||||
})
|
||||
renderModal();
|
||||
const dialog = screen.getByRole('dialog');
|
||||
expect(dialog).toHaveAttribute('aria-modal', 'true');
|
||||
expect(dialog).toHaveAttribute('aria-labelledby', 'notice-title-release-notes');
|
||||
expect(dialog).toHaveAttribute('aria-describedby', 'notice-body-release-notes');
|
||||
expect(document.getElementById('notice-title-release-notes')).toHaveTextContent('rel.headline');
|
||||
expect(document.getElementById('notice-body-release-notes')).toHaveTextContent('rel.intro');
|
||||
});
|
||||
|
||||
it('FE-RN-012: sets the promise and the support text with a bold lead', () => {
|
||||
renderModal()
|
||||
expect(screen.getByText('rel.promise.lead').tagName).toBe('B')
|
||||
expect(screen.getByText('rel.support.lead').tagName).toBe('B')
|
||||
expect(screen.getByText('rel.promise.text')).toBeInTheDocument()
|
||||
})
|
||||
renderModal();
|
||||
expect(screen.getByText('rel.promise.lead').tagName).toBe('B');
|
||||
expect(screen.getByText('rel.support.lead').tagName).toBe('B');
|
||||
expect(screen.getByText('rel.promise.text')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('FE-RN-013: the features aside is optional', () => {
|
||||
renderModal()
|
||||
expect(document.querySelector('.rn-features-aside')).toBeNull()
|
||||
renderModal();
|
||||
expect(document.querySelector('.rn-features-aside')).toBeNull();
|
||||
|
||||
const n = releaseNotice()
|
||||
n.release!.featuresAsideKey = 'rel.features.aside'
|
||||
renderModal(n)
|
||||
expect(screen.getByText('rel.features.aside')).toBeInTheDocument()
|
||||
})
|
||||
const n = releaseNotice();
|
||||
n.release!.featuresAsideKey = 'rel.features.aside';
|
||||
renderModal(n);
|
||||
expect(screen.getByText('rel.features.aside')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('FE-RN-014: a card whose drawing this client does not know falls back to its icon', () => {
|
||||
const n = releaseNotice()
|
||||
const n = releaseNotice();
|
||||
n.release!.features = [
|
||||
{ iconName: 'Route', visual: 'from-a-newer-server', titleKey: 'rel.x.title', bodyKey: 'rel.x.body' },
|
||||
{ iconName: 'NoSuchIcon', titleKey: 'rel.y.title', bodyKey: 'rel.y.body' },
|
||||
]
|
||||
renderModal(n)
|
||||
expect(document.querySelectorAll('.rn-vis-icon')).toHaveLength(2)
|
||||
expect(document.querySelectorAll('.rn-vis-icon svg')).toHaveLength(2)
|
||||
})
|
||||
];
|
||||
renderModal(n);
|
||||
expect(document.querySelectorAll('.rn-vis-icon')).toHaveLength(2);
|
||||
expect(document.querySelectorAll('.rn-vis-icon svg')).toHaveLength(2);
|
||||
});
|
||||
|
||||
it('FE-RN-015: a wide card spans the row with its drawing beside the text, the others stay upright', () => {
|
||||
const n = releaseNotice()
|
||||
const n = releaseNotice();
|
||||
n.release!.features = [
|
||||
...n.release!.features,
|
||||
{ iconName: 'LifeBuoy', visual: 'help', layout: 'wide', titleKey: 'rel.f4.title', bodyKey: 'rel.f4.body' },
|
||||
]
|
||||
renderModal(n)
|
||||
const cards = document.querySelectorAll('.rn-feature')
|
||||
expect(cards).toHaveLength(4)
|
||||
expect(cards[3].classList.contains('rn-feature-wide')).toBe(true)
|
||||
expect([...cards].slice(0, 3).some(c => c.classList.contains('rn-feature-wide'))).toBe(false)
|
||||
];
|
||||
renderModal(n);
|
||||
const cards = document.querySelectorAll('.rn-feature');
|
||||
expect(cards).toHaveLength(4);
|
||||
expect(cards[3].classList.contains('rn-feature-wide')).toBe(true);
|
||||
expect([...cards].slice(0, 3).some((c) => c.classList.contains('rn-feature-wide'))).toBe(false);
|
||||
// The help drawing: the help button and two rows of greetings, each written twice to loop.
|
||||
const wide = cards[3]
|
||||
expect(wide.querySelector('.rn-vis-help-q')).not.toBeNull()
|
||||
expect(wide.querySelectorAll('.rn-vis-hello-row')).toHaveLength(2)
|
||||
expect(wide.querySelectorAll('.rn-vis-hello').length % 2).toBe(0)
|
||||
const wide = cards[3];
|
||||
expect(wide.querySelector('.rn-vis-help-q')).not.toBeNull();
|
||||
expect(wide.querySelectorAll('.rn-vis-hello-row')).toHaveLength(2);
|
||||
expect(wide.querySelectorAll('.rn-vis-hello').length % 2).toBe(0);
|
||||
// The tours card lists the kinds of tour along its foot.
|
||||
expect(cards[0].querySelectorAll('.rn-vis-tours-kind')).toHaveLength(5)
|
||||
})
|
||||
expect(cards[0].querySelectorAll('.rn-vis-tours-kind')).toHaveLength(5);
|
||||
});
|
||||
|
||||
it('FE-RN-016: the close button belongs to the panel, not the note', () => {
|
||||
// Below 1080px the panel scrolls and the note is its second screen, so the
|
||||
// stylesheet sticks the button to the panel's own top edge. That only works
|
||||
// while it is a child of .rn-panel; put it back in the note and it scrolls a
|
||||
// whole release half out of reach with every CSS assertion still green.
|
||||
renderModal(releaseNotice())
|
||||
const close = screen.getByRole('button', { name: 'Close' })
|
||||
expect(close.parentElement?.classList.contains('rn-panel')).toBe(true)
|
||||
expect(close.closest('.rn-note')).toBeNull()
|
||||
})
|
||||
})
|
||||
renderModal(releaseNotice());
|
||||
const close = screen.getByRole('button', { name: 'Close' });
|
||||
expect(close.parentElement?.classList.contains('rn-panel')).toBe(true);
|
||||
expect(close.closest('.rn-note')).toBeNull();
|
||||
});
|
||||
|
||||
it('FE-RN-017: links the sponsor wherever a line names it, and leaves other lines plain', () => {
|
||||
// The translation stub echoes the key, so the lines carry the brand name as their value.
|
||||
renderModal(
|
||||
withRelease({
|
||||
introKey: 'Our servers, sponsored by dataforest cloud, and more.',
|
||||
supportTextKey: 'Thanks to dataforest cloud today.',
|
||||
})
|
||||
);
|
||||
const links = screen.getAllByRole('link', { name: 'dataforest cloud' });
|
||||
expect(links).toHaveLength(2);
|
||||
for (const link of links) {
|
||||
expect(link).toHaveAttribute('href', 'https://cloud.dataforest.net/?mtm_campaign=trek');
|
||||
expect(link).toHaveAttribute('target', '_blank');
|
||||
expect(link).toHaveAttribute('rel', 'noopener noreferrer');
|
||||
}
|
||||
expect(document.getElementById('notice-body-release-notes')).toHaveTextContent(
|
||||
'Our servers, sponsored by dataforest cloud, and more.'
|
||||
);
|
||||
expect(screen.getByText('rel.promise.text').querySelector('a')).toBeNull();
|
||||
});
|
||||
|
||||
it('FE-RN-018: with a support label the ask is set as a card like the promise', () => {
|
||||
renderModal(withRelease({ supportLabelKey: 'rel.support.label' }));
|
||||
const card = document.querySelector('.rn-support .rn-support-card');
|
||||
expect(card).not.toBeNull();
|
||||
expect(card?.classList.contains('rn-promise')).toBe(true);
|
||||
expect(card?.querySelector('.rn-promise-label')).toHaveTextContent('rel.support.label');
|
||||
expect(screen.getByText('rel.support.lead').tagName).toBe('B');
|
||||
expect(document.querySelector('.rn-support-text')).toBeNull();
|
||||
});
|
||||
|
||||
it('FE-RN-019: without a support label the ask stays a plain line', () => {
|
||||
renderModal();
|
||||
expect(document.querySelector('.rn-support-card')).toBeNull();
|
||||
expect(document.querySelector('.rn-support-text')).toHaveTextContent('rel.support.lead');
|
||||
});
|
||||
|
||||
it('FE-RN-020: draws the search, sharing and routing cards', () => {
|
||||
renderModal(
|
||||
withRelease({
|
||||
features: [
|
||||
{ iconName: 'Search', visual: 'search', titleKey: 'rel.s.title', bodyKey: 'rel.s.body' },
|
||||
{ iconName: 'Share2', visual: 'share', titleKey: 'rel.sh.title', bodyKey: 'rel.sh.body' },
|
||||
{ iconName: 'Route', visual: 'routing', titleKey: 'rel.r.title', bodyKey: 'rel.r.body' },
|
||||
],
|
||||
})
|
||||
);
|
||||
expect(document.querySelectorAll('.rn-vis-icon')).toHaveLength(0);
|
||||
// The right place on top: the first result is the highlighted one.
|
||||
const rows = document.querySelectorAll('.rn-vis-search-row');
|
||||
expect(rows).toHaveLength(3);
|
||||
expect(rows[0].classList.contains('rn-vis-search-row-top')).toBe(true);
|
||||
// One place's details going out to three other TREKs.
|
||||
expect(document.querySelectorAll('.rn-vis-share-field')).toHaveLength(4);
|
||||
expect(document.querySelectorAll('.rn-vis-share-node')).toHaveLength(3);
|
||||
// A day's five stops on one drawn route.
|
||||
expect(document.querySelectorAll('.rn-vis-route-stop')).toHaveLength(5);
|
||||
expect(document.querySelector('.rn-vis-route-line')).not.toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { ArrowRight, Heart, Infinity as InfinityIcon, ShieldCheck, X } from 'lucide-react';
|
||||
import React from 'react';
|
||||
import { ArrowRight, Heart, Infinity as InfinityIcon, X } from 'lucide-react';
|
||||
import { useTranslation } from '../../i18n/TranslationContext.js';
|
||||
import type { SystemNoticeDTO } from '../../store/systemNoticeStore.js';
|
||||
import { ReleaseFeatureVisual } from './ReleaseNoticeVisuals.js';
|
||||
@@ -16,8 +16,18 @@ interface Props {
|
||||
/** Lucide's coffee cup, drawn here so its three steam strokes can drift up in waves. */
|
||||
function SteamingCoffee() {
|
||||
return (
|
||||
<svg className="rn-coffee" width={18} height={18} viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
||||
strokeWidth={2.1} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
|
||||
<svg
|
||||
className="rn-coffee"
|
||||
width={18}
|
||||
height={18}
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth={2.1}
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<path d="M17 8h1a4 4 0 1 1 0 8h-1" />
|
||||
<path d="M3 8h14v9a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4Z" />
|
||||
<path className="rn-steam" d="M6 5.5c-1.2-.9 1.2-1.7 0-2.6s1.2-1.7 0-2.6 1.2-1.7 0-2.6" />
|
||||
@@ -27,9 +37,31 @@ function SteamingCoffee() {
|
||||
);
|
||||
}
|
||||
|
||||
const SPONSOR = 'dataforest cloud';
|
||||
const SPONSOR_HREF = 'https://cloud.dataforest.net/?mtm_campaign=trek';
|
||||
|
||||
/** The sponsor's name is a brand and reads the same in every language, so wherever a line names it, it links. */
|
||||
function withSponsorLink(text: string): React.ReactNode {
|
||||
const parts = text.split(SPONSOR);
|
||||
if (parts.length === 1) return text;
|
||||
return parts.flatMap((part, i) =>
|
||||
i === 0
|
||||
? [part]
|
||||
: [
|
||||
<a key={i} className="rn-sponsor" href={SPONSOR_HREF} target="_blank" rel="noopener noreferrer">
|
||||
{SPONSOR}
|
||||
</a>,
|
||||
part,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/** Splits a translated block into paragraphs the way the notice bodies are written. */
|
||||
function paragraphs(text: string): string[] {
|
||||
return text.split('\n\n').map(p => p.trim()).filter(Boolean);
|
||||
return text
|
||||
.split('\n\n')
|
||||
.map((p) => p.trim())
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -55,15 +87,15 @@ export function ReleaseNoticeModal({ notice, visible, onDismiss, onCTA, onSecond
|
||||
className="rn-overlay"
|
||||
role="presentation"
|
||||
style={{ opacity: visible ? 1 : 0, transition: 'opacity 260ms ease' }}
|
||||
onClick={notice.dismissible ? e => { if (e.target === e.currentTarget) onDismiss() } : undefined}
|
||||
onClick={
|
||||
notice.dismissible
|
||||
? (e) => {
|
||||
if (e.target === e.currentTarget) onDismiss();
|
||||
}
|
||||
: undefined
|
||||
}
|
||||
>
|
||||
<div
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby={titleId}
|
||||
aria-describedby={bodyId}
|
||||
className="rn-panel"
|
||||
>
|
||||
<div role="dialog" aria-modal="true" aria-labelledby={titleId} aria-describedby={bodyId} className="rn-panel">
|
||||
{/* A child of the panel, not the note: stacked, the panel scrolls and the
|
||||
note is its second screen, so the button sticks to the panel's edge. */}
|
||||
{notice.dismissible && (
|
||||
@@ -86,19 +118,21 @@ export function ReleaseNoticeModal({ notice, visible, onDismiss, onCTA, onSecond
|
||||
|
||||
<div className="rn-version">{release.version}</div>
|
||||
|
||||
<h2 id={titleId} className="rn-headline">{t(release.headlineKey)}</h2>
|
||||
<p id={bodyId} className="rn-intro">{t(release.introKey)}</p>
|
||||
<h2 id={titleId} className="rn-headline">
|
||||
{t(release.headlineKey)}
|
||||
</h2>
|
||||
<p id={bodyId} className="rn-intro">
|
||||
{withSponsorLink(t(release.introKey))}
|
||||
</p>
|
||||
|
||||
<div className="rn-features-head">
|
||||
<span className="rn-features-label">{t(release.featuresLabelKey)}</span>
|
||||
<span className="rn-features-rule" aria-hidden="true" />
|
||||
{release.featuresAsideKey && (
|
||||
<span className="rn-features-aside">{t(release.featuresAsideKey)}</span>
|
||||
)}
|
||||
{release.featuresAsideKey && <span className="rn-features-aside">{t(release.featuresAsideKey)}</span>}
|
||||
</div>
|
||||
|
||||
<div className="rn-features">
|
||||
{release.features.map(f => (
|
||||
{release.features.map((f) => (
|
||||
<div key={f.titleKey} className={f.layout === 'wide' ? 'rn-feature rn-feature-wide' : 'rn-feature'}>
|
||||
<div className="rn-feature-shine" aria-hidden="true" />
|
||||
<div className="rn-feature-visual" aria-hidden="true">
|
||||
@@ -116,12 +150,7 @@ export function ReleaseNoticeModal({ notice, visible, onDismiss, onCTA, onSecond
|
||||
<div className="rn-release-foot">
|
||||
<div className="rn-footnote">{release.footnoteKey ? t(release.footnoteKey) : null}</div>
|
||||
{release.notes && (
|
||||
<a
|
||||
className="rn-notes"
|
||||
href={release.notes.href}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<a className="rn-notes" href={release.notes.href} target="_blank" rel="noopener noreferrer">
|
||||
{t(release.notes.labelKey)}
|
||||
<span className="rn-notes-arrow">
|
||||
<ArrowRight size={16} strokeWidth={2.4} aria-hidden="true" />
|
||||
@@ -139,7 +168,9 @@ export function ReleaseNoticeModal({ notice, visible, onDismiss, onCTA, onSecond
|
||||
<div className="rn-note-eyebrow">{t(release.note.eyebrowKey)}</div>
|
||||
<h3 className="rn-note-title">{t(release.note.titleKey)}</h3>
|
||||
|
||||
{paragraphs(t(release.note.bodyKey)).map((p, i) => <p key={i}>{p}</p>)}
|
||||
{paragraphs(t(release.note.bodyKey)).map((p, i) => (
|
||||
<p key={i}>{p}</p>
|
||||
))}
|
||||
|
||||
<div className="rn-promise">
|
||||
<div className="rn-promise-label">
|
||||
@@ -147,23 +178,39 @@ export function ReleaseNoticeModal({ notice, visible, onDismiss, onCTA, onSecond
|
||||
{t(release.note.promiseLabelKey)}
|
||||
</div>
|
||||
<div className="rn-promise-text">
|
||||
<b>{t(release.note.promiseLeadKey)}</b>{' '}
|
||||
<span>{t(release.note.promiseTextKey)}</span>
|
||||
<b>{t(release.note.promiseLeadKey)}</b> <span>{t(release.note.promiseTextKey)}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{paragraphs(t(release.note.bodyAfterKey)).map((p, i) => <p key={i}>{p}</p>)}
|
||||
{paragraphs(t(release.note.bodyAfterKey)).map((p, i) => (
|
||||
<p key={i}>{p}</p>
|
||||
))}
|
||||
|
||||
<div className="rn-closing">{t(release.note.closingKey)}</div>
|
||||
</div>
|
||||
|
||||
<div className="rn-support">
|
||||
<div className="rn-support-text">
|
||||
<b>{t(release.supportLeadKey)}</b> {t(release.supportTextKey)}
|
||||
</div>
|
||||
{release.supportLabelKey ? (
|
||||
// Set like the promise above it, so the ask reads as the same kind of statement.
|
||||
<div className="rn-promise rn-support-card">
|
||||
<div className="rn-promise-label">
|
||||
<ShieldCheck size={14} strokeWidth={2.1} aria-hidden="true" />
|
||||
{t(release.supportLabelKey)}
|
||||
</div>
|
||||
<div className="rn-promise-text">
|
||||
<b>{withSponsorLink(t(release.supportLeadKey))}</b>{' '}
|
||||
<span>{withSponsorLink(t(release.supportTextKey))}</span>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="rn-support-text">
|
||||
<b>{withSponsorLink(t(release.supportLeadKey))}</b> {withSponsorLink(t(release.supportTextKey))}
|
||||
</div>
|
||||
)}
|
||||
<div className="rn-support-buttons">
|
||||
{notice.cta && (
|
||||
<button type="button"
|
||||
<button
|
||||
type="button"
|
||||
id={`notice-cta-${notice.id}`}
|
||||
className="rn-support-btn rn-support-bmc"
|
||||
onClick={onCTA}
|
||||
@@ -173,7 +220,8 @@ export function ReleaseNoticeModal({ notice, visible, onDismiss, onCTA, onSecond
|
||||
</button>
|
||||
)}
|
||||
{notice.secondaryCta && (
|
||||
<button type="button"
|
||||
<button
|
||||
type="button"
|
||||
id={`notice-cta2-${notice.id}`}
|
||||
className="rn-support-btn rn-support-kofi"
|
||||
onClick={onSecondaryCTA}
|
||||
|
||||
@@ -1,6 +1,25 @@
|
||||
import React from 'react';
|
||||
import * as LucideIcons from 'lucide-react';
|
||||
import { Bike, Check, Footprints, Landmark, Plane, Sailboat, Snowflake, Sparkles, Star, TrendingUp } from 'lucide-react';
|
||||
import {
|
||||
Bike,
|
||||
Check,
|
||||
Clock,
|
||||
Coffee,
|
||||
Footprints,
|
||||
Globe,
|
||||
Image as ImageIcon,
|
||||
Landmark,
|
||||
MapPin,
|
||||
Phone,
|
||||
Plane,
|
||||
Sailboat,
|
||||
Search,
|
||||
Snowflake,
|
||||
Sparkles,
|
||||
Star,
|
||||
TrendingUp,
|
||||
Zap,
|
||||
} from 'lucide-react';
|
||||
import React from 'react';
|
||||
import './releaseNoticeVisuals.css';
|
||||
|
||||
/*
|
||||
@@ -127,8 +146,35 @@ function AssistantVisual() {
|
||||
|
||||
// ── Help on every screen, in 27 languages: hello in each of them, drifting by ──
|
||||
|
||||
const HELLO_A = ['Hallo', 'Bonjour', 'Hola', 'Ciao', 'Olá', 'Hej', 'Ahoj', 'Cześć', 'Szia', 'Tere', 'Salam', 'Bon dia', 'Halo'];
|
||||
const HELLO_B = ['Привіт', 'Привет', 'Γεια σου', 'مرحبا', 'こんにちは', '안녕하세요', '你好', '哈囉', 'สวัสดี', 'Xin chào', 'Merhaba', 'Dobrý deň'];
|
||||
const HELLO_A = [
|
||||
'Hallo',
|
||||
'Bonjour',
|
||||
'Hola',
|
||||
'Ciao',
|
||||
'Olá',
|
||||
'Hej',
|
||||
'Ahoj',
|
||||
'Cześć',
|
||||
'Szia',
|
||||
'Tere',
|
||||
'Salam',
|
||||
'Bon dia',
|
||||
'Halo',
|
||||
];
|
||||
const HELLO_B = [
|
||||
'Привіт',
|
||||
'Привет',
|
||||
'Γεια σου',
|
||||
'مرحبا',
|
||||
'こんにちは',
|
||||
'안녕하세요',
|
||||
'你好',
|
||||
'哈囉',
|
||||
'สวัสดี',
|
||||
'Xin chào',
|
||||
'Merhaba',
|
||||
'Dobrý deň',
|
||||
];
|
||||
|
||||
function HelloRow({ words, reverse }: { words: string[]; reverse?: boolean }) {
|
||||
// Written twice, so the row can slide by half its width and start over without a seam.
|
||||
@@ -156,19 +202,133 @@ function HelpVisual() {
|
||||
);
|
||||
}
|
||||
|
||||
// ── Place search: a query typed into the search field, the right place on top ──
|
||||
|
||||
const RESULTS: Array<{ name: string; Kind: React.ElementType; tone: string }> = [
|
||||
{ name: 'Kölner Dom', Kind: Landmark, tone: 'sight' },
|
||||
{ name: 'CGN', Kind: Plane, tone: 'air' },
|
||||
{ name: 'Café Reichard', Kind: Coffee, tone: 'food' },
|
||||
];
|
||||
|
||||
function SearchVisual() {
|
||||
return (
|
||||
<div className="rn-vis rn-vis-search">
|
||||
<div className="rn-vis-search-field">
|
||||
<Search size={10} strokeWidth={2.6} />
|
||||
<span className="rn-vis-search-query">Kölner Dom</span>
|
||||
<span className="rn-vis-search-caret" />
|
||||
</div>
|
||||
<div className="rn-vis-search-list">
|
||||
{RESULTS.map(({ name, Kind, tone }, i) => (
|
||||
<div
|
||||
key={name}
|
||||
className={i === 0 ? 'rn-vis-search-row rn-vis-search-row-top' : 'rn-vis-search-row'}
|
||||
style={{ animationDelay: `${1.3 + i * 0.16}s` }}
|
||||
>
|
||||
<span className={`rn-vis-search-pin rn-vis-search-pin-${tone}`}>
|
||||
<Kind size={8} strokeWidth={2.6} />
|
||||
</span>
|
||||
<span className="rn-vis-search-name">{name}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// ── Place details, shared: one place's details travelling out to other TREKs ──
|
||||
|
||||
const DETAILS = [Globe, Clock, Phone, ImageIcon];
|
||||
|
||||
function ShareVisual() {
|
||||
return (
|
||||
<div className="rn-vis rn-vis-share">
|
||||
<svg className="rn-vis-share-links" viewBox="0 0 200 112" preserveAspectRatio="none" aria-hidden="true">
|
||||
<path d="M82 56 C 110 56, 120 24, 156 22" />
|
||||
<path d="M82 56 C 112 56, 126 56, 160 56" />
|
||||
<path d="M82 56 C 110 56, 120 88, 156 90" />
|
||||
</svg>
|
||||
<div className="rn-vis-share-card">
|
||||
<span className="rn-vis-share-pin">
|
||||
<MapPin size={11} strokeWidth={2.4} />
|
||||
</span>
|
||||
<div className="rn-vis-share-fields">
|
||||
{DETAILS.map((Detail, i) => (
|
||||
<span key={i} className="rn-vis-share-field" style={{ animationDelay: `${0.5 + i * 0.18}s` }}>
|
||||
<Detail size={8} strokeWidth={2.4} />
|
||||
<i />
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
{['top', 'mid', 'bottom'].map((at, i) => (
|
||||
<span
|
||||
key={at}
|
||||
className={`rn-vis-share-node rn-vis-share-node-${at}`}
|
||||
style={{ animationDelay: `${1.5 + i * 0.2}s` }}
|
||||
>
|
||||
<img src="/icons/icon-white.svg" alt="" />
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// ── Routing: a day's stops joined in one go ──
|
||||
|
||||
const DAY_ROUTE = 'M16 92 C 34 78, 42 84, 56 70 S 76 40, 96 48 S 120 78, 138 62 S 160 26, 184 22';
|
||||
const DAY_STOPS: Array<[number, number]> = [
|
||||
[16, 92],
|
||||
[56, 70],
|
||||
[96, 48],
|
||||
[138, 62],
|
||||
[184, 22],
|
||||
];
|
||||
|
||||
function RoutingVisual() {
|
||||
return (
|
||||
<div className="rn-vis rn-vis-route">
|
||||
<svg className="rn-vis-route-map" viewBox="0 0 200 112" preserveAspectRatio="xMidYMid slice" aria-hidden="true">
|
||||
<path
|
||||
className="rn-vis-route-street"
|
||||
d="M0 30 L200 44 M0 76 L200 64 M40 0 L64 112 M118 0 L104 112 M168 0 L176 112"
|
||||
/>
|
||||
<path className="rn-vis-route-water" d="M0 104 C 50 96, 90 112, 140 102 S 190 98, 200 100 V112 H0 Z" />
|
||||
<path className="rn-vis-route-line" d={DAY_ROUTE} pathLength={1} />
|
||||
{DAY_STOPS.map(([cx, cy], i) => (
|
||||
<circle
|
||||
key={i}
|
||||
className="rn-vis-route-stop"
|
||||
cx={cx}
|
||||
cy={cy}
|
||||
r="4.2"
|
||||
style={{ animationDelay: `${0.3 + i * 0.22}s` }}
|
||||
/>
|
||||
))}
|
||||
</svg>
|
||||
<span className="rn-vis-route-badge">
|
||||
<Zap size={9} strokeWidth={2.6} />
|
||||
20
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const VISUALS: Record<string, () => React.ReactElement> = {
|
||||
tours: ToursVisual,
|
||||
studio: StudioVisual,
|
||||
assistant: AssistantVisual,
|
||||
help: HelpVisual,
|
||||
search: SearchVisual,
|
||||
share: ShareVisual,
|
||||
routing: RoutingVisual,
|
||||
};
|
||||
|
||||
/** The card's picture, or its icon when the release names no drawing this client knows. */
|
||||
export function ReleaseFeatureVisual({ visual, iconName }: { visual?: string; iconName: string }) {
|
||||
const Drawing = visual ? VISUALS[visual] : undefined;
|
||||
if (Drawing) return <Drawing />;
|
||||
const Icon: React.ElementType =
|
||||
((LucideIcons as Record<string, unknown>)[iconName] as React.ElementType) ?? Sparkles;
|
||||
const Icon: React.ElementType = ((LucideIcons as Record<string, unknown>)[iconName] as React.ElementType) ?? Sparkles;
|
||||
return (
|
||||
<div className="rn-vis rn-vis-icon">
|
||||
<Icon size={30} strokeWidth={1.6} aria-hidden="true" />
|
||||
|
||||
@@ -258,7 +258,7 @@
|
||||
/* Keeps the foot clear of the cards when the column has no height to spare. */
|
||||
margin-bottom: 18px;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
@@ -528,6 +528,8 @@
|
||||
background: var(--bg-hover);
|
||||
}
|
||||
|
||||
.rn-support .rn-support-card { margin-top: 0; }
|
||||
|
||||
.rn-support-text {
|
||||
font-size: 15.5px;
|
||||
line-height: 1.62;
|
||||
@@ -555,13 +557,42 @@
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
box-shadow: 0 2px 6px oklch(0 0 0 / 0.1);
|
||||
cursor: pointer;
|
||||
border: 0;
|
||||
transition: filter 0.15s ease;
|
||||
/* Glass like the promise card, tinted with each platform's colour (set below). */
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
overflow: hidden;
|
||||
background: linear-gradient(160deg,
|
||||
color-mix(in oklch, var(--rn-btn) 96%, white) 0%,
|
||||
color-mix(in oklch, var(--rn-btn) 82%, transparent) 100%);
|
||||
border: 1px solid color-mix(in oklch, var(--rn-btn) 70%, white);
|
||||
backdrop-filter: blur(16px) saturate(1.3);
|
||||
-webkit-backdrop-filter: blur(16px) saturate(1.3);
|
||||
box-shadow:
|
||||
inset 0 1px 0 oklch(1 0 0 / 0.45),
|
||||
0 12px 26px -14px color-mix(in oklch, var(--rn-btn) 80%, black);
|
||||
transition: filter 0.15s ease, transform 0.15s ease;
|
||||
}
|
||||
|
||||
.rn-support-btn:hover { filter: brightness(0.96); }
|
||||
/* The light along the top edge and the sheen in the corner, as on the promise card. */
|
||||
.rn-support-btn::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
inset-inline: 0;
|
||||
height: 1px;
|
||||
background: linear-gradient(90deg, transparent, oklch(1 0 0 / 0.75), transparent);
|
||||
}
|
||||
.rn-support-btn::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: -1;
|
||||
background: radial-gradient(120% 140% at 0% 0%, oklch(1 0 0 / 0.32) 0%, transparent 55%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.rn-support-btn:hover { filter: brightness(1.04) saturate(1.05); transform: translateY(-1px); }
|
||||
|
||||
/* The steam lifts off the cup in turn, and the heart beats. */
|
||||
.rn-coffee { overflow: visible; }
|
||||
@@ -593,11 +624,24 @@
|
||||
[data-reduce-motion='true'] .rn-heart { animation: none; }
|
||||
|
||||
/* Brand colours: Buy Me a Coffee and Ko-fi own these. */
|
||||
.rn-support-bmc { background: #ffdd00; color: #101013; } /* theme-lint-disable */
|
||||
.rn-support-kofi { background: #ff5e5b; color: #ffffff; } /* theme-lint-disable */
|
||||
.rn-support-bmc { --rn-btn: #ffdd00; color: #101013; } /* theme-lint-disable */
|
||||
.rn-support-kofi { --rn-btn: #ff5e5b; color: #ffffff; } /* theme-lint-disable */
|
||||
|
||||
/* Narrow viewports: keep the proportions, drop the outer padding. */
|
||||
@media (max-width: 900px) {
|
||||
.rn-overlay { padding: 0; }
|
||||
.rn-panel { border-radius: 0; border: 0; max-height: 100%; }
|
||||
}
|
||||
|
||||
/* The sponsor's name, linked wherever a line names it; it takes the colour of the line it sits in. */
|
||||
.rn-sponsor {
|
||||
color: inherit;
|
||||
font-weight: 600;
|
||||
text-decoration: underline;
|
||||
text-decoration-color: color-mix(in srgb, currentColor 40%, transparent);
|
||||
text-underline-offset: 3px;
|
||||
transition: text-decoration-color 160ms ease;
|
||||
}
|
||||
.rn-sponsor:hover {
|
||||
text-decoration-color: currentColor;
|
||||
}
|
||||
|
||||
@@ -536,6 +536,264 @@
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Place search: the query typed into the field, the right place on top. */
|
||||
.rn-vis-search {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
padding: 10px 11px;
|
||||
background:
|
||||
radial-gradient(110% 80% at 100% 0%, oklch(0.62 0.15 200 / 0.32) 0%, transparent 62%),
|
||||
linear-gradient(165deg, #172025 0%, #11171b 100%);
|
||||
}
|
||||
|
||||
.rn-vis-search-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
padding: 4px 8px;
|
||||
border-radius: 99px;
|
||||
background: #f5f5f7;
|
||||
color: #101013;
|
||||
font-size: 9.5px;
|
||||
font-weight: 600;
|
||||
box-shadow: 0 4px 12px oklch(0 0 0 / 0.4);
|
||||
}
|
||||
|
||||
.rn-vis-search-query {
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
max-width: 0;
|
||||
animation: rn-type 0.9s steps(10, end) 0.3s both;
|
||||
}
|
||||
|
||||
.rn-vis-search-caret {
|
||||
width: 1.5px;
|
||||
height: 10px;
|
||||
background: #0ea5e9;
|
||||
animation: rn-caret 0.9s step-end infinite;
|
||||
}
|
||||
|
||||
.rn-vis-search-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.rn-vis-search-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 3px 7px;
|
||||
border-radius: 7px;
|
||||
font-size: 9.5px;
|
||||
line-height: 1.3;
|
||||
animation: rn-rise 0.34s ease both;
|
||||
}
|
||||
|
||||
.rn-vis-search-row-top {
|
||||
background: oklch(1 0 0 / 0.1);
|
||||
border: 1px solid oklch(1 0 0 / 0.16);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.rn-vis-search-pin {
|
||||
flex: none;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
border-radius: 50%;
|
||||
color: #ffffff;
|
||||
}
|
||||
.rn-vis-search-pin-sight {
|
||||
background: #f59e0b;
|
||||
}
|
||||
.rn-vis-search-pin-air {
|
||||
background: #3b82f6;
|
||||
}
|
||||
.rn-vis-search-pin-food {
|
||||
background: #ef4444;
|
||||
}
|
||||
|
||||
.rn-vis-search-name {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
/* Place details, shared: one place's card, its details travelling out to other TREKs. */
|
||||
.rn-vis-share {
|
||||
background:
|
||||
radial-gradient(90% 90% at 25% 50%, oklch(0.66 0.16 160 / 0.3) 0%, transparent 65%),
|
||||
linear-gradient(165deg, #16211c 0%, #101814 100%);
|
||||
}
|
||||
|
||||
.rn-vis-share-links {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.rn-vis-share-links path {
|
||||
fill: none;
|
||||
stroke: oklch(0.8 0.14 160 / 0.6);
|
||||
stroke-width: 1.4;
|
||||
stroke-dasharray: 3 4;
|
||||
animation: rn-flow 1.4s linear infinite;
|
||||
}
|
||||
|
||||
.rn-vis-share-card {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
inset-inline-start: 12px;
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
padding: 6px;
|
||||
border-radius: 9px;
|
||||
background: #f5f5f7;
|
||||
color: #101013;
|
||||
transform: translateY(-50%);
|
||||
box-shadow: 0 6px 16px oklch(0 0 0 / 0.45);
|
||||
}
|
||||
|
||||
.rn-vis-share-pin {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 6px;
|
||||
background: #10b981;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.rn-vis-share-fields {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.rn-vis-share-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
color: #059669;
|
||||
animation: rn-rise 0.3s ease both;
|
||||
}
|
||||
|
||||
.rn-vis-share-field i {
|
||||
width: 22px;
|
||||
height: 3px;
|
||||
border-radius: 2px;
|
||||
background: oklch(0.4 0.02 160 / 0.35);
|
||||
}
|
||||
|
||||
.rn-vis-share-node {
|
||||
position: absolute;
|
||||
inset-inline-end: 12px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
border-radius: 7px;
|
||||
background: #101013;
|
||||
border: 1px solid oklch(1 0 0 / 0.22);
|
||||
box-shadow: 0 3px 10px oklch(0 0 0 / 0.45);
|
||||
animation: rn-pop 0.32s cubic-bezier(0.34, 1.56, 0.64, 1) both;
|
||||
}
|
||||
.rn-vis-share-node img {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
.rn-vis-share-node-top {
|
||||
top: 10%;
|
||||
}
|
||||
.rn-vis-share-node-mid {
|
||||
top: 50%;
|
||||
margin-top: -11px;
|
||||
inset-inline-end: 8px;
|
||||
}
|
||||
.rn-vis-share-node-bottom {
|
||||
bottom: 10%;
|
||||
}
|
||||
|
||||
/* Routing: a day's stops joined in one go. */
|
||||
.rn-vis-route {
|
||||
background: linear-gradient(165deg, #1b1d22 0%, #131418 100%);
|
||||
}
|
||||
|
||||
.rn-vis-route-map {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.rn-vis-route-street {
|
||||
fill: none;
|
||||
stroke: oklch(1 0 0 / 0.08);
|
||||
stroke-width: 3;
|
||||
}
|
||||
|
||||
.rn-vis-route-water {
|
||||
fill: oklch(0.55 0.1 240 / 0.28);
|
||||
}
|
||||
|
||||
.rn-vis-route-line {
|
||||
fill: none;
|
||||
stroke: #3b82f6;
|
||||
stroke-width: 3;
|
||||
stroke-linecap: round;
|
||||
stroke-dasharray: 1;
|
||||
stroke-dashoffset: 1;
|
||||
filter: drop-shadow(0 0 4px oklch(0.62 0.19 255 / 0.7));
|
||||
animation: rn-draw 1.3s cubic-bezier(0.6, 0, 0.3, 1) 0.3s forwards;
|
||||
}
|
||||
|
||||
.rn-vis-route-stop {
|
||||
fill: #f5f5f7;
|
||||
stroke: #131418;
|
||||
stroke-width: 2;
|
||||
transform-box: fill-box;
|
||||
transform-origin: center;
|
||||
animation: rn-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) both;
|
||||
}
|
||||
|
||||
.rn-vis-route-badge {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
inset-inline-start: 9px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 3px;
|
||||
padding: 2px 7px;
|
||||
border-radius: 99px;
|
||||
background: #facc15;
|
||||
color: #1a1400;
|
||||
font-size: 9.5px;
|
||||
font-weight: 800;
|
||||
font-variant-numeric: tabular-nums;
|
||||
animation: rn-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) 1.5s both;
|
||||
}
|
||||
|
||||
@keyframes rn-type {
|
||||
to {
|
||||
max-width: 80px;
|
||||
}
|
||||
}
|
||||
@keyframes rn-caret {
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@keyframes rn-flow {
|
||||
to {
|
||||
stroke-dashoffset: -14;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.rn-vis-tours-trail,
|
||||
.rn-vis-tours-flag,
|
||||
@@ -544,9 +802,24 @@
|
||||
.rn-vis-assist-typing i,
|
||||
.rn-vis-assist-row,
|
||||
.rn-vis-assist-apply,
|
||||
.rn-vis-hello-row {
|
||||
.rn-vis-hello-row,
|
||||
.rn-vis-search-query,
|
||||
.rn-vis-search-caret,
|
||||
.rn-vis-search-row,
|
||||
.rn-vis-share-links path,
|
||||
.rn-vis-share-field,
|
||||
.rn-vis-share-node,
|
||||
.rn-vis-route-line,
|
||||
.rn-vis-route-stop,
|
||||
.rn-vis-route-badge {
|
||||
animation: none;
|
||||
}
|
||||
.rn-vis-search-query {
|
||||
max-width: 80px;
|
||||
}
|
||||
.rn-vis-route-line {
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
.rn-vis-tours-trail {
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
@@ -565,10 +838,27 @@
|
||||
[data-reduce-motion='true'] .rn-vis-assist-typing i,
|
||||
[data-reduce-motion='true'] .rn-vis-assist-row,
|
||||
[data-reduce-motion='true'] .rn-vis-assist-apply,
|
||||
[data-reduce-motion='true'] .rn-vis-hello-row {
|
||||
[data-reduce-motion='true'] .rn-vis-hello-row,
|
||||
[data-reduce-motion='true'] .rn-vis-search-query,
|
||||
[data-reduce-motion='true'] .rn-vis-search-caret,
|
||||
[data-reduce-motion='true'] .rn-vis-search-row,
|
||||
[data-reduce-motion='true'] .rn-vis-share-links path,
|
||||
[data-reduce-motion='true'] .rn-vis-share-field,
|
||||
[data-reduce-motion='true'] .rn-vis-share-node,
|
||||
[data-reduce-motion='true'] .rn-vis-route-line,
|
||||
[data-reduce-motion='true'] .rn-vis-route-stop,
|
||||
[data-reduce-motion='true'] .rn-vis-route-badge {
|
||||
animation: none;
|
||||
}
|
||||
|
||||
[data-reduce-motion='true'] .rn-vis-search-query {
|
||||
max-width: 80px;
|
||||
}
|
||||
|
||||
[data-reduce-motion='true'] .rn-vis-route-line {
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
|
||||
[data-reduce-motion='true'] .rn-vis-tours-trail {
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
|
||||
Generated
+5
-5
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@trek/root",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@trek/root",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"workspaces": [
|
||||
"client",
|
||||
"server",
|
||||
@@ -29,7 +29,7 @@
|
||||
},
|
||||
"client": {
|
||||
"name": "@trek/client",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"dependencies": {
|
||||
"@assistant-ui/react": "0.15.25",
|
||||
"@fontsource/abril-fatface": "^5.3.0",
|
||||
@@ -25005,7 +25005,7 @@
|
||||
},
|
||||
"server": {
|
||||
"name": "@trek/server",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"dependencies": {
|
||||
"@aws-lite/client": "^0.23.7",
|
||||
"@aws-lite/s3": "^0.2.7",
|
||||
@@ -25384,7 +25384,7 @@
|
||||
},
|
||||
"shared": {
|
||||
"name": "@trek/shared",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"dependencies": {
|
||||
"isomorphic-dompurify": "^3.23.0",
|
||||
"zod": "^4.6.7"
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@trek/root",
|
||||
"private": true,
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"engines": {
|
||||
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
||||
},
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trek/server",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"engines": {
|
||||
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
||||
},
|
||||
|
||||
@@ -1,32 +1,124 @@
|
||||
/**
|
||||
* How this build of TREK registers with the TREK services.
|
||||
* How TREK 5.1.0 registers with the TREK services.
|
||||
*
|
||||
* Each stable release replaces this file with the one the issuer writes for
|
||||
* its version, in the version bump commit (.github/workflows/docker.yml); its
|
||||
* layout is then the generator's, so Prettier leaves it alone. Until the first
|
||||
* such release it speaks the original registration, which the issuer accepts
|
||||
* for a transition period. Renewing a key never goes through this file: an
|
||||
* installation keeps its key whatever release it runs. After a stable release,
|
||||
* merge main into dev so that dev builds register with the current dialect.
|
||||
* The issuer writes this file for each release and the release pipeline
|
||||
* commits it with the version bump. It is not edited by hand, and its layout
|
||||
* is the generator's, so Prettier leaves it alone. Renewing a key never goes
|
||||
* through it: an installation keeps its key whatever release it runs.
|
||||
*/
|
||||
import type { DialectSelfCheck, RegistrationDialect } from './registration-dialect.types';
|
||||
|
||||
const DIALECT = '0';
|
||||
const SALT = Buffer.from('trek-pow-v1', 'utf8');
|
||||
import { createHash, createHmac, pbkdf2Sync } from 'node:crypto';
|
||||
import { crc32 } from 'node:zlib';
|
||||
|
||||
const DIALECT = '_53EjggnrEZi';
|
||||
const PLATEAU_JUNIPER = Buffer.from('e0a200e6a45b6507328ae0f3a781e488ad16c4a56335d2243e6b61989149c23b', 'hex');
|
||||
const RIVER_CANAL = 'abcdefghijklmnopqrstuvwxyz234567';
|
||||
|
||||
function pier(input: Buffer, order: number[]): Buffer {
|
||||
const out = Buffer.from(input);
|
||||
order.forEach((from, to) => out.writeUInt8(input.readUInt8(from), to));
|
||||
return out;
|
||||
}
|
||||
|
||||
function kettle(value: number): Buffer {
|
||||
const out: number[] = [];
|
||||
let rest = value;
|
||||
do {
|
||||
const low = rest % 128;
|
||||
rest = Math.floor(rest / 128);
|
||||
out.push(low | (Math.sign(rest) << 7));
|
||||
} while (rest > 0);
|
||||
return Buffer.from(out);
|
||||
}
|
||||
|
||||
function sorrel(input: Buffer): string {
|
||||
const bits = [...input].map((byte) => byte.toString(2).padStart(8, '0')).join('');
|
||||
let out = '';
|
||||
for (let i = 0; i < bits.length; i += 5) {
|
||||
out += RIVER_CANAL.charAt(parseInt(bits.slice(i, i + 5).padEnd(5, '0'), 2));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function barrel(value: number): Buffer {
|
||||
const out = Buffer.alloc(4);
|
||||
out.writeUInt32BE(value >>> 0);
|
||||
return out;
|
||||
}
|
||||
|
||||
function slate7(alg: string, size: number, data: Buffer): Buffer {
|
||||
return createHash(alg, { outputLength: size }).update(data).digest();
|
||||
}
|
||||
|
||||
function lava(input: Buffer, size: number): Buffer {
|
||||
const out = Buffer.alloc(size);
|
||||
input.forEach((byte, i) => out.writeUInt8(out.readUInt8(i % size) ^ byte, i % size));
|
||||
return out;
|
||||
}
|
||||
|
||||
function candle(input: Buffer, rotation: number, consts: Buffer): Buffer {
|
||||
const out = Buffer.from(input);
|
||||
let previous = 0;
|
||||
for (let i = 0; i + 4 <= out.length; i += 4) {
|
||||
const word = (out.readUInt32LE(i) + consts.readUInt32BE(i % consts.length)) >>> 0;
|
||||
previous = (((word << rotation) | (word >>> (32 - rotation))) ^ previous) >>> 0;
|
||||
out.writeUInt32LE(previous, i);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
export const registrationDialect: RegistrationDialect = {
|
||||
id: DIALECT,
|
||||
releasedFor: 'dev',
|
||||
createdAt: '2026-10-29',
|
||||
challengePath: '/v1/register/challenge',
|
||||
registerPath: '/v1/register',
|
||||
begin({ challenge, version }) {
|
||||
releasedFor: '5.1.0',
|
||||
createdAt: '2026-10-31',
|
||||
challengePath: `/v1/register/${DIALECT}/challenge`,
|
||||
registerPath: `/v1/register/${DIALECT}`,
|
||||
begin({ challenge, version, random, nowSeconds }) {
|
||||
const zephyr = Buffer.from(challenge.c, 'utf8');
|
||||
const hollow = Buffer.from(version, 'utf8');
|
||||
const tide = createHash('sha256').update(zephyr).digest();
|
||||
const fossil = Buffer.from([0x63]);
|
||||
const delta = Buffer.concat([hollow, fossil, PLATEAU_JUNIPER, fossil, tide]);
|
||||
const cherry = createHmac('sha256', delta).update(hollow).digest();
|
||||
const barge = Buffer.from(cherry.subarray(6, 26));
|
||||
const gull = Buffer.from('b689ff5d4dbea8f47007ef8acb40fe08d6737d2627f5f206', 'hex');
|
||||
const wren = candle(candle(barge, 2, gull), 15, gull);
|
||||
return {
|
||||
work(nonce) {
|
||||
return { password: Buffer.from(`${challenge.c}.${nonce}`, 'utf8'), salt: SALT };
|
||||
const canyon = Buffer.concat([random, zephyr, hollow, Buffer.from(`${nonce}`)]);
|
||||
const pollen = Buffer.from(canyon.map((byte) => (byte * 0x73 + 62) & 0xff));
|
||||
const otter = Buffer.from([
|
||||
4, 12, 1, 5, 0xe, 8, 7, 0xd, 9, 3, 0xb, 0xa, 0, 2, 6,
|
||||
].map((from) => pollen.readUInt8(from)));
|
||||
const river5 = Buffer.concat([otter, pollen.subarray(15)]);
|
||||
const prairie = lava(river5, 20);
|
||||
const boulder = createHmac('sha384', PLATEAU_JUNIPER).update(prairie).digest();
|
||||
const jetty = pier(boulder, [
|
||||
0x16, 0, 0xd, 0xb, 18, 20, 0x15, 23, 10, 19, 8, 0x11, 4, 0xe, 2, 7, 24, 9, 0xf, 6, 3, 1, 25, 0x10, 0xc, 5,
|
||||
]);
|
||||
return { password: jetty, salt: wren };
|
||||
},
|
||||
request(nonce) {
|
||||
return { body: { c: challenge.c, nonce: String(nonce), v: version }, headers: {} };
|
||||
const slate = Buffer.concat([
|
||||
barrel(nowSeconds), Buffer.from([104]), zephyr, Buffer.from([104]), random, Buffer.from([104]), tide,
|
||||
Buffer.from([104]), PLATEAU_JUNIPER.subarray(15, 0x1b), Buffer.from([104]), kettle(nonce), Buffer.from([104]),
|
||||
hollow,
|
||||
]);
|
||||
const dawn = pbkdf2Sync(slate, random, 0x1b, 0x1d, 'sha256');
|
||||
const crane = Buffer.concat([dawn, barrel(crc32(dawn))]);
|
||||
const shore = slate7('shake256', 51, crane);
|
||||
return {
|
||||
body: {
|
||||
'glade-wisteria': String(nonce),
|
||||
'stamp-drift': challenge.c,
|
||||
jade: random.toString('hex'),
|
||||
harrier: nowSeconds,
|
||||
'apple-marble': version,
|
||||
'dew-basin': 'timber-803',
|
||||
},
|
||||
headers: { 'X-TREK-Spruce-Otter': sorrel(shore) },
|
||||
};
|
||||
},
|
||||
};
|
||||
},
|
||||
@@ -34,13 +126,13 @@ export const registrationDialect: RegistrationDialect = {
|
||||
|
||||
/** Fixed inputs and what this module must make of them; TREK's tests and release job run it. */
|
||||
export const SELF_CHECK: DialectSelfCheck = {
|
||||
challenge: { c: 'v1.selfcheck.0', alg: 'scrypt', N: 16, r: 1, p: 1, bits: 0, expires_at: 1 },
|
||||
version: 'dev',
|
||||
challenge: { c: 'v1.selfcheck._53EjggnrEZi', alg: 'scrypt', N: 16, r: 1, p: 1, bits: 0, expires_at: 1 },
|
||||
version: '5.1.0',
|
||||
random: '000102030405060708090a0b0c0d0e0f',
|
||||
nowSeconds: 1800000000,
|
||||
nonce: 41,
|
||||
inputSha256: '6da395852966856653d9efba4dd3230e31f0fa325558474c91ae719247cc20ac',
|
||||
saltSha256: '9a4f2641b36f212d95eeceb212ce3587672322074288da20da4822809816aa7b',
|
||||
scrypt: 'f3de9aab4d5d9e114d63ba51bb0c8f007a644c1e24ef7b8e4062d49e9eed5376',
|
||||
requestSha256: '840dd80c265fba34a73ff4927eaa8416aa344d32372bf4d85273bf5ce130af99',
|
||||
inputSha256: '3492823dc72bc3566dd8a483fbb041db15235d8069387e6ecd5df4b67d776a63',
|
||||
saltSha256: '91104fa382a167ba804e06ac859aff52fe9107b420c0880a1ccd319f6699bfe2',
|
||||
scrypt: '0bf159d19acf7d51c23759e1d71b5ddb9d8b974811ca3478193eca280e0a0101',
|
||||
requestSha256: '21b99ccdccc6c9ad77109170d26cd9ab3b41d2243d3e9012fdb3dbc3e69d8d9c',
|
||||
};
|
||||
|
||||
@@ -59,7 +59,7 @@ export const SYSTEM_NOTICES: SystemNotice[] = [
|
||||
titleKey: 'system_notice.release_notes.headline',
|
||||
bodyKey: 'system_notice.release_notes.intro',
|
||||
release: {
|
||||
version: '5.0.1',
|
||||
version: '5.1.0',
|
||||
eyebrowKey: 'system_notice.release_notes.eyebrow',
|
||||
headlineKey: 'system_notice.release_notes.headline',
|
||||
introKey: 'system_notice.release_notes.intro',
|
||||
@@ -67,35 +67,28 @@ export const SYSTEM_NOTICES: SystemNotice[] = [
|
||||
featuresAsideKey: 'system_notice.release_notes.features_aside',
|
||||
features: [
|
||||
{
|
||||
iconName: 'Mountain',
|
||||
visual: 'tours',
|
||||
titleKey: 'system_notice.release_notes.feature_tours_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_tours_body',
|
||||
iconName: 'Search',
|
||||
visual: 'search',
|
||||
titleKey: 'system_notice.release_notes.feature_search_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_search_body',
|
||||
},
|
||||
{
|
||||
iconName: 'BookOpen',
|
||||
visual: 'studio',
|
||||
titleKey: 'system_notice.release_notes.feature_studio_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_studio_body',
|
||||
iconName: 'Share2',
|
||||
visual: 'share',
|
||||
titleKey: 'system_notice.release_notes.feature_share_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_share_body',
|
||||
},
|
||||
{
|
||||
iconName: 'Sparkles',
|
||||
visual: 'assistant',
|
||||
titleKey: 'system_notice.release_notes.feature_assistant_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_assistant_body',
|
||||
},
|
||||
{
|
||||
iconName: 'LifeBuoy',
|
||||
visual: 'help',
|
||||
layout: 'wide',
|
||||
titleKey: 'system_notice.release_notes.feature_help_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_help_body',
|
||||
iconName: 'Route',
|
||||
visual: 'routing',
|
||||
titleKey: 'system_notice.release_notes.feature_routing_title',
|
||||
bodyKey: 'system_notice.release_notes.feature_routing_body',
|
||||
},
|
||||
],
|
||||
footnoteKey: 'system_notice.release_notes.footnote',
|
||||
notes: {
|
||||
labelKey: 'system_notice.release_notes.notes_label',
|
||||
href: 'https://github.com/liketrek/TREK/releases/tag/v5.0.1',
|
||||
href: 'https://github.com/liketrek/TREK/releases/tag/v5.1.0',
|
||||
},
|
||||
note: {
|
||||
eyebrowKey: 'system_notice.release_notes.note_eyebrow',
|
||||
@@ -107,6 +100,7 @@ export const SYSTEM_NOTICES: SystemNotice[] = [
|
||||
bodyAfterKey: 'system_notice.release_notes.note_body_after',
|
||||
closingKey: 'system_notice.release_notes.note_closing',
|
||||
},
|
||||
supportLabelKey: 'system_notice.release_notes.support_label',
|
||||
supportLeadKey: 'system_notice.release_notes.support_lead',
|
||||
supportTextKey: 'system_notice.release_notes.support_text',
|
||||
},
|
||||
|
||||
@@ -63,6 +63,8 @@ export interface NoticeRelease {
|
||||
bodyAfterKey: string;
|
||||
closingKey: string;
|
||||
};
|
||||
/** Labels the support footer as a card like the promise; without it the footer is a plain line. */
|
||||
supportLabelKey?: string;
|
||||
supportLeadKey: string;
|
||||
supportTextKey: string;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trek/shared",
|
||||
"version": "5.0.1",
|
||||
"version": "5.1.0",
|
||||
"engines": {
|
||||
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
||||
},
|
||||
|
||||
@@ -227,6 +227,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'اقتراح ميزة',
|
||||
'settings.about.featureRequestHint': 'اقترح ميزة جديدة',
|
||||
'settings.about.wikiHint': 'التوثيق والأدلة',
|
||||
'settings.about.sponsor.eyebrow': 'بنية تحتية برعاية',
|
||||
'settings.about.sponsor.title': 'خوادم TREK الخاصة تعمل على dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'يأتي البحث عن الأماكن والبحث عن العناوين وتخطيط المسارات من خوادم TREK الخاصة بدلًا من Google وأمثالها، وترعى dataforest cloud الأجهزة التي تعمل عليها.',
|
||||
'settings.about.sponsor.cta': 'زيارة dataforest cloud',
|
||||
'settings.about.sponsor.search': 'البحث عن الأماكن',
|
||||
'settings.about.sponsor.address': 'البحث عن العناوين',
|
||||
'settings.about.sponsor.routing': 'تخطيط المسارات',
|
||||
'settings.about.descriptionManaged':
|
||||
'يساعدك TREK على تنظيم رحلاتك من الفكرة الأولى حتى آخر ذكرى. تخطيط الأيام والميزانية وقوائم الأمتعة والصور وأكثر من ذلك بكثير، كل ذلك في مكان واحد.',
|
||||
'settings.about.sourceTitle': 'الشيفرة المصدرية',
|
||||
|
||||
@@ -54,23 +54,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.thank_you_support.cta_kofi': 'ادعمني على Ko-fi',
|
||||
'system_notice.pager.counter': '{current} / {total}',
|
||||
'system_notice.release_notes.eyebrow': 'تم تثبيت التحديث',
|
||||
'system_notice.release_notes.headline': 'أكبر إصدار من TREK حتى الآن.',
|
||||
'system_notice.release_notes.headline': 'المكان الصحيح، أولًا.',
|
||||
'system_notice.release_notes.intro':
|
||||
'جولات لكل يوم في الهواء الطلق، واستوديو لكتب صورك، ومساعد يخطط معك، ومساعدة في كل شاشة.',
|
||||
'يعمل البحث عن الأماكن والبحث عن العناوين وتخطيط المسارات الآن على خوادم TREK الخاصة، برعاية dataforest cloud، ويمكن لكل نسخة من TREK أن تشارك ما تعرفه عن الأماكن مع جميع النسخ الأخرى.',
|
||||
'system_notice.release_notes.features_label': 'أبرز الجديد',
|
||||
'system_notice.release_notes.features_aside': 'وهذا ليس كل شيء',
|
||||
'system_notice.release_notes.feature_tours_title': 'الجولات',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'المشي لمسافات طويلة وركوب الدراجات والجري وركوب الخيل والتجديف والتنزه في المدن وأيام التزلج، مع مخطط الارتفاعات ودرجات الصعوبة وتحليق ثلاثي الأبعاد.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'يحوّل رحلتك إلى كتاب صور مصمَّم: 17 سمة و34 خطًا و160 ملصقًا وتنسيق تلقائي بنقرة واحدة.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'المساعد الذكي',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'يخطط معك لرحلاتك الحقيقية باستخدام حساب الذكاء الاصطناعي الذي لديك بالفعل. ترى كل تغيير أولًا ويمكنك التراجع عنه.',
|
||||
'system_notice.release_notes.feature_help_title': 'مساعدة في كل شاشة، بـ27 لغة',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'نحو 370 دليلًا خطوة بخطوة مع 1600 صورة، في المكان الذي تحتاجها فيه بالضبط. جديد: الأذربيجانية والإستونية والسلوفاكية والتايلاندية.',
|
||||
'system_notice.release_notes.feature_search_title': 'بحث عن الأماكن يصيب الهدف',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'تظهر المدن والجزر والمعالم والمطارات برموزها أولًا، وتأتي المقاهي من حولك، وتظهر الاقتراحات أثناء الكتابة.',
|
||||
'system_notice.release_notes.feature_share_title': 'تفاصيل الأماكن للجميع',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'شارك المواقع الإلكترونية وساعات العمل والصور مع كل نسخ TREK، حقلًا بحقل، وتحصل أماكنك المحفوظة على ما أضافه الآخرون.',
|
||||
'system_notice.release_notes.feature_routing_title': 'تخطيط مسارات أسرع',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'يُحسب مسار يوم كامل دفعة واحدة بما يصل إلى عشرين محطة، ولم يعد مسار بطيء واحد يؤخر البقية، وتسأل وسائل النقل العام مزودًا ثانيًا عندما لا يجد الأول شيئًا.',
|
||||
'system_notice.release_notes.footnote': 'إلى جانب قائمة طويلة من التغييرات الأصغر في بقية أرجاء TREK.',
|
||||
'system_notice.release_notes.notes_label': 'ملاحظات الإصدار',
|
||||
'system_notice.release_notes.note_eyebrow': 'كلمة من صاحب المشروع',
|
||||
@@ -83,10 +80,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'ثم فتحتموه. وخلال بضعة أشهر صرتم بالآلاف: نجوم، وبلاغات أخطاء، وترجمات إلى لغات لا أتحدثها، وطلبات دمج من أشخاص لم ألتقِ بهم قط. ما زلت أتفقد المستودع أول شيء كل صباح، وما زال الأمر لا يبدو حقيقيًا تمامًا.',
|
||||
'system_notice.release_notes.note_closing': 'شكرًا لوجودك هنا. مع تحياتي، Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'صحيح أن TREK مجاني وسيبقى كذلك دائمًا، لكن الخوادم والنطاقات والكثير من الليالي المتأخرة ليست مجانية.',
|
||||
'system_notice.release_notes.support_label': 'نبقى مستقلين',
|
||||
'system_notice.release_notes.support_lead': 'بدون Google وأمثالها.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'إن كان TREK قد استحق مكانًا في رحلاتك، فاشترِ لي فنجان قهوة وساعد في أن يرى الإصدار القادم النور.',
|
||||
'يعمل البحث عن الأماكن والبحث عن العناوين وتخطيط المسارات على خوادم TREK الخاصة، برعاية dataforest cloud اليوم. أناضل من أجل ذلك كل يوم، والحفاظ عليه يحتاج إلى دعمك.',
|
||||
'system_notice.release_notes.cta_bmc': 'اشترِ لي قهوة',
|
||||
'system_notice.release_notes.cta_kofi': 'ادعمني على Ko-fi',
|
||||
};
|
||||
|
||||
@@ -305,6 +305,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Funksiya təklifi',
|
||||
'settings.about.featureRequestHint': 'Yeni funksiya təklif edin',
|
||||
'settings.about.wikiHint': 'Sənədlər və təlimatlar',
|
||||
'settings.about.sponsor.eyebrow': 'Sponsorlu infrastruktur',
|
||||
'settings.about.sponsor.title': 'TREK-in öz serverləri dataforest cloud üzərində işləyir',
|
||||
'settings.about.sponsor.body':
|
||||
'Məkan axtarışı, ünvan axtarışı və marşrutlaşdırma Google və digərlərindən deyil, TREK-in öz serverlərindən gəlir, bu serverlərin işlədiyi maşınlara isə dataforest cloud sponsorluq edir.',
|
||||
'settings.about.sponsor.cta': 'dataforest cloud-a keçin',
|
||||
'settings.about.sponsor.search': 'Məkan axtarışı',
|
||||
'settings.about.sponsor.address': 'Ünvan axtarışı',
|
||||
'settings.about.sponsor.routing': 'Marşrutlaşdırma',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK səyahətlərinizi ilk ideyadan son xatirəyədək təşkil etməyə kömək edir. Günlük planlaşdırma, büdcə, baqaj siyahıları, fotolar və daha çoxu — hamısı bir yerdə.',
|
||||
'settings.about.sourceTitle': 'Mənbə kodu',
|
||||
|
||||
@@ -54,23 +54,20 @@ const system_notice: TranslationStrings = {
|
||||
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Yeniləmə quraşdırıldı',
|
||||
'system_notice.release_notes.headline': 'İndiyədək ən böyük TREK.',
|
||||
'system_notice.release_notes.headline': 'Əvvəlcə doğru yer.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Açıq havada hər gün üçün turlar, foto kitablarınız üçün studiya, sizinlə birlikdə planlayan köməkçi və hər ekranda kömək.',
|
||||
'Məkan axtarışı, ünvan axtarışı və marşrutlaşdırma artıq dataforest cloud sponsorluğu ilə TREK-in öz serverlərində işləyir və hər TREK məkanlar haqqında bildiklərini digər bütün TREK-lərlə paylaşa bilir.',
|
||||
'system_notice.release_notes.features_label': 'Əsas yeniliklər',
|
||||
'system_notice.release_notes.features_aside': 'Bundan əlavə',
|
||||
'system_notice.release_notes.feature_tours_title': 'Turlar',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Piyada yürüşlər, velosiped turları, qaçışlar, at gəzintiləri, avarçəkmə, şəhər gəzintiləri və xizək günləri: hündürlük profili, çətinlik dərəcələri və 3D uçuşla.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Səyahəti dizayn edilmiş foto kitaba çevirir: 17 mövzu, 34 şrift, 160 stiker və bir kliklə avtomatik tərtibat.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Süni intellekt köməkçisi',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Artıq sahib olduğunuz süni intellekt hesabı ilə real səyahətlərinizi sizinlə birlikdə planlayır. Hər dəyişikliyi əvvəlcə görür və geri qaytara bilərsiniz.',
|
||||
'system_notice.release_notes.feature_help_title': 'Hər ekranda kömək, 27 dildə',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Təxminən 370 addım-addım bələdçi və 1600 şəkil, məhz lazım olduğu yerdə. Yeni dillər: Azərbaycan, eston, slovak və tay dilləri.',
|
||||
'system_notice.release_notes.feature_search_title': 'Dəqiq tapan məkan axtarışı',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Şəhərlər, adalar, görməli yerlər və kodu ilə axtarılan hava limanları birinci gəlir, kafelər ətrafınızdan seçilir, təkliflər isə siz yazdıqca görünür.',
|
||||
'system_notice.release_notes.feature_share_title': 'Paylaşılan məkan təfərrüatları',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Veb saytları, iş saatlarını və fotoları sahə-sahə hər TREK ilə paylaşın, saxladığınız məkanlar isə başqalarının əlavə etdiklərini alır.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Daha sürətli marşrutlaşdırma',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Bütöv bir gün iyirmiyə qədər dayanacaqla bir dəfəyə marşrutlanır, bir yavaş marşrut artıq digərlərini ləngitmir, ictimai nəqliyyat isə birinci provayder heç nə tapmayanda ikinci provayderə müraciət edir.',
|
||||
'system_notice.release_notes.footnote': 'Bundan əlavə, TREK-in digər bölmələrində çoxsaylı kiçik dəyişikliklər var.',
|
||||
'system_notice.release_notes.notes_label': 'Buraxılış qeydləri',
|
||||
'system_notice.release_notes.note_eyebrow': 'Layihə rəhbərindən qeyd',
|
||||
@@ -84,10 +81,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Sonra siz gəldiniz. Bir neçə ay ərzində minlərlə oldunuz: ulduzlar, xəta bildirişləri, bilmədiyim dillərə tərcümələr və heç vaxt görüşmədiyim insanlardan pull request-lər. Mən hələ də hər səhər ilk olaraq reyestri yoxlayıram və bunlar hələ də tamamilə real görünmür.',
|
||||
'system_notice.release_notes.note_closing': 'Burada olduğunuz üçün təşəkkür edirəm. — Maurice',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK pulsuzdur və həmişə belə qalacaq, lakin serverlər, domenlər və çoxsaylı gecə işləri pulsuz deyil.',
|
||||
'system_notice.release_notes.support_label': 'Müstəqil qalmaq',
|
||||
'system_notice.release_notes.support_lead': 'Google və başqaları olmadan.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'TREK səyahətlərinizdə öz yerini qazanıbsa, mənə qəhvə alın və növbəti buraxılışın hazırlanmasına kömək edin.',
|
||||
'Məkan axtarışı, ünvan axtarışı və marşrutlaşdırma TREK-in öz serverlərində işləyir, bu gün dataforest cloud sponsorluğu ilə. Mən bunun üçün hər gün mübarizə aparıram və belə qalması sizin dəstəyinizdən asılıdır.',
|
||||
'system_notice.release_notes.cta_bmc': 'Mənə qəhvə al',
|
||||
'system_notice.release_notes.cta_kofi': 'Ko-fi-da dəstəklə',
|
||||
'system_notice.pager.prev': 'Əvvəlki bildiriş',
|
||||
|
||||
@@ -128,6 +128,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Solicitar recurso',
|
||||
'settings.about.featureRequestHint': 'Sugira um novo recurso',
|
||||
'settings.about.wikiHint': 'Documentação e guias',
|
||||
'settings.about.sponsor.eyebrow': 'Infraestrutura patrocinada',
|
||||
'settings.about.sponsor.title': 'Os servidores do TREK rodam na dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'A busca de lugares, a busca de endereços e o cálculo de rotas vêm dos servidores do próprio TREK em vez do Google e afins, e a dataforest cloud patrocina as máquinas onde eles rodam.',
|
||||
'settings.about.sponsor.cta': 'Conhecer a dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Busca de lugares',
|
||||
'settings.about.sponsor.address': 'Busca de endereços',
|
||||
'settings.about.sponsor.routing': 'Rotas',
|
||||
'settings.about.descriptionManaged':
|
||||
'O TREK ajuda você a organizar suas viagens, da primeira ideia à última lembrança. Planejamento diário, orçamento, listas de bagagem, fotos e muito mais, tudo em um só lugar.',
|
||||
'settings.about.sourceTitle': 'Código-fonte',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'A atualização 3.0.14 detectou um ou mais conflitos de nome de usuário ou e-mail causados por espaços em branco no início ou fim dos valores armazenados. As contas afetadas foram renomeadas automaticamente. Verifique os logs do servidor por linhas começando com **[migration] WHITESPACE COLLISION** para identificar quais contas precisam de revisão.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Atualização instalada',
|
||||
'system_notice.release_notes.headline': 'O maior TREK até hoje.',
|
||||
'system_notice.release_notes.headline': 'O lugar certo, primeiro.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Passeios para cada dia ao ar livre, um estúdio para os seus fotolivros, um assistente que planeja com você e ajuda em cada tela.',
|
||||
'A busca de lugares, a busca de endereços e o cálculo de rotas agora rodam nos servidores do próprio TREK, patrocinados pela dataforest cloud, e cada TREK pode compartilhar o que sabe sobre lugares com todos os outros.',
|
||||
'system_notice.release_notes.features_label': 'Os destaques',
|
||||
'system_notice.release_notes.features_aside': 'E não é só isso',
|
||||
'system_notice.release_notes.feature_tours_title': 'Passeios',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Trilhas, pedaladas, corridas, cavalgadas, canoagem, caminhadas urbanas e dias de esqui, com perfil de altitude, graus de dificuldade e sobrevoo em 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Transforma uma viagem em um fotolivro diagramado: 17 temas, 34 fontes, 160 adesivos e diagramação automática em um clique.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Assistente de IA',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planeja com você nas suas viagens de verdade, usando a conta de IA que você já tem. Você vê cada mudança antes e pode desfazê-la.',
|
||||
'system_notice.release_notes.feature_help_title': 'Ajuda em cada tela, em 27 idiomas',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Cerca de 370 guias passo a passo com 1.600 imagens, bem onde você precisa. Novos: azerbaijano, estoniano, eslovaco e tailandês.',
|
||||
'system_notice.release_notes.feature_search_title': 'Uma busca de lugares que acerta',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Cidades, ilhas, pontos turísticos e aeroportos pelo código aparecem primeiro, os cafés vêm da sua região e as sugestões surgem enquanto você digita.',
|
||||
'system_notice.release_notes.feature_share_title': 'Detalhes de lugares, compartilhados',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Compartilhe sites, horários de funcionamento e fotos com todo TREK, campo por campo, e os seus lugares salvos recebem o que outros adicionaram.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Rotas mais rápidas',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Um dia inteiro é calculado de uma vez com até vinte paradas, uma rota lenta não segura mais as outras e o transporte público consulta um segundo provedor quando o primeiro não encontra nada.',
|
||||
'system_notice.release_notes.footnote': 'E ainda uma longa lista de mudanças menores em todo o resto do TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Notas da versão',
|
||||
'system_notice.release_notes.note_eyebrow': 'Uma nota do mantenedor',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'E aí vocês abriram. Em poucos meses eram milhares: estrelas, relatos de bugs, traduções para idiomas que eu não falo, pull requests de pessoas que nunca conheci. Até hoje a primeira coisa que faço toda manhã é olhar o repositório, e ainda não parece totalmente real.',
|
||||
'system_notice.release_notes.note_closing': 'Obrigado por estarem aqui. Um abraço, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'O TREK é gratuito e sempre vai ser, mas servidores, domínios e muitas noites em claro não são.',
|
||||
'system_notice.release_notes.support_label': 'Seguir independente',
|
||||
'system_notice.release_notes.support_lead': 'Sem Google e companhia.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Se o TREK ganhou um lugar nas suas viagens, me pague um café e ajude a fazer a próxima versão acontecer.',
|
||||
'A busca de lugares, a busca de endereços e o cálculo de rotas rodam nos servidores do próprio TREK, hoje patrocinados pela dataforest cloud. Eu luto por isso todos os dias, e para continuar assim preciso do seu apoio.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Apoiar no Ko-fi',
|
||||
};
|
||||
|
||||
@@ -195,6 +195,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Sol·licita una funció',
|
||||
'settings.about.featureRequestHint': 'Suggereix una funció nova',
|
||||
'settings.about.wikiHint': 'Documentació i guies',
|
||||
'settings.about.sponsor.eyebrow': 'Infraestructura patrocinada',
|
||||
'settings.about.sponsor.title': 'Els servidors de TREK funcionen a dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'La cerca de llocs, la cerca d’adreces i el càlcul de rutes surten de servidors propis de TREK en lloc de Google i companyia, i dataforest cloud patrocina les màquines on funcionen.',
|
||||
'settings.about.sponsor.cta': 'Visita dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Cerca de llocs',
|
||||
'settings.about.sponsor.address': 'Cerca d’adreces',
|
||||
'settings.about.sponsor.routing': 'Rutes',
|
||||
'settings.about.descriptionManaged':
|
||||
"TREK t'ajuda a organitzar els teus viatges des de la primera idea fins al darrer record. Planificació de dies, pressupost, llistes d'equipatge, fotos i molt més, tot en un sol lloc.",
|
||||
'settings.about.sourceTitle': 'Codi font',
|
||||
|
||||
@@ -56,21 +56,18 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.thank_you_support.cta_bmc': 'Buy Me a Coffee',
|
||||
'system_notice.thank_you_support.cta_kofi': 'Dona suport a Ko-fi',
|
||||
'system_notice.release_notes.eyebrow': 'Actualització instal·lada',
|
||||
'system_notice.release_notes.headline': 'El TREK més gran fins ara.',
|
||||
'system_notice.release_notes.headline': 'El lloc correcte, primer.',
|
||||
'system_notice.release_notes.features_label': 'Els protagonistes',
|
||||
'system_notice.release_notes.features_aside': 'I això no és tot',
|
||||
'system_notice.release_notes.feature_tours_title': 'Excursions',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Excursions a peu, en bici, curses, sortides a cavall, rem, passejades per la ciutat i dies d’esquí, amb perfil d’altitud, graus de dificultat i sobrevol en 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Converteix un viatge en un fotollibre dissenyat: 17 temes, 34 tipografies, 160 adhesius i maquetació automàtica amb un clic.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Assistent d’IA',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planifica amb tu sobre els teus viatges reals, amb el compte d’IA que ja tens. Cada canvi es mostra primer i es pot desfer.',
|
||||
'system_notice.release_notes.feature_help_title': 'Ajuda a cada pantalla, en 27 idiomes',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Unes 370 guies pas a pas amb 1.600 imatges, just on les necessites. Novetat: azerbaidjanès, estonià, eslovac i tai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Una cerca de llocs que l’encerta',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Ciutats, illes, monuments i aeroports pel seu codi surten primer, les cafeteries surten del teu voltant i els suggeriments apareixen mentre escrius.',
|
||||
'system_notice.release_notes.feature_share_title': 'Detalls dels llocs, compartits',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Comparteix webs, horaris i fotos amb cada TREK, camp per camp, i els teus llocs desats s’omplen amb el que altres han afegit.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Rutes més ràpides',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Un dia sencer es calcula d’una tirada amb fins a vint parades, una ruta lenta ja no frena les altres i el transport públic consulta un segon proveïdor quan el primer no troba res.',
|
||||
'system_notice.release_notes.footnote': 'I una llarga llista de canvis més petits a la resta de TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Notes de la versió',
|
||||
'system_notice.release_notes.note_eyebrow': 'Una nota del mantenidor',
|
||||
@@ -84,13 +81,13 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
"I llavors el vau obrir. En pocs mesos éreu milers: estrelles, informes d'errors, traduccions a llengües que no parlo, pull requests de gent que no he conegut mai. El primer que faig cada matí continua sent mirar el repositori, i encara em costa creure-m'ho.",
|
||||
'system_notice.release_notes.note_closing': 'Gràcies per ser aquí. Una abraçada, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK és gratuït i ho serà sempre, però els servidors, els dominis i tantes nits llargues no ho són.',
|
||||
'system_notice.release_notes.support_label': 'Continuar independents',
|
||||
'system_notice.release_notes.support_lead': 'Sense Google i companyia.',
|
||||
'system_notice.release_notes.support_text':
|
||||
"Si s'ha guanyat un lloc als teus viatges, convida'm a un cafè i ajuda a fer que arribi la propera versió.",
|
||||
'La cerca de llocs, la cerca d’adreces i el càlcul de rutes funcionen en servidors propis de TREK, avui patrocinats per dataforest cloud. Hi lluito cada dia, i perquè continuï així cal el teu suport.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Dona suport a Ko-fi',
|
||||
'system_notice.release_notes.intro':
|
||||
'Excursions per a cada dia a l’aire lliure, un estudi per als teus fotollibres, un assistent que planifica amb tu i ajuda a cada pantalla.',
|
||||
'La cerca de llocs, la cerca d’adreces i el càlcul de rutes ara funcionen en servidors propis de TREK, patrocinats per dataforest cloud, i cada TREK pot compartir el que sap dels llocs amb tots els altres.',
|
||||
};
|
||||
export default system_notice;
|
||||
|
||||
@@ -209,6 +209,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Navrhnout funkci',
|
||||
'settings.about.featureRequestHint': 'Navrhněte novou funkci',
|
||||
'settings.about.wikiHint': 'Dokumentace a návody',
|
||||
'settings.about.sponsor.eyebrow': 'Sponzorovaná infrastruktura',
|
||||
'settings.about.sponsor.title': 'Vlastní servery TREK běží na dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Hledání míst, hledání adres a trasy pocházejí z vlastních serverů TREK místo od Google a spol. a stroje, na kterých běží, sponzoruje dataforest cloud.',
|
||||
'settings.about.sponsor.cta': 'Navštívit dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Hledání míst',
|
||||
'settings.about.sponsor.address': 'Hledání adres',
|
||||
'settings.about.sponsor.routing': 'Trasy',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK vám pomáhá organizovat cesty od prvního nápadu po poslední vzpomínku. Plánování dnů, rozpočet, balicí seznamy, fotky a mnohem víc, vše na jednom místě.',
|
||||
'settings.about.sourceTitle': 'Zdrojový kód',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'Aktualizace 3.0.14 zjistila jeden nebo více konfliktů uživatelského jména nebo e-mailu způsobených mezerami na začátku nebo konci uložených hodnot. Dotčené účty byly automaticky přejmenovány. Zkontrolujte protokoly serveru na řádky začínající **[migration] WHITESPACE COLLISION** a zjistěte, které účty vyžadují kontrolu.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Aktualizace nainstalována',
|
||||
'system_notice.release_notes.headline': 'Největší TREK, jaký kdy byl.',
|
||||
'system_notice.release_notes.headline': 'Správné místo, hned napoprvé.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Výlety na každý den venku, studio pro vaše fotoknihy, asistent, který plánuje s vámi, a nápověda na každé obrazovce.',
|
||||
'Hledání míst, hledání adres a plánování tras teď běží na vlastních serverech TREK, které sponzoruje dataforest cloud, a každý TREK může sdílet, co ví o místech, se všemi ostatními.',
|
||||
'system_notice.release_notes.features_label': 'Hlavní novinky',
|
||||
'system_notice.release_notes.features_aside': 'Zdaleka ne všechno',
|
||||
'system_notice.release_notes.feature_tours_title': 'Výlety',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Túry, cyklovýlety, běhy, vyjížďky na koni, pádlování, procházky městem a dny na lyžích, s výškovým profilem, obtížností a 3D přeletem.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Promění cestu v navrženou fotoknihu: 17 motivů, 34 písem, 160 samolepek a automatické rozvržení jedním kliknutím.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI asistent',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Plánuje s vámi vaše skutečné cesty, přes účet AI, který už máte. Každou změnu nejdřív uvidíte a můžete ji vrátit.',
|
||||
'system_notice.release_notes.feature_help_title': 'Nápověda na každé obrazovce, ve 27 jazycích',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Asi 370 návodů krok za krokem s 1 600 obrázky, přesně tam, kde je potřebujete. Nově: ázerbájdžánština, estonština, slovenština a thajština.',
|
||||
'system_notice.release_notes.feature_search_title': 'Hledání míst, které se trefí',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Města, ostrovy, památky a letiště podle kódu jsou na prvním místě, kavárny se hledají ve vašem okolí a návrhy se objevují už během psaní.',
|
||||
'system_notice.release_notes.feature_share_title': 'Sdílené podrobnosti o místech',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Sdílejte weby, otevírací dobu a fotky se všemi TREK, pole po poli, a vaše uložená místa převezmou, co doplnili ostatní.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Rychlejší trasy',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Celý den se naplánuje najednou až s dvaceti zastávkami, jedna pomalá trasa už nezdrží ostatní a veřejná doprava se zeptá druhého poskytovatele, když první nic nenajde.',
|
||||
'system_notice.release_notes.footnote': 'A k tomu dlouhý seznam menších změn napříč zbytkem TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Poznámky k vydání',
|
||||
'system_notice.release_notes.note_eyebrow': 'Slovo od autora',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'A pak jste ho otevřeli. Během pár měsíců vás byly tisíce: hvězdičky, hlášení chyb, překlady do jazyků, kterými nemluvím, pull requesty od lidí, které jsem nikdy nepotkal. Každé ráno se pořád nejdřív podívám do repozitáře a pořád mi to nepřijde úplně skutečné.',
|
||||
'system_notice.release_notes.note_closing': 'Děkuji, že jste tady. Váš Maurice',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK je a vždycky bude zdarma, ale servery, domény a spousta pozdních nocí zdarma nejsou.',
|
||||
'system_notice.release_notes.support_label': 'Zůstat nezávislý',
|
||||
'system_notice.release_notes.support_lead': 'Bez Google a spol.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Pokud si TREK získal místo na vašich cestách, kupte mi kávu a pomozte, aby přišlo i další vydání.',
|
||||
'Hledání míst, hledání adres a trasy běží na vlastních serverech TREK, dnes sponzorovaných společností dataforest cloud. Bojuji za to každý den a aby to tak zůstalo, potřebuji vaši podporu.',
|
||||
'system_notice.release_notes.cta_bmc': 'Kup mi kávu',
|
||||
'system_notice.release_notes.cta_kofi': 'Podpořit na Ko-fi',
|
||||
};
|
||||
|
||||
@@ -214,6 +214,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Feature vorschlagen',
|
||||
'settings.about.featureRequestHint': 'Schlage ein neues Feature vor',
|
||||
'settings.about.wikiHint': 'Dokumentation & Anleitungen',
|
||||
'settings.about.sponsor.eyebrow': 'Gesponserte Infrastruktur',
|
||||
'settings.about.sponsor.title': 'TREKs eigene Server laufen bei dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Ortssuche, Adresssuche und Routing kommen von TREKs eigenen Servern statt von Google und Co., und dataforest cloud sponsert die Maschinen, auf denen sie laufen.',
|
||||
'settings.about.sponsor.cta': 'dataforest cloud besuchen',
|
||||
'settings.about.sponsor.search': 'Ortssuche',
|
||||
'settings.about.sponsor.address': 'Adresssuche',
|
||||
'settings.about.sponsor.routing': 'Routing', // same-as-en
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK hilft dir, deine Reisen von der ersten Idee bis zur letzten Erinnerung zu organisieren. Tagesplanung, Budget, Packlisten, Fotos und vieles mehr, alles an einem Ort.',
|
||||
'settings.about.sourceTitle': 'Quellcode',
|
||||
|
||||
@@ -57,23 +57,20 @@ const system_notice: TranslationStrings = {
|
||||
'Das 3.0.14-Upgrade hat einen oder mehrere Konflikte bei Benutzernamen oder E-Mail-Adressen festgestellt, die durch führende oder nachgestellte Leerzeichen in gespeicherten Konten verursacht wurden. Betroffene Konten wurden automatisch umbenannt. Prüfe die Serverprotokolle auf Zeilen, die mit **[migration] WHITESPACE COLLISION** beginnen, um die betroffenen Konten zu identifizieren.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Update installiert',
|
||||
'system_notice.release_notes.headline': 'Das größte TREK bisher.',
|
||||
'system_notice.release_notes.headline': 'Der richtige Ort, zuerst.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Touren für jeden Tag draußen, ein Studio für deine Fotobücher, ein Assistent, der mit dir plant, und Hilfe auf jedem Bildschirm.',
|
||||
'Ortssuche, Adresssuche und Routing laufen jetzt auf TREKs eigenen Servern, gesponsert von dataforest cloud, und jedes TREK kann sein Wissen über Orte mit allen anderen teilen.',
|
||||
'system_notice.release_notes.features_label': 'Die Highlights',
|
||||
'system_notice.release_notes.features_aside': 'Längst nicht alles',
|
||||
'system_notice.release_notes.feature_tours_title': 'Touren',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Wanderungen, Radtouren, Läufe, Ausritte, Paddeltouren, Stadtspaziergänge und Skitage, mit Höhenprofil, Schwierigkeitsgraden und 3D-Überflug.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Macht aus einer Reise ein gestaltetes Fotobuch: 17 Themes, 34 Schriften, 160 Sticker und Auto-Layout mit einem Klick.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'KI-Assistent',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Plant mit dir an deinen echten Reisen, über das KI-Konto, das du schon hast. Jede Änderung siehst du vorher und kannst sie rückgängig machen.',
|
||||
'system_notice.release_notes.feature_help_title': 'Hilfe auf jedem Bildschirm, in 27 Sprachen',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Rund 370 Schritt-für-Schritt-Anleitungen mit 1.600 Bildern, genau dort, wo du sie brauchst. Neu: Aserbaidschanisch, Estnisch, Slowakisch und Thai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Ortssuche, die trifft',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Städte, Inseln, Sehenswürdigkeiten und Flughäfen per Code stehen oben, Cafés kommen aus deiner Nähe, und Vorschläge erscheinen schon beim Tippen.',
|
||||
'system_notice.release_notes.feature_share_title': 'Ortsdetails, geteilt',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Teile Websites, Öffnungszeiten und Fotos Feld für Feld mit jedem TREK, und deine gespeicherten Orte übernehmen, was andere ergänzt haben.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Schnelleres Routing',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Ein ganzer Tag wird mit bis zu zwanzig Stopps in einem Zug berechnet, eine langsame Route hält den Rest nicht mehr auf, und ÖPNV fragt einen zweiten Anbieter, wenn der erste nichts findet.',
|
||||
'system_notice.release_notes.footnote': 'Dazu kommt eine lange Liste kleinerer Änderungen überall sonst in TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Release Notes',
|
||||
'system_notice.release_notes.note_eyebrow': 'Ein Wort vom Maintainer',
|
||||
@@ -87,10 +84,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Dann kamt ihr. Innerhalb weniger Monate wart ihr Tausende: Sterne, Bug-Reports, Übersetzungen in Sprachen, die ich nicht spreche, Pull Requests von Leuten, die ich nie getroffen habe. Ich schaue noch immer jeden Morgen als Erstes ins Repository, und so richtig real fühlt es sich bis heute nicht an.',
|
||||
'system_notice.release_notes.note_closing': 'Danke, dass du dabei bist. Viele Grüße, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK ist kostenlos und wird es immer bleiben, aber Server, Domains und viele späte Nächte sind es nicht.',
|
||||
'system_notice.release_notes.support_label': 'Unabhängig bleiben',
|
||||
'system_notice.release_notes.support_lead': 'Ohne Google und Co.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Wenn TREK sich einen Platz auf deinen Reisen verdient hat, spendier mir einen Kaffee und hilf mit, dass auch das nächste Release kommt.',
|
||||
'Ortssuche, Adresssuche und Routing laufen auf TREKs eigenen Servern, heute gesponsert von dataforest cloud. Dafür kämpfe ich jeden Tag, und damit es so bleibt, braucht es deine Unterstützung.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Ko-fi unterstützen',
|
||||
};
|
||||
|
||||
@@ -273,6 +273,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Feature Request',
|
||||
'settings.about.featureRequestHint': 'Suggest a new feature',
|
||||
'settings.about.wikiHint': 'Documentation & guides',
|
||||
'settings.about.sponsor.eyebrow': 'Sponsored infrastructure',
|
||||
'settings.about.sponsor.title': "TREK's own servers run on dataforest cloud",
|
||||
'settings.about.sponsor.body':
|
||||
"Place search, address search and routing come from TREK's own servers instead of Google and co., and dataforest cloud sponsors the machines they run on.",
|
||||
'settings.about.sponsor.cta': 'Visit dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Place search',
|
||||
'settings.about.sponsor.address': 'Address search',
|
||||
'settings.about.sponsor.routing': 'Routing',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place.',
|
||||
'settings.about.sourceTitle': 'Source code',
|
||||
|
||||
@@ -52,23 +52,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.thank_you_support.cta_kofi': 'Support on Ko-fi',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Update installed',
|
||||
'system_notice.release_notes.headline': 'The biggest TREK yet.',
|
||||
'system_notice.release_notes.headline': 'The right place, first.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Tours for every kind of day outdoors, a studio for your photo books, an assistant that plans with you, and help on every screen.',
|
||||
"Place search, address search and routing now run on TREK's own servers, sponsored by dataforest cloud, and every TREK can share what it knows about places with all the others.",
|
||||
'system_notice.release_notes.features_label': 'The headliners',
|
||||
'system_notice.release_notes.features_aside': 'Far from everything',
|
||||
'system_notice.release_notes.feature_tours_title': 'Tours',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Hikes, bike tours, runs, rides, paddling, city walks and ski days, with an elevation profile, grades and a 3D flyover.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio',
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Turns a journey into a designed photo book: 17 themes, 34 typefaces, 160 stickers and auto layout in one click.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI Assistant',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Plans with you on your real trips, using the AI account you already have. You see every change first and can undo it.',
|
||||
'system_notice.release_notes.feature_help_title': 'Help on every screen, in 27 languages',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'About 370 step-by-step guides with 1,600 pictures, right where you need them. New: Azerbaijani, Estonian, Slovak and Thai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Place search that gets it right',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Cities, islands, landmarks and airports by their code come first, cafés come from around you, and suggestions appear while you type.',
|
||||
'system_notice.release_notes.feature_share_title': 'Place details, shared',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Share websites, opening hours and photos with every TREK, field by field, and your saved places pick up what others added.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Faster routing',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'A whole day routes in one go with up to twenty stops, one slow route no longer holds up the rest, and transit asks a second provider when the first finds nothing.',
|
||||
'system_notice.release_notes.footnote': 'Plus a long list of smaller changes across the rest of TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Release notes',
|
||||
'system_notice.release_notes.note_eyebrow': 'A note from the maintainer',
|
||||
@@ -82,10 +79,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Then you did. Within a few months there were thousands of you: stars, bug reports, translations into languages I do not speak, pull requests from people I have never met. I still check the repository first thing every morning, and it still does not quite feel real.',
|
||||
'system_notice.release_notes.note_closing': 'Thank you for being here, from Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK is free and always will be, but servers, domains and a lot of late nights are not.',
|
||||
'system_notice.release_notes.support_label': 'Staying independent',
|
||||
'system_notice.release_notes.support_lead': 'Without Google and co.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'If it has earned a place in your trips, buy me a coffee and help keep the next release coming.',
|
||||
"Place search, address search and routing run on TREK's own servers, sponsored by dataforest cloud today. I fight for that every day, and keeping it that way takes your support.",
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Support on Ko-fi',
|
||||
'system_notice.pager.prev': 'Previous notice',
|
||||
|
||||
@@ -213,6 +213,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Solicitar función',
|
||||
'settings.about.featureRequestHint': 'Sugiere una nueva función',
|
||||
'settings.about.wikiHint': 'Documentación y guías',
|
||||
'settings.about.sponsor.eyebrow': 'Infraestructura patrocinada',
|
||||
'settings.about.sponsor.title': 'Los servidores de TREK funcionan en dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'La búsqueda de lugares, la búsqueda de direcciones y el cálculo de rutas salen de servidores propios de TREK en lugar de Google y compañía, y dataforest cloud patrocina las máquinas en las que funcionan.',
|
||||
'settings.about.sponsor.cta': 'Visitar dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Búsqueda de lugares',
|
||||
'settings.about.sponsor.address': 'Búsqueda de direcciones',
|
||||
'settings.about.sponsor.routing': 'Rutas',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK te ayuda a organizar tus viajes desde la primera idea hasta el último recuerdo. Planificación de días, presupuesto, listas de equipaje, fotos y mucho más, todo en un solo lugar.',
|
||||
'settings.about.sourceTitle': 'Código fuente',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'La actualización 3.0.14 detectó uno o más conflictos de nombre de usuario o correo electrónico causados por espacios en blanco al inicio o al final de los valores almacenados. Las cuentas afectadas se renombraron automáticamente. Revisa los registros del servidor en busca de líneas que empiecen por **[migration] WHITESPACE COLLISION** para identificar qué cuentas necesitan revisión.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Actualización instalada',
|
||||
'system_notice.release_notes.headline': 'El TREK más grande hasta ahora.',
|
||||
'system_notice.release_notes.headline': 'El lugar correcto, primero.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Excursiones para cada día al aire libre, un estudio para tus fotolibros, un asistente que planifica contigo y ayuda en cada pantalla.',
|
||||
'La búsqueda de lugares, la búsqueda de direcciones y el cálculo de rutas funcionan ahora en servidores propios de TREK, patrocinados por dataforest cloud, y cada TREK puede compartir lo que sabe de los lugares con todos los demás.',
|
||||
'system_notice.release_notes.features_label': 'Los protagonistas',
|
||||
'system_notice.release_notes.features_aside': 'Y eso no es todo',
|
||||
'system_notice.release_notes.feature_tours_title': 'Excursiones',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Senderismo, bici, carreras, rutas a caballo, piragüismo, paseos urbanos y días de esquí, con perfil de altitud, grados de dificultad y sobrevuelo en 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Convierte un viaje en un fotolibro diseñado: 17 temas, 34 tipografías, 160 pegatinas y maquetación automática con un clic.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Asistente de IA',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planifica contigo sobre tus viajes reales, con la cuenta de IA que ya tienes. Cada cambio se muestra primero y se puede deshacer.',
|
||||
'system_notice.release_notes.feature_help_title': 'Ayuda en cada pantalla, en 27 idiomas',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Unas 370 guías paso a paso con 1600 imágenes, justo donde las necesitas. Novedad: azerí, estonio, eslovaco y tailandés.',
|
||||
'system_notice.release_notes.feature_search_title': 'Una búsqueda de lugares que acierta',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Ciudades, islas, monumentos y aeropuertos por su código aparecen primero, las cafeterías salen de tu alrededor y las sugerencias aparecen mientras escribes.',
|
||||
'system_notice.release_notes.feature_share_title': 'Detalles de lugares, compartidos',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Comparte webs, horarios y fotos con cada TREK, campo por campo, y tus lugares guardados se completan con lo que otros han añadido.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Rutas más rápidas',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Un día entero se calcula de una vez con hasta veinte paradas, una ruta lenta ya no frena a las demás y el transporte público consulta a un segundo proveedor cuando el primero no encuentra nada.',
|
||||
'system_notice.release_notes.footnote': 'Y una larga lista de cambios más pequeños en el resto de TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Notas de versión',
|
||||
'system_notice.release_notes.note_eyebrow': 'Una nota del desarrollador',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Y entonces lo abristeis. En pocos meses erais miles: estrellas, informes de errores, traducciones a idiomas que no hablo, pull requests de gente a la que nunca he conocido. Lo primero que hago cada mañana sigue siendo mirar el repositorio, y todavía me cuesta creérmelo.',
|
||||
'system_notice.release_notes.note_closing': 'Gracias por estar aquí. Un abrazo, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK es gratis y siempre lo será, pero los servidores, los dominios y tantas noches en vela no lo son.',
|
||||
'system_notice.release_notes.support_label': 'Seguir siendo independiente',
|
||||
'system_notice.release_notes.support_lead': 'Sin Google y compañía.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Si se ha ganado un sitio en tus viajes, invítame a un café y ayuda a que llegue la próxima versión.',
|
||||
'La búsqueda de lugares, la búsqueda de direcciones y el cálculo de rutas funcionan en servidores propios de TREK, hoy patrocinados por dataforest cloud. Lucho por ello cada día, y para que siga así hace falta tu apoyo.',
|
||||
'system_notice.release_notes.cta_bmc': 'Invítame a un café',
|
||||
'system_notice.release_notes.cta_kofi': 'Apóyame en Ko-fi',
|
||||
};
|
||||
|
||||
@@ -279,6 +279,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Funktsioonisoov',
|
||||
'settings.about.featureRequestHint': 'Paku välja uus funktsioon',
|
||||
'settings.about.wikiHint': 'Dokumentatsioon ja juhendid',
|
||||
'settings.about.sponsor.eyebrow': 'Sponsoreeritud taristu',
|
||||
'settings.about.sponsor.title': 'TREKi enda serverid töötavad dataforest cloud platvormil',
|
||||
'settings.about.sponsor.body':
|
||||
"Kohaotsing, aadressiotsing ja teekonnad tulevad TREKi enda serveritest, mitte Google'ilt ja teistelt, ning masinaid, millel need töötavad, sponsoreerib dataforest cloud.",
|
||||
'settings.about.sponsor.cta': 'Ava dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Kohaotsing',
|
||||
'settings.about.sponsor.address': 'Aadressiotsing',
|
||||
'settings.about.sponsor.routing': 'Teekonnad',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK aitab korraldada reise esimesest ideest viimase mälestuseni. Päevaplaanid, eelarve, pakkimisnimekirjad, fotod ja palju muud — kõik ühes kohas.',
|
||||
'settings.about.sourceTitle': 'Lähtekood',
|
||||
|
||||
@@ -52,23 +52,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.thank_you_support.cta_kofi': 'Toeta Ko-fi kaudu',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Uuendus paigaldatud',
|
||||
'system_notice.release_notes.headline': 'Kõigi aegade suurim TREK.',
|
||||
'system_notice.release_notes.headline': 'Õige koht, kõige ees.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Retked igaks päevaks looduses, stuudio sinu fotoraamatutele, assistent, kes planeerib koos sinuga, ja abi igal ekraanil.',
|
||||
'Kohaotsing, aadressiotsing ja teekonnad töötavad nüüd TREKi enda serverites, mida toetab dataforest cloud, ja iga TREK saab jagada oma teadmisi kohtade kohta kõigi teistega.',
|
||||
'system_notice.release_notes.features_label': 'Peamised uuendused',
|
||||
'system_notice.release_notes.features_aside': 'See pole kaugeltki kõik',
|
||||
'system_notice.release_notes.feature_tours_title': 'Retked',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Matkad, rattaretked, jooksud, ratsaretked, aerutamine, linnajalutuskäigud ja suusapäevad, kõrgusprofiili, raskusastmete ja 3D-ülelennuga.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Teeb reisist kujundatud fotoraamatu: 17 teemat, 34 kirjatüüpi, 160 kleebist ja automaatne paigutus ühe klõpsuga.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Tehisintellekti assistent',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planeerib koos sinuga sinu päris reise, kasutades sinu olemasolevat tehisintellekti kontot. Iga muudatust näed enne ja saad selle tagasi võtta.',
|
||||
'system_notice.release_notes.feature_help_title': 'Abi igal ekraanil, 27 keeles',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Umbes 370 samm-sammult juhendit 1600 pildiga, just seal, kus neid vajad. Uued keeled: aserbaidžaani, eesti, slovaki ja tai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Kohaotsing, mis tabab täppi',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Linnad, saared, vaatamisväärsused ja koodi järgi otsitud lennujaamad tulevad esimesena, kohvikud leitakse sinu lähedusest ja soovitused ilmuvad juba kirjutamise ajal.',
|
||||
'system_notice.release_notes.feature_share_title': 'Jagatud kohaandmed',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Jaga veebilehti, lahtiolekuaegu ja fotosid iga TREKiga, välja kaupa, ja sinu salvestatud kohad saavad juurde selle, mida teised lisasid.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Kiiremad teekonnad',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Terve päeva teekond arvutatakse korraga kuni kahekümne peatusega, üks aeglane teekond ei pidurda enam teisi ja ühistranspordi puhul küsitakse teiselt teenusepakkujalt, kui esimene midagi ei leia.',
|
||||
'system_notice.release_notes.footnote': 'Lisaks pikk loend väiksemaid muudatusi mujal TREKis.',
|
||||
'system_notice.release_notes.notes_label': 'Väljalaskemärkmed',
|
||||
'system_notice.release_notes.note_eyebrow': 'Sõnum hooldajalt',
|
||||
@@ -82,10 +79,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Ja siis te avasitegi. Mõne kuuga oli teid tuhandeid: tähed, veateated, tõlked keeltesse, mida ma ei räägi, ja kooditäiendused inimestelt, keda ma pole kunagi kohanud. Vaatan ikka igal hommikul esimese asjana koodihoidlat ja see tundub endiselt veidi uskumatu.',
|
||||
'system_notice.release_notes.note_closing': 'Aitäh, et oled siin. Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK on ja jääb tasuta, kuid serverid, domeenid ja paljud hilised tööõhtud ei ole tasuta.',
|
||||
'system_notice.release_notes.support_label': 'Jääme sõltumatuks',
|
||||
'system_notice.release_notes.support_lead': "Ilma Google'i ja teisteta.",
|
||||
'system_notice.release_notes.support_text':
|
||||
'Kui TREK on leidnud koha sinu reisides, osta mulle kohv ja aita järgmisel väljalaskel valmida.',
|
||||
'Kohaotsing, aadressiotsing ja teekonnad töötavad TREKi enda serverites, mida täna toetab dataforest cloud. Võitlen selle eest iga päev ja et see nii jääks, vajan sinu tuge.',
|
||||
'system_notice.release_notes.cta_bmc': 'Osta mulle kohv',
|
||||
'system_notice.release_notes.cta_kofi': 'Toeta Ko-fi kaudu',
|
||||
'system_notice.pager.prev': 'Eelmine teade',
|
||||
|
||||
@@ -215,6 +215,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Proposer une fonctionnalité',
|
||||
'settings.about.featureRequestHint': 'Suggérez une nouvelle fonctionnalité',
|
||||
'settings.about.wikiHint': 'Documentation et guides',
|
||||
'settings.about.sponsor.eyebrow': 'Infrastructure sponsorisée',
|
||||
'settings.about.sponsor.title': 'Les serveurs de TREK tournent sur dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'La recherche de lieux, la recherche d’adresses et le calcul d’itinéraires passent par les propres serveurs de TREK plutôt que par Google et consorts, et dataforest cloud sponsorise les machines qui les font tourner.',
|
||||
'settings.about.sponsor.cta': 'Découvrir dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Recherche de lieux',
|
||||
'settings.about.sponsor.address': 'Recherche d’adresses',
|
||||
'settings.about.sponsor.routing': 'Itinéraires',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK vous aide à organiser vos voyages, de la première idée au dernier souvenir. Planning des jours, budget, listes de bagages, photos et bien plus, tout au même endroit.',
|
||||
'settings.about.sourceTitle': 'Code source',
|
||||
|
||||
@@ -55,23 +55,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.v3014_whitespace_collision.body':
|
||||
"La mise à niveau 3.0.14 a détecté un ou plusieurs conflits de nom d'utilisateur ou d'adresse e-mail causés par des espaces en début ou en fin de valeur dans les comptes enregistrés. Les comptes concernés ont été renommés automatiquement. Consultez les journaux du serveur pour les lignes commençant par **[migration] WHITESPACE COLLISION** afin d'identifier les comptes nécessitant une vérification.",
|
||||
'system_notice.release_notes.eyebrow': 'Mise à jour installée',
|
||||
'system_notice.release_notes.headline': 'Le plus grand TREK à ce jour.',
|
||||
'system_notice.release_notes.headline': 'Le bon endroit, en premier.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Des sorties pour chaque journée en plein air, un studio pour vos livres photo, un assistant qui planifie avec vous et de l’aide sur chaque écran.',
|
||||
'La recherche de lieux, la recherche d’adresses et le calcul d’itinéraires tournent désormais sur les propres serveurs de TREK, sponsorisés par dataforest cloud, et chaque TREK peut partager ce qu’il sait des lieux avec tous les autres.',
|
||||
'system_notice.release_notes.features_label': "Les têtes d'affiche",
|
||||
'system_notice.release_notes.features_aside': "Et ce n'est pas tout",
|
||||
'system_notice.release_notes.feature_tours_title': 'Sorties',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Randonnées, vélo, course à pied, équitation, pagaie, balades en ville et journées de ski, avec profil altimétrique, cotations et survol en 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Transforme un voyage en livre photo mis en page : 17 thèmes, 34 polices, 160 autocollants et une mise en page automatique en un clic.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Assistant IA',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planifie avec vous sur vos vrais voyages, avec le compte IA que vous avez déjà. Chaque modification s’affiche d’abord et peut être annulée.',
|
||||
'system_notice.release_notes.feature_help_title': 'De l’aide sur chaque écran, en 27 langues',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Environ 370 guides pas à pas et 1 600 images, là où vous en avez besoin. Nouveau : azerbaïdjanais, estonien, slovaque et thaï.',
|
||||
'system_notice.release_notes.feature_search_title': 'Une recherche de lieux qui vise juste',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Villes, îles, monuments et aéroports par leur code passent en premier, les cafés viennent de près de chez vous, et les suggestions s’affichent pendant la saisie.',
|
||||
'system_notice.release_notes.feature_share_title': 'Des détails de lieux, partagés',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Partagez sites web, horaires d’ouverture et photos avec chaque TREK, champ par champ, et vos lieux enregistrés récupèrent ce que d’autres ont ajouté.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Des itinéraires plus rapides',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Une journée entière se calcule d’un coup avec jusqu’à vingt étapes, un itinéraire lent ne bloque plus les autres, et les transports en commun interrogent un second fournisseur quand le premier ne trouve rien.',
|
||||
'system_notice.release_notes.footnote': 'Et une longue liste de changements plus discrets dans le reste de TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Notes de version',
|
||||
'system_notice.release_notes.note_eyebrow': 'Un mot du mainteneur',
|
||||
@@ -85,10 +82,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
"Et puis vous l'avez ouvert. En quelques mois, vous étiez des milliers : des étoiles, des rapports de bugs, des traductions dans des langues que je ne parle pas, des pull requests de personnes que je n'ai jamais rencontrées. Chaque matin, la première chose que je fais est encore d'aller voir le dépôt, et j'ai toujours du mal à y croire.",
|
||||
'system_notice.release_notes.note_closing': "Merci d'être là. Amicalement, Maurice.",
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK est gratuit et le restera toujours, mais les serveurs, les noms de domaine et toutes ces nuits blanches, eux, ne le sont pas.',
|
||||
'system_notice.release_notes.support_label': 'Rester indépendant',
|
||||
'system_notice.release_notes.support_lead': 'Sans Google et compagnie.',
|
||||
'system_notice.release_notes.support_text':
|
||||
"Si TREK s'est fait une place dans tes voyages, offre-moi un café et aide la prochaine version à voir le jour.",
|
||||
'La recherche de lieux, la recherche d’adresses et le calcul d’itinéraires tournent sur les propres serveurs de TREK, aujourd’hui sponsorisés par dataforest cloud. Je me bats pour cela chaque jour, et pour que ça dure, j’ai besoin de votre soutien.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Soutenir sur Ko-fi',
|
||||
};
|
||||
|
||||
@@ -275,6 +275,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Αίτημα Λειτουργίας',
|
||||
'settings.about.featureRequestHint': 'Προτείνετε ένα νέο χαρακτηριστικό',
|
||||
'settings.about.wikiHint': 'Τεκμηρίωση & οδηγοί',
|
||||
'settings.about.sponsor.eyebrow': 'Χορηγούμενη υποδομή',
|
||||
'settings.about.sponsor.title': 'Οι δικοί διακομιστές του TREK τρέχουν στο dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Η αναζήτηση τοποθεσιών, η αναζήτηση διευθύνσεων και η δρομολόγηση προέρχονται από τους δικούς διακομιστές του TREK αντί για την Google και τους ομοίους της, και το dataforest cloud χορηγεί τα μηχανήματα στα οποία τρέχουν.',
|
||||
'settings.about.sponsor.cta': 'Επισκεφθείτε το dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Αναζήτηση τοποθεσιών',
|
||||
'settings.about.sponsor.address': 'Αναζήτηση διευθύνσεων',
|
||||
'settings.about.sponsor.routing': 'Δρομολόγηση',
|
||||
'settings.about.descriptionManaged':
|
||||
'Το TREK σας βοηθά να οργανώνετε τα ταξίδια σας από την πρώτη ιδέα μέχρι την τελευταία ανάμνηση. Σχεδιασμός ημερών, προϋπολογισμός, λίστες αποσκευών, φωτογραφίες και πολλά ακόμη, όλα σε ένα μέρος.',
|
||||
'settings.about.sourceTitle': 'Πηγαίος κώδικας',
|
||||
|
||||
@@ -57,23 +57,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.pager.goto': 'Μετάβαση στην ειδοποίηση {n}',
|
||||
'system_notice.pager.position': 'Ειδοποίηση {current} από {total}',
|
||||
'system_notice.release_notes.eyebrow': 'Ενημερώθηκε',
|
||||
'system_notice.release_notes.headline': 'Το μεγαλύτερο TREK μέχρι σήμερα.',
|
||||
'system_notice.release_notes.headline': 'Πρώτα το σωστό μέρος.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Εκδρομές για κάθε μέρα στη φύση, ένα στούντιο για τα φωτοβιβλία σας, ένας βοηθός που σχεδιάζει μαζί σας και βοήθεια σε κάθε οθόνη.',
|
||||
'Η αναζήτηση τοποθεσιών, η αναζήτηση διευθύνσεων και η δρομολόγηση τρέχουν πλέον στους δικούς διακομιστές του TREK, με χορηγία της dataforest cloud, και κάθε TREK μπορεί να μοιράζεται όσα ξέρει για τα μέρη με όλα τα άλλα.',
|
||||
'system_notice.release_notes.features_label': 'Τα σημαντικότερα',
|
||||
'system_notice.release_notes.features_aside': 'Και δεν είναι μόνο αυτά',
|
||||
'system_notice.release_notes.feature_tours_title': 'Εκδρομές',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Πεζοπορίες, ποδηλατάδες, τρέξιμο, ιππασία, κουπί, βόλτες στην πόλη και μέρες σκι, με υψομετρικό προφίλ, βαθμούς δυσκολίας και τρισδιάστατη πτήση.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Μετατρέπει ένα ταξίδι σε σχεδιασμένο φωτοβιβλίο: 17 θέματα, 34 γραμματοσειρές, 160 αυτοκόλλητα και αυτόματη σελιδοποίηση με ένα κλικ.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Βοηθός τεχνητής νοημοσύνης',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Σχεδιάζει μαζί σας τα πραγματικά σας ταξίδια, με τον λογαριασμό τεχνητής νοημοσύνης που ήδη έχετε. Κάθε αλλαγή τη βλέπετε πρώτα και μπορείτε να την αναιρέσετε.',
|
||||
'system_notice.release_notes.feature_help_title': 'Βοήθεια σε κάθε οθόνη, σε 27 γλώσσες',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Περίπου 370 οδηγοί βήμα προς βήμα με 1.600 εικόνες, εκεί που τις χρειάζεστε. Νέες γλώσσες: αζερικά, εσθονικά, σλοβακικά και ταϊλανδικά.',
|
||||
'system_notice.release_notes.feature_search_title': 'Αναζήτηση τοποθεσιών που πετυχαίνει',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Πόλεις, νησιά, αξιοθέατα και αεροδρόμια με τον κωδικό τους βγαίνουν πρώτα, τα καφέ έρχονται από την περιοχή σας και οι προτάσεις εμφανίζονται όσο πληκτρολογείτε.',
|
||||
'system_notice.release_notes.feature_share_title': 'Λεπτομέρειες τοποθεσιών, για όλους',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Μοιραστείτε ιστοσελίδες, ωράρια λειτουργίας και φωτογραφίες με κάθε TREK, πεδίο προς πεδίο, και οι αποθηκευμένες τοποθεσίες σας παίρνουν όσα πρόσθεσαν άλλοι.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Ταχύτερη δρομολόγηση',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Μια ολόκληρη μέρα δρομολογείται μονομιάς με έως είκοσι στάσεις, μια αργή διαδρομή δεν καθυστερεί πια τις υπόλοιπες, και τα μέσα μαζικής μεταφοράς ρωτούν δεύτερο πάροχο όταν ο πρώτος δεν βρίσκει τίποτα.',
|
||||
'system_notice.release_notes.footnote': 'Και ακόμη μια μεγάλη λίστα με μικρότερες αλλαγές σε όλο το υπόλοιπο TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Σημειώσεις έκδοσης',
|
||||
'system_notice.release_notes.note_eyebrow': 'Μια σημείωση από τον δημιουργό',
|
||||
@@ -87,10 +84,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Και τότε το ανοίξατε. Μέσα σε λίγους μήνες γίνατε χιλιάδες: αστέρια, αναφορές σφαλμάτων, μεταφράσεις σε γλώσσες που δεν μιλάω, pull requests από ανθρώπους που δεν έχω γνωρίσει ποτέ. Ακόμα ανοίγω το αποθετήριο πρώτο πράγμα κάθε πρωί, και ακόμα δεν μου φαίνεται εντελώς αληθινό.',
|
||||
'system_notice.release_notes.note_closing': 'Σας ευχαριστώ που είστε εδώ. Φιλικά, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'Το TREK είναι δωρεάν και θα είναι πάντα, όμως οι servers, τα domains και τα πολλά ξενύχτια δεν είναι.',
|
||||
'system_notice.release_notes.support_label': 'Μένουμε ανεξάρτητοι',
|
||||
'system_notice.release_notes.support_lead': 'Χωρίς Google και σία.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Αν έχει κερδίσει μια θέση στα ταξίδια σας, κεράστε με έναν καφέ και βοηθήστε να έρθει η επόμενη έκδοση.',
|
||||
'Η αναζήτηση τοποθεσιών, η αναζήτηση διευθύνσεων και η δρομολόγηση τρέχουν στους δικούς διακομιστές του TREK, σήμερα με χορηγία της dataforest cloud. Το παλεύω κάθε μέρα, και για να μείνει έτσι χρειάζομαι τη στήριξή σας.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Στηρίξτε στο Ko-fi',
|
||||
};
|
||||
|
||||
@@ -265,6 +265,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'בקשת תכונה',
|
||||
'settings.about.featureRequestHint': 'הציעו תכונה חדשה',
|
||||
'settings.about.wikiHint': 'תיעוד ומדריכים',
|
||||
'settings.about.sponsor.eyebrow': 'תשתית בחסות',
|
||||
'settings.about.sponsor.title': 'השרתים של TREK עצמו רצים על dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'חיפוש מקומות, חיפוש כתובות וניתוב מגיעים מהשרתים של TREK עצמו במקום מ-Google ודומיה, ו-dataforest cloud נותנת חסות למכונות שעליהן הם רצים.',
|
||||
'settings.about.sponsor.cta': 'בקרו ב-dataforest cloud',
|
||||
'settings.about.sponsor.search': 'חיפוש מקומות',
|
||||
'settings.about.sponsor.address': 'חיפוש כתובות',
|
||||
'settings.about.sponsor.routing': 'ניתוב',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK עוזר לכם לארגן את הטיולים מהרעיון הראשון ועד הזיכרון האחרון. תכנון ימים, תקציב, רשימות אריזה, תמונות ועוד — הכל במקום אחד.',
|
||||
'settings.about.sourceTitle': 'קוד מקור',
|
||||
|
||||
@@ -50,23 +50,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.thank_you_support.cta_bmc': 'Buy Me a Coffee',
|
||||
'system_notice.thank_you_support.cta_kofi': 'תמיכה ב-Ko-fi',
|
||||
'system_notice.release_notes.eyebrow': 'העדכון הותקן',
|
||||
'system_notice.release_notes.headline': 'ה-TREK הגדול ביותר עד היום.',
|
||||
'system_notice.release_notes.headline': 'קודם כל, המקום הנכון.',
|
||||
'system_notice.release_notes.intro':
|
||||
'מסלולים לכל סוג של יום בחוץ, סטודיו לאלבומי התמונות שלכם, עוזר שמתכנן איתכם, ועזרה בכל מסך.',
|
||||
'חיפוש מקומות, חיפוש כתובות וניתוב פועלים עכשיו על השרתים של TREK עצמו, בחסות dataforest cloud, וכל TREK יכול לשתף את מה שהוא יודע על מקומות עם כל השאר.',
|
||||
'system_notice.release_notes.features_label': 'החידושים המרכזיים',
|
||||
'system_notice.release_notes.features_aside': 'ולא רק',
|
||||
'system_notice.release_notes.feature_tours_title': 'מסלולים',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'טיולים רגליים, רכיבות אופניים, ריצות, נסיעות, חתירה, סיורים עירוניים וימי סקי, עם פרופיל גובה, שיפועים וטיסה תלת-ממדית מעל המסלול.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio',
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'הופך יומן מסע לאלבום תמונות מעוצב: 17 ערכות נושא, 34 גופנים, 160 מדבקות ופריסה אוטומטית בלחיצה אחת.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'עוזר AI',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'מתכנן איתכם את הטיולים האמיתיים שלכם, עם חשבון ה-AI שכבר יש לכם. אתם רואים כל שינוי קודם ויכולים לבטל אותו.',
|
||||
'system_notice.release_notes.feature_help_title': 'עזרה בכל מסך, ב-27 שפות',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'כ-370 מדריכים צעד אחר צעד עם 1,600 תמונות, בדיוק במקום שבו צריך אותם. חדש: אזרית, אסטונית, סלובקית ותאית.',
|
||||
'system_notice.release_notes.feature_search_title': 'חיפוש מקומות שקולע',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'ערים, איים, אתרים מפורסמים ושדות תעופה לפי הקוד שלהם מופיעים ראשונים, בתי קפה מגיעים מהסביבה שלכם, והצעות מופיעות תוך כדי הקלדה.',
|
||||
'system_notice.release_notes.feature_share_title': 'פרטי מקומות, משותפים',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'שתפו אתרים, שעות פתיחה ותמונות עם כל TREK, שדה אחר שדה, והמקומות השמורים שלכם מקבלים את מה שאחרים הוסיפו.',
|
||||
'system_notice.release_notes.feature_routing_title': 'ניתוב מהיר יותר',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'יום שלם מנותב בבת אחת עם עד עשרים עצירות, מסלול איטי אחד כבר לא מעכב את השאר, ותחבורה ציבורית פונה לספק שני כשהראשון לא מוצא כלום.',
|
||||
'system_notice.release_notes.footnote': 'ועוד רשימה ארוכה של שינויים קטנים בכל שאר TREK.',
|
||||
'system_notice.release_notes.notes_label': 'הערות גרסה',
|
||||
'system_notice.release_notes.note_eyebrow': 'מילה מהמתחזק',
|
||||
@@ -79,8 +76,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'ואז אתם הגעתם. תוך כמה חודשים הייתם אלפים: כוכבים, דיווחי באגים, תרגומים לשפות שאני לא מדבר, בקשות משיכה מאנשים שמעולם לא פגשתי. אני עדיין בודק את המאגר דבר ראשון כל בוקר, וזה עדיין לא לגמרי מרגיש אמיתי.',
|
||||
'system_notice.release_notes.note_closing': 'תודה שאתם כאן, מ-Maurice.',
|
||||
'system_notice.release_notes.support_lead': 'TREK חינמי ותמיד יהיה, אבל שרתים, דומיינים והרבה לילות מאוחרים — לא.',
|
||||
'system_notice.release_notes.support_text': 'אם הוא הרוויח מקום בטיולים שלכם, קנו לי קפה ועזרו לגרסה הבאה להגיע.',
|
||||
'system_notice.release_notes.support_label': 'נשארים עצמאיים',
|
||||
'system_notice.release_notes.support_lead': "בלי Google ושות'.",
|
||||
'system_notice.release_notes.support_text':
|
||||
'חיפוש מקומות, חיפוש כתובות וניתוב פועלים על השרתים של TREK עצמו, היום בחסות dataforest cloud. אני נלחם על זה כל יום, וכדי שזה יישאר כך אני צריך את התמיכה שלכם.',
|
||||
'system_notice.release_notes.cta_bmc': 'קנו לי קפה',
|
||||
'system_notice.release_notes.cta_kofi': 'תמיכה ב-Ko-fi',
|
||||
'system_notice.pager.prev': 'ההודעה הקודמת',
|
||||
|
||||
@@ -212,6 +212,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Funkció javaslat',
|
||||
'settings.about.featureRequestHint': 'Javasolj egy új funkciót',
|
||||
'settings.about.wikiHint': 'Dokumentáció és útmutatók',
|
||||
'settings.about.sponsor.eyebrow': 'Szponzorált infrastruktúra',
|
||||
'settings.about.sponsor.title': 'A TREK saját szerverei a dataforest cloud gépein futnak',
|
||||
'settings.about.sponsor.body':
|
||||
'A helykeresés, a címkeresés és az útvonaltervezés a TREK saját szervereiről érkezik a Google és társai helyett, a gépeket pedig, amelyeken futnak, a dataforest cloud szponzorálja.',
|
||||
'settings.about.sponsor.cta': 'dataforest cloud megnyitása',
|
||||
'settings.about.sponsor.search': 'Helykeresés',
|
||||
'settings.about.sponsor.address': 'Címkeresés',
|
||||
'settings.about.sponsor.routing': 'Útvonaltervezés',
|
||||
'settings.about.descriptionManaged':
|
||||
'A TREK segít megszervezni az utazásaidat az első ötlettől az utolsó emlékig. Napi tervezés, költségvetés, csomagolólisták, fotók és még sok más, egy helyen.',
|
||||
'settings.about.sourceTitle': 'Forráskód',
|
||||
|
||||
@@ -55,23 +55,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.v3014_whitespace_collision.body':
|
||||
'A 3.0.14-es frissítés egy vagy több felhasználónév- vagy e-mail-ütközést észlelt, amelyeket a tárolt értékek elején vagy végén lévő szóközök okoztak. Az érintett fiókok automatikusan át lettek nevezve. Ellenőrizze a szervernaplókat a **[migration] WHITESPACE COLLISION** kezdetű soroknál a felülvizsgálatot igénylő fiókok azonosításához.',
|
||||
'system_notice.release_notes.eyebrow': 'Frissítés telepítve',
|
||||
'system_notice.release_notes.headline': 'Az eddigi legnagyobb TREK.',
|
||||
'system_notice.release_notes.headline': 'Elsőre a jó hely.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Túrák minden szabadban töltött napra, stúdió a fotókönyveidhez, asszisztens, amely veled együtt tervez, és súgó minden képernyőn.',
|
||||
'A helykeresés, a címkeresés és az útvonaltervezés mostantól a TREK saját szerverein fut, a dataforest cloud támogatásával, és minden TREK megoszthatja a helyekről szerzett tudását az összes többivel.',
|
||||
'system_notice.release_notes.features_label': 'A fő újdonságok',
|
||||
'system_notice.release_notes.features_aside': 'És ez még nem minden',
|
||||
'system_notice.release_notes.feature_tours_title': 'Túrák',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Gyalogtúrák, kerékpártúrák, futások, lovaglások, evezés, városi séták és síelős napok, magassági profillal, nehézségi fokozatokkal és 3D-s átrepüléssel.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Egy utazásból megtervezett fotókönyvet készít: 17 téma, 34 betűtípus, 160 matrica és automatikus elrendezés egy kattintással.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'MI-asszisztens',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Veled együtt tervez a valódi utazásaidon, a már meglévő MI-fiókoddal. Minden módosítást előbb látsz, és vissza is vonhatod.',
|
||||
'system_notice.release_notes.feature_help_title': 'Súgó minden képernyőn, 27 nyelven',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Körülbelül 370 lépésről lépésre útmutató 1600 képpel, pont ott, ahol szükséged van rájuk. Új: azerbajdzsáni, észt, szlovák és thai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Helykeresés, ami eltalálja',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'A városok, szigetek, látnivalók és a kódjukkal keresett repülőterek kerülnek előre, a kávézók a környékedről jönnek, a javaslatok pedig már gépelés közben megjelennek.',
|
||||
'system_notice.release_notes.feature_share_title': 'Megosztott helyadatok',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Oszd meg a weboldalakat, a nyitvatartást és a fotókat minden TREK-kel, mezőnként, a mentett helyeid pedig megkapják, amit mások hozzáadtak.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Gyorsabb útvonaltervezés',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Egy egész nap egyszerre tervezhető, akár húsz megállóval, egy lassú útvonal már nem tartja fel a többit, a tömegközlekedés pedig egy második szolgáltatót is megkérdez, ha az első semmit sem talál.',
|
||||
'system_notice.release_notes.footnote': 'Plusz rengeteg kisebb változás a TREK többi részében.',
|
||||
'system_notice.release_notes.notes_label': 'Kiadási jegyzetek',
|
||||
'system_notice.release_notes.note_eyebrow': 'Egy szó a fejlesztőtől',
|
||||
@@ -85,10 +82,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Aztán megnyitottátok. Néhány hónap alatt több ezren lettetek: csillagok, hibajelentések, fordítások olyan nyelvekre, amelyeket nem beszélek, pull requestek olyanoktól, akikkel sosem találkoztam. Még mindig a repóval kezdem minden reggelt, és még mindig nem egészen tűnik valóságosnak.',
|
||||
'system_notice.release_notes.note_closing': 'Köszönöm, hogy itt vagy. Maurice',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'A TREK ingyenes, és mindig az is marad, de a szerverek, a domainek és a sok késő éjszaka nem azok.',
|
||||
'system_notice.release_notes.support_label': 'A függetlenségért',
|
||||
'system_notice.release_notes.support_lead': 'Google és társai nélkül.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Ha kiérdemelt egy helyet az utazásaid között, hívj meg egy kávéra, és segíts, hogy jöhessen a következő kiadás.',
|
||||
'A helykeresés, a címkeresés és az útvonaltervezés a TREK saját szerverein fut, ma a dataforest cloud támogatásával. Minden nap küzdök ezért, és hogy így is maradjon, szükségem van a támogatásodra.',
|
||||
'system_notice.release_notes.cta_bmc': 'Vegyél nekem egy kávét',
|
||||
'system_notice.release_notes.cta_kofi': 'Támogass a Ko-fi-n',
|
||||
};
|
||||
|
||||
@@ -262,6 +262,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Permintaan Fitur',
|
||||
'settings.about.featureRequestHint': 'Sarankan fitur baru',
|
||||
'settings.about.wikiHint': 'Dokumentasi & panduan',
|
||||
'settings.about.sponsor.eyebrow': 'Infrastruktur bersponsor',
|
||||
'settings.about.sponsor.title': 'Server milik TREK sendiri berjalan di dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Pencarian tempat, pencarian alamat, dan perutean berasal dari server milik TREK sendiri, bukan dari Google dan sejenisnya, dan dataforest cloud mensponsori mesin tempat server itu berjalan.',
|
||||
'settings.about.sponsor.cta': 'Kunjungi dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Pencarian tempat',
|
||||
'settings.about.sponsor.address': 'Pencarian alamat',
|
||||
'settings.about.sponsor.routing': 'Perutean',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK membantumu mengatur perjalanan dari ide pertama sampai kenangan terakhir. Perencanaan harian, anggaran, daftar bawaan, foto, dan banyak lagi, semua di satu tempat.',
|
||||
'settings.about.sourceTitle': 'Kode sumber',
|
||||
|
||||
@@ -55,23 +55,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.v3014_whitespace_collision.body':
|
||||
'Pembaruan 3.0.14 mendeteksi satu atau lebih konflik nama pengguna atau email yang disebabkan oleh spasi di awal atau akhir nilai yang tersimpan. Akun yang terpengaruh telah diganti nama secara otomatis. Periksa log server untuk baris yang dimulai dengan **[migration] WHITESPACE COLLISION** guna mengidentifikasi akun mana yang perlu ditinjau.',
|
||||
'system_notice.release_notes.eyebrow': 'Pembaruan terpasang',
|
||||
'system_notice.release_notes.headline': 'TREK terbesar sejauh ini.',
|
||||
'system_notice.release_notes.headline': 'Tempat yang tepat, lebih dulu.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Tur untuk setiap hari di alam terbuka, studio untuk buku foto Anda, asisten yang merencanakan bersama Anda, dan bantuan di setiap layar.',
|
||||
'Pencarian tempat, pencarian alamat, dan perutean kini berjalan di server milik TREK sendiri, disponsori oleh dataforest cloud, dan setiap TREK bisa berbagi apa yang diketahuinya tentang tempat dengan semua TREK lainnya.',
|
||||
'system_notice.release_notes.features_label': 'Sorotan utama',
|
||||
'system_notice.release_notes.features_aside': 'Masih banyak lagi',
|
||||
'system_notice.release_notes.feature_tours_title': 'Tur',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Pendakian, bersepeda, lari, berkuda, mendayung, jalan kaki di kota, dan hari bermain ski, dengan profil ketinggian, tingkat kesulitan, dan terbang lintas 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Mengubah perjalanan menjadi buku foto yang tertata: 17 tema, 34 jenis huruf, 160 stiker, dan tata letak otomatis dalam satu klik.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Asisten AI',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Merencanakan bersama Anda di perjalanan nyata Anda, dengan akun AI yang sudah Anda miliki. Setiap perubahan tampil lebih dulu dan bisa dibatalkan.',
|
||||
'system_notice.release_notes.feature_help_title': 'Bantuan di setiap layar, dalam 27 bahasa',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Sekitar 370 panduan langkah demi langkah dengan 1.600 gambar, tepat di tempat Anda membutuhkannya. Baru: Azerbaijan, Estonia, Slowakia, dan Thai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Pencarian tempat yang tepat sasaran',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Kota, pulau, landmark, dan bandara berdasarkan kodenya muncul lebih dulu, kafe diambil dari sekitar Anda, dan saran muncul saat Anda mengetik.',
|
||||
'system_notice.release_notes.feature_share_title': 'Detail tempat, dibagikan',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Bagikan situs web, jam buka, dan foto dengan setiap TREK, kolom demi kolom, dan tempat tersimpan Anda ikut mendapatkan apa yang ditambahkan orang lain.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Perutean lebih cepat',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Satu hari penuh dirutekan sekaligus dengan hingga dua puluh perhentian, satu rute yang lambat tidak lagi menahan yang lain, dan transportasi umum bertanya ke penyedia kedua saat yang pertama tidak menemukan apa pun.',
|
||||
'system_notice.release_notes.footnote': 'Ditambah deretan panjang perubahan kecil di bagian TREK lainnya.',
|
||||
'system_notice.release_notes.notes_label': 'Catatan rilis',
|
||||
'system_notice.release_notes.note_eyebrow': 'Catatan dari maintainer',
|
||||
@@ -85,10 +82,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Lalu kalian datang. Dalam beberapa bulan saja jumlah kalian sudah ribuan: bintang, laporan bug, terjemahan ke bahasa yang tidak saya kuasai, pull request dari orang-orang yang belum pernah saya temui. Sampai sekarang, hal pertama yang saya lakukan setiap pagi masih membuka repositori, dan rasanya masih belum sepenuhnya nyata.',
|
||||
'system_notice.release_notes.note_closing': 'Terima kasih telah berada di sini. Salam hangat, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK gratis dan akan selalu begitu, tetapi server, domain, dan begitu banyak malam larut tidaklah gratis.',
|
||||
'system_notice.release_notes.support_label': 'Tetap independen',
|
||||
'system_notice.release_notes.support_lead': 'Tanpa Google dan kawan-kawan.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Jika TREK sudah mendapat tempat dalam perjalananmu, traktir saya secangkir kopi dan bantu rilis berikutnya terus hadir.',
|
||||
'Pencarian tempat, pencarian alamat, dan perutean berjalan di server milik TREK sendiri, saat ini disponsori oleh dataforest cloud. Saya memperjuangkannya setiap hari, dan agar tetap begitu, saya butuh dukungan Anda.',
|
||||
'system_notice.release_notes.cta_bmc': 'Traktir aku kopi',
|
||||
'system_notice.release_notes.cta_kofi': 'Dukung di Ko-fi',
|
||||
};
|
||||
|
||||
@@ -212,6 +212,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Richiedi funzionalità',
|
||||
'settings.about.featureRequestHint': 'Suggerisci una nuova funzionalità',
|
||||
'settings.about.wikiHint': 'Documentazione e guide',
|
||||
'settings.about.sponsor.eyebrow': 'Infrastruttura sponsorizzata',
|
||||
'settings.about.sponsor.title': 'I server di TREK girano su dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Ricerca dei luoghi, ricerca degli indirizzi e calcolo dei percorsi arrivano dai server di TREK invece che da Google e simili, e dataforest cloud sponsorizza le macchine su cui girano.',
|
||||
'settings.about.sponsor.cta': 'Visita dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Ricerca luoghi',
|
||||
'settings.about.sponsor.address': 'Ricerca indirizzi',
|
||||
'settings.about.sponsor.routing': 'Percorsi',
|
||||
'settings.about.descriptionManaged':
|
||||
"TREK ti aiuta a organizzare i tuoi viaggi, dalla prima idea all'ultimo ricordo. Pianificazione dei giorni, budget, liste valigia, foto e molto altro, tutto in un unico posto.",
|
||||
'settings.about.sourceTitle': 'Codice sorgente',
|
||||
|
||||
@@ -55,21 +55,18 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.v3014_whitespace_collision.body':
|
||||
"L'aggiornamento 3.0.14 ha rilevato uno o più conflitti di nome utente o e-mail causati da spazi iniziali o finali nei valori memorizzati. Gli account interessati sono stati rinominati automaticamente. Controlla i log del server per le righe che iniziano con **[migration] WHITESPACE COLLISION** per identificare quali account richiedono revisione.",
|
||||
'system_notice.release_notes.eyebrow': 'Aggiornato',
|
||||
'system_notice.release_notes.headline': 'Il TREK più grande di sempre.',
|
||||
'system_notice.release_notes.headline': 'Il posto giusto, per primo.',
|
||||
'system_notice.release_notes.features_label': 'I protagonisti',
|
||||
'system_notice.release_notes.features_aside': 'E non è tutto',
|
||||
'system_notice.release_notes.feature_tours_title': 'Escursioni',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Trekking, bici, corsa, uscite a cavallo, pagaia, passeggiate in città e giornate sugli sci, con profilo altimetrico, gradi di difficoltà e sorvolo in 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Trasforma un viaggio in un fotolibro impaginato: 17 temi, 34 caratteri, 160 sticker e impaginazione automatica con un clic.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Assistente IA',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Pianifica con te sui tuoi viaggi reali, con l’account IA che hai già. Ogni modifica la vedi prima e puoi annullarla.',
|
||||
'system_notice.release_notes.feature_help_title': 'Aiuto in ogni schermata, in 27 lingue',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Circa 370 guide passo passo con 1.600 immagini, proprio dove servono. Novità: azero, estone, slovacco e thailandese.',
|
||||
'system_notice.release_notes.feature_search_title': 'Una ricerca dei luoghi che ci azzecca',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Città, isole, monumenti e aeroporti tramite il loro codice vengono prima, i caffè arrivano dai dintorni e i suggerimenti compaiono mentre scrivi.',
|
||||
'system_notice.release_notes.feature_share_title': 'Dettagli dei luoghi, condivisi',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Condividi siti web, orari di apertura e foto con ogni TREK, campo per campo, e i tuoi luoghi salvati si arricchiscono di ciò che hanno aggiunto gli altri.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Percorsi più veloci',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Un’intera giornata si calcola in un colpo solo con fino a venti tappe, un percorso lento non blocca più gli altri e i mezzi pubblici interpellano un secondo fornitore quando il primo non trova nulla.',
|
||||
'system_notice.release_notes.footnote': 'E in più una lunga lista di piccole modifiche in tutto il resto di TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Note di rilascio',
|
||||
'system_notice.release_notes.note_eyebrow': 'Una nota dal maintainer',
|
||||
@@ -83,13 +80,13 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
"E poi l'avete aperto. In pochi mesi eravate migliaia: stelle, segnalazioni di bug, traduzioni in lingue che non parlo, pull request da persone che non ho mai incontrato. Ogni mattina la prima cosa che faccio è ancora controllare il repository, e ancora non mi sembra del tutto vero.",
|
||||
'system_notice.release_notes.note_closing': 'Grazie per essere qui. Un saluto da Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK è gratuito e lo sarà sempre, ma server, domini e tante notti insonni non lo sono.',
|
||||
'system_notice.release_notes.support_label': 'Restare indipendenti',
|
||||
'system_notice.release_notes.support_lead': 'Senza Google e compagnia.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Se TREK si è guadagnato un posto nei tuoi viaggi, offrimi un caffè e aiutami a far arrivare la prossima versione.',
|
||||
'Ricerca dei luoghi, ricerca degli indirizzi e calcolo dei percorsi girano sui server di TREK, oggi sponsorizzati da dataforest cloud. Lotto per questo ogni giorno, e perché resti così serve il tuo sostegno.',
|
||||
'system_notice.release_notes.cta_bmc': 'Offrimi un caffè',
|
||||
'system_notice.release_notes.cta_kofi': 'Supporta su Ko-fi',
|
||||
'system_notice.release_notes.intro':
|
||||
'Escursioni per ogni giornata all’aperto, uno studio per i tuoi fotolibri, un assistente che pianifica con te e aiuto in ogni schermata.',
|
||||
'Ricerca dei luoghi, ricerca degli indirizzi e calcolo dei percorsi ora girano sui server di TREK, sponsorizzati da dataforest cloud, e ogni TREK può condividere ciò che sa dei luoghi con tutti gli altri.',
|
||||
};
|
||||
export default system_notice;
|
||||
|
||||
@@ -243,6 +243,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': '機能リクエスト',
|
||||
'settings.about.featureRequestHint': '新機能を提案',
|
||||
'settings.about.wikiHint': 'ドキュメント・ガイド',
|
||||
'settings.about.sponsor.eyebrow': 'インフラのスポンサー',
|
||||
'settings.about.sponsor.title': 'TREK 独自のサーバーは dataforest cloud で動いています',
|
||||
'settings.about.sponsor.body':
|
||||
'場所の検索、住所の検索、ルート計算は Google などではなく TREK 独自のサーバーから提供されており、そのマシンは dataforest cloud がスポンサーとして提供しています。',
|
||||
'settings.about.sponsor.cta': 'dataforest cloud を見る',
|
||||
'settings.about.sponsor.search': '場所の検索',
|
||||
'settings.about.sponsor.address': '住所の検索',
|
||||
'settings.about.sponsor.routing': 'ルート計算',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK は、最初のアイデアから最後の思い出まで、旅行の整理をお手伝いします。日程の計画、予算、持ち物リスト、写真など、すべてを一か所で。',
|
||||
'settings.about.sourceTitle': 'ソースコード',
|
||||
|
||||
@@ -53,23 +53,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.pager.goto': '通知{n}へ',
|
||||
'system_notice.pager.position': '{total}件中{current}件目',
|
||||
'system_notice.release_notes.eyebrow': 'アップデート完了',
|
||||
'system_notice.release_notes.headline': 'これまでで最大の TREK。',
|
||||
'system_notice.release_notes.headline': '正しい場所を、いちばんに。',
|
||||
'system_notice.release_notes.intro':
|
||||
'あらゆるアウトドアの一日のためのツアー、フォトブックのためのスタジオ、一緒に計画するアシスタント、そしてすべての画面にヘルプ。',
|
||||
'場所の検索、住所の検索、ルート計算が、dataforest cloud の協賛のもと TREK 自身のサーバーで動くようになりました。さらに、どの TREK も場所について知っていることを、ほかのすべての TREK と共有できます。',
|
||||
'system_notice.release_notes.features_label': '今回の目玉',
|
||||
'system_notice.release_notes.features_aside': 'ほんの一部です',
|
||||
'system_notice.release_notes.feature_tours_title': 'ツアー',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'ハイキング、サイクリング、ラン、乗馬、パドル、街歩き、スキーの日まで。標高プロファイル、難易度、3D フライオーバー付き。',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'旅をデザインされたフォトブックに。17 のテーマ、34 の書体、160 のステッカー、ワンクリックの自動レイアウト。',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI アシスタント',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'お手持ちの AI アカウントで、実際の旅を一緒に計画します。変更はすべて先に確認でき、元に戻せます。',
|
||||
'system_notice.release_notes.feature_help_title': 'すべての画面にヘルプ、27 言語で',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'約 370 のステップごとのガイドと 1,600 枚の画像を、必要な場所に。アゼルバイジャン語、エストニア語、スロバキア語、タイ語が加わりました。',
|
||||
'system_notice.release_notes.feature_search_title': 'ちゃんと見つかる場所検索',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'都市、島、名所、そしてコードで探す空港が最初に並び、カフェはあなたの周辺から見つかります。候補は入力しているそばから表示されます。',
|
||||
'system_notice.release_notes.feature_share_title': '場所の詳細を、みんなで',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'ウェブサイト、営業時間、写真を項目ごとにすべての TREK と共有できます。保存した場所には、ほかの人が追加した情報が自動で反映されます。',
|
||||
'system_notice.release_notes.feature_routing_title': 'もっと速いルート計算',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'最大 20 か所の立ち寄り先がある一日も、まとめて一度にルート計算。遅いルートが一つあっても、ほかを待たせません。公共交通は、最初のプロバイダーで見つからなければ別のプロバイダーにも問い合わせます。',
|
||||
'system_notice.release_notes.footnote': 'ほかにも、TREKのあちこちに細かな変更がたくさん入っています。',
|
||||
'system_notice.release_notes.notes_label': 'リリースノート',
|
||||
'system_notice.release_notes.note_eyebrow': '開発者より',
|
||||
@@ -83,10 +80,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'そして、あなたが開いてくれました。数か月のうちに、それが何千人にもなりました。スター、バグ報告、私の話せない言語への翻訳、会ったこともない人からのプルリクエスト。今でも毎朝いちばんにリポジトリを確認していますが、まだ少し夢のように感じています。',
|
||||
'system_notice.release_notes.note_closing': 'ここにいてくれて、ありがとう。Mauriceより',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREKは無料で、これからもずっと無料です。でも、サーバーやドメイン、数えきれない夜なべはタダではありません。',
|
||||
'system_notice.release_notes.support_label': '独立したままで',
|
||||
'system_notice.release_notes.support_lead': 'Google などに頼らずに。',
|
||||
'system_notice.release_notes.support_text':
|
||||
'TREKがあなたの旅に欠かせないものになっていたら、コーヒーを一杯おごってください。次のリリースを届ける力になります。',
|
||||
'場所の検索、住所の検索、ルート計算は TREK 自身のサーバーで動いていて、今は dataforest cloud に協賛してもらっています。私はそのために毎日奮闘しています。この形を守り続けるには、あなたの応援が必要です。',
|
||||
'system_notice.release_notes.cta_bmc': 'コーヒーをおごる',
|
||||
'system_notice.release_notes.cta_kofi': 'Ko-fiで応援する',
|
||||
};
|
||||
|
||||
@@ -255,6 +255,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': '기능 요청',
|
||||
'settings.about.featureRequestHint': '새로운 기능을 제안하세요',
|
||||
'settings.about.wikiHint': '문서 및 가이드',
|
||||
'settings.about.sponsor.eyebrow': '후원받는 인프라',
|
||||
'settings.about.sponsor.title': 'TREK 자체 서버는 dataforest cloud에서 운영됩니다',
|
||||
'settings.about.sponsor.body':
|
||||
'장소 검색, 주소 검색, 경로 안내는 Google 등이 아닌 TREK 자체 서버에서 제공되며, 이 서버가 돌아가는 머신은 dataforest cloud가 후원합니다.',
|
||||
'settings.about.sponsor.cta': 'dataforest cloud 방문하기',
|
||||
'settings.about.sponsor.search': '장소 검색',
|
||||
'settings.about.sponsor.address': '주소 검색',
|
||||
'settings.about.sponsor.routing': '경로 안내',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK은 첫 아이디어부터 마지막 추억까지 여행을 정리하도록 도와줍니다. 일정 계획, 예산, 짐 목록, 사진 등 모든 것을 한곳에서 관리하세요.',
|
||||
'settings.about.sourceTitle': '소스 코드',
|
||||
|
||||
@@ -55,23 +55,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.pager.goto': '{n}번 공지로 이동',
|
||||
'system_notice.pager.position': '공지 {current}/{total}',
|
||||
'system_notice.release_notes.eyebrow': '업데이트 완료',
|
||||
'system_notice.release_notes.headline': '지금까지 가장 큰 TREK.',
|
||||
'system_notice.release_notes.headline': '맞는 장소가, 먼저.',
|
||||
'system_notice.release_notes.intro':
|
||||
'모든 야외 일정을 위한 투어, 포토북을 위한 스튜디오, 함께 계획하는 어시스턴트, 그리고 모든 화면의 도움말.',
|
||||
'장소 검색, 주소 검색, 경로 안내가 이제 dataforest cloud의 후원으로 TREK 자체 서버에서 돌아갑니다. 그리고 모든 TREK이 장소에 대해 아는 것을 다른 모든 TREK과 나눌 수 있습니다.',
|
||||
'system_notice.release_notes.features_label': '이번 릴리스의 주역',
|
||||
'system_notice.release_notes.features_aside': '이게 전부는 아닙니다',
|
||||
'system_notice.release_notes.feature_tours_title': '투어',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'하이킹, 자전거, 러닝, 승마, 패들링, 도시 산책, 스키까지. 고도 프로필, 난이도 등급, 3D 플라이오버와 함께.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'여행을 디자인된 포토북으로. 17가지 테마, 34가지 서체, 160개의 스티커, 클릭 한 번의 자동 레이아웃.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI 어시스턴트',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'이미 가진 AI 계정으로 실제 여행을 함께 계획합니다. 모든 변경 사항을 먼저 확인하고 되돌릴 수 있습니다.',
|
||||
'system_notice.release_notes.feature_help_title': '모든 화면에 도움말, 27개 언어로',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'약 370개의 단계별 가이드와 1,600장의 이미지를 필요한 바로 그곳에서. 아제르바이잔어, 에스토니아어, 슬로바키아어, 태국어가 새로 추가되었습니다.',
|
||||
'system_notice.release_notes.feature_search_title': '제대로 찾아 주는 장소 검색',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'도시, 섬, 명소, 코드로 찾는 공항이 먼저 나오고, 카페는 내 주변에서 찾아 줍니다. 입력하는 동안 바로 추천이 뜹니다.',
|
||||
'system_notice.release_notes.feature_share_title': '장소 정보, 함께 나누기',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'웹사이트, 영업시간, 사진을 항목별로 모든 TREK과 공유하세요. 저장한 장소에는 다른 사람들이 추가한 정보가 채워집니다.',
|
||||
'system_notice.release_notes.feature_routing_title': '더 빨라진 경로 안내',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'경유지가 최대 20곳인 하루 일정도 한 번에 경로를 계산합니다. 느린 경로 하나가 나머지를 붙잡지 않고, 대중교통은 첫 번째 제공자가 찾지 못하면 두 번째 제공자에게 물어봅니다.',
|
||||
'system_notice.release_notes.footnote': '그 밖에도 TREK 곳곳에 작은 변경이 많이 담겨 있습니다.',
|
||||
'system_notice.release_notes.notes_label': '릴리스 노트',
|
||||
'system_notice.release_notes.note_eyebrow': '개발자의 한마디',
|
||||
@@ -85,10 +82,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'그런데 여러분이 열어주셨습니다. 몇 달 만에 수천 명이 찾아와 주셨습니다. 별, 버그 보고, 제가 할 줄 모르는 언어로 된 번역, 한 번도 만난 적 없는 분들의 풀 리퀘스트까지. 지금도 매일 아침 가장 먼저 저장소를 확인하는데, 아직도 잘 실감이 나지 않습니다.',
|
||||
'system_notice.release_notes.note_closing': '함께해 주셔서 감사합니다. Maurice 드림',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK은 무료이고 앞으로도 그렇겠지만, 서버와 도메인, 수많은 늦은 밤은 무료가 아닙니다.',
|
||||
'system_notice.release_notes.support_label': '독립을 지키며',
|
||||
'system_notice.release_notes.support_lead': 'Google 같은 빅테크 없이.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'TREK이 여러분의 여행에 자리를 잡았다면, 커피 한 잔으로 다음 릴리스가 계속 나올 수 있게 도와주세요.',
|
||||
'장소 검색, 주소 검색, 경로 안내는 TREK 자체 서버에서 돌아가며, 지금은 dataforest cloud가 후원하고 있습니다. 저는 매일 이것을 위해 싸우고 있고, 이대로 지켜 나가려면 여러분의 후원이 필요합니다.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Ko-fi에서 후원하기',
|
||||
};
|
||||
|
||||
@@ -212,6 +212,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Feature aanvragen',
|
||||
'settings.about.featureRequestHint': 'Stel een nieuwe functie voor',
|
||||
'settings.about.wikiHint': 'Documentatie en handleidingen',
|
||||
'settings.about.sponsor.eyebrow': 'Gesponsorde infrastructuur',
|
||||
'settings.about.sponsor.title': 'De eigen servers van TREK draaien op dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Plaatsen zoeken, adressen zoeken en routeplanning komen van eigen servers van TREK in plaats van Google en co., en dataforest cloud sponsort de machines waarop ze draaien.',
|
||||
'settings.about.sponsor.cta': 'Naar dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Plaatsen zoeken',
|
||||
'settings.about.sponsor.address': 'Adressen zoeken',
|
||||
'settings.about.sponsor.routing': 'Routeplanning',
|
||||
'settings.about.descriptionManaged':
|
||||
"TREK helpt je je reizen te organiseren, van het eerste idee tot de laatste herinnering. Dagplanning, budget, paklijsten, foto's en nog veel meer, allemaal op één plek.",
|
||||
'settings.about.sourceTitle': 'Broncode',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'De 3.0.14-upgrade heeft één of meer conflicten in gebruikersnaam of e-mailadres gedetecteerd, veroorzaakt door spaties aan het begin of einde van opgeslagen waarden. Getroffen accounts zijn automatisch hernoemd. Controleer de serverlogboeken op regels die beginnen met **[migration] WHITESPACE COLLISION** om te achterhalen welke accounts moeten worden beoordeeld.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Update geïnstalleerd',
|
||||
'system_notice.release_notes.headline': 'De grootste TREK tot nu toe.',
|
||||
'system_notice.release_notes.headline': 'De juiste plek, eerst.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Tochten voor elke dag buiten, een studio voor je fotoboeken, een assistent die met je meeplant en hulp op elk scherm.',
|
||||
'Plaatsen zoeken, adressen zoeken en routeplanning draaien nu op eigen servers van TREK, gesponsord door dataforest cloud, en elke TREK kan wat hij over plaatsen weet delen met alle andere.',
|
||||
'system_notice.release_notes.features_label': 'De hoogtepunten',
|
||||
'system_notice.release_notes.features_aside': 'Lang niet alles',
|
||||
'system_notice.release_notes.feature_tours_title': 'Tochten',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Wandelingen, fietstochten, hardlooprondes, ritten te paard, peddeltochten, stadswandelingen en skidagen, met hoogteprofiel, moeilijkheidsgraden en een 3D-vlucht.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Maakt van een reis een ontworpen fotoboek: 17 thema’s, 34 lettertypen, 160 stickers en automatische opmaak in één klik.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI-assistent',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Plant met je mee in je echte reizen, met het AI-account dat je al hebt. Elke wijziging zie je eerst en kun je ongedaan maken.',
|
||||
'system_notice.release_notes.feature_help_title': 'Hulp op elk scherm, in 27 talen',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Zo’n 370 stapsgewijze handleidingen met 1.600 afbeeldingen, precies waar je ze nodig hebt. Nieuw: Azerbeidzjaans, Ests, Slowaaks en Thai.',
|
||||
'system_notice.release_notes.feature_search_title': 'Plaatsen zoeken dat klopt',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Steden, eilanden, bezienswaardigheden en luchthavens op hun code komen eerst, cafés komen uit je omgeving en suggesties verschijnen terwijl je typt.',
|
||||
'system_notice.release_notes.feature_share_title': 'Plaatsdetails, gedeeld',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Deel websites, openingstijden en foto’s met elke TREK, veld voor veld, en je opgeslagen plaatsen nemen over wat anderen hebben toegevoegd.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Snellere routes',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Een hele dag wordt in één keer gepland met tot twintig stops, één trage route houdt de rest niet meer op en het openbaar vervoer vraagt een tweede aanbieder als de eerste niets vindt.',
|
||||
'system_notice.release_notes.footnote': 'En daarnaast een lange lijst kleinere wijzigingen in de rest van TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Release notes',
|
||||
'system_notice.release_notes.note_eyebrow': 'Een woord van de maintainer',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'En toen kwamen jullie. Binnen een paar maanden waren jullie met duizenden: sterren, bugmeldingen, vertalingen in talen die ik niet spreek, pull requests van mensen die ik nooit heb ontmoet. Nog altijd kijk ik elke ochtend als eerste in de repository, en het voelt nog steeds niet helemaal echt.',
|
||||
'system_notice.release_notes.note_closing': 'Bedankt dat je er bent. Groetjes, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK is gratis en blijft dat ook, maar servers, domeinen en heel wat late avonden zijn dat niet.',
|
||||
'system_notice.release_notes.support_label': 'Onafhankelijk blijven',
|
||||
'system_notice.release_notes.support_lead': 'Zonder Google en co.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Als TREK een plek in je reizen heeft verdiend, trakteer me dan op een kopje koffie en help zo de volgende release op weg.',
|
||||
'Plaatsen zoeken, adressen zoeken en routeplanning draaien op eigen servers van TREK, vandaag gesponsord door dataforest cloud. Daar vecht ik elke dag voor, en om het zo te houden is jouw steun nodig.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Steun op Ko-fi',
|
||||
};
|
||||
|
||||
@@ -209,6 +209,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Zaproponuj funkcję',
|
||||
'settings.about.featureRequestHint': 'Zaproponuj nową funkcję',
|
||||
'settings.about.wikiHint': 'Dokumentacja i poradniki',
|
||||
'settings.about.sponsor.eyebrow': 'Sponsorowana infrastruktura',
|
||||
'settings.about.sponsor.title': 'Własne serwery TREK działają na dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Wyszukiwanie miejsc, wyszukiwanie adresów i trasy pochodzą z własnych serwerów TREK zamiast od Google i spółki, a maszyny, na których działają, sponsoruje dataforest cloud.',
|
||||
'settings.about.sponsor.cta': 'Odwiedź dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Wyszukiwanie miejsc',
|
||||
'settings.about.sponsor.address': 'Wyszukiwanie adresów',
|
||||
'settings.about.sponsor.routing': 'Trasy',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK pomaga organizować podróże od pierwszego pomysłu do ostatniego wspomnienia. Plan dnia, budżet, listy pakowania, zdjęcia i wiele więcej, wszystko w jednym miejscu.',
|
||||
'settings.about.sourceTitle': 'Kod źródłowy',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'Aktualizacja 3.0.14 wykryła jeden lub więcej konfliktów nazwy użytkownika lub adresu e-mail spowodowanych spacjami na początku lub końcu przechowywanych wartości. Dotknięte konta zostały automatycznie przemianowane. Sprawdź logi serwera pod kątem wierszy zaczynających się od **[migration] WHITESPACE COLLISION**, aby zidentyfikować konta wymagające przeglądu.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Aktualizacja zainstalowana',
|
||||
'system_notice.release_notes.headline': 'Największy TREK w historii.',
|
||||
'system_notice.release_notes.headline': 'Najpierw właściwe miejsce.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Wycieczki na każdy dzień w terenie, studio do Twoich fotoksiążek, asystent, który planuje razem z Tobą, i pomoc na każdym ekranie.',
|
||||
'Wyszukiwanie miejsc, wyszukiwanie adresów i wyznaczanie tras działają teraz na własnych serwerach TREK, sponsorowanych przez dataforest cloud, a każdy TREK może dzielić się wiedzą o miejscach ze wszystkimi pozostałymi.',
|
||||
'system_notice.release_notes.features_label': 'Najważniejsze nowości',
|
||||
'system_notice.release_notes.features_aside': 'To nie wszystko',
|
||||
'system_notice.release_notes.feature_tours_title': 'Wycieczki',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Wędrówki, rower, bieganie, jazda konna, kajaki, spacery po mieście i dni na nartach, z profilem wysokości, stopniami trudności i przelotem 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Zamienia podróż w zaprojektowaną fotoksiążkę: 17 motywów, 34 kroje pisma, 160 naklejek i automatyczny układ jednym kliknięciem.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Asystent AI',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planuje z Tobą Twoje prawdziwe podróże, przez konto AI, które już masz. Każdą zmianę widzisz najpierw i możesz ją cofnąć.',
|
||||
'system_notice.release_notes.feature_help_title': 'Pomoc na każdym ekranie, w 27 językach',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Około 370 przewodników krok po kroku z 1600 ilustracjami, dokładnie tam, gdzie ich potrzebujesz. Nowe języki: azerski, estoński, słowacki i tajski.',
|
||||
'system_notice.release_notes.feature_search_title': 'Wyszukiwanie miejsc, które trafia w punkt',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Miasta, wyspy, zabytki i lotniska wpisane po kodzie są na początku, kawiarnie pochodzą z Twojej okolicy, a podpowiedzi pojawiają się już podczas pisania.',
|
||||
'system_notice.release_notes.feature_share_title': 'Wspólne szczegóły miejsc',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Udostępniaj strony internetowe, godziny otwarcia i zdjęcia każdemu TREK, pole po polu, a Twoje zapisane miejsca zyskują to, co dodali inni.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Szybsze trasy',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Cały dzień wyznacza się za jednym razem, z maksymalnie dwudziestoma przystankami, jedna wolna trasa nie wstrzymuje już pozostałych, a transport publiczny pyta drugiego dostawcę, gdy pierwszy nic nie znajdzie.',
|
||||
'system_notice.release_notes.footnote': 'Do tego długa lista mniejszych zmian w całej reszcie TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Notatki do wydania',
|
||||
'system_notice.release_notes.note_eyebrow': 'Słowo od autora',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'A potem go otworzyliście. W ciągu kilku miesięcy były was tysiące: gwiazdki, zgłoszenia błędów, tłumaczenia na języki, których nie znam, pull requesty od ludzi, których nigdy nie spotkałem. Wciąż każdego ranka najpierw zaglądam do repozytorium i wciąż nie do końca w to wierzę.',
|
||||
'system_notice.release_notes.note_closing': 'Dziękuję, że tu jesteście. Pozdrawiam, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK jest darmowy i zawsze taki będzie, ale serwery, domeny i wiele zarwanych nocy już nie.',
|
||||
'system_notice.release_notes.support_label': 'Pozostać niezależnym',
|
||||
'system_notice.release_notes.support_lead': 'Bez Google i spółki.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Jeśli TREK zasłużył na miejsce w Twoich podróżach, postaw mi kawę i pomóż, żeby powstało kolejne wydanie.',
|
||||
'Wyszukiwanie miejsc, wyszukiwanie adresów i trasy działają na własnych serwerach TREK, dziś sponsorowanych przez dataforest cloud. Walczę o to każdego dnia, a żeby tak zostało, potrzebuję Twojego wsparcia.',
|
||||
'system_notice.release_notes.cta_bmc': 'Postaw mi kawę',
|
||||
'system_notice.release_notes.cta_kofi': 'Wesprzyj na Ko-fi',
|
||||
};
|
||||
|
||||
@@ -211,6 +211,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Предложить функцию',
|
||||
'settings.about.featureRequestHint': 'Предложите новую функцию',
|
||||
'settings.about.wikiHint': 'Документация и руководства',
|
||||
'settings.about.sponsor.eyebrow': 'Спонсорская инфраструктура',
|
||||
'settings.about.sponsor.title': 'Собственные серверы TREK работают на dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Поиск мест, поиск адресов и маршруты работают на собственных серверах TREK вместо Google и компании, а машины для них спонсирует dataforest cloud.',
|
||||
'settings.about.sponsor.cta': 'Перейти на dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Поиск мест',
|
||||
'settings.about.sponsor.address': 'Поиск адресов',
|
||||
'settings.about.sponsor.routing': 'Маршруты',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK помогает организовать поездки от первой идеи до последнего воспоминания. Планирование дней, бюджет, списки вещей, фото и многое другое: всё в одном месте.',
|
||||
'settings.about.sourceTitle': 'Исходный код',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'Обновление 3.0.14 обнаружило один или несколько конфликтов имён пользователей или адресов электронной почты, вызванных ведущими или завершающими пробелами в сохранённых значениях. Затронутые учётные записи были автоматически переименованы. Проверьте логи сервера на строки, начинающиеся с **[migration] WHITESPACE COLLISION**, чтобы определить учётные записи, требующие проверки.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Обновление установлено',
|
||||
'system_notice.release_notes.headline': 'Самый большой TREK на сегодня.',
|
||||
'system_notice.release_notes.headline': 'Нужное место, с первого раза.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Туры на любой день на природе, студия для ваших фотокниг, ассистент, который планирует вместе с вами, и справка на каждом экране.',
|
||||
'Поиск мест, поиск адресов и построение маршрутов теперь работают на собственных серверах TREK при поддержке dataforest cloud, и каждый TREK может делиться тем, что знает о местах, со всеми остальными.',
|
||||
'system_notice.release_notes.features_label': 'Главные новинки',
|
||||
'system_notice.release_notes.features_aside': 'И это далеко не всё',
|
||||
'system_notice.release_notes.feature_tours_title': 'Туры',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Походы, велотуры, пробежки, конные прогулки, сплавы, прогулки по городу и дни на лыжах, с профилем высот, категориями сложности и 3D-облётом.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Превращает путешествие в оформленную фотокнигу: 17 тем, 34 шрифта, 160 стикеров и автоматическая вёрстка одним нажатием.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'ИИ-ассистент',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Планирует вместе с вами ваши настоящие поездки через уже имеющийся у вас аккаунт ИИ. Каждое изменение вы видите заранее и можете отменить.',
|
||||
'system_notice.release_notes.feature_help_title': 'Справка на каждом экране, на 27 языках',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Около 370 пошаговых инструкций и 1600 иллюстраций прямо там, где они нужны. Новые языки: азербайджанский, эстонский, словацкий и тайский.',
|
||||
'system_notice.release_notes.feature_search_title': 'Поиск мест, который попадает в точку',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Города, острова, достопримечательности и аэропорты по их коду идут первыми, кафе ищутся рядом с вами, а подсказки появляются прямо во время ввода.',
|
||||
'system_notice.release_notes.feature_share_title': 'Общие сведения о местах',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Делитесь сайтами, часами работы и фотографиями со всеми TREK, поле за полем, а ваши сохранённые места получают то, что добавили другие.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Более быстрые маршруты',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Весь день строится за один раз, до двадцати остановок, один медленный маршрут больше не задерживает остальные, а общественный транспорт обращается ко второму провайдеру, если первый ничего не нашёл.',
|
||||
'system_notice.release_notes.footnote': 'Плюс длинный список небольших изменений во всём остальном TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Заметки к релизу',
|
||||
'system_notice.release_notes.note_eyebrow': 'Слово от мейнтейнера',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'А потом его открыли вы. За несколько месяцев вас стали тысячи: звёзды, отчёты об ошибках, переводы на языки, которыми я не владею, пул-реквесты от людей, с которыми я ни разу не встречался. Я до сих пор каждое утро первым делом заглядываю в репозиторий, и мне всё ещё не до конца верится, что это происходит.',
|
||||
'system_notice.release_notes.note_closing': 'Спасибо, что вы здесь. Ваш Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK бесплатен и таким останется, а вот серверы, домены и бесконечные поздние вечера бесплатными не бывают.',
|
||||
'system_notice.release_notes.support_label': 'Оставаться независимым',
|
||||
'system_notice.release_notes.support_lead': 'Без Google и компании.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Если TREK заслужил место в ваших поездках, угостите меня кофе и помогите выпустить следующий релиз.',
|
||||
'Поиск мест, поиск адресов и маршруты работают на собственных серверах TREK, сегодня при поддержке dataforest cloud. Я борюсь за это каждый день, и чтобы так оставалось, нужна ваша поддержка.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Поддержать на Ko-fi',
|
||||
};
|
||||
|
||||
@@ -275,6 +275,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Navrhnúť funkciu',
|
||||
'settings.about.featureRequestHint': 'Navrhnite novú funkciu',
|
||||
'settings.about.wikiHint': 'Dokumentácia a návody',
|
||||
'settings.about.sponsor.eyebrow': 'Sponzorovaná infraštruktúra',
|
||||
'settings.about.sponsor.title': 'Vlastné servery TREK bežia na dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Vyhľadávanie miest, vyhľadávanie adries a trasy pochádzajú z vlastných serverov TREK namiesto od Google a spol. a stroje, na ktorých bežia, sponzoruje dataforest cloud.',
|
||||
'settings.about.sponsor.cta': 'Navštíviť dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Vyhľadávanie miest',
|
||||
'settings.about.sponsor.address': 'Vyhľadávanie adries',
|
||||
'settings.about.sponsor.routing': 'Trasy',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK vám pomáha organizovať vaše cesty od prvého nápadu po poslednú spomienku. Denné plánovanie, rozpočet, zoznamy balenia, fotky a oveľa viac — všetko na jednom mieste.',
|
||||
'settings.about.sourceTitle': 'Zdrojový kód',
|
||||
|
||||
@@ -52,23 +52,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.thank_you_support.cta_kofi': 'Podporiť na Ko-fi',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Aktualizácia nainštalovaná',
|
||||
'system_notice.release_notes.headline': 'Najväčší TREK doteraz.',
|
||||
'system_notice.release_notes.headline': 'Správne miesto, hneď napoprvé.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Túry na každý deň vonku, štúdio pre vaše fotoknihy, asistent, ktorý plánuje s vami, a pomoc na každej obrazovke.',
|
||||
'Vyhľadávanie miest, vyhľadávanie adries a plánovanie trás teraz bežia na vlastných serveroch TREK, ktoré sponzoruje dataforest cloud, a každý TREK môže zdieľať, čo vie o miestach, so všetkými ostatnými.',
|
||||
'system_notice.release_notes.features_label': 'Hlavné novinky',
|
||||
'system_notice.release_notes.features_aside': 'Zďaleka nie všetko',
|
||||
'system_notice.release_notes.feature_tours_title': 'Túry',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Turistika, cyklotúry, behy, vychádzky na koni, pádlovanie, prechádzky mestom a dni na lyžiach, s výškovým profilom, obťažnosťou a 3D preletom.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Premení cestu na navrhnutú fotoknihu: 17 motívov, 34 písiem, 160 nálepiek a automatické rozloženie jedným kliknutím.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI asistent',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Plánuje s vami vaše skutočné cesty cez účet AI, ktorý už máte. Každú zmenu najprv uvidíte a môžete ju vrátiť.',
|
||||
'system_notice.release_notes.feature_help_title': 'Pomoc na každej obrazovke, v 27 jazykoch',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Približne 370 návodov krok za krokom s 1 600 obrázkami, presne tam, kde ich potrebujete. Novinka: azerbajdžančina, estónčina, slovenčina a thajčina.',
|
||||
'system_notice.release_notes.feature_search_title': 'Vyhľadávanie miest, ktoré trafí',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Mestá, ostrovy, pamiatky a letiská podľa kódu sú na prvom mieste, kaviarne sa hľadajú vo vašom okolí a návrhy sa zobrazujú už počas písania.',
|
||||
'system_notice.release_notes.feature_share_title': 'Zdieľané podrobnosti o miestach',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Zdieľajte weby, otváracie hodiny a fotky so všetkými TREK, pole po poli, a vaše uložené miesta prevezmú, čo doplnili ostatní.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Rýchlejšie trasy',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Celý deň sa naplánuje naraz až s dvadsiatimi zastávkami, jedna pomalá trasa už nezdrží ostatné a verejná doprava sa opýta druhého poskytovateľa, keď prvý nič nenájde.',
|
||||
'system_notice.release_notes.footnote': 'A k tomu dlhý zoznam menších zmien naprieč zvyškom TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Poznámky k vydaniu',
|
||||
'system_notice.release_notes.note_eyebrow': 'Slovo od správcu',
|
||||
@@ -82,10 +79,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'A potom ste ho otvorili. V priebehu pár mesiacov vás boli tisíce: hviezdičky, hlásenia chýb, preklady do jazykov, ktorými nehovorím, pull requesty od ľudí, ktorých som nikdy nestretol. Každé ráno sa stále najprv pozriem do repozitára a stále mi to nepripadá celkom skutočné.',
|
||||
'system_notice.release_notes.note_closing': 'Ďakujem, že ste tu, váš Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK je a vždy bude zadarmo, ale servery, domény a množstvo neskorých nocí nie sú.',
|
||||
'system_notice.release_notes.support_label': 'Zostať nezávislý',
|
||||
'system_notice.release_notes.support_lead': 'Bez Google a spol.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Ak si získal miesto na vašich cestách, kúpte mi kávu a pomôžte, aby prišlo aj ďalšie vydanie.',
|
||||
'Vyhľadávanie miest, vyhľadávanie adries a trasy bežia na vlastných serveroch TREK, dnes sponzorovaných spoločnosťou dataforest cloud. Bojujem za to každý deň a aby to tak zostalo, potrebujem vašu podporu.',
|
||||
'system_notice.release_notes.cta_bmc': 'Kúp mi kávu',
|
||||
'system_notice.release_notes.cta_kofi': 'Podporiť na Ko-fi',
|
||||
'system_notice.pager.prev': 'Predchádzajúce oznámenie',
|
||||
|
||||
@@ -269,6 +269,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Förslag på ny funktion',
|
||||
'settings.about.featureRequestHint': 'Föreslå en ny funktion',
|
||||
'settings.about.wikiHint': 'Dokumentation och handledningar',
|
||||
'settings.about.sponsor.eyebrow': 'Sponsrad infrastruktur',
|
||||
'settings.about.sponsor.title': 'TREKs egna servrar körs på dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Platssökning, adressökning och ruttplanering kommer från TREKs egna servrar i stället för Google och co., och dataforest cloud sponsrar maskinerna de körs på.',
|
||||
'settings.about.sponsor.cta': 'Besök dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Platssökning',
|
||||
'settings.about.sponsor.address': 'Adressökning',
|
||||
'settings.about.sponsor.routing': 'Ruttplanering',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK hjälper dig att organisera dina resor, från den första idén till det sista minnet. Dagsplanering, budget, packlistor, foton och mycket mer, allt på ett ställe.',
|
||||
'settings.about.sourceTitle': 'Källkod',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.pager.position': 'Meddlenade {current} av {total}',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Uppdatering klar',
|
||||
'system_notice.release_notes.headline': 'Den största TREK hittills.',
|
||||
'system_notice.release_notes.headline': 'Rätt plats, först.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Turer för varje dag ute, en studio för dina fotoböcker, en assistent som planerar med dig och hjälp på varje skärm.',
|
||||
'Platssökning, adressökning och ruttplanering körs nu på TREKs egna servrar, sponsrade av dataforest cloud, och varje TREK kan dela det den vet om platser med alla andra.',
|
||||
'system_notice.release_notes.features_label': 'Höjdpunkterna',
|
||||
'system_notice.release_notes.features_aside': 'Långt ifrån allt',
|
||||
'system_notice.release_notes.feature_tours_title': 'Turer',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Vandringar, cykelturer, löprundor, ridturer, paddling, stadspromenader och skiddagar, med höjdprofil, svårighetsgrader och 3D-överflygning.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Gör en resa till en formgiven fotobok: 17 teman, 34 typsnitt, 160 klistermärken och automatisk layout med ett klick.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI-assistent',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Planerar med dig i dina riktiga resor, med det AI-konto du redan har. Varje ändring ser du först och kan ångra.',
|
||||
'system_notice.release_notes.feature_help_title': 'Hjälp på varje skärm, på 27 språk',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Omkring 370 steg-för-steg-guider med 1 600 bilder, precis där du behöver dem. Nytt: azerbajdzjanska, estniska, slovakiska och thailändska.',
|
||||
'system_notice.release_notes.feature_search_title': 'Platssökning som träffar rätt',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Städer, öar, sevärdheter och flygplatser via sin kod kommer först, kaféer hämtas från din närhet och förslag dyker upp medan du skriver.',
|
||||
'system_notice.release_notes.feature_share_title': 'Platsdetaljer, delade',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Dela webbplatser, öppettider och foton med varje TREK, fält för fält, och dina sparade platser får med det som andra har lagt till.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Snabbare rutter',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'En hel dag planeras i ett svep med upp till tjugo stopp, en långsam rutt håller inte längre upp resten och kollektivtrafiken frågar en andra leverantör när den första inte hittar något.',
|
||||
'system_notice.release_notes.footnote': 'Dessutom en lång rad mindre ändringar i resten av TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Versionsnyheter',
|
||||
'system_notice.release_notes.note_eyebrow': 'Ett ord från utvecklaren',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Och sedan gjorde ni det. Inom några månader var ni tusentals: stjärnor, felrapporter, översättningar till språk jag inte talar, pull requests från människor jag aldrig har träffat. Jag kollar fortfarande repot varje morgon innan jag gör något annat, och det känns ännu inte riktigt verkligt.',
|
||||
'system_notice.release_notes.note_closing': 'Tack för att du är här. Hälsningar, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK är gratis och kommer alltid att vara det, men servrar, domäner och många sena nätter är det inte.',
|
||||
'system_notice.release_notes.support_label': 'Förbli oberoende',
|
||||
'system_notice.release_notes.support_lead': 'Utan Google och co.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Om TREK har förtjänat en plats på dina resor, så bjud mig gärna på en kaffe och hjälp till att nästa utgåva blir av.',
|
||||
'Platssökning, adressökning och ruttplanering körs på TREKs egna servrar, i dag sponsrade av dataforest cloud. Jag kämpar för det varje dag, och för att det ska förbli så behövs ditt stöd.',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': 'Stöd på Ko-fi',
|
||||
};
|
||||
|
||||
@@ -255,6 +255,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'คำขอคุณลักษณะ',
|
||||
'settings.about.featureRequestHint': 'ขอแนะนำฟีเจอร์ใหม่',
|
||||
'settings.about.wikiHint': 'เอกสารและคำแนะนำ',
|
||||
'settings.about.sponsor.eyebrow': 'โครงสร้างพื้นฐานที่ได้รับการสนับสนุน',
|
||||
'settings.about.sponsor.title': 'เซิร์ฟเวอร์ของ TREK เองทำงานบน dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'การค้นหาสถานที่ การค้นหาที่อยู่ และการคำนวณเส้นทาง มาจากเซิร์ฟเวอร์ของ TREK เองแทน Google และรายอื่นๆ โดยมี dataforest cloud สนับสนุนเครื่องที่ใช้รันเซิร์ฟเวอร์เหล่านี้',
|
||||
'settings.about.sponsor.cta': 'ไปที่ dataforest cloud',
|
||||
'settings.about.sponsor.search': 'ค้นหาสถานที่',
|
||||
'settings.about.sponsor.address': 'ค้นหาที่อยู่',
|
||||
'settings.about.sponsor.routing': 'คำนวณเส้นทาง',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK ช่วยคุณจัดทริปตั้งแต่ไอเดียแรกไปจนถึงความทรงจำสุดท้าย การวางแผนวัน งบประมาณ รายการสิ่งของที่ต้องเตรียมไป รูปภาพ และอื่นๆ อีกมากมาย รวมอยู่ในที่เดียว',
|
||||
'settings.about.sourceTitle': 'ซอร์สโค้ด',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.pager.goto': 'ไปที่ประกาศ {n}',
|
||||
'system_notice.pager.position': 'ประกาศ {current} จาก {total}',
|
||||
'system_notice.release_notes.eyebrow': 'ติดตั้งอัปเดตแล้ว',
|
||||
'system_notice.release_notes.headline': 'TREK ครั้งใหญ่ที่สุดเท่าที่เคยมีมา',
|
||||
'system_notice.release_notes.headline': 'สถานที่ที่ใช่ ขึ้นมาก่อน',
|
||||
'system_notice.release_notes.intro':
|
||||
'ทัวร์สำหรับทุกวันกลางแจ้ง สตูดิโอสำหรับโฟโต้บุ๊กของคุณ ผู้ช่วยที่วางแผนไปกับคุณ และความช่วยเหลือในทุกหน้าจอ',
|
||||
'การค้นหาสถานที่ การค้นหาที่อยู่ และการคำนวณเส้นทาง ตอนนี้ทำงานบนเซิร์ฟเวอร์ของ TREK เอง โดยได้รับการสนับสนุนจาก dataforest cloud และทุก TREK ยังแบ่งปันสิ่งที่รู้เกี่ยวกับสถานที่ให้กับ TREK อื่นทั้งหมดได้',
|
||||
'system_notice.release_notes.features_label': 'ไฮไลต์สำคัญ',
|
||||
'system_notice.release_notes.features_aside': 'ไกลจากทุกสิ่ง',
|
||||
'system_notice.release_notes.feature_tours_title': 'ทัวร์',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'เดินป่า ปั่นจักรยาน วิ่ง ขี่ม้า พายเรือ เดินชมเมือง และวันเล่นสกี พร้อมกราฟความสูง ระดับความยาก และการบินชมแบบ 3D',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'เปลี่ยนการเดินทางให้เป็นโฟโต้บุ๊กที่ออกแบบอย่างสวยงาม: 17 ธีม 34 แบบอักษร 160 สติกเกอร์ และจัดหน้าอัตโนมัติในคลิกเดียว',
|
||||
'system_notice.release_notes.feature_assistant_title': 'ผู้ช่วย AI',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'วางแผนทริปจริงของคุณไปพร้อมกับคุณ ด้วยบัญชี AI ที่คุณมีอยู่แล้ว ทุกการเปลี่ยนแปลงแสดงให้เห็นก่อนและย้อนกลับได้',
|
||||
'system_notice.release_notes.feature_help_title': 'ความช่วยเหลือในทุกหน้าจอ ใน 27 ภาษา',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'คู่มือทีละขั้นตอนราว 370 รายการ พร้อมภาพ 1,600 ภาพ อยู่ตรงที่คุณต้องการ ภาษาใหม่: อาเซอร์ไบจาน เอสโตเนีย สโลวัก และไทย',
|
||||
'system_notice.release_notes.feature_search_title': 'ค้นหาสถานที่ได้ตรงใจ',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'เมือง เกาะ แลนด์มาร์ก และสนามบินที่ค้นด้วยรหัส จะขึ้นมาก่อน ส่วนคาเฟ่จะหาจากรอบตัวคุณ และคำแนะนำจะแสดงขึ้นระหว่างที่คุณพิมพ์',
|
||||
'system_notice.release_notes.feature_share_title': 'รายละเอียดสถานที่ แบ่งปันกัน',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'แบ่งปันเว็บไซต์ เวลาเปิดทำการ และรูปภาพให้กับทุก TREK ได้ทีละช่อง และสถานที่ที่คุณบันทึกไว้จะได้รับข้อมูลที่คนอื่นเพิ่มเข้ามา',
|
||||
'system_notice.release_notes.feature_routing_title': 'คำนวณเส้นทางได้เร็วขึ้น',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'คำนวณเส้นทางทั้งวันได้ในครั้งเดียว สูงสุด 20 จุดแวะ เส้นทางที่ช้าเส้นเดียวจะไม่ทำให้เส้นอื่นต้องรออีกต่อไป และขนส่งสาธารณะจะถามผู้ให้บริการรายที่สองเมื่อรายแรกหาไม่เจอ',
|
||||
'system_notice.release_notes.footnote': 'รวมถึงรายการการเปลี่ยนแปลงเล็ก ๆ อีกยาวเหยียดทั่วทั้ง TREK',
|
||||
'system_notice.release_notes.notes_label': 'บันทึกประจำรุ่น',
|
||||
'system_notice.release_notes.note_eyebrow': 'ข้อความจากผู้ดูแลโครงการ',
|
||||
@@ -86,9 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'แล้วคุณก็ทำเช่นนั้น ภายในไม่กี่เดือนมีคุณหลายพันคน: ดาว รายงานบั๊ก คำแปลในภาษาที่ผมพูดไม่ได้ และ pull request จากผู้คนที่ผมไม่เคยพบ ผมยังตรวจดูคลังโค้ดเป็นสิ่งแรกทุกเช้า และมันก็ยังไม่ค่อยเหมือนเรื่องจริง',
|
||||
'system_notice.release_notes.note_closing': 'ขอบคุณที่อยู่ตรงนี้ จาก Maurice',
|
||||
'system_notice.release_notes.support_lead': 'TREK ฟรีและจะฟรีเสมอ แต่เซิร์ฟเวอร์ โดเมน และคืนดึก ๆ มากมายไม่ฟรี',
|
||||
'system_notice.release_notes.support_label': 'อิสระต่อไป',
|
||||
'system_notice.release_notes.support_lead': 'ไม่ต้องพึ่ง Google และเจ้าใหญ่อื่น ๆ',
|
||||
'system_notice.release_notes.support_text':
|
||||
'หาก TREK มีที่ในทริปของคุณ ซื้อกาแฟให้ผมสักแก้วและช่วยให้อัปเดตถัดไปเกิดขึ้นได้',
|
||||
'การค้นหาสถานที่ การค้นหาที่อยู่ และการคำนวณเส้นทาง ทำงานบนเซิร์ฟเวอร์ของ TREK เอง ซึ่งวันนี้ได้รับการสนับสนุนจาก dataforest cloud ผมสู้เพื่อสิ่งนี้ทุกวัน และการรักษามันไว้แบบนี้ต้องอาศัยการสนับสนุนจากคุณ',
|
||||
'system_notice.release_notes.cta_bmc': 'ซื้อกาแฟให้ผม',
|
||||
'system_notice.release_notes.cta_kofi': 'สนับสนุนผ่าน Ko-fi',
|
||||
};
|
||||
|
||||
@@ -258,6 +258,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Özellik İsteği',
|
||||
'settings.about.featureRequestHint': 'Yeni bir özellik önerin',
|
||||
'settings.about.wikiHint': 'Belgeler ve kılavuzlar',
|
||||
'settings.about.sponsor.eyebrow': 'Sponsorlu altyapı',
|
||||
'settings.about.sponsor.title': "TREK'in kendi sunucuları dataforest cloud üzerinde çalışır",
|
||||
'settings.about.sponsor.body':
|
||||
"Yer arama, adres arama ve rota hesaplama Google ve benzerleri yerine TREK'in kendi sunucularından gelir; bu sunucuların çalıştığı makinelerin sponsoru da dataforest cloud.",
|
||||
'settings.about.sponsor.cta': "dataforest cloud'u ziyaret edin",
|
||||
'settings.about.sponsor.search': 'Yer arama',
|
||||
'settings.about.sponsor.address': 'Adres arama',
|
||||
'settings.about.sponsor.routing': 'Rota hesaplama',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK, gezilerini ilk fikirden son anıya kadar düzenlemene yardım eder. Gün planı, bütçe, bavul listeleri, fotoğraflar ve çok daha fazlası: hepsi tek yerde.',
|
||||
'settings.about.sourceTitle': 'Kaynak kodu',
|
||||
|
||||
@@ -57,18 +57,15 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.eyebrow': 'Güncelleme yüklendi',
|
||||
'system_notice.release_notes.features_label': 'Öne çıkanlar',
|
||||
'system_notice.release_notes.features_aside': 'Hepsi bu kadar değil',
|
||||
'system_notice.release_notes.feature_tours_title': 'Turlar',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Yürüyüşler, bisiklet turları, koşular, at binme, kürek, şehir yürüyüşleri ve kayak günleri; yükseklik profili, zorluk dereceleri ve 3B uçuşla.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Bir yolculuğu tasarlanmış bir fotoğraf kitabına dönüştürür: 17 tema, 34 yazı tipi, 160 çıkartma ve tek tıkla otomatik yerleşim.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Yapay zekâ asistanı',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Zaten sahip olduğunuz yapay zekâ hesabıyla gerçek seyahatlerinizi sizinle birlikte planlar. Her değişikliği önce görür, isterseniz geri alırsınız.',
|
||||
'system_notice.release_notes.feature_help_title': 'Her ekranda yardım, 27 dilde',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Yaklaşık 370 adım adım rehber ve 1.600 görsel, tam ihtiyaç duyduğunuz yerde. Yeni: Azerbaycanca, Estonca, Slovakça ve Tayca.',
|
||||
'system_notice.release_notes.feature_search_title': 'İsabetli yer arama',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Şehirler, adalar, simge yapılar ve koduyla aranan havalimanları önce gelir, kafeler çevrenizden gelir ve öneriler siz yazarken belirir.',
|
||||
'system_notice.release_notes.feature_share_title': 'Paylaşılan yer ayrıntıları',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Web sitelerini, çalışma saatlerini ve fotoğrafları alan alan her TREK ile paylaşın, kayıtlı yerleriniz de başkalarının eklediklerini alır.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Daha hızlı rota hesaplama',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Bütün bir gün, yirmi durağa kadar tek seferde hesaplanır, yavaş bir rota artık diğerlerini bekletmez ve toplu taşıma, ilk sağlayıcı bir şey bulamazsa ikinci bir sağlayıcıya sorar.',
|
||||
'system_notice.release_notes.footnote':
|
||||
"Ayrıca TREK'in geri kalanına yayılmış, daha küçük değişikliklerden oluşan uzun bir liste var.",
|
||||
'system_notice.release_notes.notes_label': 'Sürüm notları',
|
||||
@@ -83,14 +80,14 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
"Sonra sizler açtınız. Birkaç ay içinde sayınız binleri buldu: yıldızlar, hata bildirimleri, konuşmadığım dillere çeviriler, hiç tanışmadığım insanlardan pull request'ler. Hâlâ her sabah ilk iş repoya bakıyorum ve bu hâlâ tam olarak gerçekmiş gibi gelmiyor.",
|
||||
'system_notice.release_notes.note_closing': 'Burada olduğun için teşekkür ederim. Sevgiler, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK ücretsiz ve hep öyle kalacak, ama sunucular, alan adları ve bir sürü geç gece ücretsiz değil.',
|
||||
'system_notice.release_notes.support_label': 'Bağımsız kalmak',
|
||||
'system_notice.release_notes.support_lead': 'Google ve benzerleri olmadan.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'TREK seyahatlerinde kendine bir yer edindiyse, bana bir kahve ısmarla ve bir sonraki sürümün gelmesine yardım et.',
|
||||
"Yer arama, adres arama ve rota hesaplama TREK'in kendi sunucularında çalışıyor, bugün dataforest cloud sponsorluğunda. Bunun için her gün mücadele ediyorum ve böyle kalması sizin desteğinize bağlı.",
|
||||
'system_notice.release_notes.cta_bmc': 'Bana bir kahve ısmarla',
|
||||
'system_notice.release_notes.cta_kofi': "Ko-fi'de Destek Ol",
|
||||
'system_notice.release_notes.headline': 'Şimdiye kadarki en büyük TREK.',
|
||||
'system_notice.release_notes.headline': 'Önce doğru yer.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Açık havadaki her gün için turlar, fotoğraf kitaplarınız için bir stüdyo, sizinle birlikte plan yapan bir asistan ve her ekranda yardım.',
|
||||
"Yer arama, adres arama ve rota hesaplama artık dataforest cloud sponsorluğunda TREK'in kendi sunucularında çalışıyor ve her TREK, yerler hakkında bildiklerini diğer tüm TREK'lerle paylaşabiliyor.",
|
||||
};
|
||||
export default system_notice;
|
||||
|
||||
@@ -207,6 +207,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Запропонувати функцію',
|
||||
'settings.about.featureRequestHint': 'Запропонуйте нову функцію',
|
||||
'settings.about.wikiHint': 'Документація та керівництва',
|
||||
'settings.about.sponsor.eyebrow': 'Спонсорована інфраструктура',
|
||||
'settings.about.sponsor.title': 'Власні сервери TREK працюють на dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Пошук місць, пошук адрес і маршрути працюють на власних серверах TREK замість Google і компанії, а машини для них спонсорує dataforest cloud.',
|
||||
'settings.about.sponsor.cta': 'Перейти на dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Пошук місць',
|
||||
'settings.about.sponsor.address': 'Пошук адрес',
|
||||
'settings.about.sponsor.routing': 'Маршрути',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK допомагає організувати подорожі від першої ідеї до останнього спогаду. Планування днів, бюджет, списки речей, фото та багато іншого в одному місці.',
|
||||
'settings.about.sourceTitle': 'Вихідний код',
|
||||
|
||||
@@ -56,23 +56,20 @@ const system_notice: TranslationStrings = {
|
||||
'Оновлення 3.0.14 виявило один або кілька конфліктів імен користувачів або електронних адрес, спричинених початковими або кінцевими пробілами в збережених облікових записах. Уражені облікові записи було автоматично перейменовано. Перевірте журнали сервера на рядки, що починаються з **[migration] WHITESPACE COLLISION**, щоб визначити, які облікові записи потребують перевірки.',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Оновлення встановлено',
|
||||
'system_notice.release_notes.headline': 'Найбільший TREK на сьогодні.',
|
||||
'system_notice.release_notes.headline': 'Потрібне місце, з першого разу.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Тури на будь-який день просто неба, студія для ваших фотокниг, асистент, що планує разом з вами, і довідка на кожному екрані.',
|
||||
'Пошук місць, пошук адрес і побудова маршрутів тепер працюють на власних серверах TREK за підтримки dataforest cloud, і кожен TREK може ділитися тим, що знає про місця, з усіма іншими.',
|
||||
'system_notice.release_notes.features_label': 'Головні новинки',
|
||||
'system_notice.release_notes.features_aside': 'І це далеко не все',
|
||||
'system_notice.release_notes.feature_tours_title': 'Тури',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Походи, велотури, пробіжки, кінні прогулянки, сплави, прогулянки містом і дні на лижах, з профілем висот, категоріями складності та 3D-обльотом.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Перетворює подорож на оформлену фотокнигу: 17 тем, 34 шрифти, 160 стікерів і автоматична верстка одним натисканням.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'ШІ-асистент',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Планує разом з вами ваші справжні подорожі через обліковий запис ШІ, який у вас уже є. Кожну зміну ви бачите заздалегідь і можете скасувати.',
|
||||
'system_notice.release_notes.feature_help_title': 'Довідка на кожному екрані, 27 мовами',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Близько 370 покрокових інструкцій і 1600 ілюстрацій саме там, де вони потрібні. Нові мови: азербайджанська, естонська, словацька й тайська.',
|
||||
'system_notice.release_notes.feature_search_title': 'Пошук місць, що влучає в ціль',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
"Міста, острови, пам'ятки та аеропорти за їхнім кодом ідуть першими, кав'ярні шукаються поруч із вами, а підказки з'являються ще під час введення.",
|
||||
'system_notice.release_notes.feature_share_title': 'Спільні відомості про місця',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Діліться сайтами, годинами роботи й фото з усіма TREK, поле за полем, а ваші збережені місця отримують те, що додали інші.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Швидші маршрути',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Увесь день прокладається за один раз, до двадцяти зупинок, один повільний маршрут більше не затримує решту, а громадський транспорт звертається до другого провайдера, якщо перший нічого не знайшов.',
|
||||
'system_notice.release_notes.footnote': 'А також довгий список дрібніших змін по всьому TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Нотатки до релізу',
|
||||
'system_notice.release_notes.note_eyebrow': 'Слово від мейнтейнера',
|
||||
@@ -86,10 +83,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'А потім його відкрили ви. За кілька місяців вас стали тисячі: зірки, звіти про баги, переклади мовами, якими я не володію, пул-реквести від людей, яких я ніколи не зустрічав. Я й досі щоранку насамперед заглядаю в репозиторій, і досі в це не зовсім віриться.',
|
||||
'system_notice.release_notes.note_closing': 'Дякую, що ви тут. Ваш Maurice',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK безкоштовний і таким залишиться, а от сервери, домени й безліч пізніх ночей ні.',
|
||||
'system_notice.release_notes.support_label': 'Лишатися незалежним',
|
||||
'system_notice.release_notes.support_lead': 'Без Google і компанії.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Якщо TREK заслужив місце у ваших подорожах, пригостіть мене кавою і допоможіть наблизити наступний реліз.',
|
||||
'Пошук місць, пошук адрес і маршрути працюють на власних серверах TREK, сьогодні за підтримки dataforest cloud. Я борюся за це щодня, і щоб так і залишалося, потрібна ваша підтримка.',
|
||||
'system_notice.release_notes.cta_bmc': 'Пригостити кавою',
|
||||
'system_notice.release_notes.cta_kofi': 'Підтримати на Ko-fi',
|
||||
};
|
||||
|
||||
@@ -270,6 +270,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': 'Yêu cầu tính năng',
|
||||
'settings.about.featureRequestHint': 'Đề xuất tính năng mới',
|
||||
'settings.about.wikiHint': 'Tài liệu & hướng dẫn',
|
||||
'settings.about.sponsor.eyebrow': 'Hạ tầng được tài trợ',
|
||||
'settings.about.sponsor.title': 'Máy chủ riêng của TREK chạy trên dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'Tìm địa điểm, tìm địa chỉ và chỉ đường đến từ máy chủ riêng của TREK thay vì Google và các dịch vụ khác, còn dataforest cloud tài trợ những máy mà chúng chạy trên đó.',
|
||||
'settings.about.sponsor.cta': 'Ghé thăm dataforest cloud',
|
||||
'settings.about.sponsor.search': 'Tìm địa điểm',
|
||||
'settings.about.sponsor.address': 'Tìm địa chỉ',
|
||||
'settings.about.sponsor.routing': 'Chỉ đường',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK giúp bạn tổ chức các chuyến đi từ ý tưởng đầu tiên đến kỷ niệm cuối cùng. Lên kế hoạch theo ngày, ngân sách, danh sách đồ cần mang, ảnh và nhiều hơn nữa, tất cả ở một nơi.',
|
||||
'settings.about.sourceTitle': 'Mã nguồn',
|
||||
|
||||
@@ -57,23 +57,20 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.pager.position': 'Thông báo {current} của {total}',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': 'Đã cập nhật',
|
||||
'system_notice.release_notes.headline': 'Phiên bản TREK lớn nhất từ trước đến nay.',
|
||||
'system_notice.release_notes.headline': 'Đúng địa điểm, ngay đầu tiên.',
|
||||
'system_notice.release_notes.intro':
|
||||
'Chuyến tham quan cho mọi ngày ngoài trời, studio cho sách ảnh của bạn, trợ lý cùng bạn lên kế hoạch và trợ giúp trên mọi màn hình.',
|
||||
'Tìm địa điểm, tìm địa chỉ và chỉ đường giờ chạy trên máy chủ riêng của TREK, được dataforest cloud tài trợ, và mỗi TREK đều có thể chia sẻ những gì nó biết về các địa điểm với tất cả những TREK khác.',
|
||||
'system_notice.release_notes.features_label': 'Những điểm nhấn',
|
||||
'system_notice.release_notes.features_aside': 'Chưa phải tất cả',
|
||||
'system_notice.release_notes.feature_tours_title': 'Chuyến tham quan',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'Đi bộ đường dài, đạp xe, chạy bộ, cưỡi ngựa, chèo thuyền, dạo phố và ngày trượt tuyết, với biểu đồ độ cao, cấp độ khó và bay lượn 3D.',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'Biến chuyến đi thành một cuốn sách ảnh được thiết kế: 17 chủ đề, 34 kiểu chữ, 160 nhãn dán và tự động dàn trang chỉ với một cú nhấp.',
|
||||
'system_notice.release_notes.feature_assistant_title': 'Trợ lý AI',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'Cùng bạn lên kế hoạch cho những chuyến đi thật, bằng tài khoản AI bạn đã có. Mọi thay đổi đều hiện ra trước và có thể hoàn tác.',
|
||||
'system_notice.release_notes.feature_help_title': 'Trợ giúp trên mọi màn hình, bằng 27 ngôn ngữ',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'Khoảng 370 hướng dẫn từng bước cùng 1.600 hình ảnh, ngay nơi bạn cần. Mới: tiếng Azerbaijan, Estonia, Slovakia và Thái.',
|
||||
'system_notice.release_notes.feature_search_title': 'Tìm địa điểm trúng ngay',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'Thành phố, hòn đảo, địa danh và sân bay theo mã hiện lên trước, quán cà phê được tìm quanh bạn, và gợi ý xuất hiện ngay khi bạn đang gõ.',
|
||||
'system_notice.release_notes.feature_share_title': 'Chi tiết địa điểm, cùng chia sẻ',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'Chia sẻ trang web, giờ mở cửa và ảnh với mọi TREK, theo từng mục, và những địa điểm bạn đã lưu sẽ nhận thêm thông tin người khác bổ sung.',
|
||||
'system_notice.release_notes.feature_routing_title': 'Chỉ đường nhanh hơn',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'Cả một ngày với tối đa hai mươi điểm dừng được chỉ đường trong một lần, một tuyến chậm không còn giữ chân các tuyến khác, và phương tiện công cộng sẽ hỏi nhà cung cấp thứ hai khi nhà cung cấp đầu tiên không tìm thấy gì.',
|
||||
'system_notice.release_notes.footnote':
|
||||
'Và còn cả một danh sách dài những thay đổi nhỏ hơn ở khắp phần còn lại của TREK.',
|
||||
'system_notice.release_notes.notes_label': 'Ghi chú phát hành',
|
||||
@@ -88,10 +85,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'Rồi các bạn đã mở nó. Chỉ trong vài tháng đã có hàng nghìn bạn: những ngôi sao, báo lỗi, bản dịch sang những ngôn ngữ tôi không biết nói, pull request từ những người tôi chưa từng gặp. Đến giờ, việc đầu tiên tôi làm mỗi sáng vẫn là mở kho mã, và cảm giác vẫn chưa hẳn là thật.',
|
||||
'system_notice.release_notes.note_closing': 'Cảm ơn bạn đã ở đây. Thân mến, Maurice.',
|
||||
'system_notice.release_notes.support_lead':
|
||||
'TREK miễn phí và sẽ luôn như vậy, nhưng máy chủ, tên miền và rất nhiều đêm thức khuya thì không.',
|
||||
'system_notice.release_notes.support_label': 'Giữ sự độc lập',
|
||||
'system_notice.release_notes.support_lead': 'Không phụ thuộc Google và các ông lớn.',
|
||||
'system_notice.release_notes.support_text':
|
||||
'Nếu TREK đã có một chỗ trong những chuyến đi của bạn, hãy mời tôi một ly cà phê để bản phát hành tiếp theo tiếp tục ra đời.',
|
||||
'Tìm địa điểm, tìm địa chỉ và chỉ đường chạy trên máy chủ riêng của TREK, hiện được dataforest cloud tài trợ. Tôi chiến đấu vì điều đó mỗi ngày, và để giữ được như vậy cần có sự ủng hộ của bạn.',
|
||||
'system_notice.release_notes.cta_bmc': 'Mời tôi một ly cà phê',
|
||||
'system_notice.release_notes.cta_kofi': 'Hỗ trợ trên Ko-fi',
|
||||
};
|
||||
|
||||
@@ -249,6 +249,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': '功能建議',
|
||||
'settings.about.featureRequestHint': '建議新功能',
|
||||
'settings.about.wikiHint': '文件與指南',
|
||||
'settings.about.sponsor.eyebrow': '贊助的基礎設施',
|
||||
'settings.about.sponsor.title': 'TREK 自己的伺服器執行於 dataforest cloud',
|
||||
'settings.about.sponsor.body':
|
||||
'地點搜尋、地址搜尋和路線規劃都來自 TREK 自己的伺服器,而不是 Google 等服務,執行這些伺服器的機器由 dataforest cloud 贊助。',
|
||||
'settings.about.sponsor.cta': '前往 dataforest cloud',
|
||||
'settings.about.sponsor.search': '地點搜尋',
|
||||
'settings.about.sponsor.address': '地址搜尋',
|
||||
'settings.about.sponsor.routing': '路線規劃',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK 協助你整理旅行,從第一個想法到最後一份回憶。每日規劃、預算、行李清單、照片等功能,全都集中在同一處。',
|
||||
'settings.about.sourceTitle': '原始碼',
|
||||
|
||||
@@ -55,23 +55,20 @@ const system_notice: TranslationStrings = {
|
||||
'3.0.14 版本升級偵測到一個或多個由儲存帳戶中前後空白字元引發的使用者名稱或電子郵件衝突。受影響的帳戶已自動重新命名。請檢查伺服器日誌中以 **[migration] WHITESPACE COLLISION** 開頭的行,以確認哪些帳戶需要審查。',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': '更新已安裝',
|
||||
'system_notice.release_notes.headline': '迄今最大的 TREK。',
|
||||
'system_notice.release_notes.headline': '對的地方,排在最前。',
|
||||
'system_notice.release_notes.intro':
|
||||
'適合每個戶外日子的遊程、為你的相簿而生的工作室、與你一起規劃的助理,以及每個畫面上的說明。',
|
||||
'地點搜尋、地址搜尋和路線規劃現在都在 TREK 自己的伺服器上執行,由 dataforest cloud 贊助。而且每個 TREK 都能把它對地點的了解分享給所有其他 TREK。',
|
||||
'system_notice.release_notes.features_label': '本次重頭戲',
|
||||
'system_notice.release_notes.features_aside': '遠不止這些',
|
||||
'system_notice.release_notes.feature_tours_title': '遊程',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'健行、單車、跑步、騎馬、划槳、城市散步和滑雪日,附海拔剖面、難度等級和 3D 飛覽。',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'把一趟旅程變成精心設計的相簿:17 種主題、34 款字體、160 張貼紙,一鍵自動排版。',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI 助理',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'用你已有的 AI 帳號,在你真實的旅行中與你一起規劃。每項變更都會先顯示給你,而且可以復原。',
|
||||
'system_notice.release_notes.feature_help_title': '每個畫面都有說明,支援 27 種語言',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'約 370 篇逐步指南、1,600 張圖片,就在你需要的地方。新增亞塞拜然語、愛沙尼亞語、斯洛伐克語和泰語。',
|
||||
'system_notice.release_notes.feature_search_title': '一搜就準的地點搜尋',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'城市、島嶼、地標,以及用代碼搜尋的機場排在最前,咖啡廳則從你身邊找起,邊打字邊出現建議。',
|
||||
'system_notice.release_notes.feature_share_title': '地點資訊,大家共享',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'把網站、營業時間和照片逐項分享給每一個 TREK,你儲存的地點也會自動補上其他人新增的資訊。',
|
||||
'system_notice.release_notes.feature_routing_title': '更快的路線規劃',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'一整天最多二十個停靠點,一次就能規劃完成。一條慢路線不再拖累其他路線,大眾運輸在第一個服務商找不到結果時,會再詢問第二個。',
|
||||
'system_notice.release_notes.footnote': '除此之外,TREK 的其他部分還有一長串小改動。',
|
||||
'system_notice.release_notes.notes_label': '版本說明',
|
||||
'system_notice.release_notes.note_eyebrow': '來自維護者的話',
|
||||
@@ -85,9 +82,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'後來,你們真的來了。短短幾個月,就來了成千上萬的你們:有人按星標、回報 bug,有人把它翻譯成我不會說的語言,還有素未謀面的人送出 pull request。直到今天,我每天早上第一件事仍是打開儲存庫看看,而這一切還是有點不太真實。',
|
||||
'system_notice.release_notes.note_closing': '謝謝你來到這裡,Maurice 敬上。',
|
||||
'system_notice.release_notes.support_lead': 'TREK 現在免費,以後也永遠免費,但伺服器、網域和無數個深夜可不是免費的。',
|
||||
'system_notice.release_notes.support_label': '保持獨立',
|
||||
'system_notice.release_notes.support_lead': '不靠 Google 之流。',
|
||||
'system_notice.release_notes.support_text':
|
||||
'如果它已經在你的旅行中佔有一席之地,請我喝杯咖啡,幫我把下一個版本繼續做出來吧。',
|
||||
'地點搜尋、地址搜尋和路線規劃都在 TREK 自己的伺服器上執行,目前由 dataforest cloud 贊助。我每天都在為此努力,而要一直維持下去,需要你的支持。',
|
||||
'system_notice.release_notes.cta_bmc': 'Buy me a coffee',
|
||||
'system_notice.release_notes.cta_kofi': '在 Ko-fi 上支持我',
|
||||
};
|
||||
|
||||
@@ -200,6 +200,14 @@ const settings: TranslationStrings = {
|
||||
'settings.about.featureRequest': '功能建议',
|
||||
'settings.about.featureRequestHint': '建议一个新功能',
|
||||
'settings.about.wikiHint': '文档和指南',
|
||||
'settings.about.sponsor.eyebrow': '赞助的基础设施',
|
||||
'settings.about.sponsor.title': 'TREK 自己的服务器运行在 dataforest cloud 上',
|
||||
'settings.about.sponsor.body':
|
||||
'地点搜索、地址搜索和路线规划都来自 TREK 自己的服务器,而不是 Google 等服务,运行这些服务器的机器由 dataforest cloud 赞助。',
|
||||
'settings.about.sponsor.cta': '访问 dataforest cloud',
|
||||
'settings.about.sponsor.search': '地点搜索',
|
||||
'settings.about.sponsor.address': '地址搜索',
|
||||
'settings.about.sponsor.routing': '路线规划',
|
||||
'settings.about.descriptionManaged':
|
||||
'TREK 帮你从最初的想法到最后的回忆,全程组织你的旅行。日程规划、预算、行李清单、照片等等,一应俱全。',
|
||||
'settings.about.sourceTitle': '源代码',
|
||||
|
||||
@@ -54,23 +54,20 @@ const system_notice: TranslationStrings = {
|
||||
'3.0.14 版本升级检测到一个或多个由存储账户中首尾空白字符引发的用户名或邮箱冲突。受影响的账户已自动重命名。请检查服务器日志中以 **[migration] WHITESPACE COLLISION** 开头的行,以确认哪些账户需要审查。',
|
||||
// The release modal. One stable set of keys: each big release swaps the copy in place.
|
||||
'system_notice.release_notes.eyebrow': '更新已安装',
|
||||
'system_notice.release_notes.headline': '迄今最大的 TREK。',
|
||||
'system_notice.release_notes.headline': '对的地方,排在最前。',
|
||||
'system_notice.release_notes.intro':
|
||||
'适合每一个户外日子的游览、为你的相册而生的工作室、与你一起规划的助手,以及每个页面上的帮助。',
|
||||
'地点搜索、地址搜索和路线规划现在运行在 TREK 自己的服务器上,由 dataforest cloud 赞助。而且每个 TREK 都能把它对地点的了解分享给所有其他 TREK。',
|
||||
'system_notice.release_notes.features_label': '本次重头戏',
|
||||
'system_notice.release_notes.features_aside': '远不止这些',
|
||||
'system_notice.release_notes.feature_tours_title': '游览',
|
||||
'system_notice.release_notes.feature_tours_body':
|
||||
'徒步、骑行、跑步、骑马、划桨、城市漫步和滑雪日,附带海拔剖面、难度等级和 3D 飞览。',
|
||||
'system_notice.release_notes.feature_studio_title': 'TREK Studio', // same-as-en
|
||||
'system_notice.release_notes.feature_studio_body':
|
||||
'把一段旅程变成精心设计的相册:17 种主题、34 款字体、160 枚贴纸,一键自动排版。',
|
||||
'system_notice.release_notes.feature_assistant_title': 'AI 助手',
|
||||
'system_notice.release_notes.feature_assistant_body':
|
||||
'用你已有的 AI 账户,在你真实的旅行中与你一起规划。每项更改都会先展示给你,并且可以撤销。',
|
||||
'system_notice.release_notes.feature_help_title': '每个页面都有帮助,支持 27 种语言',
|
||||
'system_notice.release_notes.feature_help_body':
|
||||
'约 370 篇分步指南、1,600 张配图,就在你需要的地方。新增阿塞拜疆语、爱沙尼亚语、斯洛伐克语和泰语。',
|
||||
'system_notice.release_notes.feature_search_title': '一搜就准的地点搜索',
|
||||
'system_notice.release_notes.feature_search_body':
|
||||
'城市、岛屿、地标,以及按代码搜索的机场排在最前,咖啡馆则从你身边找起,边输入边出建议。',
|
||||
'system_notice.release_notes.feature_share_title': '地点详情,大家共享',
|
||||
'system_notice.release_notes.feature_share_body':
|
||||
'把网站、营业时间和照片逐项分享给每一个 TREK,你保存的地点也会自动补上别人添加的信息。',
|
||||
'system_notice.release_notes.feature_routing_title': '更快的路线规划',
|
||||
'system_notice.release_notes.feature_routing_body':
|
||||
'一整天最多二十个停靠点,一次就能规划完。一条慢路线不再拖累其他路线,公共交通在第一个服务商找不到结果时,会再问第二个。',
|
||||
'system_notice.release_notes.footnote': '除此之外,TREK 的其他部分还有一长串小改动。',
|
||||
'system_notice.release_notes.notes_label': '更新说明',
|
||||
'system_notice.release_notes.note_eyebrow': '来自维护者的话',
|
||||
@@ -83,9 +80,10 @@ const system_notice: TranslationStrings = {
|
||||
'system_notice.release_notes.note_body_after':
|
||||
'后来,你们真的来了。短短几个月,就来了成千上万的你们:有人点星标、报 bug,有人把它翻译成我不会说的语言,还有素未谋面的人提交 pull request。直到今天,我每天早上第一件事仍是打开仓库看看,而这一切还是有点不像真的。',
|
||||
'system_notice.release_notes.note_closing': '谢谢你来到这里,Maurice 敬上。',
|
||||
'system_notice.release_notes.support_lead': 'TREK 现在免费,以后也永远免费,但服务器、域名和无数个深夜可不是免费的。',
|
||||
'system_notice.release_notes.support_label': '保持独立',
|
||||
'system_notice.release_notes.support_lead': '不靠 Google 之流。',
|
||||
'system_notice.release_notes.support_text':
|
||||
'如果它已经在你的旅行中占有一席之地,请我喝杯咖啡,帮我把下一个版本继续做出来吧。',
|
||||
'地点搜索、地址搜索和路线规划都运行在 TREK 自己的服务器上,目前由 dataforest cloud 赞助。我每天都在为此努力,而要一直保持下去,需要你的支持。',
|
||||
'system_notice.release_notes.cta_bmc': '请我喝杯咖啡',
|
||||
'system_notice.release_notes.cta_kofi': '在 Ko-fi 上支持',
|
||||
};
|
||||
|
||||
@@ -87,6 +87,8 @@ const noticeReleaseSchema = z.object({
|
||||
bodyAfterKey: z.string(),
|
||||
closingKey: z.string(),
|
||||
}),
|
||||
/** Labels the support footer as a card like the promise; without it the footer is a plain line. */
|
||||
supportLabelKey: z.string().optional(),
|
||||
/** The support footer's opening sentence, set in bold before the rest. */
|
||||
supportLeadKey: z.string(),
|
||||
supportTextKey: z.string(),
|
||||
|
||||
Reference in New Issue
Block a user