diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11d4f68ec537..c3a8f528f20c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,10 +5,7 @@ on: push: branches: - main - - arch - 'v5.*' - - 3.x - - 2.x env: FORCE_COLOR: 1 @@ -61,6 +58,23 @@ jobs: echo "Setting BASE_COMMIT to $BASE_COMMIT" echo "BASE_COMMIT=$BASE_COMMIT" >> $GITHUB_ENV + - name: Check user org membership + id: check_user_org_membership + if: github.event_name == 'pull_request' + run: | + echo "Looking up: ${{ github.event.pull_request.user.login }}" + ENCODED_USERNAME=$(printf '%s' '${{ github.event.pull_request.user.login }}' | jq -sRr @uri) + + LOOKUP_USER=$(curl --write-out "%{http_code}" --silent --output /dev/null --location "https://api.github.com/orgs/tryghost/members/$ENCODED_USERNAME" --header "Authorization: Bearer ${{ secrets.CANARY_DOCKER_BUILD }}") + + if [ "$LOOKUP_USER" == "204" ]; then + echo "User is in the org" + echo "is_member=true" >> $GITHUB_OUTPUT + else + echo "User is not in the org" + echo "is_member=false" >> $GITHUB_OUTPUT + fi + - name: Determine added packages uses: dorny/paths-filter@v2.12.0 id: added @@ -179,9 +193,8 @@ jobs: changed_any_code: ${{ steps.changed.outputs.any-code }} changed_new_package: ${{ steps.added.outputs.new-package }} base_commit: ${{ env.BASE_COMMIT }} - branch_name: ${{ github.ref_name }} - is_canary_branch: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/arch') }} is_main: ${{ env.IS_MAIN }} + member_is_in_org: ${{ steps.check_user_org_membership.outputs.is_member }} has_browser_tests_label: ${{ github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'browser-tests') }} dependency_cache_key: ${{ env.cachekey }} @@ -193,7 +206,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - fetch-depth: 100 + fetch-depth: 1000 - uses: actions/setup-node@v4 env: FORCE_COLOR: 0 @@ -419,7 +432,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - fetch-depth: 100 + fetch-depth: 1000 - uses: actions/setup-node@v4 env: FORCE_COLOR: 0 @@ -950,11 +963,30 @@ jobs: ] name: Canary runs-on: ubuntu-latest - if: always() && needs.job_setup.outputs.is_canary_branch == 'true' && needs.job_setup.result == 'success' && needs.job_required_tests.result == 'success' + if: | + always() + && needs.job_setup.result == 'success' + && needs.job_required_tests.result == 'success' + && ( + needs.job_setup.outputs.is_main == 'true' + || ( + github.event_name == 'pull_request' + && needs.job_setup.outputs.member_is_in_org == 'true' + && contains(github.event.pull_request.labels.*.name, 'deploy-to-staging') + ) + ) steps: - name: Output needs (for debugging) run: echo "${{ toJson(needs) }}" + - name: Compute branch name (push) + if: github.event_name == 'push' + run: echo "branch_name=${{ github.ref_name }}" >> $GITHUB_ENV + + - name: Compute branch name (pull_request) + if: github.event_name == 'pull_request' + run: echo "branch_name=${{ github.ref }}" >> $GITHUB_ENV + - name: Invoke build uses: aurelien-baudet/workflow-dispatch@v2 with: @@ -962,6 +994,67 @@ jobs: workflow: .github/workflows/deploy.yml ref: 'refs/heads/main' repo: TryGhost/Ghost-Moya - inputs: '{"version":"canary","environment":"staging","version_extra":"${{ needs.job_setup.outputs.branch_name }}"}' + inputs: '{"version":"canary","environment":"staging","version_extra":"${{ env.branch_name }}"}' wait-for-completion-timeout: 25m wait-for-completion-interval: 30s + + publish_admin_x_activitypub: + needs: [ + job_setup, + job_lint, + job_unit-tests + ] + name: Publish @tryghost/admin-x-activitypub + runs-on: ubuntu-latest + if: always() && needs.job_setup.result == 'success' && needs.job_lint.result == 'success' && needs.job_unit-tests.result == 'success' && needs.job_setup.outputs.is_main == 'true' + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18.12.1' + + - name: Restore caches + uses: ./.github/actions/restore-cache + env: + DEPENDENCY_CACHE_KEY: ${{ needs.job_setup.outputs.dependency_cache_key }} + + - name: Build the package + run: yarn run nx build @tryghost/admin-x-activitypub + + - name: Check if version changed + id: version_check + working-directory: apps/admin-x-activitypub + run: | + CURRENT_VERSION=$(cat package.json | jq -r .version) + PUBLISHED_VERSION=$(npm show @tryghost/admin-x-activitypub version || echo "0.0.0") + echo "Current version: $CURRENT_VERSION" + echo "Published version: $PUBLISHED_VERSION" + if [ "$CURRENT_VERSION" = "$PUBLISHED_VERSION" ]; then + echo "Version is unchanged." + echo "version_changed=false" >> $GITHUB_ENV + else + echo "Version has changed." + echo "version_changed=true" >> $GITHUB_ENV + fi + + - name: Configure .npmrc + run: | + echo "@tryghost:registry=https://registry.npmjs.org/" >> ~/.npmrc + echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc + + - name: Publish to npm + if: env.version_changed == 'true' + working-directory: apps/admin-x-activitypub + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npm publish --access public + + - name: Purge jsdelivr cache + if: env.version_changed == 'true' + uses: gacts/purge-jsdelivr-cache@v1 + with: + url: | + https://cdn.jsdelivr.net/npm/@tryghost/admin-x-activitypub@0/dist/admin-x-activitypub.js diff --git a/apps/admin-x-activitypub/package.json b/apps/admin-x-activitypub/package.json index a52c3d419ec6..e7adda39ca75 100644 --- a/apps/admin-x-activitypub/package.json +++ b/apps/admin-x-activitypub/package.json @@ -1,6 +1,6 @@ { "name": "@tryghost/admin-x-activitypub", - "version": "0.0.0", + "version": "0.1.0", "license": "MIT", "repository": { "type": "git", @@ -14,7 +14,7 @@ ], "main": "./dist/admin-x-activitypub.umd.cjs", "module": "./dist/admin-x-activitypub.js", - "private": true, + "private": false, "scripts": { "dev": "vite build --watch", "dev:start": "vite", @@ -31,15 +31,10 @@ "devDependencies": { "@playwright/test": "1.46.1", "@testing-library/react": "14.3.1", - "@tryghost/admin-x-design-system": "0.0.0", - "@tryghost/admin-x-framework": "0.0.0", "@types/jest": "29.5.12", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", - "@radix-ui/react-form": "0.0.3", "jest": "29.7.0", - "react": "18.3.1", - "react-dom": "18.3.1", "ts-jest": "29.1.5" }, "nx": { @@ -67,5 +62,13 @@ ] } } + }, + "dependencies": { + "@radix-ui/react-form": "0.0.3", + "use-debounce": "10.0.3", + "@tryghost/admin-x-design-system": "0.0.0", + "@tryghost/admin-x-framework": "0.0.0", + "react": "18.3.1", + "react-dom": "18.3.1" } } diff --git a/apps/admin-x-activitypub/src/api/activitypub.test.ts b/apps/admin-x-activitypub/src/api/activitypub.test.ts index 63cddb3fbe97..cb66504d3148 100644 --- a/apps/admin-x-activitypub/src/api/activitypub.test.ts +++ b/apps/admin-x-activitypub/src/api/activitypub.test.ts @@ -580,4 +580,47 @@ describe('ActivityPubAPI', function () { expect(actual).toEqual(expected); }); }); + + describe('search', function () { + test('It returns the results of the search', async function () { + const fakeFetch = Fetch({ + 'https://auth.api/': { + response: JSONResponse({ + identities: [{ + token: 'fake-token' + }] + }) + }, + 'https://activitypub.api/.ghost/activitypub/actions/search?query=%40foo%40bar.baz': { + response: JSONResponse({ + profiles: [ + { + handle: '@foo@bar.baz', + name: 'Foo Bar' + } + ] + }) + } + }); + + const api = new ActivityPubAPI( + new URL('https://activitypub.api'), + new URL('https://auth.api'), + 'index', + fakeFetch + ); + + const actual = await api.search('@foo@bar.baz'); + const expected = { + profiles: [ + { + handle: '@foo@bar.baz', + name: 'Foo Bar' + } + ] + }; + + expect(actual).toEqual(expected); + }); + }); }); diff --git a/apps/admin-x-activitypub/src/api/activitypub.ts b/apps/admin-x-activitypub/src/api/activitypub.ts index 61be82fd4f4b..5e05a19f3302 100644 --- a/apps/admin-x-activitypub/src/api/activitypub.ts +++ b/apps/admin-x-activitypub/src/api/activitypub.ts @@ -3,6 +3,18 @@ export type Actor = any; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Activity = any; +export interface ProfileSearchResult { + actor: Actor; + handle: string; + followerCount: number; + isFollowing: boolean; + posts: Activity[]; +} + +export interface SearchResults { + profiles: ProfileSearchResult[]; +} + export class ActivityPubAPI { constructor( private readonly apiUrl: URL, @@ -280,4 +292,24 @@ export class ActivityPubAPI { const json = await this.fetchJSON(this.userApiUrl); return json; } + + get searchApiUrl() { + return new URL('.ghost/activitypub/actions/search', this.apiUrl); + } + + async search(query: string): Promise { + const url = this.searchApiUrl; + + url.searchParams.set('query', query); + + const json = await this.fetchJSON(url, 'GET'); + + if (json && 'profiles' in json) { + return json as SearchResults; + } + + return { + profiles: [] + }; + } } diff --git a/apps/admin-x-activitypub/src/components/Activities.tsx b/apps/admin-x-activitypub/src/components/Activities.tsx index a55f6a25e6de..c1dd96190baf 100644 --- a/apps/admin-x-activitypub/src/components/Activities.tsx +++ b/apps/admin-x-activitypub/src/components/Activities.tsx @@ -1,10 +1,12 @@ -import NiceModal from '@ebay/nice-modal-react'; import React, {useEffect, useRef} from 'react'; -import {Button, LoadingIndicator, NoValueLabel} from '@tryghost/admin-x-design-system'; + +import NiceModal from '@ebay/nice-modal-react'; +import {LoadingIndicator, NoValueLabel} from '@tryghost/admin-x-design-system'; import APAvatar, {AvatarBadge} from './global/APAvatar'; import ActivityItem, {type Activity} from './activities/ActivityItem'; import ArticleModal from './feed/ArticleModal'; +import FollowButton from './global/FollowButton'; import MainNavigation from './navigation/MainNavigation'; import getUsername from '../utils/get-username'; @@ -171,13 +173,12 @@ const Activities: React.FC = ({}) => {
{getActivityDescription(activity)}
{getExtendedDescription(activity)} - {isFollower(activity.actor.id) === false && ( - @@ -265,16 +265,16 @@ const Form: React.FC = ({comment, submit, submitText, submitSize, clo }, [editor, memberName, progress]); return ( -
+
-
+
-
+
diff --git a/apps/comments-ui/src/components/content/forms/SecundaryForm.tsx b/apps/comments-ui/src/components/content/forms/SecundaryForm.tsx index 78302914f70c..ab8b014abc2e 100644 --- a/apps/comments-ui/src/components/content/forms/SecundaryForm.tsx +++ b/apps/comments-ui/src/components/content/forms/SecundaryForm.tsx @@ -38,7 +38,7 @@ const SecundaryForm: React.FC = ({editor, submit, close, closeIfNotChange const reduced = isMobile(); return ( -
+
); diff --git a/apps/comments-ui/test/e2e/editor.test.ts b/apps/comments-ui/test/e2e/editor.test.ts index 7c286d5c6074..53afdf3cd5c3 100644 --- a/apps/comments-ui/test/e2e/editor.test.ts +++ b/apps/comments-ui/test/e2e/editor.test.ts @@ -1,4 +1,4 @@ -import {MockedApi, getHeight, getModifierKey, initialize, selectText, setClipboard, waitEditorFocused} from '../utils/e2e'; +import {MockedApi, getModifierKey, initialize, selectText, setClipboard, waitEditorFocused} from '../utils/e2e'; import {expect, test} from '@playwright/test'; test.describe('Editor', async () => { @@ -22,7 +22,6 @@ test.describe('Editor', async () => { await expect(frame.getByTestId('count')).toHaveText('1 comment'); const editor = frame.getByTestId('form-editor'); - const editorHeight = await getHeight(editor); await editor.click({force: true}); @@ -31,9 +30,6 @@ test.describe('Editor', async () => { // Wait for animation to finish await page.waitForTimeout(200); - const newEditorHeight = await getHeight(editor); - - expect(newEditorHeight).toBeGreaterThan(editorHeight); // Type in the editor await editor.type('Newly added comment'); @@ -57,22 +53,10 @@ test.describe('Editor', async () => { const mockedApi = new MockedApi({}); mockedApi.setMember({}); - const {frame} = await initialize({ - mockedApi, - page, - publication: 'Publisher Weekly' - }); - - const editor = frame.getByTestId('form-editor'); - const editorHeight = await getHeight(editor); - await page.keyboard.press('c'); // Wait for animation to finish await page.waitForTimeout(200); - const newEditorHeight = await getHeight(editor); - - expect(newEditorHeight).toBeGreaterThan(editorHeight); }); test('Can use CMD+ENTER to submmit', async ({page}) => { @@ -95,7 +79,6 @@ test.describe('Editor', async () => { await expect(frame.getByTestId('count')).toHaveText('1 comment'); const editor = frame.getByTestId('form-editor'); - const editorHeight = await getHeight(editor); await editor.click({force: true}); // Wait for focused @@ -103,9 +86,6 @@ test.describe('Editor', async () => { // Wait for animation to finish await page.waitForTimeout(200); - const newEditorHeight = await getHeight(editor); - - expect(newEditorHeight).toBeGreaterThan(editorHeight); // Type in the editor await editor.type('Newly added comment'); diff --git a/apps/portal/package.json b/apps/portal/package.json index e66b2a7dd39c..e4eb28d8774c 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -81,7 +81,6 @@ "@babel/eslint-parser": "7.23.3", "@doist/react-interpolate": "1.1.1", "@sentry/react": "7.119.0", - "@sentry/tracing": "7.114.0", "@testing-library/jest-dom": "5.17.0", "@testing-library/react": "12.1.5", "@tryghost/i18n": "0.0.0", diff --git a/ghost/admin/app/components/admin-x/admin-x-component.js b/ghost/admin/app/components/admin-x/admin-x-component.js index 0be6116504fe..058a046c815e 100644 --- a/ghost/admin/app/components/admin-x/admin-x-component.js +++ b/ghost/admin/app/components/admin-x/admin-x-component.js @@ -58,7 +58,12 @@ export const importComponent = async (packageName) => { } const baseUrl = (config.cdnUrl ? `${config.cdnUrl}assets/` : ghostPaths().assetRootWithHost); - const url = new URL(`${baseUrl}${relativePath}/${config[`${configKey}Filename`]}?v=${config[`${configKey}Hash`]}`); + let url = new URL(`${baseUrl}${relativePath}/${config[`${configKey}Filename`]}?v=${config[`${configKey}Hash`]}`); + + const customUrl = config[`${configKey}CustomUrl`]; + if (customUrl) { + url = new URL(customUrl); + } if (url.protocol === 'http:') { window[packageName] = await import(`http://${url.host}${url.pathname}${url.search}`); diff --git a/ghost/admin/app/components/stats/charts/technical.js b/ghost/admin/app/components/stats/charts/technical.js index 1297701a4504..0f31c847554f 100644 --- a/ghost/admin/app/components/stats/charts/technical.js +++ b/ghost/admin/app/components/stats/charts/technical.js @@ -60,7 +60,7 @@ export default class TechnicalComponent extends Component { const transformedData = (data ?? []).map((item, index) => ({ name: item[indexBy].charAt(0).toUpperCase() + item[indexBy].slice(1), - value: item.hits, + value: item.visits, color: colorPalette[index] })); @@ -101,7 +101,7 @@ export default class TechnicalComponent extends Component { loading={loading} error={error} index={indexBy} - categories={['hits']} + categories={['visits']} colorPalette={colorPalette} backgroundColor="transparent" fontSize="13px" diff --git a/ghost/admin/app/components/stats/charts/top-locations.js b/ghost/admin/app/components/stats/charts/top-locations.js index 057f718b0c97..a1c10f09670f 100644 --- a/ghost/admin/app/components/stats/charts/top-locations.js +++ b/ghost/admin/app/components/stats/charts/top-locations.js @@ -73,9 +73,9 @@ export default class TopLocations extends Component { ) }} - categories={['hits']} + categories={['visits']} categoryConfig={{ - hits: { + visits: { label: Visits, renderValue: ({value}) => {formatNumber(value)} } diff --git a/ghost/admin/app/components/stats/charts/top-pages.js b/ghost/admin/app/components/stats/charts/top-pages.js index 30a54922f001..9b8c2ef23849 100644 --- a/ghost/admin/app/components/stats/charts/top-pages.js +++ b/ghost/admin/app/components/stats/charts/top-pages.js @@ -82,9 +82,9 @@ export default class TopPages extends Component { ) }} - categories={['hits']} + categories={['visits']} categoryConfig={{ - hits: { + visits: { label: Visits, renderValue: ({value}) => {formatNumber(value)} } diff --git a/ghost/admin/app/components/stats/charts/top-sources.js b/ghost/admin/app/components/stats/charts/top-sources.js index ad697c7c7310..5c8254d492dd 100644 --- a/ghost/admin/app/components/stats/charts/top-sources.js +++ b/ghost/admin/app/components/stats/charts/top-sources.js @@ -81,9 +81,9 @@ export default class TopSources extends Component { ) }} - categories={['hits']} + categories={['visits']} categoryConfig={{ - hits: { + visits: { label: Visits, renderValue: ({value}) => {formatNumber(value)} } diff --git a/ghost/admin/app/components/stats/modal-stats-all.js b/ghost/admin/app/components/stats/modal-stats-all.js index c12520cb033c..66668f997e4e 100644 --- a/ghost/admin/app/components/stats/modal-stats-all.js +++ b/ghost/admin/app/components/stats/modal-stats-all.js @@ -126,9 +126,9 @@ export default class AllStatsModal extends Component { ) }} - categories={['hits']} + categories={['visits']} categoryConfig={{ - hits: { + visits: { label: Visits, renderValue: ({value}) => {formatNumber(value)} } diff --git a/ghost/admin/app/controllers/lexical-editor.js b/ghost/admin/app/controllers/lexical-editor.js index 6bc3270f1488..fc7a0b765025 100644 --- a/ghost/admin/app/controllers/lexical-editor.js +++ b/ghost/admin/app/controllers/lexical-editor.js @@ -1112,13 +1112,12 @@ export default class LexicalEditorController extends Controller { // triggered any time the admin tab is closed, we need to use a native // dialog here instead of our custom modal - window.onbeforeunload = () => { + window.onbeforeunload = (event) => { if (this.hasDirtyAttributes) { - return '==============================\n\n' - + 'Hey there! It looks like you\'re in the middle of writing' - + ' something and you haven\'t saved all of your content.' - + '\n\nSave before you go!\n\n' - + '=============================='; + console.log('Preventing unload due to hasDirtyAttributes'); // eslint-disable-line + event.preventDefault(); + // Included for legacy support, e.g. Chrome/Edge < 119 + event.returnValue = true; } }; } diff --git a/ghost/admin/app/services/local-revisions.js b/ghost/admin/app/services/local-revisions.js index dadc0894a127..f1a78b7cd0f4 100644 --- a/ghost/admin/app/services/local-revisions.js +++ b/ghost/admin/app/services/local-revisions.js @@ -23,9 +23,6 @@ export default class LocalRevisionsService extends Service { _prefix = 'post-revision'; latestRevisionTime = null; - // key to store a simple index of all revisions - _indexKey = 'ghost-revisions'; - /** * * @param {object} data - serialized post data, must include id and revisionTimestamp @@ -74,11 +71,7 @@ export default class LocalRevisionsService extends Service { data.revisionTimestamp = Date.now(); const key = this.generateKey(data); try { - const allKeys = this.keys(); - allKeys.push(key); - this.storage.setItem(this._indexKey, JSON.stringify(allKeys)); this.storage.setItem(key, JSON.stringify(data)); - // Apply the filter after saving this.filterRevisions(data.id); @@ -152,12 +145,6 @@ export default class LocalRevisionsService extends Service { */ remove(key) { this.storage.removeItem(key); - const keys = this.keys(); - let index = keys.indexOf(key); - if (index !== -1) { - keys.splice(index, 1); - } - this.storage.setItem(this._indexKey, JSON.stringify(keys)); } /** @@ -186,11 +173,15 @@ export default class LocalRevisionsService extends Service { * @returns {string[]} */ keys(prefix = undefined) { - let keys = JSON.parse(this.storage.getItem(this._indexKey) || '[]'); - if (prefix) { - keys = keys.filter(key => key.startsWith(prefix)); + const allKeys = []; + const filterPrefix = prefix || this._prefix; + for (let i = 0; i < this.storage.length; i++) { + const key = this.storage.key(i); + if (key.startsWith(filterPrefix)) { + allKeys.push(key); + } } - return keys; + return allKeys; } /** diff --git a/ghost/admin/lib/asset-delivery/index.js b/ghost/admin/lib/asset-delivery/index.js index d48581a34f8e..17a291afa63c 100644 --- a/ghost/admin/lib/asset-delivery/index.js +++ b/ghost/admin/lib/asset-delivery/index.js @@ -43,6 +43,8 @@ module.exports = { for (const [key, value] of Object.entries(this.packageConfig)) { console.log(`Asset-Delivery: ${key} = ${value}`); } + + this.packageConfig[`adminXActivitypubCustomUrl`] = 'https://cdn.jsdelivr.net/npm/@tryghost/admin-x-activitypub@0/dist/admin-x-activitypub.js' } return this.packageConfig; diff --git a/ghost/admin/package.json b/ghost/admin/package.json index 9228f5f797be..1753acd502e1 100644 --- a/ghost/admin/package.json +++ b/ghost/admin/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "5.94.2", + "version": "5.95.0", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org", @@ -178,7 +178,7 @@ "dependencies": { "jose": "4.15.9", "path-browserify": "1.0.1", - "webpack": "5.94.0" + "webpack": "5.95.0" }, "nx": { "targets": { @@ -214,4 +214,4 @@ } } } -} +} \ No newline at end of file diff --git a/ghost/admin/tests/unit/services/local-revisions-test.js b/ghost/admin/tests/unit/services/local-revisions-test.js index 23b3c4895ec0..d5566175363d 100644 --- a/ghost/admin/tests/unit/services/local-revisions-test.js +++ b/ghost/admin/tests/unit/services/local-revisions-test.js @@ -30,8 +30,7 @@ describe('Unit: Service: local-revisions', function () { // Mock localStorage sinon.restore(); localStore = {}; - getItemStub = sinon.stub().callsFake(key => localStore[key] || null - ); + getItemStub = sinon.stub().callsFake(key => localStore[key] || null); setItemStub = sinon.stub().callsFake((key, value) => localStore[key] = value + ''); removeItemStub = sinon.stub().callsFake(key => delete localStore[key]); clearStub = sinon.stub().callsFake(() => localStore = {}); @@ -41,6 +40,16 @@ describe('Unit: Service: local-revisions', function () { removeItem: removeItemStub, clear: clearStub }; + Object.defineProperty(localStorageMock, 'length', { + get: function () { + return Object.keys(localStore).length; + } + }); + Object.defineProperty(localStorageMock, 'key', { + value: function (n) { + return Object.keys(localStore)[n]; + } + }); // Create the service this.service = this.owner.lookup('service:local-revisions'); @@ -116,9 +125,7 @@ describe('Unit: Service: local-revisions', function () { quotaError.name = 'QuotaExceededError'; setItemStub.onCall(setItemStub.callCount).throws(quotaError); - // remove calls setItem() to remove the key from the index - // it's called twice for each quota error, hence the + 3 - setItemStub.onCall(setItemStub.callCount + 3).throws(quotaError); + setItemStub.onCall(setItemStub.callCount + 1).throws(quotaError); const keyToAdd = this.service.performSave('post', {id: 'test-id-3', lexical: 'data-3', status: 'draft'}); // Ensure the oldest revision was removed @@ -319,11 +326,13 @@ describe('Unit: Service: local-revisions', function () { expect(result).to.deep.equal([]); }); - it('returns the keys for all revisions if not prefix is provided', function () { + it('returns the keys for all revisions if no prefix is provided', async function () { // save revision this.service.performSave('post', {id: 'test-id', lexical: 'data', status: 'draft'}); + await sleep(1); + this.service.performSave('post', {id: 'draft', lexical: 'data', status: 'draft'}); const result = this.service.keys(); - expect(Object.keys(result)).to.have.lengthOf(1); + expect(result).to.have.lengthOf(2); expect(result[0]).to.match(/post-revision-test-id-\d+/); }); @@ -332,7 +341,7 @@ describe('Unit: Service: local-revisions', function () { this.service.performSave('post', {id: 'test-id', lexical: 'data', status: 'draft'}); this.service.performSave('post', {id: 'draft', lexical: 'data', status: 'draft'}); const result = this.service.keys('post-revision-test-id'); - expect(Object.keys(result)).to.have.lengthOf(1); + expect(result).to.have.lengthOf(1); expect(result[0]).to.match(/post-revision-test-id-\d+/); }); }); diff --git a/ghost/core/content/themes/casper b/ghost/core/content/themes/casper index bf3617a726b1..d147bb158e57 160000 --- a/ghost/core/content/themes/casper +++ b/ghost/core/content/themes/casper @@ -1 +1 @@ -Subproject commit bf3617a726b1b72f45663397d1ca11fb126c2546 +Subproject commit d147bb158e5705b7e903d0b18915380842ab5e83 diff --git a/ghost/core/core/boot.js b/ghost/core/core/boot.js index bee8ed9b5a75..d0280eea4db3 100644 --- a/ghost/core/core/boot.js +++ b/ghost/core/core/boot.js @@ -448,14 +448,6 @@ async function initBackgroundServices({config}) { const milestonesService = require('./server/services/milestones'); milestonesService.initAndRun(); - // Ideally OpenTelemetry should be configured as early as possible - // However, it can take a long time to initialize, so we load it here - // This prevents open telemetry from impacting boot time at the cost of not being able to trace the boot process - debug('Begin: Load OpenTelemetry'); - const opentelemetryInstrumentation = require('./shared/instrumentation'); - opentelemetryInstrumentation.initOpenTelemetry({config}); - debug('End: Load OpenTelemetry'); - debug('End: initBackgroundServices'); } diff --git a/ghost/core/core/shared/instrumentation.js b/ghost/core/core/shared/instrumentation.js deleted file mode 100644 index 1dd03720f75b..000000000000 --- a/ghost/core/core/shared/instrumentation.js +++ /dev/null @@ -1,46 +0,0 @@ -const logging = require('@tryghost/logging'); - -async function initOpenTelemetry({config}) { - // Only enable if explicitly enabled via config `opentelemetry:enabled` - try { - const enabled = config.get('opentelemetry:enabled'); - if (!enabled) { - logging.debug('OpenTelemetry is not enabled'); - return false; - } - const perf = require('perf_hooks').performance; - perf.mark('opentelemetry:init:start'); - logging.debug('Initializing OpenTelemetry'); - - // Lazyloaded to avoid boot time overhead when not enabled - const {NodeSDK} = require('@opentelemetry/sdk-node'); - const {PrometheusExporter} = require('@opentelemetry/exporter-prometheus'); - const {RuntimeNodeInstrumentation} = require('@opentelemetry/instrumentation-runtime-node'); - - const prometheusExporter = new PrometheusExporter({ - port: config.get('opentelemetry:prometheus:port'), - startServer: true - }); - - const sdk = new NodeSDK({ - serviceName: 'ghost', - metricReader: prometheusExporter, - instrumentations: [ - new RuntimeNodeInstrumentation({ - eventLoopUtilizationMeasurementInterval: 5000 - }) - ] - }); - sdk.start(); - perf.mark('opentelemetry:init:finished'); - logging.debug('OpenTelemetry initialized in', Math.round(perf.measure('opentelemetry:init:duration', 'opentelemetry:init:start', 'opentelemetry:init:finished').duration), 'ms'); - return true; - } catch (error) { - logging.error('Error initializing OpenTelemetry', error); - return false; - } -} - -module.exports = { - initOpenTelemetry -}; diff --git a/ghost/core/package.json b/ghost/core/package.json index d150526d0141..74adea73410a 100644 --- a/ghost/core/package.json +++ b/ghost/core/package.json @@ -1,6 +1,6 @@ { "name": "ghost", - "version": "5.94.2", + "version": "5.95.0", "description": "The professional publishing platform", "author": "Ghost Foundation", "homepage": "https://ghost.org", @@ -58,12 +58,6 @@ }, "dependencies": { "@extractus/oembed-extractor": "3.2.1", - "@opentelemetry/api": "1.9.0", - "@opentelemetry/exporter-prometheus": "0.52.1", - "@opentelemetry/instrumentation-runtime-node": "0.6.0", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-node": "0.52.1", - "@opentelemetry/sdk-trace-node": "1.25.1", "@sentry/node": "7.119.0", "@slack/webhook": "7.0.3", "@tryghost/adapter-base-cache": "0.1.12", diff --git a/ghost/core/test/e2e-api/admin/images.test.js b/ghost/core/test/e2e-api/admin/images.test.js index ee882b35cb41..8d4aad72eae7 100644 --- a/ghost/core/test/e2e-api/admin/images.test.js +++ b/ghost/core/test/e2e-api/admin/images.test.js @@ -342,7 +342,7 @@ describe('Images API', function () { const brokenPayload = '--boundary\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example.png\"\r\nContent-Type: image/png\r\n\r\n'; // eslint-disable-next-line no-undef - const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, blob.size / 2)], { + const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, Math.floor(blob.size / 2))], { type: 'multipart/form-data; boundary=boundary' })).text(); @@ -367,7 +367,7 @@ describe('Images API', function () { const brokenPayload = '--boundary\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example.png\"\r\nContent-Type: image/png\r\n'; // eslint-disable-next-line no-undef - const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, blob.size / 2)], { + const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, Math.floor(blob.size / 2))], { type: 'multipart/form-data; boundary=boundary' })).text(); diff --git a/ghost/core/test/e2e-api/admin/media.test.js b/ghost/core/test/e2e-api/admin/media.test.js index 0baaef3e5ad7..5f88cb489ea5 100644 --- a/ghost/core/test/e2e-api/admin/media.test.js +++ b/ghost/core/test/e2e-api/admin/media.test.js @@ -140,7 +140,7 @@ describe('Media API', function () { const brokenPayload = '--boundary\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example.png\"\r\nContent-Type: image/png\r\n\r\n'; // eslint-disable-next-line no-undef - const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, blob.size / 2)], { + const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, Math.floor(blob.size / 2))], { type: 'multipart/form-data; boundary=boundary' })).text(); @@ -164,7 +164,7 @@ describe('Media API', function () { const brokenPayload = '--boundary\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example.png\"\r\nContent-Type: image/png\r\n'; // eslint-disable-next-line no-undef - const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, blob.size / 2)], { + const brokenDataBlob = await (new Blob([brokenPayload, blob.slice(0, Math.floor(blob.size / 2))], { type: 'multipart/form-data; boundary=boundary' })).text(); diff --git a/ghost/core/test/unit/shared/instrumentation.test.js b/ghost/core/test/unit/shared/instrumentation.test.js deleted file mode 100644 index 794c392f9a21..000000000000 --- a/ghost/core/test/unit/shared/instrumentation.test.js +++ /dev/null @@ -1,23 +0,0 @@ -const assert = require('assert/strict'); -const sinon = require('sinon'); - -describe('UNIT: instrumentation', function () { - it('should initialize OpenTelemetry if configured', async function () { - const config = { - get: sinon.stub().returns(true) - }; - const instrumentation = require('../../../core/shared/instrumentation'); - const result = await instrumentation.initOpenTelemetry({config}); - assert.equal(result, true); - }); - - it('should not initialize OpenTelemetry if not configured', async function () { - const config = { - get: sinon.stub().returns(false) - }; - const instrumentation = require('../../../core/shared/instrumentation'); - - const result = await instrumentation.initOpenTelemetry({config}); - assert.equal(result, false); - }); -}); \ No newline at end of file diff --git a/ghost/i18n/lib/i18n.js b/ghost/i18n/lib/i18n.js index 82bbe3546bd6..d645aacec548 100644 --- a/ghost/i18n/lib/i18n.js +++ b/ghost/i18n/lib/i18n.js @@ -2,15 +2,19 @@ const i18next = require('i18next'); const SUPPORTED_LOCALES = [ 'af', // Afrikaans + 'ar', // Arabic 'bg', // Bulgarian 'bs', // Bosnian 'ca', // Catalan 'cs', // Czech 'da', // Danish 'de', // German + 'de-CH', // Swiss German + 'el', // Greek 'en', // English 'eo', // Esperanto 'es', // Spanish + 'et', // Estonian 'fa', // Persian/Farsi 'fi', // Finnish 'fr', // French @@ -23,6 +27,7 @@ const SUPPORTED_LOCALES = [ 'ja', // Japanese 'ko', // Korean 'lt', // Lithuanian + 'mk', // Macedonian 'mn', // Mongolian 'ms', // Malay 'nl', // Dutch @@ -38,7 +43,9 @@ const SUPPORTED_LOCALES = [ 'sl', // Slovenian 'sq', // Albanian 'sr', // Serbian + 'sr-Cyrl', // Serbian (Cyrillic) 'sv', // Swedish + 'th', // Thai 'tr', // Turkish 'uk', // Ukrainian 'uz', // Uzbek diff --git a/ghost/i18n/locales/ar/comments.json b/ghost/i18n/locales/ar/comments.json new file mode 100644 index 000000000000..77ef1db96936 --- /dev/null +++ b/ghost/i18n/locales/ar/comments.json @@ -0,0 +1,71 @@ +{ + "{{amount}} characters left": "", + "{{amount}} comments": "", + "{{amount}} days ago": "", + "{{amount}} hrs ago": "", + "{{amount}} mins ago": "", + "{{amount}} months ago": "", + "{{amount}} more": "", + "{{amount}} seconds ago": "", + "{{amount}} weeks ago": "", + "{{amount}} years ago": "", + "1 comment": "", + "Add comment": "", + "Add context to your comment, share your name and expertise to foster a healthy discussion.": "", + "Add reply": "", + "Already a member?": "", + "Anonymous": "", + "Become a member of {{publication}} to start commenting.": "", + "Become a paid member of {{publication}} to start commenting.": "", + "Cancel": "", + "Comment": "", + "Complete your profile": "", + "Delete": "", + "Deleted member": "", + "Discussion": "", + "Edit": "", + "Edit this comment": "", + "edited": "", + "Enter your name": "", + "Expertise": "", + "Founder @ Acme Inc": "", + "Full-time parent": "", + "Head of Marketing at Acme, Inc": "", + "Hide": "", + "Hide comment": "", + "Jamie Larson": "", + "Join the discussion": "", + "Just now": "", + "Local resident": "", + "Member discussion": "", + "Name": "", + "Neurosurgeon": "", + "One day ago": "", + "One hour ago": "", + "One min ago": "", + "One month ago": "", + "One week ago": "", + "One year ago": "", + "Reply": "", + "Reply to comment": "", + "Report": "", + "Report comment": "", + "Report this comment?": "", + "Save": "", + "Sending": "", + "Sent": "", + "Show": "", + "Show {{amount}} more replies": "", + "Show {{amount}} previous comments": "", + "Show 1 more reply": "", + "Show 1 previous comment": "", + "Show comment": "", + "Sign in": "", + "Sign up now": "", + "Start the conversation": "", + "This comment has been hidden.": "", + "This comment has been removed.": "", + "Upgrade now": "", + "Yesterday": "", + "Your request will be sent to the owner of this site.": "" +} diff --git a/ghost/i18n/locales/ar/ghost.json b/ghost/i18n/locales/ar/ghost.json index e4c9ec14b415..2a531eff76e1 100644 --- a/ghost/i18n/locales/ar/ghost.json +++ b/ghost/i18n/locales/ar/ghost.json @@ -1,20 +1,27 @@ { "All the best!": "مع خالص التقدير!", + "Complete signup for {{siteTitle}}!": "", "Complete your sign up to {{siteTitle}}!": "أكمل تسجيلك في {{siteTitle}}!", + "Confirm email address": "", + "Confirm signup": "", + "Confirm your email address": "", "Confirm your email update for {{siteTitle}}!": "تأكيد تحديث بريدك الاكتروني لـ {{siteTitle}}!", "Confirm your subscription to {{siteTitle}}": "تأكيد اشتراكك في {{siteTitle}}!", "For your security, the link will expire in 24 hours time.": "لدواعي الحماية، سيتنتهي فعالية الرابط خلال اربع وعشرون ساعة.", "Hey there,": "مرحبا بك،", + "Hey there!": "", "If you did not make this request, you can safely ignore this email.": "إذا لم تقم بهذا الطلب، يمكنك تجاهل هذه الرسالة بكل امان.", "If you did not make this request, you can simply delete this message.": "إذا لم تقم بهذا الطلب، يمكنك ببساطة حذف هذه الرسالة.", "Please confirm your email address with this link:": "برجاء تأكيد بريدك الاكتروني من خلال الرابط:", "Secure sign in link for {{siteTitle}}": "رابط تسجيل الدخول الامن الى {{siteTitle}}", "See you soon!": "نراكم قريبا!", "Sent to {{email}}": "تم الارسال الى {{email}}", + "Sign in": "", "Sign in to {{siteTitle}}": "تسجيل الدخول الى {{siteTitle}}", "Tap the link below to complete the signup process for {{siteTitle}}, and be automatically signed in:": "انقر الرابط ادناه لاكمال عملية التسجيل في {{siteTitle}}, والدخول مباشرة:", "Thank you for signing up to {{siteTitle}}!": "شكرا لتسجيلك في {{siteTitle}}!", "Thank you for subscribing to {{siteTitle}}!": "شكرا لاشتراكك في {{siteTitle}}!", + "Thank you for subscribing to {{siteTitle}}.": "", "Thank you for subscribing to {{siteTitle}}. Tap the link below to be automatically signed in:": "شكرا لاشتراكك في {{siteTitle}}. انقر الرابط ادناه لتسجيل الدخول:", "This email address will not be used.": "هذا البريد الاكتروني لن يتم استخدامه.", "Welcome back to {{siteTitle}}!": "مرحبا بك مرة اخرى في {{siteTitle}}!", @@ -22,5 +29,6 @@ "You can also copy & paste this URL into your browser:": "بامكانك ايضا نسخ ولصق هذا الرابط في متصفحك:", "You will not be signed up, and no account will be created for you.": "لم يتم تسجيلك او لم بتم انشاء حساب لك.", "You will not be subscribed.": "لم يتم اشتراكك.", - "You're one tap away from subscribing to {{siteTitle}} — please confirm your email address with this link:": "أنت على بعد خطوة من الاشتراك في {{siteTitle}} - برجاء تأكيد البريد الاكتروني من خلال هذا الرابط:" + "You're one tap away from subscribing to {{siteTitle}} — please confirm your email address with this link:": "أنت على بعد خطوة من الاشتراك في {{siteTitle}} - برجاء تأكيد البريد الاكتروني من خلال هذا الرابط:", + "You're one tap away from subscribing to {{siteTitle}}!": "" } diff --git a/ghost/i18n/locales/ar/portal.json b/ghost/i18n/locales/ar/portal.json index 77a63929f788..8d8882ca5cd8 100644 --- a/ghost/i18n/locales/ar/portal.json +++ b/ghost/i18n/locales/ar/portal.json @@ -1,60 +1,177 @@ { + "(save {{highestYearlyDiscount}}%)": "", + "{{amount}} days free": "", + "{{amount}} off": "", + "{{amount}} off for first {{number}} months.": "", + "{{amount}} off for first {{period}}.": "", + "{{amount}} off forever.": "", "{{discount}}% discount": "{{discount}}% خصم", + "{{memberEmail}} will no longer receive {{newsletterName}} newsletter.": "", + "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "", + "{{memberEmail}} will no longer receive this newsletter.": "", "{{trialDays}} days free": "{{trialDays}} أيام مجانية", + "+1 (123) 456-7890": "", "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "رابط الدخول تم ارساله الى بريدك الاكتروني. اذا لم تتلقى الرسالة خلال 3 دقائق، برجاء التأكد من مجلد المهملات.", "Account": "حسابي", "Account settings": "اعدادات الحساب", "After a free trial ends, you will be charged the regular price for the tier you've chosen. You can always cancel before then.": "بعد انتهاء المدة التجريبية، سيتم خصم السعر العادي للباقة التي اخترتها. بامكانك الغاء الاشتراك قبل ذلك.", "Already a member?": "هل انت عضو؟", + "An unexpected error occured. Please try again or
contact support if the error persists.": "", "Back": "الرجوع", "Back to Log in": "الرجوع الى تسجيل الدخول", + "Billing info": "", + "Black Friday": "", + "Cancel anytime.": "", "Cancel subscription": "إلغاء الاشتراك", "Cancellation reason": "سبب الإلغاء", + "Change": "", + "Change plan": "", + "Check spam & promotions folders": "", + "Check with your mail provider": "", + "Choose": "", "Choose a different plan": "اختر اشتراك مختلف", + "Choose a plan": "", "Choose your newsletters": "اختر مجموعة بريدية مفضلة", + "Click here to retry": "", "Close": "إغلاق", "Comments": "تعليق", + "Complimentary": "", "Confirm": "تأكيد", + "Confirm cancellation": "", + "Confirm subscription": "", + "Contact support": "", "Continue": "استمرار", + "Continue subscription": "", + "Could not sign in. Login link expired.": "", + "Could not update email! Invalid link.": "", + "Create a new contact": "", + "Current plan": "", "Delete account": "حذف الحساب", + "Didn't mean to do this? Manage your preferences .": "", "Don't have an account?": "هل لديك حساب؟", + "Edit": "", "Email": "بريد الكترني", - "Email preference updated.": "تم تحديث تفضيلات البريد الاكتروني", + "Email newsletter": "", "Email preferences": "تفضيلات", "Emails": "البريد الاكتروني", "Emails disabled": "تم تعطيل جميع بريد الاكترونية", + "Ends {{offerEndDate}}": "", + "Enter your email address": "", + "Enter your name": "", + "Error": "", + "Expires {{expiryDate}}": "", + "Forever": "", + "Free Trial – Ends {{trialEnd}}": "", "Get help": "المساعدة", + "Get in touch for help": "", "Get notified when someone replies to your comment": "استلم اشعار في حال تم الرد على تعليقك", "Give feedback on this post": "شارك رأيك في هذا المنشور", + "Help! I'm not receiving emails": "", + "Here are a few other sites you may enjoy.": "", + "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "", + "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "", + "If you cancel your subscription now, you will continue to have access until {{periodEnd}}.": "", + "If you have a corporate or government email account, reach out to your IT department and ask them to allow emails to be received from {{senderEmail}}": "", + "If you would like to start receiving emails again, the best next steps are to check your email address on file for any issues and then click resubscribe on the previous screen.": "", + "If you're not receiving the email newsletter you've subscribed to, here are a few things to check.": "", + "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "", + "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "", + "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "", + "Invalid email address": "", + "Jamie Larson": "", + "jamie@example.com": "", "Less like this": "أقل من هذا", + "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "", "Manage": "إدارة", + "Maybe later": "", + "Memberships unavailable, contact the owner for access.": "", + "month": "", "Monthly": "شهري", "More like this": "أكثر من هذا", "Name": "الاسم", + "Need more help? Contact support": "", + "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "", "Not receiving emails?": "لم تستلم رسالة بريدية؟", "Now check your email!": "الان تأكد من بريدك الاكتروني!", + "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "", + "Permanent failure (bounce)": "", + "Phone number": "", + "Plan": "", + "Plan checkout was cancelled.": "", + "Plan upgrade was cancelled.": "", + "Please contact {{supportAddress}} to adjust your complimentary subscription.": "", + "Please enter {{fieldName}}": "", + "Please fill in required fields": "", "Price": "السعر", "Re-enable emails": "اعد تفعيل رسال البريد", + "Recommendations": "", + "Renews at {{price}}.": "", "Retry": "اعد المحاولة", "Save": "حفظ", + "Send an email and say hi!": "", + "Send an email to {{senderEmail}} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "", "Sending login link...": "جار ارسال رابط التسجيل...", "Sending...": "جار الارسال...", + "Show all": "", "Sign in": "تسجيل الدخول", + "Sign out": "", "Sign up": "انشاء حساب", + "Signup error: Invalid link": "", + "Something went wrong, please try again later.": "", + "Sorry, that didn’t work.": "", + "Spam complaints": "", "Start {{amount}}-day free trial": "ابدأ {{amount}}-ايام تجربة مجانية", + "Starting {{startDate}}": "", + "Starting today": "", "Submit feedback": "تسليم رأيك", + "Subscribe": "", + "Subscribed": "", + "Success": "", + "Success! Check your email for magic link to sign-in.": "", + "Success! Your account is fully activated, you now have access to all content.": "", + "Success! Your email is updated.": "", "Successfully unsubscribed": "تم الغاء الاشتراك بنجاح", + "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "", + "Thank you for your support": "", + "Thank you for your support!": "", "Thanks for the feedback!": "شكرا لمشاركتك رأيك!", "That didn't go to plan": "لم تسر الامور على ما يرام", + "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "", + "There was a problem submitting your feedback. Please try again a little later.": "", + "There was an error processing your payment. Please try again.": "", "This site is invite-only, contact the owner for access.": "هذا الموقع للمشتركين فقط، تواصل مع ادارة الموقع للحصول على اشتراك.", + "This site is not accepting payments at the moment.": "", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "لاكمال انشاء حسابك، استخدم رابط التأكيد المرسل الى بريد. اذا لم تتلقى الرسالة خلال 3 دقائق، برجاء التأكد من مجلد المهملات.", + "To continue to stay up to date, subscribe to {{publication}} below.": "", + "Try free for {{amount}} days, then {{originalPrice}}.": "", + "Unlock access to all newsletters by becoming a paid subscriber.": "", "Unsubscribe from all emails": "الغ الاشتراك من جميع الرسائل", + "Unsubscribed": "", + "Unsubscribed from all emails.": "", "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "الغاء اشتراك من الرسائل لا يعني إلغاء اشتراكك المدفوع في {{title}}", + "Update": "", "Update your preferences": "تحديث تفضيلاتك", + "Verification link sent, check your inbox": "", + "Verify your email address is correct": "", + "View plans": "", "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "لم نتمكن من إلغاء اشتراكك في الرسائل لانه لم يتم العثور على بريدك الاكتروني. برجاء التواصل مع ادارة الموقع.", + "Welcome back, {{name}}!": "", + "Welcome back!": "", + "Welcome to {{siteTitle}}": "", + "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "", + "Why has my email been disabled?": "", + "year": "", "Yearly": "سنوي", + "You currently have a free membership, upgrade to a paid subscription for full access.": "", "You have been successfully resubscribed": "تم اعادة اشتراكك بنجاح", + "You're currently not receiving emails": "", + "You're not receiving emails": "", "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "لم تستلم رسالة بريدية لربما انك جعلت الرسائل مهملة او ان الرسائل لا تصل الى بريدك الذي سجلته.", + "You've successfully signed in.": "", + "You've successfully subscribed to": "", "Your account": "حسابك", - "Your input helps shape what gets published.": "آرائك تساهم في تحسين ما ينشر." + "Your input helps shape what gets published.": "آرائك تساهم في تحسين ما ينشر.", + "Your subscription will expire on {{expiryDate}}": "", + "Your subscription will renew on {{renewalDate}}": "", + "Your subscription will start on {{subscriptionStart}}": "" } diff --git a/ghost/i18n/locales/ar/search.json b/ghost/i18n/locales/ar/search.json new file mode 100644 index 000000000000..8902015528ff --- /dev/null +++ b/ghost/i18n/locales/ar/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "", + "Cancel": "", + "No matches found": "", + "Posts": "", + "Search posts, tags and authors": "", + "Show more results": "", + "Tags": "" +} diff --git a/ghost/i18n/locales/ar/signup-form.json b/ghost/i18n/locales/ar/signup-form.json new file mode 100644 index 000000000000..cc957d9d0d1c --- /dev/null +++ b/ghost/i18n/locales/ar/signup-form.json @@ -0,0 +1,9 @@ +{ + "Email sent": "", + "Now check your email!": "", + "Please enter a valid email address": "", + "Something went wrong, please try again.": "", + "Subscribe": "", + "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "", + "Your email address": "" +} diff --git a/ghost/i18n/locales/bg/comments.json b/ghost/i18n/locales/bg/comments.json index 4684c26cafa1..1d64c4915c9d 100644 --- a/ghost/i18n/locales/bg/comments.json +++ b/ghost/i18n/locales/bg/comments.json @@ -1,5 +1,5 @@ { - "{{amount}} characters left": "Остават {{amount}} символа", + "{{amount}} characters left": "Остават {{amount}} знака", "{{amount}} comments": "{{amount}} коментара", "{{amount}} days ago": "Преди {{amount}} дни", "{{amount}} hrs ago": "Преди {{amount}} часа", @@ -10,8 +10,8 @@ "{{amount}} weeks ago": "Преди {{amount}} седмици", "{{amount}} years ago": "Преди {{amount}} години", "1 comment": "1 коментар", - "Add comment": "Добавяне на коментар", - "Add context to your comment, share your name and expertise to foster a healthy discussion.": "Добавете контекст към вашия коментар, споделете вашето име и опит, за да насърчите конструктивна дискусия.", + "Add comment": "Нов коментар", + "Add context to your comment, share your name and expertise to foster a healthy discussion.": "Добавете контекст към коментара си, споделете името си и опита си, за да насърчите полезна дискусия.", "Add reply": "Отговор", "Already a member?": "Вече сте абонат?", "Anonymous": "Анонимен", @@ -19,53 +19,53 @@ "Become a paid member of {{publication}} to start commenting.": "Станете платен абонат на {{publication}}, за да коментирате.", "Cancel": "Отказ", "Comment": "Коментар", - "Complete your profile": "Завършете своя профил", + "Complete your profile": "Попълнете профила си", "Delete": "Изтриване", "Deleted member": "Изтрит абонат", "Discussion": "Дискусия", "Edit": "Редактиране", - "Edit this comment": "Редактиране на този коментар", - "edited": "pедактиран", - "Enter your name": "Въведете вашето име", + "Edit this comment": "Редактиране на коментара", + "edited": "редактиран", + "Enter your name": "Попълнете името си", "Expertise": "Опит", - "Founder @ Acme Inc": "Основател @ Компания ООД", - "Full-time parent": "Родител на пълен работен ден", - "Head of Marketing at Acme, Inc": "Ръководител маркетинг в Компания ООД", + "Founder @ Acme Inc": "Основател на Компания ООД", + "Full-time parent": "Родител на пълно работно време", + "Head of Marketing at Acme, Inc": "Директор маркетинг в Компания ООД", "Hide": "Скриване", - "Hide comment": "Скриване на коментар", + "Hide comment": "Скриване на коментара", "Jamie Larson": "Иван Иванов", - "Join the discussion": "Включете се в дискусията", + "Join the discussion": "Участвайте в дискусията", "Just now": "Току-що", "Local resident": "Местен жител", - "Member discussion": "Дискусия на абонатите", + "Member discussion": "Дискусия за абонатите", "Name": "Име", "Neurosurgeon": "Неврохирург", - "One day ago": "Преди един ден", - "One hour ago": "Преди един час", - "One min ago": "Преди една минута", - "One month ago": "Преди един месец", - "One week ago": "Преди една седмица", - "One year ago": "Преди една година", + "One day ago": "Преди ден", + "One hour ago": "Преди час", + "One min ago": "Преди минута", + "One month ago": "Преди месец", + "One week ago": "Преди седмица", + "One year ago": "Преди година", "Reply": "Отговор", - "Reply to comment": "Отгговор на коментар", + "Reply to comment": "Отгговор на коментара", "Report": "Докладване", - "Report comment": "Докладване на коментар", - "Report this comment?": "Искате ли да докладвате този коментар?", + "Report comment": "Докладване на коментара", + "Report this comment?": "Ще докладвате ли коментара?", "Save": "Запис", "Sending": "Изпращане", "Sent": "Изпратен", "Show": "Показване", - "Show {{amount}} more replies": "Показване на още {{amount}} отговора", - "Show {{amount}} previous comments": "Показване на {{amount}} предишни коментара", - "Show 1 more reply": "Показване на още 1 отговор", - "Show 1 previous comment": "Показване на 1 предишен коментар", - "Show comment": "Показване на коментар", - "Sign in": "Влизане", - "Sign up now": "Абонирайте се сега", - "Start the conversation": "Започнете дискусията", + "Show {{amount}} more replies": "Покажи още {{amount}} отговора", + "Show {{amount}} previous comments": "Покажи {{amount}} предишни коментара", + "Show 1 more reply": "Покажи още един отговор", + "Show 1 previous comment": "Покажи един предишен коментар", + "Show comment": "Покажи коментар", + "Sign in": "Вход", + "Sign up now": "Регистрация", + "Start the conversation": "Започнете дискусия", "This comment has been hidden.": "Този коментар е скрит.", "This comment has been removed.": "Този коментар е премахнат.", - "Upgrade now": "Преминете към платен абонамент", + "Upgrade now": "Надградете сега", "Yesterday": "Вчера", - "Your request will be sent to the owner of this site.": "Вашето искане ще бъде изпратено до собственика на сайта." + "Your request will be sent to the owner of this site.": "Искането ви ще бъде изпратено до собственика на сайта." } diff --git a/ghost/i18n/locales/bg/ghost.json b/ghost/i18n/locales/bg/ghost.json index 97d5ca6d5dd1..be046e9d8274 100644 --- a/ghost/i18n/locales/bg/ghost.json +++ b/ghost/i18n/locales/bg/ghost.json @@ -10,8 +10,8 @@ "For your security, the link will expire in 24 hours time.": "За ваша сигурност връзката ще бъде валидна само 24 часа.", "Hey there,": "Здравейте,", "Hey there!": "Здравейте!", - "If you did not make this request, you can safely ignore this email.": "Ако не сте направили тази заявка, можете да игноритрате това писмо.", - "If you did not make this request, you can simply delete this message.": "Ако не сте направили тази заявка, можете просто да изтриете това писмо.", + "If you did not make this request, you can safely ignore this email.": "Ако не сте направили тази заявка, може да игнорирате това писмо.", + "If you did not make this request, you can simply delete this message.": "Ако не сте направили тази заявка, може просто да изтриете това писмо.", "Please confirm your email address with this link:": "Моля, потвърдете Вашия имейл адрес чрез тази връзка:", "Secure sign in link for {{siteTitle}}": "Връзка за сигурно влизане в сайта {{siteTitle}}", "See you soon!": "До скоро!", @@ -27,7 +27,7 @@ "Welcome back to {{siteTitle}}!": "Добре дошли отново в {{siteTitle}}!", "Welcome back! Use this link to securely sign in to your {{siteTitle}} account:": "Добре дошли отново! Използвайте тази връзка за влизане в своя акаунт за сайта {{siteTitle}}:", "You can also copy & paste this URL into your browser:": "Може да копирате този адрес в своя браузър:", - "You will not be signed up, and no account will be created for you.": "Няма да бъде направена регистрация и няма да бъде създаван акаунт за вас.", + "You will not be signed up, and no account will be created for you.": "Няма да бъде направена регистрация и няма да бъде създаден акаунт за вас.", "You will not be subscribed.": "Няма да бъдете абониран.", "You're one tap away from subscribing to {{siteTitle}} — please confirm your email address with this link:": "Вие сте на стъпка от това да се абонирате за {{siteTitle}} - моля, потвърдете имейла си като ползвате тази връзка:", "You're one tap away from subscribing to {{siteTitle}}!": "Вие сте на една стъпка от това да се абонирате за {{siteTitle}}!" diff --git a/ghost/i18n/locales/bg/portal.json b/ghost/i18n/locales/bg/portal.json index 544718ad97bc..20afadcb32f4 100644 --- a/ghost/i18n/locales/bg/portal.json +++ b/ghost/i18n/locales/bg/portal.json @@ -1,5 +1,5 @@ { - "(save {{highestYearlyDiscount}}%)": "", + "(save {{highestYearlyDiscount}}%)": "(спестете {{highestYearlyDiscount}}%)", "{{amount}} days free": "{{amount}} дни безплатно", "{{amount}} off": "{{amount}} отстъпка", "{{amount}} off for first {{number}} months.": "{{amount}} отстъпка за първите {{number}} месеца.", @@ -10,12 +10,12 @@ "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}} повече няма да получава имейли, когато някой отговаря на ваш коментар.", "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} повече няма да получава този бюлетин.", "{{trialDays}} days free": "{{trialDays}} дни безплатен достъп", - "+1 (123) 456-7890": "", - "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Изпратен Ви е имейл с препратка за влизане. Ако не пристигне до 3 минути, проверете дали не е категоризиран като нежелано писмо.", + "+1 (123) 456-7890": "+359 88 123-4567", + "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Връзка за влизане ви беше изпратена по имейл. Ако писмото не пристигне до 3 минути, проверете дали не е в папката за спам.", "Account": "Профил", "Account settings": "Настройки на профила Ви", - "After a free trial ends, you will be charged the regular price for the tier you've chosen. You can always cancel before then.": "След приключване на безплатния достъп ще бъдете таксувани според обявените цени. Можете да се откажете преди изтичането на безплатния достъп.", - "Already a member?": "Вече сте абонат на сайта?", + "After a free trial ends, you will be charged the regular price for the tier you've chosen. You can always cancel before then.": "След приключване на безплатния период ще бъдете таксувани според обявените цени. Можете да се откажете преди изтичането на безплатния период.", + "Already a member?": "Абонат ли сте вече?", "An unexpected error occured. Please try again or contact support if the error persists.": "Възникна неочаквана грешка. Моля, опитайте отново или потърсете поддръжката ако това се повтаря.", "Back": "Обратно", "Back to Log in": "Обратно към формата за влизане", @@ -25,13 +25,13 @@ "Cancel subscription": "Откажи абонамент", "Cancellation reason": "Причина за отказ", "Change": "Промени", - "Change plan": "", + "Change plan": "Промени плана", "Check spam & promotions folders": "Провери папките за спам и промоции", "Check with your mail provider": "Уведомете доставчика ви на ел. поща", "Choose": "Избери", - "Choose a different plan": "Избеи различен план", - "Choose a plan": "", - "Choose your newsletters": "Избери твоят бюлетин", + "Choose a different plan": "Избери различен план", + "Choose a plan": "Изберете план", + "Choose your newsletters": "Изберете бюлетини", "Click here to retry": "Щракнете за нов опит", "Close": "Затвори", "Comments": "Коментари", @@ -54,20 +54,20 @@ "Email newsletter": "Имейл бюлетин", "Email preferences": "Имейл настройки ", "Emails": "Имейли", - "Emails disabled": "Писмата са преустновени", + "Emails disabled": "Писмата са спрени", "Ends {{offerEndDate}}": "До {{offerEndDate}}", - "Enter your email address": "", - "Enter your name": "", + "Enter your email address": "Попълнете вашия имейл адрес", + "Enter your name": "Попълнете вашето име", "Error": "Грешка", "Expires {{expiryDate}}": "Изтича {{expiryDate}}", "Forever": "Завинаги", "Free Trial – Ends {{trialEnd}}": "Безплатен тест – до {{trialEnd}}", "Get help": "Получете помощ", "Get in touch for help": "Свържете се за помощ", - "Get notified when someone replies to your comment": "Бъдете уведомявани, ако някой отговори на Ваш коментар", + "Get notified when someone replies to your comment": "Бъдете уведомявани, ако някой отговори на ваш коментар", "Give feedback on this post": "Вашият отзив за публикацията", "Help! I'm not receiving emails": "Помощ! Не получавам имейли", - "Here are a few other sites you may enjoy.": "", + "Here are a few other sites you may enjoy.": "Други сайтове, които може да харесате.", "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "Ако даден информационен бюлетин бъде отбелязан като спам, имейлите за този адрес се деактивират автоматично, за да е сигурно, че няма да получавате нежелани съобщения.", "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "Ако оплакването за спам е било случайно или искате отново да започнете да получавате имейли, можете да активирате това, като кликнете върху бутона на предишния екран.", "If you cancel your subscription now, you will continue to have access until {{periodEnd}}.": "Ако отмените абонамента си сега, ще продължите да имате достъп до {{periodEnd}}.", @@ -77,34 +77,34 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Ако сте извършили всички тези проверки и все още не получавате имейли, можете да се свържете с поддръжката на {{supportAddress}}.", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "В случай че при опит за изпращане на бюлетин се получава някакъв постоянен проблем, имейлите ще бъдат деактивирани в акаунта.", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "Добавете {{senderEmail}} в списъка си с контакти. Това сигнализира на вашия доставчик, че имейлите, изпратени от този адрес са надеждни.", - "Invalid email address": "", - "Jamie Larson": "", - "jamie@example.com": "", + "Invalid email address": "Невалиден имейл адрес", + "Jamie Larson": "Ангел Петров", + "jamie@example.com": "petrov@example.com", "Less like this": "По-малко такива", - "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Уверете се, че имейлите не попадат случайно в папките Спам или Промоции на входящата ви поща. Ако това е така, щракнете върху \"Не е спам\" и/или \"Премести във входяща поща\".", + "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Уверете се, че имейлите не попадат случайно в папките за спам и промоции на входящата ви поща. Ако това е така, щракнете върху \"Не е спам\" и/или \"Премести във входяща поща\".", "Manage": "Управлявай", - "Maybe later": "", - "Memberships unavailable, contact the owner for access.": "", - "month": "", + "Maybe later": "Може би по-късно", + "Memberships unavailable, contact the owner for access.": "Няма възможност за абонамент, свържете се със собственика на сайта за достъп.", + "month": "месец", "Monthly": "Месечно", "More like this": "Повече такива", "Name": "Име", "Need more help? Contact support": "Още имате нужда от помощ? Потърсете поддръжката", "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "Информационните бюлетини могат да бъдат деактивирани в профила ви по две причини: Предишен имейл е бил маркиран като спам или опитът за изпращане на имейл е довел до траен неуспех (отказ).", "Not receiving emails?": "Не получавате поща?", - "Now check your email!": "Проверете си пощенската кутия!", + "Now check your email!": "Проверете имейла си!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "След като се абонирате отново, ако все още не виждате имейли във входящата си поща, проверете папката за спам. Някои доставчици пазят история с предишни оплаквания за спам и ще продължат да маркират имейлите. Ако вашият случай е такъв, маркирайте последния бюлетин като 'Не е спам', за да го преместите обратно в основната си пощенска кутия.", - "Permanent failure (bounce)": "Постоянен проблем (отскок)", - "Phone number": "", + "Permanent failure (bounce)": "Постоянен проблем (отказ)", + "Phone number": "Телефонен номер", "Plan": "План", "Plan checkout was cancelled.": "Плащането на плана е прекъснато.", "Plan upgrade was cancelled.": "Надграждането на плана е прекъснато.", - "Please contact {{supportAddress}} to adjust your complimentary subscription.": "", - "Please enter {{fieldName}}": "", + "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Моля, свържете се с {{supportAddress}}, за корекции относно безплатния ви абонамент.", + "Please enter {{fieldName}}": "Моля, попълнете {{fieldName}}", "Please fill in required fields": "Моля, попълнете задължителните полета", "Price": "Цена", "Re-enable emails": "Позволете отново изпращането на писма", - "Recommendations": "", + "Recommendations": "Препоръки", "Renews at {{price}}.": "Подновяване за {{price}}.", "Retry": "Отново", "Save": "Запиши", @@ -112,12 +112,12 @@ "Send an email to {{senderEmail}} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "Изпратете имейл до {{senderEmail}} за здрасти. Това също може да сигнализира на вашия доставчик на ел. поща, че на имейлите до и от този адрес може да се има доверие.", "Sending login link...": "Изпращане на връзка за влизане...", "Sending...": "Изпращане...", - "Show all": "", + "Show all": "Покажи всички", "Sign in": "Вход", "Sign out": "Изход", "Sign up": "Регистриране", "Signup error: Invalid link": "Грешка при влизане: Невалиден линк", - "Something went wrong, please try again later.": "", + "Something went wrong, please try again later.": "Нещо се обърка, опитайте отново.", "Sorry, that didn’t work.": "Жалко, така не става.", "Spam complaints": "Оплаквания от спам", "Start {{amount}}-day free trial": "Започване на {{amount}}-дневен безплатен достъп.", @@ -131,44 +131,44 @@ "Success! Your account is fully activated, you now have access to all content.": "Чудесно! Вашият акаунт е активиран и вече имате достъп до цялото съдържание.", "Success! Your email is updated.": "Чудесно! Вашият имейл е актуализиран.", "Successfully unsubscribed": "Успешно разабониране", - "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "", - "Thank you for your support": "", - "Thank you for your support!": "", - "Thanks for the feedback!": "Благодарим за изпратеният отзив!", - "That didn't go to plan": "Нещо се обърка и не се случи както трябваше", + "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "Благодарим ви за абонамента. Преди да започнете да четете, още няколко сайта, които може да ви харесат.", + "Thank you for your support": "Благодарности за подкрепата ви", + "Thank you for your support!": "Благодарности за подкрепата ви!", + "Thanks for the feedback!": "Благодарности за обратната връзка!", + "That didn't go to plan": "Нещо се обърка и не стана както трябваше", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Имейлът, който имаме за вас, е {{memberEmail}} - ако не е верен, можете да го актуализирате в областта за .", "There was a problem submitting your feedback. Please try again a little later.": "Имаше проблем при изпращането на обратната връзка. Моля, опитайте отново малко по-късно.", - "There was an error processing your payment. Please try again.": "", + "There was an error processing your payment. Please try again.": "Получи се грешка при обработката на вашето плащане. Моля, опитайте отново.", "This site is invite-only, contact the owner for access.": "Сайтът е само с покани. Свържете се със собственика за да получите достъп.", - "This site is not accepting payments at the moment.": "", + "This site is not accepting payments at the moment.": "В момента сайтът не приема плащания.", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "За да приключите регистрацията, последвайте препратката в съобщението, изпратено Ви по имейл. Ако не пристигне до 3 минути, проверете дали не е категоризирано като нежелано писмо.", - "To continue to stay up to date, subscribe to {{publication}} below.": "", + "To continue to stay up to date, subscribe to {{publication}} below.": "За да останете информирани, запишете се за {{publication}} по-долу.", "Try free for {{amount}} days, then {{originalPrice}}.": "Тествайте безплатно за {{amount}} дни, след това {{originalPrice}}.", "Unlock access to all newsletters by becoming a paid subscriber.": "Отключете достъпа до всички бюлетини, като станете платен абонат.", "Unsubscribe from all emails": "Прекрати изпращането на всякакви писма", "Unsubscribed": "Неабониран", - "Unsubscribed from all emails.": "", - "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "Спирането на изпращането на писма, няма да ти прекрати абонамента и регистрацията в {{title}}", + "Unsubscribed from all emails.": "Разабониране от всички имейли.", + "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "Спирането на изпращането на писма, не прекратява абонамента и регистрацията в {{title}}", "Update": "Обнови", - "Update your preferences": "Обнови твоите предпочитания/настройки", - "Verification link sent, check your inbox": "", + "Update your preferences": "Обнови твоите настройки", + "Verification link sent, check your inbox": "Изпратен ви е линк за проверка, проверете електронната си поща", "Verify your email address is correct": "Проверете дали имейл адресът ви е верен", "View plans": "Вижте плановете", "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "Този пощенски адрес който опитвате да разабонирате, изглежда невалиден. Моля, свържете се със собственика на сайта.", - "Welcome back, {{name}}!": "Добре дошли отново, {{name}}!", + "Welcome back, {{name}}!": "Здравейте отново, {{name}}!", "Welcome back!": "Добре дошли отново!", - "Welcome to {{siteTitle}}": "", + "Welcome to {{siteTitle}}": "Добре дошли в {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Когато дадена пощенска кутия не успее да приеме даден имейл, това обикновено се нарича отказ. В много случаи това е временно. В някои случаи обаче, имейлът може да се отхвърля постоянно, например когато имейл адресът е невалиден или не съществува.", "Why has my email been disabled?": "Защо имейлът ми е деактивиран?", - "year": "", + "year": "година", "Yearly": "Годишно", "You currently have a free membership, upgrade to a paid subscription for full access.": "В момента имате безплатно членство, преминете към платен абонамент за пълен достъп.", - "You have been successfully resubscribed": "Успешно беше подновен абонаментът", + "You have been successfully resubscribed": "Абонаментът ви беше успешно подновен", "You're currently not receiving emails": "Понастоящем не получавате имейли", "You're not receiving emails": "Не получавате имейли", - "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Не получавате писма защото или пощенският адрес е невалиден, или писмата се класифицират като нежелана поща.", + "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Не получавате писма, защото или пощенският адрес е невалиден, или писмата се класифицират като нежелана поща.", "You've successfully signed in.": "Влязохте успешно.", - "You've successfully subscribed to": "", + "You've successfully subscribed to": "Успешно се абонирахте за", "Your account": "Твоят профил", "Your input helps shape what gets published.": "Вашият принос помага да се оформи това, което се публикува.", "Your subscription will expire on {{expiryDate}}": "Абонаментът ви ще изтече на {{expiryDate}}", diff --git a/ghost/i18n/locales/bg/search.json b/ghost/i18n/locales/bg/search.json index 8902015528ff..7a641a6c3626 100644 --- a/ghost/i18n/locales/bg/search.json +++ b/ghost/i18n/locales/bg/search.json @@ -1,9 +1,9 @@ { - "Authors": "", - "Cancel": "", - "No matches found": "", - "Posts": "", - "Search posts, tags and authors": "", - "Show more results": "", - "Tags": "" + "Authors": "Автори", + "Cancel": "Отказ", + "No matches found": "Няма намерени резултати", + "Posts": "Публикации", + "Search posts, tags and authors": "Търсене в публикации, етикети и автори", + "Show more results": "Показване на още резултати", + "Tags": "Етикети" } diff --git a/ghost/i18n/locales/de-CH/comments.json b/ghost/i18n/locales/de-CH/comments.json index aca409c2797e..afe3056f6afa 100644 --- a/ghost/i18n/locales/de-CH/comments.json +++ b/ghost/i18n/locales/de-CH/comments.json @@ -1,5 +1,71 @@ { + "{{amount}} characters left": "", + "{{amount}} comments": "", + "{{amount}} days ago": "", + "{{amount}} hrs ago": "", + "{{amount}} mins ago": "", + "{{amount}} months ago": "", + "{{amount}} more": "", + "{{amount}} seconds ago": "", + "{{amount}} weeks ago": "", + "{{amount}} years ago": "", + "1 comment": "", + "Add comment": "", + "Add context to your comment, share your name and expertise to foster a healthy discussion.": "", + "Add reply": "", + "Already a member?": "", + "Anonymous": "", + "Become a member of {{publication}} to start commenting.": "", + "Become a paid member of {{publication}} to start commenting.": "", + "Cancel": "", + "Comment": "", + "Complete your profile": "", + "Delete": "", + "Deleted member": "", + "Discussion": "", + "Edit": "", + "Edit this comment": "", + "edited": "", + "Enter your name": "", + "Expertise": "", + "Founder @ Acme Inc": "", + "Full-time parent": "", + "Head of Marketing at Acme, Inc": "", + "Hide": "", + "Hide comment": "", + "Jamie Larson": "", + "Join the discussion": "", + "Just now": "", + "Local resident": "", + "Member discussion": "", + "Name": "", + "Neurosurgeon": "", + "One day ago": "", + "One hour ago": "", + "One min ago": "", + "One month ago": "", + "One week ago": "", + "One year ago": "", "Reply": "Antworten", + "Reply to comment": "", + "Report": "", + "Report comment": "", + "Report this comment?": "", + "Save": "", + "Sending": "", + "Sent": "", + "Show": "", + "Show {{amount}} more replies": "", "Show {{amount}} previous comments": "{{amount}} vorherige Kommentare anzeigen", - "Show 1 previous comment": "Einen vorherigen Kommentar anzeigen" + "Show 1 more reply": "", + "Show 1 previous comment": "Einen vorherigen Kommentar anzeigen", + "Show comment": "", + "Sign in": "", + "Sign up now": "", + "Start the conversation": "", + "This comment has been hidden.": "", + "This comment has been removed.": "", + "Upgrade now": "", + "Yesterday": "", + "Your request will be sent to the owner of this site.": "" } diff --git a/ghost/i18n/locales/de-CH/portal.json b/ghost/i18n/locales/de-CH/portal.json index 0945d0373faa..44e087a499e3 100644 --- a/ghost/i18n/locales/de-CH/portal.json +++ b/ghost/i18n/locales/de-CH/portal.json @@ -1,4 +1,5 @@ { + "(save {{highestYearlyDiscount}}%)": "", "{{amount}} days free": "{{amount}} Tage kostenfrei", "{{amount}} off": "{{amount}} Rabatt", "{{amount}} off for first {{number}} months.": "{{amount}} Rabatt für die ersten {{number}} Monate.", @@ -9,6 +10,7 @@ "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}} wird keine weiteren E-Mail-Benachrichtigungen für Kommentar-Antworten erhalten.", "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} wird diesen Newsletter nicht länger erhalten.", "{{trialDays}} days free": "{{trialDays}} Tage kostenfrei", + "+1 (123) 456-7890": "", "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Ein Login-Link wurde an Ihre E-Mail-Adresse gesendet. Falls die E-Mail nicht innerhalb von 3 Minuten ankommt, überprüfen Sie bitte den Spam-Ordner.", "Account": "Konto", "Account settings": "Konto-Einstellungen", @@ -23,10 +25,12 @@ "Cancel subscription": "Abonnement kündigen", "Cancellation reason": "Kündigungsgrund", "Change": "Ändern", + "Change plan": "", "Check spam & promotions folders": "Spam- und Werbeordner prüfen", "Check with your mail provider": "Erkundigen Sie sich bei Ihrem E-Mail-Anbieter", "Choose": "Auswählen", "Choose a different plan": "Wählen Sie einen anderen Tarif", + "Choose a plan": "", "Choose your newsletters": "Wählen Sie Ihren Newsletter", "Click here to retry": "Hier klicken zum Wiederholen", "Close": "Schliessen", @@ -48,11 +52,12 @@ "Edit": "Bearbeiten", "Email": "E-Mail", "Email newsletter": "E-Mail-Newsletter", - "Email preference updated.": "E-Mail-Einstellungen aktualisiert.", "Email preferences": "E-Mail-Einstellungen", "Emails": "E-Mails", "Emails disabled": "E-Mails deaktiviert", "Ends {{offerEndDate}}": "Endet am {{offerEndDate}}", + "Enter your email address": "", + "Enter your name": "", "Error": "Fehler", "Expires {{expiryDate}}": "Läuft am {{expiryDate}} ab", "Forever": "Für immer", @@ -62,6 +67,7 @@ "Get notified when someone replies to your comment": "Erhalten Sie eine Benachrichtigung, wenn jemand auf Ihren Kommentar antwortet", "Give feedback on this post": "Zu diesem Kommentar Feedback geben", "Help! I'm not receiving emails": "Hilfe! Ich erhalte keine E-Mails", + "Here are a few other sites you may enjoy.": "", "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "Wenn ein Newsletter als Spam markiert wird, werden E-Mails für diese Adresse automatisch deaktiviert, um sicherzustellen, dass Sie keine unerwünschten Nachrichten mehr erhalten.", "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "Wenn die Spam-Beschwerde versehentlich war oder Sie wieder E-Mails erhalten möchten, können Sie sich durch Klicken auf den Button auf dem vorherigen Bildschirm erneut für E-Mails anmelden.", "If you cancel your subscription now, you will continue to have access until {{periodEnd}}.": "Wenn Sie Ihr Abo jetzt kündigen, haben Sie noch Zugang bis zum {{periodEnd}}.", @@ -71,10 +77,15 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Wenn Sie all diese Punkte erledigt haben und immer noch keine E-Mails erhalten, wenden Sie sich bitte an {{supportAddress}}.", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "Im Falle eines dauerhaften Fehlers beim Versuch, einen Newsletter zu senden, werden E-Mails auf dem Konto deaktiviert.", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "Fügen Sie {{senderEmail}} in Ihrem E-Mail-Client zu Ihren Kontakten hinzu. So signalisieren Sie Ihrem Mail-Anbieter, dass E-Mails von dieser Adresse vertrauenswürdig sind.", + "Invalid email address": "", + "Jamie Larson": "", + "jamie@example.com": "", "Less like this": "Weniger davon", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Stellen Sie sicher, dass E-Mails nicht unbeabsichtigt im Spam-Ordner. Wenn das der Fall sein sollte, klicken Sie auf \"Kein Spam\" und/oder \"In den Posteingang bewegen\".", "Manage": "Verwalten", + "Maybe later": "", "Memberships unavailable, contact the owner for access.": "Keine Abonnements verfügbar, bitte wenden Sie sich an {{supportAddress}}, um für einen Zugang anzufragen.", + "month": "", "Monthly": "Monatlich", "More like this": "Mehr davon", "Name": "Name", @@ -84,13 +95,16 @@ "Now check your email!": "Überprüfen Sie bitte Ihren Posteingang.", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Wenn Sie nach Ihrer Registrierung keine E-Mail von uns im Posteingang haben, überprüfen Sie Ihren Spam-Ordner. Einige E-Mail-Anbieter speichern frühere Spam-Beschwerden und kennzeichnen E-Mails weiterhin. Für diesen Fall markieren Sie den neusten Newsletter als \"Kein Spam\", um ihn in Ihren Posteingang zu verschieben.", "Permanent failure (bounce)": "Permanenter Fehler (Bounce)", + "Phone number": "", "Plan": "Abo", "Plan checkout was cancelled.": "Der Abschluss des Abos wurde abgebrochen.", "Plan upgrade was cancelled.": "Das Upgrade Ihres Abos wurde abgebrochen.", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Bitte kontaktieren Sie {{supportAddress}} für den Abschluss eines zusätzlichen Abos.", + "Please enter {{fieldName}}": "", "Please fill in required fields": "Bitte alle Pflichtfelder ausfüllen.", "Price": "Preis", "Re-enable emails": "E-Mails wieder aktivieren", + "Recommendations": "", "Renews at {{price}}.": "Wird verlängert zum Preis von {{price}}.", "Retry": "Nochmals versuchen", "Save": "Speichern", @@ -98,10 +112,12 @@ "Send an email to {{senderEmail}} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "Schicken Sie uns ein E-Mail an {{senderEmail}} und sagen Sie Hallo. Das kann auch dazu beitragen, Ihrem E-Mail-Anbieter zu signalisieren, dass E-Mails an und von dieser Adresse vertrauenswürdig sind.", "Sending login link...": "Login-Link wird gesendet…", "Sending...": "Wird gesendet…", + "Show all": "", "Sign in": "Einloggen", "Sign out": "Abmelden", "Sign up": "Registrieren", "Signup error: Invalid link": "Fehler bei der Registrierung: Ungültiger Link.", + "Something went wrong, please try again later.": "", "Sorry, that didn’t work.": "Entschuldigen Sie, das hat leider nicht funktioniert.", "Spam complaints": "Spam-Beschwerden", "Start {{amount}}-day free trial": "Starten Sie Ihr kostenloses Probeabo für {{amount}} Tage.", @@ -115,26 +131,36 @@ "Success! Your account is fully activated, you now have access to all content.": "Geschafft! Ihr Konto ist nun vollständig eingerichtet und Ihr Zugang zu allen Inhalten freigeschaltet.", "Success! Your email is updated.": "Ihre E-Mail-Adresse wurde erfolgreich aktualisiert.", "Successfully unsubscribed": "Erfolgreich abgemeldet", + "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "", + "Thank you for your support": "", + "Thank you for your support!": "", "Thanks for the feedback!": "Danke für das Feedback!", "That didn't go to plan": "Entschuldigung, da ist etwas schief gelaufen.", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Die E-Mail-Adresse, die wir von dir haben, lautet {{memberEmail}} - wenn Sie diese ändern möchten, können Sie das in den tun.", "There was a problem submitting your feedback. Please try again a little later.": "Bei der Übermittlung Ihres Feedbacks ist ein Problem aufgetreten. Bitte versuchen Sie es später nochmal.", + "There was an error processing your payment. Please try again.": "", "This site is invite-only, contact the owner for access.": "Der Zugang zu diesem Inhalt ist eingeschränkt. Bitte kontaktieren Sie uns, wenn Sie Zugang wünschen.", + "This site is not accepting payments at the moment.": "", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Um Ihre Registrierung abzuschliessen, klicken Sie auf den Bestätigungslink in dem Email, das wir Ihnen gesendet haben. Falls Sie nach drei Minuten noch keine E-Mail erhalten haben, überprüfen Sie bitte Ihren Spam-Ordner.", + "To continue to stay up to date, subscribe to {{publication}} below.": "", "Try free for {{amount}} days, then {{originalPrice}}.": "Probieren Sie uns für {{amount}} Tage kostenlos aus. Danach folgt ein Abo zum Preis von {{originalPrice}}.", "Unlock access to all newsletters by becoming a paid subscriber.": "Schalten Sie mit einem Abo den Zugang zu allen Newslettern frei.", "Unsubscribe from all emails": "Von allen E-Mails abmelden", "Unsubscribed": "Abgemeldet", + "Unsubscribed from all emails.": "", "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "Wenn du dich von diesen E-Mails abmeldest, bleibt Ihr bezahltes Abo bestehen. Falls Sie Ihr Abo kündigen möchten, tun Sie das bitte separat.", "Update": "Aktualisieren", "Update your preferences": "Einstellungen aktualisieren", + "Verification link sent, check your inbox": "", "Verify your email address is correct": "Überprüfen Sie bitte, ob Ihre E-Mail-Adresse korrekt ist.", "View plans": "Tarife ansehen", "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "Da ist etwas schief gelaufen, wir konnten Sie nicht abmelden. Bitte kontaktieren Sie {{supportAddress}}.", "Welcome back, {{name}}!": "Willkommen zurück, {{name}}!", "Welcome back!": "Willkommen zurück!", + "Welcome to {{siteTitle}}": "", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Wenn ein Posteingang ein E-Mail nicht annimmt, spricht man von einem Bounce. Das ist häufig ein vorübergehendes Problem (Soft Bounce). In einigen Fällen kann ein E-Mail jedoch dauerhaft abgewiesen werden, etwa wenn eine E-Mail-Adresse ungültig oder nicht vorhanden ist (Hard Bounce).", "Why has my email been disabled?": "Warum wurde mein E-Mail deaktiviert?", + "year": "", "Yearly": "Jährlich", "You currently have a free membership, upgrade to a paid subscription for full access.": "Sie haben ein kostenloses Abo. Wechseln Sie bitte auf ein Bezahl-Abo, um vollen Zugang zu erhalten.", "You have been successfully resubscribed": "Sie haben Ihr Abo erfolgreich erneuert.", @@ -142,6 +168,7 @@ "You're not receiving emails": "Sie erhalten keine E-Mails.", "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Sie erhalten keine E-Mails, weil Sie entweder eine kürzlich empfangene E-Mail von uns als Spam markiert haben oder weil unsere E-Mails nicht an die angegebene E-Mail-Adresse zugestellt werden konnten.", "You've successfully signed in.": "Sie haben sich erfolgreich angemeldet.", + "You've successfully subscribed to": "", "Your account": "Ihr Konto", "Your input helps shape what gets published.": "Ihr Beitrag kann unsere Berichterstattung beeinflussen und mitprägen.", "Your subscription will expire on {{expiryDate}}": "Ihr Abo endet am {{expiryDate}}.", diff --git a/ghost/i18n/locales/de-CH/search.json b/ghost/i18n/locales/de-CH/search.json new file mode 100644 index 000000000000..8902015528ff --- /dev/null +++ b/ghost/i18n/locales/de-CH/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "", + "Cancel": "", + "No matches found": "", + "Posts": "", + "Search posts, tags and authors": "", + "Show more results": "", + "Tags": "" +} diff --git a/ghost/i18n/locales/el/comments.json b/ghost/i18n/locales/el/comments.json index fd6d9d9caaf4..2d13668b57db 100644 --- a/ghost/i18n/locales/el/comments.json +++ b/ghost/i18n/locales/el/comments.json @@ -2,8 +2,8 @@ "{{amount}} characters left": "Απομένουν {{amount}} χαρακτήρες", "{{amount}} comments": "{{amount}} σχόλια", "{{amount}} days ago": "πριν από {{amount}} ημέρες", - "{{amount}} hours ago": "πριν από {{amount}} ώρες", - "{{amount}} minutes ago": "πριν από {{amount}} λεπτά", + "{{amount}} hrs ago": "πριν από {{amount}} ώρες", + "{{amount}} mins ago": "πριν από {{amount}} λεπτά", "{{amount}} months ago": "πριν από {{amount}} μήνες", "{{amount}} more": "{{amount}} περισσότερα", "{{amount}} seconds ago": "πριν από {{amount}} δευτερόλεπτα", @@ -25,7 +25,7 @@ "Discussion": "Συζήτηση", "Edit": "Επεξεργασία", "Edit this comment": "Επεξεργασία αυτού του σχολίου", - "Edited": "Επεξεργασμένο", + "edited": "Επεξεργασμένο", "Enter your name": "Εισάγετε το όνομά σας", "Expertise": "Εξειδίκευση", "Founder @ Acme Inc": "Ιδρυτής @ Acme Inc", @@ -42,7 +42,7 @@ "Neurosurgeon": "Νευροχειρουργός", "One day ago": "Πριν από μία ημέρα", "One hour ago": "Πριν από μία ώρα", - "One minute ago": "Πριν από ένα λεπτό", + "One min ago": "Πριν από ένα λεπτό", "One month ago": "Πριν από ένα μήνα", "One week ago": "Πριν από μία εβδομάδα", "One year ago": "Πριν από ένα χρόνο", @@ -50,7 +50,6 @@ "Reply to comment": "Απάντηση στο σχόλιο", "Report": "Αναφορά", "Report comment": "Αναφορά σχολίου", - "Report this comment": "Αναφορά αυτού του σχολίου", "Report this comment?": "Αναφορά αυτού του σχολίου;", "Save": "Αποθήκευση", "Sending": "Αποστολή", @@ -68,6 +67,5 @@ "This comment has been removed.": "Αυτό το σχόλιο έχει αφαιρεθεί.", "Upgrade now": "Αναβάθμιση τώρα", "Yesterday": "Χθες", - "You want to report this comment?": "Θέλετε να αναφέρετε αυτό το σχόλιο;", "Your request will be sent to the owner of this site.": "Το αίτημά σας θα σταλεί στον ιδιοκτήτη αυτού του ιστότοπου." } diff --git a/ghost/i18n/locales/el/portal.json b/ghost/i18n/locales/el/portal.json index 80df3874c6d8..0d4e62ed8ba3 100644 --- a/ghost/i18n/locales/el/portal.json +++ b/ghost/i18n/locales/el/portal.json @@ -10,6 +10,7 @@ "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "Το {{memberEmail}} δεν θα λαμβάνει πλέον email όταν κάποιος απαντά στα σχόλιά σας.", "{{memberEmail}} will no longer receive this newsletter.": "Το {{memberEmail}} δεν θα λαμβάνει πλέον αυτό το ενημερωτικό δελτίο.", "{{trialDays}} days free": "{{trialDays}} ημέρες δωρεάν", + "+1 (123) 456-7890": "", "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Ένας σύνδεσμος σύνδεσης έχει σταλεί στα εισερχόμενά σας. Αν δεν φτάσει σε 3 λεπτά, ελέγξτε τον φάκελο ανεπιθύμητης αλληλογραφίας σας.", "Account": "Λογαριασμός", "Account settings": "Ρυθμίσεις λογαριασμού", @@ -24,10 +25,12 @@ "Cancel subscription": "Ακύρωση συνδρομής", "Cancellation reason": "Λόγος ακύρωσης", "Change": "Αλλαγή", + "Change plan": "", "Check spam & promotions folders": "Ελέγξτε τους φακέλους ανεπιθύμητης αλληλογραφίας και προσφορών", "Check with your mail provider": "Ελέγξτε με τον παροχέα email σας", "Choose": "Επιλέξτε", "Choose a different plan": "Επιλέξτε ένα διαφορετικό πρόγραμμα", + "Choose a plan": "", "Choose your newsletters": "Επιλέξτε τα ενημερωτικά δελτία σας", "Click here to retry": "Κάντε κλικ εδώ για επανάληψη", "Close": "Κλείσιμο", @@ -53,6 +56,8 @@ "Emails": "Emails", "Emails disabled": "Τα emails είναι απενεργοποιημένα", "Ends {{offerEndDate}}": "Λήγει {{offerEndDate}}", + "Enter your email address": "", + "Enter your name": "", "Error": "Σφάλμα", "Expires {{expiryDate}}": "Λήγει {{expiryDate}}", "Forever": "Για πάντα", @@ -72,11 +77,15 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Αν έχετε ολοκληρώσει όλους αυτούς τους ελέγχους και εξακολουθείτε να μην λαμβάνετε emails, μπορείτε να επικοινωνήσετε με την υποστήριξη επικοινωνώντας με {{supportAddress}}.", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "Σε περίπτωση που ληφθεί μόνιμη αποτυχία κατά την αποστολή ενός ενημερωτικού δελτίου, τα emails θα απενεργοποιηθούν στον λογαριασμό.", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "Στον πελάτη email σας προσθέστε το {{senderEmail}} στη λίστα επαφών σας. Αυτό σηματοδοτεί στον πάροχο email σας ότι τα emails που αποστέλλονται από αυτήν τη διεύθυνση πρέπει να είναι αξιόπιστα.", + "Invalid email address": "", + "Jamie Larson": "", + "jamie@example.com": "", "Less like this": "Λιγότερο σαν αυτό", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Βεβαιωθείτε ότι τα emails δεν καταλήγουν κατά λάθος στους φακέλους Ανεπιθύμητη αλληλογραφία ή Προσφορές των εισερχομένων σας. Αν είναι εκεί, κάντε κλικ στο \"Σήμανση ως μη ανεπιθύμητη αλληλογραφία\" και/ή \"Μεταφορά στα εισερχόμενα\".", "Manage": "Διαχείριση", "Maybe later": "Ίσως αργότερα", "Memberships unavailable, contact the owner for access.": "Τα μέλη δεν είναι διαθέσιμα, επικοινωνήστε με τον ιδιοκτήτη για πρόσβαση.", + "month": "", "Monthly": "Μηνιαία", "More like this": "Περισσότερα σαν αυτό", "Name": "Όνομα", @@ -86,10 +95,12 @@ "Now check your email!": "Τώρα ελέγξτε το email σας!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Μόλις εγγραφείτε ξανά, αν εξακολουθείτε να μην βλέπετε emails στα εισερχόμενά σας, ελέγξτε τον φάκελο ανεπιθύμητης αλληλογραφίας. Ορισμένοι πάροχοι εισερχομένων διατηρούν αρχείο προηγούμενων αναφορών ανεπιθύμητης αλληλογραφίας και θα συνεχίσουν να επισημαίνουν emails. Αν συμβεί αυτό, επισημάνετε το τελευταίο ενημερωτικό δελτίο ως 'Μη ανεπιθύμητο' για να το μετακινήσετε ξανά στα κύρια εισερχόμενά σας.", "Permanent failure (bounce)": "Μόνιμη αποτυχία (αναπήδηση)", + "Phone number": "", "Plan": "Πρόγραμμα", "Plan checkout was cancelled.": "Η πληρωμή του προγράμματος ακυρώθηκε.", "Plan upgrade was cancelled.": "Η αναβάθμιση του προγράμματος ακυρώθηκε.", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Επικοινωνήστε με το {{supportAddress}} για να προσαρμόσετε τη δωρεάν συνδρομή σας.", + "Please enter {{fieldName}}": "", "Please fill in required fields": "Συμπληρώστε τα απαιτούμενα πεδία", "Price": "Τιμή", "Re-enable emails": "Ενεργοποιήστε ξανά τα emails", @@ -106,6 +117,7 @@ "Sign out": "Αποσύνδεση", "Sign up": "Εγγραφή", "Signup error: Invalid link": "Σφάλμα εγγραφής: Μη έγκυρος σύνδεσμος", + "Something went wrong, please try again later.": "", "Sorry, that didn’t work.": "Συγγνώμη, αυτό δεν λειτούργησε.", "Spam complaints": "Αναφορές ανεπιθύμητης αλληλογραφίας", "Start {{amount}}-day free trial": "Ξεκινήστε {{amount}}-ημερών δωρεάν δοκιμή", @@ -120,12 +132,17 @@ "Success! Your email is updated.": "Επιτυχία! Το email σας ενημερώθηκε.", "Successfully unsubscribed": "Επιτυχής διαγραφή από τη λίστα", "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "Ευχαριστούμε που εγγραφήκατε. Πριν ξεκινήσετε να διαβάζετε, εδώ είναι μερικοί άλλοι ιστότοποι που μπορεί να σας αρέσουν.", + "Thank you for your support": "", + "Thank you for your support!": "", "Thanks for the feedback!": "Ευχαριστούμε για το σχόλιο!", "That didn't go to plan": "Αυτό δεν πήγε σύμφωνα με το σχέδιο", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Η διεύθυνση email που έχουμε για εσάς είναι {{memberEmail}} — αν δεν είναι σωστή, μπορείτε να την ενημερώσετε στην .", "There was a problem submitting your feedback. Please try again a little later.": "Παρουσιάστηκε πρόβλημα κατά την υποβολή των σχολίων σας. Δοκιμάστε ξανά αργότερα.", + "There was an error processing your payment. Please try again.": "", "This site is invite-only, contact the owner for access.": "Αυτός ο ιστότοπος είναι μόνο με πρόσκληση, επικοινωνήστε με τον ιδιοκτήτη για πρόσβαση.", + "This site is not accepting payments at the moment.": "", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Για να ολοκληρώσετε την εγγραφή, κάντε κλικ στον σύνδεσμο επιβεβαίωσης στα εισερχόμενά σας. Αν δεν φτάσει εντός 3 λεπτών, ελέγξτε τον φάκελο ανεπιθύμητης αλληλογραφίας!", + "To continue to stay up to date, subscribe to {{publication}} below.": "", "Try free for {{amount}} days, then {{originalPrice}}.": "Δοκιμάστε δωρεάν για {{amount}} ημέρες, μετά {{originalPrice}}.", "Unlock access to all newsletters by becoming a paid subscriber.": "Ξεκλειδώστε την πρόσβαση σε όλα τα ενημερωτικά δελτία, ενεργοποιόντας την premium συνδρομή.", "Unsubscribe from all emails": "Διαγραφή από όλα τα emails", @@ -143,6 +160,7 @@ "Welcome to {{siteTitle}}": "Καλώς ήρθατε στο {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Όταν τα εισερχόμενα αποτυγχάνουν να αποδεχθούν ένα email, συνήθως ονομάζεται αναπήδηση. Σε πολλές περιπτώσεις, αυτό μπορεί να είναι προσωρινό. Ωστόσο, σε ορισμένες περιπτώσεις, ένα αναπηδήμένο email μπορεί να επιστραφεί ως μόνιμη αποτυχία όταν μια διεύθυνση email είναι άκυρη ή ανύπαρκτη.", "Why has my email been disabled?": "Γιατί έχει απενεργοποιηθεί το email μου;", + "year": "", "Yearly": "Ετήσια", "You currently have a free membership, upgrade to a paid subscription for full access.": "Αυτή τη στιγμή έχετε δωρεάν μέλος, αναβαθμίστε σε premium συνδρομή για πλήρη πρόσβαση.", "You have been successfully resubscribed": "Έχετε εγγραφεί ξανά με επιτυχία", diff --git a/ghost/i18n/locales/el/search.json b/ghost/i18n/locales/el/search.json new file mode 100644 index 000000000000..8902015528ff --- /dev/null +++ b/ghost/i18n/locales/el/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "", + "Cancel": "", + "No matches found": "", + "Posts": "", + "Search posts, tags and authors": "", + "Show more results": "", + "Tags": "" +} diff --git a/ghost/i18n/locales/es/signup-form.json b/ghost/i18n/locales/es/signup-form.json index f4bbf95206a3..0aa8c1652cd5 100644 --- a/ghost/i18n/locales/es/signup-form.json +++ b/ghost/i18n/locales/es/signup-form.json @@ -4,6 +4,6 @@ "Please enter a valid email address": "Por favor, ingresa una dirección de email válida", "Something went wrong, please try again.": "Algo salió mal, por favor intenta nuevamente.", "Subscribe": "Suscribirse", - "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Para completar el registro, haz clic en el link en tu bandeja de entrada. Si no llega en los siguientes 3 minutos, ¡revisa tu carpeta de spam!", + "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Para completar el registro, haz clic en el link en tu bandeja de entrada. Si no llega en los siguientes 3 minutos, ¡Revisa tu carpeta de spam!", "Your email address": "Tu dirección de correo electrónico" } diff --git a/ghost/i18n/locales/et/comments.json b/ghost/i18n/locales/et/comments.json new file mode 100644 index 000000000000..c9b9d3471d55 --- /dev/null +++ b/ghost/i18n/locales/et/comments.json @@ -0,0 +1,71 @@ +{ + "{{amount}} characters left": "{{amount}} tähemärki jäänud", + "{{amount}} comments": "{{amount}} kommentaari", + "{{amount}} days ago": "{{amount}} päeva tagasi", + "{{amount}} hrs ago": "{{amount}} tundi tagasi", + "{{amount}} mins ago": "{{amount}} minutit tagasi", + "{{amount}} months ago": "{{amount}} kuud tagasi", + "{{amount}} more": "{{amount}} veel", + "{{amount}} seconds ago": "{{amount}} sekundit tagasi", + "{{amount}} weeks ago": "{{amount}} nädalat tagasi", + "{{amount}} years ago": "{{amount}} aastat tagasi", + "1 comment": "1 kommentaar", + "Add comment": "Lisa kommentaar", + "Add context to your comment, share your name and expertise to foster a healthy discussion.": "Lisa oma kommentaarile konteksti, jaga oma nime ja kogemusi, et soodustada tervislikku arutelu.", + "Add reply": "Lisa vastus", + "Already a member?": "Juba liige?", + "Anonymous": "Anonüümne", + "Become a member of {{publication}} to start commenting.": "Kommenteerimise alustamiseks saage {{publication}} liikmeks.", + "Become a paid member of {{publication}} to start commenting.": "Kommenteerimise alustamiseks saage {{publication}} tasuliseks liikmeks.", + "Cancel": "Tühista", + "Comment": "Kommentaar", + "Complete your profile": "Täida oma profiil", + "Delete": "Kustuta", + "Deleted member": "Kustutatud liige", + "Discussion": "Arutelu", + "Edit": "Muuda", + "Edit this comment": "Muuda seda kommentaari", + "edited": "muudetud", + "Enter your name": "Sisesta oma nimi", + "Expertise": "Oskused", + "Founder @ Acme Inc": "Asutaja @ Acme Inc", + "Full-time parent": "Täiskohaga lapsevanem", + "Head of Marketing at Acme, Inc": "Turundusjuht Acme, Inc-s", + "Hide": "Peida", + "Hide comment": "Peida kommentaar", + "Jamie Larson": "Jamie Larson", + "Join the discussion": "Liitu aruteluga", + "Just now": "Just praegu", + "Local resident": "Kohalik elanik", + "Member discussion": "Liikmete arutelu", + "Name": "Nimi", + "Neurosurgeon": "Neurokirurg", + "One day ago": "Üks päev tagasi", + "One hour ago": "Üks tund tagasi", + "One min ago": "Üks minut tagasi", + "One month ago": "Üks kuu tagasi", + "One week ago": "Üks nädal tagasi", + "One year ago": "Üks aasta tagasi", + "Reply": "Vasta", + "Reply to comment": "Vasta kommentaarile", + "Report": "Teata", + "Report comment": "Teata kommentaarist", + "Report this comment?": "Teatada sellest kommentaarist?", + "Save": "Salvesta", + "Sending": "Saatmine", + "Sent": "Saadetud", + "Show": "Näita", + "Show {{amount}} more replies": "Näita {{amount}} vastust veel", + "Show {{amount}} previous comments": "Näita {{amount}} eelmist kommentaari", + "Show 1 more reply": "Näita 1 vastus veel", + "Show 1 previous comment": "Näita eelmist kommentaari", + "Show comment": "Näita kommentaari", + "Sign in": "Logi sisse", + "Sign up now": "Registreeru nüüd", + "Start the conversation": "Alusta vestlust", + "This comment has been hidden.": "See kommentaar on peidetud.", + "This comment has been removed.": "See kommentaar on eemaldatud.", + "Upgrade now": "Uuenda nüüd", + "Yesterday": "Eile", + "Your request will be sent to the owner of this site.": "Teie taotlus saadetakse selle saidi omanikule." +} diff --git a/ghost/i18n/locales/et/ghost.json b/ghost/i18n/locales/et/ghost.json new file mode 100644 index 000000000000..26834390f151 --- /dev/null +++ b/ghost/i18n/locales/et/ghost.json @@ -0,0 +1,34 @@ +{ + "All the best!": "Kõike head!", + "Complete signup for {{siteTitle}}!": "Vii lõpule {{siteTitle}} lehel registreerumine!", + "Complete your sign up to {{siteTitle}}!": "Vii lõpule {{siteTitle}} lehel oma registreerumine!", + "Confirm email address": "Kinnita e-posti aadress", + "Confirm signup": "Kinnita registreerimine", + "Confirm your email address": "Kinnita oma e-posti aadress", + "Confirm your email update for {{siteTitle}}!": "Kinnita oma e-posti aadressi uuendus {{siteTitle}} jaoks!", + "Confirm your subscription to {{siteTitle}}": "Kinnita oma {{siteTitle}} tellimus", + "For your security, the link will expire in 24 hours time.": "Teie turvalisuse huvides aegub link 24 tunni pärast.", + "Hey there,": "Tere,", + "Hey there!": "Tere!", + "If you did not make this request, you can safely ignore this email.": "Kui sa ei teinud seda päringut, võid seda e-kirja julgelt ignoreerida.", + "If you did not make this request, you can simply delete this message.": "Kui sa ei teinud seda päringut, võid selle sõnumi lihtsalt ära kustutada.", + "Please confirm your email address with this link:": "Palun kinnita oma e-posti aadress selle lingiga:", + "Secure sign in link for {{siteTitle}}": "Turvaline sisselogimislink {{siteTitle}} lehele", + "See you soon!": "Kohtumiseni!", + "Sent to {{email}}": "Saadetud aadressile {{email}}", + "Sign in": "Logi sisse", + "Sign in to {{siteTitle}}": "Logi sisse {{siteTitle}} lehele", + "Tap the link below to complete the signup process for {{siteTitle}}, and be automatically signed in:": "Vajuta alloleval lingil, et lõpetada {{siteTitle}} registreerimisprotsess ja et automaatselt sisse logida:", + "Thank you for signing up to {{siteTitle}}!": "Aitäh, et registreerusid {{siteTitle}} kasutajaks!", + "Thank you for subscribing to {{siteTitle}}!": "Aitäh, et hakkasid {{siteTitle}} jälgijaks!", + "Thank you for subscribing to {{siteTitle}}.": "Aitäh, et hakkasid {{siteTitle}} jälgijaks.", + "Thank you for subscribing to {{siteTitle}}. Tap the link below to be automatically signed in:": "Aitäh, et hakkasid {{siteTitle}} jälgijaks. Vajuta alloleval lingil, et automaatselt sisse logida:", + "This email address will not be used.": "Seda e-posti aadressi ei kasutata.", + "Welcome back to {{siteTitle}}!": "Tere tulemast tagasi {{siteTitle}} lehele!", + "Welcome back! Use this link to securely sign in to your {{siteTitle}} account:": "Tere tulemast tagasi! Kasuta seda linki, et turvaliselt oma {{siteTitle}} kontole sisse logida:", + "You can also copy & paste this URL into your browser:": "Võid ka kopeerida ja kleepida selle URL-i oma brauserisse:", + "You will not be signed up, and no account will be created for you.": "Sind ei registreerita ja sulle ei looda kontot.", + "You will not be subscribed.": "Sind ei lisata jälgijate hulka.", + "You're one tap away from subscribing to {{siteTitle}} — please confirm your email address with this link:": "Oled vaid ühe klõpsu kaugusel {{siteTitle}} jälgijaks hakkamisest — palun kinnita oma e-posti aadress selle lingiga:", + "You're one tap away from subscribing to {{siteTitle}}!": "Oled vaid ühe klõpsu kaugusel {{siteTitle}} jälgijaks hakkamisest!" +} diff --git a/ghost/i18n/locales/et/portal.json b/ghost/i18n/locales/et/portal.json new file mode 100644 index 000000000000..ae488495a29d --- /dev/null +++ b/ghost/i18n/locales/et/portal.json @@ -0,0 +1,177 @@ +{ + "(save {{highestYearlyDiscount}}%)": "(säästa {{highestYearlyDiscount}}%)", + "{{amount}} days free": "{{amount}} päeva tasuta", + "{{amount}} off": "{{amount}} soodustust", + "{{amount}} off for first {{number}} months.": "{{amount}} soodustust esimeseks {{number}} kuuks.", + "{{amount}} off for first {{period}}.": "{{amount}} soodustust esimeseks {{period}}ks.", + "{{amount}} off forever.": "{{amount}} soodustust igaveseks.", + "{{discount}}% discount": "{{discount}}% allahindlus", + "{{memberEmail}} will no longer receive {{newsletterName}} newsletter.": "{{memberEmail}} ei saa enam {{newsletterName}} uudiskirja.", + "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}} ei saa enam e-kirju, kui keegi vastab teie kommentaaridele.", + "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} ei saa enam seda uudiskirja.", + "{{trialDays}} days free": "{{trialDays}} päeva tasuta", + "+1 (123) 456-7890": "+1 (123) 456-7890", + "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Sisselogimislink on saadetud teie postkasti. Kui see ei saabu 3 minuti jooksul, kontrollige kindlasti oma rämpsposti kausta.", + "Account": "Konto", + "Account settings": "Konto seaded", + "After a free trial ends, you will be charged the regular price for the tier you've chosen. You can always cancel before then.": "Pärast tasuta prooviversiooni lõppu võetakse teilt tasu valitud taseme tavahinna eest. Saate alati enne seda tühistada.", + "Already a member?": "Juba liige?", + "An unexpected error occured. Please try again or contact support if the error persists.": "Tekkis ootamatu viga. Palun proovige uuesti või võtke ühendust toega, kui viga püsib.", + "Back": "Tagasi", + "Back to Log in": "Tagasi sisselogimise juurde", + "Billing info": "Arveldusinfo", + "Black Friday": "Must Reede", + "Cancel anytime.": "Tühistage igal ajal.", + "Cancel subscription": "Tühista tellimus", + "Cancellation reason": "Tühistamise põhjus", + "Change": "Muuda", + "Change plan": "Muuda paketti", + "Check spam & promotions folders": "Kontrollige rämpsposti ja reklaamide kaustu", + "Check with your mail provider": "Kontrollige oma e-posti teenusepakkujaga", + "Choose": "Vali", + "Choose a different plan": "Vali teine pakett", + "Choose a plan": "Vali pakett", + "Choose your newsletters": "Vali oma uudiskirjad", + "Click here to retry": "Klõpsake siia, et uuesti proovida", + "Close": "Sulge", + "Comments": "Kommentaarid", + "Complimentary": "Tasuta", + "Confirm": "Kinnita", + "Confirm cancellation": "Kinnita tühistamine", + "Confirm subscription": "Kinnita tellimus", + "Contact support": "Võta ühendust toega", + "Continue": "Jätka", + "Continue subscription": "Jätka tellimust", + "Could not sign in. Login link expired.": "Ei saanud sisse logida. Sisselogimislink on aegunud.", + "Could not update email! Invalid link.": "E-posti ei saanud uuendada! Vigane link.", + "Create a new contact": "Loo uus kontakt", + "Current plan": "Praegune pakett", + "Delete account": "Kustuta konto", + "Didn't mean to do this? Manage your preferences .": "Ei soovinud seda teha? Halda oma eelistusi .", + "Don't have an account?": "Pole kontot?", + "Edit": "Muuda", + "Email": "E-post", + "Email newsletter": "E-posti uudiskiri", + "Email preferences": "E-posti eelistused", + "Emails": "E-kirjad", + "Emails disabled": "E-kirjad keelatud", + "Ends {{offerEndDate}}": "Lõpeb {{offerEndDate}}", + "Enter your email address": "Sisestage oma e-posti aadress", + "Enter your name": "Sisestage oma nimi", + "Error": "Viga", + "Expires {{expiryDate}}": "Aegub {{expiryDate}}", + "Forever": "Igavesti", + "Free Trial – Ends {{trialEnd}}": "Tasuta prooviversioon – Lõpeb {{trialEnd}}", + "Get help": "Hangi abi", + "Get in touch for help": "Võta ühendust abi saamiseks", + "Get notified when someone replies to your comment": "Saa teavitus, kui keegi vastab sinu kommentaarile", + "Give feedback on this post": "Anna tagasisidet sellele postitusele", + "Help! I'm not receiving emails": "Aidake! Ma ei saa e-kirju", + "Here are a few other sites you may enjoy.": "Siin on mõned teised saidid, mis võiksid teile meeldida.", + "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "Kui uudiskiri märgitakse rämpspostiks, keelatakse sellele aadressile automaatselt e-kirjad, et te ei saaks enam soovimatuid sõnumeid.", + "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "Kui rämpspostiteatamise kaebus oli juhuslik või soovite uuesti e-kirju saada, saate e-kirjade tellimuse uuesti tellida, klõpsates eelmisel ekraanil olevat nuppu.", + "If you cancel your subscription now, you will continue to have access until {{periodEnd}}.": "Kui tühistate oma tellimuse nüüd, jääb teile juurdepääs kuni {{periodEnd}}.", + "If you have a corporate or government email account, reach out to your IT department and ask them to allow emails to be received from {{senderEmail}}": "Kui teil on ettevõtte või valitsuse e-posti konto, pöörduge oma IT-osakonna poole ja paluge neil lubada e-kirjade vastuvõtmine aadressilt {{senderEmail}}", + "If you would like to start receiving emails again, the best next steps are to check your email address on file for any issues and then click resubscribe on the previous screen.": "Kui soovite uuesti e-kirju saada, on järgmiseks parimaks sammuks kontrollida oma registreeritud e-posti aadressi probleemide suhtes ja seejärel klõpsata eelmisel ekraanil uuesti tellimisnuppu.", + "If you're not receiving the email newsletter you've subscribed to, here are a few things to check.": "Kui te ei saa e-posti uudiskirja, mille olete tellinud, on siin mõned asjad, mida kontrollida.", + "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Kui olete kõik need kontrollid läbi viinud ja te ikka ei saa e-kirju, võite abi saamiseks pöörduda aadressil {{supportAddress}}.", + "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "Kui uudiskirja saatmise katsel saadakse püsiv tõrge, keelatakse kontol e-kirjad.", + "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "Lisage oma e-posti kliendis {{senderEmail}} oma kontaktide loendisse. See annab teie e-posti teenusepakkujale märku, et sellelt aadressilt saadetud e-kirju tuleks usaldada.", + "Invalid email address": "Vigane e-posti aadress", + "Jamie Larson": "Jamie Larson", + "jamie@example.com": "jamie@example.com", + "Less like this": "Vähem sellist", + "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Veenduge, et e-kirjad ei satuks kogemata teie postkasti rämpsposti või reklaamide kausta. Kui need on seal, klõpsake \"Märgi mitte-rämpspostiks\" ja/või \"Liiguta postkasti\".", + "Manage": "Halda", + "Maybe later": "Võib-olla hiljem", + "Memberships unavailable, contact the owner for access.": "Liikmestaatus pole saadaval, võtke juurdepääsu saamiseks ühendust omanikuga.", + "month": "kuu", + "Monthly": "Igakuine", + "More like this": "Rohkem sellist", + "Name": "Nimi", + "Need more help? Contact support": "Vajate rohkem abi? Võtke ühendust toega", + "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "Uudiskirjad võidakse teie kontol keelata kahel põhjusel: eelmine e-kiri märgiti rämpspostiks või e-kirja saatmise katse põhjustas püsiva tõrke (tagasipõrke).", + "Not receiving emails?": "Ei saa e-kirju?", + "Now check your email!": "Nüüd kontrollige oma e-posti!", + "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Kui olete uuesti tellinud ja te ikka ei näe e-kirju oma postkastis, kontrollige oma rämpsposti kausta. Mõned postkasti teenusepakkujad säilitavad varasemaid rämpspostikaebusi ja jätkavad e-kirjade märkimist. Kui see juhtub, märkige viimane uudiskiri 'Mitte rämpspost', et see liiguks tagasi teie põhipostkasti.", + "Permanent failure (bounce)": "Püsiv tõrge (tagasipõrge)", + "Phone number": "Telefoninumber", + "Plan": "Pakett", + "Plan checkout was cancelled.": "Paketi tellimuse vormistamine tühistati.", + "Plan upgrade was cancelled.": "Paketi uuendamine tühistati.", + "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Palun võtke ühendust {{supportAddress}}, et kohandada oma tasuta tellimust.", + "Please enter {{fieldName}}": "Palun sisestage {{fieldName}}", + "Please fill in required fields": "Palun täitke kohustuslikud väljad", + "Price": "Hind", + "Re-enable emails": "Luba e-kirjad uuesti", + "Recommendations": "Soovitused", + "Renews at {{price}}.": "Uueneb hinnaga {{price}}.", + "Retry": "Proovi uuesti", + "Save": "Salvesta", + "Send an email and say hi!": "Saatke e-kiri ja öelge tere!", + "Send an email to {{senderEmail}} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "Saatke e-kiri aadressile {{senderEmail}} ja öelge tere. See võib aidata anda teie e-posti teenusepakkujale märku, et selle aadressiga seotud e-kirju tuleks usaldada.", + "Sending login link...": "Sisselogimislingi saatmine...", + "Sending...": "Saatmine...", + "Show all": "Näita kõiki", + "Sign in": "Logi sisse", + "Sign out": "Logi välja", + "Sign up": "Registreeru", + "Signup error: Invalid link": "Registreerimise viga: Vigane link", + "Something went wrong, please try again later.": "Midagi läks valesti, palun proovige hiljem uuesti.", + "Sorry, that didn’t work.": "", + "Spam complaints": "Rämpsposti kaebused", + "Start {{amount}}-day free trial": "Alusta {{amount}}-päevast tasuta prooviversiooni", + "Starting {{startDate}}": "Algab {{startDate}}", + "Starting today": "Algab täna", + "Submit feedback": "Saada tagasiside", + "Subscribe": "Telli", + "Subscribed": "Tellitud", + "Success": "Õnnestus", + "Success! Check your email for magic link to sign-in.": "Õnnestus! Kontrollige oma e-posti, et leida maagiline sisselogimislink.", + "Success! Your account is fully activated, you now have access to all content.": "Õnnestus! Teie konto on täielikult aktiveeritud, teil on nüüd juurdepääs kogu sisule.", + "Success! Your email is updated.": "Õnnestus! Teie e-post on uuendatud.", + "Successfully unsubscribed": "Tellimus on edukalt tühistatud", + "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "Täname tellimise eest. Enne kui alustate lugemist, on allpool mõned teised saidid, mis võiksid teile meeldida.", + "Thank you for your support": "Täname teid toetuse eest", + "Thank you for your support!": "Täname teid toetuse eest!", + "Thanks for the feedback!": "Täname tagasiside eest!", + "That didn't go to plan": "See ei läinud plaanipäraselt", + "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Meie käsutuses olev e-posti aadress teie jaoks on {{memberEmail}} — kui see pole õige, saate seda muuta oma ", + "There was a problem submitting your feedback. Please try again a little later.": "Teie tagasiside esitamisel tekkis probleem. Palun proovige natuke hiljem uuesti.", + "There was an error processing your payment. Please try again.": "", + "This site is invite-only, contact the owner for access.": "See sait on ainult kutsetega, juurdepääsu saamiseks võtke ühendust omanikuga.", + "This site is not accepting payments at the moment.": "", + "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Registreerimise lõpetamiseks klõpsake oma postkastis kinnituslingile. Kui see ei saabu 3 minuti jooksul, kontrollige oma rämpsposti kausta!", + "To continue to stay up to date, subscribe to {{publication}} below.": "", + "Try free for {{amount}} days, then {{originalPrice}}.": "Proovige tasuta {{amount}} päeva, seejärel {{originalPrice}}.", + "Unlock access to all newsletters by becoming a paid subscriber.": "Avage juurdepääs kõigile uudiskirjadele, hakates tasuliseks tellijaks.", + "Unsubscribe from all emails": "Tühista kõikide e-kirjade tellimus", + "Unsubscribed": "Tellimus tühistatud", + "Unsubscribed from all emails.": "Kõikide e-kirjade tellimus tühistatud", + "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "E-kirjade tellimusest loobumine ei tühista teie tasulist tellimust {{title}}-le", + "Update": "Uuenda", + "Update your preferences": "Uuendage oma eelistusi", + "Verification link sent, check your inbox": "Kinnituslink saadetud, kontrollige oma postkasti", + "Verify your email address is correct": "Veenduge, et teie e-posti aadress on õige", + "View plans": "Vaata plaane", + "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "Me ei saanud teie tellimust tühistada, kuna e-posti aadressi ei leitud. Palun võtke ühendust saidi omanikuga.", + "Welcome back, {{name}}!": "Tere tulemast tagasi, {{name}}!", + "Welcome back!": "Tere tulemast tagasi!", + "Welcome to {{siteTitle}}": "Tere tulemast {{siteTitle}}-sse", + "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Kui postkast ei võta e-kirja vastu, nimetatakse seda tavaliselt tagasipõrkeks. Paljudel juhtudel võib see olla ajutine. Kuid mõnel juhul võib tagasipõrkunud e-kiri tagastada püsiva tõrke, kui e-posti aadress on kehtetu või seda pole olemas.", + "Why has my email been disabled?": "Miks on minu e-post välja lülitatud?", + "year": "", + "Yearly": "Aastane", + "You currently have a free membership, upgrade to a paid subscription for full access.": "Teil on praegu tasuta liikmelisus, täieliku juurdepääsu saamiseks uuendage tasulisele tellimusele.", + "You have been successfully resubscribed": "Olete edukalt uuesti tellinud", + "You're currently not receiving emails": "Te ei saa praegu e-kirju", + "You're not receiving emails": "Te ei saa e-kirju", + "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Te ei saa e-kirju, kuna kas märkisite hiljutise sõnumi rämpspostiks või sõnumeid ei saanud teie antud e-posti aadressile kohale toimetada.", + "You've successfully signed in.": "Olete edukalt sisse loginud.", + "You've successfully subscribed to": "Olete edukalt tellinud", + "Your account": "Teie konto", + "Your input helps shape what gets published.": "Teie sisend aitab kujundada seda, mida avaldatakse.", + "Your subscription will expire on {{expiryDate}}": "Teie tellimus aegub {{expiryDate}}", + "Your subscription will renew on {{renewalDate}}": "Teie tellimus uueneb {{renewalDate}}", + "Your subscription will start on {{subscriptionStart}}": "Teie tellimus algab {{subscriptionStart}}" +} diff --git a/ghost/i18n/locales/et/search.json b/ghost/i18n/locales/et/search.json new file mode 100644 index 000000000000..fe5c0603acc4 --- /dev/null +++ b/ghost/i18n/locales/et/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "Autorid", + "Cancel": "Tühista", + "No matches found": "Vasteid ei leitud", + "Posts": "Postitused", + "Search posts, tags and authors": "Otsi postitusi, silte ja autoreid", + "Show more results": "Näita rohkem tulemusi", + "Tags": "Sildid" +} diff --git a/ghost/i18n/locales/et/signup-form.json b/ghost/i18n/locales/et/signup-form.json new file mode 100644 index 000000000000..f5ab62cd01a3 --- /dev/null +++ b/ghost/i18n/locales/et/signup-form.json @@ -0,0 +1,9 @@ +{ + "Email sent": "E-kiri saadetud", + "Now check your email!": "Nüüd kontrolli oma e-posti!", + "Please enter a valid email address": "Palun sisesta kehtiv e-posti aadress", + "Something went wrong, please try again.": "Midagi läks valesti, palun proovi uuesti.", + "Subscribe": "Telli", + "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Registreerimise lõpetamiseks klõpsa kinnituslingil oma postkastis. Kui see ei saabu 3 minuti jooksul, kontrolli oma rämpsposti kausta!", + "Your email address": "Sinu e-posti aadress" +} diff --git a/ghost/i18n/locales/mk/comments.json b/ghost/i18n/locales/mk/comments.json index 03bc9ee6fc9a..888d4f4fe6a6 100644 --- a/ghost/i18n/locales/mk/comments.json +++ b/ghost/i18n/locales/mk/comments.json @@ -2,8 +2,8 @@ "{{amount}} characters left": "Преостануваат {{amount}} знаци.", "{{amount}} comments": "{{amount}} коментари", "{{amount}} days ago": "Пред {{amount}} дена", - "{{amount}} hours ago": "Пред {{amount}} часа", - "{{amount}} minutes ago": "Пред {{amount}} минути", + "{{amount}} hrs ago": "", + "{{amount}} mins ago": "", "{{amount}} months ago": "Пред {{amount}} месеци", "{{amount}} more": "Уште {{amount}}", "{{amount}} seconds ago": "Пред {{amount}} секунди", @@ -25,7 +25,7 @@ "Discussion": "Разговор", "Edit": "Изменете", "Edit this comment": "Изменете го овој коментар", - "Edited": "Изменето", + "edited": "", "Enter your name": "Внесете го вашето име", "Expertise": "Експертиза", "Founder @ Acme Inc": "Основач @ Примерна Компанија", @@ -42,7 +42,7 @@ "Neurosurgeon": "Неврохирург", "One day ago": "Пред еден ден", "One hour ago": "Пред еден час", - "One minute ago": "Пред една минута", + "One min ago": "", "One month ago": "Пред еден месец", "One week ago": "Пред една недела", "One year ago": "Пред една година", @@ -50,7 +50,6 @@ "Reply to comment": "Одговор на коментарот", "Report": "Пријавете", "Report comment": "Пријавете коментар", - "Report this comment": "Пријавете го овој коментар", "Report this comment?": "Пријавете го овој коментар?", "Save": "Зачувајте", "Sending": "Се испраќа", @@ -68,6 +67,5 @@ "This comment has been removed.": "Овој коментар беше отстранет.", "Upgrade now": "Надградете", "Yesterday": "Вчера", - "You want to report this comment?": "Дали сакате да го пријавите овој коментар?", "Your request will be sent to the owner of this site.": "Вашето барање ќе биде испратено на сопственикот на оваа страница." } diff --git a/ghost/i18n/locales/mk/portal.json b/ghost/i18n/locales/mk/portal.json index da03650d777a..fbb0f3ddc1ba 100644 --- a/ghost/i18n/locales/mk/portal.json +++ b/ghost/i18n/locales/mk/portal.json @@ -10,6 +10,7 @@ "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}} нема веќе да добива пораки кога некој ќе одговори на вашиот коментар.", "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} нема веќе да го добива овој билтен.", "{{trialDays}} days free": "{{trialDays}} денови бесплатно", + "+1 (123) 456-7890": "", "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Линк за најава беше испратен кон вашиот email. Ако не пристигне за повеќе од 3 минути, проверете во спам.", "Account": "Сметка", "Account settings": "Поставки", @@ -24,10 +25,12 @@ "Cancel subscription": "Откажете претплата", "Cancellation reason": "Причина за откажување", "Change": "Променете", + "Change plan": "", "Check spam & promotions folders": "Проверете спам и промотивни папки", "Check with your mail provider": "Проверете со вашиот mail сервис", "Choose": "Изберете", "Choose a different plan": "Изберете друг пакет", + "Choose a plan": "", "Choose your newsletters": "Изберете ги вашите билтени", "Click here to retry": "Кликнете тука за да се обидите повторно", "Close": "Затворете", @@ -53,6 +56,8 @@ "Emails": "Електронски пошти", "Emails disabled": "Оневозможени електронски пошти", "Ends {{offerEndDate}}": "Завршува на {{offerEndDate}}", + "Enter your email address": "", + "Enter your name": "", "Error": "Грешка", "Expires {{expiryDate}}": "Истекува на {{expiryDate}}", "Forever": "Засекогаш", @@ -72,11 +77,15 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Доколку сте ги завршиле сите овие проверки и сè уште не добивате пораки, контактирајте на {{supportAddress}} за да добиете подршка.", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "Во случај кога настане траен неуспех при обид за испраќање на билтен, email пораките ќе бидат оневозможени за сметката.", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "Додајте го {{senderEmail}} во листата на контакти од вашиот email сервис додајте. Ова ќе му сигналира на вашиот email сервис дека пораките добиени од оваа email адреса треба да бидат прифатени.", + "Invalid email address": "", + "Jamie Larson": "", + "jamie@example.com": "", "Less like this": "Помалку како ова", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Осигурајте се дека пораките не завршуваат несакано во папките за спам или промоции од вашиот email. Доколку тоа се случува, обележете ги дека не се спам и префрлете ги во главното поштенско сандаче.", "Manage": "Управувајте", "Maybe later": "Можеби подоцна", "Memberships unavailable, contact the owner for access.": "Зачленувањето не е достапно. За пристап контактирајте го сопственикот.", + "month": "", "Monthly": "Месечно", "More like this": "Повеќе како ова", "Name": "Име", @@ -86,10 +95,12 @@ "Now check your email!": "Сега проверете ги пораките1", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Кога ќе се претплатите повторно, доколку сè уште не добивате пораки, проверте ја папката за спам. Некои сервиси чуваат записи од претходни поплаки за спам и продолжуваат да ги обележуваат пораките како такви. Ако ова се случи, обележете ја последната порака од билтенот дека не е спам и префрлете ја во главното поштенско сандаче.", "Permanent failure (bounce)": "Траен неуспех (отскокнување)", + "Phone number": "", "Plan": "Пакет", "Plan checkout was cancelled.": "Плаќањето на пакетот беше откажано.", "Plan upgrade was cancelled.": "Надградбата на пакетот беше откажана.", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Ве молиме контактирајте на {{supportAddress}} за прилагодување на вашата додатна претплата.", + "Please enter {{fieldName}}": "", "Please fill in required fields": "Ве молиме пополнете ги задолжителните полиња", "Price": "Цена", "Re-enable emails": "Овозможете пораки", @@ -106,6 +117,7 @@ "Sign out": "Одјавете се", "Sign up": "Регистрирајте се", "Signup error: Invalid link": "Грешка при регистрација: Невалиден линк", + "Something went wrong, please try again later.": "", "Sorry, that didn’t work.": "Се извинуваме, тоа не проработи.", "Spam complaints": "Поплаки за спам", "Start {{amount}}-day free trial": "Започнете {{amount}} дневен пробен период", @@ -120,12 +132,17 @@ "Success! Your email is updated.": "Успех! Вашиот email е ажуриран.", "Successfully unsubscribed": "Успешно се отпишавте", "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "Ви благодариме за претплатувањето. Пред да започнете со читање, подолу се неколку други страници кои може да ви се допаднат.", + "Thank you for your support": "", + "Thank you for your support!": "", "Thanks for the feedback!": "Ви благодариме за забелешката!", "That didn't go to plan": "Тоа се случи според планот!", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Email адресата која ја имаме за вас е {{memberEmail}} - ако ова не е точна адреса, можете да ја ажурирате во на сметката.", "There was a problem submitting your feedback. Please try again a little later.": "Настана проблем при испраќање на вашата забелешка. Обидете се повторно малку подоцна.", + "There was an error processing your payment. Please try again.": "", "This site is invite-only, contact the owner for access.": "Оваа страница е достапна само со покана. За пристап контактирајте го сопственикот.", + "This site is not accepting payments at the moment.": "", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "За да ја завршите регистрацијата, кликнете на линкот за потврда испратен на вашата email адреса. Ако не пристигне во рок од 3 минути, проверте во спам!", + "To continue to stay up to date, subscribe to {{publication}} below.": "", "Try free for {{amount}} days, then {{originalPrice}}.": "Пробајте бесплатно за {{amount}} денови, потоа по цена од {{originalPrice}}.", "Unlock access to all newsletters by becoming a paid subscriber.": "Добијте пристап до сите билтени преку платена претплата.", "Unsubscribe from all emails": "Отпишете се од сите пораки", @@ -143,6 +160,7 @@ "Welcome to {{siteTitle}}": "Добредојдовте на {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Кога email адреса не успева да добие порака, тоа се нарекува отскокнување. Во повеќе случаи, ова може да биде привремено. Но, во некои случаи, отскокнувањето може да биде вратено како траен неуспех кога email адресата е невалидна или непостоечка.", "Why has my email been disabled?": "Зошто мојата email адреса беше оневозможена?", + "year": "", "Yearly": "Годишно", "You currently have a free membership, upgrade to a paid subscription for full access.": "Моментално имате бесплатно членство. Надградете на платена претплата за целосен пристап.", "You have been successfully resubscribed": "Бевте успешно претплатени повторно", @@ -155,5 +173,5 @@ "Your input helps shape what gets published.": "Вашиот прилог помага да се оформи она кое ќе биде објавувано.", "Your subscription will expire on {{expiryDate}}": "Вашата претплата ќе истече на {{expiryDate}}", "Your subscription will renew on {{renewalDate}}": "Вашата претплата ќе биде обновена на {{renewalDate}}", - "Your subscription will start on {{subscriptionStart}}": "Вашата претплата ќе започне на {subscriptionStart}}" + "Your subscription will start on {{subscriptionStart}}": "Вашата претплата ќе започне на {{subscriptionStart}}" } diff --git a/ghost/i18n/locales/mk/search.json b/ghost/i18n/locales/mk/search.json new file mode 100644 index 000000000000..8902015528ff --- /dev/null +++ b/ghost/i18n/locales/mk/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "", + "Cancel": "", + "No matches found": "", + "Posts": "", + "Search posts, tags and authors": "", + "Show more results": "", + "Tags": "" +} diff --git a/ghost/i18n/locales/pt-BR/portal.json b/ghost/i18n/locales/pt-BR/portal.json index 488227b67910..8d46b4ef8bcd 100644 --- a/ghost/i18n/locales/pt-BR/portal.json +++ b/ghost/i18n/locales/pt-BR/portal.json @@ -25,12 +25,12 @@ "Cancel subscription": "Cancelar inscrição", "Cancellation reason": "Motivo do cancelamento", "Change": "Alterar", - "Change plan": "", + "Change plan": "Alterar plano", "Check spam & promotions folders": "Verificar pastas de spam e promoções", "Check with your mail provider": "Verificar com seu provedor de e-mail", "Choose": "Escolher", "Choose a different plan": "Escolher um plano diferente", - "Choose a plan": "", + "Choose a plan": "Escolher um plano", "Choose your newsletters": "Escolher suas newsletters", "Click here to retry": "Clique aqui para tentar novamente", "Close": "Fechar", @@ -78,14 +78,14 @@ "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "No caso de uma falha permanente ser recebida ao tentar enviar uma newsletter, os e-mails serão desativados na conta.", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "No seu cliente de e-mail, adicione {{senderEmail}} à sua lista de contatos. Isso sinaliza ao seu provedor de e-mail que os e-mails enviados deste endereço devem ser confiáveis.", "Invalid email address": "Endereço de e-mail inválido", - "Jamie Larson": "Fulano de tal", + "Jamie Larson": "Fulano(a) de tal", "jamie@example.com": "fulano@exemplo.com", "Less like this": "Menos como este", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Verifique se os e-mails não estão indo parar acidentalmente nas pastas Spam ou Promoções da sua caixa de entrada. Se estiverem, clique em \"Marcar como não spam\" e/ou \"Mover para a caixa de entrada\".", "Manage": "Gerenciar", "Maybe later": "Talvez mais tarde", "Memberships unavailable, contact the owner for access.": "Assinaturas indisponíveis, entre em contato para obter acesso.", - "month": "", + "month": "mês", "Monthly": "Mensal", "More like this": "Relacionados", "Name": "Nome", @@ -95,13 +95,13 @@ "Now check your email!": "Agora veja seu e-mail!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Depois de se inscrever novamente, se você ainda não vir e-mails na sua caixa de entrada, verifique sua pasta de spam. Alguns provedores de caixa de entrada mantêm um registro de reclamações anteriores de spam e continuarão a sinalizar e-mails. Se isso acontecer, marque a newsletter mais recente como 'Não é spam' para movê-la de volta para sua caixa de entrada principal.", "Permanent failure (bounce)": "Falha permanente (bounce)", - "Phone number": "", + "Phone number": "Número de telefone", "Plan": "Plano", - "Plan checkout was cancelled.": "Plano de checkout foi cancelado.", - "Plan upgrade was cancelled.": "Upgrade de plano foi cancelado.", + "Plan checkout was cancelled.": "O checkout do plano foi cancelado.", + "Plan upgrade was cancelled.": "O upgrade de plano foi cancelado.", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Entre em contato com {{supportAddress}} para ajustar sua assinatura.", - "Please enter {{fieldName}}": "", - "Please fill in required fields": "Preencha os campos obrigatórios", + "Please enter {{fieldName}}": "Por favor, insira {{fieldName}}", + "Please fill in required fields": "Por favor, preencha os campos obrigatórios", "Price": "Preço", "Re-enable emails": "Reativar e-mails", "Recommendations": "Recomendações", @@ -117,7 +117,7 @@ "Sign out": "Sair", "Sign up": "Cadastrar", "Signup error: Invalid link": "Erro de inscrição: link inválido", - "Something went wrong, please try again later.": "", + "Something went wrong, please try again later.": "Algo deu errado, tente novamente mais tarde.", "Sorry, that didn’t work.": "Desculpe, isso não funcionou.", "Spam complaints": "Reclamações de spam", "Start {{amount}}-day free trial": "Começar teste grátis de {{amount}} dias", @@ -149,8 +149,8 @@ "Unsubscribed": "Cancelado", "Unsubscribed from all emails.": "Cancelada a inscrição de todos os e-mails.", "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "Cancelar a inscrição nos e-mails não cancelará sua assinatura paga em {{title}}", - "Update": "atualizar", - "Update your preferences": "Atualizar preferências", + "Update": "Atualizar", + "Update your preferences": "Atualizar suas preferências", "Verification link sent, check your inbox": "Link de verificação enviado, verifique sua caixa de entrada", "Verify your email address is correct": "Verifique se o endereço de e-mail está correto", "View plans": "Ver planos", @@ -160,7 +160,7 @@ "Welcome to {{siteTitle}}": "Bem-vindo ao {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Quando uma caixa de entrada falha ao aceitar um e-mail, isso é comumente chamado de bounce. Em muitos casos, isso pode ser temporário. No entanto, em alguns casos, um e-mail com falha pode ser retornado como uma falha permanente quando um endereço de e-mail é inválido ou não existe.", "Why has my email been disabled?": "Por que meu e-mail foi desativado?", - "year": "", + "year": "ano", "Yearly": "Anualmente", "You currently have a free membership, upgrade to a paid subscription for full access.": "Você atualmente tem uma assinatura gratuita, faça um upgrade para uma assinatura paga para ter acesso completo.", "You have been successfully resubscribed": "Você foi reinscrito com sucesso", diff --git a/ghost/i18n/locales/pt-BR/search.json b/ghost/i18n/locales/pt-BR/search.json index c09fed2125a6..5e6150dff68b 100644 --- a/ghost/i18n/locales/pt-BR/search.json +++ b/ghost/i18n/locales/pt-BR/search.json @@ -1,9 +1,9 @@ { "Authors": "Autores", "Cancel": "Cancelar", - "No matches found": "Nenhuma correspondência encontrada", + "No matches found": "Nenhum resultado encontrado", "Posts": "Publicações", - "Search posts, tags and authors": "Buscar publicações, tags e autores", + "Search posts, tags and authors": "Buscar posts, tags e autores", "Show more results": "Mostrar mais resultados", "Tags": "Tags" } diff --git a/ghost/i18n/locales/sr-Cyrl/comments.json b/ghost/i18n/locales/sr-Cyrl/comments.json index f52d6455193e..e00256012430 100644 --- a/ghost/i18n/locales/sr-Cyrl/comments.json +++ b/ghost/i18n/locales/sr-Cyrl/comments.json @@ -2,8 +2,8 @@ "{{amount}} characters left": "Преостало још {{amount}} карактера", "{{amount}} comments": "{{amount}} коментара", "{{amount}} days ago": "пре {{amount}} дана", - "{{amount}} hours ago": "пре {{amount}} сати", - "{{amount}} minutes ago": "пре {{amount}} минута", + "{{amount}} hrs ago": "", + "{{amount}} mins ago": "", "{{amount}} months ago": "пре {{amount}} месеци", "{{amount}} more": "још {{amount}}", "{{amount}} seconds ago": "пре {{amount}} секунди", @@ -25,7 +25,7 @@ "Discussion": "Дискусија", "Edit": "Уреди", "Edit this comment": "Уредите овај коментар", - "Edited": "Измењено", + "edited": "", "Enter your name": "Унесите своје име", "Expertise": "Експертиза", "Founder @ Acme Inc": "Оснивач @ Acme Inc", @@ -42,7 +42,7 @@ "Neurosurgeon": "Неурохирург", "One day ago": "Пре један дан", "One hour ago": "Пре један сат", - "One minute ago": "Пре један минут", + "One min ago": "", "One month ago": "Пре један месец", "One week ago": "Пре једну недељу", "One year ago": "Пре једну годину", @@ -50,7 +50,6 @@ "Reply to comment": "Одговорите на коментар", "Report": "Пријави", "Report comment": "Пријави коментар", - "Report this comment": "Пријави овај коментар", "Report this comment?": "Пријавити овај коментар?", "Save": "Сачувај", "Sending": "Слање", @@ -68,6 +67,5 @@ "This comment has been removed.": "Овај коментар је уклоњен.", "Upgrade now": "Надоградите сада", "Yesterday": "Јуче", - "You want to report this comment?": "Желите да пријавите овај коментар?", "Your request will be sent to the owner of this site.": "Ваш захтев ће бити послат власнику овог сајта." } diff --git a/ghost/i18n/locales/sr-Cyrl/portal.json b/ghost/i18n/locales/sr-Cyrl/portal.json index b43f4f7bc18e..e68e9dfcb877 100644 --- a/ghost/i18n/locales/sr-Cyrl/portal.json +++ b/ghost/i18n/locales/sr-Cyrl/portal.json @@ -25,10 +25,12 @@ "Cancel subscription": "Откажите претплату", "Cancellation reason": "Разлог отказивања", "Change": "Промените", + "Change plan": "", "Check spam & promotions folders": "Проверите фасцикле за нежељену пошту и промоције", "Check with your mail provider": "Проверите са вашим провајдером мејла", "Choose": "Изаберите", "Choose a different plan": "Изаберите другачији план", + "Choose a plan": "", "Choose your newsletters": "Изаберите своје билтене", "Click here to retry": "Кликните овде да покушате поново", "Close": "Затвори", @@ -83,6 +85,7 @@ "Manage": "Управљајте", "Maybe later": "Можда касније", "Memberships unavailable, contact the owner for access.": "Чланства нису доступна, контактирајте власника ради приступа.", + "month": "", "Monthly": "Месечно", "More like this": "Више оваквих", "Name": "Име", @@ -157,6 +160,7 @@ "Welcome to {{siteTitle}}": "Добродошли на {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Када сандуче не прихвата мејл, то се обично назива одбијањем. У многим случајевима то може бити привремено. Међутим, у неким случајевима, одбијени мејл може бити враћен као трајни неуспех ако је мејл адреса неважећа или непостојећа.", "Why has my email been disabled?": "Зашто је мој мејл онемогућен?", + "year": "", "Yearly": "Годишње", "You currently have a free membership, upgrade to a paid subscription for full access.": "Тренутно имате бесплатну претплату, надоградите на плаћену претплату за пуни приступ.", "You have been successfully resubscribed": "Успешно сте поново претплаћени", diff --git a/ghost/i18n/locales/sr-Cyrl/search.json b/ghost/i18n/locales/sr-Cyrl/search.json new file mode 100644 index 000000000000..8902015528ff --- /dev/null +++ b/ghost/i18n/locales/sr-Cyrl/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "", + "Cancel": "", + "No matches found": "", + "Posts": "", + "Search posts, tags and authors": "", + "Show more results": "", + "Tags": "" +} diff --git a/ghost/i18n/locales/th/comments.json b/ghost/i18n/locales/th/comments.json index 3c133253d1f2..dfb02a31e543 100644 --- a/ghost/i18n/locales/th/comments.json +++ b/ghost/i18n/locales/th/comments.json @@ -2,8 +2,8 @@ "{{amount}} characters left": "คงเหลือ {{amount}} ตัวอักษร", "{{amount}} comments": "{{amount}} ความคิดเห็น", "{{amount}} days ago": "{{amount}} วันที่แล้ว", - "{{amount}} hours ago": "{{amount}} ชั่วโมงที่แล้ว", - "{{amount}} minutes ago": "{{amount}} นาทีที่แล้ว", + "{{amount}} hrs ago": "", + "{{amount}} mins ago": "", "{{amount}} months ago": "{{amount}} เดือนที่แล้ว", "{{amount}} more": "อีก {{amount}}", "{{amount}} seconds ago": "{{amount}} วินาทีที่แล้ว", @@ -25,7 +25,7 @@ "Discussion": "การสนทนา", "Edit": "แก้ไข", "Edit this comment": "แก้ไขความคิดเห็นนี้", - "Edited": "แก้ไขแล้ว", + "edited": "", "Enter your name": "ระบุชื่อของคุณ", "Expertise": "ความเชี่ยวชาญ", "Founder @ Acme Inc": "ผู้ก่อตั้ง @ Acme Inc", @@ -42,7 +42,7 @@ "Neurosurgeon": "ศัลยแพทย์ระบบประสาท", "One day ago": "1 วันที่แล้ว", "One hour ago": "1 ชั่วโมงที่แล้ว", - "One minute ago": "1 นาทีที่แล้ว", + "One min ago": "", "One month ago": "1 เดือนที่แล้ว", "One week ago": "1 สัปดาห์ที่แล้ว", "One year ago": "1 ปีที่แล้ว", @@ -50,7 +50,6 @@ "Reply to comment": "ตอบกลับความคิดเห็น", "Report": "รายงาน", "Report comment": "รายงานความคิดเห็น", - "Report this comment": "รายงานความคิดเห็นนี้", "Report this comment?": "รายงานความคิดเห็นนี้?", "Save": "บันทึก", "Sending": "กำลังส่ง", @@ -68,6 +67,5 @@ "This comment has been removed.": "ความคิดเห็นนี้ถูกลบ", "Upgrade now": "อัพเกรดตอนนี้เลย", "Yesterday": "เมื่อวาน", - "You want to report this comment?": "ต้องการรายงานความคิดเห็นนี้?", "Your request will be sent to the owner of this site.": "คำขอของคุณจะถูกส่งไปยังผู้ดูแลเว็บไซต์" } diff --git a/ghost/i18n/locales/th/portal.json b/ghost/i18n/locales/th/portal.json index cc6f94ab3c7d..38733be4122b 100644 --- a/ghost/i18n/locales/th/portal.json +++ b/ghost/i18n/locales/th/portal.json @@ -1,4 +1,5 @@ { + "(save {{highestYearlyDiscount}}%)": "", "{{amount}} days free": "ฟรี {{amount}} วัน", "{{amount}} off": "ลด {{amount}}", "{{amount}} off for first {{number}} months.": "ลด {{amount}} สำหรับ {{number}} เดือนแรก", @@ -9,6 +10,7 @@ "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}} จะไม่ได้รับอีเมลอีกต่อไป เมื่อมีคนตอบกลับความคิดเห็นของคุณ", "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} จะไม่ได้รับจดหมายข่าวนี้อีกต่อไป", "{{trialDays}} days free": "ฟรี {{trialDays}} วัน", + "+1 (123) 456-7890": "", "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "ลิงค์เข้าสู่ระบบถูกส่งไปยังกล่องจดหมายของคุณแล้ว หากไม่ได้รับภายใน 3 นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณ", "Account": "บัญชี", "Account settings": "ตั้งค่าบัญชี", @@ -23,10 +25,12 @@ "Cancel subscription": "ยกเลิกการรับสมัครข้อมูล", "Cancellation reason": "เหตุผลการยกเลิก", "Change": "เปลี่ยน", + "Change plan": "", "Check spam & promotions folders": "ตรวจสอบโฟลเดอร์สแปมและโปรโมชัน", "Check with your mail provider": "ตรวจสอบกับผู้ให้บริการอีเมลของคุณ", "Choose": "เลือก", "Choose a different plan": "เลือกแผนอื่น", + "Choose a plan": "", "Choose your newsletters": "เลือกอีเมลที่ต้องการรับจดหมายข่าว", "Click here to retry": "คลิกที่นี่เพื่อลองอีกครั้ง", "Close": "ปิด", @@ -48,11 +52,12 @@ "Edit": "แก้ไข", "Email": "อีเมล", "Email newsletter": "จดหมายข่าวทางอีเมล", - "Email preference updated.": "อัปเดตการตั้งค่าอีเมลแล้ว", "Email preferences": "การตั้งค่าอีเมล", "Emails": "อีเมล", "Emails disabled": "อีเมลถูกปิดใช้งาน", "Ends {{offerEndDate}}": "สิ้นสุด {{offerEndDate}}", + "Enter your email address": "", + "Enter your name": "", "Error": "ข้อผิดพลาด", "Expires {{expiryDate}}": "หมดอายุ {{expiryDate}}", "Forever": "ตลอดไป", @@ -72,11 +77,15 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "หากคุณตรวจสอบทั้งหมดนี้แล้ว แต่ยังไม่ได้รับอีเมล คุณสามารถติดต่อเพื่อแก้ไขปัญหาได้โดยติดต่อ {{supportAddress}}", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "ในกรณีที่พยายามส่งจดหมายข่าวและได้รับความล้มเหลวอย่างถาวร, ที่อยู่อีเมลจะถูกปิดการใช้งานจากบัญชี", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "ในโปรแกรมรับส่งอีเมลของคุณ ให้เพิ่ม {{senderEmail}} ลงในรายชื่อผู้ติดต่อของคุณ นี่เป็นการส่งสัญญาณไปยังผู้ให้บริการอีเมลของคุณ ว่าอีเมลที่ส่งจากที่อยู่นี้เชื่อถือได้", + "Invalid email address": "", + "Jamie Larson": "", + "jamie@example.com": "", "Less like this": "เห็นแบบนี้ให้น้อยลง", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "ตรวจสอบให้แน่ใจว่าอีเมลไม่ได้ไปอยู่ในโฟลเดอร์สแปมหรือโปรโมชั่นในกล่องจดหมายของคุณโดยไม่ได้ตั้งใจ หากเป็นเช่นนั้น ให้คลิก \"ทำเครื่องหมายว่าไม่ใช่สแปม\" และ/หรือ \"ย้ายไปที่กล่องจดหมาย\"", "Manage": "จัดการ", "Maybe later": "ไว้ก่อน", "Memberships unavailable, contact the owner for access.": "การเป็นสมาชิกไม่พร้อมใช้งาน, โปรดติดต่อเจ้าของเพื่อขอสิทธิ์ในการเข้าถึง", + "month": "", "Monthly": "รายเดือน", "More like this": "เห็นแบบนี้ให้มากขึ้น", "Name": "ชื่อ", @@ -86,10 +95,12 @@ "Now check your email!": "ตรวจสอบอีเมลของคุณตอนนี้!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "เมื่อรับสมัครข้อมูลใหม่แล้ว, หากคุณยังคงไม่เห็นอีเมลในกล่องจดหมายของคุณ ให้ตรวจสอบโฟลเดอร์สแปมของคุณ. ผู้ให้บริการกล่องจดหมายบางราย เก็บบันทึกการร้องเรียนเกี่ยวกับสแปมก่อนหน้านี้ และจะทำการตั้งค่าสถานะอีเมลต่อไป หากเกิดเหตุการณ์เช่นนี้ ให้ทำเครื่องหมายจดหมายข่าวล่าสุดว่า 'ไม่ใช่สแปม' เพื่อย้ายกลับไปยังกล่องจดหมายหลักของคุณ", "Permanent failure (bounce)": "ความล้มเหลวอย่างถาวร (อีเมลถูกตีกลับ)", + "Phone number": "", "Plan": "แผน", "Plan checkout was cancelled.": "การชำระเงินตามแผนถูกยกเลิก", "Plan upgrade was cancelled.": "การอัปเกรดแผนถูกยกเลิก", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "โปรดติดต่อ {{supportAddress}} เพื่อปรับเปลี่ยนการรับสมัครข้อมูลฟรีของคุณ", + "Please enter {{fieldName}}": "", "Please fill in required fields": "กรุณากรอกข้อมูลในช่องให้ครบถ้วน", "Price": "ราคา", "Re-enable emails": "เปิดใช้งานอีเมลนี้อีกครั้ง", @@ -106,6 +117,7 @@ "Sign out": "ออกจากระบบ", "Sign up": "สมัครใช้งาน", "Signup error: Invalid link": "มีข้อผิดพลาดในการสมัครใช้งาน: ลิงก์ไม่ถูกต้อง", + "Something went wrong, please try again later.": "", "Sorry, that didn’t work.": "ขออภัย, ไม่สามารถส่งได้", "Spam complaints": "การร้องเรียนเกี่ยวกับสแปม", "Start {{amount}}-day free trial": "เริ่มทดลองใช้ฟรี {{amount}} วัน", @@ -120,16 +132,22 @@ "Success! Your email is updated.": "อัปเดตอีเมลสำเร็จแล้ว!", "Successfully unsubscribed": "ยกเลิกการรับสมัครข้อมูลเรียบร้อยแล้ว", "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "ขอบคุณสำหรับการรับสมัครข้อมูล ก่อนที่คุณจะเริ่มอ่าน ด้านล่างนี้คือเว็บไซต์อื่นๆ บางส่วนที่คุณอาจชอบ", + "Thank you for your support": "", + "Thank you for your support!": "", "Thanks for the feedback!": "ขอบคุณสำหรับความคิดเห็น!", "That didn't go to plan": "บางอย่างไม่เป็นไปตามแผน", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "ที่อยู่อีเมลของคุณที่เรามีคือ {{memberEmail}} — หากไม่ถูกต้อง คุณสามารถอัปเดตได้ใน", "There was a problem submitting your feedback. Please try again a little later.": "เกิดปัญหาในการส่งความคิดเห็นของคุณ โปรดลองอีกครั้งในภายหลัง", + "There was an error processing your payment. Please try again.": "", "This site is invite-only, contact the owner for access.": "เว็บไซต์นี้สำหรับผู้ได้รับเชิญเท่านั้น โปรดติดต่อเจ้าของเพื่อเข้าถึง", + "This site is not accepting payments at the moment.": "", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "เพื่อทำการลงทะเบียนให้เสร็จสิ้น คลิกลิงก์ยืนยันในกล่องจดหมายของคุณ หากไม่ได้รับภายใน 3 นาที ให้ตรวจสอบโฟลเดอร์สแปมของคุณ!", + "To continue to stay up to date, subscribe to {{publication}} below.": "", "Try free for {{amount}} days, then {{originalPrice}}.": "ทดลองใช้ฟรี {{amount}} วัน จากนั้นจ่ายเป็น {{ราคาเดิม}}", "Unlock access to all newsletters by becoming a paid subscriber.": "ปลดล็อกการเข้าถึงจดหมายข่าวทั้งหมดโดยสมัครเป็นสมาชิกแบบชำระเงิน", "Unsubscribe from all emails": "ยกเลิกการรับสมัครข้อมูลทางอีเมลทั้งหมด", "Unsubscribed": "ยกเลิกการรับสมัครข้อมูลทางอีเมลแล้ว", + "Unsubscribed from all emails.": "", "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "การยกเลิกการสมัครรับอีเมล จะไม่ยกเลิกการรับสมัครข้อมูลแบบชำระเงินของคุณกับ {{title}}", "Update": "อัปเดต", "Update your preferences": "อัปเดตการตั้งค่าของคุณ", @@ -142,6 +160,7 @@ "Welcome to {{siteTitle}}": "ยินดีต้อนรับสู่ {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "เมื่อกล่องจดหมายเข้าไม่ยอมรับอีเมล โดยทั่วไปจะเรียกว่าการตีกลับ. ในหลายกรณี, การดำเนินการนี้อาจเกิดขึ้นชั่วคราว. อย่างไรก็ตาม ในบางกรณี อีเมลที่ถูกตีกลับ สามารถส่งคืนเป็นความล้มเหลวถาวรเมื่อที่อยู่อีเมลไม่ถูกต้องหรือไม่มีอยู่จริง", "Why has my email been disabled?": "เหตุใดอีเมลของฉันจึงถูกปิดการใช้งาน?", + "year": "", "Yearly": "รายปี", "You currently have a free membership, upgrade to a paid subscription for full access.": "ขณะนี้คุณเป็นสมาชิกฟรี, อัปเกรดเป็นการรับสมัครข้อมูลแบบชำระเงินเพื่อการเข้าถึงเต็มรูปแบบ", "You have been successfully resubscribed": "คุณรับสมัครข้อมูลทางอีเมลอีกครั้งสำเร็จแล้ว", diff --git a/ghost/i18n/locales/th/search.json b/ghost/i18n/locales/th/search.json new file mode 100644 index 000000000000..8902015528ff --- /dev/null +++ b/ghost/i18n/locales/th/search.json @@ -0,0 +1,9 @@ +{ + "Authors": "", + "Cancel": "", + "No matches found": "", + "Posts": "", + "Search posts, tags and authors": "", + "Show more results": "", + "Tags": "" +} diff --git a/ghost/i18n/locales/tr/portal.json b/ghost/i18n/locales/tr/portal.json index 3213bc8c645e..9a5082f86133 100644 --- a/ghost/i18n/locales/tr/portal.json +++ b/ghost/i18n/locales/tr/portal.json @@ -10,7 +10,7 @@ "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}}, yorumlarınıza yanıt verildiğinde artık e-posta almayacak.", "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} artık bu bülteni almayacak.", "{{trialDays}} days free": "{{trialDays}} gün ücretsiz", - "+1 (123) 456-7890": "", + "+1 (123) 456-7890": "+90 (123) 456-7890", "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Gelen kutuna bir giriş linki gönderildi. Eğer 3 dakika içinde ulaşmazsa spam klasörünü kontrol ettiğinden emin ol.", "Account": "Hesap", "Account settings": "Hesap ayarları", @@ -25,12 +25,12 @@ "Cancel subscription": "Aboneliği iptal et", "Cancellation reason": "İptal sebebi", "Change": "Değiştir", - "Change plan": "", + "Change plan": "Plan değiştir", "Check spam & promotions folders": "Spam ve promosyonlar klasörlerini kontrol edin", "Check with your mail provider": "Posta sağlayıcınızla kontrol edin", "Choose": "Seç", "Choose a different plan": "Farklı bir plan seç", - "Choose a plan": "", + "Choose a plan": "Bir plan seçin", "Choose your newsletters": "Bültenleri seç", "Click here to retry": "Tekrar denemek için buraya tıkla", "Close": "Kapat", @@ -56,8 +56,8 @@ "Emails": "E-postalar", "Emails disabled": "E-postalar devre dışı", "Ends {{offerEndDate}}": "{{offerEndDate}} tarihinde bitiyor", - "Enter your email address": "", - "Enter your name": "", + "Enter your email address": "E-posta adresinizi girin", + "Enter your name": "Adınızı girin", "Error": "Hata", "Expires {{expiryDate}}": "{{expiryDate}} tarihinde sona eriyor", "Forever": "Süresiz", @@ -77,15 +77,15 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Tüm bu kontrolleri tamamlamanıza rağmen hala e-posta almıyorsanız, {{supportAddress}} ile iletişime geçerek destek almak için ulaşabilirsiniz.", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "Haber bülteni göndermeye çalışırken kalıcı bir hata alınması durumunda, hesapta e-postalar devre dışı bırakılır.", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "E-posta istemcinizde {{senderEmail}} adresini kişi listenize ekleyin. Bu, posta sağlayıcınıza bu adresten gönderilen e-postaların güvenilir olması gerektiğini bildirir.", - "Invalid email address": "", - "Jamie Larson": "", - "jamie@example.com": "", + "Invalid email address": "Geçersiz e-posta adresi", + "Jamie Larson": "Ahmet Yılmaz", + "jamie@example.com": "ahmet@example.com", "Less like this": "Bunun gibi daha az", "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "E-postaların yanlışlıkla gelen kutunuzun Spam veya Promosyonlar klasörlerine düşmediğinden emin olun. Varsa, \"Spam değil olarak işaretle\" ve/veya \"Gelen kutusuna taşı\"yı tıklayın.", "Manage": "Yönet", "Maybe later": "Belki daha sonra", "Memberships unavailable, contact the owner for access.": "Üyelikler müsait değil, erişim için sahibe başvurun.", - "month": "", + "month": "ay", "Monthly": "Aylık", "More like this": "Bunun gibi daha fazla", "Name": "İsim", @@ -95,12 +95,12 @@ "Now check your email!": "Şimdi e-posta kutunu kontrol et!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Yeniden abone olduktan sonra hala e-postaları gelen kutunuzda görmüyorsanız, spam klasörünü kontrol edin. Bazı e-posta sağlayıcıları önceki spam şikayetlerini kaydedebilir ve e-postaları işaretlemeye devam edebilir. Bu durumda, en son bülteni 'Spam değil' olarak işaretleyerek ana gelen kutunuza geri taşıyabilirsiniz.", "Permanent failure (bounce)": "Kalıcı başarısızlık (sıçra)", - "Phone number": "", + "Phone number": "Telefon numarası", "Plan": "Plan", "Plan checkout was cancelled.": "Plan ödemesi iptal edildi.", "Plan upgrade was cancelled.": "Plan yükseltme iptal edildi.", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Ücretsiz aboneliğinizi ayarlamak için lütfen {{supportAddress}} ile iletişime geçin.", - "Please enter {{fieldName}}": "", + "Please enter {{fieldName}}": "Lütfen {{fieldName}} girin", "Please fill in required fields": "Lütfen gerekli alanları doldurunuz", "Price": "Fiyat", "Re-enable emails": "E-postaları yeniden etkinleştir", @@ -117,7 +117,7 @@ "Sign out": "Çıkış yap", "Sign up": "Kayıt ol", "Signup error: Invalid link": "Kayıt hatası: Geçersiz bağlantı", - "Something went wrong, please try again later.": "", + "Something went wrong, please try again later.": "Bir şeyler ters gitti, lütfen daha sonra tekrar deneyin.", "Sorry, that didn’t work.": "Üzgünüm, bu işe yaramadı.", "Spam complaints": "Spam şikayetleri", "Start {{amount}}-day free trial": "{{amount}} gün ücretsiz deneme süresini başlat", @@ -132,17 +132,17 @@ "Success! Your email is updated.": "Başarılı! E-postanız güncellendi.", "Successfully unsubscribed": "Abonelikten başarıyla çıkıldı", "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "Abone olduğunuz için teşekkür ederiz. Okumaya başlamadan önce, aşağıda keyif alabileceğiniz birkaç başka site bulunmaktadır.", - "Thank you for your support": "", - "Thank you for your support!": "", + "Thank you for your support": "Desteğiniz için teşekkür ederiz", + "Thank you for your support!": "Desteğiniz için teşekkür ederiz!", "Thanks for the feedback!": "Geri bildirim için teşekkürler!", "That didn't go to plan": "Bir şeyler ters gitti", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Sizin için kayıtlı olan e-posta adresi {{memberEmail}} — eğer bu doğru değilse, bunu güncelleyebilirsiniz.", "There was a problem submitting your feedback. Please try again a little later.": "Geri bildiriminiz gönderilirken bir sorun oluştu. Lütfen biraz sonra tekrar deneyin.", - "There was an error processing your payment. Please try again.": "", + "There was an error processing your payment. Please try again.": "Ödemeniz işlenirken bir hata oluştu. Lütfen tekrar deneyiniz.", "This site is invite-only, contact the owner for access.": "Bu site sadece davetiyesi olanlar içindir, erişim için site sahibiyle iletişime geç.", - "This site is not accepting payments at the moment.": "", + "This site is not accepting payments at the moment.": "Bu site şu anda ödeme kabul etmemektedir.", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Kaydınızı tamamlamak için gelen kutunuzdaki onay bağlantısına tıklayın. Eğer 3 dakika içinde gelmezse, spam klasörünüzü kontrol edin!", - "To continue to stay up to date, subscribe to {{publication}} below.": "", + "To continue to stay up to date, subscribe to {{publication}} below.": "Güncel kalmaya devam etmek için, aşağıdaki {{publication}} abone olun.", "Try free for {{amount}} days, then {{originalPrice}}.": "{{amount}} gün ücretsiz deneyin, ardından {{originalPrice}}.", "Unlock access to all newsletters by becoming a paid subscriber.": "Tüm bültenlere erişimi açmak için ücretli bir abone olun.", "Unsubscribe from all emails": "Tüm e-postaların aboneliğinden çık", @@ -160,7 +160,7 @@ "Welcome to {{siteTitle}}": "{{siteTitle}} hoş geldiniz", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Gelen kutusu bir e-postayı kabul etmeyi reddettiğinde, buna genellikle bir geri dönen denir. Çoğu durumda bu geçici olabilir. Ancak, bazı durumlarda, bir e-posta adresi geçersiz veya mevcut olmadığında bir geri dönen e-postası kalıcı bir başarısızlık olarak geri dönebilir.", "Why has my email been disabled?": "E-postam neden devre dışı bırakıldı?", - "year": "", + "year": "yıl", "Yearly": "Yıllık", "You currently have a free membership, upgrade to a paid subscription for full access.": "Şu anda ücretsiz üyeliğiniz var, tam erişim için ücretli aboneliğe yükseltin.", "You have been successfully resubscribed": "Başarıyla yeniden abone oldun", diff --git a/ghost/i18n/locales/tr/search.json b/ghost/i18n/locales/tr/search.json index 8902015528ff..a25204a12835 100644 --- a/ghost/i18n/locales/tr/search.json +++ b/ghost/i18n/locales/tr/search.json @@ -1,9 +1,9 @@ { - "Authors": "", - "Cancel": "", - "No matches found": "", - "Posts": "", - "Search posts, tags and authors": "", - "Show more results": "", - "Tags": "" + "Authors": "Yazarlar", + "Cancel": "İptal", + "No matches found": "Eşleşme bulunamadı", + "Posts": "Yazılar", + "Search posts, tags and authors": "Gönderileri, etiketleri ve yazarları ara", + "Show more results": "Daha fazla sonuç göster", + "Tags": "Etiketler" } diff --git a/ghost/i18n/locales/uk/comments.json b/ghost/i18n/locales/uk/comments.json index 77ef1db96936..dd151c6efec5 100644 --- a/ghost/i18n/locales/uk/comments.json +++ b/ghost/i18n/locales/uk/comments.json @@ -1,71 +1,71 @@ { - "{{amount}} characters left": "", - "{{amount}} comments": "", - "{{amount}} days ago": "", - "{{amount}} hrs ago": "", - "{{amount}} mins ago": "", - "{{amount}} months ago": "", - "{{amount}} more": "", - "{{amount}} seconds ago": "", - "{{amount}} weeks ago": "", - "{{amount}} years ago": "", - "1 comment": "", - "Add comment": "", - "Add context to your comment, share your name and expertise to foster a healthy discussion.": "", - "Add reply": "", - "Already a member?": "", - "Anonymous": "", - "Become a member of {{publication}} to start commenting.": "", - "Become a paid member of {{publication}} to start commenting.": "", - "Cancel": "", - "Comment": "", - "Complete your profile": "", - "Delete": "", - "Deleted member": "", - "Discussion": "", - "Edit": "", - "Edit this comment": "", - "edited": "", - "Enter your name": "", - "Expertise": "", - "Founder @ Acme Inc": "", - "Full-time parent": "", - "Head of Marketing at Acme, Inc": "", - "Hide": "", - "Hide comment": "", - "Jamie Larson": "", - "Join the discussion": "", - "Just now": "", - "Local resident": "", - "Member discussion": "", - "Name": "", - "Neurosurgeon": "", - "One day ago": "", - "One hour ago": "", - "One min ago": "", - "One month ago": "", - "One week ago": "", - "One year ago": "", - "Reply": "", - "Reply to comment": "", - "Report": "", - "Report comment": "", - "Report this comment?": "", - "Save": "", - "Sending": "", - "Sent": "", - "Show": "", - "Show {{amount}} more replies": "", - "Show {{amount}} previous comments": "", - "Show 1 more reply": "", - "Show 1 previous comment": "", - "Show comment": "", - "Sign in": "", - "Sign up now": "", - "Start the conversation": "", - "This comment has been hidden.": "", - "This comment has been removed.": "", - "Upgrade now": "", - "Yesterday": "", - "Your request will be sent to the owner of this site.": "" + "{{amount}} characters left": "{{amount}} символів залишилось", + "{{amount}} comments": "{{amount}} коментарів", + "{{amount}} days ago": "{{amount}} днів тому", + "{{amount}} hrs ago": "{{amount}} годин тому", + "{{amount}} mins ago": "{{amount}} хвилин тому", + "{{amount}} months ago": "{{amount}} місяців тому", + "{{amount}} more": "ще {{amount}}", + "{{amount}} seconds ago": "{{amount}} секунд тому", + "{{amount}} weeks ago": "{{amount}} тижнів тому", + "{{amount}} years ago": "{{amount}} років тому", + "1 comment": "1 коментар", + "Add comment": "Додати коментар", + "Add context to your comment, share your name and expertise to foster a healthy discussion.": "Додайте контекст до свого коментаря, поділіться своїм іменем і досвідом, щоб сприяти здоровій дискусії.", + "Add reply": "Додати відповідь", + "Already a member?": "Ви є учасником?", + "Anonymous": "Анонім", + "Become a member of {{publication}} to start commenting.": "Станьте учасником {{publication}} щоб почати коментувати.", + "Become a paid member of {{publication}} to start commenting.": "Станьте платним учасником {{publication}} щоб почати коментувати.", + "Cancel": "Відмінити", + "Comment": "Коментувати", + "Complete your profile": "Заповніть свій профіль", + "Delete": "Видалити", + "Deleted member": "Видалений учасник", + "Discussion": "Обговорення", + "Edit": "Редагувати", + "Edit this comment": "Редагувати цей коментар", + "edited": "Відредагований", + "Enter your name": "Введіть своє імʼя", + "Expertise": "Експертність", + "Founder @ Acme Inc": "Засновник @ Acme Inc", + "Full-time parent": "Виховую дітей", + "Head of Marketing at Acme, Inc": "Голова продажів в Acme, Inc", + "Hide": "Сховати", + "Hide comment": "Сховати коментар", + "Jamie Larson": "Ваше імʼя", + "Join the discussion": "Долучитися до обговорення", + "Just now": "Прямо зараз", + "Local resident": "Місцевий експерт", + "Member discussion": "Обговорення учасників", + "Name": "Імʼя", + "Neurosurgeon": "Нейрохірург", + "One day ago": "Один день тому", + "One hour ago": "Одну годину тому", + "One min ago": "Одну хвилину тому", + "One month ago": "Один місяць тому", + "One week ago": "Один тиждень тому", + "One year ago": "Один рік тому", + "Reply": "Відповісти", + "Reply to comment": "Відповісти на коментар", + "Report": "Поскаржитися", + "Report comment": "Поскаржитися на коментар", + "Report this comment?": "Поскаржитися на цей коментар?", + "Save": "Зберегти", + "Sending": "Відправка", + "Sent": "Відправлено", + "Show": "Показати", + "Show {{amount}} more replies": "Показати ще {{amount}} відповідей", + "Show {{amount}} previous comments": "Показати {{amount}} попередніх коментарів", + "Show 1 more reply": "Показати ще одну відповідь", + "Show 1 previous comment": "Показати один попередній коментар", + "Show comment": "Показати коментар", + "Sign in": "Увійти", + "Sign up now": "Зареєструватись зараз", + "Start the conversation": "Почніть розмову", + "This comment has been hidden.": "Цей коментар було приховано.", + "This comment has been removed.": "Цей коментар було видалено.", + "Upgrade now": "Оновити зараз", + "Yesterday": "Вчора", + "Your request will be sent to the owner of this site.": "Ваш запит буде надіслано власнику цього сайту." } diff --git a/ghost/i18n/locales/uk/ghost.json b/ghost/i18n/locales/uk/ghost.json index c4e18118bf56..b8fe2536cb8c 100644 --- a/ghost/i18n/locales/uk/ghost.json +++ b/ghost/i18n/locales/uk/ghost.json @@ -1,34 +1,34 @@ { "All the best!": "Всього найкращого!", - "Complete signup for {{siteTitle}}!": "", - "Complete your sign up to {{siteTitle}}!": "Закінч реєстрацію на {{siteTitle}}!", - "Confirm email address": "", - "Confirm signup": "", - "Confirm your email address": "", - "Confirm your email update for {{siteTitle}}!": "Підтвердь оновлення електронної пошти для {{siteTitle}}!", - "Confirm your subscription to {{siteTitle}}": "Підтвердь підписку на {{siteTitle}}", - "For your security, the link will expire in 24 hours time.": "Для твоєї безпеки, посилання буде дійсним протягом 24 годин.", + "Complete signup for {{siteTitle}}!": "Завершіть реєстрацію для {{siteTitle}}!", + "Complete your sign up to {{siteTitle}}!": "Завершіть вашу реєстрацію для {{siteTitle}}!", + "Confirm email address": "Підтвердити електронну пошту", + "Confirm signup": "Підтвердити реєстрацію", + "Confirm your email address": "Підтвердити вашу електронну пошту", + "Confirm your email update for {{siteTitle}}!": "Підтвердь оновлення вашої електронної пошти для {{siteTitle}}!", + "Confirm your subscription to {{siteTitle}}": "Підтвердь вашу підписку на {{siteTitle}}", + "For your security, the link will expire in 24 hours time.": "Для вашої безпеки, посилання буде дійсним протягом 24 годин.", "Hey there,": "Привіт,", - "Hey there!": "", + "Hey there!": "Привіт!", "If you did not make this request, you can safely ignore this email.": "Якщо цей запит не був зроблений тобою, можеш безпечно ігнорувати це повідомлення.", "If you did not make this request, you can simply delete this message.": "Якщо цей запит не був зроблений тобою, можеш просто видалити це повідомлення.", "Please confirm your email address with this link:": "Будь ласка, підтвердь свою електронну пошту за допомогою цього посилання:", "Secure sign in link for {{siteTitle}}": "Безпечне посилання для входу до {{siteTitle}}", "See you soon!": "До зустрічі!", "Sent to {{email}}": "Відправлено на {{email}}", - "Sign in": "", + "Sign in": "Вхід", "Sign in to {{siteTitle}}": "Увійти до {{siteTitle}}", "Tap the link below to complete the signup process for {{siteTitle}}, and be automatically signed in:": "Натисни посилання нижче, щоб завершити процес реєстрації на {{siteTitle}} і автоматично увійти:", "Thank you for signing up to {{siteTitle}}!": "Дякуємо за реєстрацію на {{siteTitle}}!", "Thank you for subscribing to {{siteTitle}}!": "Дякуємо за підписку на {{siteTitle}}!", - "Thank you for subscribing to {{siteTitle}}.": "", - "Thank you for subscribing to {{siteTitle}}. Tap the link below to be automatically signed in:": "Дякуємо за підписку на {{siteTitle}}. Натисни посилання нижче, щоб автоматично увійти:", + "Thank you for subscribing to {{siteTitle}}.": "Дякуємо за підписку на {{siteTitle}}.", + "Thank you for subscribing to {{siteTitle}}. Tap the link below to be automatically signed in:": "Дякуємо за підписку на {{siteTitle}}. Натисніть посилання нижче, щоб автоматично увійти:", "This email address will not be used.": "Ця електронна пошта не буде використовуватися.", - "Welcome back to {{siteTitle}}!": "Ласкаво просимо до {{siteTitle}}!", - "Welcome back! Use this link to securely sign in to your {{siteTitle}} account:": "Ласкаво просимо! Ужий це посилання, щоб безпечно увійти до свого облікового запису {{siteTitle}}:", - "You can also copy & paste this URL into your browser:": "Можеш також скопіювати та вставити це посилання в свій браузер:", - "You will not be signed up, and no account will be created for you.": "Не відбудеться твоя реєстрація, і жоден обліковий запис не буде створений для тебе.", + "Welcome back to {{siteTitle}}!": "З поверненням до {{siteTitle}}!", + "Welcome back! Use this link to securely sign in to your {{siteTitle}} account:": "З поверненням! Використовуйте це посилання, щоб безпечно увійти до свого облікового запису {{siteTitle}}:", + "You can also copy & paste this URL into your browser:": "Можете також скопіювати та вставити це посилання в свій браузер:", + "You will not be signed up, and no account will be created for you.": "Вас не буде зареєстровано, а також обліковий запис не буде створено для вас.", "You will not be subscribed.": "Тебе не буде підписано.", - "You're one tap away from subscribing to {{siteTitle}} — please confirm your email address with this link:": "Ти один натиск від підписки на {{siteTitle}} — будь ласка, підтвердь свою електронну пошту за допомогою цього посилання:", - "You're one tap away from subscribing to {{siteTitle}}!": "" + "You're one tap away from subscribing to {{siteTitle}} — please confirm your email address with this link:": "Ви за один крок до підписки на {{siteTitle}} — будь ласка, підтвердь свою електронну пошту за допомогою цього посилання:", + "You're one tap away from subscribing to {{siteTitle}}!": "Ви за один крок до підписки на {{siteTitle}}!" } diff --git a/ghost/i18n/locales/uk/portal.json b/ghost/i18n/locales/uk/portal.json index 067af7133058..1bbc97989800 100644 --- a/ghost/i18n/locales/uk/portal.json +++ b/ghost/i18n/locales/uk/portal.json @@ -1,177 +1,177 @@ { - "(save {{highestYearlyDiscount}}%)": "", - "{{amount}} days free": "", - "{{amount}} off": "", - "{{amount}} off for first {{number}} months.": "", - "{{amount}} off for first {{period}}.": "", - "{{amount}} off forever.": "", + "(save {{highestYearlyDiscount}}%)": "(зекономте {{highestYearlyDiscount}}%)", + "{{amount}} days free": "{{amount}} днів безкоштовно", + "{{amount}} off": "Знижка {{amount}}", + "{{amount}} off for first {{number}} months.": "Знижка {{amount}} для перших {{number}} місяців.", + "{{amount}} off for first {{period}}.": "Знижка {{amount}} для першого {{period}}.", + "{{amount}} off forever.": "Знижка {{amount}} назавжди.", "{{discount}}% discount": "Знижка {{discount}}%", - "{{memberEmail}} will no longer receive {{newsletterName}} newsletter.": "", - "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "", - "{{memberEmail}} will no longer receive this newsletter.": "", + "{{memberEmail}} will no longer receive {{newsletterName}} newsletter.": "{{memberEmail}} більше не отримуватиме розсилку {{newsletterName}}.", + "{{memberEmail}} will no longer receive emails when someone replies to your comments.": "{{memberEmail}} більше не отримуватиме електронні листи, коли хтось відповідає на ваші коментарі.", + "{{memberEmail}} will no longer receive this newsletter.": "{{memberEmail}} більше не отримуватиме цю розсилку.", "{{trialDays}} days free": "Безплатно {{trialDays}} дні(-в)", - "+1 (123) 456-7890": "", - "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Посилання для входу було надіслано на твою пошту. Якщо воно не прийде протягом 3 хвилин, перевірь папку спам.", + "+1 (123) 456-7890": "+1 (123) 456-7890", + "A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "Посилання для входу було надіслано на твою пошту. Якщо воно не прийде протягом 3 хвилин, перевірь папку зі спамом.", "Account": "Oбліковий запис", "Account settings": "Налаштування облікового запису", "After a free trial ends, you will be charged the regular price for the tier you've chosen. You can always cancel before then.": "Після закінчення безплатного періоду, з тебе буде стягнена вартість за обраний тариф. Ти завжди можеш скасувати послугу до цього часу.", - "Already a member?": "Вже зареєстрований?", - "An unexpected error occured. Please try again or contact support if the error persists.": "", + "Already a member?": "Вже є учасником?", + "An unexpected error occured. Please try again or contact support if the error persists.": "Сталася неочікувана помилка. Спробуйте ще раз або зв’яжіться зі службою підтримки, якщо помилка не зникне.", "Back": "Назад", "Back to Log in": "Повернутись до входу", - "Billing info": "", - "Black Friday": "", - "Cancel anytime.": "", + "Billing info": "Платіжна інформація", + "Black Friday": "Чорна п`ятниця", + "Cancel anytime.": "Скасуй будь-коли.", "Cancel subscription": "Скасуй підписку", "Cancellation reason": "Причина скасування", - "Change": "", - "Change plan": "", - "Check spam & promotions folders": "", - "Check with your mail provider": "", - "Choose": "", - "Choose a different plan": "Вибари інший план", - "Choose a plan": "", - "Choose your newsletters": "Вибери свої підписки", - "Click here to retry": "", - "Close": "Закрий", + "Change": "Змінити", + "Change plan": "Змінити план", + "Check spam & promotions folders": "Перевірте папки зі спамом і рекламними акціями", + "Check with your mail provider": "Зверніться до свого постачальника послуг електронної пошти", + "Choose": "Оберіть", + "Choose a different plan": "Оберіть інший план", + "Choose a plan": "Оберіть план", + "Choose your newsletters": "Оберіть свої підписки", + "Click here to retry": "Натисніть тут, щоб повторити спробу", + "Close": "Закрити", "Comments": "Коментарі", - "Complimentary": "", + "Complimentary": "Безкоштовно", "Confirm": "Підтвердь", - "Confirm cancellation": "", - "Confirm subscription": "", - "Contact support": "", - "Continue": "Далі", - "Continue subscription": "", - "Could not sign in. Login link expired.": "", - "Could not update email! Invalid link.": "", - "Create a new contact": "", - "Current plan": "", + "Confirm cancellation": "Підтвердити скасусання", + "Confirm subscription": "Підтвердити підписку", + "Contact support": "Звернутись до служби підтримки", + "Continue": "Продовжити", + "Continue subscription": "Продовжити підписку", + "Could not sign in. Login link expired.": "Неможливо увійти. Термін дії посилання для входу закінчився.", + "Could not update email! Invalid link.": "Неможливо оновити електронну адресу! Недійсне посилання.", + "Create a new contact": "Створити новий контакт", + "Current plan": "Поточний план", "Delete account": "Видалити обліковий запис", - "Didn't mean to do this? Manage your preferences .": "", + "Didn't mean to do this? Manage your preferences .": "Ви не хотіли цього робити? Керуйте своїми параметрами .", "Don't have an account?": "Не маєш облікового запису?", - "Edit": "", + "Edit": "Редагувати", "Email": "Електронна пошта", - "Email newsletter": "", + "Email newsletter": "Електронна розсилка", "Email preferences": "Налаштування електронної пошти", "Emails": "Електронні листи", "Emails disabled": "Електронна пошта вимкнена", - "Ends {{offerEndDate}}": "", - "Enter your email address": "", - "Enter your name": "", - "Error": "", - "Expires {{expiryDate}}": "", - "Forever": "", - "Free Trial – Ends {{trialEnd}}": "", + "Ends {{offerEndDate}}": "Закунчується {{offerEndDate}}", + "Enter your email address": "Введіть свій імейл", + "Enter your name": "Введіть імʼя", + "Error": "Помилка", + "Expires {{expiryDate}}": "Термін дії закінчується {{expiryDate}}", + "Forever": "Назавжди", + "Free Trial – Ends {{trialEnd}}": "Безкоштовна пробна версія – закінчується {{trialEnd}}", "Get help": "Отримати допомогу", - "Get in touch for help": "", - "Get notified when someone replies to your comment": "Повідомляй коли хтось відповість на твій коментар", + "Get in touch for help": "Звертайтесь по допомогу", + "Get notified when someone replies to your comment": "Отримувати повідомлення коли хтось відповість на твій коментар", "Give feedback on this post": "Дати відгук на цю публікацію", - "Help! I'm not receiving emails": "", - "Here are a few other sites you may enjoy.": "", - "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "", - "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "", - "If you cancel your subscription now, you will continue to have access until {{periodEnd}}.": "", - "If you have a corporate or government email account, reach out to your IT department and ask them to allow emails to be received from {{senderEmail}}": "", - "If you would like to start receiving emails again, the best next steps are to check your email address on file for any issues and then click resubscribe on the previous screen.": "", - "If you're not receiving the email newsletter you've subscribed to, here are a few things to check.": "", - "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "", - "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "", - "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "", - "Invalid email address": "", - "Jamie Larson": "", - "jamie@example.com": "", + "Help! I'm not receiving emails": "Допоможіть! Я не отримую електронні листи", + "Here are a few other sites you may enjoy.": "Ось кілька інших сайтів, які можуть вам сподобатися.", + "If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "Якщо розсилку позначено як спам, електронні листи для цієї адреси автоматично вимикаються, щоб ви більше не отримували небажаних повідомлень.", + "If the spam complaint was accidental, or you would like to begin receiving emails again, you can resubscribe to emails by clicking the button on the previous screen.": "Якщо скарга на спам була випадковою або ви хочете знову отримувати електронні листи, ви можете знову підписатися на електронні листи, натиснувши кнопку на попередньому екрані.", + "If you cancel your subscription now, you will continue to have access until {{periodEnd}}.": "Якщо ви скасуєте свою підписку зараз, ви матимете доступ до {{periodEnd}}.", + "If you have a corporate or government email account, reach out to your IT department and ask them to allow emails to be received from {{senderEmail}}": "Якщо у вас є корпоративний або державний обліковий запис електронної пошти, зверніться до свого ІТ-відділу та попросіть їх дозволити отримувати електронні листи від {{senderEmail}}", + "If you would like to start receiving emails again, the best next steps are to check your email address on file for any issues and then click resubscribe on the previous screen.": "Якщо ви хочете знову почати отримувати електронні листи, найкращим наступним кроком буде перевірити свою адресу електронної пошти на наявність проблем, а потім на попередньому екрані натиснути Підписатися знову.", + "If you're not receiving the email newsletter you've subscribed to, here are a few things to check.": "Якщо ви не отримуєте розсилку електронною поштою, на яку підписалися, то ось декілька речей щоб перевірити.", + "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "Якщо ви виконали всі ці перевірки, але досі не отримуєте електронних листів, ви можете звернутись до нас по допомогу, зв’язавшись з {{supportAddress}}.", + "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "Якщо під час спроби надсилання розсилки виникає постійна помилка, електронні листи в обліковому записі буде вимкнено.", + "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "У своєму поштовому клієнті додайте {{senderEmail}} до списку контактів. Це сигналізує вашому постачальнику послуг електронної пошти, що листам, надісланим із цієї адреси, слід довіряти.", + "Invalid email address": "Недійсна адреса електронної пошти", + "Jamie Larson": "Джеймі Ларсон", + "jamie@example.com": "jamie@example.com", "Less like this": "Менше подібних", - "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "", - "Manage": "Управління", - "Maybe later": "", - "Memberships unavailable, contact the owner for access.": "", - "month": "", - "Monthly": "Місячно", + "Make sure emails aren't accidentally ending up in the Spam or Promotions folders of your inbox. If they are, click on \"Mark as not spam\" and/or \"Move to inbox\".": "Переконайтеся, що електронні листи випадково не потрапляють у папку \"Спам\" або \"Реклама\" вашої папки \"Вхідні\". Якщо вони так і є, натисніть \"Позначити як не спам\" і/або \"Перемістити до вхідних\".", + "Manage": "Керувати", + "Maybe later": "Можливо пізніше", + "Memberships unavailable, contact the owner for access.": "Членство недоступне, зв’яжіться з власником, щоб отримати доступ.", + "month": "Місяць", + "Monthly": "Щомісяця", "More like this": "Більше подібних", "Name": "Ім'я", - "Need more help? Contact support": "", - "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "", + "Need more help? Contact support": "Потрібна допомога? Зверніться до служби підтримки", + "Newsletters can be disabled on your account for two reasons: A previous email was marked as spam, or attempting to send an email resulted in a permanent failure (bounce).": "Розсилки можуть бути вимкнені у вашому обліковому записі з двох причин: попередній електронний лист було позначено як спам або спроба надіслати електронний лист призвела до збою (чи відмови).", "Not receiving emails?": "Не приходять листи?", "Now check your email!": "А тепер перевір свою пошту!", - "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "", - "Permanent failure (bounce)": "", - "Phone number": "", - "Plan": "", - "Plan checkout was cancelled.": "", - "Plan upgrade was cancelled.": "", - "Please contact {{supportAddress}} to adjust your complimentary subscription.": "", - "Please enter {{fieldName}}": "", - "Please fill in required fields": "", + "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "Якщо після повторної підписки ви все ще не бачите електронних листів у папці \"Вхідні\", перевірте папку зі спамом. Деякі постачальники вхідних повідомлень реєструють попередні скарги на спам і продовжуватимуть позначати електронні листи. Якщо це станеться, позначте устанню розсилку як \"Не спам\", щоб повернути його до основної папки \"Вхідні\".", + "Permanent failure (bounce)": "Постійний збій (відмова)", + "Phone number": "Номер телефона", + "Plan": "План", + "Plan checkout was cancelled.": "Оформлення плану скасовано.", + "Plan upgrade was cancelled.": "Оновлення плану скасовано.", + "Please contact {{supportAddress}} to adjust your complimentary subscription.": "Будь ласка, зв’яжіться з {{supportAddress}}, щоб налаштувати безкоштовну підписку.", + "Please enter {{fieldName}}": "Будь ласка, введіть {{fieldName}}", + "Please fill in required fields": "Будь ласка, заповніть обов'язкові поля", "Price": "Ціна", "Re-enable emails": "Знову включити пошту", - "Recommendations": "", - "Renews at {{price}}.": "", + "Recommendations": "Рекомендації", + "Renews at {{price}}.": "Поновлення за {{price}}.", "Retry": "Повтори спробу", - "Save": "Збережи", - "Send an email and say hi!": "", - "Send an email to {{senderEmail}} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "", + "Save": "Зберегти", + "Send an email and say hi!": "Надішліть електронний лист і привітайтеся!", + "Send an email to {{senderEmail}} and say hello. This can also help signal to your mail provider that emails to and from this address should be trusted.": "Надішліть електронний лист на адресу {{senderEmail}} і привітайтеся. Це також може допомогти повідомити вашому постачальнику послуг електронної пошти, що електронні листи на цю адресу та з неї слід довіряти.", "Sending login link...": "Відправляється посилання для входу...", "Sending...": "Відправляється...", - "Show all": "", + "Show all": "Показати все", "Sign in": "Вхід", - "Sign out": "", + "Sign out": "Вихід", "Sign up": "Реєстрація", - "Signup error: Invalid link": "", - "Something went wrong, please try again later.": "", - "Sorry, that didn’t work.": "", - "Spam complaints": "", + "Signup error: Invalid link": "Помилка реєстрації: недійсне посилання", + "Something went wrong, please try again later.": "Щось пішло не так, спробуйте пізніше.", + "Sorry, that didn’t work.": "Вибачте, це не спрацювало.", + "Spam complaints": "Скарги на спам", "Start {{amount}}-day free trial": "Почни {{amount}}-денний безплатний період", - "Starting {{startDate}}": "", - "Starting today": "", - "Submit feedback": "Вишли відгук", - "Subscribe": "", - "Subscribed": "", - "Success": "", - "Success! Check your email for magic link to sign-in.": "", - "Success! Your account is fully activated, you now have access to all content.": "", - "Success! Your email is updated.": "", + "Starting {{startDate}}": "Починаючи з {{startDate}}", + "Starting today": "Починаючи з сьогоднішнього дня", + "Submit feedback": "Надіслати відгук", + "Subscribe": "Підписатися", + "Subscribed": "Підписаний", + "Success": "Успіх", + "Success! Check your email for magic link to sign-in.": "Успіх! Перевірте свою електронну пошту на наявність посилання для входу.", + "Success! Your account is fully activated, you now have access to all content.": "Успіх! Ваш обліковий запис повністю активовано, тепер ви маєте доступ до всього вмісту.", + "Success! Your email is updated.": "Успіх! Ваша електронна адреса оновлена.", "Successfully unsubscribed": "Підписку успішно скасовано", - "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "", - "Thank you for your support": "", - "Thank you for your support!": "", + "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "Дякуємо за підписку. Перш ніж почати читати, нижче наведено кілька інших сайтів, які можуть вам сподобатися.", + "Thank you for your support": "Дякуємо за вашу підтримку", + "Thank you for your support!": "Дякуємо за підтримку!", "Thanks for the feedback!": "Дякуємо за відгук!", "That didn't go to plan": "Щось пішло не так", - "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "", - "There was a problem submitting your feedback. Please try again a little later.": "", - "There was an error processing your payment. Please try again.": "", + "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "Адреса електронної пошти, яку є внас — {{memberEmail}} — якщо вона не вірна, ви можете оновити її в .", + "There was a problem submitting your feedback. Please try again a little later.": "Під час надсилання відгуку виникла проблема. Спробуйте ще раз трохи пізніше.", + "There was an error processing your payment. Please try again.": "Під час обробки вашого платежу сталася помилка. Спробуйте ще раз.", "This site is invite-only, contact the owner for access.": "Цей сайт доступний тільки за запрошенням, звернись до власника сайта для доступу.", - "This site is not accepting payments at the moment.": "", + "This site is not accepting payments at the moment.": "Цей сайт на даний момент не приймає платежі.", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Щоб завершити реєстрацію, натисни посилання в своїй електронній пошті для підтвердження. Якщо електронний лист не прийде протягом 3 хвилин, перевір папку спам!", - "To continue to stay up to date, subscribe to {{publication}} below.": "", - "Try free for {{amount}} days, then {{originalPrice}}.": "", - "Unlock access to all newsletters by becoming a paid subscriber.": "", + "To continue to stay up to date, subscribe to {{publication}} below.": "Щоб і надалі бути в курсі подій, підпишіться на {{publication}}.", + "Try free for {{amount}} days, then {{originalPrice}}.": "Спробуйте безкоштовно протягом {{amount}} днів, надалі за {{originalPrice}}.", + "Unlock access to all newsletters by becoming a paid subscriber.": "Розблокуйте доступ до всіх розсилок, ставши платним підписником.", "Unsubscribe from all emails": "Відписатись від усіх листів", - "Unsubscribed": "", - "Unsubscribed from all emails.": "", + "Unsubscribed": "Скасував підписку", + "Unsubscribed from all emails.": "Скасував підписку на всі листи.", "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "Відписка від листів не скасує твою платну підписку на {{title}}", - "Update": "", + "Update": "Оновити", "Update your preferences": "Онови свої налаштування", - "Verification link sent, check your inbox": "", - "Verify your email address is correct": "", - "View plans": "", - "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "Ми не можемо відписати тебе, оскільки адреса електронної пошти не знайдена. Будь ласка, зв'яжись з власником сайту.", - "Welcome back, {{name}}!": "", - "Welcome back!": "", - "Welcome to {{siteTitle}}": "", - "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "", - "Why has my email been disabled?": "", - "year": "", - "Yearly": "Річно", - "You currently have a free membership, upgrade to a paid subscription for full access.": "", - "You have been successfully resubscribed": "Тебе успішно підписано знову", - "You're currently not receiving emails": "", - "You're not receiving emails": "", - "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Не приходять листи, оскільки останній отриманий лист був тобою позначений як спам, або листи не можуть бути доставлені на твою адресу електронної пошти.", - "You've successfully signed in.": "", - "You've successfully subscribed to": "", - "Your account": "Твій обліковий запис", - "Your input helps shape what gets published.": "Твій відгук допоможе вирішити що публікувати далі.", - "Your subscription will expire on {{expiryDate}}": "", - "Your subscription will renew on {{renewalDate}}": "", - "Your subscription will start on {{subscriptionStart}}": "" + "Verification link sent, check your inbox": "Посилання для підтвердження надіслано, перевірте свою поштову скриньку", + "Verify your email address is correct": "Переконайтеся, що ваша електронна адреса правильна", + "View plans": "Переглянути плани", + "We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "Ми не можемо вас відписати, оскільки адреса електронної пошти не знайдена. Будь ласка, зв'яжись з власником сайту.", + "Welcome back, {{name}}!": "З поверненням, {{name}}!", + "Welcome back!": "З поверненням!", + "Welcome to {{siteTitle}}": "Вітаємо на {{siteTitle}}", + "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Коли скринька \"Вхідні\" не може прийняти електронний лист, це зазвичай називають відмовою. У багатьох випадках це може бути тимчасовим. Однак у деяких випадках відхилений електронний лист може бути повернуто як постійна помилка, якщо адреса електронної пошти недійсна або не існує.", + "Why has my email been disabled?": "Чому мою електронну пошту вимкнено?", + "year": "Рік", + "Yearly": "Щорічно", + "You currently have a free membership, upgrade to a paid subscription for full access.": "Наразі у вас є безкоштовне членство, перейдіть на платну підписку для повного доступу.", + "You have been successfully resubscribed": "Ви успішно повторно підписалися", + "You're currently not receiving emails": "Зараз ви не отримуєте електронних листів", + "You're not receiving emails": "Ви не отримуєте електронних листів", + "You're not receiving emails because you either marked a recent message as spam, or because messages could not be delivered to your provided email address.": "Ви не отримуєте електронні листи, тому що ви або позначили останнє повідомлення як спам, або тому, що повідомлення не можуть бути доставлені на надану вами адресу електронної пошти.", + "You've successfully signed in.": "Ви успішно увійшли.", + "You've successfully subscribed to": "Ви успішно підписалися на", + "Your account": "Ваш обліковий запис", + "Your input helps shape what gets published.": "Ваш відгук допомагає обирати що публікувати далі.", + "Your subscription will expire on {{expiryDate}}": "Термін дії вашої підписки закінчується {{expiryDate}}", + "Your subscription will renew on {{renewalDate}}": "Ваша підписка буде продовжена {{renewalDate}}", + "Your subscription will start on {{subscriptionStart}}": "Ваша підписка почне діяти {{subscriptionStart}}" } diff --git a/ghost/i18n/locales/uk/signup-form.json b/ghost/i18n/locales/uk/signup-form.json index cc957d9d0d1c..53b0422fea52 100644 --- a/ghost/i18n/locales/uk/signup-form.json +++ b/ghost/i18n/locales/uk/signup-form.json @@ -1,9 +1,9 @@ { - "Email sent": "", - "Now check your email!": "", - "Please enter a valid email address": "", - "Something went wrong, please try again.": "", - "Subscribe": "", - "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "", - "Your email address": "" + "Email sent": "Листа відправлено", + "Now check your email!": "Тепер перевірте свою поштову скриньку!", + "Please enter a valid email address": "Будь ласка, введіть коректну електронну адресу", + "Something went wrong, please try again.": "Щось пішло не так, спробуйте ще раз.", + "Subscribe": "Підписатися", + "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "Щоб завершити реєстрацію, натисніть на посилання для підтверження, яке надійде до вашої поштової скриньки. Якщо лист не надійщов впродож 3 хвилин, то перевірте каталог зі спамом!", + "Your email address": "Ваша електронна адреса" } diff --git a/ghost/i18n/locales/vi/portal.json b/ghost/i18n/locales/vi/portal.json index e41688f89553..703fe38d9aa0 100644 --- a/ghost/i18n/locales/vi/portal.json +++ b/ghost/i18n/locales/vi/portal.json @@ -25,12 +25,12 @@ "Cancel subscription": "Hủy gói", "Cancellation reason": "Lý do hủy gói", "Change": "Thay đổi", - "Change plan": "", + "Change plan": "Thay đổi gói", "Check spam & promotions folders": "Kiểm tra hộp thư spam & quảng cáo", "Check with your mail provider": "Yêu cầu nhà cung cấp dịch vụ email hỗ trợ", "Choose": "Chọn", "Choose a different plan": "Chọn gói khác", - "Choose a plan": "", + "Choose a plan": "Chọn một gói", "Choose your newsletters": "Chọn bản tin bạn muốn nhận", "Click here to retry": "Nhấn vào đây thử lại", "Close": "Đóng", @@ -85,7 +85,7 @@ "Manage": "Quản lý", "Maybe later": "Để sau", "Memberships unavailable, contact the owner for access.": "Chưa phải là thành viên, liên hệ với chủ sở hữu để truy cập.", - "month": "", + "month": "tháng", "Monthly": "Hàng tháng", "More like this": "Thích bài viết như này", "Name": "Tên", @@ -160,7 +160,7 @@ "Welcome to {{siteTitle}}": "Chào mừng tham gia {{siteTitle}}", "When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "Khi hộp thư đến không nhận được email, nó thường được gọi là email bị trả lại. Điều này có thể là tạm thời. Tuy nhiên, trong một số trường hợp, email bị trả lại có thể là lỗi vĩnh viễn nếu địa chỉ email không hợp lệ hoặc không tồn tại.", "Why has my email been disabled?": "Tại sao email của tôi bị vô hiệu hóa?", - "year": "", + "year": "năm", "Yearly": "Hàng năm", "You currently have a free membership, upgrade to a paid subscription for full access.": "Bạn đang là thành viên thường, hãy nâng cấp gói trả phí để có toàn quyền truy cập.", "You have been successfully resubscribed": "Bạn đã theo dõi lại thành công", diff --git a/ghost/i18n/locales/vi/search.json b/ghost/i18n/locales/vi/search.json index 8902015528ff..fdc1aca18e20 100644 --- a/ghost/i18n/locales/vi/search.json +++ b/ghost/i18n/locales/vi/search.json @@ -1,9 +1,9 @@ { - "Authors": "", - "Cancel": "", - "No matches found": "", - "Posts": "", - "Search posts, tags and authors": "", - "Show more results": "", - "Tags": "" + "Authors": "Tác giả", + "Cancel": "Hủy bỏ", + "No matches found": "Không tìm thấy", + "Posts": "Bài viết", + "Search posts, tags and authors": "Tìm bài viết, thẻ tag và tác giả", + "Show more results": "Xem thêm kết quả", + "Tags": "Thẻ Tag" } diff --git a/ghost/i18n/locales/zh/portal.json b/ghost/i18n/locales/zh/portal.json index 7bd035f26f7d..bdce5436ba75 100644 --- a/ghost/i18n/locales/zh/portal.json +++ b/ghost/i18n/locales/zh/portal.json @@ -1,5 +1,5 @@ { - "(save {{highestYearlyDiscount}}%)": "", + "(save {{highestYearlyDiscount}}%)": "可省{{highestYearlyDiscount}}%", "{{amount}} days free": "{{amount}}天免费", "{{amount}} off": "减免{{amount}}", "{{amount}} off for first {{number}} months.": "前{{number}}月减免{{amount}}", @@ -25,12 +25,12 @@ "Cancel subscription": "取消订阅", "Cancellation reason": "取消原因", "Change": "变更", - "Change plan": "", + "Change plan": "更改订阅方案", "Check spam & promotions folders": "检查垃圾邮件与促销邮件目录", "Check with your mail provider": "与您的邮件服务商确认", "Choose": "选择", "Choose a different plan": "选择其他订阅方案", - "Choose a plan": "", + "Choose a plan": "选择一个订阅方案", "Choose your newsletters": "选择您的刊物", "Click here to retry": "请点此处重试", "Close": "关闭", @@ -56,8 +56,8 @@ "Emails": "电子邮件列表", "Emails disabled": "关闭电子邮件列表", "Ends {{offerEndDate}}": "于{{offerEndDate}}结束", - "Enter your email address": "", - "Enter your name": "", + "Enter your email address": "输入您的电子邮箱地址", + "Enter your name": "输入您的名字", "Error": "错误", "Expires {{expiryDate}}": "于{{expiryDate}}过期", "Forever": "永久", @@ -77,7 +77,7 @@ "If you've completed all these checks and you're still not receiving emails, you can reach out to get support by contacting {{supportAddress}}.": "如果您已经完成全部检查项目却依旧没有收到邮件,您可以联系{{supportAddress}}获取支持。", "In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "当尝试发送快报时遇到永久错误,向该账户的发送邮件的功能将被禁用。", "In your email client add {{senderEmail}} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "在您的电子邮件客户端将 {{senderEmail}} 加入联系人列表。这将向您的邮件供应商表明来自该地址的邮件是可信的。", - "Invalid email address": "", + "Invalid email address": "无效的电子邮件地址", "Jamie Larson": "", "jamie@example.com": "", "Less like this": "不喜欢", @@ -95,16 +95,16 @@ "Now check your email!": "现在请检查您的电子邮件!", "Once resubscribed, if you still don't see emails in your inbox, check your spam folder. Some inbox providers keep a record of previous spam complaints and will continue to flag emails. If this happens, mark the latest newsletter as 'Not spam' to move it back to your primary inbox.": "重新订阅后在收件箱依旧没有看到邮件,请检查您的垃圾邮件箱。一些服务商会保留之前的垃圾邮件记录并持续标记。如果是这样,请将最新的快报标记为“非垃圾邮件”并将其移动到收件箱。", "Permanent failure (bounce)": "永久错误 (bounce)", - "Phone number": "", + "Phone number": "电话号码", "Plan": "订阅计划", "Plan checkout was cancelled.": "订阅付款已取消。", "Plan upgrade was cancelled.": "订阅升级已取消。", "Please contact {{supportAddress}} to adjust your complimentary subscription.": "请联系 {{supportAddress}} 调整您的免费订阅。", - "Please enter {{fieldName}}": "", + "Please enter {{fieldName}}": "请输入{{fieldName}}", "Please fill in required fields": "请填写必须项目", "Price": "价格", "Re-enable emails": "重启电子邮件", - "Recommendations": "", + "Recommendations": "推荐", "Renews at {{price}}.": "以{{price}}的价格续费。", "Retry": "重试", "Save": "保存", @@ -117,7 +117,7 @@ "Sign out": "退出", "Sign up": "注册", "Signup error: Invalid link": "注册错误:链接无效", - "Something went wrong, please try again later.": "", + "Something went wrong, please try again later.": "出了点问题,请稍后再试。", "Sorry, that didn’t work.": "抱歉,该操作无法完成。", "Spam complaints": "垃圾邮件", "Start {{amount}}-day free trial": "开始 {{amount}}-天免费试用", @@ -132,22 +132,22 @@ "Success! Your email is updated.": "成功!您的电子邮件已更新。", "Successfully unsubscribed": "成功取消订阅", "Thank you for subscribing. Before you start reading, below are a few other sites you may enjoy.": "感谢您的订阅。在开始阅读之前,以下是您可能会喜欢的一些其他网站。", - "Thank you for your support": "", - "Thank you for your support!": "", + "Thank you for your support": "感谢您的支持", + "Thank you for your support!": "感谢您的支持!", "Thanks for the feedback!": "感谢您的建议!", "That didn't go to plan": "似乎出错了", "The email address we have for you is {{memberEmail}} — if that's not correct, you can update it in your .": "您的电子邮件地址是 {{memberEmail}} - 如果该邮箱不正确,您可以在中更新它。", "There was a problem submitting your feedback. Please try again a little later.": "提交您的反馈时遇到错误。请稍后重试。", - "There was an error processing your payment. Please try again.": "", + "There was an error processing your payment. Please try again.": "您的付款处理失败,请重试。", "This site is invite-only, contact the owner for access.": "此网站仅限邀请,联系网站所有者以获取访问", - "This site is not accepting payments at the moment.": "", + "This site is not accepting payments at the moment.": "本网站目前暂不接受付款。", "To complete signup, click the confirmation link in your inbox. If it doesn't arrive within 3 minutes, check your spam folder!": "要完成注册,请点击您收件箱中的确认链接。如果在3分钟内没有收到,请检查一下您的垃圾邮件文件夹!", - "To continue to stay up to date, subscribe to {{publication}} below.": "", + "To continue to stay up to date, subscribe to {{publication}} below.": "如需持续获取最新资讯,请在下方订阅{{publication}}", "Try free for {{amount}} days, then {{originalPrice}}.": "{{amount}}天免费试用,之后{{originalPrice}}。", "Unlock access to all newsletters by becoming a paid subscriber.": "成为付费订阅用户以解锁全部快报。", "Unsubscribe from all emails": "取消所有邮件订阅", - "Unsubscribed": "取消订阅", - "Unsubscribed from all emails.": "", + "Unsubscribed": "已取消订阅", + "Unsubscribed from all emails.": "已取消所有邮件订阅", "Unsubscribing from emails will not cancel your paid subscription to {{title}}": "取消邮件订阅不会取消您对 {{title}} 的付费订阅。", "Update": "更新", "Update your preferences": "更新您的偏好设置", diff --git a/ghost/i18n/locales/zh/search.json b/ghost/i18n/locales/zh/search.json index 8902015528ff..714ed6900202 100644 --- a/ghost/i18n/locales/zh/search.json +++ b/ghost/i18n/locales/zh/search.json @@ -1,9 +1,9 @@ { - "Authors": "", - "Cancel": "", - "No matches found": "", - "Posts": "", - "Search posts, tags and authors": "", - "Show more results": "", - "Tags": "" + "Authors": "作者", + "Cancel": "取消", + "No matches found": "未找到匹配项", + "Posts": "文章", + "Search posts, tags and authors": "搜索文章、标签和作者", + "Show more results": "显示更多结果", + "Tags": "标签" } diff --git a/ghost/minifier/package.json b/ghost/minifier/package.json index 6b6bc1c991de..b22ab607d9be 100644 --- a/ghost/minifier/package.json +++ b/ghost/minifier/package.json @@ -28,7 +28,7 @@ "@tryghost/errors": "1.3.5", "@tryghost/tpl": "0.1.32", "csso": "5.0.5", - "terser": "5.33.0", + "terser": "5.34.1", "tiny-glob": "0.2.9" } } diff --git a/ghost/tinybird/datasources/analytics_pages_mv.datasource b/ghost/tinybird/datasources/analytics_pages_mv.datasource index b30065e9466c..38a375775873 100644 --- a/ghost/tinybird/datasources/analytics_pages_mv.datasource +++ b/ghost/tinybird/datasources/analytics_pages_mv.datasource @@ -9,7 +9,7 @@ SCHEMA > `pathname` String, `member_status` SimpleAggregateFunction(any, String), `visits` AggregateFunction(uniq, String), - `hits` AggregateFunction(count) + `pageviews` AggregateFunction(count) ENGINE AggregatingMergeTree ENGINE_PARTITION_KEY toYYYYMM(date) diff --git a/ghost/tinybird/datasources/analytics_sessions_mv.datasource b/ghost/tinybird/datasources/analytics_sessions_mv.datasource index 56bb05b00336..c1efa7c20799 100644 --- a/ghost/tinybird/datasources/analytics_sessions_mv.datasource +++ b/ghost/tinybird/datasources/analytics_sessions_mv.datasource @@ -9,9 +9,9 @@ SCHEMA > `location` SimpleAggregateFunction(any, String), `source` SimpleAggregateFunction(any, String), `pathname` SimpleAggregateFunction(any, String), - `first_hit` SimpleAggregateFunction(min, DateTime), - `latest_hit` SimpleAggregateFunction(max, DateTime), - `hits` AggregateFunction(count) + `first_view` SimpleAggregateFunction(min, DateTime), + `latest_view` SimpleAggregateFunction(max, DateTime), + `pageviews` AggregateFunction(count) ENGINE AggregatingMergeTree ENGINE_PARTITION_KEY toYYYYMM(date) diff --git a/ghost/tinybird/datasources/analytics_sources_mv.datasource b/ghost/tinybird/datasources/analytics_sources_mv.datasource index 21a97f0e8ac1..740b945c7d4f 100644 --- a/ghost/tinybird/datasources/analytics_sources_mv.datasource +++ b/ghost/tinybird/datasources/analytics_sources_mv.datasource @@ -8,7 +8,7 @@ SCHEMA > `pathname` String, `member_status` SimpleAggregateFunction(any, String), `visits` AggregateFunction(uniq, String), - `hits` AggregateFunction(count) + `pageviews` AggregateFunction(count) ENGINE AggregatingMergeTree ENGINE_PARTITION_KEY toYYYYMM(date) diff --git a/ghost/tinybird/datasources/fixtures/README.md b/ghost/tinybird/datasources/fixtures/README.md index 6130978f2ad2..f32d91bbd313 100644 --- a/ghost/tinybird/datasources/fixtures/README.md +++ b/ghost/tinybird/datasources/fixtures/README.md @@ -1,5 +1,9 @@ # Datasource fixtures +## NDJSON files +These files are fixtures used for running tests + +## Schema JSON files The file mockingbird-schema.json is a schema for generating fake data using the Mockingbird CLI. The CLI is installed via npm: diff --git a/ghost/tinybird/datasources/fixtures/analytics_events.ndjson b/ghost/tinybird/datasources/fixtures/analytics_events.ndjson new file mode 100644 index 000000000000..84d1ec9873e4 --- /dev/null +++ b/ghost/tinybird/datasources/fixtures/analytics_events.ndjson @@ -0,0 +1,31 @@ +{"timestamp":"2100-01-01 01:06:15","session_id":"e5c37e25-ed9e-4940-a2be-bc49149d991a","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"AhrefsBot/7.0; +http://ahrefs.com/robot/\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://petty-queen.com\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-01 00:51:17","session_id":"1267b782-e5a1-4334-8cf6-771d72bbc28e","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"d4678fdf-824c-4d5f-a5fe-c713d409faac\",\"member_status\":\"free\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.2.1 (KHTML, like Gecko) Chrome/13.0.868.0 Safari/533.2.1\",\"locale\":\"es-ES\",\"location\":\"ES\",\"referrer\":\"\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-01 01:39:48","session_id":"1267b782-e5a1-4334-8cf6-771d72bbc28e","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"d4678fdf-824c-4d5f-a5fe-c713d409faac\",\"member_status\":\"free\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.2.1 (KHTML, like Gecko) Chrome/13.0.868.0 Safari/533.2.1\",\"locale\":\"es-ES\",\"location\":\"ES\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-01 01:21:13","session_id":"2a31286e-53b4-41da-a7fd-89d966072af5","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"df8343d2-e89d-45b7-ba12-988734efcc56\",\"member_status\":\"free\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0)\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://www.bing.com/\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-01 00:11:43","session_id":"2a31286e-53b4-41da-a7fd-89d966072af5","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"df8343d2-e89d-45b7-ba12-988734efcc56\",\"member_status\":\"free\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0)\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-02 01:19:45","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"65bacac2-8122-4ed0-a11f-ac52aa82beb0\",\"member_status\":\"paid\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://www.google.com/\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-02 00:42:56","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"65bacac2-8122-4ed0-a11f-ac52aa82beb0\",\"member_status\":\"paid\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-02 00:16:52","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"65bacac2-8122-4ed0-a11f-ac52aa82beb0\",\"member_status\":\"paid\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-03 01:01:24","session_id":"9c15f99e-c8b1-4145-a073-e7f8649d2fa4","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"4c14393f-d792-403e-bbdc-aa5af3abbdd9\",\"member_status\":\"free\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.0; rv:10.7) Gecko/20100101 Firefox/10.7.1\",\"locale\":\"en-US\",\"location\":\"US\",\"referrer\":\"https://duckduckgo.com/\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-03 00:28:09","session_id":"9c15f99e-c8b1-4145-a073-e7f8649d2fa4","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"4c14393f-d792-403e-bbdc-aa5af3abbdd9\",\"member_status\":\"free\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.0; rv:10.7) Gecko/20100101 Firefox/10.7.1\",\"locale\":\"en-US\",\"location\":\"US\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-03 01:41:44","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"f4c738bc-7327-440c-8007-6a0b306c05e3\",\"member_status\":\"free\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0\",\"locale\":\"de-DE\",\"location\":\"DE\",\"referrer\":\"https://www.bing.com/\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-03 00:53:31","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"f4c738bc-7327-440c-8007-6a0b306c05e3\",\"member_status\":\"free\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0\",\"locale\":\"de-DE\",\"location\":\"DE\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-03 00:10:19","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"f4c738bc-7327-440c-8007-6a0b306c05e3\",\"member_status\":\"free\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0\",\"locale\":\"de-DE\",\"location\":\"DE\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-03 00:51:20","session_id":"50785df1-3232-4ff7-8495-d93e06d63f5c","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"3675e750-09bf-44c9-bc3f-b9aebac37c5d\",\"member_status\":\"paid\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows NT 6.3; rv:14.7) Gecko/20100101 Firefox/14.7.1\",\"locale\":\"fr-FR\",\"location\":\"FR\",\"referrer\":\"https://search.yahoo.com/\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-03 01:34:39","session_id":"50785df1-3232-4ff7-8495-d93e06d63f5c","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"3675e750-09bf-44c9-bc3f-b9aebac37c5d\",\"member_status\":\"paid\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows NT 6.3; rv:14.7) Gecko/20100101 Firefox/14.7.1\",\"locale\":\"fr-FR\",\"location\":\"FR\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-04 00:25:39","session_id":"59478d87-ce95-40fd-a081-65d1e497bcfc","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"97c79891-2ae9-4eb2-ada8-89d2a998747d\",\"member_status\":\"paid\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 6.3) AppleWebKit/531.2.2 (KHTML, like Gecko) Chrome/31.0.808.0 Safari/531.2.2\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-04 01:10:48","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-04 00:16:10","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-04 00:00:15","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-04 01:35:41","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8\",\"member_status\":\"free\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-04 00:34:33","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8\",\"member_status\":\"free\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-04 01:54:50","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8\",\"member_status\":\"free\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-05 01:59:00","session_id":"d8e4622f-95cc-4fba-b31b-f38ff72e0975","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"75a190eb-62da-46d2-972d-a9763c954f42\",\"member_status\":\"paid\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/3.0)\",\"locale\":\"es-ES\",\"location\":\"ES\",\"referrer\":\"\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-05 01:54:03","session_id":"d8e4622f-95cc-4fba-b31b-f38ff72e0975","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"75a190eb-62da-46d2-972d-a9763c954f42\",\"member_status\":\"paid\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/3.0)\",\"locale\":\"es-ES\",\"location\":\"ES\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-05 00:29:59","session_id":"490475f1-1fb7-4672-9edd-daa1b411b5f9","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/532.2.0 (KHTML, like Gecko) Chrome/20.0.898.0 Safari/532.2.0\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://www.baidu.com/\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-05 00:47:42","session_id":"490475f1-1fb7-4672-9edd-daa1b411b5f9","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"undefined\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/532.2.0 (KHTML, like Gecko) Chrome/20.0.898.0 Safari/532.2.0\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/\",\"href\":\"https://my-ghost-site.com/\"}"} +{"timestamp":"2100-01-05 00:38:12","session_id":"490475f1-1fb7-4672-9edd-daa1b411b5f9","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/532.2.0 (KHTML, like Gecko) Chrome/20.0.898.0 Safari/532.2.0\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-06 00:51:26","session_id":"8d975128-2027-40c6-834a-972cc0293d21","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"b7e0fca6-27ce-46c0-af57-c591f20dcd51\",\"member_status\":\"free\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_7 rv:2.0; KW) AppleWebKit/537.0.1 (KHTML, like Gecko) Version/5.0.10 Safari/537.0.1\",\"locale\":\"fr-FR\",\"location\":\"FR\",\"referrer\":\"\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-06 01:28:38","session_id":"61a2896b-7cf8-4853-86a6-a0e4f87c1e21","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"6b8635fb-292f-4422-9fe4-d76cfab2ba31\",\"user-agent\":\"Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/533.1.0 (KHTML, like Gecko) Chrome/18.0.852.0 Safari/533.1.0\",\"locale\":\"en-GB\",\"location\":\"GB\",\"referrer\":\"https://search.yahoo.com/\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} +{"timestamp":"2100-01-07 01:44:10","session_id":"7f1e88e1-da8e-46df-bc69-d04fb29d603d","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:13.9) Gecko/20100101 Firefox/13.9.7\",\"locale\":\"en-US\",\"location\":\"US\",\"referrer\":\"http://wilted-tick.com\",\"pathname\":\"/about/\",\"href\":\"https://my-ghost-site.com/about/\"}"} +{"timestamp":"2100-01-07 02:23:19","session_id":"98159299-8111-4dc8-9156-bb339fe9508c","action":"page_hit","version":"1","payload":"{\"site_uuid\":\"mock_site_uuid\",\"member_uuid\":\"undefined\",\"member_status\":\"undefined\",\"post_uuid\":\"06b1b0c9-fb53-4a15-a060-3db3fde7b1dd\",\"user-agent\":\"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:13.9) Gecko/20100101 Firefox/13.9.7\",\"locale\":\"en-US\",\"location\":\"US\",\"referrer\":\"https://my-ghost-site.com\",\"pathname\":\"/blog/hello-world/\",\"href\":\"https://my-ghost-site.com/blog/hello-world/\"}"} diff --git a/ghost/tinybird/pipes/analytics_pages.pipe b/ghost/tinybird/pipes/analytics_pages.pipe index 45be1f3ef091..f72f0a7953ed 100644 --- a/ghost/tinybird/pipes/analytics_pages.pipe +++ b/ghost/tinybird/pipes/analytics_pages.pipe @@ -1,6 +1,6 @@ NODE analytics_pages_1 DESCRIPTION > - Aggregate by pathname and calculate session and hits + Aggregate by pathname and calculate session and views SQL > SELECT @@ -17,7 +17,7 @@ SQL > member_status IN ('paid', 'free', 'undefined') ) AS member_status, uniqState(session_id) AS visits, - countState() AS hits + countState() AS pageviews FROM analytics_hits GROUP BY date, device, browser, location, source, pathname, post_uuid,site_uuid diff --git a/ghost/tinybird/pipes/analytics_sessions.pipe b/ghost/tinybird/pipes/analytics_sessions.pipe index fe1b24761484..6c29b7c3dfd7 100644 --- a/ghost/tinybird/pipes/analytics_sessions.pipe +++ b/ghost/tinybird/pipes/analytics_sessions.pipe @@ -17,9 +17,9 @@ SQL > anySimpleState(location) AS location, anySimpleState(source) AS source, anySimpleState(pathname) AS pathname, - minSimpleState(timestamp) AS first_hit, - maxSimpleState(timestamp) AS latest_hit, - countState() AS hits + minSimpleState(timestamp) AS first_view, + maxSimpleState(timestamp) AS latest_view, + countState() AS pageviews FROM analytics_hits GROUP BY date, session_id, site_uuid diff --git a/ghost/tinybird/pipes/analytics_sources.pipe b/ghost/tinybird/pipes/analytics_sources.pipe index 8eb155352fe3..5e053198e07f 100644 --- a/ghost/tinybird/pipes/analytics_sources.pipe +++ b/ghost/tinybird/pipes/analytics_sources.pipe @@ -1,6 +1,6 @@ NODE analytics_sources_1 DESCRIPTION > - Aggregate by referral and calculate session and hits + Aggregate by referral and calculate session and views SQL > WITH (SELECT domainWithoutWWW(href) FROM analytics_hits LIMIT 1) AS current_domain @@ -17,7 +17,7 @@ SQL > member_status IN ('paid', 'free', 'undefined') ) AS member_status, uniqState(session_id) AS visits, - countState() AS hits + countState() AS pageviews FROM analytics_hits WHERE source != current_domain GROUP BY date, device, browser, location, source, pathname, site_uuid diff --git a/ghost/tinybird/pipes/kpis.pipe b/ghost/tinybird/pipes/kpis.pipe index de061a4f6f64..17b2d8e2bd60 100644 --- a/ghost/tinybird/pipes/kpis.pipe +++ b/ghost/tinybird/pipes/kpis.pipe @@ -62,9 +62,8 @@ SQL > ) ) as date {% end %} - where date <= now() -NODE hits +NODE pageviews DESCRIPTION > Group by sessions and calculate metrics at that level @@ -84,8 +83,8 @@ SQL > uniq(session_id) as visits, count() as pageviews, case when min(timestamp) = max(timestamp) then 1 else 0 end as is_bounce, - max(timestamp) as latest_hit_aux, - min(timestamp) as first_hit_aux + max(timestamp) as latest_view_aux, + min(timestamp) as first_view_aux from analytics_hits where toDate(timestamp) = {{ Date(date_from) }} group by toStartOfHour(timestamp), session_id, site_uuid, member_status, device, browser, location, source, pathname @@ -101,10 +100,10 @@ SQL > pathname, session_id, uniq(session_id) as visits, - countMerge(hits) as pageviews, - case when min(first_hit) = max(latest_hit) then 1 else 0 end as is_bounce, - max(latest_hit) as latest_hit_aux, - min(first_hit) as first_hit_aux + countMerge(pageviews) as pageviews, + case when min(first_view) = max(latest_view) then 1 else 0 end as is_bounce, + max(latest_view) as latest_view_aux, + min(first_view) as first_view_aux from analytics_sessions_mv where {% if defined(date_from) %} date >= {{ Date(date_from) }} @@ -132,9 +131,9 @@ SQL > pathname, uniq(session_id) as visits, sum(pageviews) as pageviews, - sum(case when latest_hit_aux = first_hit_aux then 1 else 0 end) / visits as bounce_rate, - avg(latest_hit_aux - first_hit_aux) as avg_session_sec - from hits + sum(case when latest_view_aux = first_view_aux then 1 else 0 end) / visits as bounce_rate, + avg(latest_view_aux - first_view_aux) as avg_session_sec + from pageviews group by date, site_uuid, member_status, device, browser, location, source, pathname NODE endpoint diff --git a/ghost/tinybird/pipes/top_browsers.pipe b/ghost/tinybird/pipes/top_browsers.pipe index 7e384c03dcdf..d857a9a5f4af 100644 --- a/ghost/tinybird/pipes/top_browsers.pipe +++ b/ghost/tinybird/pipes/top_browsers.pipe @@ -8,12 +8,12 @@ TOKEN "stats page" READ NODE endpoint DESCRIPTION > - Group by browser and calculate hits and visits + Group by browser and calculate views and visits SQL > % - select browser, uniqMerge(visits) as visits, countMerge(hits) as hits - from analytics_sources_mv + select browser, uniq(session_id) as visits, countMerge(pageviews) as pageviews + from analytics_sessions_mv where site_uuid = {{String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True)}} diff --git a/ghost/tinybird/pipes/top_devices.pipe b/ghost/tinybird/pipes/top_devices.pipe index 0fbc01f011f6..d7bccb165bb0 100644 --- a/ghost/tinybird/pipes/top_devices.pipe +++ b/ghost/tinybird/pipes/top_devices.pipe @@ -9,12 +9,12 @@ TOKEN "stats page" READ NODE endpoint DESCRIPTION > - Group by device and calculate hits and visits + Group by device and calculate views and visits SQL > % - select device, uniqMerge(visits) as visits, countMerge(hits) as hits - from analytics_sources_mv + select device, uniq(session_id) as visits, countMerge(pageviews) as pageviews + from analytics_sessions_mv where site_uuid = {{String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True)}} diff --git a/ghost/tinybird/pipes/top_locations.pipe b/ghost/tinybird/pipes/top_locations.pipe index 375d3182df26..d79803e63220 100644 --- a/ghost/tinybird/pipes/top_locations.pipe +++ b/ghost/tinybird/pipes/top_locations.pipe @@ -8,11 +8,11 @@ TOKEN "stats page" READ NODE endpoint DESCRIPTION > - Group by pagepath and calculate hits and visits + Group by pagepath and calculate views and visits SQL > % - select location, uniqMerge(visits) as visits, countMerge(hits) as hits + select location, uniqMerge(visits) as visits, countMerge(pageviews) as pageviews from analytics_pages_mv where site_uuid = {{String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True)}} diff --git a/ghost/tinybird/pipes/top_pages.pipe b/ghost/tinybird/pipes/top_pages.pipe index 423633df304e..935a91091c08 100644 --- a/ghost/tinybird/pipes/top_pages.pipe +++ b/ghost/tinybird/pipes/top_pages.pipe @@ -8,14 +8,14 @@ TOKEN "stats page" READ NODE endpoint DESCRIPTION > - Group by pagepath and calculate hits and visits + Group by pathname and calculate views and visits SQL > % select pathname, uniqMerge(visits) as visits, - countMerge(hits) as hits + countMerge(pageviews) as pageviews from analytics_pages_mv where site_uuid = {{String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True)}} diff --git a/ghost/tinybird/pipes/top_sources.pipe b/ghost/tinybird/pipes/top_sources.pipe index a07c7710314f..32caa3f6a1d9 100644 --- a/ghost/tinybird/pipes/top_sources.pipe +++ b/ghost/tinybird/pipes/top_sources.pipe @@ -9,11 +9,11 @@ TOKEN "stats page" READ NODE endpoint DESCRIPTION > - Group by source and calculate hits and visits + Group by source and calculate views and visits SQL > % - select source, uniqMerge(visits) as visits, countMerge(hits) as hits + select source, uniqMerge(visits) as visits, countMerge(pageviews) as pageviews from analytics_sources_mv where site_uuid = {{String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True)}} diff --git a/ghost/tinybird/pipes/trend.pipe b/ghost/tinybird/pipes/trend.pipe index fafbfcf591c2..e333b461db6d 100644 --- a/ghost/tinybird/pipes/trend.pipe +++ b/ghost/tinybird/pipes/trend.pipe @@ -15,7 +15,7 @@ SQL > select addMinutes(toStartOfMinute(start), number) as t from (select arrayJoin(range(1, 31)) as number) -NODE hits +NODE visits DESCRIPTION > Get last 30 minutes metrics gropued by minute @@ -37,4 +37,4 @@ DESCRIPTION > Join and generate timeseries with metrics for the last 30 minutes SQL > - select a.t, b.visits from timeseries a left join hits b on a.t = b.t order by a.t + select a.t, b.visits from timeseries a left join visits b on a.t = b.t order by a.t diff --git a/ghost/tinybird/scripts/branch_and_test.sh b/ghost/tinybird/scripts/branch_and_test.sh new file mode 100755 index 000000000000..5fc948986746 --- /dev/null +++ b/ghost/tinybird/scripts/branch_and_test.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# Get the directory where this script is located +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Create a branch and test it + +## Create a variable with a timestamp to use as a random name for the branch +BRANCH_NAME="TEST_$(date +%s)" + +tb branch create $BRANCH_NAME + +# Run the scripts using their full paths +"$SCRIPT_DIR/append_fixtures.sh" +"$SCRIPT_DIR/exec_test.sh" + +tb branch rm $BRANCH_NAME --yes diff --git a/ghost/tinybird/scripts/exec_test.sh b/ghost/tinybird/scripts/exec_test.sh index 50571d952db8..af6fb20b59e5 100755 --- a/ghost/tinybird/scripts/exec_test.sh +++ b/ghost/tinybird/scripts/exec_test.sh @@ -1,9 +1,48 @@ - #!/usr/bin/env bash -set -euxo pipefail +set -euo pipefail export TB_VERSION_WARNING=0 +# Get the expected count once, outside of any function +ndjson_file="./datasources/fixtures/analytics_events.ndjson" +export expected_count=$(wc -l < "$ndjson_file" || echo "0") + +check_sum() { + local file=$1 + local expected_count=$2 + + # Only perform the check if the file starts with "all_" + if [[ ! $(basename "$file") =~ ^all_ ]]; then + return 0 + fi + + local sum=0 + local column_name="" + + # Determine if the file has a 'pageviews' column + if head -n1 "$file" | grep -q 'pageviews'; then + column_name="pageviews" + else + echo "No 'pageviews' column found in $file" + return 0 # No relevant column found, skip the check + fi + + # Get the column number + local column_num=$(head -n1 "$file" | tr ',' '\n' | grep -n "$column_name" | cut -d: -f1) + + # Sum the values in the column + sum=$(tail -n +2 "$file" | cut -d',' -f"$column_num" | awk '{s+=$1} END {print s}') + + # Check if the sum equals the number of lines in the NDJSON file + if [ "$sum" -eq "$expected_count" ]; then + echo "✅ Sanity check passed: Sum of $column_name is $sum (matches NDJSON line count)" + return 0 + else + echo "🚨 Sanity check failed: Sum of $column_name is $sum, expected $expected_count (NDJSON line count)" + return 1 + fi +} + run_test() { t=$1 echo "** Running $t **" @@ -15,7 +54,7 @@ run_test() { # When appending fixtures, we need to retry in case of the data is not replicated in time while [ $retries -lt $TOTAL_RETRIES ]; do # Run the test and store the output in a temporary file - bash $t $2 >$tmpfile + bash $t >$tmpfile exit_code=$? if [ "$exit_code" -eq 0 ]; then # If the test passed, break the loop @@ -33,6 +72,7 @@ run_test() { if diff -B ${t}.result $tmpfile >/dev/null 2>&1; then echo "✅ Test $t passed" + check_sum ${t}.result $expected_count || return 1 rm $tmpfile return 0 elif [ $retries -eq $TOTAL_RETRIES ]; then @@ -49,10 +89,26 @@ run_test() { echo "" } export -f run_test +export -f check_sum fail=0 -find ./tests -name "*.test" -print0 | xargs -0 -I {} -P 4 bash -c 'run_test "$@"' _ {} || fail=1 + +# Check if a test name was provided as an argument +if [ $# -eq 1 ]; then + test_name=$1 + # Find the test file that matches the provided name + test_file=$(find ./tests -name "${test_name}*.test") + if [ -n "$test_file" ]; then + run_test "$test_file" || fail=1 + else + echo "🚨 ERROR: No test found matching name: $test_name" + fail=1 + fi +else + # If no test name provided, run all tests + find ./tests -name "*.test" -print0 | xargs -0 -I {} bash -c 'run_test "$@"' _ {} || fail=1 +fi if [ $fail == 1 ]; then - exit -1; + exit 1 fi diff --git a/ghost/tinybird/scripts/gen_test_results.sh b/ghost/tinybird/scripts/gen_test_results.sh new file mode 100755 index 000000000000..836d4a3fd5ff --- /dev/null +++ b/ghost/tinybird/scripts/gen_test_results.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Directory containing the test files +TEST_DIR="./tests" + +# Function to execute a test and update its result file +execute_and_update() { + local test_file="$1" + local result_file="${test_file%.test}.test.result" + + echo "Executing test: $test_file" + + # Execute the test command and capture the output + output=$(bash "$test_file") + + # Write the output to the result file, overwriting existing content + echo "$output" > "$result_file" + + echo "Updated result file: $result_file" + echo "------------------------" +} + +# Main execution +echo "Starting test result regeneration..." + +# Find all .test files and process them +find "$TEST_DIR" -name "*.test" -type f | while read -r test_file; do + execute_and_update "$test_file" +done + +echo "Test result regeneration complete." diff --git a/ghost/tinybird/scripts/unsafe_redeploy.sh b/ghost/tinybird/scripts/unsafe_redeploy.sh old mode 100644 new mode 100755 index 59d447f2b83e..6e490dab9a28 --- a/ghost/tinybird/scripts/unsafe_redeploy.sh +++ b/ghost/tinybird/scripts/unsafe_redeploy.sh @@ -1,3 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Check if --force flag is provided +force=false +if [[ "$@" == *"--force"* ]]; then + force=true +fi + +# Get current branch info +branch_info=$(tb branch current) + +# Check if 'main' and 'production_stats' are both present in the output +if echo "$branch_info" | grep -q "main" && echo "$branch_info" | grep -q "production_stats"; then + if [ "$force" = false ]; then + echo "🚨 ERROR: Attempting to run unsafe_redeploy on main branch in production_stats workspace." + echo "If you're sure you want to do this, run the script with the --force flag." + exit 1 + else + echo "⚠️ WARNING: Running unsafe_redeploy on main branch in production_stats workspace with --force flag." + fi +fi + +echo "Proceeding with unsafe redeploy..." + # Remove our materialized views and their pipes tb datasource rm analytics_pages_mv --yes tb datasource rm analytics_sessions_mv --yes @@ -17,4 +42,4 @@ tb pipe rm pipes/top_sources.pipe --yes tb pipe rm pipes/trend.pipe --yes # Push all the changes -tb push --only-changes --force --populate +tb push --force --populate diff --git a/ghost/tinybird/tests/all_analytics_hits.test b/ghost/tinybird/tests/all_analytics_hits.test new file mode 100644 index 000000000000..0117414fa248 --- /dev/null +++ b/ghost/tinybird/tests/all_analytics_hits.test @@ -0,0 +1 @@ +tb pipe data analytics_hits --format CSV diff --git a/ghost/tinybird/tests/all_analytics_hits.test.result b/ghost/tinybird/tests/all_analytics_hits.test.result new file mode 100644 index 000000000000..47180f6c65ca --- /dev/null +++ b/ghost/tinybird/tests/all_analytics_hits.test.result @@ -0,0 +1,32 @@ +"site_uuid","timestamp","action","version","session_id","member_uuid","member_status","post_uuid","location","source","pathname","href","device","browser" +"mock_site_uuid","2100-01-01 00:11:43","page_hit","1","2a31286e-53b4-41da-a7fd-89d966072af5","df8343d2-e89d-45b7-ba12-988734efcc56","free","undefined","GB","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","ie" +"mock_site_uuid","2100-01-01 00:51:17","page_hit","1","1267b782-e5a1-4334-8cf6-771d72bbc28e","d4678fdf-824c-4d5f-a5fe-c713d409faac","free","undefined","ES","","/","https://my-ghost-site.com/","desktop","chrome" +"mock_site_uuid","2100-01-01 01:06:15","page_hit","1","e5c37e25-ed9e-4940-a2be-bc49149d991a","undefined","undefined","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","petty-queen.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","bot","Unknown" +"mock_site_uuid","2100-01-01 01:21:13","page_hit","1","2a31286e-53b4-41da-a7fd-89d966072af5","df8343d2-e89d-45b7-ba12-988734efcc56","free","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","GB","bing.com","/about/","https://my-ghost-site.com/about/","desktop","ie" +"mock_site_uuid","2100-01-01 01:39:48","page_hit","1","1267b782-e5a1-4334-8cf6-771d72bbc28e","d4678fdf-824c-4d5f-a5fe-c713d409faac","free","undefined","ES","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","chrome" +"mock_site_uuid","2100-01-02 00:16:52","page_hit","1","f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","65bacac2-8122-4ed0-a11f-ac52aa82beb0","paid","undefined","GB","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","firefox" +"mock_site_uuid","2100-01-02 00:42:56","page_hit","1","f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","65bacac2-8122-4ed0-a11f-ac52aa82beb0","paid","undefined","GB","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","firefox" +"mock_site_uuid","2100-01-02 01:19:45","page_hit","1","f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","65bacac2-8122-4ed0-a11f-ac52aa82beb0","paid","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","GB","google.com","/about/","https://my-ghost-site.com/about/","desktop","firefox" +"mock_site_uuid","2100-01-03 00:10:19","page_hit","1","8a2461a8-91cd-4f01-b066-3de6dc946995","f4c738bc-7327-440c-8007-6a0b306c05e3","free","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","DE","my-ghost-site.com","/about/","https://my-ghost-site.com/about/","desktop","chrome" +"mock_site_uuid","2100-01-03 00:28:09","page_hit","1","9c15f99e-c8b1-4145-a073-e7f8649d2fa4","4c14393f-d792-403e-bbdc-aa5af3abbdd9","free","6b8635fb-292f-4422-9fe4-d76cfab2ba31","US","my-ghost-site.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","firefox" +"mock_site_uuid","2100-01-03 00:51:20","page_hit","1","50785df1-3232-4ff7-8495-d93e06d63f5c","3675e750-09bf-44c9-bc3f-b9aebac37c5d","paid","undefined","FR","search.yahoo.com","/","https://my-ghost-site.com/","desktop","firefox" +"mock_site_uuid","2100-01-03 00:53:31","page_hit","1","8a2461a8-91cd-4f01-b066-3de6dc946995","f4c738bc-7327-440c-8007-6a0b306c05e3","free","6b8635fb-292f-4422-9fe4-d76cfab2ba31","DE","my-ghost-site.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-03 01:01:24","page_hit","1","9c15f99e-c8b1-4145-a073-e7f8649d2fa4","4c14393f-d792-403e-bbdc-aa5af3abbdd9","free","undefined","US","duckduckgo.com","/","https://my-ghost-site.com/","desktop","firefox" +"mock_site_uuid","2100-01-03 01:34:39","page_hit","1","50785df1-3232-4ff7-8495-d93e06d63f5c","3675e750-09bf-44c9-bc3f-b9aebac37c5d","paid","undefined","FR","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","firefox" +"mock_site_uuid","2100-01-03 01:41:44","page_hit","1","8a2461a8-91cd-4f01-b066-3de6dc946995","f4c738bc-7327-440c-8007-6a0b306c05e3","free","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","DE","bing.com","/about/","https://my-ghost-site.com/about/","desktop","chrome" +"mock_site_uuid","2100-01-04 00:00:15","page_hit","1","a6b6c4e6-19e3-47a9-afc6-d9870592652e","undefined","undefined","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","GB","my-ghost-site.com","/about/","https://my-ghost-site.com/about/","desktop","chrome" +"mock_site_uuid","2100-01-04 00:16:10","page_hit","1","a6b6c4e6-19e3-47a9-afc6-d9870592652e","undefined","undefined","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","GB","my-ghost-site.com","/about/","https://my-ghost-site.com/about/","desktop","chrome" +"mock_site_uuid","2100-01-04 00:25:39","page_hit","1","59478d87-ce95-40fd-a081-65d1e497bcfc","97c79891-2ae9-4eb2-ada8-89d2a998747d","paid","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-04 00:34:33","page_hit","1","e22a7f6f-28da-4715-a199-6f0338b593d4","5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","free","undefined","GB","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","chrome" +"mock_site_uuid","2100-01-04 01:10:48","page_hit","1","a6b6c4e6-19e3-47a9-afc6-d9870592652e","undefined","undefined","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-04 01:35:41","page_hit","1","e22a7f6f-28da-4715-a199-6f0338b593d4","5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","free","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-04 01:54:50","page_hit","1","e22a7f6f-28da-4715-a199-6f0338b593d4","5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","free","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","GB","my-ghost-site.com","/about/","https://my-ghost-site.com/about/","desktop","chrome" +"mock_site_uuid","2100-01-05 00:29:59","page_hit","1","490475f1-1fb7-4672-9edd-daa1b411b5f9","undefined","undefined","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","baidu.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-05 00:38:12","page_hit","1","490475f1-1fb7-4672-9edd-daa1b411b5f9","undefined","undefined","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","my-ghost-site.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-05 00:47:42","page_hit","1","490475f1-1fb7-4672-9edd-daa1b411b5f9","undefined","undefined","undefined","GB","my-ghost-site.com","/","https://my-ghost-site.com/","desktop","chrome" +"mock_site_uuid","2100-01-05 01:54:03","page_hit","1","d8e4622f-95cc-4fba-b31b-f38ff72e0975","75a190eb-62da-46d2-972d-a9763c954f42","paid","6b8635fb-292f-4422-9fe4-d76cfab2ba31","ES","my-ghost-site.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","ie" +"mock_site_uuid","2100-01-05 01:59:00","page_hit","1","d8e4622f-95cc-4fba-b31b-f38ff72e0975","75a190eb-62da-46d2-972d-a9763c954f42","paid","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","ES","","/about/","https://my-ghost-site.com/about/","desktop","ie" +"mock_site_uuid","2100-01-06 00:51:26","page_hit","1","8d975128-2027-40c6-834a-972cc0293d21","b7e0fca6-27ce-46c0-af57-c591f20dcd51","free","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","FR","","/about/","https://my-ghost-site.com/about/","desktop","safari" +"mock_site_uuid","2100-01-06 01:28:38","page_hit","1","61a2896b-7cf8-4853-86a6-a0e4f87c1e21","undefined","undefined","6b8635fb-292f-4422-9fe4-d76cfab2ba31","GB","search.yahoo.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","chrome" +"mock_site_uuid","2100-01-07 01:44:10","page_hit","1","7f1e88e1-da8e-46df-bc69-d04fb29d603d","undefined","undefined","06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","US","wilted-tick.com","/about/","https://my-ghost-site.com/about/","desktop","firefox" +"mock_site_uuid","2100-01-07 02:23:19","page_hit","1","98159299-8111-4dc8-9156-bb339fe9508c","undefined","undefined","06b1b0c9-fb53-4a15-a060-3db3fde7b1dd","US","my-ghost-site.com","/blog/hello-world/","https://my-ghost-site.com/blog/hello-world/","desktop","firefox" diff --git a/ghost/tinybird/tests/all_kpis.test b/ghost/tinybird/tests/all_kpis.test new file mode 100644 index 000000000000..ed8400dca915 --- /dev/null +++ b/ghost/tinybird/tests/all_kpis.test @@ -0,0 +1 @@ +tb pipe data kpis --date_from 2100-01-01 --date_to 2100-01-07 --site_uuid mock_site_uuid --format CSV diff --git a/ghost/tinybird/tests/all_kpis.test.result b/ghost/tinybird/tests/all_kpis.test.result new file mode 100644 index 000000000000..37422d0eb029 --- /dev/null +++ b/ghost/tinybird/tests/all_kpis.test.result @@ -0,0 +1,8 @@ +"date","visits","pageviews","bounce_rate","avg_session_sec" +"2100-01-01",3,5,0.3333333333333333,7081 +"2100-01-02",1,3,0,3773 +"2100-01-03",3,7,0,10079 +"2100-01-04",3,7,0.3333333333333333,9050 +"2100-01-05",2,5,0,1360 +"2100-01-06",2,2,1,0 +"2100-01-07",2,2,1,0 diff --git a/ghost/tinybird/tests/all_top_browsers.test b/ghost/tinybird/tests/all_top_browsers.test new file mode 100644 index 000000000000..2790787c8642 --- /dev/null +++ b/ghost/tinybird/tests/all_top_browsers.test @@ -0,0 +1 @@ + tb pipe data top_browsers --date_from 2100-01-01 --date_to 2100-01-07 --site_uuid mock_site_uuid --format CSV diff --git a/ghost/tinybird/tests/all_top_browsers.test.result b/ghost/tinybird/tests/all_top_browsers.test.result new file mode 100644 index 000000000000..a3d06413d1ff --- /dev/null +++ b/ghost/tinybird/tests/all_top_browsers.test.result @@ -0,0 +1,6 @@ +"browser","visits","pageviews" +"chrome",7,16 +"firefox",5,9 +"ie",2,4 +"safari",1,1 +"Unknown",1,1 diff --git a/ghost/tinybird/tests/all_top_devices.test b/ghost/tinybird/tests/all_top_devices.test new file mode 100644 index 000000000000..0741ac065985 --- /dev/null +++ b/ghost/tinybird/tests/all_top_devices.test @@ -0,0 +1,2 @@ + + tb pipe data top_devices --date_from 2100-01-01 --date_to 2100-01-07 --site_uuid mock_site_uuid --format CSV diff --git a/ghost/tinybird/tests/all_top_devices.test.result b/ghost/tinybird/tests/all_top_devices.test.result new file mode 100644 index 000000000000..1eb5964e737f --- /dev/null +++ b/ghost/tinybird/tests/all_top_devices.test.result @@ -0,0 +1,3 @@ +"device","visits","pageviews" +"desktop",15,30 +"bot",1,1 diff --git a/ghost/tinybird/tests/all_top_locations.test b/ghost/tinybird/tests/all_top_locations.test new file mode 100644 index 000000000000..ba0667d30372 --- /dev/null +++ b/ghost/tinybird/tests/all_top_locations.test @@ -0,0 +1,2 @@ + + tb pipe data top_locations --date_from 2100-01-01 --date_to 2100-01-07 --site_uuid mock_site_uuid --format CSV diff --git a/ghost/tinybird/tests/all_top_locations.test.result b/ghost/tinybird/tests/all_top_locations.test.result new file mode 100644 index 000000000000..de9e641f9c48 --- /dev/null +++ b/ghost/tinybird/tests/all_top_locations.test.result @@ -0,0 +1,6 @@ +"location","visits","pageviews" +"GB",8,17 +"US",3,4 +"FR",2,3 +"ES",2,4 +"DE",1,3 diff --git a/ghost/tinybird/tests/all_top_pages.test b/ghost/tinybird/tests/all_top_pages.test new file mode 100644 index 000000000000..2fbd8b270e27 --- /dev/null +++ b/ghost/tinybird/tests/all_top_pages.test @@ -0,0 +1 @@ +tb pipe data top_pages --date_from 2100-01-01 --date_to 2100-01-07 --site_uuid mock_site_uuid --format CSV diff --git a/ghost/tinybird/tests/all_top_pages.test.result b/ghost/tinybird/tests/all_top_pages.test.result new file mode 100644 index 000000000000..f4f53cf1f1db --- /dev/null +++ b/ghost/tinybird/tests/all_top_pages.test.result @@ -0,0 +1,4 @@ +"pathname","visits","pageviews" +"/blog/hello-world/",10,11 +"/about/",8,10 +"/",7,10 diff --git a/ghost/tinybird/tests/all_top_sources.test b/ghost/tinybird/tests/all_top_sources.test new file mode 100644 index 000000000000..bc2f422fa684 --- /dev/null +++ b/ghost/tinybird/tests/all_top_sources.test @@ -0,0 +1 @@ +tb pipe data top_sources --date_from 2100-01-01 --date_to 2100-01-07 --site_uuid mock_site_uuid --format CSV diff --git a/ghost/tinybird/tests/all_top_sources.test.result b/ghost/tinybird/tests/all_top_sources.test.result new file mode 100644 index 000000000000..3f036044be2a --- /dev/null +++ b/ghost/tinybird/tests/all_top_sources.test.result @@ -0,0 +1,9 @@ +"source","visits","pageviews" +"",6,6 +"bing.com",2,2 +"search.yahoo.com",2,2 +"google.com",1,1 +"baidu.com",1,1 +"wilted-tick.com",1,1 +"duckduckgo.com",1,1 +"petty-queen.com",1,1 diff --git a/package.json b/package.json index d3f75a45abd0..3a761e6f4b2b 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "husky": "8.0.3", "inquirer": "8.2.6", "lint-staged": "15.2.10", - "nx": "19.8.0", + "nx": "19.8.2", "rimraf": "5.0.10", "ts-node": "10.9.2", "typescript": "5.4.5" diff --git a/yarn.lock b/yarn.lock index 4d078338b3f5..f7efaee24258 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3303,24 +3303,6 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/util" "^0.42.2" -"@grpc/grpc-js@^1.7.1": - version "1.10.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.7.tgz#1abce1a8c4c90b79dbbe57d7e4310f3b0ce72899" - integrity sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg== - dependencies: - "@grpc/proto-loader" "^0.7.13" - "@js-sdsl/ordered-map" "^4.4.2" - -"@grpc/proto-loader@^0.7.13": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" - integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.5" - yargs "^17.7.2" - "@gulpjs/to-absolute-glob@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz#1fc2460d3953e1d9b9f2dfdb4bcc99da4710c021" @@ -3728,11 +3710,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@js-sdsl/ordered-map@^4.4.2": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" - integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== - "@juggle/resize-observer@^3.3.1": version "3.4.0" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -4052,12 +4029,12 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@nrwl/tao@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.8.0.tgz#4742884ec73f521d5eb61b629db18b1093cb8307" - integrity sha512-tybyYdhHNfyBRb8SOc/SasT1iwjYkp/QibS8L3ayTvpvvzJpNr8BpuTznQWIkaIjilflmcdHl+rMiQDqwABqpg== +"@nrwl/tao@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.8.2.tgz#db0f51af3e9666357796e731bd2ce6fe0ff703a5" + integrity sha512-WvGvFjCy/dSpviLJE8YKcSqpTVpX78UFUhYGgd0OxNlnz0I52HDsZekVWJnyCuU0NDGH6BNmS77R79zj+WzxvQ== dependencies: - nx "19.8.0" + nx "19.8.2" tslib "^2.3.0" "@nuxtjs/opencollective@0.3.2": @@ -4069,267 +4046,55 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/nx-darwin-arm64@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.0.tgz#10b05965c4eb6d93667187d4d2a2fcbfa9f0f938" - integrity sha512-JWtBb6ndCdGE+RBIwKN85BZnX41lFGsFxnsmot71GeAj/g7Cb0PM2qcmxawoy8yLPTBGZhb+eHER3z3nDIqRog== - -"@nx/nx-darwin-x64@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.0.tgz#975f0650064245e9ee0b6f1a94bd43844f3c4b46" - integrity sha512-NcNaqbbStBkyahLaoKFtW6nEdjCjYT5ZOmGjc6UpAx1Y3pkk/FcIOYJRCBxwuOsRRsEAyeVcHPdYrouZmV+6Yw== - -"@nx/nx-freebsd-x64@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.0.tgz#ab60ca80fe31da3e7a4ee5ba6ca6d90d5f7a2245" - integrity sha512-QXHRnMW5LrpYvtmdFRL2CRgX9CWDccrs2xhQNNzcgsLgL87Wte5kjDoJJN4GQjtrmjD3Q93w67CE9lhqnpXBvQ== - -"@nx/nx-linux-arm-gnueabihf@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.0.tgz#09e94785bdd08e809af1ffe4ffffab9c02c471ad" - integrity sha512-VjZOLMxz0gT+0AdDygxQS0Vvi3AcEzO3y9o9WdGKKaDVUDycrFn72X+ZbvFoio1dF7S1s2TbmOlR09Bu1yTgGg== - -"@nx/nx-linux-arm64-gnu@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.0.tgz#a2ca6e6e8cf1dd46015156ed5bfb45be7a1a3a59" - integrity sha512-sCSrXkSmEfDUDGLESXB3eHXECAIYz9nosFZpCggyUP1vgF/QcV40fHnV38nrFbKaVHuoaxy43RgnD+I3o6sDSw== - -"@nx/nx-linux-arm64-musl@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.0.tgz#e02f09e52972ba48a34564cbee61fc037df5cfe2" - integrity sha512-F3xEe7NGjsVKZTVlvUiUOTmCzxteRsQH2SSsYXyAfgJ42P3eZPc9HgeLx6RByjC/NBCwc7XEECMP1FjQgQXHVw== - -"@nx/nx-linux-x64-gnu@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.0.tgz#3e7ab6d672bacadb37451064cc052a7ff18b5eb6" - integrity sha512-4uYuE+LvxOFXvi9z9ueJSVrME5D383SHNCjs6jYwc9KovCsmL5oPVXRieoE4/hYI4lrjly+CrAnPZU1P7ocBiw== - -"@nx/nx-linux-x64-musl@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.0.tgz#6c16abb64e3cdd6ac0af597d327d977fbe8f5d02" - integrity sha512-9UDEGjOvNt+m+kMBCAB7CGisSwv05Xvaq8K3NJ+xM5GPG74EkQel24mSoIJfm/6zmDkdZCiRzNN9VRjOjzOz6Q== - -"@nx/nx-win32-arm64-msvc@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.0.tgz#efaed5792ce129590d412ac030770bcab1017c75" - integrity sha512-JVzm0KjyLZY5ponBukZ/b35wttW0b3LB0nqaiiHY7WKwSzo+m0UGEYHD/Yk6rKA0RRZN2wQVeIzLeWfYcZYrhA== - -"@nx/nx-win32-x64-msvc@19.8.0": - version "19.8.0" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.0.tgz#7121a9c93bd11a306f46770f132307b7ca64cbf7" - integrity sha512-IRLhMZIInvp9okLsjnj76zaz8iaMovtLr6MHIFOOPIMsZYRhqQTArF5Os/NqEezeYYxvX6YZ5hKYe0xQO7A5LA== - -"@opentelemetry/api-logs@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz#52906375da4d64c206b0c4cb8ffa209214654ecc" - integrity sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A== - dependencies: - "@opentelemetry/api" "^1.0.0" - -"@opentelemetry/api@1.9.0", "@opentelemetry/api@^1.0.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" - integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== - -"@opentelemetry/context-async-hooks@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz#810bff2fcab84ec51f4684aff2d21f6c057d9e73" - integrity sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ== - -"@opentelemetry/core@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.25.1.tgz#ff667d939d128adfc7c793edae2f6bca177f829d" - integrity sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ== - dependencies: - "@opentelemetry/semantic-conventions" "1.25.1" - -"@opentelemetry/exporter-prometheus@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.52.1.tgz#615021fffd511d4424edf9347b119d814cc94e89" - integrity sha512-hwK0QnjtqAxGpQAXMNUY+kTT5CnHyz1I0lBA8SFySvaFtExZm7yQg/Ua/i+RBqgun7WkUbkUVJzEi3lKpJ7WdA== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-metrics" "1.25.1" - -"@opentelemetry/exporter-trace-otlp-grpc@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz#8b59c93a5833484ba19a7f424632c6ced5ea1d3b" - integrity sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ== - dependencies: - "@grpc/grpc-js" "^1.7.1" - "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - -"@opentelemetry/exporter-trace-otlp-http@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz#99549e05f581050d0df2c1c684d1a819c480ebc6" - integrity sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - -"@opentelemetry/exporter-trace-otlp-proto@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz#7b68268cd4d46b7d89ee7c97720031ca80919fd6" - integrity sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - -"@opentelemetry/exporter-zipkin@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz#81bb3b3aa16500676277c2fd6d50159eaf6c081a" - integrity sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - "@opentelemetry/semantic-conventions" "1.25.1" - -"@opentelemetry/instrumentation-runtime-node@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.6.0.tgz#6d547f42222c54987411404cae06912a08d94575" - integrity sha512-sbDGvUFL3pGwiaSazQ9v259uVHu3WtApMeo8vMMEKHb+z1IVN6/prJffCBs4OA+4skmhf3iFTV531mVwtwWbTA== - dependencies: - "@opentelemetry/instrumentation" "^0.52.0" - -"@opentelemetry/instrumentation@0.52.1", "@opentelemetry/instrumentation@^0.52.0": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz#2e7e46a38bd7afbf03cf688c862b0b43418b7f48" - integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== - dependencies: - "@opentelemetry/api-logs" "0.52.1" - "@types/shimmer" "^1.0.2" - import-in-the-middle "^1.8.1" - require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" - -"@opentelemetry/otlp-exporter-base@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz#657d9b27c55bd42ab6a8bb181006b57f9c84b91d" - integrity sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-transformer" "0.52.1" - -"@opentelemetry/otlp-grpc-exporter-base@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz#e1fdfd979289a87faec1c7cf303100c75e49a284" - integrity sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ== - dependencies: - "@grpc/grpc-js" "^1.7.1" - "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" - -"@opentelemetry/otlp-transformer@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz#779b7ebf0e3791eebeaa64caff06914fe3577948" - integrity sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg== - dependencies: - "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-logs" "0.52.1" - "@opentelemetry/sdk-metrics" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - protobufjs "^7.3.0" - -"@opentelemetry/propagator-b3@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz#653ee5f3f0f223c000907c1559c89c0a208819f7" - integrity sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A== - dependencies: - "@opentelemetry/core" "1.25.1" - -"@opentelemetry/propagator-jaeger@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz#7eae165921e65dce6f8d87339379880125dab765" - integrity sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA== - dependencies: - "@opentelemetry/core" "1.25.1" - -"@opentelemetry/resources@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.25.1.tgz#bb9a674af25a1a6c30840b755bc69da2796fefbb" - integrity sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/semantic-conventions" "1.25.1" - -"@opentelemetry/sdk-logs@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz#5653faa2d81cae574729bdeb4298b95dc10ae736" - integrity sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA== - dependencies: - "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" - -"@opentelemetry/sdk-metrics@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz#50c985ec15557a9654334e7fa1018dc47a8a56b7" - integrity sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" - lodash.merge "^4.6.2" - -"@opentelemetry/sdk-node@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz#984f8a679a966b065504ccfe4b811359e417dd30" - integrity sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA== - dependencies: - "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/core" "1.25.1" - "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" - "@opentelemetry/exporter-zipkin" "1.25.1" - "@opentelemetry/instrumentation" "0.52.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/sdk-logs" "0.52.1" - "@opentelemetry/sdk-metrics" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - "@opentelemetry/sdk-trace-node" "1.25.1" - "@opentelemetry/semantic-conventions" "1.25.1" - -"@opentelemetry/sdk-trace-base@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz#cbc1e60af255655d2020aa14cde17b37bd13df37" - integrity sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw== - dependencies: - "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" - "@opentelemetry/semantic-conventions" "1.25.1" - -"@opentelemetry/sdk-trace-node@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz#856063bef1167ae74139199338c24fb958838ff3" - integrity sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ== - dependencies: - "@opentelemetry/context-async-hooks" "1.25.1" - "@opentelemetry/core" "1.25.1" - "@opentelemetry/propagator-b3" "1.25.1" - "@opentelemetry/propagator-jaeger" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" - semver "^7.5.2" - -"@opentelemetry/semantic-conventions@1.25.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz#0deecb386197c5e9c2c28f2f89f51fb8ae9f145e" - integrity sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ== +"@nx/nx-darwin-arm64@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.2.tgz#c9640a7b46f265b4e58a8330fdb9402f8773e78b" + integrity sha512-O06sOObpaF3UQrx6R5s0kFOrhrk/N20rKhOMaD5Qxw6lmVr6TGGH1epGpD8ES7ZPS+p7FUtU9/FPHwY02BZfBg== + +"@nx/nx-darwin-x64@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.2.tgz#fa43524636e0f7d851048af081b03c2c437bce2a" + integrity sha512-hRFA7xpnIeMUF5FiDh681fxSx/EzkFYZ+UE/XBfzbc+T1neRy7NB2vMEa/WMsN0+Y5+NXtibx1akEDD6VOqeJA== + +"@nx/nx-freebsd-x64@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.2.tgz#762cfa29cdde48642870281d3d17388685ddc74f" + integrity sha512-GwZUtUQJt2LrZFB9r29ZYQ9I2r76pg+Lwj7vgrFAq+UHcLejHYyLvhDPoRfKWdASdegI3M5jbh8Cvamd+sgbNA== + +"@nx/nx-linux-arm-gnueabihf@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.2.tgz#9dbc3e8a6dd3637e17c29307e78014223fe96645" + integrity sha512-+OtoU5tXOLRv0ufy8ifD6EHn+VOjnC8mFIaaBO/cb/YEW1MTZq1RqKd4e1O9sjAloTe4X3mydw/Ue333+FqIww== + +"@nx/nx-linux-arm64-gnu@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.2.tgz#7d6d8657f5e8ecb556d50509dfa177f8b10e4d0c" + integrity sha512-rH7WSvoh1nvYmQs3cd4nBDPilEYIGTUOZF2eXPBqSu1K6938tu1Uf1zXzqRK7o016GoVepiD0VRVYWD3R82nRQ== + +"@nx/nx-linux-arm64-musl@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.2.tgz#a7804302d60fa0bebf0f10f84df62cb5e170e27f" + integrity sha512-a7vuWDOcqHL0S0gQYYz8DDRmNFs4NOd7A+BTgBRPX54r0pS82tKF2ZsP48TAr9WHyjsTPis5LlFw8VhLrjzdLA== + +"@nx/nx-linux-x64-gnu@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.2.tgz#952e817e2caa53d5ca05e494de538f0caad6e5ea" + integrity sha512-3h4dmIi5Muym18dsiiXQBygPlSAHZNe3PaYo8mLsUsvuAt2ye0XUDcAlHWXOt/FeuVDG1NEGI05vZJvbIIGikQ== + +"@nx/nx-linux-x64-musl@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.2.tgz#51222b1d2543db091356a96a971b62dd1712b1ec" + integrity sha512-LbOC3rbnREh7DbFYdZDuAEDmJsdQDLEjUzacwXDHMb/XlTL3YpWoXohd+zSVHM4nvd8o7QFuZNC4a4zYXwA+wg== + +"@nx/nx-win32-arm64-msvc@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.2.tgz#770bdc6a004b4b1bac9a7a990db7adf9581d6780" + integrity sha512-ZkSZBxGrGXDqwRxC4WyHR3sAUIH6akk1rTDvqTr1nKPribs53cqEms20i7qF1at3o99xL3YairOcnt7JxNWDWA== + +"@nx/nx-win32-x64-msvc@19.8.2": + version "19.8.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.2.tgz#805f3042b8756a6c25ec1c3afcc2cf228e51852c" + integrity sha512-rRt+XIZk+ctxhFORWvugqmS07xi52eRS4QpTq8b24ZJKk1Zw0L5opsXAdzughhBzfIpSx4rxnknFlI78DcRPxA== "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -4372,59 +4137,6 @@ dependencies: "@probe.gl/env" "4.0.9" -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - "@radix-ui/number@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" @@ -5075,15 +4787,6 @@ "@sentry/types" "7.119.0" "@sentry/utils" "7.119.0" -"@sentry-internal/tracing@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.114.0.tgz#bdcd364f511e2de45db6e3004faf5685ca2e0f86" - integrity sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg== - dependencies: - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" - "@sentry-internal/tracing@7.116.0": version "7.116.0" resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.116.0.tgz#af3e4e264c440aa5525b5877a10b9a0f870b40e3" @@ -5225,13 +4928,6 @@ "@sentry/types" "7.119.0" "@sentry/utils" "7.119.0" -"@sentry/tracing@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.114.0.tgz#32a3438b0f2d02fb7b7359fe7712c5a349a2a329" - integrity sha512-eldEYGADReZ4jWdN5u35yxLUSTOvjsiZAYd4KBEpf+Ii65n7g/kYOKAjNl7tHbrEG1EsMW4nDPWStUMk1w+tfg== - dependencies: - "@sentry-internal/tracing" "7.114.0" - "@sentry/types@7.114.0": version "7.114.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.114.0.tgz#ab8009d5f6df23b7342121083bed34ee2452e856" @@ -7357,66 +7053,66 @@ echarts "^5.5.0" swr "^2.2.5" -"@tiptap/core@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.7.3.tgz#a9ab35ce4bcef1157997ef0098ebf5db0333b74e" - integrity sha512-6b62isitaWRX6cR6V5x4O9+1lgCpoTNRrSegWwBrE1OGDHcGwdTZuzdNIbjLZ9k3qs4tXl49WKXHIXK44RDOIw== +"@tiptap/core@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.8.0.tgz#4b5707d3ac1d61fcbb840371fc04990c1cb466b8" + integrity sha512-xsqDI4BNzYRWRtBq7+/38ThhqEr7uG9Njip1x+9/wgR3vWPBFnBkYJTz6jSxS35NRE6BSnERm4/B/vrLuY1Hdw== -"@tiptap/extension-blockquote@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.7.3.tgz#a8b79c8a57ade51ed56ae255394987271c08bd91" - integrity sha512-onUThBo5XoNB7bFPI41WYNVbhX51TQDdymqEEJ0yS+0kqYMLOGxK5rylj1p+8SfpV+AIsrl5BSccijy1N7afKA== +"@tiptap/extension-blockquote@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.8.0.tgz#331603a27587b03382c061ef72aa5a274287e1f0" + integrity sha512-m3CKrOIvV7fY1Ak2gYf5LkKiz6AHxHpg6wxfVaJvdBqXgLyVtHo552N+A4oSHOSRbB4AG9EBQ2NeBM8cdEQ4MA== -"@tiptap/extension-bubble-menu@^2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.7.3.tgz#6782ffd45b2f56709c905867bb800d9c93b2a92f" - integrity sha512-gzhiNFwbR7oWxw1DTF6MTa6bd6toLY5mFSFLn4IdrqkkY5enxJXEak/uYvJ/q2gNvtZbrgBZVZn2UABPl2e9dg== +"@tiptap/extension-bubble-menu@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.8.0.tgz#41fe2ccd525c4d3a7e6e75a795f730ee53bd8cae" + integrity sha512-swg+myJPN60LduQvLMF4hVBqP5LOIN01INZBzBI8egz8QufqtSyRCgXl7Xcma0RT5xIXnZSG9XOqNFf2rtkjKA== dependencies: tippy.js "^6.3.7" -"@tiptap/extension-document@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.7.3.tgz#730f096e5aa23469770d70e4b2b083e42b005536" - integrity sha512-gL+NhS3r5T5B3DAnENis8VliFooOcpnp5diqmpiNPeQaO04GRQZCsFGmk/b/xRyEI8j80m+YtGYbpJodlvsTPw== +"@tiptap/extension-document@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.8.0.tgz#7dc5d2622168ad5b81134a92fccf49d7be53f141" + integrity sha512-mp7Isx1sVc/ifeW4uW/PexGQ9exN3NRUOebSpnLfqXeWYk4y1RS1PA/3+IHkOPVetbnapgPjFx/DswlCP3XLjA== -"@tiptap/extension-floating-menu@^2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.7.3.tgz#44e6c5c64a703488f30bc124a2462b798745c869" - integrity sha512-ch8kiFJJAuF5gTddM5VNLvOzvuquYELeM4SmUQcQ5O9X7dn1L1sTwrJgpj+oLOp5K+MF2YLCYC8dAEIWIj2rlg== +"@tiptap/extension-floating-menu@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.8.0.tgz#06f4cea1aae9d45cf8878498a957180ee58ae148" + integrity sha512-H4QT61CrkLqisnGGC7zgiYmsl2jXPHl89yQCbdlkQN7aw11H7PltcJS2PJguL0OrRVJS/Mv/VTTUiMslmsEV5g== dependencies: tippy.js "^6.3.7" -"@tiptap/extension-hard-break@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.7.3.tgz#28830335dc7ac34713ccd5ed854d590243fb1d29" - integrity sha512-HtnjmQfbjTDsrPzfRDmzH4fZvm5xZ0qmYQyRkfV4tFrD1vx6Wb2hmpfcuiBYuNVEP6OmOzG9pQV98zhfSHEcjg== +"@tiptap/extension-hard-break@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.8.0.tgz#bb450fcb7ab15b846c2bb556fbdb36a336c1a51a" + integrity sha512-vqiIfviNiCmy/pJTHuDSCAGL2O4QDEdDmAvGJu8oRmElUrnlg8DbJUfKvn6DWQHNSQwRb+LDrwWlzAYj1K9u6A== -"@tiptap/extension-link@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.7.3.tgz#bc3ce189c0639d5a8939cf54d084266b25830126" - integrity sha512-fAAt/50Adh4VlFk4yLc75p3kAYP0qCcYx1vrUd7MNZXJGvBixddsFfNNBB9GNy+SyE7TZRhX4Eg4n8pApoiPQA== +"@tiptap/extension-link@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.8.0.tgz#bc2ca4af87881210f41451ea2c722254b31b0d81" + integrity sha512-p67hCG/pYCiOK/oCTPZnlkw9Ei7KJ7kCKFaluTcAmr5j8IBdYfDqSMDNCT4vGXBvKFh4X6xD7S7QvOqcH0Gn9A== dependencies: linkifyjs "^4.1.0" -"@tiptap/extension-paragraph@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.7.3.tgz#e542f9f0e15de3ff43419e111b535efd5768d106" - integrity sha512-jcvcsN1JEYxPYQ3IgeJ7sUr3gDlIoVm9GXIV83fiF8KWw30M1jWfYJ6zgef8e5wB7d/NLhc3yhVrRk4R6P4ApQ== +"@tiptap/extension-paragraph@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.8.0.tgz#6f3d673d7f1143a64da3c1db2d2128c835a58c41" + integrity sha512-XgxxNNbuBF48rAGwv7/s6as92/xjm/lTZIGTq9aG13ClUKFtgdel7C33SpUCcxg3cO2WkEyllXVyKUiauFZw/A== -"@tiptap/extension-placeholder@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-placeholder/-/extension-placeholder-2.7.3.tgz#f8e7c874ffcf1706c10108e639233e068c4fed1b" - integrity sha512-ZcqOyOlqzKVFXK5LMkDUGV+pA5UqL+P6k8XWsPR1J0YFTYe5t6kupPDyZ4ndir4HvY0Ix9xQlagvXRmn6wlVUA== +"@tiptap/extension-placeholder@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-placeholder/-/extension-placeholder-2.8.0.tgz#2a7feffaba01167e4e890bc308852044241124f9" + integrity sha512-BMqv/C9Tcjd7L1/OphUAJTZhWfpWs0rTQJ0bs3RRGsC8L+K20Fg+li45vw7M0teojpfrw57zwJogJd/m23Zr1Q== -"@tiptap/extension-text@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.7.3.tgz#6f77bdef7505e71756b7878f910427bb57fd8e97" - integrity sha512-p1ic3rxbY8Z+1W2e/W4qXxT9zh0x2DjY2bUq+bNTvAbjOw2D9XhE4B03vhRVvNOgQdVXqJX638fK8P34ndrV1A== +"@tiptap/extension-text@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.8.0.tgz#d24d9e627a595aa87585d885f8ee3cd2a959d787" + integrity sha512-EDAdFFzWOvQfVy7j3qkKhBpOeE5thkJaBemSWfXI93/gMVc0ZCdLi24mDvNNgUHlT+RjlIoQq908jZaaxLKN2A== -"@tiptap/pm@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.7.3.tgz#adf69716f613773b2f723cc79fe5b4f06d0a09f4" - integrity sha512-qMUMypHjxq7n37u4iBTbAfoWf38eDi5I13l2U3a3UKt/mJBABusf2aYq4NfkY5vQQn48HbZ3Hj+TygrdPklQwQ== +"@tiptap/pm@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.8.0.tgz#c79ad5e0f4a00cf306f15ac4497bf2fb0a40c784" + integrity sha512-eMGpRooUMvKz/vOpnKKppApMSoNM325HxTdAJvTlVAmuHp5bOY5kyY1kfUlePRiVx1t1UlFcXs3kecFwkkBD3Q== dependencies: prosemirror-changeset "^2.2.1" prosemirror-collab "^1.3.1" @@ -7437,13 +7133,13 @@ prosemirror-transform "^1.10.0" prosemirror-view "^1.33.10" -"@tiptap/react@2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.7.3.tgz#9bf394eb3984178c793a2275a1846f1ffe20ab52" - integrity sha512-zPOWRG+4ApEXhUWE6h61ykqHjw7xcOKUjQGrXnD+Bji/sdr1ezgMnsewsRY8eHzxgXnCZoCydSsVwNqjZw+KZw== +"@tiptap/react@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.8.0.tgz#cd91281eab13da0371358fc69d765d89c5f258e0" + integrity sha512-o/aSCjO5Nu4MsNpTF+N1SzYzVQvvBiclmTOZX2E6usZ8jre5zmKfXHDSZnjGSRTK6z6kw5KW8wpjRQha03f9mg== dependencies: - "@tiptap/extension-bubble-menu" "^2.7.3" - "@tiptap/extension-floating-menu" "^2.7.3" + "@tiptap/extension-bubble-menu" "^2.8.0" + "@tiptap/extension-floating-menu" "^2.8.0" "@types/use-sync-external-store" "^0.0.6" fast-deep-equal "^3" use-sync-external-store "^1.2.2" @@ -8516,7 +8212,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@>=8.1.0": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=18.0.0", "@types/node@>=8.1.0": version "22.5.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== @@ -8665,11 +8361,6 @@ "@types/mime" "*" "@types/node" "*" -"@types/shimmer@^1.0.2": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.5.tgz#491d8984d4510e550bfeb02d518791d7f59d2b88" - integrity sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww== - "@types/sinon@10.0.16": version "10.0.16" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.16.tgz#4bf10313bd9aa8eef1e50ec9f4decd3dd455b4d3" @@ -12750,7 +12441,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2: +cjs-module-lexer@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== @@ -19673,16 +19364,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-in-the-middle@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz#8b51c2cc631b64e53e958d7048d2d9463ce628f8" - integrity sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng== - dependencies: - acorn "^8.8.2" - acorn-import-attributes "^1.9.5" - cjs-module-lexer "^1.2.2" - module-details-from-path "^1.0.3" - import-lazy@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" @@ -22280,7 +21961,7 @@ lodash.bind@^4.1.4: resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" integrity sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA== -lodash.camelcase@4.3.0, lodash.camelcase@^4.1.1, lodash.camelcase@^4.3.0: +lodash.camelcase@4.3.0, lodash.camelcase@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== @@ -22543,7 +22224,7 @@ long-timeout@^0.1.1, long-timeout@~0.1.1: resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== -long@^5.0.0, long@^5.2.0, long@^5.2.1: +long@^5.2.0, long@^5.2.1: version "5.2.3" resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== @@ -23675,11 +23356,6 @@ mock-knex@TryGhost/mock-knex#d8b93b1c20d4820323477f2c60db016ab3e73192: lodash "^4.14.2" semver "^5.3.0" -module-details-from-path@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" - integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== - moment-timezone@0.5.34, moment-timezone@0.5.45, moment-timezone@^0.5.23, moment-timezone@^0.5.31, moment-timezone@^0.5.33: version "0.5.45" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.45.tgz#cb685acd56bac10e69d93c536366eb65aa6bcf5c" @@ -24406,13 +24082,13 @@ nwsapi@^2.2.0, nwsapi@^2.2.12: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== -nx@19.8.0: - version "19.8.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-19.8.0.tgz#99308c71c5e41f9c7cba9c84bf61935b4d7fd326" - integrity sha512-zD1ZvkfxECrd9QnvUyAUVLESmjl0bpIhB1gLcYN2BqsCkB1vkngbxIvXDorI98keOVEfHzeuwNSkufQNls1hug== +nx@19.8.2: + version "19.8.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-19.8.2.tgz#a2ac77877050c43105a9d94034838eb5ecf3cf44" + integrity sha512-NE88CbEZj8hCrUKiYzL1sB6O1tmgu/OjvTp3pJOoROMvo0kE7N4XT3TiKAge+E6wVRXf/zU55cH1G2u0djpZhA== dependencies: "@napi-rs/wasm-runtime" "0.2.4" - "@nrwl/tao" "19.8.0" + "@nrwl/tao" "19.8.2" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.7" @@ -24427,7 +24103,6 @@ nx@19.8.0: figures "3.2.0" flat "^5.0.2" front-matter "^4.0.2" - fs-extra "^11.1.0" ignore "^5.0.4" jest-diff "^29.4.1" jsonc-parser "3.2.0" @@ -24447,16 +24122,16 @@ nx@19.8.0: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "19.8.0" - "@nx/nx-darwin-x64" "19.8.0" - "@nx/nx-freebsd-x64" "19.8.0" - "@nx/nx-linux-arm-gnueabihf" "19.8.0" - "@nx/nx-linux-arm64-gnu" "19.8.0" - "@nx/nx-linux-arm64-musl" "19.8.0" - "@nx/nx-linux-x64-gnu" "19.8.0" - "@nx/nx-linux-x64-musl" "19.8.0" - "@nx/nx-win32-arm64-msvc" "19.8.0" - "@nx/nx-win32-x64-msvc" "19.8.0" + "@nx/nx-darwin-arm64" "19.8.2" + "@nx/nx-darwin-x64" "19.8.2" + "@nx/nx-freebsd-x64" "19.8.2" + "@nx/nx-linux-arm-gnueabihf" "19.8.2" + "@nx/nx-linux-arm64-gnu" "19.8.2" + "@nx/nx-linux-arm64-musl" "19.8.2" + "@nx/nx-linux-x64-gnu" "19.8.2" + "@nx/nx-linux-x64-musl" "19.8.2" + "@nx/nx-win32-arm64-msvc" "19.8.2" + "@nx/nx-win32-x64-msvc" "19.8.2" oauth-sign@~0.9.0: version "0.9.0" @@ -26679,24 +26354,6 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protobufjs@^7.2.5, protobufjs@^7.3.0: - version "7.3.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.2.tgz#60f3b7624968868f6f739430cfbc8c9370e26df4" - integrity sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -27664,15 +27321,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-in-the-middle@^7.1.1: - version "7.3.0" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz#ce64a1083647dc07b3273b348357efac8a9945c9" - integrity sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw== - dependencies: - debug "^4.1.1" - module-details-from-path "^1.0.3" - resolve "^1.22.1" - require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" @@ -28281,7 +27929,7 @@ selderee@^0.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.6.3, semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2: +semver@7.6.3, semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -28493,11 +28141,6 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -shimmer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" - integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== - should-equal@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" @@ -30027,10 +29670,10 @@ terser-webpack-plugin@^5.3.10: serialize-javascript "^6.0.1" terser "^5.26.0" -terser@5.33.0, terser@^5.26.0, terser@^5.7.0: - version "5.33.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.33.0.tgz#8f9149538c7468ffcb1246cfec603c16720d2db1" - integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== +terser@5.34.1, terser@^5.26.0, terser@^5.7.0: + version "5.34.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6" + integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -31052,6 +30695,11 @@ use-callback-ref@^1.3.0: dependencies: tslib "^2.0.0" +use-debounce@10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-10.0.3.tgz#636094a37f7aa2bcc77b26b961481a0b571bf7ea" + integrity sha512-DxQSI9ZKso689WM1mjgGU3ozcxU1TJElBJ3X6S4SMzMNcm2lVH0AHmyXB+K7ewjz2BSUKJTDqTcwtSMRfB89dg== + use-isomorphic-layout-effect@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" @@ -31591,10 +31239,10 @@ webpack-virtual-modules@^0.5.0: resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c" integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== -webpack@5.94.0: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== +webpack@5.95.0: + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== dependencies: "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1"