diff --git a/README.md b/README.md index 2c375e5..fefd8e0 100644 --- a/README.md +++ b/README.md @@ -310,7 +310,7 @@ Thingport ships two small companion tools, each downloadable from the in-app Dow ## Provider Setup -Printables imports work with no setup. MakerWorld and Thingiverse each need a credential from your own account first. Connect them under **Configuration → Providers** (from the user menu): right-click a provider to connect or disconnect it. Admins can turn any provider off for the whole instance under **Administration → Providers**. See **[docs/PROVIDER_SETUP.md](docs/PROVIDER_SETUP.md)** for how to create a Thingiverse Access Token and how to grab a MakerWorld session cookie. +Printables imports work with no setup. MakerWorld and Thingiverse each need a credential from your own account first. Connect them under **Configuration → Providers** (from the user menu): right-click a provider to connect or disconnect it. Admins can turn any provider off for the whole instance under **Administration → Providers**. See **[docs/PROVIDER_SETUP.md](docs/PROVIDER_SETUP.md)** for how to create a Thingiverse App Token and how to grab a MakerWorld session cookie. ## Contributing diff --git a/backend/src/routes/imports.ts b/backend/src/routes/imports.ts index 2da3d3d..ebcc0db 100644 --- a/backend/src/routes/imports.ts +++ b/backend/src/routes/imports.ts @@ -291,7 +291,7 @@ router.post( if (!accessToken) { throw new HttpError( 503, - "Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.", + "Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.", ); } @@ -329,7 +329,7 @@ router.post( if (!accessToken) { throw new HttpError( 503, - "Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.", + "Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.", ); } diff --git a/backend/src/routes/settings.ts b/backend/src/routes/settings.ts index 1e31447..aca9d1d 100644 --- a/backend/src/routes/settings.ts +++ b/backend/src/routes/settings.ts @@ -338,7 +338,7 @@ router.post( if (trimmed && !(await verifyThingiverseAccessToken(trimmed))) { throw new HttpError( 422, - "Couldn't verify this Thingiverse Access Token -- it may be invalid, revoked, or Thingiverse is rate-limiting this instance right now. Double-check the token at thingiverse.com/apps/create and try again.", + "Couldn't verify this Thingiverse App Token -- it may be invalid, revoked, or Thingiverse is rate-limiting this instance right now. Double-check the token at thingiverse.com/apps/create and try again.", ); } await setThingiverseAccessToken(body.access_token); diff --git a/backend/src/services/fillGapsService.ts b/backend/src/services/fillGapsService.ts index 8f655fe..60e6ae2 100644 --- a/backend/src/services/fillGapsService.ts +++ b/backend/src/services/fillGapsService.ts @@ -54,14 +54,14 @@ export async function fetchSourceMeta(userId: string, print: Print, sourceUrl: s if (!accessToken) { throw new HttpError( 503, - "Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.", + "Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.", ); } const resolved = await resolveThingiverseThing(externalId, accessToken); if (!resolved) { throw new HttpError( 404, - "This Thingiverse Thing could not be found, or isn't accessible with the configured Access Token.", + "This Thingiverse Thing could not be found, or isn't accessible with the configured App Token.", ); } return { diff --git a/backend/src/services/importJobRunner.ts b/backend/src/services/importJobRunner.ts index 72fd102..fc8c051 100644 --- a/backend/src/services/importJobRunner.ts +++ b/backend/src/services/importJobRunner.ts @@ -392,7 +392,7 @@ async function runThingiverseThingsImportJob( if (!accessToken) { throw new HttpError( 503, - "Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.", + "Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.", ); } @@ -486,7 +486,7 @@ async function runThingiverseThingsImportJob( `${rateLimited} blocked by Thingiverse's rate-limit protection (too many requests at once) — wait a while, then retry`, ); } - if (authFailed) bodyParts.push(`${authFailed} failed because the configured Access Token was rejected`); + if (authFailed) bodyParts.push(`${authFailed} failed because the configured App Token was rejected`); if (otherFailed) bodyParts.push(`${otherFailed} failed`); const label = sourceLabel(collectionTitle); await createNotification(userId, { diff --git a/backend/src/services/importService.ts b/backend/src/services/importService.ts index 8321c02..d20c6e6 100644 --- a/backend/src/services/importService.ts +++ b/backend/src/services/importService.ts @@ -778,7 +778,7 @@ async function importThingiverseThing( if (!accessToken) { throw new HttpError( 503, - "Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.", + "Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.", ); } @@ -794,7 +794,7 @@ async function importThingiverseThing( if (!resolved) { throw new HttpError( 404, - "This Thingiverse Thing could not be found, or isn't accessible with the configured Access Token.", + "This Thingiverse Thing could not be found, or isn't accessible with the configured App Token.", ); } const { meta, plateFiles, galleryImages } = resolved; diff --git a/backend/src/services/thingiverseApi.ts b/backend/src/services/thingiverseApi.ts index abd1f24..1fe5eae 100644 --- a/backend/src/services/thingiverseApi.ts +++ b/backend/src/services/thingiverseApi.ts @@ -10,7 +10,7 @@ import { } from "./flaresolverr"; import { getFlaresolverrUrl } from "./settingsService"; -// The official API needs an app Access Token (not a session cookie). It's still behind Cloudflare +// The official API needs an App Token (not a session cookie). It's still behind Cloudflare // and returns a sticky 429 challenge after a few rapid requests, hence ThingiverseRateLimitError // and the FlareSolverr fallback. const THINGIVERSE_API_BASE = "https://api.thingiverse.com"; @@ -25,7 +25,7 @@ function isRecord(value: unknown): value is Record { export class ThingiverseAuthError extends Error { constructor() { super( - "The Thingiverse Access Token configured for this instance was rejected. Ask an admin to " + + "The Thingiverse App Token configured for this instance was rejected. Ask an admin to " + "update it in Admin Settings (a new one can be generated at thingiverse.com/apps/create).", ); this.name = "ThingiverseAuthError"; diff --git a/backend/tests/authorLinking.test.ts b/backend/tests/authorLinking.test.ts index 3110396..3fbf85f 100644 --- a/backend/tests/authorLinking.test.ts +++ b/backend/tests/authorLinking.test.ts @@ -253,7 +253,7 @@ describe("looking up authors no known author matches", () => { await prisma.user.update({ where: { id: userId }, data: { makerworldCookie: null } }); }); - it("skips Thingiverse without an access token, and says so", async () => { + it("skips Thingiverse without an App Token, and says so", async () => { await setThingiverseAccessToken(null); const print = await unattributedPrint("lookup-tv", "thingiverse", `TvPerson${stamp}`); mockFetch({}); diff --git a/backend/tests/importJobRunner.test.ts b/backend/tests/importJobRunner.test.ts index b498021..97848d4 100644 --- a/backend/tests/importJobRunner.test.ts +++ b/backend/tests/importJobRunner.test.ts @@ -274,7 +274,7 @@ describe("runThingiverseLikesImportJob", () => { await setThingiverseAccessToken(null); }); - it("fails clearly when no Access Token is configured, without touching the job's other bookkeeping", async () => { + it("fails clearly when no App Token is configured, without touching the job's other bookkeeping", async () => { const job = await createJob(userId, "COLLECTION", { sourceUrl: "https://www.thingiverse.com/someuser/likes", provider: "thingiverse", @@ -458,7 +458,7 @@ describe("runThingiverseCollectionImportJob", () => { expect(finished?.sourceLabel).toBe("Thingiverse Collection 40781575"); }); - it("fails clearly when no Access Token is configured", async () => { + it("fails clearly when no App Token is configured", async () => { const job = await createJob(userId, "COLLECTION", { sourceUrl: "https://www.thingiverse.com/someone/collections/1/things", provider: "thingiverse", diff --git a/backend/tests/providerCollections.test.ts b/backend/tests/providerCollections.test.ts index 9342c04..d1e3b0e 100644 --- a/backend/tests/providerCollections.test.ts +++ b/backend/tests/providerCollections.test.ts @@ -241,7 +241,7 @@ describe("Thingiverse likes in the Browse tab", () => { await setThingiverseAccessToken("rejected-token"); const list = await request(app).get("/api/provider-collections").query({ provider: "thingiverse" }).set(auth()); expect(list.status).toBe(400); - expect(list.body.detail).toMatch(/Access Token .* was rejected/); + expect(list.body.detail).toMatch(/App Token .* was rejected/); await setThingiverseAccessToken("test-token"); }); diff --git a/backend/tests/thingiverseCollection.test.ts b/backend/tests/thingiverseCollection.test.ts index 7bef25c..cace592 100644 --- a/backend/tests/thingiverseCollection.test.ts +++ b/backend/tests/thingiverseCollection.test.ts @@ -175,7 +175,7 @@ describe("POST /import/thingiverse-collection/entries", () => { expect(res.status).toBe(400); }); - it("fails with a clear 503 when no Access Token is configured", async () => { + it("fails with a clear 503 when no App Token is configured", async () => { const res = await request(app) .post("/api/import/thingiverse-collection/entries") .set("Authorization", `Bearer ${token}`) diff --git a/backend/tests/thingiverseImport.test.ts b/backend/tests/thingiverseImport.test.ts index 313a53d..98521cc 100644 --- a/backend/tests/thingiverseImport.test.ts +++ b/backend/tests/thingiverseImport.test.ts @@ -105,7 +105,7 @@ describe("importPrintFromUrl -- Thingiverse", () => { await setThingiverseAccessToken(null); }); - it("fails clearly when no Access Token is configured", async () => { + it("fails clearly when no App Token is configured", async () => { await expect(importPrintFromUrl(userId, THING_URL, { url: THING_URL, tags: [] })).rejects.toThrow( /isn't configured/i, ); @@ -115,7 +115,7 @@ describe("importPrintFromUrl -- Thingiverse", () => { await setThingiverseAccessToken(ACCESS_TOKEN); global.fetch = mockThingiverseFetch({ detailStatus: 401, detailBody: { error: "invalid" } }); - await expect(importPrintFromUrl(userId, THING_URL, { url: THING_URL, tags: [] })).rejects.toThrow(/access token/i); + await expect(importPrintFromUrl(userId, THING_URL, { url: THING_URL, tags: [] })).rejects.toThrow(/app token/i); }); it("imports a Thing's model files as plates, matches category, and attaches metadata + images", async () => { diff --git a/backend/tests/thingiverseLikes.test.ts b/backend/tests/thingiverseLikes.test.ts index 8638602..a322977 100644 --- a/backend/tests/thingiverseLikes.test.ts +++ b/backend/tests/thingiverseLikes.test.ts @@ -114,7 +114,7 @@ describe("POST /import/thingiverse-likes/entries", () => { await setThingiverseAccessToken(null); }); - it("fails with a clear 503 when no Access Token is configured", async () => { + it("fails with a clear 503 when no App Token is configured", async () => { const res = await request(app) .post("/api/import/thingiverse-likes/entries") .set("Authorization", `Bearer ${token}`) diff --git a/docs/PROVIDER_SETUP.md b/docs/PROVIDER_SETUP.md index a5d8d1e..429358f 100644 --- a/docs/PROVIDER_SETUP.md +++ b/docs/PROVIDER_SETUP.md @@ -6,13 +6,13 @@ Connect them under **Configuration → Providers**: open the user menu (your ava ![Configuration, Providers section with MakerWorld, Thingiverse and Printables connected](../frontend/src/assets/screenshots/11_configuration_providers.png) -## Thingiverse Access Token +## Thingiverse App Token -Instance-wide, admin-configured (Configuration > Providers > Thingiverse, or Administration > Providers > Thingiverse Access Token) -- one token is shared by every user's Thingiverse imports. Other users see Thingiverse as connected once an admin has set it up. +Instance-wide, admin-configured (Configuration > Providers > Thingiverse, or Administration > Providers > Thingiverse App Token) -- one token is shared by every user's Thingiverse imports. Other users see Thingiverse as connected once an admin has set it up. 1. Sign in to your Thingiverse account, then go to [thingiverse.com/apps/create](https://www.thingiverse.com/apps/create). 2. Register a new app. The name/description don't matter for this; pick whichever Application Type doesn't require a redirect URL (e.g. "Desktop" or "Mobile") -- a "Web App" asks for OAuth details you don't need here. -3. Once created, Thingiverse shows an **Access Token** for it. This is different from your Thingiverse login password -- it's a permanent credential tied to that registered app. +3. Once created, Thingiverse shows an **App Token** for it. This is different from your Thingiverse login password -- it's a permanent credential tied to that registered app. 4. Copy it, right-click **Thingiverse** in Thingport's **Configuration > Providers**, choose **Connect** and paste it. Thingport verifies the token against Thingiverse before storing it, so a mistyped or revoked token is rejected immediately with a clear error instead of only failing on the next import. Treat this token like a password: anyone who has it can use it to act as your Thingiverse app. If it's ever exposed, revoke it from your Thingiverse account's Apps page and generate a new one. @@ -43,4 +43,4 @@ Admins choose which providers this Thingport imports from, under **Administratio default. Turn one off and nothing new comes from it for anyone: links to it, Thingport Grab and the import queue are refused, its synced collections pause, and background jobs skip it. It also disappears from everyone's **Configuration → Providers**. Models already imported from it stay as they are, and turning it back on picks up where -it left off. The Thingiverse Access Token is set on the same page. +it left off. The Thingiverse App Token is set on the same page. diff --git a/docs/features/administration.md b/docs/features/administration.md index 7564004..0aa9a49 100644 --- a/docs/features/administration.md +++ b/docs/features/administration.md @@ -6,7 +6,7 @@ first account on an instance is its admin, and there's no config file to edit af | Page | What it's for | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Overview | [System Health](../guides/system-health.md) for everything Thingport relies on, disk space used, and the update check, which says when newer Thingport images are out. | -| Providers | Turn MakerWorld, Printables or Thingiverse off for everyone, and set the Thingiverse Access Token. See [turning a provider off](../PROVIDER_SETUP.md#turning-a-provider-off). | +| Providers | Turn MakerWorld, Printables or Thingiverse off for everyone, and set the Thingiverse App Token. See [turning a provider off](../PROVIDER_SETUP.md#turning-a-provider-off). | | Storage | The folder layout on disk, reorganizing existing files, browsing the storage folder, and the [consume folder](../guides/consume-folder.md). See [plain files on your disk](storage.md). | | Auth | The public URL, open or invite-only registration, [single sign-on](../guides/single-sign-on.md) providers, and how long a sign-in lasts. | | Rendering | How card thumbnails are made, and simplifying the previews of very detailed models. See [3D previews](3d-previews.md). | diff --git a/docs/features/importing.md b/docs/features/importing.md index 54be94f..7dd1d79 100644 --- a/docs/features/importing.md +++ b/docs/features/importing.md @@ -36,7 +36,7 @@ from Thingport Grab wait in **Administration → Import queue** until they're st ## Before you start -Printables works with no setup. MakerWorld needs your session cookie, and Thingiverse an Access Token set by an admin. +Printables works with no setup. MakerWorld needs your session cookie, and Thingiverse an App Token set by an admin. See [provider setup](../PROVIDER_SETUP.md). Admins can also [turn a provider off](../PROVIDER_SETUP.md#turning-a-provider-off) for the whole instance, and then nothing is imported from it. diff --git a/docs/guides/synced-collections.md b/docs/guides/synced-collections.md index 81f022a..f54aaf8 100644 --- a/docs/guides/synced-collections.md +++ b/docs/guides/synced-collections.md @@ -26,7 +26,7 @@ Thingport imports that model into the matching Thingport collection on its own, extension, on the provider collection's page. - Connect the provider under **Configuration → Providers** where it needs it (see [provider setup](../PROVIDER_SETUP.md)). Printables needs nothing. MakerWorld needs your session cookie to import - models, and to read a private collection. Thingiverse needs an access token. + models, and to read a private collection. Thingiverse needs an App Token. ## Turn sync on in Thingport diff --git a/docs/guides/system-health.md b/docs/guides/system-health.md index ca8d616..139185c 100644 --- a/docs/guides/system-health.md +++ b/docs/guides/system-health.md @@ -22,7 +22,7 @@ for. | File storage | Required | Where model files, pictures and 3D previews are kept. Uploads, imports and downloads fail if it isn't writable or runs out of space. | | Memory | Required | Building 3D previews of large models takes the most. With too little, previews fail or the server restarts. | | FlareSolverr | Recommended | Gets past Cloudflare's checks, mostly on Thingiverse and Printables. Without it, imports and syncs from those sites are blocked whenever Cloudflare challenges the server. | -| Thingiverse | Recommended | The instance's Thingiverse Access Token, used for every Thingiverse import, synced collection and author lookup. Not checked while Thingiverse is [turned off](../PROVIDER_SETUP.md#turning-a-provider-off). | +| Thingiverse | Recommended | The instance's Thingiverse App Token, used for every Thingiverse import, synced collection and author lookup. Not checked while Thingiverse is [turned off](../PROVIDER_SETUP.md#turning-a-provider-off). | | Thingport Grab | Recommended | The [browser extension](../../extension/README.md) for importing while you browse MakerWorld, Printables and Thingiverse, whole collections included, and for bringing over Printables likes. Shown as seen once any browser uses it with this instance. | | AI provider | Optional | The default AI model behind [AI categorization and improved descriptions](ai.md). Everything else works without it. | | Email (SMTP) | Optional | Sends invitations, email confirmations and password resets. Without it, invitation links are shown to copy instead, and new accounts don't confirm their address. | @@ -53,7 +53,7 @@ pull the AI model on Ollama. - **FlareSolverr not answering**: check that its container is running and that the URL under **Administration → Connections → FlareSolverr** is right, port included (usually `http://flaresolverr:8191`). - **Thingiverse token rejected**: generate a new one at [thingiverse.com/apps/create](https://www.thingiverse.com/apps/create) - and save it under **Administration → Providers** (see [provider setup](../PROVIDER_SETUP.md#thingiverse-access-token)). + and save it under **Administration → Providers** (see [provider setup](../PROVIDER_SETUP.md#thingiverse-app-token)). - **AI provider not answering or model missing**: see [troubleshooting the AI features](ai.md#troubleshooting). - **Email not connecting**: check the host, port, security setting and login under **Administration → Connections → SMTP**. diff --git a/frontend/src/components/Layout/GlobalSearch/pages.ts b/frontend/src/components/Layout/GlobalSearch/pages.ts index 737f178..512750d 100644 --- a/frontend/src/components/Layout/GlobalSearch/pages.ts +++ b/frontend/src/components/Layout/GlobalSearch/pages.ts @@ -83,6 +83,7 @@ export const SEARCH_PAGES: SearchPage[] = [ "makerworld", "printables", "thingiverse", + "app token", "access token", ]), adminPage("adminStorage", "/admin-storage", "app:adminSettings.storageSettings.heading", [ diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index f500b5a..1b3d5f5 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -517,11 +517,11 @@ "descriptions": { "makerworld": "Bambu Lab's model site: imports with print profiles, and collections to sync.", "printables": "Prusa's model site: imports, and public and private collections to sync.", - "thingiverse": "Imports, collections and liked models, through this Thingport's Access Token." + "thingiverse": "Imports, collections and liked models, through this Thingport's App Token." }, - "tokenSet": "Access Token set", - "tokenMissing": "No Access Token: Thingiverse imports won't work until one is set", - "tokenSettings": "Thingiverse Access Token", + "tokenSet": "App Token set", + "tokenMissing": "No App Token: Thingiverse imports won't work until one is set", + "tokenSettings": "Thingiverse App Token", "turnOff": "Turn {{name}} off", "turnOn": "Turn {{name}} on", "disableTitle": "Turn {{name}} off?", @@ -624,11 +624,11 @@ }, "thingiverse": { "name": "Thingiverse", - "description": "The instance's Thingiverse Access Token, used to import models, sync collections and liked models, and link authors from Thingiverse.", + "description": "The instance's Thingiverse App Token, used to import models, sync collections and liked models, and link authors from Thingiverse.", "problems": { "disabled": "Turned off under Providers, so nothing is checked. Turn Thingiverse back on there to use it.", - "not_configured": "No Access Token set. Thingiverse imports and syncs won't work until one is added in Settings (create one at thingiverse.com/apps/create).", - "token_rejected": "Thingiverse rejected the Access Token. Generate a new one at thingiverse.com/apps/create and save it in Settings.", + "not_configured": "No App Token set. Thingiverse imports and syncs won't work until one is added in Settings (create one at thingiverse.com/apps/create).", + "token_rejected": "Thingiverse rejected the App Token. Generate a new one at thingiverse.com/apps/create and save it in Settings.", "blocked": "Thingiverse answered with a Cloudflare challenge, which says nothing about the token. Set up FlareSolverr, or wait: it usually clears after a while.", "unreachable": "Thingport couldn't reach Thingiverse. Check the server's internet access, or try again later.", "timeout": "Thingiverse didn't answer in time. Try again later." @@ -824,8 +824,8 @@ "linkAuthorsDone": "Linked {{linked}} model(s) to their author.", "linkAuthorsNotFound": "The author couldn't be found for {{count}} creator(s) — the model may have been removed from its site, or the site couldn't be reached.", "linkAuthorsProblems": { - "thingiverse_no_token": "Thingiverse models were skipped: add a Thingiverse access token in Administration > Settings.", - "thingiverse_token_rejected": "Thingiverse models were skipped: Thingiverse rejected the access token in Administration > Settings.", + "thingiverse_no_token": "Thingiverse models were skipped: add a Thingiverse App Token in Administration > Settings.", + "thingiverse_token_rejected": "Thingiverse models were skipped: Thingiverse rejected the App Token in Administration > Settings.", "thingiverse_rate_limited": "Thingiverse models were skipped: Thingiverse started blocking requests with a rate limit. It usually clears after a while — try again later.", "makerworld_captcha": "MakerWorld models were skipped: MakerWorld asked for a CAPTCHA, and blocks further requests for about 2 hours. Try again later.", "makerworld_login_rejected": "MakerWorld models were skipped: MakerWorld rejected the saved MakerWorld login. Update it in Settings > Imports." @@ -842,18 +842,18 @@ "refetchFailedCount": "{{count}} couldn't be read from their source and were left as they were." }, "thingiverse": { - "heading": "Thingiverse Access Token", - "helpText": "Create an app at thingiverse.com/apps/create (any type, e.g. \"Desktop\") and paste the Access Token it shows you.", - "statusConfigured": "An Access Token is currently configured.", - "statusNotConfigured": "No Access Token is configured yet -- Thingiverse imports will fail until one is set.", - "tokenLabel": "Access Token", + "heading": "Thingiverse App Token", + "helpText": "Create an app at thingiverse.com/apps/create (any type, e.g. \"Desktop\") and paste the App Token it shows you.", + "statusConfigured": "An App Token is currently configured.", + "statusNotConfigured": "No App Token is configured yet -- Thingiverse imports will fail until one is set.", + "tokenLabel": "App Token", "tokenPlaceholder": "Paste a new token to replace the current one", "tokenHelperConfigured": "For security, the current token is never shown again -- leave this blank to keep it, or paste a new one to replace it.", "save": "Save", "saving": "Saving…", "clear": "Remove token", "saved": "Saved.", - "cleared": "Access Token removed.", + "cleared": "App Token removed.", "failed": "Failed to save Thingiverse settings." }, "ai": { @@ -1528,11 +1528,11 @@ ] }, "thingiverse": { - "placeholder": "Paste the App Access Token", + "placeholder": "Paste the App Token", "steps": [ "Sign in at thingiverse.com and open thingiverse.com/apps/create.", "Create an app of any type, such as \"Desktop app\".", - "Copy the App Access Token it shows and paste it below." + "Copy the App Token it shows and paste it below." ], "shared": "This token is shared by everyone on this Thingport.", "adminOnly": "Only an admin of this Thingport can set this up." diff --git a/frontend/src/i18n/locales/lt.json b/frontend/src/i18n/locales/lt.json index c7c746b..e6cea1d 100644 --- a/frontend/src/i18n/locales/lt.json +++ b/frontend/src/i18n/locales/lt.json @@ -517,11 +517,11 @@ "descriptions": { "makerworld": "Bambu Lab modelių svetainė: importai su spausdinimo profiliais ir kolekcijų sinchronizavimas.", "printables": "Prusa modelių svetainė: importai bei viešų ir privačių kolekcijų sinchronizavimas.", - "thingiverse": "Importai, kolekcijos ir patikę modeliai, naudojant šio Thingport prieigos raktą." + "thingiverse": "Importai, kolekcijos ir patikę modeliai, naudojant šio Thingport programėlės raktą." }, - "tokenSet": "Prieigos raktas nustatytas", - "tokenMissing": "Nėra prieigos rakto: Thingiverse importai neveiks, kol jo nenustatysite", - "tokenSettings": "Thingiverse prieigos raktas", + "tokenSet": "Programėlės raktas nustatytas", + "tokenMissing": "Nėra programėlės rakto: Thingiverse importai neveiks, kol jo nenustatysite", + "tokenSettings": "Thingiverse programėlės raktas", "turnOff": "Išjungti {{name}}", "turnOn": "Įjungti {{name}}", "disableTitle": "Išjungti {{name}}?", @@ -625,11 +625,11 @@ }, "thingiverse": { "name": "Thingiverse", - "description": "Sistemos Thingiverse prieigos raktas – modeliams importuoti, kolekcijoms ir patiktiems modeliams sinchronizuoti bei autoriams susieti.", + "description": "Sistemos Thingiverse programėlės raktas – modeliams importuoti, kolekcijoms ir patiktiems modeliams sinchronizuoti bei autoriams susieti.", "problems": { "disabled": "Išjungta skiltyje „Tiekėjai“, todėl netikrinama. Įjunkite Thingiverse ten, kad galėtumėte naudoti.", - "not_configured": "Prieigos raktas nenurodytas. Thingiverse importai ir sinchronizacijos neveiks, kol jo nepridėsite nustatymuose (sukurkite thingiverse.com/apps/create).", - "token_rejected": "Thingiverse atmetė prieigos raktą. Sukurkite naują thingiverse.com/apps/create ir išsaugokite nustatymuose.", + "not_configured": "Programėlės raktas nenurodytas. Thingiverse importai ir sinchronizacijos neveiks, kol jo nepridėsite nustatymuose (sukurkite thingiverse.com/apps/create).", + "token_rejected": "Thingiverse atmetė programėlės raktą. Sukurkite naują thingiverse.com/apps/create ir išsaugokite nustatymuose.", "blocked": "Thingiverse atsakė Cloudflare patikra – tai nieko nesako apie raktą. Įdiekite FlareSolverr arba palaukite: dažniausiai praeina po kurio laiko.", "unreachable": "Thingport nepasiekė Thingiverse. Patikrinkite serverio interneto ryšį arba bandykite vėliau.", "timeout": "Thingiverse laiku neatsakė. Bandykite vėliau." @@ -832,8 +832,8 @@ "linkAuthorsDone": "Su autoriumi susieta modelių: {{linked}}.", "linkAuthorsNotFound": "Nepavyko rasti autoriaus kūrėjams: {{count}} – modelis galėjo būti pašalintas iš svetainės arba svetainė nepasiekiama.", "linkAuthorsProblems": { - "thingiverse_no_token": "Thingiverse modeliai praleisti: pridėkite Thingiverse prieigos raktą skiltyje Administravimas > Nustatymai.", - "thingiverse_token_rejected": "Thingiverse modeliai praleisti: Thingiverse atmetė prieigos raktą, nurodytą skiltyje Administravimas > Nustatymai.", + "thingiverse_no_token": "Thingiverse modeliai praleisti: pridėkite Thingiverse programėlės raktą skiltyje Administravimas > Nustatymai.", + "thingiverse_token_rejected": "Thingiverse modeliai praleisti: Thingiverse atmetė programėlės raktą, nurodytą skiltyje Administravimas > Nustatymai.", "thingiverse_rate_limited": "Thingiverse modeliai praleisti: Thingiverse pradėjo riboti užklausas. Paprastai tai praeina po kurio laiko — bandykite vėliau.", "makerworld_captcha": "MakerWorld modeliai praleisti: MakerWorld paprašė CAPTCHA ir maždaug 2 valandoms blokuoja tolesnes užklausas. Bandykite vėliau.", "makerworld_login_rejected": "MakerWorld modeliai praleisti: MakerWorld atmetė išsaugotą MakerWorld prisijungimą. Atnaujinkite jį skiltyje Nustatymai > Importavimas." @@ -850,18 +850,18 @@ "refetchFailedCount": "Nepavyko nuskaityti iš šaltinio: {{count}}; jie palikti nepakeisti." }, "thingiverse": { - "heading": "Thingiverse prieigos raktas", - "helpText": "Sukurkite programėlę adresu thingiverse.com/apps/create (bet kokio tipo, pvz. „Desktop“) ir įklijuokite ten parodytą prieigos raktą. Tai skiriasi nuo jūsų Thingiverse prisijungimo -- tai nuolatinis raktas, susietas su registruota programėle.", - "statusConfigured": "Šiuo metu sukonfigūruotas prieigos raktas.", - "statusNotConfigured": "Prieigos raktas dar nesukonfigūruotas -- Thingiverse importas neveiks, kol jis nebus nustatytas.", - "tokenLabel": "Prieigos raktas", + "heading": "Thingiverse programėlės raktas (App Token)", + "helpText": "Sukurkite programėlę adresu thingiverse.com/apps/create (bet kokio tipo, pvz. „Desktop“) ir įklijuokite ten parodytą programėlės raktą (App Token). Tai skiriasi nuo jūsų Thingiverse prisijungimo -- tai nuolatinis raktas, susietas su registruota programėle.", + "statusConfigured": "Šiuo metu sukonfigūruotas programėlės raktas.", + "statusNotConfigured": "Programėlės raktas dar nesukonfigūruotas -- Thingiverse importas neveiks, kol jis nebus nustatytas.", + "tokenLabel": "Programėlės raktas", "tokenPlaceholder": "Įklijuokite naują raktą, kad pakeistumėte dabartinį", "tokenHelperConfigured": "Saugumo sumetimais dabartinis raktas daugiau nerodomas -- palikite tuščią, kad jį išsaugotumėte, arba įklijuokite naują, kad jį pakeistumėte.", "save": "Išsaugoti", "saving": "Saugoma…", "clear": "Pašalinti raktą", "saved": "Išsaugota.", - "cleared": "Prieigos raktas pašalintas.", + "cleared": "Programėlės raktas pašalintas.", "failed": "Nepavyko išsaugoti Thingiverse nustatymų." }, "ai": { @@ -1583,11 +1583,11 @@ ] }, "thingiverse": { - "placeholder": "Įklijuokite App Access Token", + "placeholder": "Įklijuokite App Token", "steps": [ "Prisijunkite prie thingiverse.com ir atverkite thingiverse.com/apps/create.", "Sukurkite bet kokio tipo programą, pvz. „Desktop app“.", - "Nukopijuokite rodomą App Access Token ir įklijuokite jį žemiau." + "Nukopijuokite rodomą App Token ir įklijuokite jį žemiau." ], "shared": "Šis raktas bendras visiems šio Thingport naudotojams.", "adminOnly": "Tai nustatyti gali tik šio Thingport administratorius." diff --git a/web/src/pages/features/administration.astro b/web/src/pages/features/administration.astro index f03e7bc..93a40ad 100644 --- a/web/src/pages/features/administration.astro +++ b/web/src/pages/features/administration.astro @@ -46,7 +46,7 @@ const SECTIONS: FeatureSection[] = [ "A provider that's off is off for everyone: links to it, Thingport Grab and the import queue are refused, and it's hidden from each person's provider settings.", "Its synced collections pause and background jobs skip it. Models already imported from it stay as they are.", "Turn it back on whenever you like, and syncs pick up where they left off.", - "Set the Thingiverse Access Token that every user's Thingiverse imports share.", + "Set the Thingiverse App Token that every user's Thingiverse imports share.", ], link: { label: "Provider setup", href: url("docs/providers/#turning-a-provider-off") }, image: providers,