diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d6a275a59..ed6ecc0ac 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -11,4 +11,5 @@ module.exports = { rootDir: ['apps/*/'], }, }, + ignorePatterns: ['lingui.config.ts', 'packages/lib/translations/**/*.js'], }; diff --git a/.github/workflows/translations-extract.yml b/.github/workflows/translations-extract.yml new file mode 100644 index 000000000..7f1262cfc --- /dev/null +++ b/.github/workflows/translations-extract.yml @@ -0,0 +1,38 @@ +# Extract and compile translations for all PRs. + +name: 'Extract and compile translations' + +on: + workflow_call: + pull_request: + branches: ['main'] + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + extract_translations: + name: Extract and compile translations + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - uses: ./.github/actions/node-install + + - name: Extract and compile translations + run: | + npm run translate:extract + npm run translate:compile + + - name: Check and commit any files created + run: | + git config --global user.name 'github-actions' + git config --global user.email 'github-actions@documenso.com' + git add packages/lib/translations + git diff --staged --quiet --exit-code || (git commit -m "chore: extract translations" && git push) diff --git a/.github/workflows/translations-force-pull.yml b/.github/workflows/translations-force-pull.yml new file mode 100644 index 000000000..5d804df63 --- /dev/null +++ b/.github/workflows/translations-force-pull.yml @@ -0,0 +1,51 @@ +# This is similar to the "Pull Translations" workflow, but without the conditional check to allow us to +# forcefully pull down translations from Crowdin and create a PR regardless if all the translations are fulfilled. +# +# Intended to be used when we manually update translations in Crowdin UI and want to pull those down when +# they already exist. + +name: 'Force pull translations' + +on: + workflow_dispatch: + workflow_call: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + pull_translations: + name: Force pull translations + runs-on: ubuntu-latest + environment: Translations + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: ./.github/actions/node-install + + - name: Pull translations from Crowdin + uses: crowdin/github-action@v2 + with: + upload_sources: false + upload_translations: false + download_translations: true + export_only_approved: false + localization_branch_name: chore/translations + commit_message: 'chore: add translations' + pull_request_title: 'chore: add translations' + + env: + # A classic GitHub Personal Access Token with the 'repo' scope selected (the user should have write access to the repository). + GITHUB_TOKEN: ${{ secrets.GH_PAT }} + + # A numeric ID, found at https://crowdin.com/project//tools/api + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + + # Visit https://crowdin.com/settings#api-key to create this token + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/translations-pull.yml b/.github/workflows/translations-pull.yml index 3df9fdb85..0e3703438 100644 --- a/.github/workflows/translations-pull.yml +++ b/.github/workflows/translations-pull.yml @@ -3,11 +3,10 @@ name: 'Pull translations' on: + schedule: + - cron: '0 */2 * * *' # Every two hours. workflow_dispatch: workflow_call: - # Cron disabled until i18n PR is landed. - # schedule: - # - cron: '0 */2 * * *' # Every two hours. concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -17,6 +16,7 @@ jobs: pull_translations: name: Pull translations runs-on: ubuntu-latest + environment: Translations permissions: contents: write pull-requests: write @@ -46,7 +46,7 @@ jobs: env: # A classic GitHub Personal Access Token with the 'repo' scope selected (the user should have write access to the repository). - GITHUB_TOKEN: ${{ secrets.GITHUB_CROWDIN_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GH_PAT }} # A numeric ID, found at https://crowdin.com/project//tools/api CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} diff --git a/.github/workflows/translations-upload.yml b/.github/workflows/translations-upload.yml index 1e96236eb..d40a3217a 100644 --- a/.github/workflows/translations-upload.yml +++ b/.github/workflows/translations-upload.yml @@ -3,9 +3,8 @@ name: 'Extract and upload translations' on: workflow_dispatch: workflow_call: - # Disabled until i18n PR is landed. - # push: - # branches: ['main'] + push: + branches: ['main'] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -15,6 +14,7 @@ jobs: extract_translations: name: Extract and upload translations runs-on: ubuntu-latest + environment: Translations permissions: contents: write steps: diff --git a/.husky/pre-commit b/.husky/pre-commit index 3d805e3cf..cacfc7e37 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -13,4 +13,9 @@ node "$MONOREPO_ROOT/scripts/copy-wellknown.cjs" git add "$MONOREPO_ROOT/apps/web/public/" git add "$MONOREPO_ROOT/apps/marketing/public/" +echo "Extract and compile translations" +npm run translate:extract +npm run translate:compile +git add "$MONOREPO_ROOT/packages/lib/translations/" + npx lint-staged diff --git a/.prettierignore b/.prettierignore index 2a8e1455b..15f517b75 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,6 +4,7 @@ public **/**/node_modules **/**/.next **/**/public +packages/lib/translations/**/*.js *.lock *.log diff --git a/apps/marketing/lingui.config.ts b/apps/marketing/lingui.config.ts new file mode 100644 index 000000000..8fb3bc876 --- /dev/null +++ b/apps/marketing/lingui.config.ts @@ -0,0 +1,22 @@ +import type { LinguiConfig } from '@lingui/conf'; + +import { APP_I18N_OPTIONS } from '@documenso/lib/constants/i18n'; + +// Extends root lingui.config.cjs. +const config: LinguiConfig = { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + locales: APP_I18N_OPTIONS.supportedLangs as unknown as string[], + catalogs: [ + { + path: '/../../packages/lib/translations/{locale}/marketing', + include: ['/apps/marketing/src'], + }, + { + path: '/../../packages/lib/translations/{locale}/common', + include: ['/packages/ui', '/packages/lib'], + }, + ], + catalogsMergePath: '/../../packages/lib/translations/{locale}/marketing', +}; + +export default config; diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js index e0cec231e..8bfd0bd0d 100644 --- a/apps/marketing/next.config.js +++ b/apps/marketing/next.config.js @@ -30,6 +30,7 @@ const config = { serverActions: { bodySizeLimit: '50mb', }, + swcPlugins: [['@lingui/swc-plugin', {}]], }, reactStrictMode: true, transpilePackages: [ @@ -55,6 +56,13 @@ const config = { config.resolve.alias.canvas = false; } + config.module.rules.push({ + test: /\.po$/, + use: { + loader: '@lingui/loader', + }, + }); + return config; }, async headers() { diff --git a/apps/marketing/package.json b/apps/marketing/package.json index b95c2c8ec..b11e39b08 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -10,7 +10,8 @@ "lint": "next lint", "lint:fix": "next lint --fix", "clean": "rimraf .next && rimraf node_modules", - "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs" + "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs", + "translate:compile": "lingui compile --typescript" }, "dependencies": { "@documenso/assets": "*", @@ -19,7 +20,10 @@ "@documenso/trpc": "*", "@documenso/ui": "*", "@hookform/resolvers": "^3.1.0", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@openstatus/react": "^0.0.3", + "cmdk": "^0.2.1", "contentlayer": "^0.3.4", "embla-carousel": "^8.1.3", "embla-carousel-autoplay": "^8.1.3", @@ -46,6 +50,8 @@ "zod": "^3.22.4" }, "devDependencies": { + "@lingui/loader": "^4.11.1", + "@lingui/swc-plugin": "4.0.6", "@types/node": "20.1.0", "@types/react": "18.2.18", "@types/react-dom": "18.2.7" @@ -58,4 +64,4 @@ "next": "$next" } } -} +} \ No newline at end of file diff --git a/apps/marketing/src/app/(marketing)/blog/page.tsx b/apps/marketing/src/app/(marketing)/blog/page.tsx index 4be1ab694..39f3bbd74 100644 --- a/apps/marketing/src/app/(marketing)/blog/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/page.tsx @@ -1,12 +1,17 @@ import type { Metadata } from 'next'; +import { Trans } from '@lingui/macro'; import { allBlogPosts } from 'contentlayer/generated'; +import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; + export const metadata: Metadata = { title: 'Blog', }; export default function BlogPage() { + const { i18n } = setupI18nSSR(); + const blogPosts = allBlogPosts.sort((a, b) => { const dateA = new Date(a.date); const dateB = new Date(b.date); @@ -17,11 +22,15 @@ export default function BlogPage() { return (
-

From the blog

+

+ From the blog +

- Get the latest news from Documenso, including product updates, team announcements and - more! + + Get the latest news from Documenso, including product updates, team announcements and + more! +

