From 99ed08656a3dce5785a385cc2173c2a973f64b5f Mon Sep 17 00:00:00 2001 From: sua yoo Date: Tue, 10 Sep 2024 14:15:26 -0700 Subject: [PATCH] feat: Localization workflow improvements (#2069) - Extracts translatable text strings in pre-commit hook - Updates ternary pluralization to use `pluralOf` instead - Generates XLIFF for Spanish --- .github/workflows/frontend-build-check.yaml | 14 +- frontend/.husky/pre-commit | 13 +- frontend/lit-localize.json | 2 +- frontend/package.json | 7 +- frontend/src/__generated__/locale-codes.ts | 9 +- frontend/src/__generated__/locales/.keep | 0 frontend/src/__generated__/locales/en-US.ts | 1052 ---- frontend/src/components/ui/config-details.ts | 15 +- .../src/features/archived-items/crawl-list.ts | 30 +- .../collections/collection-items-dialog.ts | 12 +- .../collections/collection-workflow-list.ts | 16 +- .../crawl-workflows/workflow-editor.ts | 11 +- .../features/crawl-workflows/workflow-list.ts | 34 +- .../archived-item-detail.ts | 17 +- .../src/pages/org/browser-profiles-detail.ts | 14 +- frontend/src/pages/org/collection-detail.ts | 23 +- frontend/src/pages/org/collections-list.ts | 21 +- .../pages/org/settings/components/billing.ts | 71 +- frontend/src/pages/org/workflow-detail.ts | 15 +- frontend/src/utils/crawler.ts | 18 +- frontend/src/utils/form.ts | 13 +- frontend/src/utils/pluralize.ts | 26 + frontend/xliff/{en-US.xlf => es.xlf} | 5092 ++++++++++------- 23 files changed, 3113 insertions(+), 3412 deletions(-) create mode 100644 frontend/src/__generated__/locales/.keep delete mode 100644 frontend/src/__generated__/locales/en-US.ts rename frontend/xliff/{en-US.xlf => es.xlf} (64%) diff --git a/.github/workflows/frontend-build-check.yaml b/.github/workflows/frontend-build-check.yaml index c99439aa..656e481a 100644 --- a/.github/workflows/frontend-build-check.yaml +++ b/.github/workflows/frontend-build-check.yaml @@ -1,5 +1,14 @@ name: Frontend Build Check on: + push: + branches: + - main + paths: + - 'frontend/src/**' + - 'frontend/*.json' + - 'frontend/*.js' + - 'frontend/*.ts' + - '.github/workflows/frontend-build-check.yaml' pull_request: paths: - 'frontend/src/**' @@ -42,9 +51,12 @@ jobs: - name: Unit tests working-directory: frontend run: yarn test + - name: Check extracted strings + working-directory: frontend + run: yarn localize:extract && git diff-index HEAD -- - name: Localization build working-directory: frontend - run: yarn localize:prepare + run: yarn localize:build - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 diff --git a/frontend/.husky/pre-commit b/frontend/.husky/pre-commit index 04e39140..e2e5a5ca 100755 --- a/frontend/.husky/pre-commit +++ b/frontend/.husky/pre-commit @@ -1,4 +1,13 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -cd frontend -npx lint-staged + +# run hook only if frontend src changed +if git diff --name-only --cached | grep --quiet 'frontend/src/'; + then + cd frontend + npx lint-staged + yarn localize:extract + git add xliff + else + echo "(no frontend/src changes - skipping pre-commit hook)" +fi diff --git a/frontend/lit-localize.json b/frontend/lit-localize.json index 3a0a2fcd..6bc9f9de 100644 --- a/frontend/lit-localize.json +++ b/frontend/lit-localize.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/lit/lit/main/packages/localize-tools/config.schema.json", "sourceLocale": "en", - "targetLocales": ["en-US"], + "targetLocales": ["es"], "tsConfig": "tsconfig.json", "output": { "mode": "runtime", diff --git a/frontend/package.json b/frontend/package.json index 60bf8aeb..c754f170 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -95,7 +95,6 @@ "lint:lit-analyzer": "lit-analyzer", "format": "prettier --write .", "format:check": "prettier --check .", - "localize:prepare": "yarn localize:extract && yarn localize:build", "localize:extract": "lit-localize extract", "localize:build": "lit-localize build" }, @@ -123,11 +122,7 @@ "chromium": "^3.0.3" }, "lint-staged": { - "*.{ts,js}": [ - "prettier --write", - "eslint --fix --quiet" - ], - "*.{html,css,json,webmanifest}": "prettier --write" + "*.{ts,js,html,css,json,webmanifest}": "prettier --write" }, "husky": { "hooks": { diff --git a/frontend/src/__generated__/locale-codes.ts b/frontend/src/__generated__/locale-codes.ts index 8ab8586d..28be186a 100644 --- a/frontend/src/__generated__/locale-codes.ts +++ b/frontend/src/__generated__/locale-codes.ts @@ -10,14 +10,9 @@ export const sourceLocale = `en`; * The other locale codes that this application is localized into. Sorted * lexicographically. */ -export const targetLocales = [ - `en-US`, -] as const; +export const targetLocales = [] as const; /** * All valid project locale codes. Sorted lexicographically. */ -export const allLocales = [ - `en`, - `en-US`, -] as const; +export const allLocales = [`en`] as const; diff --git a/frontend/src/__generated__/locales/.keep b/frontend/src/__generated__/locales/.keep new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/__generated__/locales/en-US.ts b/frontend/src/__generated__/locales/en-US.ts deleted file mode 100644 index c30fbac1..00000000 --- a/frontend/src/__generated__/locales/en-US.ts +++ /dev/null @@ -1,1052 +0,0 @@ - - // Do not modify this file by hand! - // Re-generate this file by running lit-localize - - import {html} from 'lit'; - import {str} from '@lit/localize'; - - /* eslint-disable no-irregular-whitespace */ - /* eslint-disable @typescript-eslint/no-explicit-any */ - - export const templates = { - 'sf3ff78cc329d3528': `Previous`, -'s0fbf6dc6a1966408': `Next`, -'h7ee8a6e551e702ba': html` ${0} of ${1} `, -'s5697808ce744d508': str`Current page, page ${0}`, -'s598446c4063cc093': `Unknown API error`, -'scbeafb2ef469257c': `Need login`, -'sa3ce85ea4e96897c': `Storage quota reached`, -'s07018373ca29dfcb': `Monthly execution minutes quota reached`, -'s0a11c2ffb8309d1a': `Not found`, -'s81a19821f3e4a3d2': `Replay`, -'s2099d599ac75e503': `Archived Items`, -'sfa480f50d480c290': `Shareable`, -'se7bee6e9a9b5394c': `Private`, -'s2df075aface0dab8': `Share`, -'s833f0d71eaa06739': `Select Items`, -'s0e6ebc9cdd39780b': `Delete Collection?`, -'h05165b87bf66fe02': html`Are you sure you want to delete - ${0}?`, -'s2ceb11be2290bb1b': `Cancel`, -'s317006269d0d1476': `Delete Collection`, -'s41203abb9f802a84': `Share Collection`, -'s54bbf34e3e18b439': `Make this collection shareable to enable a public viewing link.`, -'seeb6295e19bc1400': `Collection is Shareable`, -'s0379fc73608ab971': `Done`, -'s11161fdebb62dcc9': `Link to Share`, -'s4708cb91cd6afef0': `This collection can be viewed by anyone with the link.`, -'s0921b07ddda1f1b1': `Open in New Tab`, -'sb8096046172ad45a': `Embed Collection`, -'h7066b35dd7e4517e': html`Share this collection by embedding it into an existing webpage.`, -'h54da0b63b416aa90': html`Add the following embed code to your HTML page:`, -'sdbf249ab40dc18fa': `Copy Embed Code`, -'h648aaa4b436a5970': html`Add the following JavaScript to your - /replay/sw.js:`, -'s4f0cf5a844f978f3': `Copy JS`, -'hf56186ec17103fb3': html`See - - our embedding guide - for more details.`, -'s2fac3b3f7e4af3d2': `Back to Collections`, -'s8af61807443f32a4': `Actions`, -'s10f3845975a0351e': `Edit Metadata`, -'s8975026acabb194d': `Select Archived Items`, -'s1a24424753185138': `Make Shareable`, -'s7e5bf5d1b7f08ba4': `Make Private`, -'s2fe988430f978df3': `Download Collection`, -'sbaf87689cccc53eb': `1 item`, -'s125a86b2f45bbb25': str`${0} items`, -'s88f9e7f4ecc07ede': `Total Size`, -'sabe8b8c669e05b8d': `Total Pages`, -'sba6064b92a06844f': `1 page`, -'s279de934d8a18e21': str`${0} pages`, -'s3512b3c95c7a5c3a': `Last Updated`, -'s63d894b1ddb06289': `Description`, -'s80b0d32b285ce4d7': `Edit description`, -'sa5ef80b4bb9b39f8': `Less`, -'s37a9e8aec5713460': `More`, -'s6b33dfbbaf6a2014': `No description added.`, -'s21c76a0f6cae7920': `Row actions`, -'s27914822b37139fb': `Page not found.`, -'s6f6715b26a9dd225': `This Collection doesn’t have any archived items, yet.`, -'sf3f1aa4156bb5055': `Remove from Collection`, -'h2962269031cae049': html`Deleted ${0} Collection.`, -'s1a223f3372970867': `Sorry, couldn't delete Collection at this time.`, -'s26c61deb65da8736': `Sorry, couldn't retrieve Collection at this time.`, -'saccd6920c9253eaf': `Sorry, couldn't retrieve web captures at this time.`, -'sa56f8f1bd9aa64d3': str`Successfully removed item from Collection.`, -'s0df6dbe466eb9399': `Sorry, couldn't remove item from Collection at this time.`, -'sd77c5f8da91d0729': str`Maximum ${0} characters`, -'sa1c466807a6fdfb7': str`${0} character over limit`, -'s8b6894f4bfec27c0': str`${0} characters over limit`, -'s219c523d781b27f0': str`Please shorten this text to ${0} or less characters.`, -'sc3ac225273c8316b': `General`, -'s9f5a5f23312798f0': `Members`, -'s121cd82dcf118d06': `Org Settings`, -'s52d61e7db1ece998': `Active Members`, -'sf5a8607d6239c964': `Invite New Member`, -'sde7ccf17ea362380': `Org Name`, -'s734b679e69b9fe4e': `My Organization`, -'s523d7b042c762733': `Name of your organization that is visible to all org members.`, -'sfe0fcf030a91a7d2': `Custom URL Identifier`, -'s736e0de127d6aba2': str`Org home page: ${0}//${1}/orgs/${2}`, -'s0559157886d79c76': `Customize your organization's web address for accessing Browsertrix.`, -'s719552bdda1832f6': `Org ID`, -'s0d005b5de55948e4': `Use this ID to reference this org in the Browsertrix API.`, -'s031945e67717bf79': `Save Changes`, -'sef49aec68fd1dc66': `Name`, -'sca7fed2bef53cb99': `Role`, -'sdc673e73b5c13aea': `Delete`, -'s4605b8ed548bb31a': `Pending Invites`, -'sd1f44f1a8bc20e67': `Email`, -'sea4f08110bb8f15d': `Remove`, -'saae1c70e168b45b4': `Admin`, -'s3ef62e0bd9bac4d7': `Crawler`, -'s70b4765cad7bc7cf': `Viewer`, -'s4f90ef001514b29f': `Remove org member`, -'s697bd21982bb821b': `Cannot remove only admin member`, -'s05836f33cb2800d5': `org-member@email.com`, -'s44767556344cbd9f': `Admin — Can create crawls and manage org members`, -'s86e1f8ab45583c75': `Crawler — Can create crawls`, -'s67e4fdc06a42723a': `Viewer — Can view crawls`, -'s2afc9a717c161490': `Invite`, -'s2017def625ae7fbb': `Sorry, couldn't retrieve pending invites at this time.`, -'s7cfdd7b9b1ce6231': str`Successfully invited ${0}.`, -'s53846234c681dace': `Sorry, couldn't invite user at this time.`, -'s63ca31a1df9116e2': str`Successfully removed ${0} from ${1}.`, -'s667558910cf30318': str`Sorry, couldn't remove ${0} at this time.`, -'s6ee5d5975cae2ed4': `Edit Collection Metadata`, -'s918e070311f7573c': `Create a New Collection`, -'scd67e2d22e89af48': `Collection Name`, -'sf9e77dd881f8333d': `My Collection`, -'s75a2e5409f11285f': `Publicly Accessible`, -'s529880061faf7209': `Enable public access to make Collections shareable. Only people with the shared link can view your Collection.`, -'s7c0283bbbff2ab2f': `You can rename your collection later`, -'s33f85f24c0f5f008': `Save`, -'s866c12ab4f3d1c87': `Create Collection`, -'s77001a56d74ac617': str`Successfully saved "${0}" Collection.`, -'s0014ed029ed0ef6f': `This name is already taken.`, -'s2f30d4261790b785': `Something unexpected went wrong`, -'s1a4fbe118753d4c9': `Choose New Workflow Type`, -'s602704084f6c7796': `URL List`, -'sa179273338680745': `The crawler visits every URL specified in a list, and optionally every URL linked on those pages.`, -'sf74a7ef270ece7ea': `Seeded Crawl`, -'s33f30b3e5f460602': `The crawler automatically discovers and archives pages starting from a single seed URL.`, -'s0a959a05c322b9ed': str`+${0} URL`, -'s1eee55ca9401677a': str`+${0} URLs`, -'sfff90c46fdba31db': `(unnamed item)`, -'s6c98d4e4eff5c8bb': `Copied to clipboard!`, -'s3687049d1af562c4': `Copy`, -'sdccd8f78d52d3a87': `Copy to clipboard`, -'sac8252732f2edb19': `Date`, -'saa8aa81ad6f055fd': `Level`, -'s9d6c4c0517894d2a': `Error Message`, -'s1c67a1fa4d07bd8b': `Page URL`, -'sc1214050e2c56ad3': `Log Details`, -'s10fedec3a779ea63': `Timestamp`, -'s4c60317e4731da19': `Starting`, -'s0b01847c8ab4dd76': `Waiting (At Capacity)`, -'sd1615a1ffbc4ca6b': `Waiting (Crawl Limit)`, -'s85994a70cd39166c': `Running`, -'s4f566a3b2235ad29': `Stopping`, -'s1f4459adc67dfb55': `Finishing Crawl`, -'sb4ef767c2f04d346': `Generating WACZ`, -'s0fa473f39f7ec911': `Uploading WACZ`, -'s33c5166e0c903c2d': `Uploaded`, -'sdcda09c20b09b522': `Complete`, -'sbf9c5c5a8e5efad4': `Failed`, -'s6bd79b8079b05bac': `Skipped: Storage Quota Reached`, -'sc5fcb9351a03ab2e': `Stopped`, -'sd440066f6f0992df': `Stopped: Time Quota Reached`, -'sa30c4d3b566b6b1a': `Canceled`, -'sf334547f9650322f': `Select Type`, -'s08513d4147b6cb21': `Matches Text`, -'sd27a8f54aca5d278': `Regex`, -'h8c21d04827e5cb19': html`Regular Expression syntax error: - ${0}`, -'h1a1f28e6632c15d0': html`Please enter a valid constructor string - pattern. See - RegExp docs.`, -'s312a6fda81078718': `Exclusions`, -'s4163bbb813fbc8c9': `Exclusion Type`, -'s682de1f27bbe4d2e': `Exclusion Value`, -'s9fb5a3993c135689': `Remove exclusion`, -'sd3fbc5df51c1beec': `Enter value`, -'sae0550426935cd1e': `Exclusion already exists. Please edit or remove to continue`, -'sbe7425a3b5445ba7': str`Please enter ${0} or more characters`, -'s74abf58e08f32710': `Please enter a valid Regular Expression constructor pattern`, -'h98fd4ace98188324': html`Removed exclusion: ${0}`, -'s13acc5f8f152f1b6': `Cannot remove exclusion when crawl is no longer running.`, -'s3bccb0cc459670c2': `Sorry, couldn't remove exclusion at this time.`, -'safa05ce541a662af': `Invalid Regex`, -'s0182a351a8a13d9a': `Sorry, couldn't fetch pending exclusions at this time.`, -'s2a288f907fc02eb5': `Exclusion added.`, -'sde68eef7ad059311': `Exclusion already exists`, -'s9563c65bbd7fe609': `Sorry, couldn't add exclusion at this time.`, -'s8265788524ca2260': str`${0} daily`, -'s2acb3777ed86adb6': str`Every ${0}`, -'s37a3a294775e081a': str`Monthly on the ${0}`, -'s2bc963c5c7bac2e1': str`Every day at ${0}`, -'s3fc21c0b1ae61eb7': str`Every ${0} - at ${1}`, -'s478f33dea36e1d3f': str`On day ${0} of the month at ${1}`, -'s96450e8470e7ce09': `Crawls`, -'sa27852a4bea47423': `Watch Crawl`, -'s665f4200fb9fc550': `Error Logs`, -'s439bfc00ce4938e5': `Workflow Settings`, -'s09075b7d9df189b9': `Workflow not found.`, -'sf612ca852330362b': `Sorry, couldn't retrieve Workflow at this time.`, -'s4409ada9c5c2a7f8': `Inactive`, -'sa84be0d8d11ebe27': `Stop Crawl?`, -'s466e8c1ec1a81a75': `Pages crawled so far will be saved and marked as incomplete. Are you sure you want to stop crawling?`, -'s9f90886fea6a9515': `Keep Crawling`, -'s06a8bb661e53711e': `Stop Crawling`, -'s1954441b28866a31': `Cancel Crawl?`, -'s78f373341662ad89': `Canceling will discard all pages crawled. Are you sure you want to discard them?`, -'s7047060377c6217c': `Cancel & Discard Crawl`, -'se6cd38c76bc4114a': `Delete Crawl?`, -'s7db0f40fc7d6a04d': `All files and logs associated with this crawl will also be deleted, and the crawl will be removed from any Collection it is a part of.`, -'scb57efea186060b1': `Delete Crawl`, -'he5784a16a6799dad': html`Back to ${0}`, -'s04d312e683f704ee': `Back to Crawl Workflows`, -'s7824618ab2f5160b': `Edit workflow settings`, -'s30d8ebefaf631d31': `Edit Crawler Instances`, -'s8cf2c15722a31ab4': `Downloading will be enabled when this crawl is finished.`, -'s09af18496f032668': `Download Logs`, -'sd9ad53251f2330a5': `Stop`, -'se74c84fa68b23eba': `Org Storage Full or Monthly Execution Minutes Reached`, -'s3e80c83387cea4f1': `Run Crawl`, -'sc75900abc0ec0f82': `Stop Crawl`, -'s68412182ace32912': `Edit Exclusions`, -'s3d9a304e32d9da4b': `Edit Workflow Settings`, -'saae760a5004a02b5': `Copy Tags`, -'s6068ea17740268c3': `Duplicate Workflow`, -'s284272e94e35461c': `Deactivate Workflow`, -'s094bfe263487597f': `Delete Workflow`, -'sad3e3c8146fc920f': `Status`, -'s525d0e58243865e8': `No Crawls Yet`, -'s9b8dccb514a0e34c': `Schedule`, -'sa348b8b53e07a21b': `No Schedule`, -'s4a8134a67288fde0': `Created By`, -'sf72695e8cd91f93c': str`${0} on ${1}`, -'hc226df43ef96e720': html`${0} - +${1} URL`, -'h649ef1ec13735ee9': html`${0} - +${1} URLs`, -'s900a5e61e7ade066': `View:`, -'sb090ab524895d2b4': `All Crawls`, -'he775de5878ab0942': html`Crawl is currently running. - Watch Crawl Progress`, -'s76d9944af031bdb3': `No matching crawls found.`, -'sf76674a7d3d83ab2': `No crawls yet.`, -'se72232cb8fce7869': `Pages Crawled`, -'s5dd12f8b7981d806': str`${0} / ${1}`, -'s1582c2bf884b8052': `Run Duration`, -'s1885dd59daa24f31': `Crawl Size`, -'sd46f73ef4ae29d03': `Crawler Instances`, -'s5e72081d8c9517b2': `Crawl starting...`, -'s8b33ac8b95791469': `Crawl waiting for available resources before it can continue...`, -'s8764f257cc35167f': `Crawl waiting for others to finish, concurrent limit per Organization reached...`, -'s9faa4c27631001f6': `Crawl stopping...`, -'sb660858279ecdbc7': `Crawl workflow is not currently running.`, -'s2d60617060d16a4a': `Replay Latest Crawl`, -'s0b3d512df6b7e85c': `Crawl is not running.`, -'h27573a6e2ed7211d': html`Viewing error logs for currently running crawl. - Watch Crawl Progress`, -'s31b57d50c6a992ba': `Error logs currently not available.`, -'s639f3dec21008b90': `No error logs found yet for latest crawl.`, -'sb663339526803ecb': `Logs will show here after you run a crawl.`, -'sa641ef4b0f2af2b4': str`Displaying latest ${0} errors of ${1}.`, -'sb5ea9267e703b6c6': `Crawl URLs`, -'s70a238ad69373ab0': `Crawl Queue Editor`, -'s6ae6bdeecf9a5bb9': `Done Editing`, -'s3ae5d6e2fd35f103': `This change will only apply to the currently running crawl.`, -'s687d85d4c0c2b4a1': `Updated crawl scale.`, -'se505e954783a431f': `Sorry, couldn't change crawl scale at this time.`, -'sc8eda12c58f5d10f': `Sorry, couldn't retrieve all crawl settings at this time.`, -'sb6b7b4847d9c4a52': `Sorry, couldn't get crawls at this time.`, -'s1a20a47c9bf221da': str`${0} Copy`, -'sb751de28d615caad': str`Copied Workflow to new template.`, -'h42f5ec6886d1dafc': html`Deactivated ${0}.`, -'sf6381d743b5f1e4d': `Sorry, couldn't deactivate Workflow at this time.`, -'ha6f8533fba325287': html`Deleted ${0}.`, -'s6ec009ac55d85d6a': `Sorry, couldn't delete Workflow at this time.`, -'s58aa8e320a4c30f1': `Something went wrong, couldn't cancel crawl.`, -'s199ff7df1e40a103': `Something went wrong, couldn't stop crawl.`, -'s247c148670b82228': `Starting crawl.`, -'s46a31b511363ec98': `Sorry, couldn't run crawl at this time.`, -'s7640b7f154998ccb': `Your org does not have enough storage to run crawls.`, -'sacdcca6c6c2d8dad': `Your org has used all of its execution minutes for this month.`, -'s1f8de71d5ba5627d': `You do not have permission to run crawls.`, -'s8674d705840bf3f6': `Successfully deleted crawl`, -'s19a4db351c2fbdec': str`Sorry, couldn't delete archived item at this time.`, -'s6f62c58028d235ff': str`Only org owners can delete other users' archived items.`, -'s29424e3f5e73a2ee': `Sorry, couldn't retrieve crawl error logs at this time.`, -'s6666c5055de36901': `Start typing to search`, -'s0ceeb7d3fb3dfde6': `Keep typing to search.`, -'s1f73928cbbc07cab': `No matches found.`, -'s5a395b3e48a294bd': `Latest Crawl`, -'s95625bc1d95aa0b8': `Last Modified`, -'s55c00be19b1b3bcd': `Crawl Start URL`, -'sb41b2cfbbc52565b': `Created`, -'s7bd9565ea1a1da14': `Sorry, couldn't retrieve Workflows at this time.`, -'se0e0c906e2ad3b0a': `Crawl Workflows`, -'sf7397f6287e8520a': `New Workflow`, -'s845562f03d066eed': `Something unexpected went wrong while retrieving Workflows.`, -'s9b288e9b7f945b0c': `Sort by:`, -'seca8292e83cb4017': `Reverse sort`, -'sf993bb199fefbe04': `All`, -'sf2d5ffb20d61fcf8': `Scheduled`, -'sa02bab5f570a8afb': `No schedule`, -'s1ea30180f8c26a81': `Show Only Mine`, -'sd1a36c09d6bd4f5f': `Search all Workflows by name or Crawl Start URL`, -'s442425cd7d61051f': `No matching Workflows found.`, -'s39cb621a29eea6d8': `Clear search and filters`, -'se7e46893ef0b3d41': `Could not find page.`, -'sa83bf2a7e5ed33e0': `No Workflows yet.`, -'sac9ae85c05084654': str`Partially copied Workflow`, -'sebba8356f42b6eaa': str`Only first ${0} URLs were copied.`, -'s8745d54f3284f080': `Are you sure you want to cancel the crawl?`, -'s5d966c90d8dc06e6': `Are you sure you want to stop the crawl?`, -'h7c0f7620f388e9ec': html`Started crawl from ${0}. -
- Watch crawl`, -'sb07ea0d5070f719d': `Crawler Release Channel`, -'sc966d49eebca4286': `Latest`, -'se19df7d58cd5fff7': `Version:`, -'saf8787e5652ecdfa': `Sorry, couldn't retrieve crawler channels at this time.`, -'s3c6391ad20986b33': `Tags separated by comma`, -'s03aa3cfb08dff960': `Tags`, -'s0e3006648a1a80a5': str`Add “${0}”`, -'s48e186fb300e5464': `Time`, -'s09085707b5a0d793': `AM`, -'s09421b07b5d1e9e6': `PM`, -'s69ec09431b9c3946': `Browser Profile`, -'s1828a9ea3830e8b7': `Default Profile`, -'sb59d68ed12d46377': `Loading`, -'s628c297e47063d94': `Last edited:`, -'s446adb83d8a1c6ee': `Check profile`, -'s73ca88023aad5f2f': `No additional browser profiles found.`, -'s59c7d0fc953c0423': `Create a browser profile`, -'s3c262944058333a4': `Sorry, couldn't retrieve browser profiles at this time.`, -'s3c162d34398019aa': `Collection Auto-Add`, -'s68291c1557198475': `Search by Collection name`, -'s7cbfe1eb01181972': `Start typing to search Collections.`, -'sabcad5f4717bc336': `No matching Collections found.`, -'s849f950e0b812cf4': `Remove from auto-add`, -'sb4f8acbd7f3df4eb': `Sorry, couldn't retrieve Collections at this time.`, -'sf6d20a78f131dd9e': `Pages in the Same Directory`, -'s79f048d846fe95e0': `Pages on This Domain`, -'s14aaedc6664de249': `Pages on This Domain & Subdomains`, -'sbf1da5e6f05a7eac': `Hashtag Links Only`, -'s2e192b19ed15fcf6': `Page`, -'s0558979b981b9057': `Custom Page Prefix`, -'sf999d4199ff4542d': `Any`, -'s771d6468b1e5ae7f': `Run on a specific date & time`, -'sb407b40e2e7a98c1': `Run on a recurring basis`, -'s4d1422b9bc3d0a7e': `Daily`, -'s1ed5bb575207cece': `Weekly`, -'s046a35bfdd88a596': `Monthly`, -'s7d61376257220dab': `Scope`, -'sb15d4f1e13d04925': `Limits`, -'s4d34e4682643b600': `Browser Settings`, -'s27fe8e8cd298d71f': `Scheduling`, -'s252a52330d32b900': `Metadata`, -'s980b48ea42f59abe': `Review Settings`, -'hf77ba6b1d74e2cdb': html`Fields marked with - * - are required`, -'s5f94c84437a8594c': `Form section contains errors`, -'sf39dc9c47c9ff82c': `Changes in all sections will be saved`, -'s814a0cb8f2908f75': `Save Workflow`, -'s74e4c44c09eaa53a': `Previous Step`, -'s5e1acb3930a1a627': `Start Over`, -'sc2c5b518e1f5c85a': `Next Step`, -'sf4626f0918c0d6a0': `Review & Save`, -'s9645fd859ac5dbd8': `Run on Save`, -'sb198905daeb019e8': `List of URLs`, -'s0cd2df7d9d95ae68': `At least 1 URL is required.`, -'s6de92df940cdee71': str`The crawler will visit and record each URL listed in the order - defined here. You can enter a maximum of ${0} URLs, separated by a new line.`, -'s68eac1025cee6964': `Crawl Scope`, -'s7af85d601db244a7': `Tells the crawler which pages it can visit.`, -'s505e568b37d71565': `Include any linked page`, -'s5136cba9c3481508': `If checked, the crawler will visit pages one link away from a Crawl - URL.`, -'s0b1911029d6e4715': `Fail crawl on failed URL`, -'se2d57e9b7abb6f91': `If checked, the crawler will fail the entire crawl if any of the provided URLs are invalid or unsuccessfully crawled.`, -'s234f4d8778048245': `Add More`, -'se1ffd5d5cd49cdc4': `Specify exclusion rules for what pages should not be visited. - Exclusions apply to all URLs.`, -'hef8020bab2159211': html`Will crawl all pages and paths in the same directory, e.g. - ${0}${1}/`, -'hed4c39f98af5c58f': html`Will crawl all pages on - ${0} and ignore pages - on any subdomains.`, -'ha8f0ffdb034da2d1': html`Will crawl all pages on - ${0} and - subdomain.${1}.`, -'h45676fe694fd7de8': html`Will only visit - ${0}${1} - hash anchor links, e.g. - ${2}${3}#example-page`, -'h2303b42f0dff5ee4': html`Will crawl all page URLs that begin with - ${0}${1} - or any URL that begins with those specified in - Extra URL Prefixes in Scope`, -'s262c31c801cfbcd9': `Please enter a valid URL.`, -'s285f35c68ab11461': `The starting point of your crawl.`, -'s7efc078b0771ade6': `Start URL Scope`, -'s2c55ec938d6cf2a4': `Max Depth`, -'s44f6ab2c6b3cff23': `Default: Unlimited`, -'s406e05cc7ea70f01': `hops`, -'s80aa4dfdf982349d': `Limits how many hops away the crawler can visit while staying within the Start URL Scope.`, -'s00147a7c30a80117': `Extra URL Prefixes in Scope`, -'sc8d321269980767e': `If the crawler finds pages outside of the Start URL Scope they - will only be saved if they begin with URLs listed here.`, -'s150f5e42dc1aad38': `Include any linked page (“one hop out”)`, -'sa148214c2ff359cc': `If checked, the crawler will visit pages one link away outside of - Start URL Scope.`, -'sf092ad58edfa163b': `Check for sitemap`, -'s4caffd8aa426781c': `If checked, the crawler will check for a sitemap at /sitemap.xml and use it to discover pages to crawl if present.`, -'scbd664e4049d11f3': `Specify exclusion rules for what pages should not be visited.`, -'s04d558a299752f1a': `Additional URLs`, -'sdc9e7f186428eec0': str`The crawler will visit and record each URL listed here. Other - links on these pages will not be crawled. You can enter up to ${0} URLs.`, -'sdd5dbd4b0fef8660': str`Must be more than minimum of ${0}`, -'sa4f9d4099c408ae6': str`Must be less than maximum of ${0}`, -'se544485215819946': `Per-Crawl Limits`, -'s4ab09f62524380b9': `Max Pages`, -'sf21761e7f8e0550e': str`Default: ${0}`, -'sab01daa76a48769f': `pages`, -'sd2956c877fc42042': `Adds a hard limit on the number of pages - that will be crawled.`, -'s2fa63aad5fbcf846': `Crawl Time Limit`, -'scbeff7c3e03228ae': `minutes`, -'s4ad6912b1925acb3': `Gracefully stop the crawler after a specified time limit.`, -'sf3146e744d4ea35e': `Crawl Size Limit`, -'s09021407b59bfa0c': `GB`, -'s4d0d8767ec20220b': `Gracefully stop the crawler after a specified size limit.`, -'sdc8e3530c2b118d4': `Increasing parallel crawler instances can speed up crawls, but may - increase the chances of getting rate limited.`, -'s90b49a493c7010f0': `Per-Page Limits`, -'s82ec5790418d27f9': `Page Load Timeout`, -'s9eff639fb8a1be0a': `seconds`, -'scd0d4a13a709c62f': `Limits amount of time to wait for a page to load. Behaviors will run after this timeout only if the page is partially or fully loaded.`, -'s555d700250ee2648': `Behavior Timeout`, -'se9ef1815463f8000': `Unlimited`, -'s332a2eb380d83e9e': `Limits how long behaviors can run on each page.`, -'s9d84cf47af31a3ba': `Auto-scroll behavior`, -'sd412fd49fb930199': `When enabled the browser will automatically scroll to the end of the page.`, -'se4a7507398db6097': `Delay Before Next Page`, -'s60b7cb2386c892ef': `Waits on the page after behaviors are complete before moving onto the next page. Can be helpful for rate limiting.`, -'s62f4e10b2a00efe3': `Choose a custom profile to make use of saved cookies and logged-in - accounts. Note that websites may log profiles out after a period of time.`, -'scd15181280405de6': `Choose a Browsertrix Crawler Release Channel. If available, other versions may provide new/experimental crawling features.`, -'sec5232d4799e747b': `Block ads by domain`, -'ha695e7c47a8fec68': html`Blocks advertising content from being loaded. Uses - Steven Black’s Hosts file.`, -'s67a7f67e5f3794a3': `User Agent`, -'s11326fd2590f4e5e': `Default`, -'h18976239b9d4047e': html`Set custom user agent for crawler browsers to use in requests. - For common user agents see - Useragents.me.`, -'sefcf950b3cc4fc3b': `Language`, -'s3fb59317f4865eaa': `Websites that observe the browser’s language setting may serve - content in that language if available.`, -'s4dc337bffda2ec4d': `Crawl Schedule`, -'se92749db624c8982': `Configure crawls to run every day, week, or month at a specified time.`, -'sf94cd0bf25284668': `Set Schedule`, -'s4bfaefac9bc26241': `Frequency`, -'s680d6fc47b06b8b5': `Limit the frequency for how often a crawl will run.`, -'se0955919920ee87d': `Day`, -'s88d3b00e313183b5': `What day of the week should a crawl run on?`, -'sb4ab7b002d655ce9': `What day of the month should a crawl run on?`, -'s167f53f89012d24c': `Start Time`, -'h8c7c3a6e07d7c512': html`Schedule: - ${0}.`, -'se0baa9b7fb0768e4': `Invalid date`, -'h30728ea4302f7fe9': html`Next scheduled run: - ${0}.`, -'s4174899261b8b308': `A crawl will run at this time in your current timezone.`, -'sc60cfa93d82aa39c': `Our Website (example.com)`, -'s0d56a24ca72b8e48': `Customize this Workflow's name. Workflows are named after - the first Crawl URL by default.`, -'sa8e78592c1db6c3a': `Provide details about this Workflow.`, -'s163480f4b18e39c0': `Create or assign this crawl (and its outputs) to one or more tags - to help organize your archived items.`, -'s68f29315fcc19b3b': `Search for a Collection to auto-add crawls`, -'s54100e0807a1e40d': `Automatically add crawls from this workflow to one or more collections - as soon as they complete. - Individual crawls can be selected from within the collection later.`, -'s0e598010b73d1398': `There are issues with this Workflow. Please go through previous steps and fix all issues to continue.`, -'h2e384a6a9366b427': html`There is an issue with this Crawl Workflow:

Crawl - URL(s) required in - Crawl Setup.

- Please fix to continue.`, -'s0d880cda554b2fee': str`${0} + ${1} more URL`, -'s495d73feeec1e7c7': str`${0} + ${1} more URLs`, -'s265a8f6e25a8c5f2': `Workflow created.`, -'s6f5d63a06a530e47': `Crawl started with new workflow settings.`, -'sb59e91f2312fbb0b': `Workflow updated.`, -'scb2c6b3674a42128': `Workflow saved without starting crawl.`, -'s429899b1dcafcad4': `Could not run crawl with new workflow settings due to already running crawl.`, -'s286331d9358fc509': str`Seed URL ${0}: `, -'s08dd397493a013b1': `Couldn't save Workflow. Please fix the following Workflow issues:`, -'sea5eee53e296f33b': str`${0} URL entered`, -'sfa75e464c2da4bba': str`${0} URLs entered`, -'s960e671fe5f2559b': str`Please shorten list to ${0} or fewer URLs.`, -'s40b5b363fefc9199': str`Please remove or fix the following invalid URL: ${0}`, -'sf0cab2483f66aa2e': `Custom`, -'hadb19fa44addbc1b': html`New Crawl Workflow — ${0}`, -'saa63c0c9ca0eac98': `You don't have permission to create a new Workflow.`, -'sfecdd5e13f68c9ba': `Approved`, -'sef9fb24c04d90f87': `Rejected`, -'s6b78e83ba924d2e7': `Comments Only`, -'s999c3e25ab32b651': `Select a QA run`, -'s16413e19b0f07a18': `Bad`, -'sb349f019a716a4fd': `Poor`, -'s198f498517ea3a13': `Fair`, -'sc40cd77e0d29dbf8': `Good`, -'s43b124b5dcec3779': `Excellent`, -'s2234e31926485921': `n/a`, -'s1ab7979099c86a1b': `Analysis Status`, -'sf61d84d4684b9a2e': `Not Analyzed`, -'s047601483e52c192': `Analysis Progress`, -'s628a0a249c48ccc1': str`${0} Pages`, -'s2cde3515e9588305': `Crawl Rating`, -'s34988bb5e08f7962': `Total Analysis Time`, -'se0beda63f99c3a81': `Review Pages`, -'sefe1162757e8b5cf': `Analysis Runs`, -'s6ac0c20ddc5c15ff': `Pages`, -'sae239213b7c70376': `State`, -'s3fd6bd99e3f6a5be': `Started`, -'sbb99d4ec27fbb263': `Finished`, -'sf78fab1fe68a47c3': `Started by`, -'s20bd021257df5b80': `Download Analysis Run`, -'sa0d6d4b00a4a10f1': `Delete Analysis Run`, -'s971c35217bda8e0a': `Delete Analysis Run?`, -'se08f7c22e0664be4': `All of the data included in this Analysis Run will be deleted.`, -'s65233750ed6bff62': str`This Analysis Run includes data for ${0} ${1} and was started on `, -'pages.plural.zero': `pages`, -'s038b2a0deba58916': `page`, -'pages.plural.two': `pages`, -'pages.plural.few': `pages`, -'pages.plural.many': `pages`, -'pages.plural.other': `pages`, -'s08a64b07b54df8d4': `by`, -'se98b19722245de16': `None Submitted`, -'se934e999928e7479': `This crawl is being analyzed. You're currently viewing results from an older analysis run.`, -'sdc8e7f2cf5dd00e6': `Screenshots`, -'s7a7e184050a02696': `Extracted Text`, -'s1d3561e91a5df9db': `Page Resources`, -'s99f110d27e30b289': `Title`, -'s61eacb19db252f5e': `URL`, -'sf65023bcc872e098': `Most comments`, -'sd510e2d391ed02d8': `Recently approved`, -'s796c33092ef9ffd9': `Not approved`, -'sfebfade13f5c4866': `Approval`, -'sdc12d4d35420eeb7': `Comments`, -'s343f95633406dc81': str`1 comment`, -'s6acd68c5d25381a5': str`${0} comments`, -'s669b18c6d2d9c95b': `None`, -'sc022cfb22694b207': `Sorry, couldn't retrieve archived item at this time.`, -'s17845e39451afe17': `Quality Assurance`, -'s803ce7e1a2294d50': `Files`, -'s2734c290e261a94d': `Crawl Settings`, -'s3d197283cb019b5a': `Overview`, -'sdd5f4eba5c1d833c': `Metadata cannot be edited while crawl is running.`, -'s5b13f82f9c41e429': `Back to Crawl Workflow`, -'sad4b811427b85f95': `Back to Collection`, -'s8a018da1c47a473e': `Back to All Uploads`, -'s8e91b6d701592e00': `Back to All Crawls`, -'h49e6bbd0cf76ee3f': html`${0} - +${1} URL`, -'h3fc47cd542ed1b20': html`${0} - +${1} URLs`, -'s093f4307b5cff807': `QA`, -'sa71de39189a9e9cd': `Go to Workflow`, -'s96c92dc644219e36': `Copy Workflow ID`, -'s535e3ddaa2c43693': `No files yet.`, -'sb1ccb7808e51e5c1': `No files to replay.`, -'s04b8a6cf5711e50f': `Finish Time`, -'s78636b92c1a3909c': `Pending`, -'sa9e7561cc2d14158': `Elapsed Time`, -'s3ebd69a68ec329be': `Execution Time`, -'sb0ca4190190d41fa': `Initiator`, -'h1dc2f6235d169989': html`Manual start by - ${0}`, -'hdfcda45e7d5c5ab4': html`Scheduled start`, -'s78789724e789221c': `Size`, -'sc592307ea80f16b9': `Unknown`, -'s622fb421a67fa33d': `Crawl ID`, -'sec7059aaa0633ca2': `Crawler Channel (Exact Crawler Version)`, -'s1e2b861185295cbb': `In Collections`, -'se1933d9b37b72bcc': `Backed up`, -'s0ebf17b26bf14b0c': `No files to download.`, -'s9f5fa96cb69dbf70': `No error logs to display.`, -'sc05332c751d49fa1': `Stop Analysis`, -'s1b7a477d96b9a1af': `Cancel Analysis`, -'sea03564788ff7601': `Rerun Analysis`, -'se97287c806479ebc': `Run Analysis`, -'s68f54a19e96a9e7d': `Reviews are disabled during analysis runs.`, -'s3c4e37e5ad921484': `No completed analysis runs are available.`, -'sdd0e6007d5cde74e': `Review Crawl`, -'sccf493f23e609bae': `Stop QA Analysis?`, -'sc806ccf9be6b1edf': `Pages analyzed so far will be saved and this run will be marked as incomplete. Are you sure you want to stop this analysis run?`, -'s2f34e9b74f8dc3e7': `Keep Running`, -'se0f7567743f84b08': `Cancel QA Analysis?`, -'sc30660bdd0128dd9': `Canceling will discard all analysis data associated with this run. Are you sure you want to cancel this analysis run?`, -'s98413844b16f5669': `Sorry, couldn't retrieve crawl at this time.`, -'sb4bc9654d1402034': `Sorry, couldn't retrieve crawl logs at this time.`, -'sad61764572206873': `Sorry, couldn't cancel crawl at this time.`, -'s3256360646b319fd': `Sorry, couldn't stop crawl at this time.`, -'s25e2ed07c8147e9d': str`Are you sure you want to delete crawl of ${0}?`, -'s7a8ac0d4fdb945fd': `Starting QA analysis...`, -'sa8a8be5d64bc9f61': `Sorry, couldn't start QA run at this time.`, -'scbb8d1a9ba6fc144': `Sorry, QA analysis is not supported for this crawl as it was run with an older crawler version. Please run a new crawl with the latest crawler and QA should be available.`, -'s1022659c0dc8dc2d': `Stopping QA analysis...`, -'sb7dc70f8590120d9': `Analysis is not currently running.`, -'s6984388e4beabcd1': `Canceling QA analysis...`, -'s5870292e1ae494dd': `Date Created`, -'s2e46f937929109fd': `Uploads`, -'sa17d9ca5bd22265d': `Org Storage Full`, -'sd928eb8c36987311': `Upload WACZ`, -'s5d5304ab9f2c700f': `Status:`, -'se3bba1b6eb0bcf30': `Search all uploads by name`, -'sffee0bcd6f20d6fd': `Search all crawls by name or Crawl Start URL`, -'sd18fd6a192ab09f9': `Search all items by name or Crawl Start URL`, -'s5fa99b1acb437428': `Delete Archived Item?`, -'s12d426dd14919305': `This item will be removed from any Collection it is a part of.`, -'s25d78bb10386c779': `All files and logs associated with this item will also be deleted, and the crawl will no longer be visible in its associated Workflow.`, -'s039b6434e8a75560': str`Delete ${0}`, -'s96668830629e0dfc': `Upload`, -'sa783d9004df13b20': `Crawl`, -'s3cc68dd968072be8': `Copy Crawl ID`, -'s5ce3f4567e31397d': `Delete Item`, -'s4a0475dbb07f0f0d': `No matching items found.`, -'s2b93a67511243888': `No archived items yet.`, -'saf1ddef6935f7778': `Sorry, couldn't retrieve archived items at this time.`, -'s5ff63d8186a80322': str`Successfully deleted archived item.`, -'s30a6b741fdc68a97': `Resource Type`, -'sf03a57a37dea5f72': `Good During Crawl`, -'sa82e2a0507bb9592': `Bad During Crawl`, -'s8d8e36dfd9929c92': `Good in Replay`, -'s9f5660583388eaf2': `Bad in Replay`, -'sfbe3af6e8db73479': `All Resources`, -'s7a2be72e78adf6e0': `Resources data not available`, -'s77995b88f6b4c816': `"Good" and "Bad" indicates the status code of the resource.`, -'s4baded305e206aa6': `Good:`, -'s26538003ac593c90': `Status code between 200-399`, -'sc156a7a7a89f87c6': `Bad:`, -'sd3e16277ae1fc23c': `Status code between 400-599`, -'sb93da28b5c60c57f': `Screenshot not available`, -'s4467f80d499a8311': `Screenshot during crawl`, -'s1705e0547964509a': `Screenshot from replay`, -'s4a5260a2b43369f4': `Screenshot Match`, -'sf32384611e0882ed': `No Screenshot Diff`, -'sff04d43695052343': `Extracted Text Match`, -'s1dfeef2f2cb848e4': `No Extracted Text Diff`, -'s5d6510e3595aea19': `Resources Loaded (Crawl)`, -'s1c420911a78de4b0': `No Crawl Diff`, -'scfedabcfdc620cbb': `Resources Loaded (Replay)`, -'s524749212a383ee8': `No Replay Diff`, -'s7282886335497d58': `Newest comment:`, -'sbbbb22ec10aa988c': `Text data not available`, -'s0415c19e486bf57c': `Text extracted during crawl`, -'sb77fe532202e6b05': `Text extracted from replay`, -'s0686beeebd4ed8cb': `Text Match`, -'s2344bb018c2ade99': str`Showing all ${0} pages`, -'sd2afbd920020fe6d': str`Showing ${0} of ${1} pages`, -'sd7c439303c5c7045': `No matching pages found`, -'sfd992db2a8a8c359': `Worst screenshot match`, -'s9b6fa18a5e16cd2a': `Worst extracted text match`, -'s3bfcd1bea9cef454': `Approval:`, -'se1922cc44e652df1': `Approved, rejected, or commented`, -'s151e5217f41eb71f': `Commented`, -'s94116b0928ce71f0': `QA rating`, -'se5d01bef737e2e3a': `Approve`, -'saf84ec86139d349e': `Comment`, -'s123da0f92f97dd86': `Reject`, -'s17ea9dd97d788aa4': `Page Comments`, -'s6a69b77aacc204a8': `Submit Comment`, -'s6d7c9c2bb994f236': str`Comments (${0})`, -'s3732b439b691ea10': str`${0} commented on ${1}`, -'s17d4de5ab605cdf2': `This page doesn't have any comments.`, -'s1b8e8cb412ed3b9e': `Add a comment`, -'sa7817227bd6cae5b': `Enter page feedback`, -'s7af4c82fbda65fb8': `Sorry, couldn't submit page approval at this time.`, -'scbfea985fa196a60': `Sorry, couldn't add comment at this time.`, -'s2b9d114436d10a68': `Sorry, couldn't delete comment at this time.`, -'s9b06bb424f641aa7': `Exit Review`, -'sae3f811a877eda3d': `Reviews are temporarily disabled during analysis runs.`, -'s0d6349aa36150b00': `Update Review`, -'sd86a0df0354a191e': `Finish Review`, -'sa50088f25c5d9967': `no page title`, -'s30dc103481da2c63': `Previous Page`, -'s52848747f6720ab6': `Approvals are temporarily disabled during analysis runs.`, -'sd1dd00fc6f052e83': `Next Page`, -'s2492f5fb1b05b45e': `Text`, -'sa93c79c575088852': `Resources`, -'s1aa8ee48aadb4de1': `QA Review`, -'s955269ebe3fb8ffc': `Rate this crawl:`, -'sf238b90665620a88': `Excellent!`, -'s8d86b131628669ce': `This archived item perfectly replicates the original pages.`, -'s9f474beaa66f0e89': `Looks and functions nearly the same as the original pages.`, -'se63df4037b90e036': `Similar to the original pages, but may be missing non-critical content or functionality.`, -'s78fe03ba909b5fdb': `Some similarities with the original pages, but missing critical content or functionality.`, -'s14bfcce8cd64daa1': `Missing all content and functionality from the original pages.`, -'saedfe28e1aa52a54': `Update archived item description?`, -'s93fa7dd78e306ab0': `No description`, -'sbf9c9810624e0c87': `Submit Review`, -'s49bc1c5498f6b0ca': `Toggle view`, -'s11bac813a2e998c4': `Split view`, -'sa2c96659114653fc': `Sorry, couldn't retrieve QA data at this time.`, -'s0892cc244e973091': `Sorry, couldn't retrieve page at this time.`, -'s5697a73d7e82ea32': `Sorry, couldn't retrieve pages at this time.`, -'s16877816dd0da312': `Submitted QA review.`, -'s36fd1256980b5f58': `Sorry, couldn't submit QA review at this time.`, -'s3f5390ecd7d14626': `Collections`, -'sc02cbf6ebf0b6cdb': `New Collection`, -'s777098c61f6b518a': `Start building your Collection.`, -'s04200a50c7577767': `No Collections Found`, -'s9f8154ea8167f3f7': `Organize your crawls into a Collection to easily replay them together.`, -'s15aac264eaeac4fc': `Your organization doesn't have any Collections, yet.`, -'s7be481b712fcb089': `Search by Name`, -'s9c2062a6e5e59b93': `Start typing to view collection filters.`, -'sb8102dd29e015556': `No matching collections found.`, -'s739275003674d159': `Collection Access`, -'sa3242c7021e01280': `Row Actions`, -'sf0c64ac402e1e0b9': `No Collections Yet.`, -'s5ac7d4f485d82e8c': `Shareable Collection`, -'sc052d225a3066b68': `Private Collection`, -'sa9c9e33629402ea8': `Something unexpected went wrong while retrieving Collections.`, -'s584a6c7a75548613': `Back to Browser Profiles`, -'s64ef2a6c2dd1d3d1': `Edit`, -'s4ae42fa672dd72bc': `Created at`, -'sf2243480c480930f': `Crawl workflows using this profile`, -'s4de1cf2dacc29c2a': `Edit the profile to make changes or view its present configuration`, -'s67f987f6a3c3de74': `Edit Browser Profile`, -'s8641b6c3688a0cec': str`Edit Profile`, -'s2bd6e954998248bd': `Visited Sites`, -'sea9b3d2d873d5c05': `Interact with the browsing tool to set up the browser profile. Workflows that use this browser profile will behave as if they have logged into the same websites and have the same cookies that have been set here.`, -'s6029661d996c9385': `Save Browser Profile`, -'s8bc85d24af446950': `Edit Name & Description`, -'sd5e2609e90cb7fdf': `Duplicate Profile`, -'s739960bae09ec6ab': `Sorry, couldn't preview browser profile at this time.`, -'s6393445b8d0c8338': `Starting up browser with current profile...`, -'s6f6f70a05859338b': `Sorry, couldn't create browser profile at this time.`, -'h132d0ccd2402fb33': html`Could not delete ${0}, in use by - ${1}. Please remove browser profile from Workflow to continue.`, -'s6a43c0c6daea3998': `Sorry, couldn't delete browser profile at this time.`, -'s80dd58885f259bc5': `Save browser changes to profile? You will need to re-load the browsing tool to make additional changes.`, -'s45b40284fd1bde28': `Successfully saved browser profile.`, -'s2610ab6db9110d0e': `Sorry, couldn't save browser profile at this time.`, -'s4719e6796d840ca4': `Your org does not have enough storage to save this browser profile.`, -'s005e3899acd05fb2': `You do not have permission to edit browser profiles.`, -'s984cf207ea75350f': `Browser Profiles`, -'s2efb8aa7d17bb334': `New Browser Profile`, -'s0308164b5a508d2e': `Backed up status`, -'sab24f3177c0d1479': `Visited URLs`, -'s524e95d8a7ac9944': `No browser profiles yet.`, -'s004df39e5fc32c11': `Not backed up`, -'s0d2b97026d57ffd0': `Starting up browser with selected profile...`, -'s452b2e016c1b9d72': `Back to Profile`, -'h6c440abb1e1a7d78': html`Extending ${0}`, -'s26cdfb935e769dc4': `Interact with the browsing tool to record your browser profile. It is highly recommended to create dedicated accounts to use when crawling. For details refer to the best practices on the `, -'sc29f3a20c5d853ca': `browser profiles documentation page.`, -'s95c49d89c10996af': `Finish Browsing`, -'s5aa589cb3acb8d01': `Example (example.com)`, -'s9669bd7587b7c11a': `My Profile`, -'s29551e433eb649e6': `Optional profile description`, -'see7858af9d37f505': `Example (example.com) login profile`, -'sc16e00a7a8b2fde2': `Back`, -'sc93a9aa3e5bcbf5d': `Save Profile`, -'s56f260de740bbd75': `Successfully created browser profile.`, -'saa0111d08ab1c92a': `You do not have permission to create browser profiles.`, -'s1a68485acac52eb0': `Edit org settings`, -'sd7cb8be58c9b3603': `Create New...`, -'s91c206764e342fbd': `Crawl Workflow`, -'sa7eea45fe1e4d231': `Collection`, -'sf49525241bba3b06': `Storage`, -'s8f30271298d1c702': `Archived Item`, -'sdabda2230cd87b68': `Crawling`, -'sd15f184f058660bf': `Crawl Running`, -'se9e67cf931e7b60a': `Crawls Running`, -'s0ed063ab73b37012': `Crawl Workflow Waiting`, -'s2dd2d72feacd6d05': `Crawl Workflows Waiting`, -'s19cf4e0395936af4': `Page Crawled`, -'s1c1298026d795ce3': `Collection Total`, -'s768e849d9e12a0bc': `Collections Total`, -'s19bdda7f6e57db4d': `Shareable Collections`, -'s2d32831106560c5b': `Storage is Full`, -'sd158a5fc0f062f18': `Available`, -'sa17899510bcc6527': `gigabyte`, -'s30ae03472b93dc47': `Profiles`, -'sd65ca9dddbbb3e26': `Execution Minutes Quota Reached`, -'s343f0419454a4243': `remaining`, -'s1e5485ef2e9f9384': `time`, -'sbcb34a98c7e2bffa': `Monthly Execution Time Used`, -'s190acfed45a89552': `Gifted Execution Time Used`, -'se25cbbec3ae5366d': `Extra Execution Time Used`, -'se9999d2382dfc215': `Monthly Execution Time Remaining`, -'sb47daaf9e1c4a905': `Month`, -'sdf2be206054127d2': `Total time elapsed between when crawls started and ended`, -'sfd960271ff91591c': `Total Execution Time`, -'s7e288b1db1585ab4': `Total billable time of all crawler instances this used month`, -'s21536356f781ca0c': `Execution: Monthly`, -'sa8a6037b9dc11a22': `Billable time used, included with monthly plan`, -'scfc28e17e227420b': `Execution: Extra`, -'s06fec3cc1cf35357': `Additional units of billable time used, any extra minutes will roll over to next month`, -'s288f000694df9690': `Execution: Gifted`, -'s11cee0a8e979540e': `Usage of execution time added to your account free of charge`, -'sf98af5da948f4280': `Usage History`, -'sf02eff827e8582fd': `Sorry, couldn't retrieve org metrics at this time.`, -'s66ea9952bbd68025': `Sorry, couldn't retrieve organization at this time.`, -'s06dfdacf184fe26a': `Your org has reached its storage limit`, -'s6f08a53aff4f4616': `To add archived items again, delete unneeded items and unused browser profiles to free up space, or contact us to upgrade your storage plan.`, -'sd25ec176e0dbfa6d': `Your org has reached its monthly execution minutes limit`, -'s325772b669ba708d': `To purchase additional monthly execution minutes, contact us to upgrade your plan.`, -'s2a511f7f73d92033': `Updated organization.`, -'s472cb38157cbffba': `Sorry, couldn't update organization at this time.`, -'s0726c5784ccf9222': str`Successfully updated role for ${0}.`, -'scc21a97f5f1b13b0': str`Sorry, couldn't update role for ${0} at this time.`, -'saafb6030ac4b40dd': str`Are you sure you want to remove yourself from ${0}?`, -'s1442d0b6e28b30d1': `Path Begins with This URL`, -'sfdbfacb391cb6900': `Single Page App (In-Page Links Only)`, -'s1ae7988ed93b0a32': `0 seconds`, -'sbef1b56d0a7fa38b': `(default)`, -'s199102b736c1fc58': `Crawler Settings`, -'s48639534bbb2f617': `Page Behavior Timeout`, -'sa6c0603a4209dcfa': `Auto-Scroll Behavior`, -'s66722bc2ea775e05': `Disabled`, -'s2ca35daaa4e03216': `Enabled (default)`, -'s38daf2fb241d8bbb': `Block Ads by Domain`, -'s99fe2a6408c5ad2c': `Default User Agent`, -'s4401a1ecb33e9166': `Crawl Scheduling`, -'s78a3454dadf068cf': `Crawl Schedule Type`, -'s063b2ed6541c9181': `Run on a Recurring Basis`, -'scd8de6628aaada05': `Include Any Linked Page`, -'sce646d8060e6c775': `Fail Crawl On Failed URL`, -'sc578fe08950cbb3b': `Primary Seed URL`, -'s00952de51c229a2e': str`${0} hop(s)`, -'s34e90e6353b56f58': `Include Any Linked Page (“one hop out”)`, -'sa3a6465ecf8740fb': `Check For Sitemap`, -'sc5d32436e3ff3ec7': `List of Additional URLs`, -'scb489a1a173ac3f0': `Yes`, -'s09205907b5b56cda': `No`, -'s5c60254028976b28': `Not specified`, -'sd4973818277def8b': `Collections not found.`, -'s60a67fa21821066c': `Sorry, couldn't retrieve Collection details at this time.`, -'sa1d4559f0fcc5219': `Remove file`, -'s452f791e0ff6a13e': `Hide password`, -'s2f7f35f6a5b733f5': `Show password`, -'sded4cfc4d8910016': `Browser Default`, -'sfe7c07c43a065520': `Very weak password`, -'sfe4bd9efa5b792aa': `Weak password`, -'sddb80d4918810289': `Acceptably strong password`, -'s228261677fd5d365': `Very strong password`, -'s8ea5128c2bf4fdf6': `Please choose a stronger password`, -'sc2e2da3280dd60b5': `Suggestion:`, -'s0417c8d0f786c9a0': `Suggestions:`, -'s46095ee558ac3b51': `Tip: To generate very strong passwords, consider using a password manager.`, -'sd805db60d62be7a1': str`Quotas for: ${0}`, -'sfba7b662681a9f92': `Max Concurrent Crawls`, -'s3f807ba2fb999331': `Max Pages Per Crawl`, -'s2557cf3e70ee62dc': `Org Storage Quota (GB)`, -'s8a803831f3ac3903': `Max Execution Minutes Per Month`, -'scff5f61c6f6be0ba': `Extra Execution Minutes`, -'s2e4512cebe8e8b39': `Gifted Execution Minutes`, -'s2e1b51c1697ca361': `Unlabeled`, -'s4e6bdb6d5910dd35': `Update Quotas`, -'s2fd966f953bb23c6': `1 member`, -'s537571911a907a86': str`${0} members`, -'s09a09cfd16ee4c00': `Edit org quotas`, -'sec77d4da6a57f2b7': `Page not found`, -'s57ade424d57c6edf': `Sent`, -'s686306cdb839fb8d': `Sending...`, -'s97ee1bd2cffede65': `Resend verification email`, -'s523f5d97bb322419': `Account Settings`, -'s11b2e9ecce28690c': `Display Name`, -'s5fe9a19519c8d882': `Enter your full name, or another name to display in the orgs you belong to.`, -'se724e8e0ccb7f52c': `Display name`, -'s548e6499a7c9fd51': `Update the email you use to log in.`, -'sca4fb8fafd9b52e5': `Verified`, -'sfeb3a6ed33712701': `Needs verification`, -'sf6e1665c7022a1f8': `Password`, -'sde97d4363265e9aa': `Enter your current password`, -'s3490e2c8b9ec6ad2': `New password`, -'s8daf047a917f4cc4': str`Choose a strong password between ${0}-${1} characters.`, -'s16ba889483d4940e': `Change Password`, -'s9acc53189826a820': `Your name has been updated.`, -'s1354a4083fa2c43e': `Sorry, couldn't update name at this time.`, -'s44793ea339a0944b': `Your email has been updated.`, -'sc4e0922536abfe43': `Sorry, couldn't update email at this time.`, -'s903070bc971b67b6': `Your password has been updated.`, -'se89dc7be93ca7754': `Please correct your current password and try again.`, -'s1cc6234f5ae1d6c8': `Sorry, couldn't update password at this time.`, -'s24761a0cc8d9c0aa': `Organization`, -'s13786b2be911ee8b': `person@email.com`, -'s9ad1286ef798a58d': `Joining as`, -'s67a47f83f4c07f04': `Enter your email`, -'s115ed3de58eca847': `you@email.com`, -'sa9d1dd5d6142477d': `Your name`, -'sc90335b573830bad': `Lisa Simpson`, -'s1a8bd8fe18bfdf7c': `Your full name, nickname, or another name that org collaborators can see.`, -'se7e0859bf0c563fe': str`Choose a strong password between ${0}–${1} characters.`, -'s5e6b698a2ec87331': `Sign up`, -'sfaf43af702f5d344': `Invalid password. Must be between 8 and 64 characters`, -'sb85b1e36579852a6': `Invalid email or password`, -'s1b210718400e7ea8': str`${0} page`, -'sb788f9b4d02fe2b9': str`${0} / ${1} page`, -'s0da3183dc15e5d3e': str`${0} / ${1} pages`, -'s92921878e886e36d': `Duration`, -'sa777c574a8222f0f': `Add to Collection`, -'s84f53a9ae5b34f78': `Successfully saved crawl details.`, -'s9e5ae4184a72363a': `Sorry, couldn't save crawl details at this time.`, -'sf32f25806ba4fd81': `Pending Exclusions`, -'s2bdd9994851a31c4': str`+1 URL`, -'s28d7266643f5992f': `No matches`, -'s96a817ae5ad03253': `No matching URLs found in queue.`, -'sbbdd27eea29fea6f': `Start typing an exclusion to view matching URLs in the queue.`, -'sdbd27d37273261f2': `Queued URLs`, -'s4dfaf5cfc90f8493': `No pages queued.`, -'s8e853be463b322f0': `End of queue`, -'s7584ded3d749c75e': `Load more`, -'sd3bf15293ab40535': str`${0} URLs`, -'s3f72f7fa757b2e2d': str`1 URL`, -'s1b4eddc1c438d8b9': `No queue`, -'s813262fab638bbfc': str`-${0} URLs`, -'s6c4a20fdba7af262': str`-1 URL`, -'s2342004e9c7c2f6a': `Sorry, couldn't fetch crawl queue at this time.`, -'s13ab68bc4d27ab8a': `Upload Archive`, -'s5db7bd625b7a6a49': `File to Upload`, -'sa32e9d0a108ee802': `Upload File`, -'sd784144d0c062bd0': `Browse Files`, -'s807ea65f0643e257': `Select a .wacz file to upload`, -'s962895dbdd4ad0b7': `Cancel this upload?`, -'sd9aa257179753e02': `Uploading File`, -'s1ff918403135632b': `Keep this window open until your upload finishes.`, -'hb8ae169d4ea6d7a3': html`Successfully uploaded ${0}.
- View Item `, -'scccaadc44687f6bf': `Sorry, couldn't upload file at this time.`, -'s13df06b5e1720f7f': `Your org does not have enough storage to upload this file.`, -'s52d81506be796d67': `Filter by name`, -'s0b030282c6ff15dd': str`Create a New Browser Profile`, -'s31173036c8f30b4c': `Starting URL`, -'s837b2b5793a240b3': `https://example.com`, -'s5fa6ac5cc1207ace': `Start Profile Creator`, -'s7585d99970a0eb21': `Starting up browser for profile creation.`, -'s5334c0927cf25b86': `Exit fullscreen`, -'s9b2bb1407142018e': `Enter fullscreen`, -'sb17cfac2c8164164': `The interactive browser is not available.`, -'s57a303543c58ffda': `Interactive browser for creating browser profile`, -'s4b05ac1126ccd6c0': `Show sidebar`, -'s6f2694da95709959': `Hide sidebar`, -'sc5aa44d2c9e6d958': `Websites in the browser profile`, -'s469a4b8dd8b91801': `New Sites`, -'s67e489a6eaaca64d': `Websites that are not in the browser profile yet. Finish editing and save to add these websites to the profile.`, -'sf4d539e610f3a2aa': str`Go to ${0}`, -'sfd20092783b9309d': str`${0} / ${1} crawl`, -'sd6a07c24d3ae246a': str`${0} / ${1} crawls`, -'sea0ac3af5d7a3071': `0 crawls`, -'sdfbbc387c71bad18': `Auto-Add`, -'s514cde9d19a9adc5': str`Started by ${0}`, -'s9b31004ff434426e': `Crawl Finished`, -'saa33768e03c45fc8': `File Size`, -'sf51117c57a1110ec': str`in ${0}`, -'sf27239dda9b1416d': str`Crawls in Collection (${0})`, -'sa3d5a7186b818303': str`All Workflows (${0})`, -'s49730f3d5751a433': `Loading...`, -'sd7d35ab49e07fe79': str`Uploads in Collection (${0})`, -'s84c2e4081c2bf6d7': str`All Uploads (${0})`, -'s1e2b42118528e92f': `In Collection?`, -'sa03a63e319c2f89b': `No matching uploads found.`, -'s06d6c6dc05578422': `Only items in Collection`, -'s8a6f4e542c686466': `Only mine`, -'s13e37d380ccd180d': `No changes to save`, -'s8875ce479bcfe166': str`Adding 1 item`, -'sc7047b9b6b83dc7e': str`Adding ${0} items`, -'s92106e318f0c908c': str`Removing 1 item`, -'sd42142b95bd53b60': str`Removing ${0} items`, -'s4a0cbea3f0b22976': `Save Selection`, -'s18471d24ae3141ba': str`Successfully saved archived item selection.`, -'sc9e34cb12aab0e3a': str`Updated.`, -'s83c70a729f1dd241': `Something unexpected went wrong, couldn't save auto-add setting.`, -'saf63d34c8601dd41': str`${0}`, -'s136b21dec9a221bd': str`Manual run by ${0}`, -'sde7cc417de1b3246': `---`, -'sa84bc532c73403ed': str`Running for ${0}`, -'scb7a7733d5719fee': str`${0} crawl`, -'s32b82a13b01237c7': str`${0} crawls`, -'s8eb4021572d41d99': `Name & Schedule`, -'scdb1bac161852c73': `Welcome`, -'sce6f1cb94a02b0bb': `Organizations`, -'s98a92b0ff61e893b': `Go to Crawl`, -'s2cf63ec9357621f3': `Enter Crawl ID`, -'s09023907b59c38eb': `Go`, -'sb8e7753cf636ad38': `All Organizations`, -'s0b93e1d76ac26914': `New Organization`, -'s8743a99bf24efa16': `Invite User to Org`, -'s8fdbf5db84bb1bfb': `Create Org`, -'s4bd7cce2b092e180': `You don't have any organizations.`, -'sa1374d976720cefd': `Send another invite`, -'s1184d1f63618dc4e': str`Created new org named "${0}".`, -'sf1c2a4776e202435': `Sorry, couldn't create organization at this time.`, -'s8f392679ac01fa81': `Successfully signed up`, -'s694b98572e690336': `Click the link in the verification email we sent you to log in.`, -'s67c74844cd95f5fe': `Sign in with password`, -'s7d44a141de0e2c9b': `Forgot your password?`, -'sca974356724f8230': `Log In`, -'s050344ebd2ce4a8b': `Please wait while Browsertrix is initializing`, -'s9ada74585cd89b16': `Your email address`, -'sb6f5b47cf81180bc': `Request password reset`, -'sbf550ad9b31a5f6d': `Sorry, invalid username or password`, -'s164efdff69c8a3dc': `Sorry, too many failed login attempts. A reset password link has been sent to your email.`, -'s43ae2b49c3470555': `Something went wrong, couldn't sign you in`, -'sd3fd65e8d242ed24': `Successfully received your request. You will receive an email to reset your password if your email is found in our system.`, -'s6d37a6bebbc3f8a8': `That email is not a valid email address`, -'s9689f44e0a49b830': `Date Started`, -'sce252e7b2e662cc5': `All Running Crawls`, -'sa8d4790d89fbcb7d': `Any Active Status`, -'sf777c154340d04b4': `View Crawl Settings`, -'sbf18806bc43052fa': `Sorry, couldn't retrieve crawls at this time.`, -'saa432a53f85160b7': str`Invited by ${0}`, -'hb4c9afa33d2ed04d': html`You’ve been invited to join - ${0}.`, -'sdb8ec1b3a5726c88': `Browsertrix`, -'s418c368c5315bec1': `This invite doesn't exist or has expired. Please ask the organization administrator to resend an invitation.`, -'sb8404f4d7b7ba1f3': `This invitation is not valid`, -'s7ebc4f216d73836f': `This verification email is not valid.`, -'s95689a99051fa841': `Email address verified`, -'s8759f1186d757714': `Log in to continue.`, -'sf151c44c3a52a448': `Enter new password`, -'sf6c0a694575fb0a6': `Must be between 8-64 characters`, -'s3f35c026ab278525': `Resend password reset email?`, -'s00ac24e5b7cc64c2': `Password reset email is not valid. Request a new password reset email`, -'s7d90fb0e2d1684a7': str`Sent invite to ${0}`, -'s586d6bd2eca2da93': `Users`, -'se5cde7fdda328454': `admin`, -'s5b8c89c6fdc51c40': `Invite Users`, -'sb8738360b53dfaf3': `Invited by `, -'h78cfdb5340e6ec4f': html`You've been invited to join - ${0}`, -'saf87265b4bddeb9c': `Accept invitation`, -'s32322dc45e502559': `Decline`, -'sc9a2484754aae7bb': str`You've joined ${0}.`, -'s4b97257cf024d907': str`You've declined to join ${0}.`, -'s79e8cc71a5975b04': `Message`, -'s7fee95b66225e1fb': `Dashboard`, -'s0558d72e9d8fc3dc': `Running Crawls`, -'s8ce22933775afaff': `Open user menu`, -'sa03807e44737a915': `Log Out`, -'s9b11fc3dadc7c9f5': `Copy Version Code`, -'s90a0fdd47ac39d59': `Jump to Crawl`, -'sa1bc28260e4221a8': `Please log in to continue.`, -'s9e1f0a81715a5906': `Welcome to Browsertrix!`, -'h702a7337c08bf73f': html`A confirmation email was sent to:
- ${0}.`, -'sd11e60711d79e788': `Click the link in your email to confirm your email address.`, -'sc3447bb7540dfcc9': `Got it, go to dashboard`, - }; - \ No newline at end of file diff --git a/frontend/src/components/ui/config-details.ts b/frontend/src/components/ui/config-details.ts index 4c051312..157e536b 100644 --- a/frontend/src/components/ui/config-details.ts +++ b/frontend/src/components/ui/config-details.ts @@ -17,6 +17,8 @@ import { getAppSettings } from "@/utils/app"; import { DEPTH_SUPPORTED_SCOPES } from "@/utils/crawler"; import { humanizeSchedule } from "@/utils/cron"; import LiteElement, { html } from "@/utils/LiteElement"; +import { formatNumber } from "@/utils/localization"; +import { pluralOf } from "@/utils/pluralize"; /** * Usage: @@ -146,13 +148,13 @@ export class ConfigDetails extends LiteElement { msg("Max Pages"), when( maxPages, - () => msg(str`${maxPages!.toLocaleString()} pages`), + (val: number | string) => + `${formatNumber(+val)} ${pluralOf("pages", +val)}`, () => this.orgDefaults?.maxPagesPerCrawl - ? html`${msg( - str`${this.orgDefaults.maxPagesPerCrawl.toLocaleString()} pages`, - )} + ? html` + ${formatNumber(this.orgDefaults.maxPagesPerCrawl)} + ${pluralOf("pages", this.orgDefaults.maxPagesPerCrawl)} ${msg("(default)")}` : undefined, @@ -316,7 +318,8 @@ export class ConfigDetails extends LiteElement { html` ${coll.name} - (${msg(str`${coll.crawlCount} items`)}) + (${formatNumber(coll.crawlCount)} + ${pluralOf("items", coll.crawlCount)}) `, ) diff --git a/frontend/src/features/archived-items/crawl-list.ts b/frontend/src/features/archived-items/crawl-list.ts index 9174ccf3..40663b09 100644 --- a/frontend/src/features/archived-items/crawl-list.ts +++ b/frontend/src/features/archived-items/crawl-list.ts @@ -11,7 +11,7 @@ * * ``` */ -import { localized, msg, str } from "@lit/localize"; +import { localized, msg } from "@lit/localize"; import { css, html, nothing, type TemplateResult } from "lit"; import { customElement, @@ -27,7 +27,11 @@ import { RelativeDuration } from "@/components/ui/relative-duration"; import { NavigateController } from "@/controllers/navigate"; import type { Crawl } from "@/types/crawler"; import { renderName } from "@/utils/crawler"; -import { getLocale } from "@/utils/localization"; +import { formatNumber, getLocale } from "@/utils/localization"; +import { pluralOf } from "@/utils/pluralize"; + +const formatNumberCompact = (v: number) => + formatNumber(v, { notation: "compact" }); /** * @slot menu @@ -66,10 +70,6 @@ export class CrawlListItem extends TailwindElement { @query("btrix-overflow-dropdown") dropdownMenu!: OverflowDropdown; - private readonly numberFormatter = new Intl.NumberFormat(getLocale(), { - notation: "compact", - }); - private readonly navigate = new NavigateController(this); render() { @@ -121,6 +121,7 @@ export class CrawlListItem extends TailwindElement { `; } + return html` diff --git a/frontend/src/features/collections/collection-items-dialog.ts b/frontend/src/features/collections/collection-items-dialog.ts index 69ab4e9e..81f109a0 100644 --- a/frontend/src/features/collections/collection-items-dialog.ts +++ b/frontend/src/features/collections/collection-items-dialog.ts @@ -35,6 +35,8 @@ import type { import type { ArchivedItem, Crawl, Upload, Workflow } from "@/types/crawler"; import { isApiError } from "@/utils/api"; import { finishedCrawlStates } from "@/utils/crawler"; +import { formatNumber } from "@/utils/localization"; +import { pluralOf } from "@/utils/pluralize"; const TABS = ["crawl", "upload"] as const; type Tab = (typeof TABS)[number]; @@ -555,16 +557,14 @@ export class CollectionItemsDialog extends BtrixElement { const messages = []; if (addCount) { messages.push( - addCount === 1 - ? msg(str`Adding 1 item`) - : msg(str`Adding ${addCount.toLocaleString()} items`), + msg( + str`Adding ${formatNumber(addCount)} ${pluralOf("items", addCount)}`, + ), ); } if (removeCount) { messages.push( - removeCount === 1 - ? msg(str`Removing 1 item`) - : msg(str`Removing ${removeCount.toLocaleString()} items`), + str`Adding ${formatNumber(removeCount)} ${pluralOf("items", removeCount)}`, ); } diff --git a/frontend/src/features/collections/collection-workflow-list.ts b/frontend/src/features/collections/collection-workflow-list.ts index df42499a..d0a522cc 100644 --- a/frontend/src/features/collections/collection-workflow-list.ts +++ b/frontend/src/features/collections/collection-workflow-list.ts @@ -15,7 +15,8 @@ import type { } from "@/types/api"; import type { Crawl, Workflow } from "@/types/crawler"; import { finishedCrawlStates } from "@/utils/crawler"; -import { getLocale } from "@/utils/localization"; +import { formatNumber, getLocale } from "@/utils/localization"; +import { pluralOf } from "@/utils/pluralize"; export type SelectionChangeDetail = { selection: Record; @@ -358,15 +359,10 @@ export class CollectionWorkflowList extends BtrixElement { const remainder = workflow.seedCount - 1; let nameSuffix: string | TemplateResult<1> = ""; if (remainder) { - if (remainder === 1) { - nameSuffix = html`${msg(str`+${remainder} URL`)}`; - } else { - nameSuffix = html`${msg(str`+${remainder} URLs`)}`; - } + nameSuffix = html`+${formatNumber(remainder, { notation: "compact" })} + ${pluralOf("URLs", remainder)}`; } return html`
diff --git a/frontend/src/features/crawl-workflows/workflow-editor.ts b/frontend/src/features/crawl-workflows/workflow-editor.ts index e629073e..ce492331 100644 --- a/frontend/src/features/crawl-workflows/workflow-editor.ts +++ b/frontend/src/features/crawl-workflows/workflow-editor.ts @@ -62,8 +62,9 @@ import { humanizeSchedule, } from "@/utils/cron"; import { maxLengthValidator } from "@/utils/form"; -import { getLocale } from "@/utils/localization"; +import { formatNumber, getLocale } from "@/utils/localization"; import { isArchivingDisabled } from "@/utils/orgs"; +import { pluralOf } from "@/utils/pluralize"; import { regexEscape } from "@/utils/string"; import { tw } from "@/utils/tailwind"; import { @@ -1725,11 +1726,9 @@ https://archiveweb.page/images/${"logo.svg"}`} const firstUrl = urlList[0].trim(); if (urlList.length > 1) { const remainder = urlList.length - 1; - if (remainder === 1) { - jobName = msg(str`${firstUrl} + ${remainder} more URL`); - } else { - jobName = msg(str`${firstUrl} + ${remainder} more URLs`); - } + jobName = msg( + str`${firstUrl} + ${formatNumber(remainder, { notation: "compact" })} more ${pluralOf("URLs", remainder)}`, + ); } else { jobName = firstUrl; } diff --git a/frontend/src/features/crawl-workflows/workflow-list.ts b/frontend/src/features/crawl-workflows/workflow-list.ts index 381ce5ee..f0a6f888 100644 --- a/frontend/src/features/crawl-workflows/workflow-list.ts +++ b/frontend/src/features/crawl-workflows/workflow-list.ts @@ -26,8 +26,12 @@ import { NavigateController } from "@/controllers/navigate"; import type { ListWorkflow } from "@/types/crawler"; import { humanizeSchedule } from "@/utils/cron"; import { srOnly, truncate } from "@/utils/css"; -import { getLocale } from "@/utils/localization"; +import { formatNumber, getLocale } from "@/utils/localization"; import { numberFormatter } from "@/utils/number"; +import { pluralOf } from "@/utils/pluralize"; + +const formatNumberCompact = (v: number) => + formatNumber(v, { notation: "compact" }); // postcss-lit-disable-next-line const mediumBreakpointCss = css`30rem`; @@ -213,10 +217,6 @@ export class WorkflowListItem extends LitElement { private readonly navigate = new NavigateController(this); - private readonly numberFormatter = numberFormatter(getLocale(), { - notation: "compact", - }); - render() { const notSpecified = html`---
- ${this.safeRender((workflow) => - workflow.crawlCount === 1 - ? msg(str`${workflow.crawlCount} crawl`) - : msg( - str`${this.numberFormatter.format( - workflow.crawlCount || 0, - )} crawls`, - ), + ${this.safeRender( + (workflow) => + `${formatNumberCompact(workflow.crawlCount)} ${pluralOf("crawls", workflow.crawlCount)}`, )}
@@ -420,15 +415,10 @@ export class WorkflowListItem extends LitElement { const remainder = workflow.seedCount - 1; let nameSuffix: string | TemplateResult<1> = ""; if (remainder) { - if (remainder === 1) { - nameSuffix = html`${msg(str`+${remainder} URL`)}`; - } else { - nameSuffix = html`${msg(str`+${remainder} URLs`)}`; - } + nameSuffix = html`+${formatNumber(remainder, { notation: "compact" })} + ${pluralOf("URLs", remainder)}`; } return html` ${workflow.firstSeed} - ${this.numberFormatter.format( - +this.crawl.stats.done, - )} + ${formatNumber(+this.crawl.stats.done)} / - ${this.numberFormatter.format( - +this.crawl.stats.found, - )} + ${formatNumber(+this.crawl.stats.found)}
- ${msg("pages")}` + ${pluralOf("pages", +this.crawl.stats.found)}` : ""}` : html`${msg("Unknown")}`}` : html``} diff --git a/frontend/src/pages/org/browser-profiles-detail.ts b/frontend/src/pages/org/browser-profiles-detail.ts index 73573f75..f71d1226 100644 --- a/frontend/src/pages/org/browser-profiles-detail.ts +++ b/frontend/src/pages/org/browser-profiles-detail.ts @@ -16,6 +16,7 @@ import { isApiError } from "@/utils/api"; import { maxLengthValidator } from "@/utils/form"; import { formatNumber, getLocale } from "@/utils/localization"; import { isArchivingDisabled } from "@/utils/orgs"; +import { pluralOf } from "@/utils/pluralize"; const DESCRIPTION_MAXLENGTH = 500; @@ -360,15 +361,10 @@ export class BrowserProfilesDetail extends BtrixElement { const remainder = workflow.seedCount - 1; let nameSuffix: string | TemplateResult<1> = ""; if (remainder) { - if (remainder === 1) { - nameSuffix = html`${msg(str`+${remainder} URL`)}`; - } else { - nameSuffix = html`${msg(str`+${remainder} URLs`)}`; - } + nameSuffix = html`+${formatNumber(remainder, { notation: "compact" })} + ${pluralOf("URLs", remainder)}`; } return html` ${workflow.firstSeed} - ${this.renderDetailItem(msg("Archived Items"), (col) => - col.crawlCount === 1 - ? msg("1 item") - : msg(str`${this.numberFormatter.format(col.crawlCount)} items`), + ${this.renderDetailItem( + msg("Archived Items"), + (col) => + `${formatNumber(col.crawlCount)} ${pluralOf("items", col.crawlCount)}`, )} ${this.renderDetailItem( msg("Total Size"), @@ -494,10 +491,10 @@ export class CollectionDetail extends BtrixElement { display="narrow" >`, )} - ${this.renderDetailItem(msg("Total Pages"), (col) => - col.pageCount === 1 - ? msg("1 page") - : msg(str`${this.numberFormatter.format(col.pageCount)} pages`), + ${this.renderDetailItem( + msg("Total Pages"), + (col) => + `${formatNumber(col.pageCount)} ${pluralOf("pages", col.pageCount)}`, )} ${this.renderDetailItem( msg("Last Updated"), diff --git a/frontend/src/pages/org/collections-list.ts b/frontend/src/pages/org/collections-list.ts index ac83ebea..d7a46e9e 100644 --- a/frontend/src/pages/org/collections-list.ts +++ b/frontend/src/pages/org/collections-list.ts @@ -1,4 +1,4 @@ -import { localized, msg, str } from "@lit/localize"; +import { localized, msg } from "@lit/localize"; import type { SlInput, SlMenuItem } from "@shoelace-style/shoelace"; import Fuse from "fuse.js"; import { html, type PropertyValues } from "lit"; @@ -18,10 +18,14 @@ import type { APIPaginatedList, APIPaginationQuery } from "@/types/api"; import type { Collection, CollectionSearchValues } from "@/types/collection"; import type { UnderlyingFunction } from "@/types/utils"; import { isApiError } from "@/utils/api"; -import { getLocale } from "@/utils/localization"; +import { formatNumber, getLocale } from "@/utils/localization"; +import { pluralOf } from "@/utils/pluralize"; import { tw } from "@/utils/tailwind"; import noCollectionsImg from "~assets/images/no-collections-found.webp"; +const formatNumberCompact = (v: number) => + formatNumber(v, { notation: "compact" }); + type Collections = APIPaginatedList; type SearchFields = "name"; type SearchResult = { @@ -102,10 +106,6 @@ export class CollectionsList extends BtrixElement { return this.searchByValue.length >= MIN_SEARCH_LENGTH; } - private readonly numberFormatter = new Intl.NumberFormat(getLocale(), { - notation: "compact", - }); - protected async willUpdate( changedProperties: PropertyValues & Map, ) { @@ -526,9 +526,7 @@ export class CollectionsList extends BtrixElement { - ${col.crawlCount === 1 - ? msg("1 item") - : msg(str`${this.numberFormatter.format(col.crawlCount)} items`)} + ${formatNumber(col.crawlCount)} ${pluralOf("items", col.crawlCount)} - ${col.pageCount === 1 - ? msg("1 page") - : msg(str`${this.numberFormatter.format(col.pageCount)} pages`)} + ${formatNumberCompact(col.pageCount)} + ${pluralOf("pages", col.pageCount)} html` -
    -
  • - ${msg( - str`${quotas.maxExecMinutesPerMonth ? humanizeSeconds(quotas.maxExecMinutesPerMonth * 60, undefined, undefined, "long") : msg("Unlimited minutes")} of crawl and QA analysis execution time`, - )} -
  • -
  • - ${msg( - html`${quotas.storageQuota - ? html`` - : msg("Unlimited")} - storage`, - )} -
  • -
  • - ${msg( - str`${quotas.maxPagesPerCrawl ? formatNumber(quotas.maxPagesPerCrawl) : msg("Unlimited")} ${pluralOf("pages", quotas.maxPagesPerCrawl)} per crawl`, - )} -
  • -
  • - ${msg( - str`${quotas.maxConcurrentCrawls ? formatNumber(quotas.maxConcurrentCrawls) : msg("Unlimited")} concurrent ${pluralOf("crawls", quotas.maxConcurrentCrawls)}`, - )} -
  • -
- `; + private readonly renderQuotas = (quotas: OrgQuotas) => { + const maxExecMinutesPerMonth = + quotas.maxExecMinutesPerMonth && + humanizeSeconds( + quotas.maxExecMinutesPerMonth * 60, + undefined, + undefined, + "long", + ); + const maxPagesPerCrawl = + quotas.maxPagesPerCrawl && + `${formatNumber(quotas.maxPagesPerCrawl)} ${pluralOf("pages", quotas.maxPagesPerCrawl)}`; + const maxConcurrentCrawls = + quotas.maxConcurrentCrawls && + msg( + str`${formatNumber(quotas.maxConcurrentCrawls)} concurrent ${pluralOf("crawls", quotas.maxConcurrentCrawls)}`, + ); + + return html` +
    +
  • + ${msg( + str`${maxExecMinutesPerMonth || msg("Unlimited minutes")} of crawl and QA analysis execution time`, + )} +
  • +
  • + ${msg( + html`${quotas.storageQuota + ? html`` + : msg("Unlimited")} + storage`, + )} +
  • +
  • + ${msg(str`${maxPagesPerCrawl || msg("Unlimited pages")} per crawl`)} +
  • +
  • ${maxConcurrentCrawls || msg("Unlimited concurrent crawls")}
  • +
+ `; + }; private renderPortalLink() { return html` diff --git a/frontend/src/pages/org/workflow-detail.ts b/frontend/src/pages/org/workflow-detail.ts index 1d098b6e..87b933d6 100644 --- a/frontend/src/pages/org/workflow-detail.ts +++ b/frontend/src/pages/org/workflow-detail.ts @@ -32,7 +32,7 @@ import { } from "@/utils/crawler"; import { humanizeSchedule } from "@/utils/cron"; import LiteElement, { html } from "@/utils/LiteElement"; -import { getLocale } from "@/utils/localization"; +import { formatNumber, getLocale } from "@/utils/localization"; import { isArchivingDisabled } from "@/utils/orgs"; const SECTIONS = ["crawls", "watch", "settings", "logs"] as const; @@ -110,9 +110,6 @@ export class WorkflowDetail extends LiteElement { @state() private filterBy: Partial> = {}; - private readonly numberFormatter = new Intl.NumberFormat(getLocale(), { - // notation: "compact", - }); private readonly dateFormatter = new Intl.DateTimeFormat(getLocale(), { year: "numeric", month: "numeric", @@ -924,13 +921,9 @@ export class WorkflowDetail extends LiteElement { ${this.renderDetailItem(msg("Pages Crawled"), () => this.lastCrawlStats - ? msg( - str`${this.numberFormatter.format( - +(this.lastCrawlStats.done || 0), - )} / ${this.numberFormatter.format( - +(this.lastCrawlStats.found || 0), - )}`, - ) + ? `${formatNumber( + +(this.lastCrawlStats.done || 0), + )} / ${formatNumber(+(this.lastCrawlStats.found || 0))}` : html``, )} ${this.renderDetailItem(msg("Run Duration"), () => diff --git a/frontend/src/utils/crawler.ts b/frontend/src/utils/crawler.ts index b25b4c15..8d9390b8 100644 --- a/frontend/src/utils/crawler.ts +++ b/frontend/src/utils/crawler.ts @@ -1,7 +1,10 @@ -import { msg, str } from "@lit/localize"; +import { msg } from "@lit/localize"; import clsx from "clsx"; import { html, type TemplateResult } from "lit"; +import { formatNumber } from "./localization"; +import { pluralOf } from "./pluralize"; + import type { ArchivedItem, CrawlState, Workflow } from "@/types/crawler"; export const activeCrawlStates: CrawlState[] = [ @@ -52,15 +55,10 @@ export function renderName(item: ArchivedItem | Workflow, className?: string) { const remainder = item.seedCount - 1; let nameSuffix: string | TemplateResult<1> = ""; if (remainder) { - if (remainder === 1) { - nameSuffix = html`
- ${msg(str`+${remainder} URL`)} -
`; - } else { - nameSuffix = html`
- ${msg(str`+${remainder} URLs`)} -
`; - } + nameSuffix = html`
+ +${formatNumber(remainder, { notation: "compact" })} + ${pluralOf("URLs", remainder)} +
`; } return html`
diff --git a/frontend/src/utils/form.ts b/frontend/src/utils/form.ts index 6df6e62f..76573e6a 100644 --- a/frontend/src/utils/form.ts +++ b/frontend/src/utils/form.ts @@ -1,10 +1,7 @@ import { msg, str } from "@lit/localize"; import type { SlInput, SlTextarea } from "@shoelace-style/shoelace"; -import { getLocale } from "./localization"; - -// TODO listen for localize changes and update -const numberFormatter = new Intl.NumberFormat(getLocale()); +import { formatNumber } from "./localization"; export type MaxLengthValidator = { helpText: string; @@ -12,15 +9,13 @@ export type MaxLengthValidator = { }; export function getHelpText(maxLength: number, currentLength: number) { - const helpText = msg( - str`Maximum ${numberFormatter.format(maxLength)} characters`, - ); + const helpText = msg(str`Maximum ${formatNumber(maxLength)} characters`); if (currentLength > maxLength) { const overMax = currentLength - maxLength; return overMax === 1 - ? msg(str`${numberFormatter.format(overMax)} character over limit`) - : msg(str`${numberFormatter.format(overMax)} characters over limit`); + ? msg(str`${formatNumber(overMax)} character over limit`) + : msg(str`${formatNumber(overMax)} characters over limit`); } return helpText; diff --git a/frontend/src/utils/pluralize.ts b/frontend/src/utils/pluralize.ts index 57ef4e26..744b4243 100644 --- a/frontend/src/utils/pluralize.ts +++ b/frontend/src/utils/pluralize.ts @@ -30,6 +30,32 @@ const plurals = { id: "crawls.plural.other", }), }, + items: { + zero: msg("items", { + desc: 'plural form of "item" for zero items', + id: "items.plural.zero", + }), + one: msg("item", { + desc: 'singular form for "item"', + id: "items.plural.one", + }), + two: msg("items", { + desc: 'plural form of "item" for two items', + id: "items.plural.two", + }), + few: msg("items", { + desc: 'plural form of "item" for few items', + id: "items.plural.few", + }), + many: msg("items", { + desc: 'plural form of "item" for many items', + id: "items.plural.many", + }), + other: msg("items", { + desc: 'plural form of "item" for multiple/other items', + id: "items.plural.other", + }), + }, pages: { zero: msg("pages", { desc: 'plural form of "page" for zero pages', diff --git a/frontend/xliff/en-US.xlf b/frontend/xliff/es.xlf similarity index 64% rename from frontend/xliff/en-US.xlf rename to frontend/xliff/es.xlf index f6e82c74..046a28d8 100644 --- a/frontend/xliff/en-US.xlf +++ b/frontend/xliff/es.xlf @@ -1,107 +1,290 @@ - + Unknown API error - - Every + + Need login - - Every day at + + Storage quota reached - - Every - at + + Monthly execution minutes quota reached - - On day of the month at + + Not found - - URL List + + Previous - - Seeded Crawl + + Next - - Custom + + of - - Inactive + + Current page, page - - Crawl Settings + + Replay - - Delete + + Archived Items - - Actions + + Shareable - - Created By + + Private - - Latest Crawl + + Share - - Copy + + Select Items - - Deactivated . + + Delete Collection? - - Deleted . - - - Sorry, couldn't run crawl at this time. - - - None - - - Daily - - - Weekly - - - Monthly - - - Time + + Are you sure you want to delete + ? Cancel - - Save Changes + + Delete Collection - - All + + Share Collection - - Scheduled + + Make this collection shareable to enable a public viewing link. - - No schedule + + Collection is Shareable - - Show Only Mine + + Done - - Reverse sort + + Link to Share - - crawl + + This collection can be viewed by anyone with the link. - - crawls + + Open in New Tab + + + Embed Collection + + + Share this collection by embedding it into an existing webpage. + + + Add the following embed code to your HTML page: + + + Copy Embed Code + + + Add the following JavaScript to your + /replay/sw.js: + + + Copy JS + + + See + + our embedding guide + for more details. + + + Collections + + + Actions + + + Edit Metadata + + + Select Archived Items + + + Make Shareable + + + Make Private + + + Download Collection + + + items + + + Total Size + + + Total Pages + + + pages + + + Last Updated + + + Description + + + Edit description + + + Less More + + No description added. + + + Row actions + + + Page not found. + + + This Collection doesn’t have any archived items, yet. + + + Remove from Collection + + + Deleted Collection. + + + Sorry, couldn't delete Collection at this time. + + + Sorry, couldn't retrieve Collection at this time. + + + Sorry, couldn't retrieve web captures at this time. + + + Successfully removed item from Collection. + + + Sorry, couldn't remove item from Collection at this time. + + + Maximum characters + + + character over limit + + + characters over limit + + + Please shorten this text to or fewer characters. + + + Manage Billing + + + Update Billing + + + Choose Plan + + + Sorry, couldn't retrieve current plan at this time. + + + Your plan will be canceled on + + + + Monthly quota + + + Subscription status, features, and add-ons, if applicable. + + + You can view plan details, update payment methods, and update billing information by clicking “”. + + + To upgrade to Pro, contact us at + . + + + Upgrade Browsertrix plan () + + + Contact us at to make changes to your plan. + + + Contact your Browsertrix host administrator to make changes to your plan. + + + Usage History + + + Starter + + + Standard + + + Plus + + + Active + + + Paused, payment failed + + + Canceled + + + Pro + + + of crawl and QA analysis execution time + + + Unlimited minutes + + + Unlimited + + + concurrent + + + Pro plan change request () + + + Contact Sales + + + Browser Default + + + Language + Select Type @@ -129,6 +312,12 @@ Exclusion Value + + Add More + + + Remove exclusion + Enter value @@ -150,92 +339,96 @@ Add “ - - Path Begins with This URL + + + URLs - - Pages on This Domain + + (unnamed item) - - Pages on This Domain & Subdomains + + daily - - Single Page App (In-Page Links Only) + + Every - - Page + + Monthly on the - - Any + + Every day at - - Run on a Recurring Basis + + Every + at - - No Schedule + + On day of the month at - - Browser Settings + + Default: Unlimited - - Crawl Scheduling + + Default: - - Fields marked with - * - are required + + Specify exclusion rules for what pages should not be visited. + Exclusions apply to all URLs. - - Form section contains errors + + Adds a hard limit on the number of pages that will be crawled. - - Start Over + + Gracefully stop the crawler after a specified time limit. - - Previous Step + + Gracefully stop the crawler after a specified size limit. - - Next + + Limits amount of time to wait for a page to load. Behaviors will run after this timeout only if the page is partially or fully loaded. - - Next Step + + Waits on the page after initial HTML page load prior to moving on to next steps such as link extraction and behaviors. Can be useful with pages that are slow to load page contents. - - List of URLs + + Limits how long behaviors can run on each page. + + + Waits on the page after behaviors are complete before moving onto the next page. Can be helpful for rate limiting. + + + Choose a custom profile to make use of saved cookies and logged-in + accounts. Note that websites may log profiles out after a period of time. + + + Choose a Browsertrix Crawler Release Channel. If available, other versions may provide new/experimental crawling features. + + + Blocks advertising content from being loaded. Uses + Steven Black’s Hosts file. + + + Set custom user agent for crawler browsers to use in requests. For + common user agents see + Useragents.me. + + + Websites that observe the browser’s language setting may serve + content in that language if available. Crawl Scope - - Add More + + Per-Crawl Limits - - Will crawl all pages on - and ignore pages - on any subdomains. + + Per-Page Limits - - Will crawl all pages on - and - subdomain.. + + Browser Settings - - Crawl Start URL - - - Please enter a valid URL. - - - Include Any Linked Page (“one hop out”) - - - Max Pages - - - Unlimited - - - pages + + Scheduling Crawl Time Limit @@ -243,256 +436,123 @@ minutes - - Crawler Instances + + Crawl Size Limit - - Block Ads by Domain + + GB - - Language + + Page Load Timeout - - Crawl Schedule Type + + seconds - - Set Schedule + + Delay After Page Load - - Frequency + + Behavior Timeout - - Day + + Delay Before Next Page - - Date + + Block ads by domain - - Start Time + + User Agent - - Schedule: - . + + Default: Browser User Agent - - Invalid date + + Save Changes - - Next scheduled run: - . + + Crawl defaults have been updated. + + + Sorry, couldn't update crawl defaults at this time. + + + General + + + Members + + + Billing + + + Crawling Defaults + + + Org Settings + + + Viewing + + + + Active Members + + + Invite New Member + + + Current Plan + + + Default settings for all new crawl workflows. Existing workflows will not be affected. + + + Org Name + + + My Organization + + + Name of your organization that is visible to all org members. + + + Custom URL Identifier + + + Org home page: ///orgs/ + + + Customize your organization's web address for accessing Browsertrix. + + + Org ID + + + Use this ID to reference this org in the Browsertrix API. + + + URL Identifier too short Name - - + more URL + + Email - - + more URLs + + Role - - Something unexpected went wrong + + Delete - - Seed URL : + + Pending Invites - - Copy + + Remove - - Overview - - - Watch Crawl - - - Files - - - Stop - - - Copy Crawl ID - - - Status - - - Pages Crawled - - - Unknown - - - Run Duration - - - Crawl starting... - - - Crawl stopping... - - - No files yet. - - - No files to replay. - - - Pending - - - Crawl ID - - - No files to download. - - - Crawl is not running. - - - Sorry, couldn't retrieve crawl at this time. - - - Are you sure you want to cancel the crawl? - - - Sorry, couldn't cancel crawl at this time. - - - Are you sure you want to stop the crawl? - - - Sorry, couldn't stop crawl at this time. - - - Updated crawl scale. - - - Sorry, couldn't change crawl scale at this time. - - - No crawls yet. - - - Sorry, couldn't retrieve crawls at this time. - - - Something went wrong, couldn't cancel crawl. - - - Something went wrong, couldn't stop crawl. - - - The interactive browser is not available. - - - Interactive browser for creating browser profile - - - Visited Sites - - - Websites in the browser profile - - - New Sites - - - Websites that are not in the browser profile yet. Finish editing and save to add these websites to the profile. - - - Go to - - - Sorry, couldn't create browser profile at this time. - - - Back to Browser Profiles - - - Edit - - - Description - - - Created at - - - Browser Profile - - - Save - - - Edit Profile - - - Sorry, couldn't preview browser profile at this time. - - - Starting up browser with current profile... - - - Sorry, couldn't delete browser profile at this time. - - - Sorry, couldn't retrieve browser profiles at this time. - - - Save browser changes to profile? You will need to re-load the browsing tool to make additional changes. - - - Successfully saved browser profile. - - - Sorry, couldn't save browser profile at this time. - - - New Browser Profile - - - Created - - - Visited URLs - - - No browser profiles yet. - - - Starting URL - - - Start Profile Creator - - - Starting up browser for profile creation. - - - Starting up browser with selected profile... - - - Back to Profile - - - Extending - - - Save Browser Profile - - - My Profile - - - Optional profile description - - - Back - - - Successfully created browser profile. + + No pending invites to show. Admin @@ -503,551 +563,80 @@ Viewer - - Sending... - - - Resend verification email - - - Account Settings - - - Email - - - New password - - - Invite - - - Joining as - - - Enter your email - - - you@email.com - - - Your name - - - Sign up - - - Page not found - - - Default Profile - - - Loading - - - No additional browser profiles found. - - - Create a browser profile - - - of - - - Current page, page - - - No pages queued. - - - URLs - - - 1 URL - - - No queue - - - - URLs - - - -1 URL - - - Sorry, couldn't fetch crawl queue at this time. - - - Removed exclusion: - - - Cannot remove exclusion when crawl is no longer running. - - - Sorry, couldn't remove exclusion at this time. - - - Sorry, couldn't fetch pending exclusions at this time. - - - Exclusion added. - - - Exclusion already exists - - - Sorry, couldn't add exclusion at this time. - - - Pending Exclusions - - - + URLs - - - +1 URL - - - No matches - - - No matching URLs found in queue. - - - Start typing an exclusion to view matching URLs in the queue. - - - Browser Default - - - page - - - pages - - - Crawler Settings - - - Schedule - - - Primary Seed URL - - - Yes - - - No - - - Not specified - - - Welcome - - - Go to Crawl - - - Enter Crawl ID - - - Go - - - Send another invite - - - Successfully signed up - - - Click the link in the verification email we sent you to log in. - - - Sign in with password - - - Forgot your password? - - - Password - - - Your email address - - - Request password reset - - - Sorry, invalid username or password - - - Something went wrong, couldn't sign you in - - - Successfully received your request. You will receive an email to reset your password if your email is found in our system. - - - That email is not a valid email address - - - Invited by - - - This invitation is not valid - - - This verification email is not valid. - - - Email address verified - - - Log in to continue. - - - Resend password reset email? - - - Password reset email is not valid. Request a new password reset email - - - Sent invite to - - - Users - - - admin - - - Invite Users - - - Accept invitation - - - Decline - - - You've joined . - - - You've declined to join . - - - Message - - - Running Crawls - - - Log Out - - - Log In - - - Crawls - - - Browser Profiles - - - Members - - - Jump to Crawl - - - Click the link in your email to confirm your email address. - - - Got it, go to dashboard - - - Example (example.com) - Example browser profile name - - - Example (example.com) login profile - Example browser profile name - - - Lisa Simpson - Example user’s name - - - Role - Team member's role - - - person@email.com - Placeholder text for email to invite - - - Sent - Status message after sending verification email - - - AM - Time AM/PM - - - PM - Time AM/PM - - - Workflow not found. - - - Sorry, couldn't retrieve Workflow at this time. - - - Duplicate Workflow - - - + URL - - - + URLs - - - Sorry, couldn't deactivate Workflow at this time. - - - Sorry, couldn't delete Workflow at this time. - - - Sorry, couldn't retrieve Workflows at this time. - - - No Workflows yet. - - - Maximum characters - - - Please shorten this text to or less characters. - - - character over limit - - - characters over limit - - - Pages in the Same Directory - - - Hashtag Links Only - - - Custom Page Prefix - - - Scope - - - Limits - - - Scheduling - - - Metadata - - - Save Workflow - - - Review & Save - - - Tells the crawler which pages it can visit. - - - Include Any Linked Page - - - If checked, the crawler will visit pages one link away from a Crawl - URL. - - - Specify exclusion rules for what pages should not be visited. - Exclusions apply to all URLs. - - - The starting point of your crawl. - - - Start URL Scope - - - If the crawler finds pages outside of the Start URL Scope they - will only be saved if they begin with URLs listed here. - - - Specify exclusion rules for what pages should not be visited. - - - Additional URLs - - - Adds a hard limit on the number of pages - that will be crawled. - - - Gracefully stop the crawler after a specified time limit. - - - Increasing parallel crawler instances can speed up crawls, but may - increase the chances of getting rate limited. - - - Websites that observe the browser’s language setting may serve - content in that language if available. - - - Limit the frequency for how often a crawl will run. - - - What day of the week should a crawl run on? - - - What day of the month should a crawl run on? - - - A crawl will run at this time in your current timezone. - - - Workflow created. - - - Workflow updated. - - - The crawler visits every URL specified in a list, and optionally every URL linked on those pages. - - - The crawler automatically discovers and archives pages starting from a single seed URL. - - - Metadata cannot be edited while crawl is running. - - - Edit Metadata - - - Edit Crawler Instances - - - + URL - - - + URLs - - - Copy Workflow ID - - - Delete Crawl - - - Organization - - - Are you sure you want to delete crawl of ? - - - Successfully deleted crawl - - - Starting - - - Running - - - Stopping - - - Complete - - - Failed - - - Canceled - - - Date Created - - - File Size - - - View: - - - All Crawls - - - Sort by: - - - No matching crawls found. - - - Stop Crawl - - - Go to Workflow - - - Copy Tags - - - Edit the profile to make changes or view its present configuration - - - Edit Browser Profile - - - Interact with the browsing tool to set up the browser profile. Workflows that use this browser profile will behave as if they have logged into the same websites and have the same cookies that have been set here. - - - Could not delete , in use by - . Please remove browser profile from Workflow to continue. - - - Org Settings - - - Active Members - - - Invite New Member - - - Org Name - - - Pending Invites + + Remove org member Cannot remove only admin member - - Admin — Can create crawls and manage org members + + Revoke invite - - Crawler — Can create crawls + + View archived items and collections - - Viewer — Can view crawls + + View crawl workflows + + + View, replay, and download archived items + + + View collections + + + Create, evaluate, and curate archived items + + + All Viewer permissions, plus: + + + Create crawl workflows + + + Create browser profiles + + + Upload archived items + + + Run QA analysis + + + Rate and review archived items + + + Create, edit, and share collections + + + Manage org and billing settings + + + Manage org + + + Permissions + + + All Crawler permissions, plus: + + + Manage subscription + + + Manage billing details + + + Edit org name and URL + + + Manage org members + + + View and edit org defaults + + + Invite Sorry, couldn't retrieve pending invites at this time. @@ -1059,151 +648,175 @@ Sorry, couldn't invite user at this time. - Successfully removed from . + Successfully removed from . Sorry, couldn't remove at this time. - - Sorry, couldn't retrieve organization at this time. + + Org successfully updated. - - Successfully updated role for . + + Sorry, couldn't rename organization at this time. Try again later from org settings. - - Sorry, couldn't update role for at this time. + + This org name is already taken, try another one. - - Are you sure you want to remove yourself from ? + + This org URL identifier is already taken, try another one. - - Default + + This org URL identifier is invalid. Please use alphanumeric characters and dashes (-) only. - - 1 member + + Supports + GitHub Flavored Markdown. - - members + + Please shorten the description to or fewer characters. - - / page + + Edit Collection Metadata - - / pages + + Create a New Collection - - + URL + + You can rename your collection later - - Size + + Save - - List of Additional URLs + + Create Collection - - Successfully saved crawl details. + + Collection Name - - Sorry, couldn't save crawl details at this time. + + My Collection - - Organizations + + Publicly Accessible - - All Organizations + + Enable public access to make Collections shareable. Only people with the shared link can view your Collection. - - New Organization + + Successfully saved "" Collection. - - Invite User to Org + + This name is already taken. - - My Organization + + Something unexpected went wrong - - Create Org + + What would you like to crawl? - - You don't have any organizations. + + Known URLs - - Created new org named "". + + Choose this option to crawl a single page, or if you already know the URL of every page you'd like to crawl. - - Sorry, couldn't create organization at this time. + + Automated Discovery - - This invite doesn't exist or has expired. Please ask the organization administrator to resend an invitation. + + Let the crawler automatically discover pages based on a domain or start page that you specify. - - Dashboard + + Need help deciding? - - org-member@email.com - Placeholder text for email to invite + + Choose Known URLs (aka a "URL List" crawl + type) if: - - Copied Workflow to new template. + + You want to archive a single page on a website - - Something unexpected went wrong while retrieving Workflows. + + You're archiving just a few specific pages on a website - - You do not have permission to run crawls. + + You have a list of URLs that you can copy-and-paste - - Our Website (example.com) + + A URL list is simpler to configure, since you don't need to + worry about configuring the workflow to exclude parts of the + website that you may not want to archive. - - Customize this Workflow's name. Workflows are named after - the first Crawl URL by default. + + Choose Automated Discovery (aka a "Seeded + Crawl" crawl type) if: - - Provide details about this Workflow. + + You want to archive an entire website - - There are issues with this Workflow. Please go through previous steps and fix all issues to continue. + + You're archiving a subset of a website, like everything + under website.com/your-username - - Couldn't save Workflow. Please fix the following Workflow issues: + + You're archiving a website and external pages + linked to from the website - - You don't have permission to create a new Workflow. + + Seeded crawls are great for advanced use cases where you + don't need to know every single URL that you want to archive. You + can configure reasonable crawl limits and page limits so that you + don't crawl more than you need to. - - Crawl URLs - - - Edit Exclusions - - - Crawl Queue Editor - - - Done Editing - - - Queued URLs - - - End of queue - - - Load more + + Once you choose a crawl type, you can't go back and change + it. Check out the + crawl workflow setup guide + if you still need help deciding on a crawl type, and try our + community help forum. Copied to clipboard! + + Copy + Copy to clipboard + + Date + + + Level + + + Error Message + + + Page URL + + + Log Details + + + Timestamp + + + Starting + Waiting (At Capacity) Waiting (Crawl Limit) + + Running + + + Stopping + Finishing Crawl @@ -1216,8 +829,74 @@ Uploaded - - Workflow Settings + + Complete + + + Failed + + + Skipped: Storage Quota Reached + + + Skipped: Time Quota Reached + + + Stopped + + + Stopped: Storage Quota Reached + + + Stopped: Time Quota Reached + + + Stopped: Crawling Disabled + + + Removed exclusion: + + + Cannot remove exclusion when crawl is no longer running. + + + Sorry, couldn't remove exclusion at this time. + + + Invalid Regex + + + Sorry, couldn't fetch pending exclusions at this time. + + + Exclusion added. + + + Exclusion already exists + + + Sorry, couldn't add exclusion at this time. + + + Crawls + + + Watch Crawl + + + Error Logs + + + Settings + + + Workflow not found. + + + Sorry, couldn't retrieve Workflow at this time. + + + Inactive Stop Crawl? @@ -1225,668 +904,154 @@ Pages crawled so far will be saved and marked as incomplete. Are you sure you want to stop crawling? + + Keep Crawling + + + Stop Crawling + Cancel Crawl? Canceling will discard all pages crawled. Are you sure you want to discard them? - - Back to - - - Back to Crawl Workflows - - - Run Crawl - Cancel & Discard Crawl - - Edit Workflow Settings - - - Deactivate Workflow - - - Delete Workflow - - - No Crawls Yet - - - Total Size - - - on - - - / - - - Crawl Size - - - Crawl waiting for others to finish, concurrent limit per Organization reached... - - - Replay Latest Crawl - - - This change will only apply to the currently running crawl. - - - Sorry, couldn't get crawls at this time. - - - Starting crawl. - - - Last Updated - - - Crawling - - - Collection Auto-Add - - - Search by Collection name - - - Start typing to search Collections. - - - No matching Collections found. - - - Sorry, couldn't retrieve Collections at this time. - - - Max Depth - - - Default: Unlimited - - - hops - - - Limits how many hops away the crawler can visit while staying within the Start URL Scope. - - - If checked, the crawler will visit pages one link away outside of - Start URL Scope. - - - Check For Sitemap - - - If checked, the crawler will check for a sitemap at /sitemap.xml and use it to discover pages to crawl if present. - - - Must be more than minimum of - - - Must be less than maximum of - - - Per-Crawl Limits - - - Default: - - - Per-Page Limits - - - Page Load Timeout - - - seconds - - - Limits amount of time to wait for a page to load. Behaviors will run after this timeout only if the page is partially or fully loaded. - - - Behavior Timeout - - - Limits how long behaviors can run on each page. - - - Auto-Scroll Behavior - - - When enabled the browser will automatically scroll to the end of the page. - - - Delay Before Next Page - - - Waits on the page after behaviors are complete before moving onto the next page. Can be helpful for rate limiting. - - - Create or assign this crawl (and its outputs) to one or more tags - to help organize your archived items. - - - Search for a Collection to auto-add crawls - - - Automatically add crawls from this workflow to one or more collections - as soon as they complete. - Individual crawls can be selected from within the collection later. - - - New Crawl Workflow — - - - Previous - - - Replay - - - Error Logs - - - Back to All Crawls - - - Back to Crawl Workflow - - - Back to Collection - - - Back to All Uploads - - - Finish Time - - - Duration - - - Initiator - - - Manual start by - - - - Scheduled start - - - No error logs to display. - - - Sorry, couldn't retrieve crawl logs at this time. - - - Uploads - - - Upload WACZ - - - Status: - - - No matching items found. - - - Delete Item - - - Could not find page. - - - No archived items yet. - - - Sorry, couldn't retrieve archived items at this time. - - - Successfully deleted archived item. - - - Sorry, couldn't delete archived item at this time. - - - Collections - - - Create Collection - - - Delete Collection? - - - Are you sure you want to delete - ? - - - Start building your Collection. - - - No Collections Found - - - Organize your crawls into a Collection to easily replay them together. - - - Your organization doesn't have any Collections, yet. - - - Start typing to view collection filters. - - - No matching collections found. - - - Archived Items - - - Total Pages - - - No Collections Yet. - - - Shareable - - - Shareable Collection - - - Private - - - Private Collection - - - 1 item - - - items - - - 1 page - - - Make Shareable - - - Make Private - - - Download Collection - - - Delete Collection - - - Something unexpected went wrong while retrieving Collections. - - - Deleted Collection. - - - Sorry, couldn't delete Collection at this time. - - - Last Modified - - - My Collection - - - New Collection - - - Back to Collections - - - Collection - - - Sorry, couldn't retrieve Collection at this time. - - - Share Collection - - - Make this collection shareable to enable a public viewing link. - - - Collection is Shareable - - - Done - - - Link to Share - - - This collection can be viewed by anyone with the link. - - - Embed Collection - - - Share this collection by embedding it into an existing webpage. - - - Add the following embed code to your HTML page: - - - Copy Embed Code - - - Add the following JavaScript to your - /replay/sw.js: - - - Copy JS - - - See - - our embedding guide - for more details. - - - Edit description - - - Less - - - No description added. - - - Sorry, couldn't retrieve web captures at this time. - - - Crawl Workflows - - - Crawl workflows using this profile - - - Hide password - - - Show password - - - Quotas for: - - - Max Concurrent Crawls - - - Update Quotas - - - Exit fullscreen - - - Enter fullscreen - - - Show sidebar - - - Hide sidebar - - - Running for - - - in - - - Level - - - Error Message - - - Page URL - - - 0 seconds - - - (default) - - - Page Behavior Timeout - - - Disabled - - - Enabled (default) - - - hop(s) - - - Collections not found. - - - Sorry, couldn't retrieve Collection details at this time. - - - Upload Archive - - - File to Upload - - - Upload File - - - Browse Files - - - Select a .wacz file to upload - - - Add to Collection - - - Cancel this upload? - - - Uploading File - - - Keep this window open until your upload finishes. - - - Sorry, couldn't upload file at this time. - - - Date Started - - - All Running Crawls - - - Any Active Status - - - Open user menu - - - Copy Version Code - - - Need login - - - Storage quota reached - - - Monthly execution minutes quota reached - - - Not found - - - Share - - - Select Items - - - Open in New Tab - - - Select Archived Items - - - Row actions - - - Page not found. - - - This Collection doesn’t have any archived items, yet. - - - Remove from Collection - - - Successfully removed item from Collection. - - - Sorry, couldn't remove item from Collection at this time. - - - General - - - Name of your organization that is visible to all org members. - - - Custom URL Identifier - - - Org home page: ///orgs/ - - - Customize your organization's web address for accessing Browsertrix. - - - Org ID - - - Use this ID to reference this org in the Browsertrix API. - - - Remove - - - Remove org member - - - Edit Collection Metadata - - - Create a New Collection - - - Collection Name - - - Publicly Accessible - - - Enable public access to make Collections shareable. Only people with the shared link can view your Collection. - - - You can rename your collection later - - - Successfully saved "" Collection. - - - This name is already taken. - - - Choose New Workflow Type - - - (unnamed item) - - - Log Details - - - Timestamp - - - Skipped: Storage Quota Reached - - - Stopped - - - Stopped: Time Quota Reached - - - Remove exclusion - - - Invalid Regex - - - daily - - - Monthly on the - - - Keep Crawling - - - Stop Crawling - Delete Crawl? All files and logs associated with this crawl will also be deleted, and the crawl will be removed from any Collection it is a part of. + + Delete Crawl + + + Crawl Workflows + + + Edit Settings + Edit workflow settings + + Increase or decrease + + + Edit Browser Windows + Downloading will be enabled when this crawl is finished. Download Logs + + Stop + Org Storage Full or Monthly Execution Minutes Reached + + Run Crawl + + + Stop Crawl + + + Edit Exclusions + + + Edit Workflow Settings + + + Copy Tags + + + Duplicate Workflow + + + Delete Workflow + + + Status + + + No Crawls Yet + + + Schedule + + + No Schedule + + + Created By + + + on + + + + URL + + + + URLs + + + View: + + + All Crawls + Crawl is currently running. Watch Crawl Progress + + No matching crawls found. + + + No crawls yet. + + + Pages Crawled + + + Run Duration + + + Crawl Size + + + Browser Windows + + + Crawl starting... + Crawl waiting for available resources before it can continue... + + Crawl waiting for others to finish, concurrent limit per Organization reached... + + + Crawl stopping... + Crawl workflow is not currently running. + + Replay Latest Crawl + + + QA Latest Crawl + + + Crawl is not running. + Viewing error logs for currently running crawl. Watch Crawl Progress @@ -1903,15 +1068,69 @@ Displaying latest errors of . + + Upcoming Pages + + + Crawl Queue Editor + + + Done Editing + + + Change the number of browser windows crawling in parallel. This change will take effect immediately on the currently running crawl and update crawl workflow settings. + + + Updated number of browser windows. + + + Sorry, couldn't change number of browser windows at this time. + Sorry, couldn't retrieve all crawl settings at this time. + + Sorry, couldn't get crawls at this time. + + + Copy + + + Copied Workflow to new template. + + + Deleted Workflow. + + + Sorry, couldn't delete Workflow at this time. + + + Something went wrong, couldn't cancel crawl. + + + Something went wrong, couldn't stop crawl. + + + Starting crawl. + + + Sorry, couldn't run crawl at this time. + Your org does not have enough storage to run crawls. Your org has used all of its execution minutes for this month. + + You do not have permission to run crawls. + + + Successfully deleted crawl + + + Sorry, couldn't delete archived item at this time. + Only org owners can delete other users' archived items. @@ -1927,176 +1146,88 @@ No matches found. + + Latest Crawl + + + Last Modified + + + Crawl Start URL + + + Date Created + + + Sorry, couldn't retrieve Workflows at this time. + + + Configure crawling defaults + + + Edit org crawling settings + New Workflow + + Something unexpected went wrong while retrieving Workflows. + + + Sort by: + + + Reverse sort + + + All + + + Scheduled + + + No schedule + + + Show Only Mine + Search all Workflows by name or Crawl Start URL + + + URL + + + + URLs + No matching Workflows found. Clear search and filters + + Could not find page. + + + No Workflows yet. + Partially copied Workflow Only first URLs were copied. + + Are you sure you want to cancel the crawl? + + + Are you sure you want to stop the crawl? + Started crawl from . Watch crawl - - Crawler Release Channel - - - Latest - - - Version: - - - Sorry, couldn't retrieve crawler channels at this time. - - - Last edited: - - - Check profile - - - Remove from auto-add - - - Run on a specific date & time - - - Run on a recurring basis - - - Review Settings - - - Changes in all sections will be saved - - - Run on Save - - - At least 1 URL is required. - - - The crawler will visit and record each URL listed in the order - defined here. You can enter a maximum of URLs, separated by a new line. - - - Include any linked page - - - Fail crawl on failed URL - - - If checked, the crawler will fail the entire crawl if any of the provided URLs are invalid or unsuccessfully crawled. - - - Will crawl all pages and paths in the same directory, e.g. - / - - - Will only visit - - hash anchor links, e.g. - #example-page - - - Will crawl all page URLs that begin with - - or any URL that begins with those specified in - Extra URL Prefixes in Scope - - - Extra URL Prefixes in Scope - - - Include any linked page (“one hop out”) - - - Check for sitemap - - - The crawler will visit and record each URL listed here. Other - links on these pages will not be crawled. You can enter up to URLs. - - - Crawl Size Limit - - - GB - - - Gracefully stop the crawler after a specified size limit. - - - Auto-scroll behavior - - - Choose a custom profile to make use of saved cookies and logged-in - accounts. Note that websites may log profiles out after a period of time. - - - Choose a Browsertrix Crawler Release Channel. If available, other versions may provide new/experimental crawling features. - - - Block ads by domain - - - Blocks advertising content from being loaded. Uses - Steven Black’s Hosts file. - - - User Agent - - - Set custom user agent for crawler browsers to use in requests. - For common user agents see - Useragents.me. - - - Crawl Schedule - - - Configure crawls to run every day, week, or month at a specified time. - - - There is an issue with this Crawl Workflow:Crawl - URL(s) required in - Crawl Setup. - Please fix to continue. - - - Crawl started with new workflow settings. - - - Workflow saved without starting crawl. - - - Could not run crawl with new workflow settings due to already running crawl. - - - URL entered - - - URLs entered - - - Please shorten list to or fewer URLs. - - - Please remove or fix the following invalid URL: - Approved @@ -2106,23 +1237,20 @@ Comments Only + + In progress + Select a QA run - - Bad + + Severe Inconsistencies - - Poor + + Moderate Inconsistencies - - Fair - - - Good - - - Excellent + + Good Match n/a @@ -2136,26 +1264,44 @@ Analysis Progress - - Pages + + - - Crawl Rating + + Loading + + + QA Rating Total Analysis Time - - Review Pages + + Pages Analysis Runs - - Pages + + Crawl Results - - State + + Non-HTML files captured as pages are known good files that the crawler found as clickable links on a page and don't need to be analyzed. Failed pages did not respond when the crawler tried to visit them. + + + + + HTML + + + + + Non-HTML files captured as + + + + + Failed Started @@ -2166,6 +1312,9 @@ Started by + + No analysis runs, yet + Download Analysis Run @@ -2175,32 +1324,65 @@ Delete Analysis Run? - - All of the data included in this Analysis Run will be deleted. + + All of the data included in this analysis run will be deleted. - - This Analysis Run includes data for and was started on - - - page + + This analysis run includes data for and was started on by - - None Submitted + + Running QA analysis on pages... - - This crawl is being analyzed. You're currently viewing results from an older analysis run. + + This analysis run doesn't exist. + + + HTML Page Match Analysis + + + You’re viewing the latest analysis run results. + + + You’re viewing results from an older analysis run. + + + Current + + + Last Finished + + + Outdated + + + Analysis starting + + + analyzed + + + Match analysis compares pages during a crawl against their replay during an analysis run. A good match indicates that the crawl is probably good, whereas severe inconsistencies may indicate a bad crawl. + + + Statistic + + + Chart Screenshots - - Extracted Text + + Text - - Page Resources + + Pending + + + Incomplete Title @@ -2208,14 +1390,20 @@ URL - - Most comments + + Most Comments - - Recently approved + + Recently Approved - - Not approved + + Not Approved + + + No page title + + + Page Approval @@ -2223,20 +1411,77 @@ Comments - - 1 comment + + Review "" - - comments + + Newest comment: + + + None Sorry, couldn't retrieve archived item at this time. + + Overview + Quality Assurance - - QA + + WACZ Files + + + Crawl Settings + + + Download all files as a single WACZ + + + Download as Multi-WACZ + + + Metadata + + + Metadata cannot be edited while crawl is running. + + + Collection + + + Uploads + + + Viewing Workflow Crawl + + + Viewing Archived Item in Collection + + + Go to Workflow + + + Copy Workflow ID + + + Download Item + + + Delete Item + + + No files yet. + + + No files to replay. + + + Start Time + + + Finish Time Elapsed Time @@ -2244,6 +1489,28 @@ Execution Time + + Initiator + + + Manual start by + + + + Scheduled start + + + Size + + + pages + + + Unknown + + + Crawl ID + Crawler Channel (Exact Crawler Version) @@ -2253,6 +1520,12 @@ Backed up + + No files to download. + + + No error logs to display. + Stop Analysis @@ -2265,9 +1538,6 @@ Run Analysis - - Reviews are disabled during analysis runs. - No completed analysis runs are available. @@ -2289,6 +1559,24 @@ Canceling will discard all analysis data associated with this run. Are you sure you want to cancel this analysis run? + + Sorry, couldn't retrieve crawl at this time. + + + Sorry, couldn't load all crawl settings. + + + Sorry, couldn't retrieve crawl logs at this time. + + + Sorry, couldn't cancel crawl at this time. + + + Sorry, couldn't stop crawl at this time. + + + Are you sure you want to delete this crawl? + Starting QA analysis... @@ -2307,17 +1595,23 @@ Canceling QA analysis... + + Latest Analysis Status + + + Last Analysis Run + + + # of Analysis Runs + + + Sorry, couldn't retrieve archived items at this time. + Org Storage Full - - Search all uploads by name - - - Search all crawls by name or Crawl Start URL - - - Search all items by name or Crawl Start URL + + Upload WACZ Delete Archived Item? @@ -2337,281 +1631,232 @@ Crawl - - Resource Type + + Any - - Good During Crawl + + Status: - - Bad During Crawl + + Search all uploads by name - - Good in Replay + + Search all crawls by name or Crawl Start URL - - Bad in Replay + + Search all items by name or Crawl Start URL - - All Resources + + Copy Crawl ID - - Resources data not available + + No matching items found. - - "Good" and "Bad" indicates the status code of the resource. + + No archived items yet. - - Good: + + Successfully deleted archived item. - - Status code between 200-399 + + New Collection - - Bad: + + Are you sure you want to delete + ? - - Status code between 400-599 + + Start building your Collection. - - Screenshot not available + + No Collections Found - - Screenshot during crawl + + Organize your crawls into a Collection to easily replay them together. - - Screenshot from replay - - - Screenshot Match - - - No Screenshot Diff - - - Extracted Text Match - - - No Extracted Text Diff - - - Resources Loaded (Crawl) - - - No Crawl Diff - - - Resources Loaded (Replay) - - - No Replay Diff - - - Newest comment: - - - Text data not available - - - Text extracted during crawl - - - Text extracted from replay - - - Text Match - - - Showing all pages - - - Showing of pages - - - No matching pages found - - - Worst screenshot match - - - Worst extracted text match - - - Approval: - - - Approved, rejected, or commented - - - Commented - - - QA rating - - - Approve - - - Comment - - - Reject - - - Page Comments - - - Submit Comment - - - Comments () - - - commented on - - - This page doesn't have any comments. - - - Add a comment - - - Enter page feedback - - - Sorry, couldn't submit page approval at this time. - - - Sorry, couldn't add comment at this time. - - - Sorry, couldn't delete comment at this time. - - - Exit Review - - - Reviews are temporarily disabled during analysis runs. - - - Update Review - - - Finish Review - - - no page title - - - Previous Page - - - Approvals are temporarily disabled during analysis runs. - - - Next Page - - - Text - - - Resources - - - QA Review - - - Rate this crawl: - - - Excellent! - - - This archived item perfectly replicates the original pages. - - - Looks and functions nearly the same as the original pages. - - - Similar to the original pages, but may be missing non-critical content or functionality. - - - Some similarities with the original pages, but missing critical content or functionality. - - - Missing all content and functionality from the original pages. - - - Update archived item description? - - - No description - - - Submit Review - - - Toggle view - - - Split view - - - Sorry, couldn't retrieve QA data at this time. - - - Sorry, couldn't retrieve page at this time. - - - Sorry, couldn't retrieve pages at this time. - - - Submitted QA review. - - - Sorry, couldn't submit QA review at this time. + + Your organization doesn't have any Collections, yet. Search by Name + + Start typing to view collection filters. + + + No matching collections found. + Collection Access Row Actions - - Edit Name & Description + + No Collections Yet. + + + Shareable Collection + + + Private Collection + + + Something unexpected went wrong while retrieving Collections. + + + Sorry, couldn't retrieve Collections at this time. + + + Exit fullscreen + + + Interactive Browser + + + Interact with this embedded browser to set up your browser profile. The embedded browser will exit without saving changes after a few minutes of inactivity. + + + Enter fullscreen + + + Interactive browser session timed out due to inactivity. + + + Load New Browser + + + Connection to interactive browser lost. Waiting to reconnect... + + + Toggle visited site list + + + Visited Sites + + + Websites in the browser profile + + + New Sites + + + Websites that are not in the browser profile yet. Finish editing and save to add these websites to the profile. + + + Go to + + + Crawler Release Channel + + + Created On + + + Updated By + + + Backed Up + + + Not Backed Up + + + Browser Profile + + + View or edit the current browser profile configuration. + + + Configure Browser Profile + + + Cancel Editing? + + + Are you sure you want to discard changes to this browser profile? + + + No, Continue Editing + + + Yes, Discard Changes + + + Browser Profiles + + + Not used in any crawl workflows. + + + (no name) + + + Save Browser Profile Duplicate Profile + + Sorry, couldn't preview browser profile at this time. + + + Starting up browser with current profile... + + + Sorry, couldn't create browser profile at this time. + + + Could not delete , in use by + . Please remove browser profile from Workflow to continue. + + + Deleted . + + + Sorry, couldn't delete browser profile at this time. + + + Sorry, couldn't retrieve browser profiles at this time. + + + Successfully saved browser profile. + + + Sorry, couldn't save browser profile at this time. + Your org does not have enough storage to save this browser profile. You do not have permission to edit browser profiles. - - Backed up status + + New Browser Profile - - Not backed up + + Visited URLs - - Interact with the browsing tool to record your browser profile. It is highly recommended to create dedicated accounts to use when crawling. For details refer to the best practices on the + + Sortable - - browser profiles documentation page. + + Ascending - - Finish Browsing + + Descending - - Save Profile + + No browser profiles yet. - - You do not have permission to create browser profiles. + + + + + + By + + + Starting up browser with selected profile... Edit org settings @@ -2628,6 +1873,9 @@ Archived Item + + Crawling + Crawl Running @@ -2685,69 +1933,454 @@ Monthly Execution Time Remaining - - Month - - - Total time elapsed between when crawls started and ended - - - Total Execution Time - - - Total billable time of all crawler instances this used month - - - Execution: Monthly - - - Billable time used, included with monthly plan - - - Execution: Extra - - - Additional units of billable time used, any extra minutes will roll over to next month - - - Execution: Gifted - - - Usage of execution time added to your account free of charge - - - Usage History - Sorry, couldn't retrieve org metrics at this time. - - Your org has reached its storage limit + + Resource Type - - To add archived items again, delete unneeded items and unused browser profiles to free up space, or contact us to upgrade your storage plan. + + Good During Crawl - - Your org has reached its monthly execution minutes limit + + Bad During Crawl - - To purchase additional monthly execution minutes, contact us to upgrade your plan. + + Good During Analysis - - Updated organization. + + Bad During Analysis - - Sorry, couldn't update organization at this time. + + All Resources - - Default User Agent + + Good: + + + Success (2xx) and Redirection (3xx) status codes + + + Bad: + + + Client error (4xx) and Server error (5xx) status codes + + + Screenshot not available + + + Screenshot during crawl + + + Screenshot during analysis + + + Screenshot Match + + + No Screenshot Diff + + + Extracted Text Match + + + No Extracted Text Diff + + + Resources Loaded (Crawl) + + + No Crawl Diff + + + Resources Loaded (Replay) + + + No Replay Diff + + + Missing text: Crawl + + + Added text: Crawl + + + Identical text + + + Added text: Analysis + + + Missing text: Analysis + + + Text data not available + + + Text extracted during crawl + + + Text extracted during analysis + + + Text Match + + + Showing all pages + + + Showing of pages + + + No matching pages found + + + Best Screenshot Match + + + Worst Screenshot Match + + + Best Extracted Text Match + + + Worst Extracted Text Match + + + Approval: + + + Approved, Rejected, or Commented + + + Commented + + + QA rating + + + Approve + + + Comment + + + Reject + + + Sorry, couldn't submit page approval at this time. + + + Previous Page + + + Approvals are temporarily disabled during analysis runs. + + + Next Page + + + Page heuristics + + + Resources + + + Exit Review + + + Reviews are temporarily disabled during analysis runs. + + + Finish Review + + + Page Comments + + + Submit Comment + + + Review + + + QA Review + + + Rate this crawl: + + + Excellent! + + + This archived item perfectly replicates the original pages. + + + Good + + + Looks and functions nearly the same as the original pages. + + + Fair + + + Similar to the original pages, but may be missing non-critical content or functionality. + + + Poor + + + Some similarities with the original pages, but missing critical content or functionality. + + + Bad + + + Missing all content and functionality from the original pages. + + + Update archived item description? + + + No description, yet + + + Submit Review + + + Comments () + + + commented on + + + Delete comment + + + Add a comment + + + Enter page feedback + + + Reload Replay + + + Reload page + + + Toggle screenshot wipe view + + + Loading page + + + Navigation prevented + + + Following links during review is disabled. + + + Sorry, couldn't add comment at this time. + + + Sorry, couldn't delete comment at this time. + + + Sorry, couldn't retrieve analysis runs at this time. + + + Sorry, couldn't retrieve page at this time. + + + Sorry, couldn't retrieve pages at this time. + + + Saved QA review. + + + Sorry, couldn't submit QA review at this time. + + + URL List + + + Seeded Crawl + + + Custom + + + New + + + You don't have permission to create a new Workflow. + + + Workflows that use this browser profile will behave as if they have logged into the same websites and have the same web cookies. + + + + It is highly recommended to create dedicated accounts to use when + crawling. For details, refer to + . + + + + browser profile best practices + + + Extending + + + Cancel Profile Creation? + + + Are you sure you want to cancel creating a browser profile? + + + No, Continue Browsing + + + Yes, Cancel + + + Save New Profile... + + + My Profile + + + Optional profile description + + + Back + + + Save Profile + + + Successfully created browser profile. + + + You do not have permission to create browser profiles. + + + Sorry, couldn't retrieve organization at this time. + + + Successfully updated role for . + + + Sorry, couldn't update role for at this time. + + + Are you sure you want to remove yourself from ? + + + Path Begins with This URL + + + Pages on This Domain + + + Pages on This Domain & Subdomains + + + Single Page App (In-Page Links Only) + + + 0 seconds + + + (default) + + + Max Pages + + + Auto-Scroll Behavior + + + Disabled + + + Enabled (default) + + + No custom profile + + + Block Ads by Domain + + + Browser User Agent (default) + + + Crawl Schedule Type + + + Run on a Recurring Basis + + + Crawl URL(s) + + + Include Any Linked Page Fail Crawl On Failed URL + + Primary Seed URL + + + Extra URL Prefixes in Scope + + + Max Depth + + + hop(s) + + + Unlimited (default) + + + Include Any Linked Page (“one hop out”) + + + Check For Sitemap + + + List of Additional URLs + + + Yes + + + No + + + Not specified + + + Collections not found. + + + Sorry, couldn't retrieve Collection details at this time. + Remove file + + Hide password + + + Show password + Very weak password @@ -2772,6 +2405,30 @@ Tip: To generate very strong passwords, consider using a password manager. + + Latest + + + Version: + + + Sorry, couldn't retrieve crawler channels at this time. + + + Time + + + Created + + + Bytes Stored + + + Quotas for: + + + Max Concurrent Crawls + Max Pages Per Crawl @@ -2790,62 +2447,150 @@ Unlabeled - - Edit org quotas + + Update Quotas - - Display Name + + Disable Archiving? - - Enter your full name, or another name to display in the orgs you belong to. + + Are you sure you want to disable archiving in + org? + Members will no longer be able to crawl, upload files, create + browser profiles, or create collections. - - Display name + + Slug: - - Update the email you use to log in. + + Members: - - Verified + + Reason - - Needs verification + + Enter reason for disabling archiving - - Enter your current password + + Disable Archiving - - Choose a strong password between - characters. + + Confirm Org Deletion: - - Change Password + + Are you sure you want to delete + ? This + cannot be undone. - - Your name has been updated. + + Deleting an org will delete all + + of data associated with the org. - - Sorry, couldn't update name at this time. + + Crawls: + - - Your email has been updated. + + Uploads: + - - Sorry, couldn't update email at this time. + + Profiles: + - - Your password has been updated. + + Type "" to confirm - - Please correct your current password and try again. + + Delete Org - - Sorry, couldn't update password at this time. + + Archiving in "" is disabled. + + + Archiving in "" is re-enabled. + + + Sorry, couldn't update org archiving ability at this time. + + + Org "" has been deleted. + + + Sorry, couldn't delete org at this time. + + + Issue + + + Active with issue: Storage quota reached + + + Active with issue: Execution minutes quota reached + + + disabled + + + Archiving Disabled: + + + Archiving Disabled (no reason specified) + + + Default + + + Edit Quotas + + + Re-enable Archiving + + + Page not found + + + Beta feature + + + This part of Browsertrix is in beta! + + + Parts might change or be broken. Please share your thoughts with us! + + + Beta + + + Organization + + + Select an org + + + Required for first member + + + Enter your email + + + you@email.com + + + Password + + + Choose a strong password between characters. + + + Your name Your full name, nickname, or another name that org collaborators can see. - - Choose a strong password between characters. + + Create Account Invalid password. Must be between 8 and 64 characters @@ -2853,9 +2598,139 @@ Invalid email or password + + User is already registered, but with a different password. + + + Not applicable + + + : + + + QA Analysis: (% finished) + + + QA Analysis: + + + crawled, found + + + Last run started on + + + Rated / + + + No QA review submitted + + + QA Analysis Runs + + + page + + + Duration + + + Collection Auto-Add + + + Search by Collection name + + + Start typing to search Collections. + + + No matching Collections found. + + + Remove from auto-add + + + Add to Collection + + + Successfully saved crawl details. + + + Sorry, couldn't save crawl details at this time. + + + Pending Exclusions + + + +1 URL + + + No matches + + + No matching URLs found in queue. + + + Start typing an exclusion to view matching URLs in the queue. + + + Queued URLs + + + Queued URLs from 1 to + + + + Queued URLs from + + to of + + + + No pages queued. + + + End of queue + + + Load more + + + - URLs + + + -1 URL + + + Sorry, couldn't fetch crawl queue at this time. + + + File to Upload + + + Browse Files + + + Select a .wacz file to upload + + + Our Website (example.com) + + + Cancel this upload? + + + Uploading... + + + Keep this window open until your upload finishes. + Successfully uploaded .View Item + + Sorry, couldn't upload file at this time. + Your org does not have enough storage to upload this file. @@ -2865,9 +2740,33 @@ Create a New Browser Profile + + Starting URL + https://example.com + + Start Browsing + + + Starting up browser for new profile... + + + Last updated + + + Check Profile + + + View Profiles + + + This org doesn't have any custom profiles yet. + + + Create profile + / crawl @@ -2886,6 +2785,12 @@ Crawl Finished + + File Size + + + in + Crawls in Collection () @@ -2916,18 +2821,6 @@ No changes to save - - Adding 1 item - - - Adding items - - - Removing 1 item - - - Removing items - Save Selection @@ -2940,6 +2833,273 @@ Something unexpected went wrong, couldn't save auto-add setting. + + Pages in the Same Directory + + + Hashtag Links Only + + + Custom Page Prefix + + + Run on a specific date & time + + + Run on a recurring basis + + + Daily + + + Weekly + + + Monthly + + + Limits + + + Review Settings + + + Fields marked with + * + are required + + + Form section contains errors + + + Changes in all sections will be saved + + + Save Workflow + + + Previous Step + + + Start Over + + + Next Step + + + Review & Save + + + Run on Save + + + At least 1 URL is required. + + + The crawler will visit and record each URL listed in the order + defined here. You can enter a maximum of URLs, separated by a new line. + + + Tells the crawler which pages it can visit. + + + Include any linked page + + + If checked, the crawler will visit pages one link away from a Crawl + URL. + + + Fail crawl on failed URL + + + If checked, the crawler will fail the entire crawl if any of the provided URLs are invalid or unsuccessfully crawled. + + + Will crawl all pages and paths in the same directory, e.g. + / + + + Will crawl all pages on + and ignore pages + on any subdomains. + + + Will crawl all pages on + and + subdomain.. + + + Will only visit + + hash anchor links, e.g. + #example-page + + + Will crawl all page URLs that begin with + + or any URL that begins with those specified in + Extra URL Prefixes in Scope + + + Please enter a valid URL. + + + The starting point of your crawl. + + + Start URL Scope + + + hops + + + Limits how many hops away the crawler can visit while staying within the Start URL Scope. + + + If the crawler finds pages outside of the Start URL Scope they + will only be saved if they begin with URLs listed here. + + + Include any linked page (“one hop out”) + + + If checked, the crawler will visit pages one link away outside of + Start URL Scope. + + + Check for sitemap + + + If checked, the crawler will check for a sitemap at /sitemap.xml and use it to discover pages to crawl if present. + + + Specify exclusion rules for what pages should not be visited. + + + Additional URLs + + + The crawler will visit and record each URL listed here. Other + links on these pages will not be crawled. You can enter up to URLs. + + + Must be more than minimum of + + + Must be less than maximum of + + + Auto-scroll behavior + + + When enabled the browser will automatically scroll to the end of the page. + + + Increase the number of open browser windows during a crawl. This will speed up your crawl by effectively running more crawlers at the same time. + + + See caveats + + + Crawl Schedule + + + Configure crawls to run every day, week, or month at a specified time. + + + Set Schedule + + + Frequency + + + Limit the frequency for how often a crawl will run. + + + Day + + + What day of the week should a crawl run on? + + + What day of the month should a crawl run on? + + + Schedule: + . + + + Invalid date + + + Next scheduled run: + . + + + A crawl will run at this time in your current timezone. + + + Customize this Workflow's name. Workflows are named after + the first Crawl URL by default. + + + Provide details about this Workflow. + + + Create or assign this crawl (and its outputs) to one or more tags + to help organize your archived items. + + + Search for a Collection to auto-add crawls + + + Automatically add crawls from this workflow to one or more collections + as soon as they complete. + Individual crawls can be selected from within the collection later. + + + There are issues with this Workflow. Please go through previous steps and fix all issues to continue. + + + There is an issue with this Crawl Workflow:Crawl + URL(s) required in + Crawl Setup. + Please fix to continue. + + + Workflow created. + + + Crawl started with new workflow settings. + + + Workflow updated. + + + Workflow saved without starting crawl. + + + Could not run crawl with new workflow settings due to already running crawl. + + + Seed URL : + + + Couldn't save Workflow. Please fix the following Workflow issues: + + + URL entered + + + URLs entered + + + Please shorten list to or fewer URLs. + + + Please remove or fix the following invalid URL: + @@ -2949,27 +3109,304 @@ --- + + Running for + Name & Schedule + + billing settings + + + Your org will be deleted in + days + + + Your subscription ends on . Your user account, org, and all associated data will be deleted. + + + We suggest downloading your archived items before they + are deleted. To keep your plan and data, see + . + + + Archiving will be disabled in days + + + Archiving will be disabled within one day + + + Your subscription ends on . You will no longer be able to run crawls, upload files, create browser profiles, or create collections. + + + To keep your plan and continue crawling, see + . + + + Archiving is disabled for this org + + + Your subscription has been paused due to payment failure. + Please go to to update your payment method. + + + Your subscription has been canceled. Please contact Browsertrix support to renew your plan. + + + Please contact Browsertrix support to renew your plan. + + + Your org has reached its storage limit + + + To add archived items again, delete unneeded items and unused browser profiles to free up space, or contact to upgrade your storage plan. + + + Browsertrix host administrator + + + Your org has reached its monthly execution minutes limit + + + Contact to purchase additional monthly execution minutes or upgrade your plan. + + + No usage history to show. + + + Month + + + Total duration of crawls and QA analysis runs, from start to finish + + + Aggregated time across all browser windows that the crawler was actively executing a crawl or QA analysis run, i.e. not in a waiting state + + + Billable Execution Time + + + Execution time used that is billable to the current month of the plan + + + Rollover Execution Time + + + Additional execution time used, of which any extra minutes will roll over to next month as billable time + + + Gifted Execution Time + + + Execution time used that is free of charge + + + Excellent + + + Admin dashboard + + + Welcome + + + Go to Crawl + + + Enter Crawl ID + + + Go + + + All Organizations + + + New Organization + + + Invite User to Org + + + Start typing to see availability + + + This org name is available + + + This org name is taken + + + Create Org + + + Invite sent! + + + View org members + + + This org name is already taken. + + + Created new org named "". + + + Sorry, couldn't create organization at this time. + + + Successfully signed up + + + Click the link in the verification email we sent you to log in. + + + Sign up + + + Sign in with password + + + Forgot your password? + + + Log In + Please wait while Browsertrix is initializing - - Sorry, too many failed login attempts. A reset password link has been sent to your email. + + Your email address + + + Request password reset + + + Sorry, invalid username or password + + + Sorry, too many failed login attempts. If this is a valid email, a reset password link has been sent to your email. + + + Something went wrong, couldn't sign you in + + + Successfully received your request. You will receive an email to reset your password if your email is found in our system. + + + That email is not a valid email address + + + Date Started + + + Running crawls + + + All Running Crawls + + + Any Active Status View Crawl Settings - - Invited by + + Sorry, couldn't retrieve crawls at this time. - - You’ve been invited to join - . + + Set up your organization to start crawling. - - Browsertrix + + Finish setting up your Browsertrix account to start crawling. + + + You’ve been invited by + + to join the organization + + on Browsertrix. + + + You’ve been invited to join the organization + + on Browsertrix. + + + Step 1 complete + + + Step 1 + + + Join organization + + + Create password and display name + + + Step 2 + + + Configure organization + + + What is an org? + + + An org, or organization, is your workspace for web archiving. If you’re archiving collaboratively, an org workspace can be shared between team members. + + + Refer to our user guide on + org settings + for details. + + + Your org dashboard will be + ///orgs/ + + + You can change this in your org settings later. + + + Go to Dashboard + + + The org name "" is already taken, try another one. + + + The org URL identifier "" is already taken, try another one. + + + The org URL identifier "" is not a valid URL. Please use alphanumeric characters and dashes (-) only + + + Welcome to Browsertrix + + + Go to home page + + + This invite doesn't exist or has expired. Please ask the organization administrator to resend an invitation. + + + This is not a valid invite, or it may have expired. If you believe this is an error, please contact for help. + + + your Browsertrix administrator + + + Something unexpected went wrong retrieving this invite. Please contact for help. + + + This verification email is not valid. + + + Email address verified + + + Log in to continue. Enter new password @@ -2977,9 +3414,161 @@ Must be between 8-64 characters - - You've been invited to join - + + Choose a strong password between - characters. + + + Change Password + + + Resend password reset email? + + + Password reset email is not valid. Request a new password reset email + + + Sent invite to + + + Users + + + admin + + + Invite Users + + + Please log in to accept this invite. + + + Accept invitation + + + You’ve been invited to join a new org + + + Accept Invitation + + + Decline + + + This invitation is for . You are currently logged in as . Please log in with the correct email to access this invite. + + + You've joined . + + + Browsertrix + + + This invitation is not valid + + + You've declined to join . + + + Sending... + + + Resend verification email + + + Account Settings + + + Display Name + + + Enter your full name, or another name to display in the orgs you belong to. + + + Display name + + + Update the email you use to log in. + + + Verified + + + Needs verification + + + Enter your current password + + + New password + + + Your name has been updated. + + + Sorry, couldn't update name at this time. + + + Your email has been updated. + + + Sorry, couldn't update email at this time. + + + Your password has been updated. + + + Please correct your current password and try again. + + + Sorry, couldn't update password at this time. + + + Message + + + User Guide + + + Open in new window + + + Your account isn't quite set up yet + + + You must belong to at least one org in order to access Browsertrix features. + + + If you haven't received an invitation to an org, please contact us at . + + + If you haven't received an invitation to an org, please contact your Browsertrix administrator. + + + Open user menu + + + Log Out + + + Running Crawls + + + Sign Up + + + Expand org list + + + Source Code + + + Help Forum + + + Copy Browsertrix Version + + + Jump to Crawl Please log in to continue. @@ -2990,6 +3579,78 @@ A confirmation email was sent to: . + + Click the link in your email to confirm your email address. + + + Got it, go to dashboard + + + Organizations + + + You don't have any organizations. + + + Example (example.com) + Example browser profile name + + + Example (example.com) login profile + Example browser profile name + + + match + label for match percentage + + + org-member@email.com + Placeholder text for email to invite + + + person@email.com + Placeholder text for email to invite + + + comments + plural form of "comment" for few comments + + + comments + plural form of "comment" for many comments + + + comments + plural form of "comment" for multiple/other comments + + + comments + plural form of "comment" for two comments + + + comments + plural form of "comment" for zero comments + + + crawls + plural form of "crawl" for few crawls + + + crawls + plural form of "crawl" for many crawls + + + crawls + plural form of "crawl" for multiple/other crawls + + + crawls + plural form of "crawl" for two crawls + + + crawls + plural form of "crawl" for zero crawls + pages plural form of "page" for few pages @@ -3010,6 +3671,97 @@ pages plural form of "page" for zero pages + + URLs + plural form of "URLs" for few URLs + + + URLs + plural form of "URLs" for many URLs + + + URLs + plural form of "URLs" for multiple/other URLs + + + URLs + plural form of "URLs" for two URLs + + + URLs + plural form of "URLs" for zero URLs + + + comment + singular form for "comment" + + + crawl + singular form for "crawl" + + + page + singular form for "page" + + + URL + singular form for "URL" + + + Sent + Status message after sending verification email + + + AM + Time AM/PM + + + PM + Time AM/PM + + + + storage + + + per crawl + + + Unlimited pages + + + Unlimited concurrent crawls + + + Adding + + + + more + + + items + plural form of "item" for few items + + + items + plural form of "item" for many items + + + items + plural form of "item" for multiple/other items + + + items + plural form of "item" for two items + + + items + plural form of "item" for zero items + + + item + singular form for "item" +