@@ -33,7 +42,7 @@ export default function BlogPage() { >
{post.tags.length > 0 && ( diff --git a/apps/marketing/src/app/(marketing)/open/data.ts b/apps/marketing/src/app/(marketing)/open/data.ts index 3b109ea74..87fb458b8 100644 --- a/apps/marketing/src/app/(marketing)/open/data.ts +++ b/apps/marketing/src/app/(marketing)/open/data.ts @@ -1,10 +1,12 @@ +import { msg } from '@lingui/macro'; + export const TEAM_MEMBERS = [ { name: 'Timur Ercan', role: 'Co-Founder, CEO', salary: 95_000, location: 'Germany', - engagement: 'Full-Time', + engagement: msg`Full-Time`, joinDate: 'November 14th, 2022', }, { @@ -12,7 +14,7 @@ export const TEAM_MEMBERS = [ role: 'Co-Founder, CTO', salary: 95_000, location: 'Australia', - engagement: 'Full-Time', + engagement: msg`Full-Time`, joinDate: 'April 19th, 2023', }, { @@ -20,7 +22,7 @@ export const TEAM_MEMBERS = [ role: 'Software Engineer - Intern', salary: 15_000, location: 'Ghana', - engagement: 'Part-Time', + engagement: msg`Part-Time`, joinDate: 'June 6th, 2023', }, { @@ -28,7 +30,7 @@ export const TEAM_MEMBERS = [ role: 'Software Engineer - III', salary: 100_000, location: 'Australia', - engagement: 'Full-Time', + engagement: msg`Full-Time`, joinDate: 'July 26th, 2023', }, { @@ -36,7 +38,7 @@ export const TEAM_MEMBERS = [ role: 'Software Engineer - II', salary: 80_000, location: 'Romania', - engagement: 'Full-Time', + engagement: msg`Full-Time`, joinDate: 'September 4th, 2023', }, { @@ -44,7 +46,7 @@ export const TEAM_MEMBERS = [ role: 'Designer - III', salary: 100_000, location: 'India', - engagement: 'Full-Time', + engagement: msg`Full-Time`, joinDate: 'October 9th, 2023', }, ]; diff --git a/apps/marketing/src/app/(marketing)/open/funding-raised.tsx b/apps/marketing/src/app/(marketing)/open/funding-raised.tsx index f76573fc5..571ab19f9 100644 --- a/apps/marketing/src/app/(marketing)/open/funding-raised.tsx +++ b/apps/marketing/src/app/(marketing)/open/funding-raised.tsx @@ -2,6 +2,8 @@ import type { HTMLAttributes } from 'react'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import { formatMonth } from '@documenso/lib/client-only/format-month'; @@ -11,6 +13,8 @@ export type FundingRaisedProps = HTMLAttributes & { }; export const FundingRaised = ({ className, data, ...props }: FundingRaisedProps) => { + const { _ } = useLingui(); + const formattedData = data.map((item) => ({ amount: Number(item.amount), // eslint-disable-next-line @typescript-eslint/consistent-type-assertions @@ -21,7 +25,9 @@ export const FundingRaised = ({ className, data, ...props }: FundingRaisedProps)
-

Total Funding Raised

+

+ Total Funding Raised +

@@ -49,14 +55,14 @@ export const FundingRaised = ({ className, data, ...props }: FundingRaisedProps) currency: 'USD', maximumFractionDigits: 0, }), - 'Amount Raised', + _(msg`Amount Raised`), ]} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> diff --git a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx index 6ecd5b43c..90aba6c89 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx @@ -1,5 +1,7 @@ 'use client'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; @@ -14,6 +16,8 @@ export const MonthlyCompletedDocumentsChart = ({ className, data, }: MonthlyCompletedDocumentsChartProps) => { + const { _ } = useLingui(); + const formattedData = [...data].reverse().map(({ month, count }) => { return { month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), @@ -25,7 +29,9 @@ export const MonthlyCompletedDocumentsChart = ({
-

Completed Documents per Month

+

+ Completed Documents per Month +

@@ -46,7 +52,7 @@ export const MonthlyCompletedDocumentsChart = ({ fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="Completed Documents" + label={_(msg`Completed Documents`)} /> diff --git a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx index fe7941336..e01bfeb61 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx @@ -1,5 +1,7 @@ 'use client'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; @@ -11,6 +13,8 @@ export type MonthlyNewUsersChartProps = { }; export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartProps) => { + const { _ } = useLingui(); + const formattedData = [...data].reverse().map(({ month, count }) => { return { month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), @@ -22,7 +26,9 @@ export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartPr
-

New Users

+

+ New Users +

@@ -34,7 +40,7 @@ export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartPr labelStyle={{ color: 'hsl(var(--primary-foreground))', }} - formatter={(value) => [Number(value).toLocaleString('en-US'), 'New Users']} + formatter={(value) => [Number(value).toLocaleString('en-US'), _(msg`New Users`)]} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> @@ -43,7 +49,7 @@ export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartPr fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="New Users" + label={_(msg`New Users`)} /> diff --git a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx index 6ab5572ec..bbc5526c4 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx @@ -1,5 +1,7 @@ 'use client'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; @@ -11,6 +13,8 @@ export type MonthlyTotalUsersChartProps = { }; export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersChartProps) => { + const { _ } = useLingui(); + const formattedData = [...data].reverse().map(({ month, cume_count: count }) => { return { month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), @@ -22,7 +26,9 @@ export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersCha
-

Total Users

+

+ Total Users +

@@ -34,7 +40,7 @@ export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersCha labelStyle={{ color: 'hsl(var(--primary-foreground))', }} - formatter={(value) => [Number(value).toLocaleString('en-US'), 'Total Users']} + formatter={(value) => [Number(value).toLocaleString('en-US'), _(msg`Total Users`)]} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> @@ -43,7 +49,7 @@ export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersCha fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="Total Users" + label={_(msg`Total Users`)} /> diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index d70b4253d..676a352bb 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -1,7 +1,10 @@ import type { Metadata } from 'next'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { z } from 'zod'; +import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { getCompletedDocumentsMonthly } from '@documenso/lib/server-only/user/get-monthly-completed-document'; import { getUserMonthlyGrowth } from '@documenso/lib/server-only/user/get-user-monthly-growth'; @@ -128,6 +131,10 @@ const fetchEarlyAdopters = async () => { }; export default async function OpenPage() { + setupI18nSSR(); + + const { _ } = useLingui(); + const [ { forks_count: forksCount, stargazers_count: stargazersCount }, { total_count: openIssues }, @@ -150,19 +157,23 @@ export default async function OpenPage() {
-

Open Startup

+

+ Open Startup +

- All our metrics, finances, and learnings are public. We believe in transparency and want - to share our journey with you. You can read more about why here:{' '} - - Announcing Open Metrics - + + All our metrics, finances, and learnings are public. We believe in transparency and + want to share our journey with you. You can read more about why here:{' '} + + Announcing Open Metrics + +

@@ -180,12 +191,12 @@ export default async function OpenPage() { />
@@ -195,28 +206,32 @@ export default async function OpenPage() {
-

Finances

+

+ Finances +

-

Community

+

+ Community +

data={STARGAZERS_DATA} metricKey="stars" - title="GitHub: Total Stars" - label="Stars" + title={_(msg`GitHub: Total Stars`)} + label={_(msg`Stars`)} className="col-span-12 lg:col-span-6" /> data={STARGAZERS_DATA} metricKey="mergedPRs" - title="GitHub: Total Merged PRs" - label="Merged PRs" + title={_(msg`GitHub: Total Merged PRs`)} + label={_(msg`Merged PRs`)} chartHeight={400} className="col-span-12 lg:col-span-6" /> @@ -233,8 +248,8 @@ export default async function OpenPage() { data={STARGAZERS_DATA} metricKey="openIssues" - title="GitHub: Total Open Issues" - label="Open Issues" + title={_(msg`GitHub: Total Open Issues`)} + label={_(msg`Open Issues`)} chartHeight={400} className="col-span-12 lg:col-span-6" /> @@ -242,13 +257,15 @@ export default async function OpenPage() {
-

Growth

+

+ Growth +

data={EARLY_ADOPTERS_DATA} metricKey="earlyAdopters" - title="Total Customers" - label="Total Customers" + title={_(msg`Total Customers`)} + label={_(msg`Total Customers`)} className="col-span-12 lg:col-span-6" extraInfo={} /> @@ -268,11 +285,15 @@ export default async function OpenPage() {
-

Is there more?

+

+ Is there more? +

- This page is evolving as we learn what makes a great signing company. We'll update it when - we have more to share. + + This page is evolving as we learn what makes a great signing company. We'll update it + when we have more to share. +

diff --git a/apps/marketing/src/app/(marketing)/open/salary-bands.tsx b/apps/marketing/src/app/(marketing)/open/salary-bands.tsx index 41754cff6..6c9b4cb59 100644 --- a/apps/marketing/src/app/(marketing)/open/salary-bands.tsx +++ b/apps/marketing/src/app/(marketing)/open/salary-bands.tsx @@ -1,5 +1,7 @@ import type { HTMLAttributes } from 'react'; +import { Trans } from '@lingui/macro'; + import { cn } from '@documenso/ui/lib/utils'; import { Table, @@ -17,15 +19,23 @@ export type SalaryBandsProps = HTMLAttributes; export const SalaryBands = ({ className, ...props }: SalaryBandsProps) => { return (
-

Global Salary Bands

+

+ Global Salary Bands +

- Title - Seniority - Salary + + Title + + + Seniority + + + Salary + diff --git a/apps/marketing/src/app/(marketing)/open/team-members.tsx b/apps/marketing/src/app/(marketing)/open/team-members.tsx index 288d48a0b..6d2bf2459 100644 --- a/apps/marketing/src/app/(marketing)/open/team-members.tsx +++ b/apps/marketing/src/app/(marketing)/open/team-members.tsx @@ -1,5 +1,8 @@ import type { HTMLAttributes } from 'react'; +import { Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; + import { cn } from '@documenso/ui/lib/utils'; import { Table, @@ -15,20 +18,36 @@ import { TEAM_MEMBERS } from './data'; export type TeamMembersProps = HTMLAttributes; export const TeamMembers = ({ className, ...props }: TeamMembersProps) => { + const { _ } = useLingui(); + return (
-

Team

+

+ Team +

- Name - Role - Salary - Engagement - Location - Join Date + + Name + + + Role + + + Salary + + + Engagement + + + Location + + + Join Date + @@ -44,7 +63,7 @@ export const TeamMembers = ({ className, ...props }: TeamMembersProps) => { maximumFractionDigits: 0, })} - {member.engagement} + {_(member.engagement)} {member.location} {member.joinDate} diff --git a/apps/marketing/src/app/(marketing)/open/tooltip.tsx b/apps/marketing/src/app/(marketing)/open/tooltip.tsx index 2a77f45a1..3863f7867 100644 --- a/apps/marketing/src/app/(marketing)/open/tooltip.tsx +++ b/apps/marketing/src/app/(marketing)/open/tooltip.tsx @@ -1,5 +1,7 @@ import React from 'react'; +import { Trans } from '@lingui/macro'; + import { Tooltip, TooltipContent, @@ -29,7 +31,9 @@ export function OpenPageTooltip() { -

Customers with an Active Subscriptions.

+

+ Customers with an Active Subscriptions. +

diff --git a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx index 3ee82e121..5c7d3e758 100644 --- a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx @@ -1,5 +1,7 @@ 'use client'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; @@ -11,6 +13,8 @@ export type TotalSignedDocumentsChartProps = { }; export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocumentsChartProps) => { + const { _ } = useLingui(); + const formattedData = [...data].reverse().map(({ month, cume_count: count }) => { return { month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), @@ -22,7 +26,9 @@ export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocume
-

Total Completed Documents

+

+ Total Completed Documents +

@@ -46,7 +52,7 @@ export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocume fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="Total Completed Documents" + label={_(msg`Total Completed Documents`)} /> diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx index 4f298fbb3..6b6a20c48 100644 --- a/apps/marketing/src/app/(marketing)/open/typefully.tsx +++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx @@ -4,6 +4,7 @@ import type { HTMLAttributes } from 'react'; import Link from 'next/link'; +import { Trans } from '@lingui/macro'; import { FaXTwitter } from 'react-icons/fa6'; import { Button } from '@documenso/ui/primitives/button'; @@ -15,22 +16,26 @@ export const Typefully = ({ className, ...props }: TypefullyProps) => {
-

Twitter Stats

+

+ Twitter Stats +

-

Documenso on X

+

+ Documenso on X +

diff --git a/apps/marketing/src/app/(marketing)/page.tsx b/apps/marketing/src/app/(marketing)/page.tsx index 10918299a..2f5dd14c8 100644 --- a/apps/marketing/src/app/(marketing)/page.tsx +++ b/apps/marketing/src/app/(marketing)/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from 'next'; import { Caveat } from 'next/font/google'; +import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { cn } from '@documenso/ui/lib/utils'; import { Callout } from '~/components/(marketing)/callout'; @@ -25,6 +26,8 @@ const fontCaveat = Caveat({ }); export default async function IndexPage() { + setupI18nSSR(); + const starCount = await fetch('https://api.github.com/repos/documenso/documenso', { headers: { accept: 'application/vnd.github.v3+json', diff --git a/apps/marketing/src/app/(marketing)/pricing/page.tsx b/apps/marketing/src/app/(marketing)/pricing/page.tsx index f4103df9c..61a802cb8 100644 --- a/apps/marketing/src/app/(marketing)/pricing/page.tsx +++ b/apps/marketing/src/app/(marketing)/pricing/page.tsx @@ -1,6 +1,9 @@ import type { Metadata } from 'next'; import Link from 'next/link'; +import { Trans } from '@lingui/macro'; + +import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { Accordion, AccordionContent, @@ -28,15 +31,21 @@ export type PricingPageProps = { }; export default function PricingPage() { + setupI18nSSR(); + return (
-

Pricing

+

+ Pricing +

- Designed for every stage of your journey. + Designed for every stage of your journey. +

+

+ Get started today.

-

Get started today.

@@ -49,19 +58,21 @@ export default function PricingPage() {

- None of these work for you? Try self-hosting! + None of these work for you? Try self-hosting!

- Our self-hosted option is great for small teams and individuals who need a simple - solution. You can use our docker based setup to get started in minutes. Take control with - full customizability and data ownership. + + Our self-hosted option is great for small teams and individuals who need a simple + solution. You can use our docker based setup to get started in minutes. Take control + with full customizability and data ownership. +

@@ -75,120 +86,134 @@ export default function PricingPage() { - What is the difference between the plans? + What is the difference between the plans? - You can self-host Documenso for free or use our ready-to-use hosted version. The - hosted version comes with additional support, painless scalability and more. Early - adopters will get access to all features we build this year, for no additional cost! - Forever! Yes, that includes multiple users per account later. If you want Documenso - for your enterprise, we are happy to talk about your needs. + + You can self-host Documenso for free or use our ready-to-use hosted version. The + hosted version comes with additional support, painless scalability and more. Early + adopters will get access to all features we build this year, for no additional cost! + Forever! Yes, that includes multiple users per account later. If you want Documenso + for your enterprise, we are happy to talk about your needs. + - How do you handle my data? + How do you handle my data? - Securely. Our data centers are located in Frankfurt (Germany), giving us the best - local privacy laws. We are very aware of the sensitive nature of our data and follow - best practices to ensure the security and integrity of the data entrusted to us. + + Securely. Our data centers are located in Frankfurt (Germany), giving us the best + local privacy laws. We are very aware of the sensitive nature of our data and follow + best practices to ensure the security and integrity of the data entrusted to us. + - Why should I use your hosting service? + Why should I use your hosting service? - Using our hosted version is the easiest way to get started, you can simply subscribe - and start signing your documents. We take care of the infrastructure, so you can focus - on your business. Additionally, when using our hosted version you benefit from our - trusted signing certificates which helps you to build trust with your customers. + + Using our hosted version is the easiest way to get started, you can simply subscribe + and start signing your documents. We take care of the infrastructure, so you can + focus on your business. Additionally, when using our hosted version you benefit from + our trusted signing certificates which helps you to build trust with your customers. + - How can I contribute? + How can I contribute? - That's awesome. You can take a look at the current{' '} - - Issues - {' '} - and join our{' '} - - Discord Community - {' '} - to keep up to date, on what the current priorities are. In any case, we are an open - community and welcome all input, technical and non-technical ❤️ + + That's awesome. You can take a look at the current{' '} + + Issues + {' '} + and join our{' '} + + Discord Community + {' '} + to keep up to date, on what the current priorities are. In any case, we are an open + community and welcome all input, technical and non-technical ❤️ + - Can I use Documenso commercially? + Can I use Documenso commercially? - Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you - can use it for free and even modify it to fit your needs, as long as you publish your - changes under the same license. + + Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you + can use it for free and even modify it to fit your needs, as long as you publish + your changes under the same license. + - Why should I prefer Documenso over DocuSign or some other signing tool? + Why should I prefer Documenso over DocuSign or some other signing tool? - Documenso is a community effort to create an open and vibrant ecosystem around a tool, - everybody is free to use and adapt. By being truly open we want to create trusted - infrastructure for the future of the internet. + + Documenso is a community effort to create an open and vibrant ecosystem around a + tool, everybody is free to use and adapt. By being truly open we want to create + trusted infrastructure for the future of the internet. + - Where can I get support? + Where can I get support? - We are happy to assist you at{' '} - - support@documenso.com - {' '} - or{' '} - - in our Discord-Support-Channel - {' '} - please message either Lucas or Timur to get added to the channel if you are not - already a member. + + We are happy to assist you at{' '} + + support@documenso.com + {' '} + or{' '} + + in our Discord-Support-Channel + {' '} + please message either Lucas or Timur to get added to the channel if you are not + already a member. + diff --git a/apps/marketing/src/app/layout.tsx b/apps/marketing/src/app/layout.tsx index 2790adb35..f5c4f04dd 100644 --- a/apps/marketing/src/app/layout.tsx +++ b/apps/marketing/src/app/layout.tsx @@ -1,12 +1,17 @@ import { Suspense } from 'react'; import { Caveat, Inter } from 'next/font/google'; +import { cookies, headers } from 'next/headers'; import { AxiomWebVitals } from 'next-axiom'; import { PublicEnvScript } from 'next-runtime-env'; import { FeatureFlagProvider } from '@documenso/lib/client-only/providers/feature-flag'; +import { I18nClientProvider } from '@documenso/lib/client-only/providers/i18n.client'; +import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { NEXT_PUBLIC_MARKETING_URL } from '@documenso/lib/constants/app'; +import type { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; +import { ZSupportedLanguageCodeSchema } from '@documenso/lib/constants/i18n'; import { getAllAnonymousFlags } from '@documenso/lib/universal/get-feature-flag'; import { TrpcProvider } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -54,9 +59,29 @@ export function generateMetadata() { export default async function RootLayout({ children }: { children: React.ReactNode }) { const flags = await getAllAnonymousFlags(); + let overrideLang: (typeof SUPPORTED_LANGUAGE_CODES)[number] | undefined; + + // Should be safe to remove when we upgrade NextJS. + // https://github.com/vercel/next.js/pull/65008 + // Currently if the middleware sets the cookie, it's not accessible in the cookies + // during the same render. + // So we go the roundabout way of checking the header for the set-cookie value. + if (!cookies().get('i18n')) { + const setCookieValue = headers().get('set-cookie'); + const i18nCookie = setCookieValue?.split(';').find((cookie) => cookie.startsWith('i18n=')); + + if (i18nCookie) { + const i18n = i18nCookie.split('=')[1]; + + overrideLang = ZSupportedLanguageCodeSchema.parse(i18n); + } + } + + const { lang, i18n } = setupI18nSSR(overrideLang); + return ( @@ -65,6 +90,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo + @@ -78,7 +104,11 @@ export default async function RootLayout({ children }: { children: React.ReactNo - {children} + + + {children} + + diff --git a/apps/marketing/src/components/(marketing)/call-to-action.tsx b/apps/marketing/src/components/(marketing)/call-to-action.tsx index 3d1f51b23..cecc40967 100644 --- a/apps/marketing/src/components/(marketing)/call-to-action.tsx +++ b/apps/marketing/src/components/(marketing)/call-to-action.tsx @@ -1,5 +1,7 @@ import Link from 'next/link'; +import { Trans } from '@lingui/macro'; + import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent } from '@documenso/ui/primitives/card'; @@ -13,16 +15,20 @@ export const CallToAction = ({ className, utmSource = 'generic-cta' }: CallToAct return ( -

Join the Open Signing Movement

+

+ Join the Open Signing Movement +

- Create your account and start using state-of-the-art document signing. Open and beautiful - signing is within your grasp. + + Create your account and start using state-of-the-art document signing. Open and + beautiful signing is within your grasp. +

diff --git a/apps/marketing/src/components/(marketing)/callout.tsx b/apps/marketing/src/components/(marketing)/callout.tsx index 5e786abb4..8a02f8f04 100644 --- a/apps/marketing/src/components/(marketing)/callout.tsx +++ b/apps/marketing/src/components/(marketing)/callout.tsx @@ -2,6 +2,7 @@ import Link from 'next/link'; +import { Trans } from '@lingui/macro'; import { usePlausible } from 'next-plausible'; import { LuGithub } from 'react-icons/lu'; @@ -15,23 +16,6 @@ export type CalloutProps = { export const Callout = ({ starCount }: CalloutProps) => { const event = usePlausible(); - const onSignUpClick = () => { - const el = document.getElementById('email'); - - if (el) { - const { top } = el.getBoundingClientRect(); - - window.scrollTo({ - top: top - 120, - behavior: 'smooth', - }); - - setTimeout(() => { - el.focus(); - }, 500); - } - }; - return (
@@ -40,9 +24,9 @@ export const Callout = ({ starCount }: CalloutProps) => { variant="outline" className="rounded-full bg-transparent backdrop-blur-sm" > - Try our Free Plan + Try our Free Plan - No Credit Card required + No Credit Card required diff --git a/apps/marketing/src/components/(marketing)/carousel.tsx b/apps/marketing/src/components/(marketing)/carousel.tsx index f3d903809..688f79b3a 100644 --- a/apps/marketing/src/components/(marketing)/carousel.tsx +++ b/apps/marketing/src/components/(marketing)/carousel.tsx @@ -2,6 +2,9 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; +import type { AutoplayType } from 'embla-carousel-autoplay'; import Autoplay from 'embla-carousel-autoplay'; import useEmblaCarousel from 'embla-carousel-react'; import { useTheme } from 'next-themes'; @@ -13,13 +16,13 @@ import { Slide } from './slide'; const SLIDES = [ { - label: 'Signing Process', + label: msg`Signing Process`, type: 'video', srcLight: 'https://github.com/documenso/design/raw/main/marketing/signing.webm', srcDark: 'https://github.com/documenso/design/raw/main/marketing/dark/signing.webm', }, { - label: 'Teams', + label: msg`Teams`, type: 'video', srcLight: 'https://github.com/documenso/design/raw/main/marketing/teams.webm', srcDark: 'https://github.com/documenso/design/raw/main/marketing/dark/teams.webm', @@ -31,7 +34,7 @@ const SLIDES = [ srcDark: 'https://github.com/documenso/design/raw/main/marketing/dark/zapier.webm', }, { - label: 'Direct Link', + label: msg`Direct Link`, type: 'video', srcLight: 'https://github.com/documenso/design/raw/main/marketing/direct-links.webm', srcDark: 'https://github.com/documenso/design/raw/main/marketing/dark/direct-links.webm', @@ -49,7 +52,7 @@ const SLIDES = [ srcDark: 'https://github.com/documenso/design/raw/main/marketing/dark/api.webm', }, { - label: 'Profile', + label: msg`Profile`, type: 'video', srcLight: 'https://github.com/documenso/design/raw/main/marketing/profile_teaser.webm', srcDark: 'https://github.com/documenso/design/raw/main/marketing/dark/profile_teaser.webm', @@ -57,6 +60,8 @@ const SLIDES = [ ]; export const Carousel = () => { + const { _ } = useLingui(); + const slides = SLIDES; const [_isPlaying, setIsPlaying] = useState(false); const [selectedIndex, setSelectedIndex] = useState(0); @@ -73,6 +78,7 @@ export const Carousel = () => { const [emblaRef, emblaApi] = useEmblaCarousel({ loop: true }, [ Autoplay({ playOnInit: true, delay: autoplayDelay[selectedIndex] || 5000 }), ]); + const [emblaThumbsRef, emblaThumbsApi] = useEmblaCarousel( { loop: true, @@ -84,19 +90,28 @@ export const Carousel = () => { const onThumbClick = useCallback( (index: number) => { - if (!emblaApi || !emblaThumbsApi) return; + if (!emblaApi || !emblaThumbsApi) { + return; + } + emblaApi.scrollTo(index); }, [emblaApi, emblaThumbsApi], ); const onSelect = useCallback(() => { - if (!emblaApi || !emblaThumbsApi) return; + if (!emblaApi || !emblaThumbsApi) { + return; + } + setSelectedIndex(emblaApi.selectedScrollSnap()); emblaThumbsApi.scrollTo(emblaApi.selectedScrollSnap()); resetProgress(); - const autoplay = emblaApi.plugins()?.autoplay; + + // moduleResolution: bundler breaks this type + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const autoplay = emblaApi.plugins()?.autoplay as unknown as AutoplayType | undefined; if (autoplay) { autoplay.reset(); @@ -167,11 +182,18 @@ export const Carousel = () => { }, [emblaApi, onSelect, mounted, resolvedTheme]); useEffect(() => { - const autoplay = emblaApi?.plugins()?.autoplay; - if (!autoplay) return; + // moduleResolution: bundler breaks this type + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const autoplay = emblaApi?.plugins()?.autoplay as unknown as AutoplayType | undefined; + + if (!autoplay || !emblaApi) { + return; + } setIsPlaying(autoplay.isPlaying()); - emblaApi + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (emblaApi as unknown as any) .on('autoplay:play', () => setIsPlaying(true)) .on('autoplay:stop', () => setIsPlaying(false)) .on('reInit', () => setIsPlaying(autoplay.isPlaying())); @@ -233,7 +255,7 @@ export const Carousel = () => { src={resolvedTheme === 'dark' ? slide.srcDark : slide.srcLight} type="video/webm" /> - Your browser does not support the video tag. + Your browser does not support the video tag. )}
@@ -257,7 +279,7 @@ export const Carousel = () => { onClick={() => onThumbClick(index)} selected={index === selectedIndex} index={index} - label={slide.label} + label={typeof slide.label === 'string' ? slide.label : _(slide.label)} /> ))}
diff --git a/apps/marketing/src/components/(marketing)/enterprise.tsx b/apps/marketing/src/components/(marketing)/enterprise.tsx index f2b8f4c0c..32cd26bd2 100644 --- a/apps/marketing/src/components/(marketing)/enterprise.tsx +++ b/apps/marketing/src/components/(marketing)/enterprise.tsx @@ -2,6 +2,7 @@ import Link from 'next/link'; +import { Trans } from '@lingui/macro'; import { usePlausible } from 'next-plausible'; import { Button } from '@documenso/ui/primitives/button'; @@ -12,13 +13,15 @@ export const Enterprise = () => { return (

- Enterprise Compliance, License or Technical Needs? + Enterprise Compliance, License or Technical Needs?

- Our Enterprise License is great for large organizations looking to switch to Documenso for all - their signing needs. It's availible for our cloud offering as well as self-hosted setups and - offers a wide range of compliance and Adminstration Features. + + Our Enterprise License is great for large organizations looking to switch to Documenso for + all their signing needs. It's available for our cloud offering as well as self-hosted + setups and offers a wide range of compliance and Adminstration Features. +

@@ -28,7 +31,9 @@ export const Enterprise = () => { className="mt-6" onClick={() => event('enterprise-contact')} > - +
diff --git a/apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx b/apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx index b80b2fe8c..998f9ac75 100644 --- a/apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx +++ b/apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx @@ -2,6 +2,8 @@ import type { HTMLAttributes } from 'react'; import Image from 'next/image'; +import { Trans } from '@lingui/macro'; + import backgroundPattern from '@documenso/assets/images/background-pattern.png'; import cardBeautifulFigure from '@documenso/assets/images/card-beautiful-figure.png'; import cardFastFigure from '@documenso/assets/images/card-fast-figure.png'; @@ -25,17 +27,23 @@ export const FasterSmarterBeautifulBento = ({ />

- A 10x better signing experience. - Faster, smarter and more beautiful. + A 10x better signing experience. + + Faster, smarter and more beautiful. +

- Fast. - When it comes to sending or receiving a contract, you can count on lightning-fast - speeds. + + Fast. + + + When it comes to sending or receiving a contract, you can count on lightning-fast + speeds. +

@@ -51,9 +59,13 @@ export const FasterSmarterBeautifulBento = ({

- Beautiful. - Because signing should be celebrated. That’s why we care about the smallest detail in - our product. + + Beautiful. + + + Because signing should be celebrated. That’s why we care about the smallest detail + in our product. +

@@ -69,8 +81,12 @@ export const FasterSmarterBeautifulBento = ({

- Smart. - Our custom templates come with smart rules that can help you save time and energy. + + Smart. + + + Our custom templates come with smart rules that can help you save time and energy. +

diff --git a/apps/marketing/src/components/(marketing)/footer.tsx b/apps/marketing/src/components/(marketing)/footer.tsx index 3f4eb6c13..5fe7eac54 100644 --- a/apps/marketing/src/components/(marketing)/footer.tsx +++ b/apps/marketing/src/components/(marketing)/footer.tsx @@ -5,6 +5,8 @@ import type { HTMLAttributes } from 'react'; import Image from 'next/image'; import Link from 'next/link'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { FaXTwitter } from 'react-icons/fa6'; import { LiaDiscord } from 'react-icons/lia'; import { LuGithub } from 'react-icons/lu'; @@ -13,6 +15,8 @@ import LogoImage from '@documenso/assets/logo.png'; import { cn } from '@documenso/ui/lib/utils'; import { ThemeSwitcher } from '@documenso/ui/primitives/theme-switcher'; +import { I18nSwitcher } from '~/components/(marketing)/i18n-switcher'; + // import { StatusWidgetContainer } from './status-widget-container'; export type FooterProps = HTMLAttributes; @@ -24,22 +28,24 @@ const SOCIAL_LINKS = [ ]; const FOOTER_LINKS = [ - { href: '/pricing', text: 'Pricing' }, + { href: '/pricing', text: msg`Pricing` }, { href: '/singleplayer', text: 'Singleplayer' }, - { href: 'https://docs.documenso.com', text: 'Documentation', target: '_blank' }, - { href: 'mailto:support@documenso.com', text: 'Support', target: '_blank' }, - { href: '/blog', text: 'Blog' }, - { href: '/changelog', text: 'Changelog' }, - { href: '/open', text: 'Open Startup' }, - { href: '/design-system', text: 'Design' }, - { href: 'https://shop.documenso.com', text: 'Shop', target: '_blank' }, - { href: 'https://status.documenso.com', text: 'Status', target: '_blank' }, - { href: '/oss-friends', text: 'OSS Friends' }, - { href: '/careers', text: 'Careers' }, - { href: '/privacy', text: 'Privacy' }, + { href: 'https://docs.documenso.com', text: msg`Documentation`, target: '_blank' }, + { href: 'mailto:support@documenso.com', text: msg`Support`, target: '_blank' }, + { href: '/blog', text: msg`Blog` }, + { href: '/changelog', text: msg`Changelog` }, + { href: '/open', text: msg`Open Startup` }, + { href: '/design-system', text: msg`Design` }, + { href: 'https://shop.documenso.com', text: msg`Shop`, target: '_blank' }, + { href: 'https://status.documenso.com', text: msg`Status`, target: '_blank' }, + { href: '/oss-friends', text: msg`OSS Friends` }, + { href: '/careers', text: msg`Careers` }, + { href: '/privacy', text: msg`Privacy` }, ]; export const Footer = ({ className, ...props }: FooterProps) => { + const { _ } = useLingui(); + return (
@@ -80,7 +86,7 @@ export const Footer = ({ className, ...props }: FooterProps) => { target={link.target} className="text-muted-foreground hover:text-muted-foreground/80 flex-shrink-0 break-words text-sm" > - {link.text} + {typeof link.text === 'string' ? link.text : _(link.text)} ))}
@@ -90,8 +96,12 @@ export const Footer = ({ className, ...props }: FooterProps) => { © {new Date().getFullYear()} Documenso, Inc. All rights reserved.

-
- +
+ + +
+ +
diff --git a/apps/marketing/src/components/(marketing)/header.tsx b/apps/marketing/src/components/(marketing)/header.tsx index ec8a59e57..2dbe8f8f3 100644 --- a/apps/marketing/src/components/(marketing)/header.tsx +++ b/apps/marketing/src/components/(marketing)/header.tsx @@ -6,8 +6,9 @@ import { useState } from 'react'; import Image from 'next/image'; import Link from 'next/link'; +import { Trans } from '@lingui/macro'; + import LogoImage from '@documenso/assets/logo.png'; -import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -19,10 +20,6 @@ export type HeaderProps = HTMLAttributes; export const Header = ({ className, ...props }: HeaderProps) => { const [isHamburgerMenuOpen, setIsHamburgerMenuOpen] = useState(false); - const { getFlag } = useFeatureFlags(); - - const isSinglePlayerModeMarketingEnabled = getFlag('marketing_header_single_player_mode'); - return (
@@ -35,15 +32,6 @@ export const Header = ({ className, ...props }: HeaderProps) => { height={25} /> - - {isSinglePlayerModeMarketingEnabled && ( - - Try now! - - )}
@@ -51,7 +39,7 @@ export const Header = ({ className, ...props }: HeaderProps) => { href="/pricing" className="text-muted-foreground hover:text-muted-foreground/80 text-sm font-semibold" > - Pricing + Pricing { href="/blog" className="text-muted-foreground hover:text-muted-foreground/80 text-sm font-semibold" > - Blog + Blog - Open Startup + Open Startup { target="_blank" className="text-muted-foreground hover:text-muted-foreground/80 text-sm font-semibold" > - Sign in + Sign in
diff --git a/apps/marketing/src/components/(marketing)/hero.tsx b/apps/marketing/src/components/(marketing)/hero.tsx index 8af38f1c8..bc5818399 100644 --- a/apps/marketing/src/components/(marketing)/hero.tsx +++ b/apps/marketing/src/components/(marketing)/hero.tsx @@ -3,6 +3,7 @@ import Image from 'next/image'; import Link from 'next/link'; +import { Trans } from '@lingui/macro'; import type { Variants } from 'framer-motion'; import { motion } from 'framer-motion'; import { usePlausible } from 'next-plausible'; @@ -96,8 +97,11 @@ export const Hero = ({ className, ...props }: HeroProps) => { animate="animate" className="text-center text-4xl font-bold leading-tight tracking-tight md:text-[48px] lg:text-[64px]" > - Document signing, - finally open source. + + Document signing, + + finally open source. + { variant="outline" className="rounded-full bg-transparent backdrop-blur-sm" > - Try our Free Plan + Try our Free Plan - No Credit Card required + No Credit Card required event('view-github')}> {match(heroMarketingCTA) - .with('spm', () => ( - - -

- Introducing Single Player Mode -

- -

- Self sign for free! -

- -
- )) .with('productHunt', () => ( { + const { i18n, _ } = useLingui(); + + const [open, setOpen] = useState(false); + const [value, setValue] = useState(i18n.locale); + + const setLanguage = async (lang: string) => { + setValue(lang); + setOpen(false); + + await dynamicActivate(i18n, lang); + await switchI18NLanguage(lang); + }; + + return ( + <> + + + + + + + + {Object.values(SUPPORTED_LANGUAGES).map((language) => ( + setLanguage(language.short)} + > + + {SUPPORTED_LANGUAGES[language.short].full} + + ))} + + + + + ); +}; diff --git a/apps/marketing/src/components/(marketing)/mobile-navigation.tsx b/apps/marketing/src/components/(marketing)/mobile-navigation.tsx index 5244e70af..3b61706d1 100644 --- a/apps/marketing/src/components/(marketing)/mobile-navigation.tsx +++ b/apps/marketing/src/components/(marketing)/mobile-navigation.tsx @@ -3,6 +3,8 @@ import Image from 'next/image'; import Link from 'next/link'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { motion, useReducedMotion } from 'framer-motion'; import { FaXTwitter } from 'react-icons/fa6'; import { LiaDiscord } from 'react-icons/lia'; @@ -19,11 +21,11 @@ export type MobileNavigationProps = { export const MENU_NAVIGATION_LINKS = [ { href: '/pricing', - text: 'Pricing', + text: msg`Pricing`, }, { href: 'https://documen.so/docs-nav', - text: 'Documentation', + text: msg`Documentation`, }, { href: '/singleplayer', @@ -31,36 +33,38 @@ export const MENU_NAVIGATION_LINKS = [ }, { href: '/blog', - text: 'Blog', + text: msg`Blog`, }, { href: '/open', - text: 'Open Startup', + text: msg`Open Startup`, }, { href: 'https://status.documenso.com', - text: 'Status', + text: msg`Status`, }, { href: 'mailto:support@documenso.com', - text: 'Support', + text: msg`Support`, target: '_blank', }, { href: '/privacy', - text: 'Privacy', + text: msg`Privacy`, }, { href: 'https://app.documenso.com/signup?utm_source=marketing-header', - text: 'Sign up', + text: msg`Sign up`, }, { href: 'https://app.documenso.com/signin?utm_source=marketing-header', - text: 'Sign in', + text: msg`Sign in`, }, ]; export const MobileNavigation = ({ isMenuOpen, onMenuOpenChange }: MobileNavigationProps) => { + const { _ } = useLingui(); + const shouldReduceMotion = useReducedMotion(); const handleMenuItemClick = () => { @@ -112,7 +116,7 @@ export const MobileNavigation = ({ isMenuOpen, onMenuOpenChange }: MobileNavigat onClick={() => handleMenuItemClick()} target={target} > - {text} + {typeof text === 'string' ? text : _(text)} ))} diff --git a/apps/marketing/src/components/(marketing)/open-build-template-bento.tsx b/apps/marketing/src/components/(marketing)/open-build-template-bento.tsx index 4d4d6ad8a..a0708716a 100644 --- a/apps/marketing/src/components/(marketing)/open-build-template-bento.tsx +++ b/apps/marketing/src/components/(marketing)/open-build-template-bento.tsx @@ -2,6 +2,8 @@ import type { HTMLAttributes } from 'react'; import Image from 'next/image'; +import { Trans } from '@lingui/macro'; + import backgroundPattern from '@documenso/assets/images/background-pattern.png'; import cardBuildFigure from '@documenso/assets/images/card-build-figure.png'; import cardOpenFigure from '@documenso/assets/images/card-open-figure.png'; @@ -22,17 +24,23 @@ export const OpenBuildTemplateBento = ({ className, ...props }: OpenBuildTemplat />

- Truly your own. - Customise and expand. + Truly your own. + + Customise and expand. +

- Open Source or Hosted. - It’s up to you. Either clone our repository or rely on our easy to use hosting - solution. + + Open Source or Hosted. + + + It’s up to you. Either clone our repository or rely on our easy to use hosting + solution. +

@@ -48,8 +56,10 @@ export const OpenBuildTemplateBento = ({ className, ...props }: OpenBuildTemplat

- Build on top. - Make it your own through advanced customization and adjustability. + + Build on top. + + Make it your own through advanced customization and adjustability.

@@ -65,9 +75,13 @@ export const OpenBuildTemplateBento = ({ className, ...props }: OpenBuildTemplat

- Template Store (Soon). - Choose a template from the community app store. Or submit your own template for others - to use. + + Template Store (Soon). + + + Choose a template from the community app store. Or submit your own template for + others to use. +

diff --git a/apps/marketing/src/components/(marketing)/pricing-table.tsx b/apps/marketing/src/components/(marketing)/pricing-table.tsx index e0df56625..20a1755bb 100644 --- a/apps/marketing/src/components/(marketing)/pricing-table.tsx +++ b/apps/marketing/src/components/(marketing)/pricing-table.tsx @@ -5,6 +5,7 @@ import { useState } from 'react'; import Link from 'next/link'; +import { Trans } from '@lingui/macro'; import { AnimatePresence, motion } from 'framer-motion'; import { usePlausible } from 'next-plausible'; @@ -36,7 +37,7 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => { )} onClick={() => setPeriod('MONTHLY')} > - Monthly + Monthly {period === 'MONTHLY' && ( { )} onClick={() => setPeriod('YEARLY')} > - Yearly + Yearly
- Save $60 or $120 + Save $60 or $120
{period === 'YEARLY' && ( { data-plan="free" className="bg-background shadow-foreground/5 flex flex-col items-center justify-center rounded-lg border px-8 py-12 shadow-lg" > -

Free

+

+ Free +

$0

- For small teams and individuals with basic needs. + For small teams and individuals with basic needs.

-

5 standard documents per month

-

Up to 10 recipients per document

-

No credit card required

+

+ 5 standard documents per month +

+

+ Up to 10 recipients per document +

+

+ No credit card required +

@@ -105,7 +114,9 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => { data-plan="individual" className="bg-background shadow-foreground/5 flex flex-col items-center justify-center rounded-lg border-2 px-8 py-12 shadow-[0px_0px_0px_4px_#E3E3E380]" > -

Individual

+

+ Individual +

{period === 'MONTHLY' && $30} @@ -114,7 +125,7 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => {

- Everything you need for a great signing experience. + Everything you need for a great signing experience.

-

Unlimited Documents per Month

-

API Access

-

Email and Discord Support

-

Premium Profile Name

+

+ Unlimited Documents per Month +

+

+ API Access +

+

+ Email and Discord Support +

+

+ Premium Profile Name +

@@ -139,7 +158,9 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => { data-plan="teams" className="border-primary bg-background shadow-foreground/5 flex flex-col items-center justify-center rounded-lg border px-8 py-12 shadow-lg" > -

Teams

+

+ Teams +

{period === 'MONTHLY' && $50} @@ -148,7 +169,7 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => {

- For companies looking to scale across multiple teams. + For companies looking to scale across multiple teams.

-

Unlimited Documents per Month

-

API Access

-

Email and Discord Support

-

Team Inbox

-

5 Users Included

- Add More Users for {period === 'MONTHLY' ? '$10/ mo.' : '$96/ yr.'} + Unlimited Documents per Month +

+

+ API Access +

+

+ Email and Discord Support +

+

+ Team Inbox +

+

+ 5 Users Included +

+

+ Add More Users for {period === 'MONTHLY' ? '$10/ mo.' : '$96/ yr.'}

diff --git a/apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx b/apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx index ad86b8a4a..418e2f712 100644 --- a/apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx +++ b/apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx @@ -2,6 +2,8 @@ import type { HTMLAttributes } from 'react'; import Image from 'next/image'; +import { Trans } from '@lingui/macro'; + import backgroundPattern from '@documenso/assets/images/background-pattern.png'; import cardConnectionsFigure from '@documenso/assets/images/card-connections-figure.png'; import cardPaidFigure from '@documenso/assets/images/card-paid-figure.png'; @@ -26,16 +28,20 @@ export const ShareConnectPaidWidgetBento = ({ />

- Integrates with all your favourite tools. - Send, connect, receive and embed everywhere. + Integrates with all your favourite tools. + + Send, connect, receive and embed everywhere. +

- Easy Sharing (Soon). - Receive your personal link to share with everyone you care about. + + Easy Sharing (Soon). + + Receive your personal link to share with everyone you care about.

@@ -51,9 +57,13 @@ export const ShareConnectPaidWidgetBento = ({

- Connections - Create connections and automations with Zapier and more to integrate with your - favorite tools. + + Connections + + + Create connections and automations with Zapier and more to integrate with your + favorite tools. +

@@ -69,8 +79,12 @@ export const ShareConnectPaidWidgetBento = ({

- Get paid (Soon). - Integrated payments with Stripe so you don’t have to worry about getting paid. + + Get paid (Soon). + + + Integrated payments with Stripe so you don’t have to worry about getting paid. +

@@ -86,9 +100,13 @@ export const ShareConnectPaidWidgetBento = ({

- React Widget (Soon). - Easily embed Documenso into your product. Simply copy and paste our react widget into - your application. + + React Widget (Soon). + + + Easily embed Documenso into your product. Simply copy and paste our react widget + into your application. +

diff --git a/apps/marketing/src/middleware.ts b/apps/marketing/src/middleware.ts new file mode 100644 index 000000000..23e02de7f --- /dev/null +++ b/apps/marketing/src/middleware.ts @@ -0,0 +1,39 @@ +import { cookies } from 'next/headers'; +import type { NextRequest } from 'next/server'; +import { NextResponse } from 'next/server'; + +import { extractSupportedLanguage } from '@documenso/lib/utils/i18n'; + +export default function middleware(req: NextRequest) { + const lang = extractSupportedLanguage({ + headers: req.headers, + cookies: cookies(), + }); + + const response = NextResponse.next(); + + response.cookies.set('i18n', lang); + + return response; +} + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + * - ingest (analytics) + * - site.webmanifest + */ + { + source: '/((?!api|_next/static|_next/image|ingest|favicon|site.webmanifest).*)', + missing: [ + { type: 'header', key: 'next-router-prefetch' }, + { type: 'header', key: 'purpose', value: 'prefetch' }, + ], + }, + ], +}; diff --git a/apps/web/lingui.config.ts b/apps/web/lingui.config.ts new file mode 100644 index 000000000..f129b49ce --- /dev/null +++ b/apps/web/lingui.config.ts @@ -0,0 +1,22 @@ +import type { LinguiConfig } from '@lingui/conf'; + +import { APP_I18N_OPTIONS } from '@documenso/lib/constants/i18n'; + +// Extends root lingui.config.cjs. +const config: LinguiConfig = { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + locales: APP_I18N_OPTIONS.supportedLangs as unknown as string[], + catalogs: [ + { + path: '/../../packages/lib/translations/web/{locale}', + include: ['/apps/web/src'], + }, + { + path: '/../../packages/lib/translations/{locale}/common', + include: ['/packages/ui', '/packages/lib'], + }, + ], + catalogsMergePath: '/../../packages/lib/translations/{locale}/web', +}; + +export default config; diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 88cd0b3fc..5b8f3e60b 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -31,6 +31,7 @@ const config = { serverActions: { bodySizeLimit: '50mb', }, + swcPlugins: [['@lingui/swc-plugin', {}]], }, reactStrictMode: true, transpilePackages: [ @@ -59,6 +60,13 @@ const config = { config.resolve.alias.canvas = false; } + config.module.rules.push({ + test: /\.po$/, + use: { + loader: '@lingui/loader', + }, + }); + return config; }, async rewrites() { diff --git a/apps/web/package.json b/apps/web/package.json index 67b332bd0..8b72b5381 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,7 +11,8 @@ "e2e:prepare": "next build && next start", "lint:fix": "next lint --fix", "clean": "rimraf .next && rimraf node_modules", - "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs" + "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs", + "translate:compile": "lingui compile --typescript" }, "dependencies": { "@documenso/api": "*", @@ -22,6 +23,8 @@ "@documenso/trpc": "*", "@documenso/ui": "*", "@hookform/resolvers": "^3.1.0", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@simplewebauthn/browser": "^9.0.1", "@simplewebauthn/server": "^9.0.3", "@tanstack/react-query": "^4.29.5", @@ -57,6 +60,8 @@ "zod": "^3.22.4" }, "devDependencies": { + "@lingui/loader": "^4.11.1", + "@lingui/swc-plugin": "4.0.6", "@documenso/tailwind-config": "*", "@simplewebauthn/types": "^9.0.1", "@types/formidable": "^2.0.6", @@ -76,4 +81,4 @@ "next": "$next" } } -} +} \ No newline at end of file diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 000000000..1aea4c47f --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,8 @@ +# Any changes to these paths should be reflected in the root lingui.config.ts +files: + - source: packages/lib/translations/en/common.po + translation: packages/lib/translations/%two_letters_code%/%original_file_name% + - source: packages/lib/translations/en/marketing.po + translation: packages/lib/translations/%two_letters_code%/%original_file_name% + - source: packages/lib/translations/en/web.po + translation: packages/lib/translations/%two_letters_code%/%original_file_name% diff --git a/lingui.config.ts b/lingui.config.ts new file mode 100644 index 000000000..855aaf7f5 --- /dev/null +++ b/lingui.config.ts @@ -0,0 +1,28 @@ +import type { LinguiConfig } from '@lingui/conf'; + +import { APP_I18N_OPTIONS } from '@documenso/lib/constants/i18n'; + +const config: LinguiConfig = { + sourceLocale: APP_I18N_OPTIONS.sourceLang, + locales: APP_I18N_OPTIONS.supportedLangs as unknown as string[], + // Any changes to these catalogue paths should be reflected in crowdin.yml + catalogs: [ + { + path: '/packages/lib/translations/{locale}/marketing', + include: ['apps/marketing/src'], + exclude: ['**/node_modules/**'], + }, + { + path: '/packages/lib/translations/{locale}/web', + include: ['apps/web/src'], + exclude: ['**/node_modules/**'], + }, + { + path: '/packages/lib/translations/{locale}/common', + include: ['packages/ui', 'packages/lib'], + exclude: ['**/node_modules/**'], + }, + ], +}; + +export default config; diff --git a/package-lock.json b/package-lock.json index d5abc4487..d4f8b058e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ ], "dependencies": { "@documenso/pdf-sign": "^0.1.0", + "@lingui/core": "^4.11.1", "inngest-cli": "^0.29.1", "next-runtime-env": "^3.2.0", "react": "18.2.0" @@ -20,6 +21,7 @@ "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", + "@lingui/cli": "^4.11.1", "@trigger.dev/cli": "^2.3.18", "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", @@ -87,7 +89,10 @@ "@documenso/trpc": "*", "@documenso/ui": "*", "@hookform/resolvers": "^3.1.0", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@openstatus/react": "^0.0.3", + "cmdk": "^0.2.1", "contentlayer": "^0.3.4", "embla-carousel": "^8.1.3", "embla-carousel-autoplay": "^8.1.3", @@ -114,17 +119,297 @@ "zod": "^3.22.4" }, "devDependencies": { + "@lingui/loader": "^4.11.1", + "@lingui/swc-plugin": "4.0.6", "@types/node": "20.1.0", "@types/react": "18.2.18", "@types/react-dom": "18.2.7" } }, + "apps/marketing/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "apps/marketing/node_modules/@types/node": { "version": "20.1.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", "dev": true }, + "apps/marketing/node_modules/cmdk": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", + "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", + "dependencies": { + "@radix-ui/react-dialog": "1.0.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", + "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.0", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-slot": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", + "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", + "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", + "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", + "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", + "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", + "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "apps/marketing/node_modules/cmdk/node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", + "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "apps/marketing/node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -150,6 +435,8 @@ "@documenso/trpc": "*", "@documenso/ui": "*", "@hookform/resolvers": "^3.1.0", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@simplewebauthn/browser": "^9.0.1", "@simplewebauthn/server": "^9.0.3", "@tanstack/react-query": "^4.29.5", @@ -186,6 +473,8 @@ }, "devDependencies": { "@documenso/tailwind-config": "*", + "@lingui/loader": "^4.11.1", + "@lingui/swc-plugin": "4.0.6", "@simplewebauthn/types": "^9.0.1", "@types/formidable": "^2.0.6", "@types/luxon": "^3.3.1", @@ -235,6 +524,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@anatine/zod-openapi": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/@anatine/zod-openapi/-/zod-openapi-1.14.2.tgz", @@ -1146,81 +1448,136 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", @@ -1242,33 +1599,89 @@ "node": ">=0.10.0" } }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1276,47 +1689,210 @@ } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dependencies": { + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1324,29 +1900,66 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -1417,9 +2030,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1451,25 +2064,25 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2962,7 +3575,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -2970,14 +3582,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -2992,22 +3620,33 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3045,6 +3684,879 @@ "resolved": "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.2.tgz", "integrity": "sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==" }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.11.2.tgz", + "integrity": "sha512-CjIUy55ICw2nQpJeO9Yhoc65nbDje3b/8Ghbux8OUMbtEYguMKi1pA21eYPYDjTUnjglVTDtapEtLN0iNPWHdg==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-4.11.2.tgz", + "integrity": "sha512-onwASvA6KffAos+ceP1K1Hx0mPg6vb3s9Rw7VXSyaUQih225GXlrTZbYKOZkM1XgfMmhN+7kgFrRaqxjiKnLLQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/generator": "^7.21.1", + "@babel/parser": "^7.21.2", + "@babel/runtime": "^7.21.0", + "@babel/types": "^7.21.2", + "@lingui/babel-plugin-extract-messages": "4.11.2", + "@lingui/conf": "4.11.2", + "@lingui/core": "4.11.2", + "@lingui/format-po": "4.11.2", + "@lingui/message-utils": "4.11.2", + "babel-plugin-macros": "^3.0.1", + "chalk": "^4.1.0", + "chokidar": "3.5.1", + "cli-table": "0.3.6", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "date-fns": "^3.6.0", + "esbuild": "^0.17.10", + "glob": "^7.1.4", + "inquirer": "^7.3.3", + "micromatch": "4.0.2", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "pathe": "^1.1.0", + "pkg-up": "^3.1.0", + "pofile": "^1.1.4", + "pseudolocale": "^2.0.0", + "ramda": "^0.27.1", + "source-map": "^0.8.0-beta.0" + }, + "bin": { + "lingui": "dist/lingui.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@lingui/cli/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lingui/cli/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/@lingui/cli/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@lingui/cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@lingui/cli/node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/@lingui/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/@lingui/cli/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@lingui/cli/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@lingui/cli/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@lingui/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/@lingui/cli/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lingui/cli/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/@lingui/conf": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-4.11.2.tgz", + "integrity": "sha512-Kw45dRa3biV8CLg50R0e4vCfU750H5fFJ8zBUAIEtWkksKsRDOvf3l1qxfUF76xuLSCPhdLjYfnmW0FqMe/kdg==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^1.17.1", + "lodash.get": "^4.4.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/core": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-4.11.2.tgz", + "integrity": "sha512-5wFmpHeDbLXEqaEUwlayS4SoqrCbDI3/bVRlwhmdNCeUcUYWh+7dTDlQnp4tPek1x1dEppABIkdN/0qLDdKcBQ==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/message-utils": "4.11.2", + "unraw": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/format-po": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-4.11.2.tgz", + "integrity": "sha512-o5TxpiIjtwObkOipsuNw3zaiHlikhivFfd70paps4Nb5w0Fiaa6pKqvLmIqgsxx7/bgmySr0S/vu8hpAerr4Kg==", + "dev": true, + "dependencies": { + "@lingui/conf": "4.11.2", + "@lingui/message-utils": "4.11.2", + "date-fns": "^3.6.0", + "pofile": "^1.1.4" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/format-po/node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/@lingui/loader": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/loader/-/loader-4.11.2.tgz", + "integrity": "sha512-pQZj7J1iDtp81JjqtWX0pBGX21gwZpk1awKpn9Z8cquFVT2ai8I/0rMhJ3EnKUdutxDhvPDDjYq3AEFkEweXPw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/cli": "4.11.2", + "@lingui/conf": "4.11.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@lingui/macro": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-4.11.2.tgz", + "integrity": "sha512-hipoxMwwD5uKl9t6PHK7Ey/yb6pIgRyFLal2TfkqOH/HCsDR9j6Dusj74szJqzpclJv7zfWgJxk52X/pb+OYpg==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "4.11.2", + "@lingui/core": "4.11.2", + "@lingui/message-utils": "4.11.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@lingui/react": "^4.0.0", + "babel-plugin-macros": "2 || 3" + } + }, + "node_modules/@lingui/macro/node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@lingui/message-utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-4.11.2.tgz", + "integrity": "sha512-3oJk7ZKExk4NVa4d3CM0z0iNqIokaFOWeu7lYVzu0oEX7DP6OxNjlCAtObIhJCB0FdIPz8sXxhDkyDHFj+eIvw==", + "dependencies": { + "@messageformat/parser": "^5.0.0", + "js-sha256": "^0.10.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/react": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-4.11.2.tgz", + "integrity": "sha512-OKHCg3yPW2xhYWoY2kOz+eP7qpdkab+4tERUvJ9QJ9bzQ6OnPLCagaRftB3nqdKuWzKoA5F2VG2QLUhF7DjpGA==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/core": "4.11.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@lingui/swc-plugin": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@lingui/swc-plugin/-/swc-plugin-4.0.6.tgz", + "integrity": "sha512-jW32d+t/faHGrgzZXzGbDmadElqHQ9FvGf2aoq7YelXBPG9cf/lAkZlpxNjAzRhbscupB0YPtBjC49XoIIzKMg==", + "dev": true, + "peerDependencies": { + "@lingui/macro": "4" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "next": { + "optional": true + } + } + }, "node_modules/@ljharb/through": { "version": "2.3.13", "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", @@ -3306,6 +4818,14 @@ "react": ">=16" } }, + "node_modules/@messageformat/parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", + "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", + "dependencies": { + "moo": "^0.5.1" + } + }, "node_modules/@mrleebo/prisma-ast": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.7.0.tgz", @@ -7273,8 +8793,7 @@ "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", @@ -9446,6 +10965,28 @@ "integrity": "sha512-y0M7sqzsnHB6cvAeTCBPrCQNQiZe8U4qdzf8uBVmOWYap5MMTN/gB2iEqrIqFiYcsyvP74GnGD5tgsHttielFw==", "dev": true }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -9491,6 +11032,27 @@ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", "dev": true }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/js-yaml": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", @@ -9593,6 +11155,11 @@ "@types/node": "*" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, "node_modules/@types/parse5": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", @@ -9772,6 +11339,19 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -9960,6 +11540,181 @@ "resolved": "https://registry.npmjs.org/@vvo/tzdb/-/tzdb-6.117.0.tgz", "integrity": "sha512-vZkfoag1kHqItK/zebxT0Fkt3R/zscjgD+Ib7kaAdum0Sz9psXDfVHPW1Benv91d02zPWlLIvZtjBmzX4a+6fw==" }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -9994,6 +11749,16 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -10710,6 +12475,43 @@ "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", "license": "Apache-2.0" }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -10953,9 +12755,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "funding": [ { "type": "opencollective", @@ -10971,10 +12773,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -11298,9 +13100,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001564", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", - "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "funding": [ { "type": "opencollective", @@ -11578,6 +13380,16 @@ "node": ">=10" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -11655,6 +13467,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-table": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", + "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/cli-table3": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", @@ -12298,6 +14122,15 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -12610,6 +14443,12 @@ "node": ">=14" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -12672,7 +14511,6 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -14008,9 +15846,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.593", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.593.tgz", - "integrity": "sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==" + "version": "1.4.818", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==" }, "node_modules/elkjs": { "version": "0.9.2", @@ -14085,9 +15923,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -14222,6 +16060,13 @@ "safe-array-concat": "^1.0.1" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "peer": true + }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -14611,9 +16456,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -15462,6 +17307,16 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/evt": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/evt/-/evt-2.5.7.tgz", @@ -15717,6 +17572,30 @@ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -16225,6 +18104,15 @@ "node": ">=8" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -18758,6 +20646,109 @@ "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/jiti": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", @@ -18898,6 +20889,11 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -19595,6 +21591,16 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -21955,6 +23961,13 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -22714,9 +24727,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/node-sql-parser": { "version": "4.11.0", @@ -24498,9 +26511,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -24616,6 +26629,79 @@ "pathe": "^1.1.0" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/playwright": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.0.tgz", @@ -24657,6 +26743,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -25424,6 +27516,30 @@ "node": ">= 0.10" } }, + "node_modules/pseudolocale": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-2.0.0.tgz", + "integrity": "sha512-g1K9tCQYY4e3UGtnW8qs3kGWAOONxt7i5wuOFvf3N1EIIRhiLVIhZ9AM/ZyGTxsp231JbFywJU/EbJ5ZoqnZdg==", + "dev": true, + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "pseudolocale": "dist/cli.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pseudolocale/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -28262,6 +30378,59 @@ "loose-envify": "^1.1.0" } }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -28361,6 +30530,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -29861,6 +32040,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, "node_modules/text-decoder": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", @@ -31668,9 +33908,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -31686,8 +33926,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -32440,6 +34680,102 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, + "node_modules/webpack": { + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -34849,6 +37185,8 @@ "dependencies": { "@documenso/lib": "*", "@hookform/resolvers": "^3.3.0", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@radix-ui/react-accordion": "^1.1.1", "@radix-ui/react-alert-dialog": "^1.0.3", "@radix-ui/react-aspect-ratio": "^1.0.2", diff --git a/package.json b/package.json index 6041b1dfa..3bbdac637 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,9 @@ "precommit": "npm install && git add package.json package-lock.json", "trigger:dev": "npm run with:env -- npx trigger-cli dev --handler-path=\"/api/jobs\"", "inngest:dev": "inngest dev -u http://localhost:3000/api/jobs", - "make:version": " npm version --workspace @documenso/web --workspace @documenso/marketing --include-workspace-root --no-git-tag-version -m \"v%s\"" + "make:version": " npm version --workspace @documenso/web --workspace @documenso/marketing --include-workspace-root --no-git-tag-version -m \"v%s\"", + "translate:extract": "lingui extract", + "translate:compile": "turbo run translate:compile --filter=@documenso/web --filter=@documenso/marketing --filter=@documenso/ui" }, "packageManager": "npm@10.7.0", "engines": { @@ -41,6 +43,7 @@ "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", + "@lingui/cli": "^4.11.1", "@trigger.dev/cli": "^2.3.18", "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", @@ -60,6 +63,7 @@ ], "dependencies": { "@documenso/pdf-sign": "^0.1.0", + "@lingui/core": "^4.11.1", "inngest-cli": "^0.29.1", "next-runtime-env": "^3.2.0", "react": "18.2.0" @@ -76,4 +80,4 @@ "trigger.dev": { "endpointId": "documenso-app" } -} +} \ No newline at end of file diff --git a/packages/lib/client-only/providers/i18n.client.tsx b/packages/lib/client-only/providers/i18n.client.tsx new file mode 100644 index 000000000..b1dcce428 --- /dev/null +++ b/packages/lib/client-only/providers/i18n.client.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useState } from 'react'; + +import { type Messages, setupI18n } from '@lingui/core'; +import { I18nProvider } from '@lingui/react'; + +export function I18nClientProvider({ + children, + initialLocale, + initialMessages, +}: { + children: React.ReactNode; + initialLocale: string; + initialMessages: Messages; +}) { + const [i18n] = useState(() => { + return setupI18n({ + locale: initialLocale, + messages: { [initialLocale]: initialMessages }, + }); + }); + + return {children}; +} diff --git a/packages/lib/client-only/providers/i18n.server.tsx b/packages/lib/client-only/providers/i18n.server.tsx new file mode 100644 index 000000000..afee70de7 --- /dev/null +++ b/packages/lib/client-only/providers/i18n.server.tsx @@ -0,0 +1,68 @@ +import 'server-only'; + +import { cookies } from 'next/headers'; + +import type { I18n, Messages } from '@lingui/core'; +import { setupI18n } from '@lingui/core'; +import { setI18n } from '@lingui/react/server'; + +import { IS_APP_WEB } from '../../constants/app'; +import { SUPPORTED_LANGUAGE_CODES } from '../../constants/i18n'; +import { extractSupportedLanguage } from '../../utils/i18n'; + +type SupportedLocales = (typeof SUPPORTED_LANGUAGE_CODES)[number]; + +async function loadCatalog(locale: SupportedLocales): Promise<{ + [k: string]: Messages; +}> { + const { messages } = await import( + `../../translations/${locale}/${IS_APP_WEB ? 'web' : 'marketing'}.js` + ); + + return { + [locale]: messages, + }; +} + +const catalogs = await Promise.all(SUPPORTED_LANGUAGE_CODES.map(loadCatalog)); + +// transform array of catalogs into a single object +export const allMessages = catalogs.reduce((acc, oneCatalog) => { + return { ...acc, ...oneCatalog }; +}, {}); + +type AllI18nInstances = { [K in SupportedLocales]: I18n }; + +// eslint-disable-next-line @typescript-eslint/consistent-type-assertions +export const allI18nInstances = SUPPORTED_LANGUAGE_CODES.reduce((acc, locale) => { + const messages = allMessages[locale] ?? {}; + + const i18n = setupI18n({ + locale, + messages: { [locale]: messages }, + }); + + return { ...acc, [locale]: i18n }; +}, {}) as AllI18nInstances; + +/** + * This needs to be run in all layouts and page server components that require i18n. + * + * https://lingui.dev/tutorials/react-rsc#pages-layouts-and-lingui + */ +export const setupI18nSSR = (overrideLang?: SupportedLocales) => { + const lang = + overrideLang || + extractSupportedLanguage({ + cookies: cookies(), + }); + + // Get and set a ready-made i18n instance for the given language. + const i18n = allI18nInstances[lang]; + setI18n(i18n); + + return { + lang, + i18n, + }; +}; diff --git a/packages/lib/constants/i18n.ts b/packages/lib/constants/i18n.ts new file mode 100644 index 000000000..8728b4307 --- /dev/null +++ b/packages/lib/constants/i18n.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; + +export const SUPPORTED_LANGUAGE_CODES = ['de', 'en'] as const; + +export const ZSupportedLanguageCodeSchema = z.enum(SUPPORTED_LANGUAGE_CODES).catch('en'); + +export type SupportedLanguageCodes = (typeof SUPPORTED_LANGUAGE_CODES)[number]; + +export const APP_I18N_OPTIONS = { + supportedLangs: SUPPORTED_LANGUAGE_CODES, + sourceLang: 'en', +} as const; + +type SupportedLanguage = { + full: string; + short: string; +}; + +export const SUPPORTED_LANGUAGES: Record = { + de: { + full: 'German', + short: 'de', + }, + en: { + full: 'English', + short: 'en', + }, +} satisfies Record; diff --git a/packages/lib/server-only/i18n/switch-i18n-language.ts b/packages/lib/server-only/i18n/switch-i18n-language.ts new file mode 100644 index 000000000..168d3e00c --- /dev/null +++ b/packages/lib/server-only/i18n/switch-i18n-language.ts @@ -0,0 +1,8 @@ +'use server'; + +import { cookies } from 'next/headers'; + +// eslint-disable-next-line @typescript-eslint/require-await +export const switchI18NLanguage = async (lang: string) => { + cookies().set('i18n', lang); +}; diff --git a/packages/lib/translations/de/common.po b/packages/lib/translations/de/common.po new file mode 100644 index 000000000..d53f5a228 --- /dev/null +++ b/packages/lib/translations/de/common.po @@ -0,0 +1,19 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: de\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-24 13:34\n" +"Last-Translator: \n" +"Language-Team: German\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: common.po\n" +"X-Crowdin-File-ID: 4\n" diff --git a/packages/lib/translations/de/marketing.js b/packages/lib/translations/de/marketing.js new file mode 100644 index 000000000..d178b5954 --- /dev/null +++ b/packages/lib/translations/de/marketing.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{\"J/hVSQ\":[[\"0\"]],\"u0zktA\":\"5 Standarddokumente pro Monat\",\"rKtmiD\":\"5 Benutzer inbegriffen\",\"vaHmll\":\"Eine 10x bessere Signaturerfahrung.\",\"gBefbz\":[\"Mehr Benutzer hinzufügen für \",[\"0\"]],\"XkF8tv\":\"Alle unsere Kennzahlen, Finanzen und Erkenntnisse sind öffentlich. Wir glauben an Transparenz und möchten unsere Reise mit Ihnen teilen. Mehr erfahren Sie hier: <0>Ankündigung Offene Kennzahlen\",\"tkQ/WI\":\"Erhobener Betrag\",\"qOMroC\":\"API-Zugriff\",\"FNv8t7\":\"Schön.\",\"W/TUoX\":\"Weil Unterschriften gefeiert werden sollten. Deshalb kümmern wir uns um jedes kleinste Detail in unserem Produkt.\",\"astDB+\":\"Blog\",\"7zGun7\":\"Aufbauen oben drauf.\",\"fxgcNV\":\"Kann ich Documenso kommerziell nutzen?\",\"V+D/YP\":\"Karrieren\",\"CWe7wB\":\"Änderungsprotokoll\",\"JZbmjL\":\"Wählen Sie eine Vorlage aus dem Community-App-Store. Oder reichen Sie Ihre eigene Vorlage ein, damit andere sie benutzen können.\",\"chL5IG\":\"Gemeinschaft\",\"p5+XQN\":\"Fertige Dokumente\",\"NApCXa\":\"Fertige Dokumente pro Monat\",\"z5kV0h\":\"Verbindungen\",\"YcfUZ9\":\"Kontaktiere uns\",\"1NJjIG\":\"Erstellen Sie Verbindungen und Automatisierungen mit Zapier und mehr, um sich mit Ihren Lieblingstools zu integrieren.\",\"rr83qK\":\"Erstellen Sie Ihr Konto und beginnen Sie mit der Nutzung modernster Dokumentensignaturen. Offene und schöne Signaturen sind zum Greifen nah.\",\"75ojt0\":\"Kunden mit einer aktiven Abonnements.\",\"pF9qTh\":\"Anpassen und erweitern.\",\"f8fH8W\":\"Design\",\"W6qD1T\":\"Entwickelt für jede Phase Ihrer Reise.\",\"K6KbY4\":\"Direktlink\",\"aLD+Td\":\"Documenso ist eine Gemeinschaftsanstrengung, um ein offenes und lebendiges Ökosystem um ein Werkzeug zu schaffen, das jeder frei nutzen und anpassen kann. Indem wir wirklich offen sind, wollen wir vertrauenswürdige Infrastruktur für die Zukunft des Internets schaffen.\",\"32yG8y\":\"Documenso auf X\",\"+1xAO7\":\"Unterschriften,<0/>endlich Open Source.\",\"TvY/XA\":\"Dokumentation\",\"tSS7hj\":\"Betten Sie Documenso ganz einfach in Ihr Produkt ein. Kopieren und fügen Sie einfach unser React-Widget in Ihre Anwendung ein.\",\"BWMGM4\":\"Einfaches Teilen (Bald).\",\"V6EY8B\":\"E-Mail- und Discord-Support\",\"C0/bri\":\"Beteiligung\",\"8Zy3YU\":\"Enterprise-Konformität, Lizenz- oder technische Bedürfnisse?\",\"ZSW8id\":\"Alles, was Sie für ein großartiges Signaturerlebnis benötigen.\",\"sXswT6\":\"Schnell.\",\"cT9Z9e\":\"Schneller, intelligenter und schöner.\",\"k/ANik\":\"Finanzen\",\"I7Exsw\":\"Folgen Sie uns auf X\",\"f3Botn\":\"Für Unternehmen, die über mehrere Teams skalieren möchten.\",\"y2DcZj\":\"Für kleine Teams und Einzelpersonen mit grundlegenden Bedürfnissen.\",\"2POOFK\":\"Kostenlos\",\"OdieZe\":\"Aus dem Blog\",\"IPgkVQ\":\"Vollzeit\",\"aSWzT9\":\"Lassen Sie sich bezahlen (Bald).\",\"ZDIydz\":\"Loslegen\",\"c3b0B0\":\"Loslegen\",\"pS8wej\":\"Fangen Sie heute an.\",\"7FPIvI\":\"Erhalten Sie die neuesten Nachrichten von Documenso, einschließlich Produkt-Updates, Team-Ankündigungen und mehr!\",\"kV0qBq\":\"GitHub: Gesamte PRs zusammengeführt\",\"652R6j\":\"GitHub: Gesamte offene Issues\",\"R1aJ0W\":\"GitHub: Gesamtanzahl Sterne\",\"P1ovAc\":\"Globale Gehaltsbänder\",\"IAq/yr\":\"Wachstum\",\"Xi7f+z\":\"Wie kann ich beitragen?\",\"9VGuMA\":\"Wie gehen Sie mit meinen Daten um?\",\"fByw/g\":\"Einzelperson\",\"Csm+TN\":\"Integrierte Zahlungen mit Stripe, sodass Sie sich keine Sorgen ums Bezahlen machen müssen.\",\"phSPy7\":\"Integriert sich mit all Ihren Lieblingstools.\",\"pfjrI2\":\"Gibt es mehr?\",\"LOyqaC\":\"Es liegt an Ihnen. Entweder klonen Sie unser Repository oder nutzen unsere einfach zu bedienende Hosting-Lösung.\",\"PCgMVa\":\"Eintrittsdatum\",\"TgL4dH\":\"Treten Sie der Open Signing-Bewegung bei\",\"wJijgU\":\"Standort\",\"OIowgO\":\"Machen Sie es zu Ihrem eigenen durch erweiterte Anpassung und Einstellbarkeit.\",\"GHelWd\":\"Zusammengeführte PRs\",\"vXBVQZ\":\"Zusammengeführte PRs\",\"+8Nek/\":\"Monatlich\",\"6YtxFj\":\"Name\",\"CtgXe4\":\"Neue Benutzer\",\"OpNhRn\":\"Keine Kreditkarte erforderlich\",\"6C9AxJ\":\"Keine Kreditkarte erforderlich\",\"igwAqT\":\"Keines dieser Angebote passt zu Ihnen? Versuchen Sie das Selbst-Hosting!\",\"jjAtjQ\":\"Offene Issues\",\"b76QYo\":\"Open Source oder Hosted.\",\"OWsQIe\":\"Offenes Startup\",\"Un80BR\":\"OSS-Freunde\",\"6zNyfI\":\"Unsere benutzerdefinierten Vorlagen verfügen über intelligente Regeln, die Ihnen Zeit und Energie sparen können.\",\"+OmhKD\":\"Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features.\",\"eK0veR\":\"Unsere Enterprise-Lizenz ist ideal für große Organisationen, die zu Documenso für all ihre Unterzeichnungsbedürfnisse wechseln möchten. Sie ist für unser Cloud-Angebot sowie für selbstgehostete Setups verfügbar und bietet eine breite Palette regulatorischer und administrativer Funktionen.\",\"I2ufwS\":\"Unsere selbstgehostete Option ist ideal für kleine Teams und Einzelpersonen, die eine einfache Lösung benötigen. Sie können unser docker-basiertes Setup verwenden, um in wenigen Minuten loszulegen. Übernehmen Sie die Kontrolle mit vollständiger Anpassbarkeit und Datenhoheit.\",\"F9564X\":\"Teilzeit\",\"qJVkX+\":\"Premium Profilname\",\"aHCEmh\":\"Preise\",\"rjGI/Q\":\"Datenschutz\",\"vERlcd\":\"Profil\",\"77/8W2\":\"React Widget (Demnächst).\",\"OYoVNk\":\"Erhalten Sie Ihren persönlichen Link zum Teilen mit allen, die Ihnen wichtig sind.\",\"GDvlUT\":\"Rolle\",\"bUqwb8\":\"Gehalt\",\"GNfoAO\":\"Sparen Sie $60 oder $120\",\"StoBff\":\"Sprachen suchen...\",\"dhi4w4\":\"Sicher. Unsere Rechenzentren befinden sich in Frankfurt (Deutschland) und bieten uns die besten lokalen Datenschutzgesetze. Uns ist die sensible Natur unserer Daten sehr bewusst und wir folgen bewährten Praktiken, um die Sicherheit und Integrität der uns anvertrauten Daten zu gewährleisten.\",\"kZBxnz\":\"Überall senden, verbinden, empfangen und einbetten.\",\"eSfS30\":\"Dienstalter\",\"aoDa18\":\"Shop\",\"5lWFkC\":\"Anmelden\",\"e+RpCP\":\"Registrieren\",\"4yiZOB\":\"Signaturprozess\",\"RkUXMm\":\"Jetzt registrieren\",\"omz3DH\":\"Intelligent.\",\"AvYbUL\":\"Auf GitHub favorisieren\",\"y2dGtU\":\"Favoriten\",\"uAQUqI\":\"Status\",\"XYLcNv\":\"Support\",\"KM6m8p\":\"Team\",\"lm5v+6\":\"Team-Posteingang\",\"CAL6E9\":\"Teams\",\"w4nM1s\":\"Vorlagen-Shop (Demnächst).\",\"yFoQ27\":\"Das ist großartig. Sie können sich die aktuellen <0>Issues ansehen und unserer <1>Discord-Community beitreten, um auf dem neuesten Stand zu bleiben, was die aktuellen Prioritäten sind. In jedem Fall sind wir eine offene Gemeinschaft und begrüßen jegliche Beiträge, technische und nicht-technische ❤️\",\"GE1BlA\":\"Diese Seite entwickelt sich weiter, während wir lernen, was ein großartiges Signing-Unternehmen ausmacht. Wir werden sie aktualisieren, wenn wir mehr zu teilen haben.\",\"MHrjPM\":\"Titel\",\"2YvdxE\":\"Insgesamt Abgeschlossene Dokumente\",\"8e4lIo\":\"Insgesamt Kunden\",\"bPpoCb\":\"Insgesamt Finanzierungsvolumen\",\"vb0Q0/\":\"Gesamtanzahl der Benutzer\",\"mgQhDS\":\"Wirklich Ihr Eigenes.\",\"4McJfQ\":\"Probieren Sie unseren Gratisplan aus\",\"9mkNAn\":\"Twitter-Statistiken\",\"CHzOWB\":\"Unbegrenzte Dokumente pro Monat\",\"BOV7DD\":\"Bis zu 10 Empfänger pro Dokument\",\"vdAd7c\":\"Die Nutzung unserer gehosteten Version ist der einfachste Weg, um zu starten. Sie können einfach abonnieren und mit der Unterzeichnung Ihrer Dokumente beginnen. Wir kümmern uns um die Infrastruktur, damit Sie sich auf Ihr Geschäft konzentrieren können. Zudem profitieren Sie bei der Nutzung unserer gehosteten Version von unseren vertrauenswürdigen Signaturzertifikaten, die Ihnen helfen, Vertrauen bei Ihren Kunden aufzubauen.\",\"W2nDs0\":\"Alle Statistiken anzeigen\",\"WMfAK8\":\"Wir helfen Ihnen gerne unter <0>support@documenso.com oder <1>in unserem Discord-Support-Kanal. Bitte senden Sie Lucas oder Timur eine Nachricht, um dem Kanal beizutreten, falls Sie noch kein Mitglied sind.\",\"ZaMyxU\":\"Was ist der Unterschied zwischen den Plänen?\",\"8GpyFt\":\"Wenn es um das Senden oder Empfangen eines Vertrags geht, können Sie auf blitzschnelle Geschwindigkeiten zählen.\",\"HEDnID\":\"Wo kann ich Unterstützung bekommen?\",\"sib3h3\":\"Warum sollte ich Documenso gegenüber DocuSign oder einem anderen Signatur-Tool bevorzugen?\",\"cVPDPt\":\"Warum sollte ich Ihren Hosting-Service nutzen?\",\"zkWmBh\":\"Jährlich\",\"8AKApo\":\"Ja! Documenso wird unter der GNU AGPL V3 Open-Source-Lizenz angeboten. Das bedeutet, dass Sie es kostenlos nutzen und sogar an Ihre Bedürfnisse anpassen können, solange Sie Ihre Änderungen unter derselben Lizenz veröffentlichen.\",\"rzQpex\":\"Sie können Documenso kostenlos selbst hosten oder unsere sofort einsatzbereite gehostete Version nutzen. Die gehostete Version bietet zusätzlichen Support, schmerzfreie Skalierbarkeit und mehr. Frühzeitige Anwender erhalten in diesem Jahr Zugriff auf alle Funktionen, die wir entwickeln, ohne zusätzliche Kosten! Für immer! Ja, das beinhaltet später mehrere Benutzer pro Konto. Wenn Sie Documenso für Ihr Unternehmen möchten, sprechen wir gerne über Ihre Bedürfnisse.\",\"1j9aoC\":\"Ihr Browser unterstützt das Video-Tag nicht.\"}")}; \ No newline at end of file diff --git a/packages/lib/translations/de/marketing.po b/packages/lib/translations/de/marketing.po new file mode 100644 index 000000000..aee26aa75 --- /dev/null +++ b/packages/lib/translations/de/marketing.po @@ -0,0 +1,598 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: de\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-24 13:56\n" +"Last-Translator: \n" +"Language-Team: German\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: marketing.po\n" +"X-Crowdin-File-ID: 6\n" + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:45 +msgid "{0}" +msgstr "{0}" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:100 +msgid "5 standard documents per month" +msgstr "5 Standarddokumente pro Monat" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:198 +msgid "5 Users Included" +msgstr "5 Benutzer inbegriffen" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:30 +msgid "A 10x better signing experience." +msgstr "Eine 10x bessere Signaturerfahrung." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:201 +msgid "Add More Users for {0}" +msgstr "Mehr Benutzer hinzufügen für {0}" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" +msgstr "Alle unsere Kennzahlen, Finanzen und Erkenntnisse sind öffentlich. Wir glauben an Transparenz und möchten unsere Reise mit Ihnen teilen. Mehr erfahren Sie hier: <0>Ankündigung Offene Kennzahlen" + +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:58 +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:65 +msgid "Amount Raised" +msgstr "Erhobener Betrag" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:145 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:189 +msgid "API Access" +msgstr "API-Zugriff" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:63 +msgid "Beautiful." +msgstr "Schön." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:65 +msgid "Because signing should be celebrated. That’s why we care about the smallest detail in our product." +msgstr "Weil Unterschriften gefeiert werden sollten. Deshalb kümmern wir uns um jedes kleinste Detail in unserem Produkt." + +#: apps/marketing/src/components/(marketing)/footer.tsx:35 +#: apps/marketing/src/components/(marketing)/header.tsx:57 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:36 +msgid "Blog" +msgstr "Blog" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:60 +msgid "Build on top." +msgstr "Aufbauen oben drauf." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:163 +msgid "Can I use Documenso commercially?" +msgstr "Kann ich Documenso kommerziell nutzen?" + +#: apps/marketing/src/components/(marketing)/footer.tsx:42 +msgid "Careers" +msgstr "Karrieren" + +#: apps/marketing/src/components/(marketing)/footer.tsx:36 +msgid "Changelog" +msgstr "Änderungsprotokoll" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:81 +msgid "Choose a template from the community app store. Or submit your own template for others to use." +msgstr "Wählen Sie eine Vorlage aus dem Community-App-Store. Oder reichen Sie Ihre eigene Vorlage ein, damit andere sie benutzen können." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +msgid "Community" +msgstr "Gemeinschaft" + +#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:55 +msgid "Completed Documents" +msgstr "Fertige Dokumente" + +#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:33 +msgid "Completed Documents per Month" +msgstr "Fertige Dokumente pro Monat" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:61 +msgid "Connections" +msgstr "Verbindungen" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:35 +msgid "Contact Us" +msgstr "Kontaktiere uns" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:63 +msgid "Create connections and automations with Zapier and more to integrate with your favorite tools." +msgstr "Erstellen Sie Verbindungen und Automatisierungen mit Zapier und mehr, um sich mit Ihren Lieblingstools zu integrieren." + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:23 +msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." +msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit der Nutzung modernster Dokumentensignaturen. Offene und schöne Signaturen sind zum Greifen nah." + +#: apps/marketing/src/app/(marketing)/open/tooltip.tsx:35 +msgid "Customers with an Active Subscriptions." +msgstr "Kunden mit einer aktiven Abonnements." + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:29 +msgid "Customise and expand." +msgstr "Anpassen und erweitern." + +#: apps/marketing/src/components/(marketing)/footer.tsx:38 +msgid "Design" +msgstr "Design" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:44 +msgid "Designed for every stage of your journey." +msgstr "Entwickelt für jede Phase Ihrer Reise." + +#: apps/marketing/src/components/(marketing)/carousel.tsx:37 +msgid "Direct Link" +msgstr "Direktlink" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:181 +msgid "Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet." +msgstr "Documenso ist eine Gemeinschaftsanstrengung, um ein offenes und lebendiges Ökosystem um ein Werkzeug zu schaffen, das jeder frei nutzen und anpassen kann. Indem wir wirklich offen sind, wollen wir vertrauenswürdige Infrastruktur für die Zukunft des Internets schaffen." + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:28 +msgid "Documenso on X" +msgstr "Documenso auf X" + +#: apps/marketing/src/components/(marketing)/hero.tsx:100 +msgid "Document signing,<0/>finally open source." +msgstr "Unterschriften,<0/>endlich Open Source." + +#: apps/marketing/src/components/(marketing)/footer.tsx:33 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:28 +msgid "Documentation" +msgstr "Dokumentation" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:106 +msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application." +msgstr "Betten Sie Documenso ganz einfach in Ihr Produkt ein. Kopieren und fügen Sie einfach unser React-Widget in Ihre Anwendung ein." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42 +msgid "Easy Sharing (Soon)." +msgstr "Einfaches Teilen (Bald)." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:148 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:192 +msgid "Email and Discord Support" +msgstr "E-Mail- und Discord-Support" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:43 +msgid "Engagement" +msgstr "Beteiligung" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:16 +msgid "Enterprise Compliance, License or Technical Needs?" +msgstr "Enterprise-Konformität, Lizenz- oder technische Bedürfnisse?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:128 +msgid "Everything you need for a great signing experience." +msgstr "Alles, was Sie für ein großartiges Signaturerlebnis benötigen." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:41 +msgid "Fast." +msgstr "Schnell." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:32 +msgid "Faster, smarter and more beautiful." +msgstr "Schneller, intelligenter und schöner." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +msgid "Finances" +msgstr "Finanzen" + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:38 +msgid "Follow us on X" +msgstr "Folgen Sie uns auf X" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:172 +msgid "For companies looking to scale across multiple teams." +msgstr "Für Unternehmen, die über mehrere Teams skalieren möchten." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:85 +msgid "For small teams and individuals with basic needs." +msgstr "Für kleine Teams und Einzelpersonen mit grundlegenden Bedürfnissen." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:80 +msgid "Free" +msgstr "Kostenlos" + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:26 +msgid "From the blog" +msgstr "Aus dem Blog" + +#: apps/marketing/src/app/(marketing)/open/data.ts:9 +#: apps/marketing/src/app/(marketing)/open/data.ts:17 +#: apps/marketing/src/app/(marketing)/open/data.ts:33 +#: apps/marketing/src/app/(marketing)/open/data.ts:41 +#: apps/marketing/src/app/(marketing)/open/data.ts:49 +msgid "Full-Time" +msgstr "Vollzeit" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:83 +msgid "Get paid (Soon)." +msgstr "Lassen Sie sich bezahlen (Bald)." + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:31 +msgid "Get started" +msgstr "Loslegen" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:75 +msgid "Get Started" +msgstr "Loslegen" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:47 +msgid "Get started today." +msgstr "Fangen Sie heute an." + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:30 +msgid "Get the latest news from Documenso, including product updates, team announcements and more!" +msgstr "Erhalten Sie die neuesten Nachrichten von Documenso, einschließlich Produkt-Updates, Team-Ankündigungen und mehr!" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +msgid "GitHub: Total Merged PRs" +msgstr "GitHub: Gesamte PRs zusammengeführt" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +msgid "GitHub: Total Open Issues" +msgstr "GitHub: Gesamte offene Issues" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +msgid "GitHub: Total Stars" +msgstr "GitHub: Gesamtanzahl Sterne" + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:23 +msgid "Global Salary Bands" +msgstr "Globale Gehaltsbänder" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +msgid "Growth" +msgstr "Wachstum" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:134 +msgid "How can I contribute?" +msgstr "Wie kann ich beitragen?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:105 +msgid "How do you handle my data?" +msgstr "Wie gehen Sie mit meinen Daten um?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:118 +msgid "Individual" +msgstr "Einzelperson" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:85 +msgid "Integrated payments with Stripe so you don’t have to worry about getting paid." +msgstr "Integrierte Zahlungen mit Stripe, sodass Sie sich keine Sorgen ums Bezahlen machen müssen." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:31 +msgid "Integrates with all your favourite tools." +msgstr "Integriert sich mit all Ihren Lieblingstools." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +msgid "Is there more?" +msgstr "Gibt es mehr?" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:40 +msgid "It’s up to you. Either clone our repository or rely on our easy to use hosting solution." +msgstr "Es liegt an Ihnen. Entweder klonen Sie unser Repository oder nutzen unsere einfach zu bedienende Hosting-Lösung." + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:49 +msgid "Join Date" +msgstr "Eintrittsdatum" + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:19 +msgid "Join the Open Signing Movement" +msgstr "Treten Sie der Open Signing-Bewegung bei" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:46 +msgid "Location" +msgstr "Standort" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:62 +msgid "Make it your own through advanced customization and adjustability." +msgstr "Machen Sie es zu Ihrem eigenen durch erweiterte Anpassung und Einstellbarkeit." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +msgid "Merged PR's" +msgstr "Zusammengeführte PRs" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +msgid "Merged PRs" +msgstr "Zusammengeführte PRs" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:40 +msgid "Monthly" +msgstr "Monatlich" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:34 +msgid "Name" +msgstr "Name" + +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:43 +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:52 +msgid "New Users" +msgstr "Neue Benutzer" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:106 +msgid "No credit card required" +msgstr "Keine Kreditkarte erforderlich" + +#: apps/marketing/src/components/(marketing)/callout.tsx:29 +#: apps/marketing/src/components/(marketing)/hero.tsx:121 +msgid "No Credit Card required" +msgstr "Keine Kreditkarte erforderlich" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:61 +msgid "None of these work for you? Try self-hosting!" +msgstr "Keines dieser Angebote passt zu Ihnen? Versuchen Sie das Selbst-Hosting!" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:194 +#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +msgid "Open Issues" +msgstr "Offene Issues" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:38 +msgid "Open Source or Hosted." +msgstr "Open Source oder Hosted." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/components/(marketing)/footer.tsx:37 +#: apps/marketing/src/components/(marketing)/header.tsx:64 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 +msgid "Open Startup" +msgstr "Offenes Startup" + +#: apps/marketing/src/components/(marketing)/footer.tsx:41 +msgid "OSS Friends" +msgstr "OSS-Freunde" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:87 +msgid "Our custom templates come with smart rules that can help you save time and energy." +msgstr "Unsere benutzerdefinierten Vorlagen verfügen über intelligente Regeln, die Ihnen Zeit und Energie sparen können." + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:20 +msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features." +msgstr "" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:20 +#~ msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features." +#~ msgstr "Unsere Enterprise-Lizenz ist ideal für große Organisationen, die zu Documenso für all ihre Unterzeichnungsbedürfnisse wechseln möchten. Sie ist für unser Cloud-Angebot sowie für selbstgehostete Setups verfügbar und bietet eine breite Palette regulatorischer und administrativer Funktionen." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65 +msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership." +msgstr "Unsere selbstgehostete Option ist ideal für kleine Teams und Einzelpersonen, die eine einfache Lösung benötigen. Sie können unser docker-basiertes Setup verwenden, um in wenigen Minuten loszulegen. Übernehmen Sie die Kontrolle mit vollständiger Anpassbarkeit und Datenhoheit." + +#: apps/marketing/src/app/(marketing)/open/data.ts:25 +msgid "Part-Time" +msgstr "Teilzeit" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151 +msgid "Premium Profile Name" +msgstr "Premium Profilname" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:40 +#: apps/marketing/src/components/(marketing)/footer.tsx:31 +#: apps/marketing/src/components/(marketing)/header.tsx:42 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:24 +msgid "Pricing" +msgstr "Preise" + +#: apps/marketing/src/components/(marketing)/footer.tsx:43 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:53 +msgid "Privacy" +msgstr "Datenschutz" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:55 +msgid "Profile" +msgstr "Profil" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:104 +msgid "React Widget (Soon)." +msgstr "React Widget (Demnächst)." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:44 +msgid "Receive your personal link to share with everyone you care about." +msgstr "Erhalten Sie Ihren persönlichen Link zum Teilen mit allen, die Ihnen wichtig sind." + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:37 +msgid "Role" +msgstr "Rolle" + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:37 +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:40 +msgid "Salary" +msgstr "Gehalt" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:62 +msgid "Save $60 or $120" +msgstr "Sparen Sie $60 oder $120" + +#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47 +msgid "Search languages..." +msgstr "Sprachen suchen..." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109 +msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us." +msgstr "Sicher. Unsere Rechenzentren befinden sich in Frankfurt (Deutschland) und bieten uns die besten lokalen Datenschutzgesetze. Uns ist die sensible Natur unserer Daten sehr bewusst und wir folgen bewährten Praktiken, um die Sicherheit und Integrität der uns anvertrauten Daten zu gewährleisten." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:33 +msgid "Send, connect, receive and embed everywhere." +msgstr "Überall senden, verbinden, empfangen und einbetten." + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:34 +msgid "Seniority" +msgstr "Dienstalter" + +#: apps/marketing/src/components/(marketing)/footer.tsx:39 +msgid "Shop" +msgstr "Shop" + +#: apps/marketing/src/components/(marketing)/header.tsx:72 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:61 +msgid "Sign in" +msgstr "Anmelden" + +#: apps/marketing/src/components/(marketing)/header.tsx:77 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:57 +msgid "Sign up" +msgstr "Registrieren" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:19 +msgid "Signing Process" +msgstr "Signaturprozess" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:94 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:136 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:180 +msgid "Signup Now" +msgstr "Jetzt registrieren" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:85 +msgid "Smart." +msgstr "Intelligent." + +#: apps/marketing/src/components/(marketing)/hero.tsx:128 +msgid "Star on GitHub" +msgstr "Auf GitHub favorisieren" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +msgid "Stars" +msgstr "Favoriten" + +#: apps/marketing/src/components/(marketing)/footer.tsx:40 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:44 +msgid "Status" +msgstr "Status" + +#: apps/marketing/src/components/(marketing)/footer.tsx:34 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:48 +msgid "Support" +msgstr "Support" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:26 +msgid "Team" +msgstr "Team" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:195 +msgid "Team Inbox" +msgstr "Team-Posteingang" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:25 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:162 +msgid "Teams" +msgstr "Teams" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:79 +msgid "Template Store (Soon)." +msgstr "Vorlagen-Shop (Demnächst)." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:138 +msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" +msgstr "Das ist großartig. Sie können sich die aktuellen <0>Issues ansehen und unserer <1>Discord-Community beitreten, um auf dem neuesten Stand zu bleiben, was die aktuellen Prioritäten sind. In jedem Fall sind wir eine offene Gemeinschaft und begrüßen jegliche Beiträge, technische und nicht-technische ❤️" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." +msgstr "Diese Seite entwickelt sich weiter, während wir lernen, was ein großartiges Signing-Unternehmen ausmacht. Wir werden sie aktualisieren, wenn wir mehr zu teilen haben." + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:31 +msgid "Title" +msgstr "Titel" + +#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:55 +msgid "Total Completed Documents" +msgstr "Insgesamt Abgeschlossene Dokumente" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:267 +#: apps/marketing/src/app/(marketing)/open/page.tsx:268 +msgid "Total Customers" +msgstr "Insgesamt Kunden" + +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:29 +msgid "Total Funding Raised" +msgstr "Insgesamt Finanzierungsvolumen" + +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:43 +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:52 +msgid "Total Users" +msgstr "Gesamtanzahl der Benutzer" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:27 +msgid "Truly your own." +msgstr "Wirklich Ihr Eigenes." + +#: apps/marketing/src/components/(marketing)/callout.tsx:27 +#: apps/marketing/src/components/(marketing)/hero.tsx:119 +msgid "Try our Free Plan" +msgstr "Probieren Sie unseren Gratisplan aus" + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:20 +msgid "Twitter Stats" +msgstr "Twitter-Statistiken" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:142 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:186 +msgid "Unlimited Documents per Month" +msgstr "Unbegrenzte Dokumente pro Monat" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:103 +msgid "Up to 10 recipients per document" +msgstr "Bis zu 10 Empfänger pro Dokument" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:123 +msgid "Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers." +msgstr "Die Nutzung unserer gehosteten Version ist der einfachste Weg, um zu starten. Sie können einfach abonnieren und mit der Unterzeichnung Ihrer Dokumente beginnen. Wir kümmern uns um die Infrastruktur, damit Sie sich auf Ihr Geschäft konzentrieren können. Zudem profitieren Sie bei der Nutzung unserer gehosteten Version von unseren vertrauenswürdigen Signaturzertifikaten, die Ihnen helfen, Vertrauen bei Ihren Kunden aufzubauen." + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:33 +msgid "View all stats" +msgstr "Alle Statistiken anzeigen" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:195 +msgid "We are happy to assist you at <0>support@documenso.com or <1>in our Discord-Support-Channel please message either Lucas or Timur to get added to the channel if you are not already a member." +msgstr "Wir helfen Ihnen gerne unter <0>support@documenso.com oder <1>in unserem Discord-Support-Kanal. Bitte senden Sie Lucas oder Timur eine Nachricht, um dem Kanal beizutreten, falls Sie noch kein Mitglied sind." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:89 +msgid "What is the difference between the plans?" +msgstr "Was ist der Unterschied zwischen den Plänen?" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:43 +msgid "When it comes to sending or receiving a contract, you can count on lightning-fast speeds." +msgstr "Wenn es um das Senden oder Empfangen eines Vertrags geht, können Sie auf blitzschnelle Geschwindigkeiten zählen." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:191 +msgid "Where can I get support?" +msgstr "Wo kann ich Unterstützung bekommen?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:177 +msgid "Why should I prefer Documenso over DocuSign or some other signing tool?" +msgstr "Warum sollte ich Documenso gegenüber DocuSign oder einem anderen Signatur-Tool bevorzugen?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:119 +msgid "Why should I use your hosting service?" +msgstr "Warum sollte ich Ihren Hosting-Service nutzen?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:60 +msgid "Yearly" +msgstr "Jährlich" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:167 +msgid "Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license." +msgstr "Ja! Documenso wird unter der GNU AGPL V3 Open-Source-Lizenz angeboten. Das bedeutet, dass Sie es kostenlos nutzen und sogar an Ihre Bedürfnisse anpassen können, solange Sie Ihre Änderungen unter derselben Lizenz veröffentlichen." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:93 +msgid "You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs." +msgstr "Sie können Documenso kostenlos selbst hosten oder unsere sofort einsatzbereite gehostete Version nutzen. Die gehostete Version bietet zusätzlichen Support, schmerzfreie Skalierbarkeit und mehr. Frühzeitige Anwender erhalten in diesem Jahr Zugriff auf alle Funktionen, die wir entwickeln, ohne zusätzliche Kosten! Für immer! Ja, das beinhaltet später mehrere Benutzer pro Konto. Wenn Sie Documenso für Ihr Unternehmen möchten, sprechen wir gerne über Ihre Bedürfnisse." + +#: apps/marketing/src/components/(marketing)/carousel.tsx:258 +msgid "Your browser does not support the video tag." +msgstr "Ihr Browser unterstützt das Video-Tag nicht." diff --git a/packages/lib/translations/de/web.js b/packages/lib/translations/de/web.js new file mode 100644 index 000000000..3975ff70f --- /dev/null +++ b/packages/lib/translations/de/web.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{}")}; \ No newline at end of file diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po new file mode 100644 index 000000000..aad31ce8b --- /dev/null +++ b/packages/lib/translations/de/web.po @@ -0,0 +1,19 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: de\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-24 13:34\n" +"Last-Translator: \n" +"Language-Team: German\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: web.po\n" +"X-Crowdin-File-ID: 8\n" diff --git a/packages/lib/translations/en/common.po b/packages/lib/translations/en/common.po new file mode 100644 index 000000000..5710401fa --- /dev/null +++ b/packages/lib/translations/en/common.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" diff --git a/packages/lib/translations/en/marketing.js b/packages/lib/translations/en/marketing.js new file mode 100644 index 000000000..89ef46516 --- /dev/null +++ b/packages/lib/translations/en/marketing.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{\"J/hVSQ\":[[\"0\"]],\"u0zktA\":\"5 standard documents per month\",\"rKtmiD\":\"5 Users Included\",\"vaHmll\":\"A 10x better signing experience.\",\"gBefbz\":[\"Add More Users for \",[\"0\"]],\"XkF8tv\":\"All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics\",\"tkQ/WI\":\"Amount Raised\",\"qOMroC\":\"API Access\",\"FNv8t7\":\"Beautiful.\",\"W/TUoX\":\"Because signing should be celebrated. That’s why we care about the smallest detail in our product.\",\"astDB+\":\"Blog\",\"7zGun7\":\"Build on top.\",\"fxgcNV\":\"Can I use Documenso commercially?\",\"V+D/YP\":\"Careers\",\"CWe7wB\":\"Changelog\",\"JZbmjL\":\"Choose a template from the community app store. Or submit your own template for others to use.\",\"chL5IG\":\"Community\",\"p5+XQN\":\"Completed Documents\",\"NApCXa\":\"Completed Documents per Month\",\"z5kV0h\":\"Connections\",\"YcfUZ9\":\"Contact Us\",\"1NJjIG\":\"Create connections and automations with Zapier and more to integrate with your favorite tools.\",\"rr83qK\":\"Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp.\",\"75ojt0\":\"Customers with an Active Subscriptions.\",\"pF9qTh\":\"Customise and expand.\",\"f8fH8W\":\"Design\",\"W6qD1T\":\"Designed for every stage of your journey.\",\"K6KbY4\":\"Direct Link\",\"aLD+Td\":\"Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet.\",\"32yG8y\":\"Documenso on X\",\"+1xAO7\":\"Document signing,<0/>finally open source.\",\"TvY/XA\":\"Documentation\",\"tSS7hj\":\"Easily embed Documenso into your product. Simply copy and paste our react widget into your application.\",\"BWMGM4\":\"Easy Sharing (Soon).\",\"V6EY8B\":\"Email and Discord Support\",\"C0/bri\":\"Engagement\",\"8Zy3YU\":\"Enterprise Compliance, License or Technical Needs?\",\"ZSW8id\":\"Everything you need for a great signing experience.\",\"sXswT6\":\"Fast.\",\"cT9Z9e\":\"Faster, smarter and more beautiful.\",\"k/ANik\":\"Finances\",\"I7Exsw\":\"Follow us on X\",\"f3Botn\":\"For companies looking to scale across multiple teams.\",\"y2DcZj\":\"For small teams and individuals with basic needs.\",\"2POOFK\":\"Free\",\"OdieZe\":\"From the blog\",\"IPgkVQ\":\"Full-Time\",\"aSWzT9\":\"Get paid (Soon).\",\"ZDIydz\":\"Get started\",\"c3b0B0\":\"Get Started\",\"pS8wej\":\"Get started today.\",\"7FPIvI\":\"Get the latest news from Documenso, including product updates, team announcements and more!\",\"kV0qBq\":\"GitHub: Total Merged PRs\",\"652R6j\":\"GitHub: Total Open Issues\",\"R1aJ0W\":\"GitHub: Total Stars\",\"P1ovAc\":\"Global Salary Bands\",\"IAq/yr\":\"Growth\",\"Xi7f+z\":\"How can I contribute?\",\"9VGuMA\":\"How do you handle my data?\",\"fByw/g\":\"Individual\",\"Csm+TN\":\"Integrated payments with Stripe so you don’t have to worry about getting paid.\",\"phSPy7\":\"Integrates with all your favourite tools.\",\"pfjrI2\":\"Is there more?\",\"LOyqaC\":\"It’s up to you. Either clone our repository or rely on our easy to use hosting solution.\",\"PCgMVa\":\"Join Date\",\"TgL4dH\":\"Join the Open Signing Movement\",\"wJijgU\":\"Location\",\"OIowgO\":\"Make it your own through advanced customization and adjustability.\",\"GHelWd\":\"Merged PR's\",\"vXBVQZ\":\"Merged PRs\",\"+8Nek/\":\"Monthly\",\"6YtxFj\":\"Name\",\"CtgXe4\":\"New Users\",\"OpNhRn\":\"No credit card required\",\"6C9AxJ\":\"No Credit Card required\",\"igwAqT\":\"None of these work for you? Try self-hosting!\",\"jjAtjQ\":\"Open Issues\",\"b76QYo\":\"Open Source or Hosted.\",\"OWsQIe\":\"Open Startup\",\"Un80BR\":\"OSS Friends\",\"6zNyfI\":\"Our custom templates come with smart rules that can help you save time and energy.\",\"+OmhKD\":\"Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features.\",\"eK0veR\":\"Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features.\",\"I2ufwS\":\"Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership.\",\"F9564X\":\"Part-Time\",\"qJVkX+\":\"Premium Profile Name\",\"aHCEmh\":\"Pricing\",\"rjGI/Q\":\"Privacy\",\"vERlcd\":\"Profile\",\"77/8W2\":\"React Widget (Soon).\",\"OYoVNk\":\"Receive your personal link to share with everyone you care about.\",\"GDvlUT\":\"Role\",\"bUqwb8\":\"Salary\",\"GNfoAO\":\"Save $60 or $120\",\"StoBff\":\"Search languages...\",\"dhi4w4\":\"Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us.\",\"kZBxnz\":\"Send, connect, receive and embed everywhere.\",\"eSfS30\":\"Seniority\",\"aoDa18\":\"Shop\",\"5lWFkC\":\"Sign in\",\"e+RpCP\":\"Sign up\",\"4yiZOB\":\"Signing Process\",\"RkUXMm\":\"Signup Now\",\"omz3DH\":\"Smart.\",\"AvYbUL\":\"Star on GitHub\",\"y2dGtU\":\"Stars\",\"uAQUqI\":\"Status\",\"XYLcNv\":\"Support\",\"KM6m8p\":\"Team\",\"lm5v+6\":\"Team Inbox\",\"CAL6E9\":\"Teams\",\"w4nM1s\":\"Template Store (Soon).\",\"yFoQ27\":\"That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️\",\"GE1BlA\":\"This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share.\",\"MHrjPM\":\"Title\",\"2YvdxE\":\"Total Completed Documents\",\"8e4lIo\":\"Total Customers\",\"bPpoCb\":\"Total Funding Raised\",\"vb0Q0/\":\"Total Users\",\"mgQhDS\":\"Truly your own.\",\"4McJfQ\":\"Try our Free Plan\",\"9mkNAn\":\"Twitter Stats\",\"CHzOWB\":\"Unlimited Documents per Month\",\"BOV7DD\":\"Up to 10 recipients per document\",\"vdAd7c\":\"Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers.\",\"W2nDs0\":\"View all stats\",\"WMfAK8\":\"We are happy to assist you at <0>support@documenso.com or <1>in our Discord-Support-Channel please message either Lucas or Timur to get added to the channel if you are not already a member.\",\"ZaMyxU\":\"What is the difference between the plans?\",\"8GpyFt\":\"When it comes to sending or receiving a contract, you can count on lightning-fast speeds.\",\"HEDnID\":\"Where can I get support?\",\"sib3h3\":\"Why should I prefer Documenso over DocuSign or some other signing tool?\",\"cVPDPt\":\"Why should I use your hosting service?\",\"zkWmBh\":\"Yearly\",\"8AKApo\":\"Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license.\",\"rzQpex\":\"You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs.\",\"1j9aoC\":\"Your browser does not support the video tag.\"}")}; \ No newline at end of file diff --git a/packages/lib/translations/en/marketing.po b/packages/lib/translations/en/marketing.po new file mode 100644 index 000000000..499a72ccb --- /dev/null +++ b/packages/lib/translations/en/marketing.po @@ -0,0 +1,593 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:45 +msgid "{0}" +msgstr "{0}" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:100 +msgid "5 standard documents per month" +msgstr "5 standard documents per month" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:198 +msgid "5 Users Included" +msgstr "5 Users Included" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:30 +msgid "A 10x better signing experience." +msgstr "A 10x better signing experience." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:201 +msgid "Add More Users for {0}" +msgstr "Add More Users for {0}" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" +msgstr "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" + +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:58 +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:65 +msgid "Amount Raised" +msgstr "Amount Raised" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:145 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:189 +msgid "API Access" +msgstr "API Access" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:63 +msgid "Beautiful." +msgstr "Beautiful." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:65 +msgid "Because signing should be celebrated. That’s why we care about the smallest detail in our product." +msgstr "Because signing should be celebrated. That’s why we care about the smallest detail in our product." + +#: apps/marketing/src/components/(marketing)/footer.tsx:35 +#: apps/marketing/src/components/(marketing)/header.tsx:57 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:36 +msgid "Blog" +msgstr "Blog" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:60 +msgid "Build on top." +msgstr "Build on top." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:163 +msgid "Can I use Documenso commercially?" +msgstr "Can I use Documenso commercially?" + +#: apps/marketing/src/components/(marketing)/footer.tsx:42 +msgid "Careers" +msgstr "Careers" + +#: apps/marketing/src/components/(marketing)/footer.tsx:36 +msgid "Changelog" +msgstr "Changelog" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:81 +msgid "Choose a template from the community app store. Or submit your own template for others to use." +msgstr "Choose a template from the community app store. Or submit your own template for others to use." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +msgid "Community" +msgstr "Community" + +#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:55 +msgid "Completed Documents" +msgstr "Completed Documents" + +#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:33 +msgid "Completed Documents per Month" +msgstr "Completed Documents per Month" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:61 +msgid "Connections" +msgstr "Connections" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:35 +msgid "Contact Us" +msgstr "Contact Us" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:63 +msgid "Create connections and automations with Zapier and more to integrate with your favorite tools." +msgstr "Create connections and automations with Zapier and more to integrate with your favorite tools." + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:23 +msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." +msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." + +#: apps/marketing/src/app/(marketing)/open/tooltip.tsx:35 +msgid "Customers with an Active Subscriptions." +msgstr "Customers with an Active Subscriptions." + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:29 +msgid "Customise and expand." +msgstr "Customise and expand." + +#: apps/marketing/src/components/(marketing)/footer.tsx:38 +msgid "Design" +msgstr "Design" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:44 +msgid "Designed for every stage of your journey." +msgstr "Designed for every stage of your journey." + +#: apps/marketing/src/components/(marketing)/carousel.tsx:37 +msgid "Direct Link" +msgstr "Direct Link" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:181 +msgid "Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet." +msgstr "Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet." + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:28 +msgid "Documenso on X" +msgstr "Documenso on X" + +#: apps/marketing/src/components/(marketing)/hero.tsx:100 +msgid "Document signing,<0/>finally open source." +msgstr "Document signing,<0/>finally open source." + +#: apps/marketing/src/components/(marketing)/footer.tsx:33 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:28 +msgid "Documentation" +msgstr "Documentation" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:106 +msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application." +msgstr "Easily embed Documenso into your product. Simply copy and paste our react widget into your application." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42 +msgid "Easy Sharing (Soon)." +msgstr "Easy Sharing (Soon)." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:148 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:192 +msgid "Email and Discord Support" +msgstr "Email and Discord Support" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:43 +msgid "Engagement" +msgstr "Engagement" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:16 +msgid "Enterprise Compliance, License or Technical Needs?" +msgstr "Enterprise Compliance, License or Technical Needs?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:128 +msgid "Everything you need for a great signing experience." +msgstr "Everything you need for a great signing experience." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:41 +msgid "Fast." +msgstr "Fast." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:32 +msgid "Faster, smarter and more beautiful." +msgstr "Faster, smarter and more beautiful." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +msgid "Finances" +msgstr "Finances" + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:38 +msgid "Follow us on X" +msgstr "Follow us on X" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:172 +msgid "For companies looking to scale across multiple teams." +msgstr "For companies looking to scale across multiple teams." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:85 +msgid "For small teams and individuals with basic needs." +msgstr "For small teams and individuals with basic needs." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:80 +msgid "Free" +msgstr "Free" + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:26 +msgid "From the blog" +msgstr "From the blog" + +#: apps/marketing/src/app/(marketing)/open/data.ts:9 +#: apps/marketing/src/app/(marketing)/open/data.ts:17 +#: apps/marketing/src/app/(marketing)/open/data.ts:33 +#: apps/marketing/src/app/(marketing)/open/data.ts:41 +#: apps/marketing/src/app/(marketing)/open/data.ts:49 +msgid "Full-Time" +msgstr "Full-Time" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:83 +msgid "Get paid (Soon)." +msgstr "Get paid (Soon)." + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:31 +msgid "Get started" +msgstr "Get started" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:75 +msgid "Get Started" +msgstr "Get Started" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:47 +msgid "Get started today." +msgstr "Get started today." + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:30 +msgid "Get the latest news from Documenso, including product updates, team announcements and more!" +msgstr "Get the latest news from Documenso, including product updates, team announcements and more!" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +msgid "GitHub: Total Merged PRs" +msgstr "GitHub: Total Merged PRs" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +msgid "GitHub: Total Open Issues" +msgstr "GitHub: Total Open Issues" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +msgid "GitHub: Total Stars" +msgstr "GitHub: Total Stars" + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:23 +msgid "Global Salary Bands" +msgstr "Global Salary Bands" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +msgid "Growth" +msgstr "Growth" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:134 +msgid "How can I contribute?" +msgstr "How can I contribute?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:105 +msgid "How do you handle my data?" +msgstr "How do you handle my data?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:118 +msgid "Individual" +msgstr "Individual" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:85 +msgid "Integrated payments with Stripe so you don’t have to worry about getting paid." +msgstr "Integrated payments with Stripe so you don’t have to worry about getting paid." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:31 +msgid "Integrates with all your favourite tools." +msgstr "Integrates with all your favourite tools." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +msgid "Is there more?" +msgstr "Is there more?" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:40 +msgid "It’s up to you. Either clone our repository or rely on our easy to use hosting solution." +msgstr "It’s up to you. Either clone our repository or rely on our easy to use hosting solution." + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:49 +msgid "Join Date" +msgstr "Join Date" + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:19 +msgid "Join the Open Signing Movement" +msgstr "Join the Open Signing Movement" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:46 +msgid "Location" +msgstr "Location" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:62 +msgid "Make it your own through advanced customization and adjustability." +msgstr "Make it your own through advanced customization and adjustability." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +msgid "Merged PR's" +msgstr "Merged PR's" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +msgid "Merged PRs" +msgstr "Merged PRs" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:40 +msgid "Monthly" +msgstr "Monthly" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:34 +msgid "Name" +msgstr "Name" + +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:43 +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:52 +msgid "New Users" +msgstr "New Users" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:106 +msgid "No credit card required" +msgstr "No credit card required" + +#: apps/marketing/src/components/(marketing)/callout.tsx:29 +#: apps/marketing/src/components/(marketing)/hero.tsx:121 +msgid "No Credit Card required" +msgstr "No Credit Card required" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:61 +msgid "None of these work for you? Try self-hosting!" +msgstr "None of these work for you? Try self-hosting!" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:194 +#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +msgid "Open Issues" +msgstr "Open Issues" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:38 +msgid "Open Source or Hosted." +msgstr "Open Source or Hosted." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/components/(marketing)/footer.tsx:37 +#: apps/marketing/src/components/(marketing)/header.tsx:64 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 +msgid "Open Startup" +msgstr "Open Startup" + +#: apps/marketing/src/components/(marketing)/footer.tsx:41 +msgid "OSS Friends" +msgstr "OSS Friends" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:87 +msgid "Our custom templates come with smart rules that can help you save time and energy." +msgstr "Our custom templates come with smart rules that can help you save time and energy." + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:20 +msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features." +msgstr "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features." + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:20 +#~ msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features." +#~ msgstr "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65 +msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership." +msgstr "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership." + +#: apps/marketing/src/app/(marketing)/open/data.ts:25 +msgid "Part-Time" +msgstr "Part-Time" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151 +msgid "Premium Profile Name" +msgstr "Premium Profile Name" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:40 +#: apps/marketing/src/components/(marketing)/footer.tsx:31 +#: apps/marketing/src/components/(marketing)/header.tsx:42 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:24 +msgid "Pricing" +msgstr "Pricing" + +#: apps/marketing/src/components/(marketing)/footer.tsx:43 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:53 +msgid "Privacy" +msgstr "Privacy" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:55 +msgid "Profile" +msgstr "Profile" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:104 +msgid "React Widget (Soon)." +msgstr "React Widget (Soon)." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:44 +msgid "Receive your personal link to share with everyone you care about." +msgstr "Receive your personal link to share with everyone you care about." + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:37 +msgid "Role" +msgstr "Role" + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:37 +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:40 +msgid "Salary" +msgstr "Salary" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:62 +msgid "Save $60 or $120" +msgstr "Save $60 or $120" + +#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47 +msgid "Search languages..." +msgstr "Search languages..." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109 +msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us." +msgstr "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:33 +msgid "Send, connect, receive and embed everywhere." +msgstr "Send, connect, receive and embed everywhere." + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:34 +msgid "Seniority" +msgstr "Seniority" + +#: apps/marketing/src/components/(marketing)/footer.tsx:39 +msgid "Shop" +msgstr "Shop" + +#: apps/marketing/src/components/(marketing)/header.tsx:72 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:61 +msgid "Sign in" +msgstr "Sign in" + +#: apps/marketing/src/components/(marketing)/header.tsx:77 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:57 +msgid "Sign up" +msgstr "Sign up" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:19 +msgid "Signing Process" +msgstr "Signing Process" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:94 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:136 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:180 +msgid "Signup Now" +msgstr "Signup Now" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:85 +msgid "Smart." +msgstr "Smart." + +#: apps/marketing/src/components/(marketing)/hero.tsx:128 +msgid "Star on GitHub" +msgstr "Star on GitHub" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +msgid "Stars" +msgstr "Stars" + +#: apps/marketing/src/components/(marketing)/footer.tsx:40 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:44 +msgid "Status" +msgstr "Status" + +#: apps/marketing/src/components/(marketing)/footer.tsx:34 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:48 +msgid "Support" +msgstr "Support" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:26 +msgid "Team" +msgstr "Team" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:195 +msgid "Team Inbox" +msgstr "Team Inbox" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:25 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:162 +msgid "Teams" +msgstr "Teams" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:79 +msgid "Template Store (Soon)." +msgstr "Template Store (Soon)." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:138 +msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" +msgstr "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." +msgstr "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:31 +msgid "Title" +msgstr "Title" + +#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:55 +msgid "Total Completed Documents" +msgstr "Total Completed Documents" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:267 +#: apps/marketing/src/app/(marketing)/open/page.tsx:268 +msgid "Total Customers" +msgstr "Total Customers" + +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:29 +msgid "Total Funding Raised" +msgstr "Total Funding Raised" + +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:43 +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:52 +msgid "Total Users" +msgstr "Total Users" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:27 +msgid "Truly your own." +msgstr "Truly your own." + +#: apps/marketing/src/components/(marketing)/callout.tsx:27 +#: apps/marketing/src/components/(marketing)/hero.tsx:119 +msgid "Try our Free Plan" +msgstr "Try our Free Plan" + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:20 +msgid "Twitter Stats" +msgstr "Twitter Stats" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:142 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:186 +msgid "Unlimited Documents per Month" +msgstr "Unlimited Documents per Month" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:103 +msgid "Up to 10 recipients per document" +msgstr "Up to 10 recipients per document" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:123 +msgid "Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers." +msgstr "Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers." + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:33 +msgid "View all stats" +msgstr "View all stats" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:195 +msgid "We are happy to assist you at <0>support@documenso.com or <1>in our Discord-Support-Channel please message either Lucas or Timur to get added to the channel if you are not already a member." +msgstr "We are happy to assist you at <0>support@documenso.com or <1>in our Discord-Support-Channel please message either Lucas or Timur to get added to the channel if you are not already a member." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:89 +msgid "What is the difference between the plans?" +msgstr "What is the difference between the plans?" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:43 +msgid "When it comes to sending or receiving a contract, you can count on lightning-fast speeds." +msgstr "When it comes to sending or receiving a contract, you can count on lightning-fast speeds." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:191 +msgid "Where can I get support?" +msgstr "Where can I get support?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:177 +msgid "Why should I prefer Documenso over DocuSign or some other signing tool?" +msgstr "Why should I prefer Documenso over DocuSign or some other signing tool?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:119 +msgid "Why should I use your hosting service?" +msgstr "Why should I use your hosting service?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:60 +msgid "Yearly" +msgstr "Yearly" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:167 +msgid "Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license." +msgstr "Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:93 +msgid "You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs." +msgstr "You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs." + +#: apps/marketing/src/components/(marketing)/carousel.tsx:258 +msgid "Your browser does not support the video tag." +msgstr "Your browser does not support the video tag." diff --git a/packages/lib/translations/en/web.js b/packages/lib/translations/en/web.js new file mode 100644 index 000000000..3975ff70f --- /dev/null +++ b/packages/lib/translations/en/web.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{}")}; \ No newline at end of file diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po new file mode 100644 index 000000000..5710401fa --- /dev/null +++ b/packages/lib/translations/en/web.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" diff --git a/packages/lib/translations/ro/common.po b/packages/lib/translations/ro/common.po new file mode 100644 index 000000000..9a22357d0 --- /dev/null +++ b/packages/lib/translations/ro/common.po @@ -0,0 +1,19 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ro\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-25 01:27\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: common.po\n" +"X-Crowdin-File-ID: 4\n" diff --git a/packages/lib/translations/ro/marketing.js b/packages/lib/translations/ro/marketing.js new file mode 100644 index 000000000..dac79fbb4 --- /dev/null +++ b/packages/lib/translations/ro/marketing.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{\"J/hVSQ\":[[\"0\"]],\"u0zktA\":\"5 documente standard pe lună\",\"rKtmiD\":\"5 Utilizatori Incluși\",\"vaHmll\":\"O experiență de semnare de 10 ori mai bună.\",\"gBefbz\":[\"Adaugă Mai Mulți Utilizatori pentru \",[\"0\"]],\"XkF8tv\":\"Toate metricile, finanțele și învățămintele noastre sunt publice. Credem în transparență și dorim să împărtășim călătoria noastră cu tine. Poți citi mai multe despre asta aici: <0>Anunțând Metriile Deschise\",\"tkQ/WI\":\"Suma Strânsă\",\"qOMroC\":\"Acces API\",\"FNv8t7\":\"Frumos.\",\"W/TUoX\":\"Pentru că semnarea trebuie să fie sărbătorită. De aceea ne pasă de cel mai mic detaliu din produsul nostru.\",\"astDB+\":\"Blog\",\"7zGun7\":\"Construiește pe baza.\",\"fxgcNV\":\"Pot folosi Documenso comercial?\",\"V+D/YP\":\"Cariere\",\"CWe7wB\":\"Istoric de Modificări\",\"JZbmjL\":\"Alegeți un șablon din magazinul de aplicații al comunității. Sau trimiteți propriul șablon pentru ca alții să îl folosească.\",\"chL5IG\":\"Comunitate\",\"p5+XQN\":\"Documente Finalizate\",\"NApCXa\":\"Documente Finalizate pe Lună\",\"z5kV0h\":\"Conexiuni\",\"YcfUZ9\":\"Contactați-ne\",\"1NJjIG\":\"Creați conexiuni și automatizări cu Zapier și altele pentru a integra cu instrumentele dvs. preferate.\",\"rr83qK\":\"Creați-vă contul și începeți să utilizați semnarea documentelor de ultimă generație. Semnarea deschisă și frumoasă este la îndemâna dvs.\",\"75ojt0\":\"Clienți cu Abonamente Active.\",\"pF9qTh\":\"Personalizează și extinde.\",\"f8fH8W\":\"Design\",\"W6qD1T\":\"Proiectat pentru fiecare etapă a călătoriei tale.\",\"K6KbY4\":\"Link Direct\",\"aLD+Td\":\"Documenso este un efort al comunității de a crea un ecosistem deschis și vibrant în jurul unui instrument, pe care toți îl pot folosi și adapta gratuit. Fiind cu adevărat deschiși, dorim să creăm o infrastructură de încredere pentru viitorul internetului.\",\"32yG8y\":\"Documenso pe X\",\"+1xAO7\":\"Semnare de documente,<0/>în sfârșit open source.\",\"TvY/XA\":\"Documentație\",\"tSS7hj\":\"Incorporați ușor Documenso în produsul dvs. Pur și simplu copiați și lipiți widget-ul nostru react în aplicația dvs.\",\"BWMGM4\":\"Partajare ușoară (Curând).\",\"V6EY8B\":\"Suport prin Email și Discord\",\"C0/bri\":\"Implicare\",\"8Zy3YU\":\"Conformitate Enterprise, Licență sau Nevoi Tehnice?\",\"ZSW8id\":\"Tot ce ai nevoie pentru o experiență excelentă de semnare.\",\"sXswT6\":\"Rapid.\",\"cT9Z9e\":\"Mai rapid, mai inteligent și mai frumos.\",\"k/ANik\":\"Finanțe\",\"I7Exsw\":\"Urmărește-ne pe X\",\"f3Botn\":\"Pentru companiile care doresc să se extindă pe mai multe echipe.\",\"y2DcZj\":\"Pentru echipe mici și indivizi cu nevoi de bază.\",\"2POOFK\":\"Gratuit\",\"OdieZe\":\"Din blog\",\"IPgkVQ\":\"Normă întreagă\",\"aSWzT9\":\"Primește plata (Curând).\",\"ZDIydz\":\"Începe\",\"c3b0B0\":\"Începe\",\"pS8wej\":\"Începe astăzi.\",\"7FPIvI\":\"Primește cele mai recente știri de la Documenso, inclusiv actualizări de produse, anunțuri ale echipei și multe altele!\",\"kV0qBq\":\"GitHub: Total PR-uri Fuzionate\",\"652R6j\":\"GitHub: Total Probleme Deschise\",\"R1aJ0W\":\"GitHub: Total Stele\",\"P1ovAc\":\"Benzile Salariale Globale\",\"IAq/yr\":\"Creștere\",\"Xi7f+z\":\"Cum pot contribui?\",\"9VGuMA\":\"Cum vă ocupați de datele mele?\",\"fByw/g\":\"Individ\",\"Csm+TN\":\"Plăți integrate cu Stripe astfel încât să nu trebuiască să te îngrijorezi de a primi banii.\",\"phSPy7\":\"Se integrează cu toate uneltele tale preferate.\",\"pfjrI2\":\"Mai e ceva?\",\"LOyqaC\":\"Depinde de tine. Fie clonezi depozitul nostru, fie te bazezi pe soluția noastră ușor de utilizat de găzduire.\",\"PCgMVa\":\"Data alăturării\",\"TgL4dH\":\"Alăturați-vă Mișcării de Semnare Deschisă\",\"wJijgU\":\"Locație\",\"OIowgO\":\"Personalizează-l cu ajutorul personalizării avansate și al ajustabilității.\",\"GHelWd\":\"PR-uri fuzionate\",\"vXBVQZ\":\"PR-uri fuzionate\",\"+8Nek/\":\"Lunar\",\"6YtxFj\":\"Nume\",\"CtgXe4\":\"Utilizatori noi\",\"OpNhRn\":\"Nu este necesar cardul de credit\",\"6C9AxJ\":\"Nu este necesar cardul de credit\",\"igwAqT\":\"Niciuna dintre acestea nu funcționează pentru tine? Încearcă auto-găzduirea!\",\"jjAtjQ\":\"Probleme deschise\",\"b76QYo\":\"Open Source sau găzduit.\",\"OWsQIe\":\"Startup deschis\",\"Un80BR\":\"Prieteni OSS\",\"6zNyfI\":\"Șabloanele noastre personalizate vin cu reguli inteligente care te pot ajuta să economisești timp și energie.\",\"eK0veR\":\"Licența noastră Enterprise este excelentă pentru organizațiile mari care doresc să treacă la Documenso pentru toate nevoile lor de semnare. Este disponibilă pentru oferta noastră în cloud, precum și pentru configurațiile auto-găzduite și oferă o gamă largă de caracteristici de conformitate și administrare.\",\"I2ufwS\":\"Opțiunea noastră auto-găzduită este grozavă pentru echipe mici și persoane care au nevoie de o soluție simplă. Poți folosi configurarea noastră bazată pe Docker pentru a începe în câteva minute. Ia controlul cu personalizare completă și deținerea datelor.\",\"F9564X\":\"Part-Time\",\"qJVkX+\":\"Nume profil premium\",\"aHCEmh\":\"Prețuri\",\"rjGI/Q\":\"Confidențialitate\",\"vERlcd\":\"Profil\",\"77/8W2\":\"React Widget (Curând).\",\"OYoVNk\":\"Primește linkul tău personal pentru a-l partaja cu toți cei dragi.\",\"GDvlUT\":\"Rol\",\"bUqwb8\":\"Salariu\",\"GNfoAO\":\"Economisește 60$ sau 120$\",\"StoBff\":\"Caută limbi...\",\"dhi4w4\":\"În siguranță. Centrele noastre de date sunt situate în Frankfurt (Germania), oferindu-ne cele mai bune legi locale privind confidențialitatea. Suntem foarte conștienți de natura sensibilă a datelor noastre și urmăm cele mai bune practici pentru a asigura securitatea și integritatea datelor încredințate nouă.\",\"kZBxnz\":\"Trimite, conectează, primește și încorporează peste tot.\",\"eSfS30\":\"Senioritate\",\"aoDa18\":\"Magazin\",\"5lWFkC\":\"Autentificare\",\"e+RpCP\":\"Înregistrare\",\"4yiZOB\":\"Proces de înregistrare\",\"RkUXMm\":\"Înregistrează-te acum\",\"omz3DH\":\"Deștept.\",\"AvYbUL\":\"Adaugă un stea pe GitHub\",\"y2dGtU\":\"Stele\",\"uAQUqI\":\"Stare\",\"XYLcNv\":\"Suport\",\"KM6m8p\":\"Echipă\",\"lm5v+6\":\"Inbox pentru echipă\",\"CAL6E9\":\"Echipe\",\"w4nM1s\":\"Magazin de Șabloane (În curând).\",\"yFoQ27\":\"Este grozav. Poți arunca o privire la <0>Problemele actuale și să te alături <1>Comunității noastre Discord pentru a rămâne la curent cu prioritățile actuale. În orice caz, suntem o comunitate deschisă și primim cu bucurie toată contribuția, tehnică și non-tehnică ❤️\",\"GE1BlA\":\"Această pagină evoluează pe măsură ce învățăm ce face o companie de semnături excelentă. O vom actualiza când avem mai multe de împărtășit.\",\"MHrjPM\":\"Titlu\",\"2YvdxE\":\"Total Documente Finalizate\",\"8e4lIo\":\"Total Clienți\",\"bPpoCb\":\"Total Finanțare Strânsă\",\"vb0Q0/\":\"Total Utilizatori\",\"mgQhDS\":\"Cu adevărat al tău.\",\"4McJfQ\":\"Încearcă Planul nostru Gratuit\",\"9mkNAn\":\"Statistici Twitter\",\"CHzOWB\":\"Documente Nelimitate pe Lună\",\"BOV7DD\":\"Până la 10 destinatari pe document\",\"vdAd7c\":\"Utilizarea versiunii noastre găzduite este cea mai simplă modalitate de a începe, te poți abona pur și simplu și începe să semnezi documentele tale. Ne ocupăm de infrastructură, astfel încât tu să te poți concentra pe afacerea ta. În plus, atunci când utilizezi versiunea noastră găzduită beneficiezi de certificatele noastre de semnătură de încredere care te ajută să construiești încredere cu clienții tăi.\",\"W2nDs0\":\"Vezi toate statisticile\",\"WMfAK8\":\"Suntem bucuroși să vă asistăm la <0>support@documenso.com sau <1>în canalul nostru de suport Discord, te rugăm să-i trimiți un mesaj fie lui Lucas, fie lui Timur pentru a fi adăugat în canal dacă nu ești deja membru.\",\"ZaMyxU\":\"Care este diferența între planuri?\",\"8GpyFt\":\"Când vine vorba de trimiterea sau primirea unui contract, poți conta pe viteze fulgerătoare.\",\"HEDnID\":\"Unde pot obține suport?\",\"sib3h3\":\"De ce ar trebui să prefer Documenso în locul DocuSign sau altui instrument de semnare?\",\"cVPDPt\":\"De ce ar trebui să folosesc serviciul vostru de găzduire?\",\"zkWmBh\":\"Anual\",\"8AKApo\":\"Da! Documenso este oferit sub licența open source GNU AGPL V3. Aceasta înseamnă că îl poți folosi gratuit și chiar modifica pentru a se potrivi nevoilor tale, atâta timp cât publici modificările sub aceeași licență.\",\"rzQpex\":\"Poți găzdui Documenso pe cont propriu gratuit sau să folosești versiunea noastră găzduită gata de utilizare. Versiunea găzduită vine cu suport suplimentar, scalabilitate fără dureri și multe altele. Utilizatorii timpurii vor avea acces la toate funcțiile pe care le construim în acest an, fără costuri suplimentare! Pentru totdeauna! Da, aceasta include utilizatori multipli pe cont mai târziu. Dacă dorești Documenso pentru întreprinderea ta, suntem bucuroși să discutăm despre nevoile tale.\",\"1j9aoC\":\"Browserul tău nu suportă eticheta video.\"}")}; \ No newline at end of file diff --git a/packages/lib/translations/ro/marketing.po b/packages/lib/translations/ro/marketing.po new file mode 100644 index 000000000..957a7ea7c --- /dev/null +++ b/packages/lib/translations/ro/marketing.po @@ -0,0 +1,594 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ro\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-25 01:27\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: marketing.po\n" +"X-Crowdin-File-ID: 6\n" + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:45 +msgid "{0}" +msgstr "{0}" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:100 +msgid "5 standard documents per month" +msgstr "5 documente standard pe lună" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:198 +msgid "5 Users Included" +msgstr "5 Utilizatori Incluși" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:30 +msgid "A 10x better signing experience." +msgstr "O experiență de semnare de 10 ori mai bună." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:201 +msgid "Add More Users for {0}" +msgstr "Adaugă Mai Mulți Utilizatori pentru {0}" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" +msgstr "Toate metricile, finanțele și învățămintele noastre sunt publice. Credem în transparență și dorim să împărtășim călătoria noastră cu tine. Poți citi mai multe despre asta aici: <0>Anunțând Metriile Deschise" + +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:58 +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:65 +msgid "Amount Raised" +msgstr "Suma Strânsă" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:145 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:189 +msgid "API Access" +msgstr "Acces API" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:63 +msgid "Beautiful." +msgstr "Frumos." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:65 +msgid "Because signing should be celebrated. That’s why we care about the smallest detail in our product." +msgstr "Pentru că semnarea trebuie să fie sărbătorită. De aceea ne pasă de cel mai mic detaliu din produsul nostru." + +#: apps/marketing/src/components/(marketing)/footer.tsx:35 +#: apps/marketing/src/components/(marketing)/header.tsx:57 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:36 +msgid "Blog" +msgstr "Blog" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:60 +msgid "Build on top." +msgstr "Construiește pe baza." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:163 +msgid "Can I use Documenso commercially?" +msgstr "Pot folosi Documenso comercial?" + +#: apps/marketing/src/components/(marketing)/footer.tsx:42 +msgid "Careers" +msgstr "Cariere" + +#: apps/marketing/src/components/(marketing)/footer.tsx:36 +msgid "Changelog" +msgstr "Istoric de Modificări" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:81 +msgid "Choose a template from the community app store. Or submit your own template for others to use." +msgstr "Alegeți un șablon din magazinul de aplicații al comunității. Sau trimiteți propriul șablon pentru ca alții să îl folosească." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +msgid "Community" +msgstr "Comunitate" + +#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:55 +msgid "Completed Documents" +msgstr "Documente Finalizate" + +#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:33 +msgid "Completed Documents per Month" +msgstr "Documente Finalizate pe Lună" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:61 +msgid "Connections" +msgstr "Conexiuni" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:35 +msgid "Contact Us" +msgstr "Contactați-ne" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:63 +msgid "Create connections and automations with Zapier and more to integrate with your favorite tools." +msgstr "Creați conexiuni și automatizări cu Zapier și altele pentru a integra cu instrumentele dvs. preferate." + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:23 +msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." +msgstr "Creați-vă contul și începeți să utilizați semnarea documentelor de ultimă generație. Semnarea deschisă și frumoasă este la îndemâna dvs." + +#: apps/marketing/src/app/(marketing)/open/tooltip.tsx:35 +msgid "Customers with an Active Subscriptions." +msgstr "Clienți cu Abonamente Active." + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:29 +msgid "Customise and expand." +msgstr "Personalizează și extinde." + +#: apps/marketing/src/components/(marketing)/footer.tsx:38 +msgid "Design" +msgstr "Design" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:44 +msgid "Designed for every stage of your journey." +msgstr "Proiectat pentru fiecare etapă a călătoriei tale." + +#: apps/marketing/src/components/(marketing)/carousel.tsx:37 +msgid "Direct Link" +msgstr "Link Direct" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:181 +msgid "Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet." +msgstr "Documenso este un efort al comunității de a crea un ecosistem deschis și vibrant în jurul unui instrument, pe care toți îl pot folosi și adapta gratuit. Fiind cu adevărat deschiși, dorim să creăm o infrastructură de încredere pentru viitorul internetului." + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:28 +msgid "Documenso on X" +msgstr "Documenso pe X" + +#: apps/marketing/src/components/(marketing)/hero.tsx:100 +msgid "Document signing,<0/>finally open source." +msgstr "Semnare de documente,<0/>în sfârșit open source." + +#: apps/marketing/src/components/(marketing)/footer.tsx:33 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:28 +msgid "Documentation" +msgstr "Documentație" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:106 +msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application." +msgstr "Incorporați ușor Documenso în produsul dvs. Pur și simplu copiați și lipiți widget-ul nostru react în aplicația dvs." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42 +msgid "Easy Sharing (Soon)." +msgstr "Partajare ușoară (Curând)." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:148 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:192 +msgid "Email and Discord Support" +msgstr "Suport prin Email și Discord" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:43 +msgid "Engagement" +msgstr "Implicare" + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:16 +msgid "Enterprise Compliance, License or Technical Needs?" +msgstr "Conformitate Enterprise, Licență sau Nevoi Tehnice?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:128 +msgid "Everything you need for a great signing experience." +msgstr "Tot ce ai nevoie pentru o experiență excelentă de semnare." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:41 +msgid "Fast." +msgstr "Rapid." + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:32 +msgid "Faster, smarter and more beautiful." +msgstr "Mai rapid, mai inteligent și mai frumos." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +msgid "Finances" +msgstr "Finanțe" + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:38 +msgid "Follow us on X" +msgstr "Urmărește-ne pe X" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:172 +msgid "For companies looking to scale across multiple teams." +msgstr "Pentru companiile care doresc să se extindă pe mai multe echipe." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:85 +msgid "For small teams and individuals with basic needs." +msgstr "Pentru echipe mici și indivizi cu nevoi de bază." + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:80 +msgid "Free" +msgstr "Gratuit" + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:26 +msgid "From the blog" +msgstr "Din blog" + +#: apps/marketing/src/app/(marketing)/open/data.ts:9 +#: apps/marketing/src/app/(marketing)/open/data.ts:17 +#: apps/marketing/src/app/(marketing)/open/data.ts:33 +#: apps/marketing/src/app/(marketing)/open/data.ts:41 +#: apps/marketing/src/app/(marketing)/open/data.ts:49 +msgid "Full-Time" +msgstr "Normă întreagă" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:83 +msgid "Get paid (Soon)." +msgstr "Primește plata (Curând)." + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:31 +msgid "Get started" +msgstr "Începe" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:75 +msgid "Get Started" +msgstr "Începe" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:47 +msgid "Get started today." +msgstr "Începe astăzi." + +#: apps/marketing/src/app/(marketing)/blog/page.tsx:30 +msgid "Get the latest news from Documenso, including product updates, team announcements and more!" +msgstr "Primește cele mai recente știri de la Documenso, inclusiv actualizări de produse, anunțuri ale echipei și multe altele!" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +msgid "GitHub: Total Merged PRs" +msgstr "GitHub: Total PR-uri Fuzionate" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +msgid "GitHub: Total Open Issues" +msgstr "GitHub: Total Probleme Deschise" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +msgid "GitHub: Total Stars" +msgstr "GitHub: Total Stele" + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:23 +msgid "Global Salary Bands" +msgstr "Benzile Salariale Globale" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +msgid "Growth" +msgstr "Creștere" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:134 +msgid "How can I contribute?" +msgstr "Cum pot contribui?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:105 +msgid "How do you handle my data?" +msgstr "Cum vă ocupați de datele mele?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:118 +msgid "Individual" +msgstr "Individ" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:85 +msgid "Integrated payments with Stripe so you don’t have to worry about getting paid." +msgstr "Plăți integrate cu Stripe astfel încât să nu trebuiască să te îngrijorezi de a primi banii." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:31 +msgid "Integrates with all your favourite tools." +msgstr "Se integrează cu toate uneltele tale preferate." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +msgid "Is there more?" +msgstr "Mai e ceva?" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:40 +msgid "It’s up to you. Either clone our repository or rely on our easy to use hosting solution." +msgstr "Depinde de tine. Fie clonezi depozitul nostru, fie te bazezi pe soluția noastră ușor de utilizat de găzduire." + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:49 +msgid "Join Date" +msgstr "Data alăturării" + +#: apps/marketing/src/components/(marketing)/call-to-action.tsx:19 +msgid "Join the Open Signing Movement" +msgstr "Alăturați-vă Mișcării de Semnare Deschisă" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:46 +msgid "Location" +msgstr "Locație" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:62 +msgid "Make it your own through advanced customization and adjustability." +msgstr "Personalizează-l cu ajutorul personalizării avansate și al ajustabilității." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +msgid "Merged PR's" +msgstr "PR-uri fuzionate" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +msgid "Merged PRs" +msgstr "PR-uri fuzionate" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:40 +msgid "Monthly" +msgstr "Lunar" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:34 +msgid "Name" +msgstr "Nume" + +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:43 +#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:52 +msgid "New Users" +msgstr "Utilizatori noi" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:106 +msgid "No credit card required" +msgstr "Nu este necesar cardul de credit" + +#: apps/marketing/src/components/(marketing)/callout.tsx:29 +#: apps/marketing/src/components/(marketing)/hero.tsx:121 +msgid "No Credit Card required" +msgstr "Nu este necesar cardul de credit" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:61 +msgid "None of these work for you? Try self-hosting!" +msgstr "Niciuna dintre acestea nu funcționează pentru tine? Încearcă auto-găzduirea!" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:194 +#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +msgid "Open Issues" +msgstr "Probleme deschise" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:38 +msgid "Open Source or Hosted." +msgstr "Open Source sau găzduit." + +#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/components/(marketing)/footer.tsx:37 +#: apps/marketing/src/components/(marketing)/header.tsx:64 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 +msgid "Open Startup" +msgstr "Startup deschis" + +#: apps/marketing/src/components/(marketing)/footer.tsx:41 +msgid "OSS Friends" +msgstr "Prieteni OSS" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:87 +msgid "Our custom templates come with smart rules that can help you save time and energy." +msgstr "Șabloanele noastre personalizate vin cu reguli inteligente care te pot ajuta să economisești timp și energie." + +#: apps/marketing/src/components/(marketing)/enterprise.tsx:20 +msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features." +msgstr "Licența noastră Enterprise este excelentă pentru organizațiile mari care doresc să treacă la Documenso pentru toate nevoile lor de semnare. Este disponibilă pentru oferta noastră în cloud, precum și pentru configurațiile auto-găzduite și oferă o gamă largă de caracteristici de conformitate și administrare." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65 +msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership." +msgstr "Opțiunea noastră auto-găzduită este grozavă pentru echipe mici și persoane care au nevoie de o soluție simplă. Poți folosi configurarea noastră bazată pe Docker pentru a începe în câteva minute. Ia controlul cu personalizare completă și deținerea datelor." + +#: apps/marketing/src/app/(marketing)/open/data.ts:25 +msgid "Part-Time" +msgstr "Part-Time" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151 +msgid "Premium Profile Name" +msgstr "Nume profil premium" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:40 +#: apps/marketing/src/components/(marketing)/footer.tsx:31 +#: apps/marketing/src/components/(marketing)/header.tsx:42 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:24 +msgid "Pricing" +msgstr "Prețuri" + +#: apps/marketing/src/components/(marketing)/footer.tsx:43 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:53 +msgid "Privacy" +msgstr "Confidențialitate" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:55 +msgid "Profile" +msgstr "Profil" + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:104 +msgid "React Widget (Soon)." +msgstr "React Widget (Curând)." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:44 +msgid "Receive your personal link to share with everyone you care about." +msgstr "Primește linkul tău personal pentru a-l partaja cu toți cei dragi." + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:37 +msgid "Role" +msgstr "Rol" + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:37 +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:40 +msgid "Salary" +msgstr "Salariu" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:62 +msgid "Save $60 or $120" +msgstr "Economisește 60$ sau 120$" + +#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47 +msgid "Search languages..." +msgstr "Caută limbi..." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109 +msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us." +msgstr "În siguranță. Centrele noastre de date sunt situate în Frankfurt (Germania), oferindu-ne cele mai bune legi locale privind confidențialitatea. Suntem foarte conștienți de natura sensibilă a datelor noastre și urmăm cele mai bune practici pentru a asigura securitatea și integritatea datelor încredințate nouă." + +#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:33 +msgid "Send, connect, receive and embed everywhere." +msgstr "Trimite, conectează, primește și încorporează peste tot." + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:34 +msgid "Seniority" +msgstr "Senioritate" + +#: apps/marketing/src/components/(marketing)/footer.tsx:39 +msgid "Shop" +msgstr "Magazin" + +#: apps/marketing/src/components/(marketing)/header.tsx:72 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:61 +msgid "Sign in" +msgstr "Autentificare" + +#: apps/marketing/src/components/(marketing)/header.tsx:77 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:57 +msgid "Sign up" +msgstr "Înregistrare" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:19 +msgid "Signing Process" +msgstr "Proces de înregistrare" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:94 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:136 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:180 +msgid "Signup Now" +msgstr "Înregistrează-te acum" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:85 +msgid "Smart." +msgstr "Deștept." + +#: apps/marketing/src/components/(marketing)/hero.tsx:128 +msgid "Star on GitHub" +msgstr "Adaugă un stea pe GitHub" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +msgid "Stars" +msgstr "Stele" + +#: apps/marketing/src/components/(marketing)/footer.tsx:40 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:44 +msgid "Status" +msgstr "Stare" + +#: apps/marketing/src/components/(marketing)/footer.tsx:34 +#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:48 +msgid "Support" +msgstr "Suport" + +#: apps/marketing/src/app/(marketing)/open/team-members.tsx:26 +msgid "Team" +msgstr "Echipă" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:195 +msgid "Team Inbox" +msgstr "Inbox pentru echipă" + +#: apps/marketing/src/components/(marketing)/carousel.tsx:25 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:162 +msgid "Teams" +msgstr "Echipe" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:79 +msgid "Template Store (Soon)." +msgstr "Magazin de Șabloane (În curând)." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:138 +msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" +msgstr "Este grozav. Poți arunca o privire la <0>Problemele actuale și să te alături <1>Comunității noastre Discord pentru a rămâne la curent cu prioritățile actuale. În orice caz, suntem o comunitate deschisă și primim cu bucurie toată contribuția, tehnică și non-tehnică ❤️" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." +msgstr "Această pagină evoluează pe măsură ce învățăm ce face o companie de semnături excelentă. O vom actualiza când avem mai multe de împărtășit." + +#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:31 +msgid "Title" +msgstr "Titlu" + +#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:55 +msgid "Total Completed Documents" +msgstr "Total Documente Finalizate" + +#: apps/marketing/src/app/(marketing)/open/page.tsx:267 +#: apps/marketing/src/app/(marketing)/open/page.tsx:268 +msgid "Total Customers" +msgstr "Total Clienți" + +#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:29 +msgid "Total Funding Raised" +msgstr "Total Finanțare Strânsă" + +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:30 +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:43 +#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:52 +msgid "Total Users" +msgstr "Total Utilizatori" + +#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:27 +msgid "Truly your own." +msgstr "Cu adevărat al tău." + +#: apps/marketing/src/components/(marketing)/callout.tsx:27 +#: apps/marketing/src/components/(marketing)/hero.tsx:119 +msgid "Try our Free Plan" +msgstr "Încearcă Planul nostru Gratuit" + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:20 +msgid "Twitter Stats" +msgstr "Statistici Twitter" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:142 +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:186 +msgid "Unlimited Documents per Month" +msgstr "Documente Nelimitate pe Lună" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:103 +msgid "Up to 10 recipients per document" +msgstr "Până la 10 destinatari pe document" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:123 +msgid "Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers." +msgstr "Utilizarea versiunii noastre găzduite este cea mai simplă modalitate de a începe, te poți abona pur și simplu și începe să semnezi documentele tale. Ne ocupăm de infrastructură, astfel încât tu să te poți concentra pe afacerea ta. În plus, atunci când utilizezi versiunea noastră găzduită beneficiezi de certificatele noastre de semnătură de încredere care te ajută să construiești încredere cu clienții tăi." + +#: apps/marketing/src/app/(marketing)/open/typefully.tsx:33 +msgid "View all stats" +msgstr "Vezi toate statisticile" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:195 +msgid "We are happy to assist you at <0>support@documenso.com or <1>in our Discord-Support-Channel please message either Lucas or Timur to get added to the channel if you are not already a member." +msgstr "Suntem bucuroși să vă asistăm la <0>support@documenso.com sau <1>în canalul nostru de suport Discord, te rugăm să-i trimiți un mesaj fie lui Lucas, fie lui Timur pentru a fi adăugat în canal dacă nu ești deja membru." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:89 +msgid "What is the difference between the plans?" +msgstr "Care este diferența între planuri?" + +#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:43 +msgid "When it comes to sending or receiving a contract, you can count on lightning-fast speeds." +msgstr "Când vine vorba de trimiterea sau primirea unui contract, poți conta pe viteze fulgerătoare." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:191 +msgid "Where can I get support?" +msgstr "Unde pot obține suport?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:177 +msgid "Why should I prefer Documenso over DocuSign or some other signing tool?" +msgstr "De ce ar trebui să prefer Documenso în locul DocuSign sau altui instrument de semnare?" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:119 +msgid "Why should I use your hosting service?" +msgstr "De ce ar trebui să folosesc serviciul vostru de găzduire?" + +#: apps/marketing/src/components/(marketing)/pricing-table.tsx:60 +msgid "Yearly" +msgstr "Anual" + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:167 +msgid "Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license." +msgstr "Da! Documenso este oferit sub licența open source GNU AGPL V3. Aceasta înseamnă că îl poți folosi gratuit și chiar modifica pentru a se potrivi nevoilor tale, atâta timp cât publici modificările sub aceeași licență." + +#: apps/marketing/src/app/(marketing)/pricing/page.tsx:93 +msgid "You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs." +msgstr "Poți găzdui Documenso pe cont propriu gratuit sau să folosești versiunea noastră găzduită gata de utilizare. Versiunea găzduită vine cu suport suplimentar, scalabilitate fără dureri și multe altele. Utilizatorii timpurii vor avea acces la toate funcțiile pe care le construim în acest an, fără costuri suplimentare! Pentru totdeauna! Da, aceasta include utilizatori multipli pe cont mai târziu. Dacă dorești Documenso pentru întreprinderea ta, suntem bucuroși să discutăm despre nevoile tale." + +#: apps/marketing/src/components/(marketing)/carousel.tsx:258 +msgid "Your browser does not support the video tag." +msgstr "Browserul tău nu suportă eticheta video." diff --git a/packages/lib/translations/ro/web.js b/packages/lib/translations/ro/web.js new file mode 100644 index 000000000..3975ff70f --- /dev/null +++ b/packages/lib/translations/ro/web.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{}")}; \ No newline at end of file diff --git a/packages/lib/translations/ro/web.po b/packages/lib/translations/ro/web.po new file mode 100644 index 000000000..0b7a0e1d4 --- /dev/null +++ b/packages/lib/translations/ro/web.po @@ -0,0 +1,19 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ro\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-25 01:27\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: web.po\n" +"X-Crowdin-File-ID: 8\n" diff --git a/packages/lib/tsconfig.json b/packages/lib/tsconfig.json index fdefbd544..7e26cc2eb 100644 --- a/packages/lib/tsconfig.json +++ b/packages/lib/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "@documenso/tsconfig/react-library.json", "compilerOptions": { - "types": ["@documenso/tsconfig/process-env.d.ts"] + "types": ["@documenso/tsconfig/process-env.d.ts"], + "moduleResolution": "Bundler" }, "include": ["**/*.ts", "**/*.tsx", "**/*.d.ts"], "exclude": ["dist", "build", "node_modules"] diff --git a/packages/lib/utils/i18n.ts b/packages/lib/utils/i18n.ts new file mode 100644 index 000000000..9c6e92cf0 --- /dev/null +++ b/packages/lib/utils/i18n.ts @@ -0,0 +1,87 @@ +import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies'; + +import type { I18n } from '@lingui/core'; + +import { IS_APP_WEB } from '../constants/app'; +import type { SupportedLanguageCodes } from '../constants/i18n'; +import { APP_I18N_OPTIONS } from '../constants/i18n'; + +export async function dynamicActivate(i18nInstance: I18n, locale: string) { + const { messages } = await import( + `../translations/${locale}/${IS_APP_WEB ? 'web' : 'marketing'}.js` + ); + + i18nInstance.loadAndActivate({ locale, messages }); +} + +/** + * Extract the language if supported from the cookies header. + * + * Returns `null` if not supported or not found. + */ +export const extractSupportedLanguageFromCookies = ( + cookies: ReadonlyRequestCookies, +): SupportedLanguageCodes | null => { + const preferredLanguage = cookies.get('i18n'); + + const foundSupportedLanguage = APP_I18N_OPTIONS.supportedLangs.find( + (lang): lang is SupportedLanguageCodes => lang === preferredLanguage?.value, + ); + + return foundSupportedLanguage || null; +}; + +/** + * Extracts the language from the `accept-language` header. + * + * Returns `null` if not supported or not found. + */ +export const extractSupportedLanguageFromHeaders = ( + headers: Headers, +): SupportedLanguageCodes | null => { + const locales = headers.get('accept-language') ?? ''; + + const [locale] = locales.split(','); + + // Convert locale to language. + const [language] = locale.split('-'); + + const foundSupportedLanguage = APP_I18N_OPTIONS.supportedLangs.find( + (lang): lang is SupportedLanguageCodes => lang === language, + ); + + return foundSupportedLanguage || null; +}; + +type ExtractSupportedLanguageOptions = { + headers?: Headers; + cookies?: ReadonlyRequestCookies; +}; + +/** + * Extract the supported language from the cookies, then header if not found. + * + * Will return the default fallback language if not found. + */ +export const extractSupportedLanguage = ({ + headers, + cookies, +}: ExtractSupportedLanguageOptions): SupportedLanguageCodes => { + if (cookies) { + const langCookie = extractSupportedLanguageFromCookies(cookies); + + if (langCookie) { + return langCookie; + } + } + + if (headers) { + const langHeader = extractSupportedLanguageFromHeaders(headers); + + if (langHeader) { + return langHeader; + } + } + + return APP_I18N_OPTIONS.sourceLang; +}; diff --git a/packages/tsconfig/nextjs.json b/packages/tsconfig/nextjs.json index 8c8ac1439..a04885c19 100644 --- a/packages/tsconfig/nextjs.json +++ b/packages/tsconfig/nextjs.json @@ -7,6 +7,7 @@ "jsx": "preserve", "lib": ["dom", "dom.iterable", "esnext"], "module": "esnext", + "moduleResolution": "Bundler", "noEmit": true, "declaration": false, "declarationMap": false, diff --git a/packages/ui/components/document/document-global-auth-action-select.tsx b/packages/ui/components/document/document-global-auth-action-select.tsx index d90b492ac..bb04f91fb 100644 --- a/packages/ui/components/document/document-global-auth-action-select.tsx +++ b/packages/ui/components/document/document-global-auth-action-select.tsx @@ -48,9 +48,7 @@ export const DocumentGlobalAuthActionTooltip = () => ( -

- Global recipient action authentication -

+

Global recipient action authentication

The authentication required for recipients to sign the signature field.

diff --git a/packages/ui/package.json b/packages/ui/package.json index 964cd37d2..a9a90545e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -28,6 +28,8 @@ "dependencies": { "@documenso/lib": "*", "@hookform/resolvers": "^3.3.0", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@radix-ui/react-accordion": "^1.1.1", "@radix-ui/react-alert-dialog": "^1.0.3", "@radix-ui/react-aspect-ratio": "^1.0.2", diff --git a/turbo.json b/turbo.json index 3d7ce4059..c2057dcf3 100644 --- a/turbo.json +++ b/turbo.json @@ -45,6 +45,9 @@ "^build" ], "cache": false + }, + "translate:compile": { + "cache": false } }, "globalDependencies": [ @@ -138,4 +141,4 @@ "E2E_TEST_AUTHENTICATE_USER_EMAIL", "E2E_TEST_AUTHENTICATE_USER_PASSWORD" ] -} +} \ No newline at end of file