Showing preview only (586K chars total). Download the full file or copy to clipboard to get everything.
Repository: VERT-sh/VERT
Branch: main
Commit: 915421386860
Files: 131
Total size: 51.0 MB
Directory structure:
gitextract_zs7t_6zy/
├── .dockerignore
├── .env.example
├── .github/
│ └── workflows/
│ ├── docker.yml
│ └── pages.yml
├── .gitignore
├── .npmignore
├── .prettierignore
├── .prettierrc
├── .vscode/
│ ├── extensions.json
│ ├── settings.json
│ └── tailwind.json
├── Dockerfile
├── LICENSE
├── README.md
├── docker-compose.yml
├── docs/
│ ├── DOCKER.md
│ ├── FAQ.md
│ ├── GETTING_STARTED.md
│ └── VIDEO_CONVERSION.md
├── eslint.config.js
├── flake.nix
├── messages/
│ ├── ba.json
│ ├── de.json
│ ├── el.json
│ ├── en.json
│ ├── es.json
│ ├── fr.json
│ ├── hr.json
│ ├── id.json
│ ├── it.json
│ ├── ja.json
│ ├── ko.json
│ ├── pt-BR.json
│ ├── tr.json
│ ├── zh-Hans.json
│ └── zh-Hant.json
├── nginx/
│ ├── default-ssl.conf
│ └── default.conf
├── package.json
├── postcss.config.js
├── project.inlang/
│ ├── .gitignore
│ ├── project_id
│ └── settings.json
├── src/
│ ├── app.d.ts
│ ├── app.html
│ ├── hooks.server.ts
│ ├── hooks.ts
│ ├── lib/
│ │ ├── assets/
│ │ │ └── style/
│ │ │ └── host-grotesk.css
│ │ ├── components/
│ │ │ ├── functional/
│ │ │ │ ├── ConversionPanel.svelte
│ │ │ │ ├── Dialog.svelte
│ │ │ │ ├── Dropdown.svelte
│ │ │ │ ├── FancyInput.svelte
│ │ │ │ ├── FancyMenu.svelte
│ │ │ │ ├── FormatDropdown.svelte
│ │ │ │ ├── Uploader.svelte
│ │ │ │ ├── VertdError.svelte
│ │ │ │ └── VertdErrorDetails.svelte
│ │ │ ├── layout/
│ │ │ │ ├── Dialogs.svelte
│ │ │ │ ├── Footer.svelte
│ │ │ │ ├── Gradients.svelte
│ │ │ │ ├── MobileLogo.svelte
│ │ │ │ ├── Navbar/
│ │ │ │ │ ├── Base.svelte
│ │ │ │ │ ├── Desktop.svelte
│ │ │ │ │ ├── Mobile.svelte
│ │ │ │ │ └── index.ts
│ │ │ │ ├── PageContent.svelte
│ │ │ │ ├── Toasts.svelte
│ │ │ │ ├── UploadRegion.svelte
│ │ │ │ └── index.ts
│ │ │ └── visual/
│ │ │ ├── Panel.svelte
│ │ │ ├── ProgressBar.svelte
│ │ │ ├── Toast.svelte
│ │ │ ├── Tooltip.svelte
│ │ │ ├── effects/
│ │ │ │ └── ProgressiveBlur.svelte
│ │ │ └── svg/
│ │ │ ├── Logo.svelte
│ │ │ ├── LogoBeta.svelte
│ │ │ └── VertVBig.svelte
│ │ ├── converters/
│ │ │ ├── converter.svelte.ts
│ │ │ ├── ffmpeg.svelte.ts
│ │ │ ├── index.ts
│ │ │ ├── magick-automated.ts
│ │ │ ├── magick.svelte.ts
│ │ │ ├── pandoc.svelte.ts
│ │ │ └── vertd.svelte.ts
│ │ ├── css/
│ │ │ └── app.scss
│ │ ├── sections/
│ │ │ ├── about/
│ │ │ │ ├── Credits.svelte
│ │ │ │ ├── Donate.svelte
│ │ │ │ ├── Resources.svelte
│ │ │ │ ├── Sponsors.svelte
│ │ │ │ ├── Why.svelte
│ │ │ │ └── index.ts
│ │ │ └── settings/
│ │ │ ├── Appearance.svelte
│ │ │ ├── Conversion.svelte
│ │ │ ├── Privacy.svelte
│ │ │ ├── Vertd.svelte
│ │ │ ├── index.svelte.ts
│ │ │ └── vertdSettings.svelte.ts
│ │ ├── store/
│ │ │ ├── DialogProvider.ts
│ │ │ └── index.svelte.ts
│ │ ├── types/
│ │ │ ├── conversion-worker.ts
│ │ │ ├── file.svelte.ts
│ │ │ ├── index.ts
│ │ │ └── util.ts
│ │ ├── util/
│ │ │ ├── animation.ts
│ │ │ ├── consts.ts
│ │ │ ├── ip.ts
│ │ │ ├── logger.ts
│ │ │ ├── parse/
│ │ │ │ ├── ani.ts
│ │ │ │ └── icns/
│ │ │ │ └── index.ts
│ │ │ ├── sw.ts
│ │ │ ├── toast.svelte.ts
│ │ │ └── zip.ts
│ │ └── workers/
│ │ ├── magick.ts
│ │ └── pandoc.ts
│ └── routes/
│ ├── +layout.server.ts
│ ├── +layout.svelte
│ ├── +layout.ts
│ ├── +page.svelte
│ ├── about/
│ │ └── +page.svelte
│ ├── convert/
│ │ └── +page.svelte
│ ├── privacy/
│ │ └── +page.svelte
│ └── settings/
│ └── +page.svelte
├── static/
│ ├── manifest.json
│ ├── pandoc.wasm
│ ├── robots.txt
│ ├── sitemap.xml
│ └── sw.js
├── svelte.config.js
├── tailwind.config.ts
├── tsconfig.json
└── vite.config.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
node_modules/
build/
dist/
.svelte-kit/
.output/
.vercel/
.vscode/
LICENSE
README.md
Dockerfile
docker-compose.yml
.npmrc
.prettier*
.gitignore
.env.*
.env
.DS_Store
Thumbs.db
================================================
FILE: .env.example
================================================
# The hostname used for analytics tracking (currently only used by Plausible)
PUB_HOSTNAME=localhost:5173
# URL for your Plausible Analytics instance (leave empty to disable analytics)
PUB_PLAUSIBLE_URL=https://plausible.example.com
# Application environment: "production", "development", or "nightly"
PUB_ENV=development
# URL of the vertd daemon for video conversion (default: official VERT instance)
PUB_VERTD_URL=https://vertd.vert.sh
# Set to true to disable all external requests (vertd, Stripe, Plausible, etc.)
# Useful for privacy-focused deployments or air-gapped environments
# Note: the ffmpeg worker is still downloaded via a CDN (cdn.jsdelivr.net)
PUB_DISABLE_ALL_EXTERNAL_REQUESTS=false
# Set to true to disable blocking video conversions of an uploaded file when repeated failures
# occur within an hour. Useful for local deployments where secure context (HTTPS) may not be
# available - required for calculating file hashes of videos to block temporarily.
PUB_DISABLE_FAILURE_BLOCKS=false
# Stripe donation settings
# Please keep these values the same, they support VERT's development!
PUB_DONATION_URL=https://donations.vert.sh
PUB_STRIPE_KEY=pk_live_51RDVmAGSxPVad6bQwzVNnbc28nlmzA30krLWk1fefCMpUPiSRPkavMMbGqa8A3lUaOCMlsUEVy2CWDYg0ip3aPpL00ZJlsMkf2
================================================
FILE: .github/workflows/docker.yml
================================================
name: Docker Image CI
on:
push:
branches: ["main"]
tags: ["v*"]
paths:
- "src/**"
- "static/**"
- "Dockerfile"
- ".dockerignore"
pull_request:
branches: ["main"]
paths:
- "src/**"
- "static/**"
- "Dockerfile"
- ".dockerignore"
workflow_dispatch:
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha,format=short
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
PUB_ENV=production
PUB_HOSTNAME=${{ vars.PUB_HOSTNAME || '' }}
PUB_PLAUSIBLE_URL=${{ vars.PUB_PLAUSIBLE_URL || '' }}
PUB_VERTD_URL=https://vertd.vert.sh
PUB_DISABLE_ALL_EXTERNAL_REQUESTS=false
PUB_DONATION_URL=https://donations.vert.sh
PUB_STRIPE_KEY=pk_live_51RDVmAGSxPVad6bQwzVNnbc28nlmzA30krLWk1fefCMpUPiSRPkavMMbGqa8A3lUaOCMlsUEVy2CWDYg0ip3aPpL00ZJlsMkf2
================================================
FILE: .github/workflows/pages.yml
================================================
name: Deploy to GitHub Pages
on:
push:
branches: "main"
jobs:
build_site:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Bun
uses: oven-sh/setup-bun@v2
- name: Install dependencies
run: bun i
- name: build
env:
BASE_PATH: "/${{ github.event.repository.name }}"
PUB_HOSTNAME: "vert.sh"
PUB_PLAUSIBLE_URL: "https://ats.vert.sh"
PUB_ENV: "production"
PUB_VERTD_URL: "https://vertd.vert.sh"
PUB_DISABLE_ALL_EXTERNAL_REQUESTS: "false"
PUB_DISABLE_FAILURE_BLOCKS: "false"
PUB_DONATION_URL: "https://donations.vert.sh"
PUB_STRIPE_KEY: "pk_live_51RDVmAGSxPVad6bQwzVNnbc28nlmzA30krLWk1fefCMpUPiSRPkavMMbGqa8A3lUaOCMlsUEVy2CWDYg0ip3aPpL00ZJlsMkf2"
run: bun run build
- name: Upload Artifacts
uses: actions/upload-pages-artifact@v3
with:
path: "build/"
deploy:
needs: build_site
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy
id: deployment
uses: actions/deploy-pages@v4
================================================
FILE: .gitignore
================================================
node_modules
# Output
.output
.vercel
/.svelte-kit
/build
# OS
.DS_Store
Thumbs.db
# Env
.env
.env.*
!.env.example
!.env.test
# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
# IDE
.idea
================================================
FILE: .npmignore
================================================
src/routes
src/app.d.ts
src/app.html
================================================
FILE: .prettierignore
================================================
# Package Managers
package-lock.json
pnpm-lock.yaml
yarn.lock
================================================
FILE: .prettierrc
================================================
{
"useTabs": true,
"tabWidth": 4,
"singleQuote": false,
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": [
"inlang.vs-code-extension"
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"css.customData": [".vscode/tailwind.json"]
}
================================================
FILE: .vscode/tailwind.json
================================================
{
"version": 1.1,
"atDirectives": [
{
"name": "@tailwind",
"description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#tailwind"
}
]
},
{
"name": "@apply",
"description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#apply"
}
]
},
{
"name": "@responsive",
"description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#responsive"
}
]
},
{
"name": "@screen",
"description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#screen"
}
]
},
{
"name": "@variants",
"description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n",
"references": [
{
"name": "Tailwind Documentation",
"url": "https://tailwindcss.com/docs/functions-and-directives#variants"
}
]
}
]
}
================================================
FILE: Dockerfile
================================================
FROM oven/bun AS builder
WORKDIR /app
ARG PUB_ENV
ARG PUB_HOSTNAME
ARG PUB_PLAUSIBLE_URL
ARG PUB_VERTD_URL
ARG PUB_DISABLE_ALL_EXTERNAL_REQUESTS
ARG PUB_DONATION_URL
ARG PUB_STRIPE_KEY
ARG PUB_DISABLE_FAILURE_BLOCKS=false
ENV PUB_ENV=${PUB_ENV}
ENV PUB_HOSTNAME=${PUB_HOSTNAME}
ENV PUB_PLAUSIBLE_URL=${PUB_PLAUSIBLE_URL}
ENV PUB_VERTD_URL=${PUB_VERTD_URL}
ENV PUB_DISABLE_ALL_EXTERNAL_REQUESTS=${PUB_DISABLE_ALL_EXTERNAL_REQUESTS}
ENV PUB_DONATION_URL=${PUB_DONATION_URL}
ENV PUB_STRIPE_KEY=${PUB_STRIPE_KEY}
ENV PUB_DISABLE_FAILURE_BLOCKS=${PUB_DISABLE_FAILURE_BLOCKS}
COPY package.json ./
RUN apt-get update && \
apt-get install -y --no-install-recommends git && \
rm -rf /var/lib/apt/lists/*
RUN bun install
COPY . ./
RUN bun run build
FROM nginx:stable-alpine
EXPOSE 80/tcp
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl --fail --silent --output /dev/null http://localhost || exit 1
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
<p align="center">
<img src="https://github.com/user-attachments/assets/bf441748-0ec5-4c8a-b3e5-11301ee3f0bd" alt="VERT's logo" height="100">
</p>
<h1 align="center"><a href="https://vert.sh">VERT.sh</a></h1>
VERT is a file conversion utility that uses WebAssembly to convert files on your device instead of a cloud. Check out the live instance at [vert.sh](https://vert.sh).
VERT is built in Svelte and TypeScript.
## Screenshots
| Upload page | Conversion page |
| :--------------------------------------------------: | :------------------------------------------------------: |
|  |  |
## Features
- Convert files directly on your device using WebAssembly\*
- No file or file size limits
- Convert images, audio, documents, and video\*
- Supports over **250+** file formats
- Conversion settings
- User-friendly interface built with Svelte
<sup>\* Non-local video conversion is available with our official instance, but the [daemon](https://github.com/VERT-sh/vertd) is easily self-hostable to maintain privacy and fully local functionality.</sup>
## Documentation
- [FAQ](./docs/FAQ.md)
- [Getting Started](./docs/GETTING_STARTED.md)
- [Using Docker](./docs/DOCKER.md)
- [Video Conversion](./docs/VIDEO_CONVERSION.md)
## License
This project is licensed under the AGPL-3.0 License, please see the [LICENSE](LICENSE) file for details.
## Star History
<a href="https://www.star-history.com/#VERT-sh/VERT&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=VERT-sh/VERT&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=VERT-sh/VERT&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=VERT-sh/VERT&type=Date" />
</picture>
</a>
================================================
FILE: docker-compose.yml
================================================
services:
vert:
container_name: vert
image: ghcr.io/vert-sh/vert:latest
build:
context: .
args:
PUB_HOSTNAME: ${PUB_HOSTNAME:-localhost:5173}
PUB_PLAUSIBLE_URL: ${PUB_PLAUSIBLE_URL:-}
PUB_ENV: ${PUB_ENV:-production}
PUB_DISABLE_ALL_EXTERNAL_REQUESTS: ${PUB_DISABLE_ALL_EXTERNAL_REQUESTS:-false}
PUB_VERTD_URL: ${PUB_VERTD_URL:-}
PUB_DONATION_URL: ${PUB_DONATION_URL:-https://donations.vert.sh}
PUB_STRIPE_KEY: ${PUB_STRIPE_KEY:-pk_live_51RDVmAGSxPVad6bQwzVNnbc28nlmzA30krLWk1fefCMpUPiSRPkavMMbGqa8A3lUaOCMlsUEVy2CWDYg0ip3aPpL00ZJlsMkf2}
restart: unless-stopped
ports:
- ${PORT:-3000}:80
================================================
FILE: docs/DOCKER.md
================================================
## Using Docker
This file covers how to run VERT under a Docker container.
- [Manually building the image](#manually-building-the-image)
- [Using an image from the GitHub Container Registry](#using-an-image-from-the-github-container-registry)
### Manually building the image
First, clone the repository:
```shell
git clone https://github.com/VERT-sh/VERT
cd VERT/
```
Then build a Docker image with:
```shell
docker build -t vert-sh/vert \
--build-arg PUB_ENV=production \
--build-arg PUB_HOSTNAME=vert.sh \
--build-arg PUB_PLAUSIBLE_URL=https://plausible.example.com \
--build-arg PUB_VERTD_URL=https://vertd.vert.sh \
--build-arg PUB_DONATION_URL=https://donations.vert.sh \
--build-arg PUB_DISABLE_ALL_EXTERNAL_REQUESTS=false \
--build-arg PUB_STRIPE_KEY="" .
```
You can then run it by using:
```shell
docker run -d \
--restart unless-stopped \
-p 3000:80 \
--name "vert" \
vert-sh/vert
```
This will do the following:
- Use the previously built image as the container `vert`, in detached mode
- Continuously restart the container until manually stopped
- Map `3000/tcp` (host) to `80/tcp` (container)
We also have a [`docker-compose.yml`](/docker-compose.yml) file available. Use `docker compose up` if you want to start the stack, or `docker compose down` to bring it down. You can pass `--build` to `docker compose up` to rebuild the Docker image (useful if you've changed any of the environment variables) as well as `-d` to start it in detached mode. You can read more about Docker Compose in general [here](https://docs.docker.com/compose/intro/compose-application-model/).
### Using an image from the GitHub Container Registry
While there's an image you can pull instead of cloning the repo and building the image yourself, you will not be able to update any of the environment variables (e.g. `PUB_PLAUSIBLE_URL`) as they're baked directly into the image and not obtained during runtime. If you're okay with this, you can simply run this command instead:
```shell
docker run -d \
--restart unless-stopped \
-p 3000:80 \
--name "vert" \
ghcr.io/vert-sh/vert:latest
```
================================================
FILE: docs/FAQ.md
================================================
## FAQ
This file covers frequently asked questions.
- [Why VERT?](#why-vert)
- [What happens with video files?](#what-happens-with-video-files)
- [Can I host my own video file converter?](#can-i-host-my-own-video-file-converter)
- [What about analytics?](#what-about-analytics)
- [What libraries does VERT use?](#what-libraries-does-vert-use)
- [Is it possible to fully prevent VERT from making requests to external services?](#is-it-possible-to-fully-prevent-vert-from-making-requests-to-external-services)
### Why VERT?
**File converters have always disappointed us.** They're ugly, riddled with ads, and most importantly; slow. We decided to solve this problem once and for all by making an alternative that solves all those problems, and more.
All non-video files are converted completely on-device; this means that there's no delay between sending and receiving the files from a server, and we never get to snoop on the files you convert.
### What happens with video files?
Video files get uploaded to our lightning-fast RTX 4000 Ada server. Your videos stay on there for an hour if you do not convert them. If you do convert the file, the video will stay on the server for an hour, or until it is downloaded. The file will then be deleted from our server.
### Can I host my own video file converter?
Yes. Check out the [Video Conversion](./VIDEO_CONVERSION.md) page.
### What about analytics?
We use [Plausible](https://plausible.io/privacy-focused-web-analytics), a privacy-focused analytics tool, to gather completely anonymous statistics. All data is anonymized and aggregated, and no identifiable information is ever sent or stored. You can view the analytics [here](https://ats.vert.sh/vert.sh) and choose to opt out in the [Settings](https://vert.sh/settings/) page.
### Is it possible to fully prevent VERT from making requests to external services?
Yes! If you would prefer VERT to not make any requests to external services (video conversion, analytics, among others), you can set the `PUB_DISABLE_ALL_EXTERNAL_REQUESTS` environment variable to `true` **during build time**.
The only external request VERT will make with this option is to `cdn.jsdelivr.net`, which is used to download FFmpeg's WebAssembly build.
### What libraries does VERT use?
VERT uses FFmpeg for audio and video conversion, imagemagick for images and Pandoc for documents. A big thanks to them for maintaining such excellent libraries for so many years.
================================================
FILE: docs/GETTING_STARTED.md
================================================
## Getting Started
This file covers how to get started with VERT.
- [Prerequisites](#prerequisites)
- [Installation](#installation)
- [Running Locally](#running-locally)
- [Building for Production](#building-for-production)
- [Using Docker](#using-docker)
### Prerequisites
Make sure you have the following installed:
- [Bun](https://bun.sh/)
### Installation
First, clone the repository:
```sh
git clone https://github.com/VERT-sh/VERT
cd VERT/
```
Install dependencies:
```sh
bun i
```
And finally, make sure you create a `.env` file in the root of the project. We've included a [`.env.example`](../.env.example) file which you can use to get started.
### Running Locally
To run the project locally, run `bun dev`.
This will start a development server. Open your browser and navigate to `http://localhost:5173` to see the application.
### Building for Production
To build the project for production, run `bun run build`.
This will build the site to the `build` folder. You should then use a web server like [nginx](https://nginx.org) to serve the files inside that folder.
### Using Docker
Check the dedicated [Docker](./DOCKER.md) page.
================================================
FILE: docs/VIDEO_CONVERSION.md
================================================
## Video conversion
This file covers how video conversion works when using VERT.
On VERT, video uploads to a server for processing by default. This is because video conversion is hard to do in a browser as it uses a lot of resources, and will end up running very slowly (if it even works at all).
Our answer to this is [`vertd`](https://github.com/VERT-sh/vertd), which is a simple FFmpeg wrapper built in Rust. If you don't understand all that technical jargon, it basically allows you to convert videos using the full capacity of your computer, which results in much faster conversion. It runs on your computer (or a server somewhere, if you know what you're doing), and the VERT web interface reaches out to it in order to convert your videos.
We host an official instance of [`vertd`](https://github.com/VERT-sh/vertd) so you do not have to host it yourself for convenience, but considering you're here, you probably want to host it for yourself. Essentially:
- Download the latest release of `vertd` for your machine [here](https://github.com/VERT-sh/vertd/releases)
- Run the server
- Connect the VERT UI to your local `vertd` instance by entering its IP & port
- By default, `vertd` runs a HTTP server on port `24153`, so you would put `http://localhost:24153` in the "Instance URL" setting found in VERT's settings (assuming you are running it on your own PC)
================================================
FILE: eslint.config.js
================================================
import prettier from 'eslint-config-prettier';
import js from '@eslint/js';
import svelte from 'eslint-plugin-svelte';
import globals from 'globals';
import ts from 'typescript-eslint';
export default ts.config(
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs['flat/recommended'],
prettier,
...svelte.configs['flat/prettier'],
{
languageOptions: {
globals: {
...globals.browser,
...globals.node
}
}
},
{
files: ['**/*.svelte'],
languageOptions: {
parserOptions: {
parser: ts.parser
}
}
},
{
ignores: ['build/', '.svelte-kit/', 'dist/']
}
);
================================================
FILE: flake.nix
================================================
{
description = "VERT.sh";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
in
{
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
bun
nodejs
# are these needed?
nodePackages.prettier
nodePackages.eslint
];
};
});
}
================================================
FILE: messages/ba.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Učitaj",
"convert": "Konvertuj",
"settings": "Postavke",
"about": "O nama",
"toggle_theme": "Promijeni temu"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Izvorni kod",
"discord_server": "Discord server",
"privacy_policy": "Politika privatnosti"
},
"upload": {
"title": "Konverter datoteka koji ćete voljeti.",
"subtitle": "Sva obrada slika, zvuka i dokumenata obavlja se na vašem uređaju. Video zapisi se konvertuju na našim izuzetno brzim serverima. Bez ograničenja veličine, bez reklama i potpuno otvorenog koda.",
"uploader": {
"text": "Prevucite ili kliknite da {action}",
"convert": "konvertujete"
},
"cards": {
"title": "VERT podržava...",
"images": "Slike",
"audio": "Audio",
"documents": "Dokumente",
"video": "Video",
"video_server_processing": "Server podržava",
"local_supported": "Lokalno podržano",
"status": {
"text": "<b>Status:</b> {status}",
"ready": "spreman",
"not_ready": "nije spreman",
"not_initialized": "nije inicijaliziran",
"downloading": "preuzimam...",
"initializing": "inicijaliziram...",
"unknown": "nepoznat status"
},
"supported_formats": "Podržani formati:"
},
"tooltip": {
"partial_support": "Ovaj format može biti konvertovan samo kao {direction}.",
"direction_input": "ulazni (iz)",
"direction_output": "izlazni (u)",
"video_server_processing": "Video se podrazumijevano otprema na server radi obrade, ovdje možete naučiti kako to postaviti lokalno."
}
},
"convert": {
"archive_file": {
"extract": "Raspakuj arhivu",
"extracting": "Otkrivena arhiva: {filename}",
"extracted": "Izvučeno {extract_count} datoteka iz {filename}. {ignore_count} stavki je ignorisano.",
"detected": "Otkrivene {type} datoteke u {filename}.",
"audio": "audio",
"video": "video",
"doc": "dokument",
"image": "slika",
"extract_error": "Greška pri raspakivanju {filename}: {error}"
},
"large_file_warning": "Zbog ograničenja preglednika/uređaja, konverzija videa u audio je onemogućena za ovu datoteku jer je veća od {limit}GB. Preporučujemo Firefox ili Safari za datoteke ove veličine jer imaju manje ograničenja.",
"external_warning": {
"title": "Upozorenje o vanjskom serveru",
"text": "Ako odaberete konverziju u video format, te datoteke će biti otpremljene na vanjski server. Želite li nastaviti?",
"yes": "Da",
"no": "Ne"
},
"panel": {
"convert_all": "Konvertuj sve",
"download_all": "Preuzmi sve kao .zip",
"remove_all": "Ukloni sve datoteke",
"set_all_to": "Postavi sve na",
"na": "N/A"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Dokument",
"image": "Slika",
"placeholder": "Pretraži format",
"no_formats": "Nema dostupnih formata",
"no_results": "Nema rezultata koji odgovaraju pretrazi"
},
"tooltips": {
"unknown_file": "Nepoznat tip datoteke",
"audio_file": "Audio datoteka",
"video_file": "Video datoteka",
"document_file": "Dokument",
"image_file": "Slika",
"convert_file": "Konvertuj ovu datoteku",
"download_file": "Preuzmi ovu datoteku"
},
"errors": {
"cant_convert": "Ne možemo konvertovati ovu datoteku.",
"vertd_server": "šta to radiš..? treba da pokreneš vertd server!",
"vertd_generic_view": "Prikaži detalje greške",
"vertd_generic_body": "Došlo je do greške prilikom pokušaja konverzije videa. Želite li poslati svoj video programerima da pomognete u rješavanju problema? Samo će vaš video biti poslan. Nikakvi identifikatori neće biti otpremljeni.",
"vertd_generic_title": "Greška pri konverziji videa",
"vertd_generic_yes": "Pošalji video",
"vertd_generic_no": "Ne šalji",
"vertd_failed_to_keep": "Neuspjelo čuvanje videa na serveru: {error}",
"vertd_details": "Prikaži detalje greške",
"vertd_details_body": "Ako pritisnete pošalji, <b>vaš video će također biti priložen</b> uz log greške koji se uvijek automatski šalje nama na pregled. Sljedeće informacije su log koji automatski dobijamo:",
"vertd_details_footer": "Ove informacije se koriste isključivo za rješavanje problema i nikada neće biti dijeljene. Pogledajte našu [privacy_link]politiku privatnosti[/privacy_link] za više detalja.",
"vertd_details_job_id": "<b>ID zadatka:</b> {jobId}",
"vertd_details_from": "<b>Iz formata:</b> {from}",
"vertd_details_to": "<b>U format:</b> {to}",
"vertd_details_error_message": "<b>Poruka greške:</b> [view_link]Pogledaj log[/view_link]",
"vertd_details_close": "Zatvori",
"vertd_ratelimit": "Vaš video '{filename}' nije uspio biti konvertovan nekoliko puta. Kako bismo spriječili preopterećenje servera, dalji pokušaji konverzije za ovu datoteku su privremeno blokirani.",
"unsupported_format": "Podržane su samo slike, video, audio i dokumenti",
"format_output_only": "Ovaj format se trenutno može koristiti samo kao izlaz, ne kao ulaz.",
"vertd_not_found": "Nije moguće pronaći vertd instancu za pokretanje konverzije videa. Da li je URL ispravno postavljen?",
"worker_downloading": "{type} konverter se trenutno inicijalizira, molimo sačekajte.",
"worker_error": "{type} konverter je imao grešku tokom inicijalizacije, pokušajte kasnije ponovo.",
"worker_timeout": "{type} konverteru treba duže nego očekivano da se inicijalizira, molimo sačekajte još malo ili osvježite stranicu.",
"audio": "audio",
"doc": "dokument",
"image": "slika"
}
},
"settings": {
"title": "Postavke",
"errors": {
"save_failed": "Neuspješno spremanje postavki!"
},
"appearance": {
"title": "Izgled",
"brightness_theme": "Tema osvjetljenja",
"brightness_description": "Želite li blještavi dan ili tihu, usamljenu noć?",
"light": "Svijetla",
"dark": "Tamna",
"effect_settings": "Efekti",
"effect_description": "Želite li zanimljive efekte ili mirnije iskustvo?",
"enable": "Uključi",
"disable": "Isključi"
},
"conversion": {
"title": "Konverzija",
"advanced_settings": "Napredne postavke",
"filename_format": "Format imena datoteke",
"filename_description": "Ovo određuje ime datoteke pri preuzimanju, <b>bez ekstenzije</b>. Možete koristiti sljedeće šablone: <b>%name%</b> originalno ime, <b>%extension%</b> originalna ekstenzija, <b>%date%</b> datum konverzije.",
"placeholder": "VERT_%name%",
"default_format": "Podrazumijevani format konverzije",
"default_format_enable": "Uključi",
"default_format_disable": "Isključi",
"default_format_description": "Ovo mijenja podrazumijevani format koji se odabere kada učitate datoteku ovog tipa.",
"default_format_image": "Slike",
"default_format_video": "Video",
"default_format_audio": "Audio",
"default_format_document": "Dokumenti",
"metadata": "Metadata",
"metadata_description": "Određuje da li se podaci (EXIF, info o pjesmi itd.) čuvaju u konvertovanim datotekama.",
"keep": "Zadrži",
"remove": "Ukloni",
"quality": "Kvalitet konverzije",
"quality_description": "Mijenja podrazumijevani kvalitet izlazne datoteke. Veće vrijednosti znače duže vrijeme konverzije i veću veličinu.",
"quality_video": "Mijenja izlazni kvalitet videa.",
"quality_audio": "Audio (kbps)",
"quality_images": "Slika (%)",
"rate": "Sample rate (Hz)"
},
"vertd": {
"title": "Konverzija videa",
"status": "status:",
"loading": "učitavam...",
"available": "dostupan, commit id {commitId}",
"unavailable": "nedostupan (da li je URL tačan?)",
"description": "<code>vertd</code> je serverski omotač za FFmpeg, omogućava brzo konvertovanje videa koristeći vaš GPU putem VERT web interfejsa.",
"hosting_info": "Imamo javnu instancu radi praktičnosti, ali možete lako hostati svoju. Preuzmite server [vertd_link]ovdje[/vertd_link].",
"instance": "Instanca",
"url_placeholder": "Primjer: http://localhost:24153",
"conversion_speed": "Brzina konverzije",
"speed_description": "Opisuje odnos između brzine i kvaliteta. Brže = niži kvalitet ali kraće vrijeme.",
"speeds": {
"very_slow": "Vrlo sporo",
"slower": "Sporije",
"slow": "Sporo",
"medium": "Srednje",
"fast": "Brzo",
"ultra_fast": "Ultra brzo"
},
"auto_instance": "Auto (preporučeno)",
"eu_instance": "Falkenstein, Njemačka",
"us_instance": "Washington, SAD",
"custom_instance": "Prilagođeno"
},
"privacy": {
"title": "Privatnost i podaci",
"plausible_title": "Plausible analitika",
"plausible_description": "Koristimo [plausible_link]Plausible[/plausible_link], alat fokusiran na privatnost. Podaci su potpuno anonimni i agregirani. Analitiku možete vidjeti [analytics_link]ovdje[/analytics_link] i isključiti ispod.",
"opt_in": "Uključi",
"opt_out": "Isključi",
"cache_title": "Upravljanje cacheom",
"cache_description": "Konverter se kešira u vašem pregledniku radi boljih performansi.",
"refresh_cache": "Osvježi cache",
"clear_cache": "Obriši cache",
"files_cached": "{size} ({count} datoteka)",
"loading_cache": "Učitavam...",
"total_size": "Ukupna veličina",
"files_cached_label": "Keširane datoteke",
"cache_cleared": "Cache uspješno obrisan!",
"cache_clear_error": "Neuspješno brisanje cachea.",
"site_data_title": "Upravljanje podacima stranice",
"site_data_description": "Obriši sve podatke stranice uključujući postavke i cache i resetuj VERT.",
"clear_all_data": "Obriši sve podatke",
"clear_all_data_confirm_title": "Obrisati sve podatke stranice?",
"clear_all_data_confirm": "Resetovat će sve postavke i cache i osvježiti stranicu. Ova akcija je nepovratna.",
"clear_all_data_cancel": "Otkaži",
"all_data_cleared": "Svi podaci obrisani! Osvježavam stranicu...",
"all_data_clear_error": "Neuspješno brisanje svih podataka."
},
"language": {
"title": "Jezik",
"description": "Odaberite željeni jezik VERT interfejsa."
}
},
"about": {
"title": "O nama",
"why": {
"title": "Zašto VERT?",
"description": "<b>Konverteri datoteka su nas uvijek razočaravali.</b> Ružni su, puni reklama i, najvažnije, spori. Odlučili smo to riješiti jednom zauvijek.<br/><br/>Sve ne-video datoteke se obrađuju lokalno, što znači da nema slanja datoteka na server — i mi nikad ne vidimo vaše podatke.<br/><br/>Video se otprema na naš brzi RTX 4000 Ada server. Vaši video snimci ostaju tamo sat vremena ako ih ne konvertujete. Ako ih konvertujete, ostaju sat ili dok ih preuzmete, nakon čega se brišu."
},
"sponsors": {
"title": "Sponzori",
"description": "Želite nas podržati? Kontaktirajte nekog od developera na [discord_link]Discordu[/discord_link] ili pošaljite email na",
"email_copied": "Email kopiran!"
},
"resources": {
"title": "Resursi",
"discord": "Discord",
"source": "Izvor",
"email": "Email"
},
"donate": {
"title": "Donirajte VERT-u",
"description": "Vaša podrška pomaže da nastavimo razvijati i unapređivati VERT.",
"one_time": "Jednokratno",
"monthly": "Mjesečno",
"custom": "Prilagođeno",
"pay_now": "Plati sada",
"donate_amount": "Doniraj ${amount} USD",
"thank_you": "Hvala na donaciji!",
"payment_failed": "Plaćanje nije uspjelo: {message}{period}. Novac nije skinut s vašeg računa.",
"donation_error": "Došlo je do greške pri obradi donacije. Pokušajte ponovo kasnije.",
"payment_error": "Greška pri dohvaćanju podataka o plaćanju. Pokušajte ponovo.",
"donation_notice_official": "Donacije ovdje idu za zvaničnu VERT instancu (vert.sh) i pomažu razvoj projekta.",
"donation_notice_unofficial": "Donacije ovdje idu operateru ove VERT instance. Ako želite podržati zvanične developere, posjetite [official_link]vert.sh[/official_link]."
},
"credits": {
"title": "Zasluge",
"contact_team": "Ako želite kontaktirati razvojni tim, koristite email iz kartice \"Resursi\".",
"notable_contributors": "Istaknuti doprinosioci",
"notable_description": "Želimo zahvaliti ovim osobama na velikim doprinosima VERT-u.",
"github_contributors": "GitHub doprinosioci",
"github_description": "Veliko hvala svima! [github_link]Želite pomoći i vi?[/github_link]",
"no_contributors": "Izgleda da još niko nije doprinio... [contribute_link]budite prvi![/contribute_link]",
"libraries": "Biblioteke",
"libraries_description": "Veliko hvala FFmpeg-u (audio, video), ImageMagick-u (slike) i Pandoc-u (dokumenti). VERT se na njima temelji.",
"roles": {
"lead_developer": "Glavni developer; backend konverzije, UI implementacija",
"developer": "Developer; UI implementacija",
"designer": "Dizajner; UX, brending, marketing",
"docker_ci": "Održavanje Docker & CI podrške",
"former_cofounder": "Bivši suosnivač i dizajner"
}
},
"errors": {
"github_contributors": "Greška pri dohvaćanju GitHub doprinosilaca"
}
},
"workers": {
"errors": {
"general": "Greška pri konverziji {file}: {message}",
"cancel": "Greška pri otkazivanju konverzije za {file}: {message}",
"magick": "Greška u Magick workeru, konverzija slika možda neće raditi ispravno.",
"ffmpeg": "Greška pri učitavanju FFmpeg-a, neke funkcije možda neće raditi.",
"pandoc": "Greška pri učitavanju Pandoc workera, dokumenti možda neće biti konvertovani.",
"no_audio": "Nije pronađen audio zapis.",
"invalid_rate": "Nevažeća sample rate vrijednost: {rate}Hz",
"file_too_large": "Ova datoteka prelazi {limit}GB ograničenje preglednika/uređaja. Pokušajte u Firefoxu ili Safariju."
}
},
"privacy": {
"title": "Politika privatnosti",
"summary": {
"title": "Sažetak",
"description": "VERT-ova politika privatnosti je vrlo jednostavna: ne prikupljamo niti pohranjujemo ikakve podatke o vama. Ne koristimo kolačiće ni trackere, analitika je potpuno privatna, a konverzije (osim videa) rade lokalno. Video se briše nakon preuzimanja ili nakon sat vremena, osim ako nam ne date dozvolu da ga čuvamo radi rješavanja problema. Koristimo Coolify za hosting i Plausible za anonimnu analitiku. Stripe obrađuje donacije i može prikupiti podatke za prevenciju prevara.<br/><br/>Ovo vrijedi za zvaničnu instancu [vert_link]vert.sh[/vert_link]; treće strane mogu raditi drugačije."
},
"conversions": {
"title": "Konverzije",
"description": "Većina konverzija (slike, dokumenti, audio) se obavlja lokalno putem WebAssembly alata (ImageMagick, Pandoc, FFmpeg). Vaše datoteke ne napuštaju uređaj.<br/><br/>Video konverzije se obavljaju na našim serverima jer zahtijevaju više snage. Video se briše nakon preuzimanja ili sat vremena, osim ako nam eksplicitno ne dozvolite duže čuvanje radi otklanjanja grešaka."
},
"donations": {
"title": "Donacije",
"description": "Koristimo Stripe na stranici [about_link]o nama[/about_link] za donacije. Stripe može prikupiti određene informacije radi prevencije prevara, opisano u [stripe_link]njihovoj dokumentaciji[/stripe_link]. Eksterni zahtjevi se šalju tek nakon vašeg klika."
},
"conversion_errors": {
"title": "Greške pri konverziji",
"description": "Kada konverzija videa ne uspije, možemo prikupiti anonimne informacije radi dijagnostike:",
"list_job_id": "ID zadatka (anonimizirano ime datoteke)",
"list_format_from": "Format iz kojeg se konvertuje",
"list_format_to": "Format u koji se konvertuje",
"list_stderr": "FFmpeg stderr (poruka greške)",
"list_video": "Stvarni video zapis (samo uz vašu dozvolu)",
"footer": "Ove informacije se koriste samo za dijagnostiku. Sam video se prikuplja samo uz vašu dozvolu."
},
"analytics": {
"title": "Analitika",
"description": "Koristimo vlastitu Plausible instancu za potpuno anonimnu analitiku. Plausible ne koristi kolačiće i usklađen je sa svim glavnim zakonima o privatnosti. Možete isključiti analitiku u sekciji \"Privatnost i podaci\" u [settings_link]postavkama[/settings_link] i pročitati više [plausible_link]ovdje[/plausible_link]."
},
"local_storage": {
"title": "Lokalno skladištenje",
"description": "Vaše postavke se čuvaju u local storage-u preglednika, a lista GitHub doprinosilaca u session storage-u. Nijedan lični podatak se ne skladišti.<br/><br/>WebAssembly alati (FFmpeg, ImageMagick, Pandoc) se također čuvaju lokalno. Možete ih vidjeti ili obrisati u sekciji \"Privatnost i podaci\" u [settings_link]postavkama[/settings_link]."
},
"contact": {
"title": "Kontakt",
"description": "Za pitanja, pišite nam na: [email_link]hello@vert.sh[/email_link]. Ako koristite treću stranu, kontaktirajte njihovog hostera."
},
"last_updated": "Posljednje ažuriranje: 2025-10-29"
}
}
================================================
FILE: messages/de.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Hochladen",
"convert": "Konvertieren",
"settings": "Optionen",
"about": "Über",
"toggle_theme": "Design wechseln"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Quellcode",
"discord_server": "Discord-Server",
"privacy_policy": "Datenschutzerklärung"
},
"upload": {
"title": "Der Dateikonverter, den du lieben wirst.",
"subtitle": "Die Verarbeitung aller Bild-, Audio- und Dokumentdateien findet direkt auf deinem Gerät statt. Videos werden auf unseren blitzschnellen Servern konvertiert. Kein Dateigrößenlimit, keine Werbung und vollständig Open Source.",
"uploader": {
"text": "Dateien hier ablegen oder klicken zum {action}",
"convert": "Konvertieren"
},
"cards": {
"title": "VERT unterstützt...",
"images": "Bilder",
"audio": "Audio",
"documents": "Dokumente",
"video": "Video",
"video_server_processing": "Server-gestützt",
"local_supported": "Lokal unterstützt",
"status": {
"text": "<b>Status:</b> {status}",
"ready": "Bereit",
"not_ready": "Nicht bereit",
"not_initialized": "Nicht initialisiert",
"downloading": "Herunterladen...",
"initializing": "Initialisieren...",
"unknown": "Unbekannter Status"
},
"supported_formats": "Unterstützte Formate:"
},
"tooltip": {
"partial_support": "Dieses Format kann nur als {direction} konvertiert werden.",
"direction_input": "Eingabe (von)",
"direction_output": "Ausgabe (nach)",
"video_server_processing": "Videos werden standardmäßig zur Verarbeitung auf einen Server hochgeladen. Erfahre hier, wie du die Verarbeitung lokal einrichten kannst."
}
},
"convert": {
"archive_file": {
"extract": "Archiv entpacken",
"extracting": "Archiv erkannt: {filename}",
"extracted": "{extract_count} Dateien aus {filename} entpackt. {ignore_count} Elemente wurden ignoriert.",
"detected": "{type}-Dateien in {filename} erkannt.",
"audio": "Audio",
"video": "Video",
"doc": "Dokument",
"image": "Bild",
"extract_error": "Fehler beim Entpacken von {filename}: {error}"
},
"large_file_warning": "Aufgrund von Browser-/Gerätebeschränkungen ist die Video-zu-Audio-Konvertierung für diese Datei deaktiviert, da sie größer als {limit}GB ist. Wir empfehlen Firefox oder Safari für Dateien dieser Größe, da diese weniger Einschränkungen haben.",
"external_warning": {
"title": "Warnung: Externer Server",
"text": "Wenn du in ein Videoformat konvertierst, werden diese Dateien zur Verarbeitung auf einen externen Server hochgeladen. Möchtest du fortfahren?",
"yes": "Ja",
"no": "Nein"
},
"panel": {
"convert_all": "Alle konvertieren",
"download_all": "Alle als .zip laden",
"remove_all": "Alle entfernen",
"set_all_to": "Alle konvertieren nach",
"na": "N/V"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Dokument",
"image": "Bild",
"placeholder": "Format suchen",
"no_formats": "Keine Formate verfügbar",
"no_results": "Keine Ergebnisse"
},
"tooltips": {
"unknown_file": "Unbekannter Dateityp",
"audio_file": "Audiodatei",
"video_file": "Videodatei",
"document_file": "Dokumentdatei",
"image_file": "Bilddatei",
"convert_file": "Diese Datei konvertieren",
"download_file": "Diese Datei herunterladen"
},
"errors": {
"cant_convert": "Wir können diese Datei nicht konvertieren.",
"vertd_server": "Was machst du da..? Du solltest den vertd-Server ausführen!",
"vertd_generic_view": "Fehlerdetails anzeigen",
"vertd_generic_body": "Ein Fehler ist aufgetreten, während versucht wurde, dein Video zu konvertieren. Möchtest du dieses Video an die Entwickler senden, um bei der Behebung dieses Fehlers zu helfen? Nur die Videodatei wird gesendet. Es werden keine Identifikatoren hochgeladen.",
"vertd_generic_title": "Videokonvertierungsfehler",
"vertd_generic_yes": "Video senden",
"vertd_generic_no": "Nicht senden",
"vertd_failed_to_keep": "Das Video konnte nicht auf dem Server behalten werden: {error}",
"vertd_details": "Fehlerdetails anzeigen",
"vertd_details_body": "Wenn du auf Senden drückst, wird <b>dein Video ebenfalls angehängt</b>, zusammen mit dem Fehlerprotokoll, das uns immer zur Überprüfung gemeldet wird. Die folgenden Informationen sind das Protokoll, das wir automatisch erhalten:",
"vertd_details_footer": "Diese Informationen werden nur zur Fehlerbehebung verwendet und niemals weitergegeben. Sieh dir unsere [privacy_link]Datenschutzerklärung[/privacy_link] für weitere Details an.",
"vertd_details_job_id": "<b>Job-ID:</b> {jobId}",
"vertd_details_from": "<b>Von Format:</b> {from}",
"vertd_details_to": "<b>Zu Format:</b> {to}",
"vertd_details_error_message": "<b>Fehlermeldung:</b> [view_link]Fehlerprotokolle anzeigen[/view_link]",
"vertd_details_close": "Schließen",
"vertd_ratelimit": "Dein Video, '{filename}', konnte mehrmals nicht konvertiert werden. Um eine Überlastung des Servers zu vermeiden, wurden weitere Konvertierungsversuche für diese Datei vorübergehend blockiert. Bitte versuche es später erneut.",
"unsupported_format": "Es werden nur Bild-, Video-, Audio- und Dokumentdateien unterstützt.",
"format_output_only": "Dieses Format kann derzeit nur als Ausgabe (konvertiert zu), nicht als Eingabe verwendet werden.",
"vertd_not_found": "Konnte die vertd-Instanz nicht finden, um die Videokonvertierung zu starten. Bist du sicher, dass die Instanz-URL korrekt eingestellt ist?",
"worker_downloading": "Der {type}-Konverter wird gerade initialisiert, bitte warte einen Moment.",
"worker_error": "Beim Initialisieren des {type}-Konverters ist ein Fehler aufgetreten, bitte versuche es später erneut.",
"worker_timeout": "Die Initialisierung des {type}-Konverters dauert länger als erwartet, bitte warte noch einen Moment oder lade die Seite neu.",
"audio": "Audio",
"doc": "Dokument",
"image": "Bild"
}
},
"settings": {
"title": "Optionen",
"errors": {
"save_failed": "Speichern der Einstellungen fehlgeschlagen!"
},
"appearance": {
"title": "Erscheinungsbild",
"brightness_theme": "Farbschema",
"brightness_description": "Möchtest du einen sonnigen Blendeffekt oder eine ruhige, einsame Nacht?",
"light": "Hell",
"dark": "Dunkel",
"effect_settings": "Effekteinstellungen",
"effect_description": "Möchtest du schicke Effekte oder eine eher statische Erfahrung?",
"enable": "Animiert",
"disable": "Statisch"
},
"conversion": {
"title": "Konvertierung",
"advanced_settings": "Erweiterte Einstellungen",
"filename_format": "Dateinamensformat",
"filename_description": "Dies bestimmt den Namen der Datei beim Herunterladen, <b>ohne die Dateiendung.</b> Du kannst folgende Platzhalter verwenden: <b>%name%</b> für den ursprünglichen Dateinamen, <b>%extension%</b> für die ursprüngliche Dateiendung und <b>%date%</b> für das Datum der Konvertierung.",
"placeholder": "VERT_%name%",
"default_format": "Standard-Format",
"default_format_enable": "Aktivieren",
"default_format_disable": "Deaktivieren",
"default_format_description": "Dies ändert das Format, das standardmäßig ausgewählt wird, wenn du eine Datei dieses Typs hochlädst.",
"default_format_image": "Bilder",
"default_format_video": "Videos",
"default_format_audio": "Audio",
"default_format_document": "Dokumente",
"metadata": "Metadaten",
"metadata_description": "Dies legt fest, ob Metadaten (EXIF, Song-Infos etc.) der Originaldatei in den konvertierten Dateien erhalten bleiben.",
"keep": "Behalten",
"remove": "Entfernen",
"quality": "Qualität",
"quality_description": "Dies ändert die Standard-Qualität der konvertierten Dateien. Höhere Werte können zu längeren Konvertierungszeiten und größeren Dateien führen.",
"quality_video": "Dies ändert die Standard-Qualität der konvertierten Videodateien. Höhere Werte können zu längeren Konvertierungszeiten und größeren Dateien führen.",
"quality_audio": "Audio (kbps)",
"quality_images": "Bild (%)",
"rate": "Abtastrate (Hz)"
},
"vertd": {
"title": "Videokonvertierung",
"status": "Status:",
"loading": "lädt...",
"available": "verfügbar, Commit-ID {commitId}",
"unavailable": "nicht verfügbar (ist die URL korrekt?)",
"description": "Das Projekt <code>vertd</code> ist ein Server-Wrapper für FFmpeg. Dies ermöglicht es dir, Videos bequem über die Weboberfläche von VERT zu konvertieren und dabei die Leistung deiner GPU für maximale Geschwindigkeit zu nutzen.",
"hosting_info": "Wir hosten eine öffentliche Instanz für deine Bequemlichkeit, aber es ist einfach, eine eigene auf deinem PC oder Server zu hosten, wenn du weißt, was du tust. Du kannst die Server-Binärdateien [vertd_link]hier[/vertd_link] herunterladen – der Einrichtungsprozess wird in Zukunft noch einfacher!",
"instance": "Instanz",
"url_placeholder": "Beispiel: http://localhost:24153",
"conversion_speed": "Konvertierungsgeschwindigkeit",
"speed_description": "Dies beschreibt den Kompromiss zwischen Geschwindigkeit und Qualität. Schnellere Einstellungen führen zu geringerer Qualität, erledigen die Aufgabe aber schneller.",
"speeds": {
"very_slow": "Sehr langsam",
"slower": "Langsamer",
"slow": "Langsam",
"medium": "Mittel",
"fast": "Schnell",
"ultra_fast": "Ultraschnell"
},
"auto_instance": "Automatisch (empfohlen)",
"eu_instance": "Falkenstein, Deutschland",
"us_instance": "Washington, USA",
"custom_instance": "Benutzerdefiniert"
},
"privacy": {
"title": "Datenschutz & Daten",
"plausible_title": "Plausible Analytics",
"plausible_description": "Wir verwenden [plausible_link]Plausible[/plausible_link], ein datenschutzorientiertes Analysetool, um vollständig anonyme Statistiken zu sammeln. Alle Daten werden anonymisiert und aggregiert; es werden niemals identifizierbare Informationen gesendet oder gespeichert. Du kannst die Analysen [analytics_link]hier[/analytics_link] einsehen und dich unten abmelden.",
"opt_in": "Einwilligen",
"opt_out": "Ablehnen",
"cache_title": "Cache-Verwaltung",
"cache_description": "Wir speichern die Konverter-Dateien in deinem Browser-Cache, damit du sie nicht jedes Mal neu herunterladen musst. Das verbessert die Leistung und spart Datenvolumen.",
"refresh_cache": "Cache aktualisieren",
"clear_cache": "Cache leeren",
"files_cached": "{size} ({count} Dateien)",
"loading_cache": "Lädt...",
"total_size": "Gesamtgröße",
"files_cached_label": "Gecachte Dateien",
"cache_cleared": "Cache erfolgreich geleert!",
"cache_clear_error": "Fehler beim Leeren des Caches.",
"site_data_title": "Seitendaten-Verwaltung",
"site_data_description": "Lösche alle Seitendaten einschließlich Einstellungen und gecachten Dateien, um VERT auf den Standardzustand zurückzusetzen und die Seite neu zu laden.",
"clear_all_data": "Alle Seitendaten löschen",
"clear_all_data_confirm_title": "Alle Seitendaten löschen?",
"clear_all_data_confirm": "Dies setzt alle Einstellungen und den Cache zurück und lädt die Seite neu. Diese Aktion kann nicht rückgängig gemacht werden.",
"clear_all_data_cancel": "Abbrechen",
"all_data_cleared": "Alle Daten gelöscht! Seite wird neu geladen...",
"all_data_clear_error": "Fehler beim Löschen der Seitendaten."
},
"language": {
"title": "Sprache",
"description": "Wähle deine bevorzugte Sprache für die VERT-Benutzeroberfläche."
}
},
"about": {
"title": "Über",
"why": {
"title": "Warum VERT?",
"description": "<b>Dateikonverter haben uns schon immer enttäuscht.</b> Sie sind hässlich, voller Werbung und vor allem langsam. Wir haben beschlossen, dieses Problem ein für alle Mal zu lösen, indem wir eine Alternative schaffen, die all diese Probleme und noch mehr behebt.<br/><br/>Alle Nicht-Videodateien werden vollständig auf deinem Gerät konvertiert; das bedeutet, es gibt keine Verzögerung beim Senden und Empfangen der Dateien von einem Server, und wir können niemals die von dir konvertierten Dateien einsehen.<br/><br/>Videodateien werden auf unseren blitzschnellen RTX 4000 Ada Server hochgeladen. Deine Videos bleiben dort für eine Stunde, wenn du sie nicht konvertierst. Wenn du die Datei konvertierst, bleibt das Video für eine Stunde auf dem Server oder bis es heruntergeladen wird. Anschließend wird die Datei von unserem Server gelöscht."
},
"sponsors": {
"title": "Sponsoren",
"description": "Möchtest du uns unterstützen? Kontaktiere einen Entwickler auf dem [discord_link]Discord[/discord_link]-Server oder sende eine E-Mail an",
"email_copied": "E-Mail in die Zwischenablage kopiert!"
},
"resources": {
"title": "Ressourcen",
"discord": "Discord",
"source": "Quellcode",
"email": "E-Mail"
},
"donate": {
"title": "An VERT spenden",
"description": "Mit deiner Unterstützung können wir VERT weiter pflegen und verbessern.",
"one_time": "Einmalig",
"monthly": "Monatlich",
"custom": "Benutzerdefiniert",
"pay_now": "Jetzt zahlen",
"donate_amount": "${amount} USD spenden",
"thank_you": "Vielen Dank für deine Spende!",
"payment_failed": "Zahlung fehlgeschlagen: {message}{period} Dir wurde nichts berechnet.",
"donation_error": "Bei der Verarbeitung deiner Spende ist ein Fehler aufgetreten. Bitte versuche es später erneut.",
"payment_error": "Fehler beim Abrufen der Zahlungsdetails. Bitte versuche es später erneut.",
"donation_notice_official": "Deine Spenden hier gehen an die offizielle VERT-Instanz (vert.sh) und helfen, die Entwicklung des Projekts zu unterstützen.",
"donation_notice_unofficial": "Deine Spenden hier gehen an den Betreiber dieser VERT-Instanz. Wenn du die offiziellen VERT-Entwickler unterstützen möchtest, besuche bitte [official_link]vert.sh[/official_link]."
},
"credits": {
"title": "Credits",
"contact_team": "Wenn du das Entwicklungsteam kontaktieren möchtest, verwende bitte die E-Mail-Adresse auf der Karte „Ressourcen“.",
"notable_contributors": "Nennenswerte Beiträge",
"notable_description": "Wir möchten diesen Personen für ihre wichtigen Beiträge zu VERT danken.",
"github_contributors": "GitHub-Mitwirkende",
"github_description": "Ein großes Dankeschön an alle für ihre Hilfe! [github_link]Möchtest du auch helfen?[/github_link]",
"no_contributors": "Scheint, als hätte noch niemand beigetragen... [contribute_link]Sei der Erste![/contribute_link]",
"libraries": "Bibliotheken",
"libraries_description": "Ein großes Dankeschön an FFmpeg (Audio, Video), ImageMagick (Bilder) und Pandoc (Dokumente) für die Pflege solch exzellenter Bibliotheken über so viele Jahre. VERT verlässt sich auf sie, um dir deine Konvertierungen zu ermöglichen.",
"roles": {
"lead_developer": "Lead Developer; Backend, UI-Implementierung",
"developer": "Developer; UI-Implementierung",
"designer": "Designer; UX, Branding, Marketing",
"docker_ci": "Docker & CI-Support",
"former_cofounder": "Ehemaliger Co-Founder & Designer"
}
},
"errors": {
"github_contributors": "Fehler beim Abrufen der GitHub-Mitwirkenden"
}
},
"workers": {
"errors": {
"general": "Fehler beim Konvertieren von {file}: {message}",
"cancel": "Fehler beim Abbrechen der Konvertierung für {file}: {message}",
"magick": "Fehler im Magick-Prozess, die Bildkonvertierung funktioniert möglicherweise nicht wie erwartet.",
"ffmpeg": "Fehler beim Laden von FFmpeg, einige Funktionen sind möglicherweise nicht verfügbar.",
"pandoc": "Fehler beim Laden von Pandoc, die Dokumentkonvertierung funktioniert möglicherweise nicht wie erwartet.",
"no_audio": "Kein Audiostream gefunden.",
"invalid_rate": "Ungültige Abtastrate angegeben: {rate}Hz",
"file_too_large": "Diese Datei überschreitet das Browser-/Gerätelimit von {limit}GB. Versuche es mit Firefox oder Safari, die typischerweise höhere Limits haben."
}
},
"privacy": {
"title": "Datenschutzerklärung",
"summary": {
"title": "Zusammenfassung",
"description": "Die Datenschutzrichtlinie von VERT ist sehr einfach: Wir sammeln oder speichern keinerlei Daten über dich. Wir verwenden keine Cookies oder Tracker, Analysen sind vollständig privat, und alle Konvertierungen (außer Videos) finden lokal in deinem Browser statt. Videos werden nach dem Herunterladen oder nach einer Stunde gelöscht, es sei denn, du gibst uns ausdrücklich die Erlaubnis zur Speicherung; dies wird nur zur Fehlerbehebung verwendet. VERT hostet selbst eine Coolify-Instanz für die Website und vertd (für Videokonvertierung) sowie eine Plausible-Instanz für vollständig anonyme und aggregierte Analysen. Wir nutzen Stripe zur Verarbeitung von Spenden, was einige Daten zur Betrugsprävention sammeln kann.<br/><br/>Beachte, dass dies möglicherweise nur für die offizielle VERT-Instanz unter [vert_link]vert.sh[/vert_link] gilt; Drittanbieter-Instanzen könnten deine Daten anders behandeln."
},
"conversions": {
"title": "Konvertierungen",
"description": "Die meisten Konvertierungen (Bilder, Dokumente, Audio) erfolgen vollständig lokal auf deinem Gerät unter Verwendung von WebAssembly-Versionen der entsprechenden Tools (z. B. ImageMagick, Pandoc, FFmpeg). Das bedeutet, dass deine Dateien dein Gerät nie verlassen und wir niemals Zugriff darauf haben.<br/><br/>Videokonvertierungen werden auf unseren Servern durchgeführt, da sie mehr Rechenleistung erfordern und im Browser noch nicht schnell genug durchgeführt werden können. Videos, die du mit VERT konvertierst, werden nach dem Herunterladen oder nach einer Stunde gelöscht, es sei denn, du gibst uns ausdrücklich die Erlaubnis, sie länger zu speichern, rein zu Fehlerbehebungszwecken."
},
"donations": {
"title": "Spenden",
"description": "Wir verwenden Stripe auf der [about_link]Über[/about_link]-Seite, um Spenden zu sammeln. Stripe kann bestimmte Informationen über die Zahlung und das Gerät zur Betrugsprävention sammeln, wie in [stripe_link]ihrer Dokumentation zur erweiterten Betrugserkennung[/stripe_link] beschrieben. Externe Netzwerkanfragen an Stripe werden verzögert und erst gestellt, wenn du auf den Button zum Bezahlen klickst."
},
"conversion_errors": {
"title": "Konvertierungsfehler",
"description": "Wenn eine Videokonvertierung fehlschlägt, sammeln wir möglicherweise einige anonyme Daten, um das Problem zu diagnostizieren. Diese Daten können beinhalten:",
"list_job_id": "Die Job-ID, welche der anonymisierte Dateiname ist",
"list_format_from": "Das Format, aus dem du konvertiert hast",
"list_format_to": "Das Format, in das du konvertiert hast",
"list_stderr": "Die FFmpeg stderr-Ausgabe deines Jobs (Fehlermeldung)",
"list_video": "Die eigentliche Videodatei (nur bei ausdrücklicher Erlaubnis)",
"footer": "Diese Informationen werden ausschließlich zur Diagnose von Konvertierungsproblemen verwendet. Die eigentliche Videodatei wird nur gesammelt, wenn du uns die Erlaubnis dazu gibst, und dann auch nur zur Fehlerbehebung verwendet."
},
"analytics": {
"title": "Analysen",
"description": "Wir hosten selbst eine Plausible-Instanz für vollständig anonyme und aggregierte Analysen. Plausible verwendet keine Cookies und entspricht allen wichtigen Datenschutzbestimmungen (DSGVO/CCPA/PECR). Du kannst dich im Abschnitt „Datenschutz & Daten“ in den [settings_link]Einstellungen[/settings_link] von den Analysen abmelden und [plausible_link]hier[/plausible_link] mehr über die Datenschutzpraktiken von Plausible lesen."
},
"local_storage": {
"title": "Lokaler Speicher",
"description": "Wir verwenden den lokalen Speicher (Local Storage) deines Browsers, um deine Einstellungen zu speichern, und den Sitzungsspeicher (Session Storage), um die Liste der GitHub-Mitwirkenden für den Bereich „Über“ vorübergehend zu speichern und wiederholte GitHub-API-Anfragen zu reduzieren. Es werden keine persönlichen Daten gespeichert oder übertragen.<br/><br/>Die WebAssembly-Versionen der von uns verwendeten Konvertierungstools (FFmpeg, ImageMagick, Pandoc) werden ebenfalls lokal in deinem Browser gespeichert, wenn du die Website zum ersten Mal besuchst, damit du sie nicht bei jedem Besuch erneut herunterladen musst. Es werden keine persönlichen Daten gespeichert oder übertragen. Du kannst diese Daten jederzeit im Abschnitt „Datenschutz & Daten“ in den [settings_link]Einstellungen[/settings_link] einsehen oder löschen."
},
"contact": {
"title": "Kontakt",
"description": "Für Fragen sende uns eine E-Mail an: [email_link]hello@vert.sh[/email_link]. Wenn du eine Drittanbieter-Instanz von VERT verwendest, kontaktiere bitte stattdessen den Hoster dieser Instanz."
},
"last_updated": "Zuletzt aktualisiert: 29.10.2025"
}
}
================================================
FILE: messages/el.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Μεταφόρτωση",
"convert": "Μετατροπή",
"settings": "Ρυθμίσεις",
"about": "Σχετικά",
"toggle_theme": "Εναλλαγή θέματος"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Κώδικας",
"discord_server": "Discord"
},
"upload": {
"title": "Ο μετατροπέας αρχείων που θα λατρέψετε.",
"subtitle": "Όλη η επεξεργασία εικόνων, ήχου και εγγράφων γίνεται στη συσκευή σας. Τα βίντεο μετατρέπονται στους κεραυνοβόλα γρήγορους διακομιστές μας. Χωρίς όριο μεγέθους αρχείου, χωρίς διαφημίσεις και εντελώς ανοιχτού κώδικα.",
"uploader": {
"text": "Σύρετε ή κάντε κλικ για {action}",
"convert": "μετατροπή"
},
"cards": {
"title": "Το VERT υποστηρίζει...",
"images": "Εικόνες",
"audio": "Ήχο",
"documents": "Έγγραφα",
"video": "Βίντεο",
"video_server_processing": "Υποστηρίζεται από σέρβερ",
"local_supported": "Τοπική υποστήριξη",
"status": {
"text": "<b>Κατάσταση:</b> {status}",
"ready": "έτοιμο",
"not_ready": "μη έτοιμο",
"not_initialized": "μη αρχικοποιημένο",
"downloading": "λήψη...",
"initializing": "αρχικοποίηση...",
"unknown": "άγνωστη κατάσταση"
},
"supported_formats": "Υποστηριζόμενες μορφές:"
},
"tooltip": {
"partial_support": "Αυτή η μορφή μπορεί να μετατραπεί μόνο ως {direction}.",
"direction_input": "είσοδος (από)",
"direction_output": "έξοδος (προς)",
"video_server_processing": "Τα βίντεο μεταφορτώνονται σε σέρβερ για επεξεργασία από προεπιλογή, μάθετε πώς να το ρυθμίσετε τοπικά εδώ."
}
},
"convert": {
"external_warning": {
"title": "Προειδοποίηση εξωτερικού σέρβερ",
"text": "Εάν επιλέξετε να μετατρέψετε σε μορφή βίντεο, αυτά τα αρχεία θα μεταφορτωθούν σε εξωτερικό σέρβερ για μετατροπή. Θέλετε να συνεχίσετε;",
"yes": "Ναι",
"no": "Όχι"
},
"panel": {
"convert_all": "Μετατροπή όλων",
"download_all": "Λήψη όλων ως .zip",
"remove_all": "Αφαίρεση όλων των αρχείων",
"set_all_to": "Ορισμός όλων σε",
"na": "Μ/Δ"
},
"dropdown": {
"audio": "Ήχος",
"video": "Βίντεο",
"doc": "Έγγραφο",
"image": "Εικόνα",
"placeholder": "Αναζήτηση μορφής"
},
"tooltips": {
"unknown_file": "Άγνωστος τύπος αρχείου",
"audio_file": "Αρχείο ήχου",
"video_file": "Αρχείο βίντεο",
"document_file": "Αρχείο εγγράφου",
"image_file": "Αρχείο εικόνας",
"convert_file": "Μετατροπή αυτού του αρχείου",
"download_file": "Λήψη αυτού του αρχείου"
},
"errors": {
"cant_convert": "Δεν μπορούμε να μετατρέψουμε αυτό το αρχείο.",
"vertd_server": "τι κάνεις...; υποτίθεται ότι πρέπει να εκτελέσεις τον σέρβερ vertd!",
"vertd_generic_body": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια μετατροπής του βίντεό σας. Θέλετε να υποβάλετε αυτό το βίντεο στους προγραμματιστές για να βοηθήσετε στη διόρθωση αυτού του σφάλματος; Θα αποσταλεί μόνο το αρχείο βίντεό σας. Δεν θα μεταφορτωθούν αναγνωριστικά.",
"vertd_generic_title": "Σφάλμα μετατροπής βίντεο",
"vertd_generic_yes": "Υποβολή βίντεο",
"vertd_generic_no": "Μην υποβάλετε",
"vertd_failed_to_keep": "Αποτυχία διατήρησης του βίντεο στον σέρβερ: {error}",
"unsupported_format": "Υποστηρίζονται μόνο αρχεία εικόνας, βίντεο, ήχου και εγγράφων",
"vertd_not_found": "Δεν ήταν δυνατή η εύρεση της παρουσίας vertd για την έναρξη της μετατροπής βίντεο. Είστε βέβαιοι ότι η διεύθυνση URL έχει ρυθμιστεί σωστά;",
"worker_downloading": "Ο μετατροπέας {type} αρχικοποιείται αυτή τη στιγμή, παρακαλώ περιμένετε λίγο.",
"worker_error": "Ο μετατροπέας {type} αντιμετώπισε σφάλμα κατά την αρχικοποίηση, παρακαλώ δοκιμάστε ξανά αργότερα.",
"worker_timeout": "Ο μετατροπέας {type} χρειάζεται περισσότερο χρόνο από το αναμενόμενο για να αρχικοποιηθεί, παρακαλώ περιμένετε λίγο ακόμη ή ανανεώστε τη σελίδα.",
"audio": "ήχου",
"doc": "εγγράφου",
"image": "εικόνας"
}
},
"settings": {
"title": "Ρυθμίσεις",
"errors": {
"save_failed": "Αποτυχία αποθήκευσης ρυθμίσεων!"
},
"appearance": {
"title": "Εμφάνιση",
"brightness_theme": "Θέμα φωτεινότητας",
"brightness_description": "Θέλετε μια ηλιόλουστη λάμψη ή μια ήσυχη μοναχική νύχτα;",
"light": "Φωτεινό",
"dark": "Σκούρο",
"effect_settings": "Ρυθμίσεις εφέ",
"effect_description": "Θα θέλατε φανταχτερά εφέ ή μια πιο στατική εμπειρία;",
"enable": "Ενεργοποίηση",
"disable": "Απενεργοποίηση"
},
"conversion": {
"title": "Μετατροπή",
"advanced_settings": "Προηγμένες ρυθμίσεις",
"filename_format": "Μορφή ονόματος αρχείου",
"filename_description": "Αυτό θα καθορίσει το όνομα του αρχείου κατά τη λήψη, <b>χωρίς να περιλαμβάνει την επέκταση αρχείου.</b> Μπορείτε να τοποθετήσετε τα ακόλουθα πρότυπα στη μορφή, τα οποία θα αντικατασταθούν με τις σχετικές πληροφορίες: <b>%name%</b> για το αρχικό όνομα αρχείου, <b>%extension%</b> για την αρχική επέκταση αρχείου και <b>%date%</b> για μια συμβολοσειρά ημερομηνίας του πότε μετατράπηκε το αρχείο.",
"placeholder": "VERT_%name%",
"default_format": "Προεπιλεγμένη μορφή μετατροπής",
"default_format_description": "Αυτό θα αλλάξει την προεπιλεγμένη μορφή που επιλέγεται όταν ανεβάζετε ένα αρχείο αυτού του τύπου.",
"default_format_image": "Εικόνες",
"default_format_video": "Βίντεο",
"default_format_audio": "Ήχος",
"default_format_document": "Έγγραφα",
"metadata": "Μεταδεδομένα αρχείου",
"metadata_description": "Αυτό αλλάζει το αν τυχόν μεταδεδομένα (EXIF, πληροφορίες τραγουδιού κ.λπ.) στο αρχικό αρχείο διατηρούνται στα μετατρεπόμενα αρχεία.",
"keep": "Διατήρηση",
"remove": "Αφαίρεση",
"quality": "Ποιότητα μετατροπής",
"quality_description": "Αυτό αλλάζει την προεπιλεγμένη ποιότητα εξόδου των μετατρεπόμενων αρχείων (στην κατηγορία του). Υψηλότερες τιμές μπορεί να οδηγήσουν σε μεγαλύτερους χρόνους μετατροπής και μέγεθος αρχείου.",
"quality_video": "Αυτό αλλάζει την προεπιλεγμένη ποιότητα εξόδου των μετατρεπόμενων αρχείων βίντεο. Υψηλότερες τιμές μπορεί να οδηγήσουν σε μεγαλύτερους χρόνους μετατροπής και μέγεθος αρχείου.",
"quality_audio": "Ήχος (kbps)",
"quality_images": "Εικόνα (%)",
"rate": "Ρυθμός δειγματοληψίας (Hz)"
},
"vertd": {
"title": "Μετατροπή βίντεο",
"status": "κατάσταση:",
"loading": "φόρτωση...",
"available": "διαθέσιμο, αναγνωριστικό έκδοσης {commitId}",
"unavailable": "μη διαθέσιμο (είναι σωστή η διεύθυνση url;)",
"description": "Το έργο <code>vertd</code> είναι ένα περιτύλιγμα σέρβερ για το FFmpeg. Αυτό σας επιτρέπει να μετατρέπετε βίντεο μέσω της ευκολίας της διεπαφής ιστού του VERT, ενώ εξακολουθείτε να μπορείτε να αξιοποιήσετε τη δύναμη της GPU σας για να το κάνετε όσο το δυνατόν πιο γρήγορα.",
"hosting_info": "Φιλοξενούμε μια δημόσια σελίδα για τη διευκόλυνσή σας, αλλά είναι αρκετά εύκολο να φιλοξενήσετε τη δική σας στον υπολογιστή ή τον σέρβερ σας αν γνωρίζετε τι κάνετε. Μπορείτε να κατεβάσετε τα δυαδικά αρχεία του σέρβερ [vertd_link]εδώ[/vertd_link] - η διαδικασία ρύθμισης θα γίνει ευκολότερη στο μέλλον, οπότε μείνετε συντονισμένοι!",
"instance": "Παρουσία",
"url_placeholder": "Παράδειγμα: http://localhost:24153",
"conversion_speed": "Ταχύτητα μετατροπής",
"speed_description": "Αυτό περιγράφει τον συμβιβασμό μεταξύ ταχύτητας και ποιότητας. Ταχύτερες ταχύτητες θα έχουν ως αποτέλεσμα χαμηλότερη ποιότητα, αλλά θα ολοκληρώσουν τη δουλειά γρηγορότερα.",
"speeds": {
"very_slow": "Πολύ αργή",
"slower": "Αργότερη",
"slow": "Αργή",
"medium": "Μέτρια",
"fast": "Γρήγορη",
"ultra_fast": "Πολύ γρήγορη"
},
"auto_instance": "Αυτόματη (συνιστάται)",
"eu_instance": "Falkenstein, Γερμανία",
"us_instance": "Washington, ΗΠΑ",
"custom_instance": "Προσαρμοσμένη"
},
"privacy": {
"title": "Απόρρητο & δεδομένα",
"plausible_title": "Αναλυτικά στοιχεία Plausible",
"plausible_description": "Χρησιμοποιούμε το [plausible_link]Plausible[/plausible_link], ένα εργαλείο αναλυτικών που εστιάζει στο απόρρητο, για τη συλλογή εντελώς ανώνυμων στατιστικών. Όλα τα δεδομένα είναι ανωνυμοποιημένα και συγκεντρωτικά και δεν αποστέλλονται ούτε αποθηκεύονται ποτέ αναγνωρίσιμες πληροφορίες. Μπορείτε να δείτε τα αναλυτικά στοιχεία [analytics_link]εδώ[/analytics_link] και να επιλέξετε να εξαιρεθείτε παρακάτω.",
"opt_in": "Συμμετοχή",
"opt_out": "Εξαίρεση",
"cache_title": "Διαχείριση προσωρινής μνήμης",
"cache_description": "Αποθηκεύουμε προσωρινά τα αρχεία μετατροπέα στο πρόγραμμα περιήγησής σας, ώστε να μην χρειάζεται να τα κατεβάζετε ξανά κάθε φορά, βελτιώνοντας την απόδοση και μειώνοντας τη χρήση δεδομένων.",
"refresh_cache": "Ανανέωση προσωρινής μνήμης",
"clear_cache": "Εκκαθάριση προσωρινής μνήμης",
"files_cached": "{size} ({count} αρχεία)",
"loading_cache": "Φόρτωση...",
"total_size": "Συνολικό μέγεθος",
"files_cached_label": "Αρχεία σε προσωρινή μνήμη",
"cache_cleared": "Η προσωρινή μνήμη εκκαθαρίστηκε επιτυχώς!",
"cache_clear_error": "Αποτυχία εκκαθάρισης προσωρινής μνήμης."
},
"language": {
"title": "Γλώσσα",
"description": "Επιλέξτε την προτιμώμενη γλώσσα σας για το περιβάλλον του VERT."
}
},
"about": {
"title": "Σχετικά",
"why": {
"title": "Γιατί το VERT;",
"description": "<b>Οι μετατροπείς αρχείων μας απογοήτευαν πάντα.</b> Είναι άσχημοι, γεμάτοι διαφημίσεις και το πιο σημαντικό· αργοί. Αποφασίσαμε να λύσουμε αυτό το πρόβλημα μια για πάντα δημιουργώντας μια εναλλακτική που λύνει όλα αυτά τα προβλήματα και περισσότερα.<br/><br/>Όλα τα αρχεία που δεν είναι βίντεο μετατρέπονται εντελώς στη συσκευή σας· αυτό σημαίνει ότι δεν υπάρχει καθυστέρηση μεταξύ της αποστολής και της λήψης των αρχείων από έναν σέρβερ και δεν αποκτούμε ποτέ πρόσβαση στα αρχεία που μετατρέπετε.<br/><br/>Τα αρχεία βίντεο μεταφορτώνονται στον αστραπιαία γρήγορο σέρβερ μας RTX 4000 Ada. Τα βίντεό σας παραμένουν εκεί για μία ώρα εάν δεν τα μετατρέψετε. Εάν μετατρέψετε το αρχείο, το βίντεο θα παραμείνει στον σέρβερ για μία ώρα ή μέχρι να ληφθεί. Στη συνέχεια, το αρχείο θα διαγραφεί από τον σέρβερ μας."
},
"sponsors": {
"title": "Χορηγοί",
"description": "Θέλετε να μας υποστηρίξετε; Επικοινωνήστε με έναν προγραμματιστή στον σέρβερ [discord_link]Discord[/discord_link] ή στείλτε email στη διεύθυνση",
"email_copied": "Το email αντιγράφηκε στο πρόχειρο!"
},
"resources": {
"title": "Πόροι",
"discord": "Discord",
"source": "Πηγαίος κώδικας",
"email": "Email"
},
"donate": {
"title": "Δωρεά στο VERT",
"description": "Με την υποστήριξή σας, μπορούμε να συνεχίσουμε να συντηρούμε και να βελτιώνουμε το VERT.",
"one_time": "Εφάπαξ",
"monthly": "Μηνιαία",
"custom": "Προσαρμοσμένη",
"pay_now": "Πληρωμή τώρα",
"donate_amount": "Δωρεά ${amount} USD",
"thank_you": "Σας ευχαριστούμε για τη δωρεά σας!",
"payment_failed": "Η πληρωμή απέτυχε: {message}{period} Δεν χρεώθηκε ο λογαριασμός σας.",
"donation_error": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία της δωρεάς σας. Παρακαλώ δοκιμάστε ξανά αργότερα.",
"payment_error": "Σφάλμα κατά την ανάκτηση στοιχείων πληρωμής. Παρακαλώ δοκιμάστε ξανά αργότερα."
},
"credits": {
"title": "Τίτλοι",
"contact_team": "Εάν θέλετε να επικοινωνήσετε με την ομάδα ανάπτυξης, χρησιμοποιήστε το email που βρίσκεται στην κάρτα «Πόροι».",
"notable_contributors": "Αξιόλογοι συνεισφέροντες",
"notable_description": "Θα θέλαμε να ευχαριστήσουμε αυτά τα άτομα για τις σημαντικές συνεισφορές τους στο VERT.",
"github_contributors": "Συνεισφέροντες στο GitHub",
"github_description": "Μεγάλες ευχαριστίες σε όλα αυτά τα άτομα που βοήθησαν! [github_link]Θέλετε να βοηθήσετε κι εσείς;[/github_link]",
"no_contributors": "Φαίνεται ότι κανείς δεν έχει συνεισφέρει ακόμα... [contribute_link]γίνετε ο πρώτος που θα συνεισφέρει![/contribute_link]",
"libraries": "Βιβλιοθήκες",
"libraries_description": "Μεγάλες ευχαριστίες στα FFmpeg (ήχος, βίντεο), ImageMagick (εικόνες) και Pandoc (έγγραφα) που διατηρούν τέτοιες εξαιρετικές βιβλιοθήκες για τόσα χρόνια. Το VERT βασίζεται σε αυτές για να σας παρέχει τις μετατροπές σας.",
"roles": {
"lead_developer": "Επικεφαλής προγραμματιστής· backend μετατροπής, υλοποίηση UI",
"developer": "Προγραμματιστής· υλοποίηση UI",
"designer": "Σχεδιαστής· UX, branding, μάρκετινγκ",
"docker_ci": "Συντήρηση υποστήριξης Docker & CI",
"former_cofounder": "Πρώην συνιδρυτής & σχεδιαστής"
}
},
"errors": {
"github_contributors": "Σφάλμα κατά την ανάκτηση συνεισφερόντων του GitHub"
}
},
"workers": {
"errors": {
"general": "Σφάλμα κατά τη μετατροπή του {file}: {message}",
"cancel": "Σφάλμα κατά την ακύρωση της μετατροπής για το {file}: {message}",
"magick": "Σφάλμα στο worker του Magick, η μετατροπή εικόνων μπορεί να μην λειτουργεί όπως αναμένεται.",
"ffmpeg": "Σφάλμα κατά τη φόρτωση του ffmpeg, ορισμένες λειτουργίες μπορεί να μην λειτουργούν.",
"no_audio": "Δεν βρέθηκε ροή ήχου.",
"invalid_rate": "Καθορίστηκε μη έγκυρος ρυθμός δειγματοληψίας: {rate}Hz"
}
}
}
================================================
FILE: messages/en.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Upload",
"convert": "Convert",
"settings": "Settings",
"about": "About",
"toggle_theme": "Toggle theme"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Source code",
"discord_server": "Discord server",
"privacy_policy": "Privacy policy"
},
"upload": {
"title": "The file converter you'll love.",
"subtitle": "All image, audio, and document processing is done on your device. Videos are converted on our lightning-fast servers. No file size limit, no ads, and completely open source.",
"uploader": {
"text": "Drop or click to {action}",
"convert": "convert"
},
"cards": {
"title": "VERT supports...",
"images": "Images",
"audio": "Audio",
"documents": "Documents",
"video": "Video",
"video_server_processing": "Server supported",
"local_supported": "Local supported",
"status": {
"text": "<b>Status:</b> {status}",
"ready": "ready",
"not_ready": "not ready",
"not_initialized": "not initialized",
"downloading": "downloading...",
"initializing": "initializing...",
"unknown": "unknown status"
},
"supported_formats": "Supported formats:"
},
"tooltip": {
"partial_support": "This format can only be converted as {direction}.",
"direction_input": "input (from)",
"direction_output": "output (to)",
"video_server_processing": "Video uploads to a server for processing by default, learn how to set it up locally here."
}
},
"convert": {
"archive_file": {
"extract": "Extract archive",
"extracting": "Detected archive: {filename}",
"extracted": "Extracted {extract_count} files from {filename}. {ignore_count} items were ignored.",
"detected": "Detected {type} files in {filename}.",
"audio": "audio",
"video": "video",
"doc": "document",
"image": "image",
"extract_error": "Error extracting {filename}: {error}"
},
"large_file_warning": "Due to browser / device limitations, video to audio conversion is disabled for this file as it is larger than {limit}GB. We recommend using Firefox or Safari for files of this size since they have less limitations.",
"external_warning": {
"title": "External server warning",
"text": "If you choose to convert into a video format, those files will be uploaded to an external server to be converted. Do you want to continue?",
"yes": "Yes",
"no": "No"
},
"panel": {
"convert_all": "Convert all",
"download_all": "Download all as .zip",
"remove_all": "Remove all files",
"set_all_to": "Set all to",
"na": "N/A"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Document",
"image": "Image",
"placeholder": "Search format",
"no_formats": "No formats available",
"no_results": "No formats match your search"
},
"tooltips": {
"unknown_file": "Unknown file type",
"audio_file": "Audio file",
"video_file": "Video file",
"document_file": "Document file",
"image_file": "Image file",
"convert_file": "Convert this file",
"download_file": "Download this file"
},
"errors": {
"cant_convert": "We can't convert this file.",
"vertd_server": "what are you doing..? you're supposed to run the vertd server!",
"vertd_generic_view": "View error details",
"vertd_generic_body": "An error occurred whilst whilst trying convert your video. Would you like to submit this video to the developers to help fix this bug? Only your video file will be sent. No identifiers will be uploaded.",
"vertd_generic_title": "Video conversion error",
"vertd_generic_yes": "Submit video",
"vertd_generic_no": "Don't submit",
"vertd_failed_to_keep": "Failed to keep the video on the server: {error}",
"vertd_details": "View error details",
"vertd_details_body": "If you press submit, <b>your video will also be attached</b> alongside the error log which is always reported to us for review. The following information is the log that we automatically receive:",
"vertd_details_footer": "This information will only be used for troubleshooting purposes and will never be shared. View our [privacy_link]privacy policy[/privacy_link] for more details.",
"vertd_details_job_id": "<b>Job ID:</b> {jobId}",
"vertd_details_from": "<b>From format:</b> {from}",
"vertd_details_to": "<b>To format:</b> {to}",
"vertd_details_error_message": "<b>Error message:</b> [view_link]View error logs[/view_link]",
"vertd_details_close": "Close",
"vertd_ratelimit": "Your video, '{filename}', has failed to convert a few times. To prevent server overload, further conversion attempts for this file have been temporarily blocked. Please try again later.",
"unsupported_format": "Only image, video, audio, and document files are supported",
"format_output_only": "This format can currently only be used as output (converted to), not as input.",
"vertd_not_found": "Could not find the vertd instance to start video conversion. Are you sure the instance URL is set correctly?",
"worker_downloading": "The {type} converter is currently being initialized, please wait a few moments.",
"worker_error": "The {type} converter had an error during initialization, please try again later.",
"worker_timeout": "The {type} converter is taking longer than expected to initialize, please wait a few more moments or refresh the page.",
"audio": "audio",
"doc": "document",
"image": "image"
}
},
"settings": {
"title": "Settings",
"errors": {
"save_failed": "Failed to save settings!"
},
"appearance": {
"title": "Appearance",
"brightness_theme": "Brightness theme",
"brightness_description": "Want a sunny flash-bang, or a quiet lonely night?",
"light": "Light",
"dark": "Dark",
"effect_settings": "Effect settings",
"effect_description": "Would you like fancy effects, or a more static experience?",
"enable": "Enable",
"disable": "Disable"
},
"conversion": {
"title": "Conversion",
"advanced_settings": "Advanced settings",
"filename_format": "File name format",
"filename_description": "This will determine the name of the file on download, <b>not including the file extension.</b> You can put these following templates in the format, which will be replaced with the relevant information: <b>%name%</b> for the original file name, <b>%extension%</b> for the original file extension, and <b>%date%</b> for a date string of when the file was converted.",
"placeholder": "VERT_%name%",
"default_format": "Default conversion format",
"default_format_enable": "Enable",
"default_format_disable": "Disable",
"default_format_description": "This will change the default format selected when you upload a file of this file type.",
"default_format_image": "Images",
"default_format_video": "Videos",
"default_format_audio": "Audio",
"default_format_document": "Documents",
"metadata": "File metadata",
"metadata_description": "This changes whether any metadata (EXIF, song info, etc.) on the original file is preserved in converted files.",
"keep": "Keep",
"remove": "Remove",
"quality": "Conversion quality",
"quality_description": "This changes the default output quality of the converted files (in its category). Higher values may result in longer conversion times and file size.",
"quality_video": "This changes the default output quality of the converted video files. Higher values may result in longer conversion times and file size.",
"quality_audio": "Audio (kbps)",
"quality_images": "Image (%)",
"rate": "Sample rate (Hz)"
},
"vertd": {
"title": "Video conversion",
"status": "status:",
"loading": "loading...",
"available": "available, commit id {commitId}",
"unavailable": "unavailable (is the url right?)",
"description": "The <code>vertd</code> project is a server wrapper for FFmpeg. This allows you to convert videos through the convenience of VERT's web interface, while still being able to harness the power of your GPU to do it as quickly as possible.",
"hosting_info": "We host a public instance for your convenience, but it is quite easy to host your own on your PC or server if you know what you are doing. You can download the server binaries [vertd_link]here[/vertd_link] - the process of setting this up will become easier in the future, so stay tuned!",
"instance": "Instance",
"url_placeholder": "Example: http://localhost:24153",
"conversion_speed": "Conversion speed",
"speed_description": "This describes the tradeoff between speed and quality. Faster speeds will result in lower quality, but will get the job done quicker.",
"speeds": {
"very_slow": "Very Slow",
"slower": "Slower",
"slow": "Slow",
"medium": "Medium",
"fast": "Fast",
"ultra_fast": "Ultra Fast"
},
"auto_instance": "Auto (recommended)",
"eu_instance": "Falkenstein, Germany",
"us_instance": "Washington, USA",
"custom_instance": "Custom"
},
"privacy": {
"title": "Privacy & data",
"plausible_title": "Plausible analytics",
"plausible_description": "We use [plausible_link]Plausible[/plausible_link], a privacy-focused analytics tool, to gather completely anonymous statistics. All data is anonymized and aggregated, and no identifiable information is ever sent or stored. You can view the analytics [analytics_link]here[/analytics_link] and choose to opt out below.",
"opt_in": "Opt-in",
"opt_out": "Opt-out",
"cache_title": "Cache management",
"cache_description": "We cache the converter files on your browser so you don't have to re-download them every time, improving performance and reducing data usage.",
"refresh_cache": "Refresh cache",
"clear_cache": "Clear cache",
"files_cached": "{size} ({count} files)",
"loading_cache": "Loading...",
"total_size": "Total Size",
"files_cached_label": "Files Cached",
"cache_cleared": "Cache cleared successfully!",
"cache_clear_error": "Failed to clear cache.",
"site_data_title": "Site data management",
"site_data_description": "Clear all site data including settings and cached files, resetting VERT to its default state and reloading the page.",
"clear_all_data": "Clear all site data",
"clear_all_data_confirm_title": "Clear all site data?",
"clear_all_data_confirm": "This will reset all settings & cache, then reload the page. This action cannot be undone.",
"clear_all_data_cancel": "Cancel",
"all_data_cleared": "All site data cleared! Reloading page...",
"all_data_clear_error": "Failed to clear all site data."
},
"language": {
"title": "Language",
"description": "Select your preferred language for the VERT interface."
}
},
"about": {
"title": "About",
"why": {
"title": "Why VERT?",
"description": "<b>File converters have always disappointed us.</b> They're ugly, riddled with ads, and most importantly; slow. We decided to solve this problem once and for all by making an alternative that solves all those problems, and more.<br/><br/>All non-video files are converted completely on-device; this means that there's no delay between sending and receiving the files from a server, and we never get to snoop on the files you convert.<br/><br/>Video files get uploaded to our lightning-fast RTX 4000 Ada server. Your videos stay on there for an hour if you do not convert them. If you do convert the file, the video will stay on the server for an hour, or until it is downloaded. The file will then be deleted from our server."
},
"sponsors": {
"title": "Sponsors",
"description": "Want to support us? Contact a developer in the [discord_link]Discord[/discord_link] server, or send an email to",
"email_copied": "Email copied to clipboard!"
},
"resources": {
"title": "Resources",
"discord": "Discord",
"source": "Source",
"email": "Email"
},
"donate": {
"title": "Donate to VERT",
"description": "With your support, we can keep maintaining and improving VERT.",
"one_time": "One-time",
"monthly": "Monthly",
"custom": "Custom",
"pay_now": "Pay now",
"donate_amount": "Donate ${amount} USD",
"thank_you": "Thank you for your donation!",
"payment_failed": "Payment failed: {message}{period} You have not been charged.",
"donation_error": "An error occurred while processing your donation. Please try again later.",
"payment_error": "Error fetching payment details. Please try again later.",
"donation_notice_official": "Your donations here go to the official VERT instance (vert.sh), and helps to support the development of the project.",
"donation_notice_unofficial": "Your donations here go to the operator of this VERT instance. If you wish to support the official VERT developers, please visit [official_link]vert.sh[/official_link] instead."
},
"credits": {
"title": "Credits",
"contact_team": "If you would like to contact the development team, please use the email found on the \"Resources\" card.",
"notable_contributors": "Notable contributors",
"notable_description": "We'd like to thank these people for their major contributions to VERT.",
"github_contributors": "GitHub contributors",
"github_description": "Big thanks to all these people for helping out! [github_link]Want to help too?[/github_link]",
"no_contributors": "Seems like no one has contributed yet... [contribute_link]be the first to contribute![/contribute_link]",
"libraries": "Libraries",
"libraries_description": "A big thanks to FFmpeg (audio, video), ImageMagick (images) and Pandoc (documents) for maintaining such excellent libraries for so many years. VERT relies on them to provide you with your conversions.",
"roles": {
"lead_developer": "Lead developer; conversion backend, UI implementation",
"developer": "Developer; UI implementation",
"designer": "Designer; UX, branding, marketing",
"docker_ci": "Maintaining Docker & CI support",
"former_cofounder": "Former co-founder & designer"
}
},
"errors": {
"github_contributors": "Error fetching GitHub contributors"
}
},
"workers": {
"errors": {
"general": "Error converting {file}: {message}",
"cancel": "Error canceling conversion for {file}: {message}",
"magick": "Error in Magick worker, image conversion may not work as expected.",
"ffmpeg": "Error loading FFmpeg, some features may not work as expected.",
"pandoc": "Error loading Pandoc worker, document conversion may not work as expected.",
"no_audio": "No audio stream found.",
"invalid_rate": "Invalid sample rate specified: {rate}Hz",
"file_too_large": "This file exceeds the {limit}GB browser / device limit. Try Firefox or Safari to convert this large file, which typically have higher limits."
}
},
"privacy": {
"title": "Privacy Policy",
"summary": {
"title": "Summary",
"description": "VERT's privacy policy is very simple: we do not collect or store any data on you at all. We don't use cookies or trackers, analytics are completely private, and all conversions (except videos) happen locally on your browser. Videos are deleted after being downloaded, or an hour, unless explicitly given permission by you to be stored; it will only be used for the purpose of troubleshooting. VERT self-hosts a Coolify instance for hosting the website and vertd (for video conversion), and a Plausible instance for completely anonymous and aggregated analytics. We use Stripe to process donations, which may collect some data used for fraud prevention.<br/><br/>Note this may only apply to the official VERT instance at [vert_link]vert.sh[/vert_link]; third-party instances may handle your data differently."
},
"conversions": {
"title": "Conversions",
"description": "Most conversions (images, documents, audio) happen entirely locally on your device using WebAssembly versions of the relevant tools (e.g. ImageMagick, Pandoc, FFmpeg). This means your files never leave your device and we will never have access to them.<br/><br/>Video conversions are performed on our servers because they require more processing power and cannot be done very quickly on the browser yet. Videos you convert with VERT are deleted after being downloaded, or after one hour, unless you explicitly give permission for us to store them longer purely for troubleshooting purposes."
},
"donations": {
"title": "Donations",
"description": "We use Stripe on the [about_link]about[/about_link] page to collect donations. Stripe may collect certain information about the payment and device for fraud prevention as described in [stripe_link]their documentation on advanced fraud detection[/stripe_link]. External network requests to Stripe are deferred, and are only made after you click the button to pay."
},
"conversion_errors": {
"title": "Conversion Errors",
"description": "When a video conversion fails, we may collect some anonymous data to help us diagnose the issue. This data may include:",
"list_job_id": "The job ID, which is the anonymized file name",
"list_format_from": "The format you converted from",
"list_format_to": "The format you converted to",
"list_stderr": "The FFmpeg stderr output of your job (error message)",
"list_video": "The actual video file (if given explicit permission)",
"footer": "This information is used solely for the purpose of diagnosing conversion issues. The actual video file will only ever be collected if you give us permission to do so, where it will only be used for troubleshooting."
},
"analytics": {
"title": "Analytics",
"description": "We self-host a Plausible instance for completely anonymous and aggregated analytics. Plausible does not use cookies and complies with all major privacy regulations (GDPR/CCPA/PECR). You can opt out of analytics in the \"Privacy & data\" section in [settings_link]settings[/settings_link] and read more about Plausible's privacy practices [plausible_link]here[/plausible_link]."
},
"local_storage": {
"title": "Local Storage",
"description": "We use your browser's local storage to save your settings, and your browser's session storage to temporarily store the GitHub contributors list for the \"About\" section to reduce repeated GitHub API requests. No personal data is stored or transmitted.<br/><br/>The WebAssembly versions of the conversion tools we use (FFmpeg, ImageMagick, Pandoc) are also stored locally on your browser when you first visit the website, so you don't need to redownload them each visit. No personal data is stored or transmitted. You may view or delete this data at any time in the \"Privacy & data\" section in [settings_link]settings[/settings_link]."
},
"contact": {
"title": "Contact",
"description": "For questions, email us at: [email_link]hello@vert.sh[/email_link]. If you are using a third-party instance of VERT, please contact the hoster of that instance instead."
},
"last_updated": "Last updated: 2025-10-29"
},
"toast": {
"insecure_context": "You are visiting VERT in an insecure context (e.g. accessing over HTTP instead of HTTPS). Some features may not work as expected."
}
}
================================================
FILE: messages/es.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Subir",
"convert": "Convertir",
"settings": "Ajustes",
"about": "Acerca de",
"toggle_theme": "Cambiar tema"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Código fuente",
"discord_server": "Servidor de Discord"
},
"upload": {
"title": "El convertidor de archivos que te encantará.",
"subtitle": "Todo el procesamiento de imágenes, audio y documentos es hecho en tu dispositivo. Los vídeos son convertidos en nuestros servidores ultra rápidos. Sin límite de tamaño de archivo, sin anuncios y de código abierto.",
"uploader": {
"text": "Arrastra o haz clic para {action}",
"convert": "convertir"
},
"cards": {
"title": "VERT soporta...",
"images": "Imágenes",
"audio": "Audio",
"documents": "Documentos",
"video": "Vídeo",
"video_server_processing": "Soportado por el servidor",
"local_supported": "Soportado localmente",
"status": {
"text": "<b>Estado:</b> {status}",
"ready": "listo",
"not_ready": "no listo",
"not_initialized": "no inicializado",
"downloading": "descargando...",
"initializing": "inicializando...",
"unknown": "estado desconocido"
},
"supported_formats": "Formatos soportados:"
},
"tooltip": {
"partial_support": "Este formato solo se puede convertir a {direction}.",
"direction_input": "entrada (desde)",
"direction_output": "salida (hacia)",
"video_server_processing": "Por defecto, los vídeos se suben a un servidor para ser procesados. Aprende cómo instalarlo localmente aquí."
}
},
"convert": {
"external_warning": {
"title": "Advertencia del servidor externo",
"text": "Si eliges convertir a un formato de video, esos archivos se cargarán en un servidor externo para convertirlos. ¿Quieres continuar?",
"yes": "Sí",
"no": "No"
},
"panel": {
"convert_all": "Convertir todo",
"download_all": "Comprimir todo",
"remove_all": "Quitar todos los archivos",
"set_all_to": "Cambiar todos a",
"na": "N/A"
},
"dropdown": {
"audio": "Audio",
"video": "Vídeo",
"doc": "Documento",
"image": "Imagen",
"placeholder": "Buscar formato"
},
"tooltips": {
"unknown_file": "Formato de archivo desconocido",
"audio_file": "Audio",
"video_file": "Vídeo",
"document_file": "Documento",
"image_file": "Imagen",
"convert_file": "Convertir este archivo",
"download_file": "Descargar este archivo"
},
"errors": {
"cant_convert": "No podemos convertir este archivo.",
"vertd_server": "¿Qué estás haciendo..? ¡Debes ejecutar el servidor de vertd!",
"unsupported_format": "Solo aceptamos imágenes, vídeos, audios y documentos.",
"vertd_not_found": "No se encontró la instancia de vertd para iniciar la conversión de vídeos. ¿Estás seguro de que la URL es correcta?",
"worker_downloading": "El convertidor {type} se está inicializando actualmente, espere unos momentos.",
"worker_error": "El convertidor {type} tuvo un error durante la inicialización, inténtelo nuevamente más tarde.",
"worker_timeout": "El convertidor {type} está tardando más de lo esperado en inicializarse. Espere unos momentos más o actualice la página.",
"audio": "audio",
"doc": "documento",
"image": "imagen"
}
},
"settings": {
"title": "Ajustes",
"errors": {
"save_failed": "¡No se han podido guardar los ajustes!"
},
"appearance": {
"title": "Apariencia",
"brightness_theme": "Tema",
"brightness_description": "¿Prefieres una flash-bang soleada o una silenciosa y solitaria noche?",
"light": "Claro",
"dark": "Oscuro",
"effect_settings": "Efectos",
"effect_description": "¿Prefieres efectos en la interfaz o una experiencia más estática?",
"enable": "Habilitar",
"disable": "Deshabilitar"
},
"conversion": {
"title": "Conversión",
"advanced_settings": "Configuraciones avanzadas",
"filename_format": "Formato del nombre de archivo",
"filename_description": "Esto va a determinar el nombre del archivo al ser descargado <b>sin incluir la extensión</b>. Puedes poner las siguientes plantillas en el formato, las cuales serán reemplazadas con la información que les corresponde: <b>%name%</b> para el nombre original, <b>%extension%</b> para la extensión original del archivo y <b>%date%</b> para la fecha de cuando el archivo fue convertido.",
"placeholder": "VERT_%name%",
"default_format": "Formato de conversión predeterminado",
"default_format_description": "Esto cambiará el formato predeterminado seleccionado cuando subes un archivo de este tipo.",
"default_format_image": "Imágenes",
"default_format_video": "Vídeos",
"default_format_audio": "Audio",
"default_format_document": "Documentos",
"metadata": "Metadatos del archivo",
"metadata_description": "Esto cambia si los metadatos (EXIF, información de la canción, etc.) del archivo original se conservan en los archivos convertidos.",
"keep": "Mantener",
"remove": "Eliminar",
"quality": "Calidad de la conversión",
"quality_description": "Esto cambia la calidad por defecto de los archivos convertidos (en su categoría). Valores más altos pueden resultar en tiempos de conversión y tamaños de archivo más largos.",
"quality_video": "Esto cambia la calidad por defecto de los vídeos convertidos. Valores más altos pueden resultar en tiempos de conversión y tamaños de archivo más largos.",
"quality_audio": "Audio (kbps)",
"quality_images": "Imagen (%)",
"rate": "Tasa de muestreo (Hz)"
},
"vertd": {
"title": "Conversión de vídeo",
"status": "estado:",
"loading": "cargando...",
"available": "disponible, id del commit {commitId}",
"unavailable": "no disponible (¿has comprobado la url?)",
"description": "<code>vertd</code> es un proyecto que actúa como un servidor intermediario (\"wrapper\") para FFmpeg. Permite convertir vídeos sin dejar de lado la conveniente interfaz web de VERT y, a la vez, aprovecha la potencia de tu GPU para hacerlo lo más rápido posible.",
"hosting_info": "Alojamos una instancia pública para tu conveniencia, pero es bastante fácil alojar una propia en tu PC o servidor si sabes lo que estás haciendo. Puedes descargar los binarios del servidor [vertd_link]aquí[/vertd_link]. ¡El proceso de instalación será más fácil en el futuro, así que mantente atento!",
"instance": "Instancia",
"url_placeholder": "Ejemplo: http://localhost:24153",
"conversion_speed": "Velocidad de conversión",
"speed_description": "Esto describe el equilibrio entre velocidad y calidad. Velocidades más rápidas resultarán en una calidad más baja, pero harán el trabajo más rápido.",
"speeds": {
"very_slow": "Extremadamente lento",
"slower": "Muy lento",
"slow": "Lento",
"medium": "Medio",
"fast": "Rápido",
"ultra_fast": "Súper rápido"
},
"auto_instance": "Automático (recomendado)",
"eu_instance": "Falkenstein, Alemania",
"us_instance": "Washington, EE. UU.",
"custom_instance": "Personalizado"
},
"privacy": {
"title": "Privacidad",
"plausible_title": "Analíticas de Plausible",
"plausible_description": "Usamos [plausible_link]Plausible[/plausible_link], una herramienta de analíticas orientada a la privacidad para recopilar estadísticas completamente anónimas. Toda la información que recopilamos es anonimizada y agregada, y en ningún momento se envía ni se almacena información que permita identificarte. Puedes ver las estadísticas [analytics_link]aquí[/analytics_link] y excluirte de ellas a continuación:",
"opt_in": "Participar",
"opt_out": "No participar",
"cache_title": "Administración de caché",
"cache_description": "Guardamos en caché los archivos del convertidor en su navegador para que no tenga que volver a descargarlos cada vez, mejorando el rendimiento y reduciendo el uso de datos.",
"refresh_cache": "Actualizar caché",
"clear_cache": "Borrar caché",
"files_cached": "{size} ({count} archivos)",
"loading_cache": "Cargando...",
"total_size": "Tamaño total",
"files_cached_label": "Archivos en caché",
"cache_cleared": "¡Caché borrada exitosamente!"
},
"language": {
"title": "Lenguaje",
"description": "Selecciona el lenguaje que prefieres usar para la interfaz de VERT."
}
},
"about": {
"title": "Acerca de",
"why": {
"title": "¿Por qué VERT?",
"description": "<b>Los conversores de archivos siempre nos han decepcionado.</b> Son feos, están llenos de anuncios y, lo más importante, son lentos. Decidimos solucionar este problema de una vez por todas creando una alternativa que resuelve todo eso, y más.<br/><br/>Todos los archivos (exceptuando vídeos) se convierten directamente en tu dispositivo; esto significa que no hay demoras por subir o bajar archivos de un servidor, y nunca tenemos acceso a los archivos que conviertes.<br/><br/>Los vídeos se suben a nuestro servidor ultra rápido equipado con una RTX 4000 Ada. Tus vídeos permanecen allí durante una hora si no los conviertes. Si los conviertes, el archivo se guarda durante una hora, o hasta que lo descargues. Luego, el archivo se elimina del servidor."
},
"sponsors": {
"title": "Patrocinadores",
"description": "¿Quieres apoyarnos? Contacta a un desarrollador en el servidor de [discord_link]Discord[/discord_link] o envía un correo a",
"email_copied": "¡Email copiado al portapapeles!"
},
"resources": {
"title": "Recursos",
"discord": "Discord",
"source": "Fuente",
"email": "Email"
},
"donate": {
"title": "Donar a VERT",
"description": "Con tu apoyo, podemos seguir manteniendo y mejorando VERT.",
"one_time": "Una sola vez",
"monthly": "Mensual",
"custom": "Personalizado",
"pay_now": "Pagar ahora",
"donate_amount": "Donar ${amount} USD",
"thank_you": "¡Gracias por tu donación!",
"payment_failed": "Pago fallido: {message}{period} No se ha efectuado ningún cargo.",
"donation_error": "Ha ocurrido un error al procesar tu donación. Por favor, inténtalo de nuevo más tarde.",
"payment_error": "Ha ocurrido un error al obtener los detalles del pago. Por favor, inténtalo de nuevo más tarde."
},
"credits": {
"title": "Créditos",
"contact_team": "Si te gustaría contactar al equipo de desarrollo, por favor usa el email que se encuentra en la tarjeta de \"Recursos\".",
"notable_contributors": "Colaboradores destacados",
"notable_description": "Queremos dar las gracias a las siguientes personas por sus importantes contribuciones a VERT.",
"github_contributors": "Contribuidores de GitHub",
"github_description": "¡Muchas gracias a todos los que han contribuido! [github_link]¿Quieres contribuir también?[/github_link]",
"no_contributors": "Parece que nadie ha contribuido todavía... [contribute_link]¡Sé el primero en hacerlo![/contribute_link]",
"libraries": "Librerías",
"libraries_description": "Muchas gracias a FFmpeg (audio, vídeo), ImageMagick (imágenes) y Pandoc (documentos) por mantener librerías excelentes por tantos años. VERT depende de ellas para proporcionar tus conversiones.",
"roles": {
"lead_developer": "Líder de desarrollo; implementación del backend de conversión e interfaz",
"developer": "Desarrollador; implementación de la interfaz",
"designer": "Diseñador; UX, branding y marketing",
"docker_ci": "Mantenimiento del soporte para Docker y CI",
"former_cofounder": "Excofundador; diseñador"
}
},
"errors": {
"github_contributors": "Ocurrió un error mientras se obtenían los contribuidores de GitHub."
}
},
"workers": {
"errors": {
"general": "Ocurrió un error mientras se convertía {file}: {message}",
"cancel": "Error al cancelar la conversión para {file}: {message}",
"magick": "Ocurrió un error en el módulo de Magick, la conversión de imágenes puede que no funcione correctamente.",
"ffmpeg": "No se pudo cargar FFmpeg, algunas funciones podrían no funcionar.",
"no_audio": "No se encontró una pista de audio.",
"invalid_rate": "La tasa de muestreo especificada no es válida: {rate}Hz"
}
}
}
================================================
FILE: messages/fr.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Transférer",
"convert": "Convertir",
"settings": "Paramètres",
"about": "A propos",
"toggle_theme": "Changer de thème"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Code source",
"discord_server": "Serveur Discord"
},
"upload": {
"title": "Le convertisseur de fichiers que vous allez adorer.",
"subtitle": "Tout le traitement des images, des fichiers audio et des documents s'effectue sur votre appareil. Les vidéos sont converties sur nos serveurs ultra-rapides. Aucune limite de taille de fichier, aucune publicité et entièrement open source.",
"uploader": {
"text": "Déposer ou cliquer pour {action}",
"convert": "convertir"
},
"cards": {
"title": "VERT supports...",
"images": "Images",
"audio": "Audio",
"documents": "Documents",
"video": "Video",
"video_server_processing": "Serveur pris en charge",
"local_supported": "Prise en charge locale",
"status": {
"text": "<b>Status:</b> {status}",
"ready": "Prêt",
"not_ready": "Pas encore prêt",
"not_initialized": "non initialisé",
"downloading": "en cours de téléchargement...",
"initializing": "initialisation...",
"unknown": "status inconnu"
},
"supported_formats": "Formats supportés:"
},
"tooltip": {
"partial_support": "Ce format ne peut être converti qu'en {direction}.",
"direction_input": "Entrée (de)",
"direction_output": "Sortie (vers)",
"video_server_processing": "Les vidéos sont téléchargées sur un serveur pour un traitement par défaut, découvrez comment les configurer localement ici."
}
},
"convert": {
"panel": {
"convert_all": "Convertir tout",
"download_all": "Télécharger l'ensemble au format .zip",
"remove_all": "Supprimer tous les fichiers",
"set_all_to": "Tout configurer sur",
"na": "N/A"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Document",
"image": "Image",
"placeholder": "Format de recherche"
},
"tooltips": {
"unknown_file": "Type de fichier inconnu",
"audio_file": "Fichier audio",
"video_file": "Fichier vidéo",
"document_file": "Fichier document",
"image_file": "Fichier image",
"convert_file": "Convertir ce fichier",
"download_file": "Télécharger ce fichier"
},
"errors": {
"cant_convert": "Nous ne pouvons pas convertir ce fichier",
"vertd_server": "Que fais-tu ? Tu es censé exécuter sur le serveur vertd !",
"unsupported_format": "Seuls les fichiers image, vidéo, audio et document sont pris en charge",
"vertd_not_found": "Impossible de trouver l'instance vertd pour démarrer la conversion vidéo. Êtes-vous sûr que l'URL de l'instance est correctement définie ?",
"worker_downloading": "Le convertisseur de {type} est en cours d'initialisation, veuillez patienter quelques instants.",
"worker_error": "Le convertisseur de {type} a rencontré une erreur lors de l'initialisation, veuillez réessayer plus tard.",
"worker_timeout": "Le convertisseur de {type} prend plus de temps que prévu pour s'initialiser, veuillez patienter quelques instants de plus ou actualiser la page.",
"audio": "audio",
"doc": "document",
"image": "image"
}
},
"settings": {
"title": "Paramètres",
"errors": {
"save_failed": "Echec lors de l'enregistrement des préférences !"
},
"appearance": {
"title": "Appearance",
"brightness_theme": "Luminosité du thème",
"brightness_description": "Envie d'une soirée ensoleillée ou d'une nuit tranquille et solitaire ?",
"light": "Lumineux",
"dark": "Sombre",
"effect_settings": "Paramètres des effets",
"effect_description": "Vous aimez les effets sophistiqués ou préférez une expérience plus statique ?",
"enable": "Activer",
"disable": "Désactiver"
},
"conversion": {
"title": "Conversion",
"advanced_settings": "Paramètres avancés",
"filename_format": "Format du nom de fichier",
"filename_description": "Cela déterminera le nom du fichier lors du téléchargement, <b>sans inclure l'extension du fichier.</b> Vous pouvez mettre les modèles suivants dans le format, qui seront remplacés par les informations pertinentes: <b>%name%</b> pour le nom du fichier d'origine, <b>%extension%</b> pour l'extension du fichier d'origine et <b>%date%</b> pour une chaîne de date indiquant quand le fichier a été converti.",
"placeholder": "VERT_%name%",
"default_format": "Format de conversion par défaut",
"default_format_enable": "Activer",
"default_format_disable": "Désactiver",
"default_format_description": "Cela modifiera le format par défaut sélectionné lorsque vous téléchargez un fichier de ce type de format.",
"default_format_image": "Images",
"default_format_video": "Videos",
"default_format_audio": "Audio",
"default_format_document": "Documents",
"metadata": "Métadonnées du fichier",
"metadata_description": "Cela modifie si les métadonnées (EXIF, informations sur la chanson, etc.) du fichier d'origine sont conservées dans les fichiers convertis.",
"keep": "Conserver",
"remove": "Retirer",
"quality": "Qualité de conversion",
"quality_description": "Cela modifie la qualité de sortie par défaut des fichiers convertis (de son format). Des valeurs plus élevées peuvent entraîner des temps de conversion et une taille de fichier plus longs.",
"quality_video": "Cela modifie la qualité de sortie par défaut des fichiers vidéo convertis. Des valeurs plus élevées peuvent allonger le temps de conversion et la taille du fichier.",
"quality_audio": "Audio (kbps)",
"quality_images": "Image (%)",
"rate": "Taux d'échantillonnage (Hz)"
},
"vertd": {
"title": "Conversion vidéo",
"status": "status:",
"loading": "Chargement...",
"available": "disponible, identifiant de validation {commitId}",
"unavailable": "indisponible (l'url est-elle correcte ?)",
"description": "Le projet <code>vertd</code> est un serveur de wrapper utilisant FFmpeg. Il vous permet de convertir des vidéos grâce à l'interface web pratique de VERT'tout en exploitant la puissance de votre GPU pour une exécution rapide.",
"hosting_info": "Nous hébergeons une instance publique pour vous faciliter la tâche, mais il est assez facile d'héberger la vôtre sur votre PC ou votre serveur si vous savez ce que vous faites. Vous pouvez télécharger les binaires pour serveur [vertd_link]ici[/vertd_link] - le processus de mise en place deviendra plus facile à l'avenir, alors restez à l'écoute !",
"instance_url": "URL de l'instance",
"url_placeholder": "Exemple: http://localhost:24153",
"conversion_speed": "Vitesse de conversion",
"speed_description": "Ceci décrit le compromis entre vitesse et qualité. Des vitesses plus élevées entraîneront une qualité moindre, mais permettront d'effectuer le travail plus rapidement.",
"speeds": {
"very_slow": "Très lent",
"slower": "Plus lent",
"slow": "Lent",
"medium": "Moyen",
"fast": "Rapide",
"ultra_fast": "Ultra Rapide"
}
},
"privacy": {
"title": "Confidentialité",
"plausible_title": "Analyses plausibles",
"plausible_description": "Nous utilisons [plausible_link]Plausible[/plausible_link], un outil d'analyse axé sur la confidentialité, pour recueillir des statistiques totalement anonymes. Toutes les données sont anonymisées et agrégées, et aucune information identifiable n'est transmise ni stockée. Vous pouvez consulter les analyses [analytics_link]ici[/analytics_link] et choisir de vous désinscrire ci-dessous.",
"opt_in": "Inscription",
"opt_out": "Désinscription"
},
"language": {
"title": "Langue",
"description": "Sélectionnez votre langue préférée pour l'interface de VERT"
}
},
"about": {
"title": "A propos",
"why": {
"title": "Pourquoi VERT?",
"description": "<b>Les convertisseurs de fichiers nous ont toujours déçus.</b> Ils sont laids, infestés de publicités et, surtout, lents. Nous avons décidé de résoudre ce problème une fois pour toutes en créant une alternative qui résout tous ces problèmes, et bien plus encore.<br/><br/>Tous les fichiers non vidéo sont entièrement convertis sur l'appareil; cela signifie qu'il n'y a aucun délai entre l'envoi et la réception des fichiers depuis un serveur, et nous ne pouvons jamais espionner les fichiers que vous convertissez.<br/><br/>Les fichiers vidéo sont téléchargés sur notre serveur RTX 4000 Ada ultra-rapide. Vos vidéos y restent pendant une heure si vous ne les convertissez pas. Si vous convertissez le fichier, la vidéo restera sur le serveur pendant une heure, ou jusqu'à son téléchargement. Le fichier sera ensuite supprimé de notre serveur."
},
"sponsors": {
"title": "Sponsors",
"description": "Envie de nous soutenir? Contactez un développeur sur le serveur [discord_link]Discord[/discord_link], ou envoyez un courriel à",
"email_copied": "Courriel copié dans le presse-papiers !"
},
"resources": {
"title": "Resources",
"discord": "Discord",
"source": "Source",
"email": "Courriel"
},
"donate": {
"title": "Faire un don à VERT",
"description": "Avec votre soutien, nous pouvons continuer à maintenir et à améliorer VERT.",
"one_time": "Une fois",
"monthly": "Mensuel",
"custom": "Personnaliser",
"pay_now": "Payer maintenant",
"donate_amount": "Faire un don de ${amount} USD",
"thank_you": "Merci pour votre don!",
"payment_failed": "Paiement échoué: {message}{period} Vous n'avez pas été facturé.",
"donation_error": "Une erreur s'est produite lors du traitement de votre don. Veuillez réessayer ultérieurement.",
"payment_error": "Erreur lors de la récupération des informations de paiement. Veuillez réessayer ultérieurement."
},
"credits": {
"title": "Credits",
"contact_team": "Si vous souhaitez contacter l'équipe de développement, veuillez utiliser le courriel figurant sur la carte \"Resources\".",
"notable_contributors": "Contributeurs notables",
"notable_description": "Nous tenons à remercier ces personnes pour leurs contributions majeures à VERT.",
"github_contributors": "Les contributeurs de GitHub",
"github_description": "Un grand merci à toutes ces personnes pour leur aide ! [github_link]Vous voulez aussi aider ?[/github_link]",
"no_contributors": "Il semble que personne n'ait encore contribué... [contribute_link]soyez le premier à contribuer ![/contribute_link]",
"libraries": "Bibliothèques",
"libraries_description": "un grand merci à FFmpeg (audio, video), ImageMagick (images) et Pandoc (documents) pour avoir maintenu d'aussi excellentes bibliothèques pendant tant d'années, VERT compte sur eux pour vous fournir vos conversions.",
"roles": {
"lead_developer": "Lead developer; conversion backend, UI implementation",
"developer": "Developer; UI implementation",
"designer": "Designer; UX, branding, marketing",
"docker_ci": "Maintaining Docker & CI support",
"former_cofounder": "Former co-founder & designer"
}
},
"errors": {
"github_contributors": "Erreur lors de la récupération des contributeurs GitHub"
}
},
"workers": {
"errors": {
"general": "Erreur de conversion{file}: {message}",
"cancel": "Erreur lors de l'annulation de la conversion pour {file}: {message}",
"magick": "Erreur depuis Magick Worker, la conversion d'image peut ne pas fonctionner comme prévu.",
"ffmpeg": "Erreur lors du chargement de ffmpeg, certaines fonctionnalités peuvent ne pas fonctionner.",
"no_audio": "Aucun flux audio détécté.",
"invalid_rate": "Taux d'échantillonnage spécifié non valide: {rate}Hz"
}
}
}
================================================
FILE: messages/hr.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Prenesi",
"convert": "Pretvori",
"settings": "Postavke",
"about": "O Stranici",
"toggle_theme": "Promjeni izgled"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Source kod",
"discord_server": "Discord server"
},
"upload": {
"title": "Pretvarač datoteka koji ćeš obožavati.",
"subtitle": "Cijelokupna obrada slika, zvuka i dokumenata se odvija na vašem uređaju. Videozapisi se pretvaraju na našim izrazito brzim serverima. Nema nikakvih ograničenja veličine niti reklama i potpuno je open source.",
"uploader": {
"text": "Ubaci ili klikni da {action}",
"convert": "pretvori"
},
"cards": {
"title": "VERT podržava...",
"images": "Slike",
"audio": "Audio",
"documents": "Dokumente",
"video": "Video",
"video_server_processing": "Server podržan",
"local_supported": "Lokalno podržano",
"status": {
"text": "<b>Status:</b> {status}",
"ready": "spremno",
"not_ready": "nespremno",
"not_initialized": "nije inicijalizirano",
"downloading": "preuzimanje...",
"initializing": "inicijaliziranje...",
"unknown": "nepoznati status"
},
"supported_formats": "Podržani formati:"
},
"tooltip": {
"partial_support": "Ovaj format se može pretvoriti u {direction}.",
"direction_input": "ulaz (iz)",
"direction_output": "izlaz (u)",
"video_server_processing": "Videozapisi se uobičajeno prenose na servere za obradu, nauči ovdje kako namjestiti da se događa lokalno."
}
},
"convert": {
"panel": {
"convert_all": "Pretvori sve",
"download_all": "Preuzmi sve kao .zip",
"remove_all": "Makni sve datoteke",
"set_all_to": "Stavi sve na",
"na": "N/A"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Dokument",
"image": "Slika",
"placeholder": "Potraži format"
},
"tooltips": {
"unknown_file": "Nepoznat tip datoteke",
"audio_file": "Audio datoteka",
"video_file": "Video datoteka",
"document_file": "Dokument",
"image_file": "Datoteka slike",
"convert_file": "Pretvori ovu datoteku",
"download_file": "Preuzmi ovu datoteku"
},
"errors": {
"cant_convert": "Ne možemo pretvoriti ovu datoteku.",
"vertd_server": "Sunce ti žarko, što ti radiš!? Moraš pokrenuti vertd server!",
"unsupported_format": "Podržane su samo slike, videozapisi, audio i dokumenti",
"vertd_not_found": "Nismo mogli pronači vertd da započnemo pretvaranje. Jeste li sigurni da je URL točno postavljen?",
"worker_downloading": "{type} pretvarač se trenutno koristi, molimo pričekajte malo.",
"worker_error": "{type} pretvaraču se javila pogreška pri inicijalizaciji, molimo pokušajte ponovno kasnije.",
"worker_timeout": "{type} pretvaraču treba duže nego očekivano da se inicijalizira, molimo još malo pričekajte ili osvježite stranicu.",
"audio": "audio",
"doc": "dokument",
"image": "slika"
}
},
"settings": {
"title": "Postavke",
"errors": {
"save_failed": "Spremanje postavki nije uspjelo!"
},
"appearance": {
"title": "Izgled",
"brightness_theme": "Svjetlina",
"brightness_description": "Želite li da Vas Sunce oslijepi ili tihu umirujuću noć?",
"light": "Svijetlo",
"dark": "Tamno",
"effect_settings": "Efekti",
"effect_description": "Želite li zapanjujuće efekte ili miran doživljaj?",
"enable": "Uključeno",
"disable": "Isključeno"
},
"conversion": {
"title": "Pretvaranje",
"filename_format": "Način imenovanja datoteke",
"filename_description": "Ovo će odrediti ime datoteke pri preuzimanju, <b>ali ne i nastavak.</b> Možete staviti navedene prijedloge u način imenovanja, koji će biti zamijenjeni sa relevatnim informacijama: <b>%name%</b> za originalni naziv datoteke, <b>%extension%</b> za originalni nastavak, i <b>%date%</b> za datum kada je datoteka bila pretvorena.",
"placeholder": "VERT_%name%",
"default_format": "Zadan format za pretvaranje",
"default_format_description": "Ovo će promijeniti zadani format koji je izabran kada prenesete datoteku te vrste.",
"default_format_image": "Slike",
"default_format_video": "Videozapisi",
"default_format_audio": "Audio",
"default_format_document": "Dokumenti",
"metadata": "Metapodatci datoteke",
"metadata_description": "Ovo mijenja spremaju li se ikakvi metapodatci (EXIF, informacije o pjesmi, itd.) sa originalne datoteke na pretvorenu datoteku",
"keep": "Ostavi",
"remove": "Obriši",
"quality": "Kvaliteta pretvaranja",
"quality_description": "Ovo mijenja zadanu izlaznu kvalitetu pretvorene datoteke (u svojoj kategoriji). Veći iznosi mogu uzrokovati duže vrijeme za pretvaranje i veličinu.",
"quality_video": "Ovo mijenja zadanu izlaznu kvalitetu pretvoranog videozapisa. Veći iznosi mogu uzrokovati duže vrijeme za pretvaranje i veličinu.",
"quality_audio": "Audio (kbps)",
"quality_images": "Slika (%)",
"rate": "Sample rate (Hz)"
},
"vertd": {
"title": "Pretvaranje videozapisa",
"status": "status:",
"loading": "učitavanje...",
"available": "dostupno, commit id {commitId}",
"unavailable": "nedostupno (Je li URL točan?)",
"description": "<code>vertd</code> projekt je serverski omot za FFmpeg. Ovo omogućuje da pretvarate videozapise sa lakoćom VERTovog web sučelja, dok još uvijek možete iskoristiti snagu vašeg GPU da odradi što brže moguće.",
"hosting_info": "Mi držimo javnu instancu za Vašu lakoću, ali je veoma lako hostati na Vašem računalu ili serveru ako znate što radite. Možete preuzeti serverske programe [vertd_link]ovdje[/vertd_link] - Proces namještanja će biti lakši u budućnosti, pa njuškajte malo za nove vijesti!",
"instance_url": "URL instance",
"url_placeholder": "Na primjer: http://localhost:24153",
"conversion_speed": "Brzina pretvaranja",
"speed_description": "Ovo opisuje kompromis između brzine i kvalitete. Većom brzinom će izaći manja kvaliteta, ali će se posao brže odraditi.",
"speeds": {
"very_slow": "Jako Sporo",
"slower": "Sporije",
"slow": "Sporo",
"medium": "Umjereno",
"fast": "Brzo",
"ultra_fast": "Veoma Brzo"
}
},
"privacy": {
"title": "Privatnost",
"plausible_title": "Plausible analitike",
"plausible_description": "Mi koristimo [plausible_link]Plausible[/plausible_link], alat za analitiku koji je fokusiran na privatnost, da prikupimo potpuno anonimne statistike. Svi podatci su anonimizirani i prikupljeni bez ikakvih identificirajućih informacija spremljeno i poslano. Možete vidjeti analitike [analytics_link]ovdje[/analytics_link] i izabrati da ne sudjelujete ispod.",
"opt_in": "Sudjelujem",
"opt_out": "Ne sudjelujem"
},
"language": {
"title": "Jezik",
"description": "Izaberi svoj preferirani jezik za VERTovo sučelje."
}
},
"about": {
"title": "O stranici",
"why": {
"title": "Zašto baš VERT?",
"description": "<b>Pretvarači datoteka su nas uvijek razočarali.</b> Izuzetno su ružni, prepuni reklama, i najvažnije; spori! Odlučili smo riješiti problem jednom i zauvijek praveći alternativu koja riješava sve ove probleme, i više.<br/><br/>Sve datoteke koji nisu videozapisi su pretvoreni direktno na Vašem uređaju; To znači da nema nikakve stanke između slanja i primanja datoteka sa servera, i nikada ne dobijemo šansu gurati nos u vaše datoteke koje pretvarate. <br/><br/>Videozapisi se prenose na naše izuzetno brze RTX 4000 Ada servere. Vaši videozapisi tamo ostano sat vremena ako ih ne pretvorite. Ako ih i pretvorite, videozapis će ostati na serveru na sat vremena, ili dok se ne preuzme. Datoteka će zatim biti obrisana sa našeg servera."
},
"sponsors": {
"title": "Sponzori",
"description": "Želite li nas podržati? Kontaktirajte developera na [discord_link]Discord[/discord_link] serveru, ili pošaljite mail na",
"email_copied": "Email kopiran u međuspremnik!"
},
"resources": {
"title": "Resursi",
"discord": "Discord",
"source": "Source kod",
"email": "Email"
},
"donate": {
"title": "Donirajte nam",
"description": "Sa vašom podrškom mi možemo nastaviti održavati i poboljšavati VERT.",
"one_time": "Jednokratno",
"monthly": "Mjesečno",
"custom": "Prilagođeno",
"pay_now": "Plati sada",
"donate_amount": "Doniraj ${amount} USD",
"thank_you": "Hvala Vam na Vašoj donaciji!!",
"payment_failed": "Plaćanje neuspjelo: {message}{period} Niste naplaćeni.",
"donation_error": "Dogodila se pogreška pri obradi donacije. Molimo pokušajte kasnije.",
"payment_error": "Dogodila se pogreška pri prihvaćanju detalja o naplati. Molimo pokušajte kasnije."
},
"credits": {
"title": "Zasluge",
"contact_team": "Ako želite kontaktirati developere, molimo koristite email koji se nalazi u odjeljku \"resursi\".",
"notable_contributors": "Značajni suradnici",
"notable_description": "Želimo zahvaliti ovim ljudima za njihove ogromne doprinose VERTu.",
"github_contributors": "GitHub suradnici",
"github_description": "Velike zahvale svim ovim ljudima koji su nam pomogli! [github_link]Želiš nam i ti pomoći?[/github_link]",
"no_contributors": "Čini se kako nitko nije još doprinio... [contribute_link]budite prvi koji će doprinjeti![/contribute_link]",
"libraries": "Biblioteke",
"libraries_description": "Velike zahvale prema FFmpeg (audio, video), ImageMagick (slike) i Pandoc (dokumenti) što su održavali tako odlične biblioteke svih ovih godina. VERT se oslanja na njih da bi Vam pružili pretvorbu.",
"roles": {
"lead_developer": "Glavni developer; Pretvarački backend, UI implementacija",
"developer": "Developer; UI implementacija",
"designer": "Dizajner; UX, branding, marketing",
"docker_ci": "Održavanje Dockera i CI support",
"former_cofounder": "Prijašnji suosnivač i dizajner"
}
},
"errors": {
"github_contributors": "Pogreška pri prikupljanju GitHub suradnika"
}
},
"workers": {
"errors": {
"general": "Pogreška pri pretvaranju {file}: {message}",
"magick": "Pogreška sa Magick radnikom, pretvorba slike možda neće raditi kao očekivano.",
"ffmpeg": "Greška pri učitavanju ffmpeg, neke značajke možda neće raditi.",
"no_audio": "Nije pronađen audio.",
"invalid_rate": "Upisan nevažeći sample rate: {rate}Hz!"
}
}
}
================================================
FILE: messages/id.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Unggah",
"convert": "Konversi",
"settings": "Pengaturan",
"about": "Tentang",
"toggle_theme": "Ganti Tema"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Kode sumber",
"discord_server": "Peladen Discord"
},
"upload": {
"title": "Konverter berkas andalanmu.",
"subtitle": "Semua gambar, audio, dan pemrosesan dokumen dilakukan pada perangkatmu. Video dikonversi pada peladen kilat kami. Tidak ada batas ukuran berkas, tidak ada iklan, dan benar-benar sumber terbuka.",
"uploader": {
"text": "Jatuhkan dan klik untuk {action}",
"convert": "Konversi",
"jpegify": "jpegify"
},
"cards": {
"title": "Dapat Ditangani VERT ...",
"images": "Gambar",
"audio": "Audio",
"documents": "Dokumen",
"video": "Video",
"video_server_processing": "Proses di Server",
"local_supported": "Proses di Lokal",
"status": {
"text": "<b>Status:</b> {status}",
"ready": "siap",
"not_ready": "belum siap",
"not_initialized": "tidak terinisialisasi",
"downloading": "mengunduh...",
"initializing": "menginisialisasi...",
"unknown": "status tidak diketahui"
},
"supported_formats": "Format yang didukung:"
},
"tooltip": {
"partial_support": "Format ini hanya dapat dikonversi ke {direction}.",
"direction_input": "sumber asal (dari)",
"direction_output": "target (ke)",
"video_server_processing": "Video upload ke server untuk diproses secara baku, belajar bagaimana mengaturnya di sini."
}
},
"convert": {
"external_warning": {
"title": "Peringatan server eksternal",
"text": "Jika kamu memilih untuk mengonversi ke format video, berkas tersebut akan diunggah ke server eksternal untuk dikonversi. Apakah kamu ingin melanjutkan?",
"yes": "Ya",
"no": "Tidak"
},
"panel": {
"convert_all": "Konversi semua",
"download_all": "Unduh semua sebagai .zip",
"remove_all": "Hapus semua berkas",
"set_all_to": "Atur semua ke",
"na": "N/A"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Dokumen",
"image": "Gambar",
"placeholder": "Cari format"
},
"tooltips": {
"unknown_file": "Jenis berkas tidak diketahui",
"audio_file": "Berkas audio",
"video_file": "Berkas video",
"document_file": "Berkas dokumen",
"image_file": "Berkas gambar",
"convert_file": "Konversi berkas ini",
"download_file": "Unduh berkas ini"
},
"errors": {
"cant_convert": "Kami tidak dapat mengonversi berkas ini.",
"vertd_server": "apa yang kamu lakukan..? kamu seharusnya menjalankan peladen vertd!",
"vertd_generic_body": "Terjadi galat saat mencoba mengonversi video kamu. Apakah kamu ingin mengirimkan video ini ke pengembang untuk membantu memperbaiki kutu ini? Hanya berkas video kamu yang akan dikirim. Tidak ada data identifikasi yang diunggah.",
"vertd_generic_title": "Konversi video galat",
"vertd_generic_yes": "Kirim video",
"vertd_generic_no": "Jangan kirim",
"vertd_failed_to_keep": "Gagal menyimpan video di peladen: {error}",
"unsupported_format": "Hanya berkas gambar, video, audio, dan dokumen yang didukung",
"vertd_not_found": "Tidak dapat menemukan layanan vertd untuk memulai konversi video. Apakah URL layanan sudah diatur dengan benar?",
"worker_downloading": "Konverter {type} sedang diinisialisasi, harap tunggu beberapa saat.",
"worker_error": "Konverter {type} mengalami kesalahan saat inisialisasi, coba lagi nanti.",
"worker_timeout": "Konverter {type} memerlukan waktu lebih lama dari perkiraan untuk inisialisasi, harap tunggu beberapa saat lagi atau segarkan halaman.",
"audio": "audio",
"doc": "dokumen",
"image": "gambar"
}
},
"settings": {
"title": "Pengaturan",
"errors": {
"save_failed": "Gagal menyimpan pengaturan!"
},
"appearance": {
"title": "Tampilan",
"brightness_theme": "Tema kecerahan",
"brightness_description": "Ingin suasana terang benderang, atau malam yang sunyi?",
"light": "Terang",
"dark": "Gelap",
"effect_settings": "Pengaturan efek",
"effect_description": "Ingin efek keren, atau tampilan yang lebih sederhana?",
"enable": "Aktifkan",
"disable": "Nonaktifkan"
},
"conversion": {
"title": "Konversi",
"advanced_settings": "Pengaturan lanjutan",
"filename_format": "Format nama berkas",
"filename_description": "Ini akan menentukan nama berkas saat diunduh, <b>tidak termasuk ekstensi berkas.</b> Kamu dapat menggunakan template berikut dalam format, yang akan diganti dengan informasi terkait: <b>%name%</b> untuk nama berkas asli, <b>%extension%</b> untuk ekstensi berkas asli, dan <b>%date%</b> untuk tanggal saat berkas dikonversi.",
"placeholder": "VERT_%name%",
"default_format": "Format konversi baku",
"default_format_description": "Ini akan mengubah format baku yang dipilih saat kamu mengunggah berkas dengan tipe tersebut.",
"default_format_image": "Gambar",
"default_format_video": "Video",
"default_format_audio": "Audio",
"default_format_document": "Dokumen",
"metadata": "Metadata berkas",
"metadata_description": "Menentukan apakah metadata (EXIF, info lagu, dll.) dari berkas asli akan dipertahankan di berkas hasil konversi.",
"keep": "Pertahankan",
"remove": "Hapus",
"quality": "Kualitas konversi",
"quality_description": "Mengubah kualitas keluaran baku berkas hasil konversi. Nilai yang lebih tinggi dapat menghasilkan waktu konversi dan ukuran berkas yang lebih besar.",
"quality_video": "Mengubah kualitas keluaran baku berkas video hasil konversi. Nilai yang lebih tinggi dapat memperpanjang waktu dan ukuran berkas.",
"quality_audio": "Audio (kbps)",
"quality_images": "Gambar (%)",
"rate": "Laju sampel (Hz)"
},
"vertd": {
"title": "Konversi video",
"status": "status:",
"loading": "memuat...",
"available": "tersedia, commit id {commitId}",
"unavailable": "tidak tersedia (apakah URL sudah benar?)",
"description": "Proyek <code>vertd</code> adalah server wrapper untuk FFmpeg. Ini memungkinkan kamu mengonversi video melalui antarmuka web VERT, sambil memanfaatkan kekuatan GPU untuk mempercepat proses.",
"hosting_info": "Kami menyediakan instance publik untuk kemudahanmu, tetapi kamu juga bisa dengan mudah meng-host sendiri di PC atau server jika tahu caranya. Kamu dapat mengunduh binary server [vertd_link]di sini[/vertd_link] - proses penyiapan akan semakin mudah di masa depan, jadi tetap pantau!",
"instance": "Instance",
"url_placeholder": "Contoh: http://localhost:24153",
"conversion_speed": "Kecepatan konversi",
"speed_description": "Menjelaskan kompromi antara kecepatan dan kualitas. Kecepatan lebih tinggi menghasilkan kualitas lebih rendah, tetapi proses lebih cepat.",
"speeds": {
"very_slow": "Sangat Lambat",
"slower": "Agak Lambat",
"slow": "Lambat",
"medium": "Sedang",
"fast": "Cepat",
"ultra_fast": "Sangat Cepat"
},
"auto_instance": "Otomatis (disarankan)",
"eu_instance": "Falkenstein, Jerman",
"us_instance": "Washington, AS",
"custom_instance": "Kustom"
},
"privacy": {
"title": "Privasi & data",
"plausible_title": "Analitik Plausible",
"plausible_description": "Kami menggunakan [plausible_link]Plausible[/plausible_link], alat analitik yang berfokus pada privasi, untuk mengumpulkan statistik anonim sepenuhnya. Semua data dianonimkan dan diagregasi, tanpa informasi yang dapat diidentifikasi. Kamu dapat melihat analitiknya [analytics_link]di sini[/analytics_link] dan memilih untuk keluar di bawah.",
"opt_in": "Ikut serta",
"opt_out": "Tidak ikut",
"cache_title": "Manajemen cache",
"cache_description": "Kami menyimpan berkas konverter di browser agar kamu tidak perlu mengunduh ulang setiap kali, meningkatkan performa dan menghemat data.",
"refresh_cache": "Segarkan cache",
"clear_cache": "Hapus cache",
"files_cached": "{size} ({count} berkas)",
"loading_cache": "Memuat...",
"total_size": "Total Ukuran",
"files_cached_label": "File Tersimpan",
"cache_cleared": "Cache berhasil dihapus!",
"cache_clear_error": "Gagal menghapus cache."
},
"language": {
"title": "Bahasa",
"description": "Pilih bahasa pilihanmu untuk antarmuka VERT."
}
},
"about": {
"title": "Tentang",
"why": {
"title": "Mengapa VERT?",
"description": "<b>Konverter berkas selalu mengecewakan kami.</b> Mereka jelek, penuh iklan, dan yang paling penting; lambat. Kami memutuskan untuk menyelesaikan masalah ini sekali untuk selamanya dengan membuat alternatif yang memperbaiki semua masalah itu, dan lebih banyak lagi.<br/><br/>Semua berkas non-video dikonversi sepenuhnya di perangkat; artinya tidak ada jeda antara pengiriman dan penerimaan berkas, dan kami tidak pernah melihat berkas yang kamu konversi.<br/><br/>File video diunggah ke server RTX 4000 Ada super cepat kami. Videomu akan tetap di sana selama satu jam jika tidak dikonversi. Jika dikonversi, video akan bertahan satu jam atau hingga diunduh. Setelah itu, berkas akan dihapus dari server kami."
},
"sponsors": {
"title": "Sponsor",
"description": "Ingin mendukung kami? Hubungi pengembang di server [discord_link]Discord[/discord_link], atau kirim email ke",
"email_copied": "Email disalin ke clipboard!"
},
"resources": {
"title": "Sumber daya",
"discord": "Discord",
"source": "Sumber",
"email": "Email"
},
"donate": {
"title": "Donasi untuk VERT",
"description": "Dengan dukunganmu, kami dapat terus memelihara dan meningkatkan VERT.",
"one_time": "Sekali",
"monthly": "Bulanan",
"custom": "Kustom",
"pay_now": "Bayar sekarang",
"donate_amount": "Donasi ${amount} USD",
"thank_you": "Terima kasih atas donasimu!",
"payment_failed": "Pembayaran gagal: {message}{period} Kamu tidak dikenai biaya.",
"donation_error": "Terjadi kesalahan saat memproses donasi. Coba lagi nanti.",
"payment_error": "Kesalahan mengambil detail pembayaran. Coba lagi nanti."
},
"credits": {
"title": "Kredit",
"contact_team": "Jika kamu ingin menghubungi tim pengembang, gunakan email yang ada di kartu \"Sumber Daya\".",
"notable_contributors": "Kontributor penting",
"notable_description": "Kami ingin berterima kasih kepada orang-orang ini atas kontribusi besar mereka untuk VERT.",
"github_contributors": "Kontributor GitHub",
"github_description": "[jpegify_link]Terima kasih[/jpegify_link] banyak kepada semua orang yang telah membantu! [github_link]Ingin membantu juga?[/github_link]",
"no_contributors": "Sepertinya belum ada yang berkontribusi... [contribute_link]jadilah yang pertama berkontribusi![/contribute_link]",
"libraries": "Pustaka",
"libraries_description": "Terima kasih besar kepada FFmpeg (audio, video), ImageMagick (gambar), dan Pandoc (dokumen) atas pemeliharaannya selama bertahun-tahun. VERT bergantung pada mereka untuk menyediakan konversi berkas.",
"roles": {
"lead_developer": "Pengembang utama; backend konversi, implementasi UI",
"developer": "Pengembang; implementasi UI",
"designer": "Desainer; UX, branding, pemasaran",
"docker_ci": "Pemeliharaan Docker & CI",
"former_cofounder": "Mantan co-founder & desainer"
}
},
"errors": {
"github_contributors": "Kesalahan mengambil kontributor GitHub"
}
},
"workers": {
"errors": {
"general": "Kesalahan mengonversi {file}: {message}",
"cancel": "Kesalahan membatalkan konversi untuk {file}: {message}",
"magick": "Kesalahan di worker Magick, konversi gambar mungkin tidak berfungsi dengan benar.",
"ffmpeg": "Kesalahan memuat ffmpeg, beberapa fitur mungkin tidak berfungsi.",
"no_audio": "Tidak ditemukan aliran audio.",
"invalid_rate": "Laju sampel tidak valid: {rate}Hz"
}
},
"jpegify": {
"title": "JPEGIFY RAHASIA!!!",
"subtitle": "(psst... jangan beri tahu siapa pun!)",
"button": "JPEGIFY {compression}%!!!",
"download": "Unduh",
"delete": "Hapus"
}
}
================================================
FILE: messages/it.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "Carica",
"convert": "Converti",
"settings": "Impostazioni",
"about": "Informazioni",
"toggle_theme": "Cambia tema"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "Codice sorgente",
"discord_server": "Server Discord"
},
"upload": {
"title": "Il convertitore di file che amerai.",
"subtitle": "Tutta l'elaborazione di immagini, audio e documenti avviene sul tuo dispositivo. I video sono convertiti sui nostri server velocissimi. Nessun limite di dimensione, nessuna pubblicità e completamente open source.",
"uploader": {
"text": "Trascina o clicca per {action}",
"convert": "convertire"
},
"cards": {
"title": "VERT supporta...",
"images": "Immagini",
"audio": "Audio",
"documents": "Documenti",
"video": "Video",
"video_server_processing": "Supportato da server",
"local_supported": "Supportato in locale",
"status": {
"text": "<b>Stato:</b> {status}",
"ready": "pronto",
"not_ready": "non pronto",
"not_initialized": "non inizializzato",
"downloading": "download in corso...",
"initializing": "inizializzazione in corso...",
"unknown": "stato sconosciuto"
},
"supported_formats": "Formati supportati:"
},
"tooltip": {
"partial_support": "Questo formato può essere convertito solo come {direction}.",
"direction_input": "input (da)",
"direction_output": "output (a)",
"video_server_processing": "Per impostazione predefinita, i video vengono caricati su un server per l'elaborazione. Scopri come configurarlo in locale qui."
}
},
"convert": {
"external_warning": {
"title": "Avviso server esterno",
"text": "Se scegli di convertire in un formato video, quei file verranno caricati su un server esterno per essere convertiti. Vuoi continuare?",
"yes": "Sì",
"no": "No"
},
"panel": {
"convert_all": "Converti tutti",
"download_all": "Scarica tutti come .zip",
"remove_all": "Rimuovi tutti i file",
"set_all_to": "Imposta tutti a",
"na": "N/D"
},
"dropdown": {
"audio": "Audio",
"video": "Video",
"doc": "Documento",
"image": "Immagine",
"placeholder": "Cerca formato"
},
"tooltips": {
"unknown_file": "Tipo di file sconosciuto",
"audio_file": "File audio",
"video_file": "File video",
"document_file": "File documento",
"image_file": "File immagine",
"convert_file": "Converti questo file",
"download_file": "Scarica questo file"
},
"errors": {
"cant_convert": "Non possiamo convertire questo file.",
"vertd_server": "cosa stai facendo...? dovresti eseguire il server vertd!",
"vertd_generic_body": "Si è verificato un errore durante il tentativo di conversione del tuo video. Vuoi inviare questo video agli sviluppatori per aiutare a risolvere questo bug? Verrà inviato solo il tuo file video. Nessun identificatore sarà caricato.",
"vertd_generic_title": "Errore di conversione video",
"vertd_generic_yes": "Invia video",
"vertd_generic_no": "Non inviare",
"vertd_failed_to_keep": "Impossibile mantenere il video sul server: {error}",
"unsupported_format": "Sono supportati solo file immagine, video, audio e documento",
"vertd_not_found": "Impossibile trovare l'istanza vertd per avviare la conversione video. Sei sicuro che l'URL dell'istanza sia impostato correttamente?",
"worker_downloading": "Il convertitore {type} è attualmente in fase di inizializzazione, attendi qualche istante.",
"worker_error": "Il convertitore {type} ha avuto un errore durante l'inizializzazione, riprova più tardi.",
"worker_timeout": "Il convertitore {type} sta impiegando più del previsto per inizializzare, attendi ancora qualche istante o aggiorna la pagina.",
"audio": "audio",
"doc": "documento",
"image": "immagine"
}
},
"settings": {
"title": "Impostazioni",
"errors": {
"save_failed": "Impossibile salvare le impostazioni!"
},
"appearance": {
"title": "Aspetto",
"brightness_theme": "Tema luminosità",
"brightness_description": "Vuoi un lampo di sole, o una tranquilla notte solitaria?",
"light": "Chiaro",
"dark": "Scuro",
"effect_settings": "Impostazioni effetti",
"effect_description": "Desideri effetti *fancy*, o un'esperienza più statica?",
"enable": "Abilita",
"disable": "Disabilita"
},
"conversion": {
"title": "Conversione",
"advanced_settings": "Impostazioni avanzate",
"filename_format": "Formato nome file",
"filename_description": "Questo determinerà il nome del file al momento del download, <b>esclusa l'estensione del file.</b> È possibile inserire i seguenti *template* nel formato, che verranno sostituiti con le informazioni pertinenti: <b>%name%</b> per il nome del file originale, <b>%extension%</b> per l'estensione del file originale e <b>%date%</b> per una *stringa* di data di quando il file è stato convertito.",
"placeholder": "VERT_%name%",
"default_format": "Formato di conversione predefinito",
"default_format_description": "Questo cambierà il formato predefinito selezionato quando carichi un file di questo tipo.",
"default_format_image": "Immagini",
"default_format_video": "Video",
"default_format_audio": "Audio",
"default_format_document": "Documenti",
"metadata": "Metadati del file",
"metadata_description": "Questo cambia se eventuali metadati (EXIF, informazioni sul brano, ecc.) del file originale vengono conservati nei file convertiti.",
"keep": "Mantieni",
"remove": "Rimuovi",
"quality": "Qualità di conversione",
"quality_description": "Questo cambia la qualità di output predefinita dei file convertiti (nella sua categoria). Valori più alti possono comportare tempi di conversione più lunghi e dimensioni maggiori.",
"quality_video": "Questo cambia la qualità di output predefinita dei file video convertiti. Valori più alti possono comportare tempi di conversione più lunghi e dimensioni maggiori.",
"quality_audio": "Audio (kbps)",
"quality_images": "Immagine (%)",
"rate": "Frequenza di campionamento (Hz)"
},
"vertd": {
"title": "Conversione video",
"status": "stato:",
"loading": "caricamento...",
"available": "disponibile, ID commit {commitId}",
"unavailable": "non disponibile (l'URL è corretto?)",
"description": "Il progetto <code>vertd</code> è un *server wrapper* per FFmpeg. Questo ti permette di convertire video attraverso la comodità dell'interfaccia web di VERT, pur essendo in grado di sfruttare la potenza della tua GPU per farlo il più rapidamente possibile.",
"hosting_info": "Ospitiamo un'istanza pubblica per la tua comodità, ma è abbastanza facile ospitarne una tua sul tuo PC o server se sai cosa stai facendo. Puoi scaricare i binari del server [vertd_link]qui[/vertd_link] - il processo di configurazione diventerà più semplice in futuro, quindi resta sintonizzato!",
"instance": "Istanza",
"url_placeholder": "Esempio: http://localhost:24153",
"conversion_speed": "Velocità di conversione",
"speed_description": "Questo descrive il compromesso tra velocità e qualità. Velocità maggiori si tradurranno in una qualità inferiore, ma completeranno il lavoro più velocemente.",
"speeds": {
"very_slow": "Molto Lento",
"slower": "Più Lento",
"slow": "Lento",
"medium": "Medio",
"fast": "Veloce",
"ultra_fast": "Ultra Veloce"
},
"auto_instance": "Automatico (consigliato)",
"eu_instance": "Falkenstein, Germania",
"us_instance": "Washington, USA",
"custom_instance": "Personalizzato"
},
"privacy": {
"title": "Privacy e dati",
"plausible_title": "Statistiche Plausible",
"plausible_description": "Utilizziamo [plausible_link]Plausible[/plausible_link], uno strumento di analisi focalizzato sulla privacy, per raccogliere statistiche completamente anonime. Tutti i dati sono anonimizzati e aggregati e nessuna informazione identificabile viene mai inviata o archiviata. Puoi visualizzare le statistiche [analytics_link]qui[/analytics_link] e scegliere di disattivare il tracciamento qui sotto.",
"opt_in": "Attiva tracciamento",
"opt_out": "Disattiva tracciamento",
"cache_title": "Gestione della cache",
"cache_description": "Memorizziamo i file del convertitore nella cache del tuo *browser* in modo che tu non debba riscaricarli ogni volta, migliorando le prestazioni e riducendo l'utilizzo dei dati.",
"refresh_cache": "Aggiorna cache",
"clear_cache": "Cancella cache",
"files_cached": "{size} ({count} file)",
"loading_cache": "Caricamento...",
"total_size": "Dimensione Totale",
"files_cached_label": "File in Cache",
"cache_cleared": "Cache cancellata con successo!",
"cache_clear_error": "Impossibile cancellare la cache."
},
"language": {
"title": "Lingua",
"description": "Seleziona la tua lingua preferita per l'interfaccia di VERT."
}
},
"about": {
"title": "Informazioni",
"why": {
"title": "Perché VERT?",
"description": "<b>I convertitori di file ci hanno sempre deluso.</b> Sono brutti, pieni di pubblicità e, soprattutto, lenti. Abbiamo deciso di risolvere questo problema una volta per tutte creando un'alternativa che risolve tutti questi problemi e non solo.<br/><br/>Tutti i file non video vengono convertiti completamente sul dispositivo; questo significa che non ci sono ritardi tra l'invio e la ricezione dei file da un server e non possiamo mai spiare i file che converti.<br/><br/>I file video vengono caricati sul nostro velocissimo server RTX 4000 Ada. I tuoi video rimangono lì per un'ora se non li converti. Se converti il file, il video rimarrà sul server per un'ora o fino a quando non viene scaricato. Il file verrà quindi eliminato dal nostro server."
},
"sponsors": {
"title": "Sponsor",
"description": "Vuoi sostenerci? Contatta uno sviluppatore nel server [discord_link]Discord[/discord_link] o invia un'e-mail a",
"email_copied": "E-mail copiata negli appunti!"
},
"resources": {
"title": "Risorse",
"discord": "Discord",
"source": "Sorgente",
"email": "E-mail"
},
"donate": {
"title": "Fai una donazione a VERT",
"description": "Con il tuo supporto, possiamo continuare a mantenere e migliorare VERT.",
"one_time": "Una tantum",
"monthly": "Mensile",
"custom": "Personalizzato",
"pay_now": "Paga ora",
"donate_amount": "Dona ${amount} USD",
"thank_you": "Grazie per la tua donazione!",
"payment_failed": "Pagamento fallito: {message}{period} Non ti è stato addebitato nulla.",
"donation_error": "Si è verificato un errore durante l'elaborazione della tua donazione. Riprova più tardi.",
"payment_error": "Errore nel recupero dei dettagli di pagamento. Riprova più tardi."
},
"credits": {
"title": "Crediti",
"contact_team": "Se desideri contattare il team di sviluppo, utilizza l'e-mail che trovi sulla scheda \"Risorse\".",
"notable_contributors": "Contributori di rilievo",
"notable_description": "Vorremmo ringraziare queste persone per i loro importanti contributi a VERT.",
"github_contributors": "Contributori GitHub",
"github_description": "Un grande grazie a tutte queste persone per aver dato una mano! [github_link]Vuoi aiutare anche tu?[/github_link]",
"no_contributors": "Sembra che nessuno abbia ancora contribuito... [contribute_link]sii il primo a contribuire![/contribute_link]",
"libraries": "Librerie",
"libraries_description": "Un grande ringraziamento a FFmpeg (audio, video), ImageMagick (immagini) e Pandoc (documenti) per aver mantenuto librerie così eccellenti per così tanti anni. VERT si affida a loro per fornirti le tue conversioni.",
"roles": {
"lead_developer": "Sviluppatore principale; backend di conversione, implementazione UI",
"developer": "Sviluppatore; implementazione UI",
"designer": "Designer; UX, branding, marketing",
"docker_ci": "Manutenzione del supporto Docker e CI",
"former_cofounder": "Ex co-fondatore e designer"
}
},
"errors": {
"github_contributors": "Errore nel recupero dei contributori GitHub"
}
},
"workers": {
"errors": {
"general": "Errore durante la conversione di {file}: {message}",
"cancel": "Errore durante l'annullamento della conversione per {file}: {message}",
"magick": "Errore nel *worker* Magick, la conversione delle immagini potrebbe non funzionare come previsto.",
"ffmpeg": "Errore durante il caricamento di ffmpeg, alcune funzionalità potrebbero non funzionare.",
"no_audio": "Nessuno *stream* audio trovato.",
"invalid_rate": "Frequenza di campionamento specificata non valida: {rate}Hz"
}
}
}
================================================
FILE: messages/ja.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "アップロード",
"convert": "変換",
"settings": "設定",
"about": "について",
"toggle_theme": "テーマを切り替える"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "ソースコード",
"discord_server": "Discordサーバー"
},
"upload": {
"title": "きっと気に入るファイル変換ツール。",
"subtitle": "すべての画像・音声・ドキュメント処理はデバイス上で行われます。動画は超高速サーバーで変換されます。ファイルサイズ制限なし、広告なし、完全オープンソース。",
"uploader": {
"text": "ドロップまたはクリックして{action}",
"convert": "変換"
},
"cards": {
"title": "VERTがサポートしている形式",
"images": "画像",
"audio": "音声",
"documents": "ドキュメント",
"video": "動画",
"video_server_processing": "サーバー対応",
"local_supported": "ローカル対応",
"status": {
"text": "<b>ステータス:</b> {status}",
"ready": "準備完了",
"not_ready": "未準備",
"not_initialized": "未初期化",
"downloading": "ダウンロード中...",
"initializing": "初期化中...",
"unknown": "不明なステータス"
},
"supported_formats": "対応フォーマット:"
},
"tooltip": {
"partial_support": "このフォーマットは{direction}としてのみ変換可能です。",
"direction_input": "入力(変換元)",
"direction_output": "出力(変換先)",
"video_server_processing": "動画はデフォルトでサーバーにアップロードされて処理されます。ローカルで設定する方法はこちら。"
}
},
"convert": {
"external_warning": {
"title": "外部サーバーの警告",
"text": "動画フォーマットへの変換を選択すると、ファイルは外部サーバーにアップロードされて変換されます。続行しますか?",
"yes": "はい",
"no": "いいえ"
},
"panel": {
"convert_all": "すべて変換",
"download_all": "すべてを.zipでダウンロード",
"remove_all": "すべてのファイルを削除",
"set_all_to": "すべてを設定",
"na": "該当なし"
},
"dropdown": {
"audio": "音声",
"video": "動画",
"doc": "ドキュメント",
"image": "画像",
"placeholder": "フォーマットを検索"
},
"tooltips": {
"unknown_file": "不明なファイルタイプ",
"audio_file": "音声ファイル",
"video_file": "動画ファイル",
"document_file": "ドキュメントファイル",
"image_file": "画像ファイル",
"convert_file": "このファイルを変換",
"download_file": "このファイルをダウンロード"
},
"errors": {
"cant_convert": "このファイルを変換できません。",
"vertd_server": "何してるの..? vertdサーバーを起動する必要があります!",
"unsupported_format": "画像、動画、音声、ドキュメントのみ対応しています",
"vertd_not_found": "動画変換を開始するためのvertdインスタンスが見つかりません。URLが正しいか確認してください。",
"worker_downloading": "{type}コンバーターを初期化中です。少々お待ちください。",
"worker_error": "{type}コンバーターの初期化中にエラーが発生しました。後でもう一度お試しください。",
"worker_timeout": "{type}コンバーターの初期化に予想以上の時間がかかっています。もう少しお待ちいただくか、ページを更新してください。",
"audio": "音声",
"doc": "ドキュメント",
"image": "画像"
}
},
"settings": {
"title": "設定",
"errors": {
"save_failed": "設定の保存に失敗しました!"
},
"appearance": {
"title": "外観",
"brightness_theme": "明るさテーマ",
"brightness_description": "まぶしい昼間か、静かな夜か?",
"light": "ライト",
"dark": "ダーク",
"effect_settings": "エフェクト設定",
"effect_description": "派手な効果にしますか?それとも静的な体験にしますか?",
"enable": "有効",
"disable": "無効"
},
"conversion": {
"title": "変換",
"advanced_settings": "詳細設定",
"filename_format": "ファイル名フォーマット",
"filename_description": "これはダウンロード時のファイル名を決定します(拡張子を除く)。以下のテンプレートを使用できます:<b>%name%</b>(元のファイル名)、<b>%extension%</b>(元の拡張子)、<b>%date%</b>(変換日時)。",
"placeholder": "VERT_%name%",
"default_format": "デフォルト変換フォーマット",
"default_format_description": "このファイルタイプをアップロードしたときに自動で選択される形式を変更します。",
"default_format_image": "画像",
"default_format_video": "動画",
"default_format_audio": "音声",
"default_format_document": "ドキュメント",
"metadata": "ファイルメタデータ",
"metadata_description": "変換後のファイルに元のメタデータ(EXIF、曲情報など)を保持するかどうかを変更します。",
"keep": "保持",
"remove": "削除",
"quality": "変換品質",
"quality_description": "出力ファイルの品質を変更します。値が高いほど処理時間とファイルサイズが増加します。",
"quality_video": "動画変換の品質を変更します。高品質ほど変換時間とサイズが増加します。",
"quality_audio": "音声(kbps)",
"quality_images": "画像(%)",
"rate": "サンプリングレート(Hz)"
},
"vertd": {
"title": "動画変換",
"status": "ステータス:",
"loading": "読み込み中...",
"available": "利用可能(コミットID {commitId})",
"unavailable": "利用不可(URLが正しいですか?)",
"description": "<code>vertd</code>プロジェクトはFFmpegのサーバーラッパーです。これにより、GPUの性能を活かして高速に変換しつつ、VERTのウェブインターフェイスから簡単に動画を変換できます。",
"hosting_info": "私たちは利便性のために公開インスタンスをホストしていますが、自分のPCやサーバーでも簡単にホストできます。バイナリは[vertd_link]こちら[/vertd_link]からダウンロードできます。今後さらにセットアップが簡単になる予定です!",
"instance": "インスタンス",
"url_placeholder": "例: http://localhost:24153",
"conversion_speed": "変換速度",
"speed_description": "速度と品質のバランスを設定します。高速化すると品質が低下しますが、処理は速くなります。",
"speeds": {
"very_slow": "非常に遅い",
"slower": "かなり遅い",
"slow": "遅い",
"medium": "普通",
"fast": "速い",
"ultra_fast": "超高速"
},
"auto_instance": "自動(推奨)",
"eu_instance": "ドイツ・ファルケンシュタイン",
"us_instance": "アメリカ・ワシントン",
"custom_instance": "カスタム"
},
"privacy": {
"title": "プライバシーとデータ",
"plausible_title": "Plausible解析",
"plausible_description": "私たちはプライバシー重視の解析ツール[plausible_link]Plausible[/plausible_link]を使用しています。すべてのデータは匿名化・集計され、個人情報は一切収集・保存されません。統計情報は[analytics_link]こちら[/analytics_link]で確認でき、以下でオプトアウト可能です。",
"opt_in": "参加する",
"opt_out": "参加しない",
"cache_title": "キャッシュ管理",
"cache_description": "コンバーターファイルをブラウザにキャッシュして再ダウンロードを防ぎ、パフォーマンスを向上させます。",
"refresh_cache": "キャッシュを更新",
"clear_cache": "キャッシュをクリア",
"files_cached": "{size}({count}ファイル)",
"loading_cache": "読み込み中...",
"total_size": "合計サイズ",
"files_cached_label": "キャッシュ済みファイル",
"cache_cleared": "キャッシュが正常にクリアされました!"
},
"language": {
"title": "言語",
"description": "VERTインターフェイスの表示言語を選択してください。"
}
},
"about": {
"title": "について",
"why": {
"title": "なぜVERT?",
"description": "<b>従来のファイルコンバーターにはいつもがっかりしてきました。</b>見た目が悪く、広告だらけで、そして何より遅い。私たちはそれらの問題をすべて解決するためにVERTを作りました。<br/><br/>動画以外のファイルは完全にデバイス上で変換されるため、サーバーとのやり取りによる遅延もなく、あなたのファイルを覗き見ることもありません。<br/><br/>動画は超高速RTX 4000 Adaサーバーで処理され、変換しなかった場合は1時間以内に削除されます。変換された動画も1時間またはダウンロード完了後に削除されます。"
},
"sponsors": {
"title": "スポンサー",
"description": "私たちを支援したい場合は、[discord_link]Discord[/discord_link]サーバーで開発者に連絡するか、以下のメールアドレスまでご連絡ください。",
"email_copied": "メールアドレスをコピーしました!"
},
"resources": {
"title": "リソース",
"discord": "Discord",
"source": "ソース",
"email": "メール"
},
"donate": {
"title": "VERTを支援する",
"description": "あなたの支援でVERTの維持と改善を続けられます。",
"one_time": "一度きり",
"monthly": "毎月",
"custom": "カスタム",
"pay_now": "今すぐ支払う",
"donate_amount": "${amount} USDを寄付",
"thank_you": "ご支援ありがとうございます!",
"payment_failed": "支払いに失敗しました: {message}{period} 請求は行われていません。",
"donation_error": "寄付の処理中にエラーが発生しました。後でもう一度お試しください。",
"payment_error": "支払い情報の取得中にエラーが発生しました。後でもう一度お試しください。"
},
"credits": {
"title": "クレジット",
"contact_team": "開発チームに連絡したい場合は、「リソース」カードに記載されたメールをご利用ください。",
"notable_contributors": "特筆すべき貢献者",
"notable_description": "VERTに大きく貢献してくださった方々に感謝します。",
"github_contributors": "GitHubの貢献者",
"github_description": "多くの方々に感謝します![github_link]あなたも参加してみませんか?[/github_link]",
"no_contributors": "まだ誰も貢献していないようです… [contribute_link]最初の貢献者になりましょう![/contribute_link]",
"libraries": "ライブラリ",
"libraries_description": "長年にわたり優れたライブラリを提供してくれているFFmpeg(音声・動画)、ImageMagick(画像)、Pandoc(ドキュメント)に感謝します。VERTはこれらに依存して動作しています。",
"roles": {
"lead_developer": "リード開発者;変換バックエンド、UI実装",
"developer": "開発者;UI実装",
"designer": "デザイナー;UX、ブランディング、マーケティング",
"docker_ci": "DockerとCIの保守担当",
"former_cofounder": "元共同創設者・デザイナー"
}
},
"errors": {
"github_contributors": "GitHub貢献者の取得エラー"
}
},
"workers": {
"errors": {
"general": "{file}の変換エラー:{message}",
"cancel": "{file}の変換キャンセルエラー:{message}",
"magick": "Magickワーカーでエラーが発生しました。画像変換が正常に動作しない可能性があります。",
"ffmpeg": "ffmpegの読み込みエラー。一部の機能が動作しない可能性があります。",
"no_audio": "音声ストリームが見つかりません。",
"invalid_rate": "無効なサンプリングレートが指定されました: {rate}Hz"
}
}
}
================================================
FILE: messages/ko.json
================================================
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"navbar": {
"upload": "업로드",
"convert": "변환",
"settings": "설정",
"about": "정보",
"toggle_theme": "테마 전환"
},
"footer": {
"copyright": "© {year} VERT.",
"source_code": "소스 코드",
"discord_server": "Discord 서버",
"privacy_policy": "개인정보 처리방침"
},
"upload": {
"title": "이 파일 변환기,\n 마음에 드실 거예요.",
"subtitle": "모든 이미지, 오디오, 문서 처리는 사용자의 기기에서 이루어집니다. 동영상은 매우 빠른 VERT 전용 서버에서 변환됩니다. 광고나 파일 크기 제한이 전혀 없는 완전한 오픈 소스입니다.",
"uploader": {
"text": "드래그하거나 클릭해서 {action}",
"convert": "변환하기"
},
"cards": {
"title": "VERT가 지원하는 포맷들",
"images": "이미지",
"audio": "오디오",
"documents": "문서",
"video": "동영상",
"video_server_processing": "서버 지원",
"local_supported": "로컬 지원",
"status": {
"text": "<b>상태:</b> {status}",
"ready": "준비됨",
"not_ready": "준비되지 않음",
"not_initialized": "준비 안됨",
"downloading": "다운로드중...",
"initializing": "준비중...",
"unknown": "알 수 없음"
},
"supported_formats": "지원 포맷:"
},
"tooltip": {
"partial_support": "이 형식은 {direction}으로만 변환할 수 있습니다.",
"direction_input": "입력 (from)",
"direction_output": "출력 (to)",
"video_server_processing": "동영상은 기본적으로 처리를 위해 서버로 업로드됩니다. 로컬로 처리하도록 설정하는 방법은 여기에서 확인하세요."
}
},
"convert": {
"archive_file": {
"extracting": "ZIP파일 감지됨: {filename}",
"extracted": "{filename}압축 파일에서 {extract_count}개의 파일을 풀었습니다. {ignore_count}개 항목은 무시되었습니다.",
"extract_error": "{filename}압축 파일 풀던 중 오류 발생: {error}"
},
"external_warning": {
"title": "외부 서버 경고",
"text": "동영상 형식으로 변환을 선택하면 해당 파일은 변환을 위해 지정한 외부 서버로 업로드됩니다. 계속하시겠습니까?",
"yes": "계속",
"no": "아니오"
},
"panel": {
"convert_all": "모두 변환",
"download_all": ".zip으로 다운로드",
"remove_all": "모든 파일 삭제",
"set_all_to": "모두 다음으로 설정",
"na": "N/A"
},
"dropdown": {
"audio": "오디오",
"video": "비디오",
"doc": "문서",
"image": "이미지",
"placeholder": "포맷 검색"
},
"tooltips": {
"unknown_file": "알 수 없는 파일 포맷",
"audio_file": "오디오 파일",
"video_file": "비디오 파일",
"document_file": "문서 파일",
"image_file": "이미지 파일",
"convert_file": "파일 변환하기",
"download_file": "파일 다운로드"
},
"errors": {
"cant_convert": "이 파일을 변환할 수 없습니다.",
"vertd_server": "뭐 하는거임? vertd 서버부터 실행하셈",
"vertd_generic_view": "오류 세부정보 보기",
"vertd_generic_body": "비디오 변환 중 오류가 발생했습니다. 이 비디오를 개발자에게 전송해서 이 버그를 수정하는 데 도움을 주시겠습니까? 오직 비디오 파일만 전송됩니다. 익명으로 처리되며, 다른 개인 정보는 포함되지 않습니다.",
"vertd_generic_title": "비디오 변환 오류",
"vertd_generic_yes": "비디오 전송",
"vertd_generic_no": "전송 안 함",
"vertd_failed_to_keep": "영상을 서버에 저장하는데 실패했습니다: {error}",
"vertd_details": "오류 세부정보 보기",
"vertd_details_body": "제출을 누르면, 검토를 위해 항상 보고되는 오류 로그와 함께 <b>동영상도 첨부</b>됩니다. 아래 정보는 우리가 자동으로 받는 로그입니다:",
"vertd_details_footer": "이 정보는 문제 해결 목적으로만 사용되며 절대 공유되지 않습니다. 자세한 내용은 [privacy_link]개인정보 처리방침[/privacy_link]을 확인하세요.",
"vertd_details_job_id": "<b>작업 ID:</b> {jobId}",
"vertd_details_from": "<b>원본 포맷:</b> {from}",
"vertd_details_to": "<b>변환 포맷:</b> {to}",
"vertd_details_error_message": "<b>오류 메시지:</b> [view_link]오류 로그 보기[/view_link]",
"vertd_details_close": "닫기",
"unsupported_format": "이미지, 비디오, 오디오 및 문서 파일만 지원됩니다.",
"format_output_only": "이 포맷은 현재 입력으로 사용할 수 없으며 (변환된)출력으로만 사용할 수 있습니다.",
"vertd_not_found": "비디오 변환을 시작할 vertd 인스턴스를 찾을 수 없습니다. 인스턴스 URL이 올바르게 설정되었는지 확인해주세요.",
"worker_downloading": "현재 {type} 변환기를 준비하고 있습니다. 잠시 기다려 주십시오.",
"worker_error": "현재 {type} 변환기 준비 중 오류가 발생했습니다. 나중에 다시 시도해 주십시오.",
"worker_timeout": "{type} 변환기를 준비하는데 예상보다 오래 걸리고 있습니다. 잠시 더 기다리거나 페이지를 새로고침해 주세요.",
"audio": "오디오",
"doc": "문서",
"image": "이미지"
}
},
"settings": {
"title": "설정",
"errors": {
"save_failed": "현재 설정을 저장하는데 실패했습니다"
},
"appearance": {
"title": "테마",
"brightness_theme": "테마 변경",
"brightness_description": "걍 알아서",
"light": "라이트 모드",
"dark": "다크 모드",
"effect_settings": "이펙트(효과) 설정",
"effect_description": "동적인 애니메이션이나 이펙트, 아님 정적인거?",
"enable": "켜기",
"disable": "끄기"
},
"conversion": {
"title": "변환",
"advanced_settings": "고급 설정",
"filename_format": "파일 이름 형식",
"filename_description": "다운로드할 파일의 이름을 설정합니다. <b>파일 확장자(포맷)는 포함되지 않습니다.</b> 다음 템플릿을 형식에 넣을 수 있으며, 관련 정보로 대체됩니다: <b>%name%</b> 원본 파일 이름, <b>%extension%</b> 원본 파일 확장자, <b>%date%</b> 파일이 변환된 날짜 문자열.",
"placeholder": "VERT_%name%",
"default_format": "기본 변환 형식",
"default_format_description": "파일 유형의 파일을 업로드할 때 선택되는 기본 형식을 변경합니다.",
"default_format_image": "이미지",
"default_format_video": "비디오",
"default_format_audio
gitextract_zs7t_6zy/ ├── .dockerignore ├── .env.example ├── .github/ │ └── workflows/ │ ├── docker.yml │ └── pages.yml ├── .gitignore ├── .npmignore ├── .prettierignore ├── .prettierrc ├── .vscode/ │ ├── extensions.json │ ├── settings.json │ └── tailwind.json ├── Dockerfile ├── LICENSE ├── README.md ├── docker-compose.yml ├── docs/ │ ├── DOCKER.md │ ├── FAQ.md │ ├── GETTING_STARTED.md │ └── VIDEO_CONVERSION.md ├── eslint.config.js ├── flake.nix ├── messages/ │ ├── ba.json │ ├── de.json │ ├── el.json │ ├── en.json │ ├── es.json │ ├── fr.json │ ├── hr.json │ ├── id.json │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── pt-BR.json │ ├── tr.json │ ├── zh-Hans.json │ └── zh-Hant.json ├── nginx/ │ ├── default-ssl.conf │ └── default.conf ├── package.json ├── postcss.config.js ├── project.inlang/ │ ├── .gitignore │ ├── project_id │ └── settings.json ├── src/ │ ├── app.d.ts │ ├── app.html │ ├── hooks.server.ts │ ├── hooks.ts │ ├── lib/ │ │ ├── assets/ │ │ │ └── style/ │ │ │ └── host-grotesk.css │ │ ├── components/ │ │ │ ├── functional/ │ │ │ │ ├── ConversionPanel.svelte │ │ │ │ ├── Dialog.svelte │ │ │ │ ├── Dropdown.svelte │ │ │ │ ├── FancyInput.svelte │ │ │ │ ├── FancyMenu.svelte │ │ │ │ ├── FormatDropdown.svelte │ │ │ │ ├── Uploader.svelte │ │ │ │ ├── VertdError.svelte │ │ │ │ └── VertdErrorDetails.svelte │ │ │ ├── layout/ │ │ │ │ ├── Dialogs.svelte │ │ │ │ ├── Footer.svelte │ │ │ │ ├── Gradients.svelte │ │ │ │ ├── MobileLogo.svelte │ │ │ │ ├── Navbar/ │ │ │ │ │ ├── Base.svelte │ │ │ │ │ ├── Desktop.svelte │ │ │ │ │ ├── Mobile.svelte │ │ │ │ │ └── index.ts │ │ │ │ ├── PageContent.svelte │ │ │ │ ├── Toasts.svelte │ │ │ │ ├── UploadRegion.svelte │ │ │ │ └── index.ts │ │ │ └── visual/ │ │ │ ├── Panel.svelte │ │ │ ├── ProgressBar.svelte │ │ │ ├── Toast.svelte │ │ │ ├── Tooltip.svelte │ │ │ ├── effects/ │ │ │ │ └── ProgressiveBlur.svelte │ │ │ └── svg/ │ │ │ ├── Logo.svelte │ │ │ ├── LogoBeta.svelte │ │ │ └── VertVBig.svelte │ │ ├── converters/ │ │ │ ├── converter.svelte.ts │ │ │ ├── ffmpeg.svelte.ts │ │ │ ├── index.ts │ │ │ ├── magick-automated.ts │ │ │ ├── magick.svelte.ts │ │ │ ├── pandoc.svelte.ts │ │ │ └── vertd.svelte.ts │ │ ├── css/ │ │ │ └── app.scss │ │ ├── sections/ │ │ │ ├── about/ │ │ │ │ ├── Credits.svelte │ │ │ │ ├── Donate.svelte │ │ │ │ ├── Resources.svelte │ │ │ │ ├── Sponsors.svelte │ │ │ │ ├── Why.svelte │ │ │ │ └── index.ts │ │ │ └── settings/ │ │ │ ├── Appearance.svelte │ │ │ ├── Conversion.svelte │ │ │ ├── Privacy.svelte │ │ │ ├── Vertd.svelte │ │ │ ├── index.svelte.ts │ │ │ └── vertdSettings.svelte.ts │ │ ├── store/ │ │ │ ├── DialogProvider.ts │ │ │ └── index.svelte.ts │ │ ├── types/ │ │ │ ├── conversion-worker.ts │ │ │ ├── file.svelte.ts │ │ │ ├── index.ts │ │ │ └── util.ts │ │ ├── util/ │ │ │ ├── animation.ts │ │ │ ├── consts.ts │ │ │ ├── ip.ts │ │ │ ├── logger.ts │ │ │ ├── parse/ │ │ │ │ ├── ani.ts │ │ │ │ └── icns/ │ │ │ │ └── index.ts │ │ │ ├── sw.ts │ │ │ ├── toast.svelte.ts │ │ │ └── zip.ts │ │ └── workers/ │ │ ├── magick.ts │ │ └── pandoc.ts │ └── routes/ │ ├── +layout.server.ts │ ├── +layout.svelte │ ├── +layout.ts │ ├── +page.svelte │ ├── about/ │ │ └── +page.svelte │ ├── convert/ │ │ └── +page.svelte │ ├── privacy/ │ │ └── +page.svelte │ └── settings/ │ └── +page.svelte ├── static/ │ ├── manifest.json │ ├── pandoc.wasm │ ├── robots.txt │ ├── sitemap.xml │ └── sw.js ├── svelte.config.js ├── tailwind.config.ts ├── tsconfig.json └── vite.config.ts
SYMBOL INDEX (192 symbols across 23 files)
FILE: src/app.d.ts
type EventPayload (line 3) | type EventPayload = {
type CallbackArgs (line 13) | type CallbackArgs = {
type EventOptions (line 17) | type EventOptions = {
type Window (line 29) | interface Window {
type PlausibleInitOptions (line 39) | type PlausibleInitOptions = {
type PlausibleEventData (line 64) | type PlausibleEventData = {
type PlausibleOptions (line 85) | type PlausibleOptions = PlausibleInitOptions & PlausibleEventData;
type TrackEvent (line 109) | type TrackEvent = (
type TrackPageview (line 131) | type TrackPageview = (
type Cleanup (line 139) | type Cleanup = () => void;
type EnableAutoPageviews (line 168) | type EnableAutoPageviews = () => Cleanup;
type EnableAutoOutboundTracking (line 201) | type EnableAutoOutboundTracking = (
type HTMLAttributes (line 256) | interface HTMLAttributes<T> {
FILE: src/lib/converters/converter.svelte.ts
type WorkerStatus (line 3) | type WorkerStatus = "not-ready" | "downloading" | "ready" | "error";
class FormatInfo (line 5) | class FormatInfo {
method constructor (line 8) | constructor(
class Converter (line 28) | class Converter {
method constructor (line 43) | constructor(public readonly timeout: number = 10) {
method startTimeout (line 47) | private startTimeout() {
method clearTimeout (line 53) | protected clearTimeout() {
method convert (line 65) | public async convert(
method cancel (line 81) | public async cancel(input: VertFile): Promise<void> {
method valid (line 85) | public async valid(): Promise<boolean> {
method formatStrings (line 89) | public formatStrings(predicate?: (f: FormatInfo) => boolean) {
FILE: src/lib/converters/ffmpeg.svelte.ts
class FFmpegConverter (line 36) | class FFmpegConverter extends Converter {
method constructor (line 78) | constructor() {
method convert (line 108) | public async convert(input: VertFile, to: string): Promise<VertFile> {
method cancel (line 193) | public async cancel(input: VertFile): Promise<void> {
method setupFFmpeg (line 212) | private async setupFFmpeg(input: VertFile): Promise<FFmpeg> {
method detectAudioBitrate (line 233) | private async detectAudioBitrate(ffmpeg: FFmpeg): Promise<number | nul...
method detectAudioSampleRate (line 273) | private async detectAudioSampleRate(
method buildConversionCommand (line 315) | private async buildConversionCommand(
method extractAlbumArt (line 529) | private async extractAlbumArt(ffmpeg: FFmpeg): Promise<boolean> {
method tryExtractAlbumArt (line 578) | private async tryExtractAlbumArt(
constant CONVERSION_BITRATES (line 701) | const CONVERSION_BITRATES = [
type ConversionBitrate (line 711) | type ConversionBitrate = (typeof CONVERSION_BITRATES)[number];
constant SAMPLE_RATES (line 713) | const SAMPLE_RATES = [
type SampleRate (line 724) | type SampleRate = (typeof SAMPLE_RATES)[number];
FILE: src/lib/converters/index.ts
function getConverterByFormat (line 25) | function getConverterByFormat(format: string) {
FILE: src/lib/converters/magick.svelte.ts
class MagickConverter (line 12) | class MagickConverter extends Converter {
method constructor (line 82) | constructor() {
method initializeWasm (line 89) | private async initializeWasm() {
method convert (line 115) | public async convert(
method cancel (line 235) | public async cancel(input: VertFile): Promise<void> {
method waitForMessage (line 255) | private waitForMessage(worker: Worker, type?: string): Promise<any> {
method svgToImage (line 284) | private async svgToImage(input: VertFile): Promise<Blob> {
FILE: src/lib/converters/pandoc.svelte.ts
class PandocConverter (line 9) | class PandocConverter extends Converter {
method constructor (line 16) | constructor() {
method convert (line 41) | public async convert(file: VertFile, to: string): Promise<VertFile> {
method cancel (line 113) | public async cancel(input: VertFile): Promise<void> {
function waitForMessage (line 149) | function waitForMessage(worker: Worker, type?: string): Promise<any> {
FILE: src/lib/converters/vertd.svelte.ts
type UploadResponse (line 10) | interface UploadResponse {
type RouteRequestMap (line 19) | interface RouteRequestMap {
type RouteResponseMap (line 26) | interface RouteResponseMap {
type ConversionSpeed (line 74) | type ConversionSpeed =
type StartJobMessage (line 82) | interface StartJobMessage {
type ErrorMessage (line 93) | interface ErrorMessage {
type ProgressMessage (line 100) | interface ProgressMessage {
type CompletedMessage (line 105) | interface CompletedMessage {
type CancelJobMessage (line 112) | interface CancelJobMessage {
type JobCancelledMessage (line 120) | interface JobCancelledMessage {
type FpsProgress (line 127) | interface FpsProgress {
type FrameProgress (line 132) | interface FrameProgress {
type ProgressData (line 137) | type ProgressData = FpsProgress | FrameProgress;
type VertdMessage (line 139) | type VertdMessage =
class VertdConverter (line 236) | class VertdConverter extends Converter {
method constructor (line 284) | constructor() {
method blocked (line 292) | private blocked(hash: string): boolean {
method failure (line 321) | private failure(hash: string): void {
method convert (line 338) | public async convert(input: VertFile, to: string): Promise<VertFile> {
method cancel (line 444) | public async cancel(input: VertFile): Promise<void> {
method valid (line 477) | public async valid(): Promise<boolean> {
FILE: src/lib/sections/settings/index.svelte.ts
type DefaultFormats (line 13) | interface DefaultFormats {
type ISettings (line 19) | interface ISettings {
class Settings (line 34) | class Settings {
method save (line 57) | public save() {
method load (line 62) | public load() {
FILE: src/lib/sections/settings/vertdSettings.svelte.ts
constant LOCATIONS (line 5) | const LOCATIONS = [
type VertdInner (line 34) | type VertdInner =
class VertdInstance (line 40) | class VertdInstance {
method save (line 49) | public save() {
method load (line 53) | public load() {
method innerData (line 74) | public innerData() {
method set (line 78) | public set(inner: VertdInner) {
method url (line 83) | public async url() {
method geographicallyOptimalInstance (line 129) | private geographicallyOptimalInstance(ip: IpInfo) {
FILE: src/lib/store/DialogProvider.ts
type DialogType (line 4) | type DialogType = "success" | "error" | "info" | "warning";
type BaseDialog (line 6) | type BaseDialog = {
type StringDialog (line 16) | type StringDialog = BaseDialog & {
type ComponentDialog (line 20) | type ComponentDialog<T = unknown> = BaseDialog & {
type Dialog (line 25) | type Dialog<T = unknown> = StringDialog | ComponentDialog<T>;
type DialogProps (line 27) | type DialogProps<T = unknown> = {
function addDialog (line 42) | function addDialog(
function removeDialog (line 75) | function removeDialog(id: number) {
FILE: src/lib/store/index.svelte.ts
class Files (line 15) | class Files {
method _generateThumbnailFromMedia (line 85) | private async _generateThumbnailFromMedia(
method _handleZipFile (line 142) | private async _handleZipFile(file: File): Promise<void> {
method _add (line 238) | private async _add(file: VertFile | File) {
method add (line 339) | public add(
method convertAll (line 352) | public async convertAll() {
method downloadAll (line 359) | public async downloadAll() {
function setTheme (line 405) | function setTheme(themeTo: "light" | "dark") {
function setEffects (line 423) | function setEffects(effectsEnabled: boolean) {
function updateLocale (line 459) | function updateLocale(newLocale: string) {
function link (line 470) | function link(
function sanitize (line 503) | function sanitize(
function findFirstPositive (line 531) | function findFirstPositive(
constant MAX_ARRAY_BUFFER_SIZE (line 575) | const MAX_ARRAY_BUFFER_SIZE = getMaxArrayBufferSize();
FILE: src/lib/types/conversion-worker.ts
type ConvertMessage (line 3) | interface ConvertMessage {
type FinishedMessage (line 16) | interface FinishedMessage {
type LoadMessage (line 22) | interface LoadMessage {
type LoadedMessage (line 27) | interface LoadedMessage {
type ReadyMessage (line 31) | interface ReadyMessage {
type ErrorMessage (line 35) | interface ErrorMessage {
type WorkerMessage (line 40) | type WorkerMessage = (
FILE: src/lib/types/file.svelte.ts
class VertFile (line 8) | class VertFile {
method from (line 12) | public get from() {
method name (line 16) | public get name() {
method findConverters (line 35) | public findConverters(supportedFormats: string[] = [this.from]) {
method findConverter (line 46) | public findConverter() {
method isLarge (line 71) | public isLarge(): boolean {
method supportsStreaming (line 75) | public supportsStreaming(): boolean {
method constructor (line 82) | constructor(file: File, to: string, blobUrl?: string) {
method convert (line 99) | public async convert(...args: any[]) {
method convertZip (line 123) | private async convertZip(converter: Converter): Promise<VertFile> {
method cancel (line 212) | public async cancel() {
method toastErr (line 226) | private toastErr(err: unknown) {
method download (line 270) | public async download() {
method hash (line 307) | public hash(): Promise<string> {
type Categories (line 342) | interface Categories {
FILE: src/lib/types/util.ts
type OmitBetterStrict (line 1) | type OmitBetterStrict<T, K extends keyof T> = T extends unknown
FILE: src/lib/util/animation.ts
function initStores (line 15) | function initStores() {
function fade (line 29) | function fade(node: HTMLElement, options: FadeParams) {
function fly (line 35) | function fly(node: HTMLElement, options: FlyParams) {
function is_function (line 42) | function is_function(thing: unknown): thing is Function {
type Params (line 46) | type Params = FlipParams & {};
function flip (line 54) | function flip(
FILE: src/lib/util/consts.ts
constant GITHUB_URL_VERT (line 3) | const GITHUB_URL_VERT = "https://github.com/VERT-sh/VERT";
constant GITHUB_URL_VERTD (line 4) | const GITHUB_URL_VERTD = "https://github.com/VERT-sh/vertd";
constant GITHUB_API_URL (line 5) | const GITHUB_API_URL = "https://api.github.com/repos/VERT-sh/VERT";
constant DISCORD_URL (line 6) | const DISCORD_URL = "https://discord.gg/kqevGxYPak";
constant VERT_NAME (line 7) | const VERT_NAME =
constant CONTACT_EMAIL (line 13) | const CONTACT_EMAIL = "hello@vert.sh";
constant DISABLE_ALL_EXTERNAL_REQUESTS (line 16) | const DISABLE_ALL_EXTERNAL_REQUESTS =
FILE: src/lib/util/ip.ts
type IpInfo (line 3) | interface IpInfo {
FILE: src/lib/util/parse/ani.ts
type Chunk (line 11) | type Chunk = {
type AniMetadata (line 22) | type AniMetadata = {
type ParsedAni (line 34) | type ParsedAni = {
constant DWORD (line 43) | const DWORD = { bits: 32, be: false, signed: false, fp: false };
function parseAni (line 45) | function parseAni(arr: Uint8Array): ParsedAni {
FILE: src/lib/util/sw.ts
type CacheInfo (line 3) | interface CacheInfo {
class ServiceWorkerManager (line 13) | class ServiceWorkerManager {
method init (line 17) | async init(): Promise<void> {
method getCacheInfo (line 39) | async getCacheInfo(): Promise<CacheInfo> {
method clearCache (line 65) | async clearCache(): Promise<void> {
method formatSize (line 94) | formatSize(bytes: number): string {
FILE: src/lib/util/toast.svelte.ts
type ToastType (line 3) | type ToastType = "success" | "error" | "info" | "warning";
type BaseToast (line 21) | type BaseToast = {
type StringToast (line 32) | type StringToast = BaseToast & {
type ComponentToast (line 36) | type ComponentToast<T> = BaseToast & {
type Toast (line 41) | type Toast<T = unknown> = StringToast | ComponentToast<T>;
type ToastProps (line 43) | type ToastProps<T = unknown> = Omit<ComponentToast<T>, "disappearing">;
type ToastExports (line 45) | type ToastExports = {
type ToastComponent (line 49) | type ToastComponent<T> = Component<ToastProps<T>, ToastExports>;
type RecursivePartial (line 63) | type RecursivePartial<T> = {
type BaseToastOptions (line 71) | type BaseToastOptions = Omit<RecursivePartial<BaseToast>, "id"> & {
type StringToastOptions (line 75) | type StringToastOptions = BaseToastOptions & {
type ComponentToastOptions (line 79) | type ComponentToastOptions<T> = BaseToastOptions & {
type ToastOptions (line 84) | type ToastOptions<T = unknown> =
class ToastState (line 149) | class ToastState {
method add (line 153) | public add<T>(toast: Toast<T>) {
method remove (line 157) | public remove(id: number) {
method id (line 161) | public id(): number {
method toasts (line 165) | public get toasts() {
class ToastManager (line 170) | class ToastManager {
method add (line 173) | public static add<T = unknown>(toastOptions: ToastOptions<T>): number {
method remove (line 218) | public static remove(id: number) {
method toasts (line 222) | public static get toasts() {
FILE: src/lib/util/zip.ts
type ZipEntry (line 5) | interface ZipEntry {
function extractZip (line 10) | async function extractZip(file: File): Promise<ZipEntry[]> {
function createZip (line 37) | async function createZip(files: File[]): Promise<Uint8Array> {
function ignoreEntry (line 43) | function ignoreEntry(filename: string): boolean {
FILE: src/lib/workers/pandoc.ts
type Format (line 25) | type Format =
function pandoc (line 123) | async function pandoc(
type PandocEntries (line 335) | type PandocEntries = Map<string, PandocFsEntry>;
type PandocFile (line 337) | interface PandocFile {
type PandocFolder (line 342) | interface PandocFolder {
type PandocFsEntry (line 347) | type PandocFsEntry = PandocFile | PandocFolder;
FILE: static/sw.js
constant CACHE_NAME (line 1) | const CACHE_NAME = "vert-wasm-cache-v2";
constant WASM_FILES (line 3) | const WASM_FILES = [
constant WASM_URL_PATTERNS (line 9) | const WASM_URL_PATTERNS = [
function shouldCacheUrl (line 15) | function shouldCacheUrl(url) {
Condensed preview — 131 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (650K chars).
[
{
"path": ".dockerignore",
"chars": 177,
"preview": "node_modules/\nbuild/\ndist/\n.svelte-kit/\n.output/\n.vercel/\n.vscode/\n\nLICENSE\nREADME.md\nDockerfile\ndocker-compose.yml\n.npm"
},
{
"path": ".env.example",
"chars": 1274,
"preview": "# The hostname used for analytics tracking (currently only used by Plausible)\nPUB_HOSTNAME=localhost:5173\n\n# URL for you"
},
{
"path": ".github/workflows/docker.yml",
"chars": 2580,
"preview": "name: Docker Image CI\n\non:\n push:\n branches: [\"main\"]\n tags: [\"v*\"]\n paths:\n - \"src/*"
},
{
"path": ".github/workflows/pages.yml",
"chars": 1532,
"preview": "name: Deploy to GitHub Pages\n\non:\n push:\n branches: \"main\"\n\njobs:\n build_site:\n runs-on: ubuntu-late"
},
{
"path": ".gitignore",
"chars": 204,
"preview": "node_modules\n\n# Output\n.output\n.vercel\n/.svelte-kit\n/build\n\n# OS\n.DS_Store\nThumbs.db\n\n# Env\n.env\n.env.*\n!.env.example\n!."
},
{
"path": ".npmignore",
"chars": 36,
"preview": "src/routes\nsrc/app.d.ts\nsrc/app.html"
},
{
"path": ".prettierignore",
"chars": 62,
"preview": "# Package Managers\npackage-lock.json\npnpm-lock.yaml\nyarn.lock\n"
},
{
"path": ".prettierrc",
"chars": 179,
"preview": "{\n\t\"useTabs\": true,\n\t\"tabWidth\": 4,\n\t\"singleQuote\": false,\n\t\"plugins\": [\"prettier-plugin-svelte\"],\n \"overrides\": [{ \""
},
{
"path": ".vscode/extensions.json",
"chars": 61,
"preview": "{\n \"recommendations\": [\n \"inlang.vs-code-extension\"\n ]\n}"
},
{
"path": ".vscode/settings.json",
"chars": 49,
"preview": "{\n\t\"css.customData\": [\".vscode/tailwind.json\"]\n}\n"
},
{
"path": ".vscode/tailwind.json",
"chars": 2122,
"preview": "{\n\t\"version\": 1.1,\n\t\"atDirectives\": [\n\t\t{\n\t\t\t\"name\": \"@tailwind\",\n\t\t\t\"description\": \"Use the `@tailwind` directive to in"
},
{
"path": "Dockerfile",
"chars": 1048,
"preview": "FROM oven/bun AS builder\n\nWORKDIR /app\n\nARG PUB_ENV\nARG PUB_HOSTNAME\nARG PUB_PLAUSIBLE_URL\nARG PUB_VERTD_URL\nARG PUB_DIS"
},
{
"path": "LICENSE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 2006,
"preview": "<p align=\"center\">\n <img src=\"https://github.com/user-attachments/assets/bf441748-0ec5-4c8a-b3e5-11301ee3f0bd\" alt=\"VER"
},
{
"path": "docker-compose.yml",
"chars": 683,
"preview": "services:\n vert:\n container_name: vert\n image: ghcr.io/vert-sh/vert:latest\n build:\n context: .\n args"
},
{
"path": "docs/DOCKER.md",
"chars": 2152,
"preview": "## Using Docker\n\nThis file covers how to run VERT under a Docker container.\n\n- [Manually building the image](#manually-b"
},
{
"path": "docs/FAQ.md",
"chars": 2455,
"preview": "## FAQ\n\nThis file covers frequently asked questions.\n\n- [Why VERT?](#why-vert)\n- [What happens with video files?](#what-"
},
{
"path": "docs/GETTING_STARTED.md",
"chars": 1155,
"preview": "## Getting Started\n\nThis file covers how to get started with VERT.\n\n- [Prerequisites](#prerequisites)\n- [Installation](#"
},
{
"path": "docs/VIDEO_CONVERSION.md",
"chars": 1377,
"preview": "## Video conversion\n\nThis file covers how video conversion works when using VERT.\n\nOn VERT, video uploads to a server fo"
},
{
"path": "eslint.config.js",
"chars": 611,
"preview": "import prettier from 'eslint-config-prettier';\nimport js from '@eslint/js';\nimport svelte from 'eslint-plugin-svelte';\ni"
},
{
"path": "flake.nix",
"chars": 581,
"preview": "{\n description = \"VERT.sh\";\n\n inputs = {\n nixpkgs.url = \"github:nixos/nixpkgs?ref=nixos-unstable\";\n flake-utils."
},
{
"path": "messages/ba.json",
"chars": 17444,
"preview": "{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"navbar\": {\n \"upload\": \"Učitaj\",\n \"convert\": \""
},
{
"path": "messages/de.json",
"chars": 20793,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Hochladen\",\n\t\t\"convert\": \"Kon"
},
{
"path": "messages/el.json",
"chars": 12980,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Μεταφόρτωση\",\n\t\t\"convert\": \"Μ"
},
{
"path": "messages/en.json",
"chars": 19162,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Upload\",\n\t\t\"convert\": \"Conver"
},
{
"path": "messages/es.json",
"chars": 12112,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Subir\",\n\t\t\"convert\": \"Convert"
},
{
"path": "messages/fr.json",
"chars": 11643,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Transférer\",\n\t\t\"convert\": \"Co"
},
{
"path": "messages/hr.json",
"chars": 10300,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Prenesi\",\n\t\t\"convert\": \"Pretv"
},
{
"path": "messages/id.json",
"chars": 11996,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Unggah\",\n\t\t\"convert\": \"Konver"
},
{
"path": "messages/it.json",
"chars": 12633,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Carica\",\n\t\t\"convert\": \"Conver"
},
{
"path": "messages/ja.json",
"chars": 7592,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"アップロード\",\n\t\t\"convert\": \"変換\",\n\t"
},
{
"path": "messages/ko.json",
"chars": 11799,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"업로드\",\n\t\t\"convert\": \"변환\",\n\t\t\"s"
},
{
"path": "messages/pt-BR.json",
"chars": 20830,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Upload\",\n\t\t\"convert\": \"Conver"
},
{
"path": "messages/tr.json",
"chars": 11864,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"Yükle\",\n\t\t\"convert\": \"Dönüştü"
},
{
"path": "messages/zh-Hans.json",
"chars": 10338,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"上传\",\n\t\t\"convert\": \"转换\",\n\t\t\"se"
},
{
"path": "messages/zh-Hant.json",
"chars": 10383,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n\t\"navbar\": {\n\t\t\"upload\": \"上傳\",\n\t\t\"convert\": \"轉換\",\n\t\t\"se"
},
{
"path": "nginx/default-ssl.conf",
"chars": 848,
"preview": "server {\n listen 80;\n server_name vert;\n\n # Redirect all HTTP traffic to HTTPS\n return 301 https://$host$req"
},
{
"path": "nginx/default.conf",
"chars": 546,
"preview": "server {\n listen 80;\n listen [::]:80;\n server_name vert;\n\n root /usr/share/nginx/html;\n index index.html;"
},
{
"path": "package.json",
"chars": 2040,
"preview": "{\n\t\"name\": \"vert\",\n\t\"version\": \"0.0.1\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"dev\": \"vite dev\",\n\t\t\"build\": \"paraglide-js c"
},
{
"path": "postcss.config.js",
"chars": 73,
"preview": "export default {\n\tplugins: {\n\t\ttailwindcss: {},\n\t\tautoprefixer: {}\n\t}\n};\n"
},
{
"path": "project.inlang/.gitignore",
"chars": 5,
"preview": "cache"
},
{
"path": "project.inlang/project_id",
"chars": 18,
"preview": "ff77Td2rnvEqQyzBYT"
},
{
"path": "project.inlang/settings.json",
"chars": 495,
"preview": "{\n\t\"$schema\": \"https://inlang.com/schema/project-settings\",\n\t\"baseLocale\": \"en\",\n\t\"locales\": [\n\t\t\"en\",\n\t\t\"es\",\n\t\t\"fr\",\n\t"
},
{
"path": "src/app.d.ts",
"chars": 6343,
"preview": "import \"@poppanator/sveltekit-svg/dist/svg\";\n\ntype EventPayload = {\n\treadonly n: string;\n\treadonly u: Location[\"href\"];\n"
},
{
"path": "src/app.html",
"chars": 1600,
"preview": "<!doctype html>\r\n<html lang=\"%lang%\">\r\n\t<head>\r\n\t\t<meta charset=\"utf-8\" />\r\n\t\t<meta name=\"viewport\" content=\"width=devic"
},
{
"path": "src/hooks.server.ts",
"chars": 521,
"preview": "import type { Handle } from \"@sveltejs/kit\";\nimport { paraglideMiddleware } from \"$lib/paraglide/server\";\n\n// creating a"
},
{
"path": "src/hooks.ts",
"chars": 198,
"preview": "import type { Reroute } from \"@sveltejs/kit\";\nimport { deLocalizeUrl } from \"$lib/paraglide/runtime\";\n\nexport const rero"
},
{
"path": "src/lib/assets/style/host-grotesk.css",
"chars": 966,
"preview": "@font-face {\n\tfont-family: \"Host Grotesk\";\n\tfont-style: normal;\n\tfont-weight: 400;\n\tsrc: url(\"$lib/assets/font/HostGrote"
},
{
"path": "src/lib/components/functional/ConversionPanel.svelte",
"chars": 3388,
"preview": "<script lang=\"ts\">\n\timport { effects, files, isMobile } from \"$lib/store/index.svelte\";\n\timport { FolderArchiveIcon, Ref"
},
{
"path": "src/lib/components/functional/Dialog.svelte",
"chars": 2126,
"preview": "<script lang=\"ts\">\n\timport { duration, fade, fly } from \"$lib/util/animation\";\n\timport { removeDialog } from \"$lib/store"
},
{
"path": "src/lib/components/functional/Dropdown.svelte",
"chars": 3035,
"preview": "<script lang=\"ts\">\n\timport { duration, fade, transition } from \"$lib/util/animation\";\n\timport { ChevronDown } from \"luci"
},
{
"path": "src/lib/components/functional/FancyInput.svelte",
"chars": 1134,
"preview": "<script lang=\"ts\">\n\ttype Props = {\n\t\tclass?: string;\n\t\tplaceholder?: string;\n\t\tvalue?: string;\n\t\tdisabled?: boolean;\n\t\te"
},
{
"path": "src/lib/components/functional/FancyMenu.svelte",
"chars": 2232,
"preview": "<script lang=\"ts\">\n\timport { browser } from \"$app/environment\";\n\timport { page } from \"$app/stores\";\n\timport { duration,"
},
{
"path": "src/lib/components/functional/FormatDropdown.svelte",
"chars": 14089,
"preview": "<script lang=\"ts\">\n\timport { duration, fade, transition } from \"$lib/util/animation\";\n\timport { m } from \"$lib/paraglide"
},
{
"path": "src/lib/components/functional/Uploader.svelte",
"chars": 2171,
"preview": "<script lang=\"ts\">\n\timport { UploadIcon } from \"lucide-svelte\";\n\timport Panel from \"../visual/Panel.svelte\";\n\timport cls"
},
{
"path": "src/lib/components/functional/VertdError.svelte",
"chars": 2414,
"preview": "<script lang=\"ts\" module>\n\texport interface VertdErrorProps {\n\t\tjobId: string;\n\t\tauth: string;\n\t\tfrom?: string;\n\t\tto?: s"
},
{
"path": "src/lib/components/functional/VertdErrorDetails.svelte",
"chars": 1476,
"preview": "<script lang=\"ts\">\n\timport { m } from \"$lib/paraglide/messages\";\n\timport type { DialogProps } from \"$lib/store/DialogPro"
},
{
"path": "src/lib/components/layout/Dialogs.svelte",
"chars": 742,
"preview": "<script lang=\"ts\">\n\timport { duration, fade } from \"$lib/util/animation\";\n\timport { quintOut } from \"svelte/easing\";\n\tim"
},
{
"path": "src/lib/components/layout/Footer.svelte",
"chars": 1494,
"preview": "<script lang=\"ts\">\n\timport { GITHUB_URL_VERT, DISCORD_URL } from \"$lib/util/consts\";\n\timport { m } from \"$lib/paraglide/"
},
{
"path": "src/lib/components/layout/Gradients.svelte",
"chars": 4327,
"preview": "<script lang=\"ts\">\n\timport { page } from \"$app/state\";\n\timport { duration, transition } from \"$lib/util/animation\";\n\timp"
},
{
"path": "src/lib/components/layout/MobileLogo.svelte",
"chars": 405,
"preview": "<script>\n\timport Logo from \"$lib/components/visual/svg/Logo.svelte\";\n</script>\n\n<div class=\"flex md:hidden justify-cente"
},
{
"path": "src/lib/components/layout/Navbar/Base.svelte",
"chars": 5680,
"preview": "<script lang=\"ts\">\r\n\timport { browser } from \"$app/environment\";\r\n\timport { page } from \"$app/state\";\r\n\timport { duratio"
},
{
"path": "src/lib/components/layout/Navbar/Desktop.svelte",
"chars": 143,
"preview": "<script lang=\"ts\">\n\timport Navbar from \"./Base.svelte\";\n</script>\n\n<div class=\"hidden md:flex p-8 w-screen justify-cente"
},
{
"path": "src/lib/components/layout/Navbar/Mobile.svelte",
"chars": 232,
"preview": "<script lang=\"ts\">\n\timport Navbar from \"./Base.svelte\";\n</script>\n\n<div class=\"fixed md:hidden bottom-0 left-0 w-screen "
},
{
"path": "src/lib/components/layout/Navbar/index.ts",
"chars": 108,
"preview": "export { default as Desktop } from \"./Desktop.svelte\";\nexport { default as Mobile } from \"./Mobile.svelte\";\n"
},
{
"path": "src/lib/components/layout/PageContent.svelte",
"chars": 979,
"preview": "<script lang=\"ts\">\n\timport { page } from \"$app/state\";\n\timport { duration } from \"$lib/util/animation\";\n\timport { goingL"
},
{
"path": "src/lib/components/layout/Toasts.svelte",
"chars": 361,
"preview": "<script lang=\"ts\">\n\timport Toast from \"$lib/components/visual/Toast.svelte\";\n\timport { ToastManager } from \"$lib/util/to"
},
{
"path": "src/lib/components/layout/UploadRegion.svelte",
"chars": 824,
"preview": "<script lang=\"ts\">\n\timport { duration, fade } from \"$lib/util/animation\";\n\timport { dropping, effects } from \"$lib/store"
},
{
"path": "src/lib/components/layout/index.ts",
"chars": 409,
"preview": "export { default as UploadRegion } from \"./UploadRegion.svelte\";\nexport { default as Gradients } from \"./Gradients.svelt"
},
{
"path": "src/lib/components/visual/Panel.svelte",
"chars": 289,
"preview": "<script lang=\"ts\">\n\timport type { Snippet } from \"svelte\";\n\n\ttype Props = {\n\t\tclass?: string;\n\t\tchildren: Snippet<[]>;\n\t"
},
{
"path": "src/lib/components/visual/ProgressBar.svelte",
"chars": 953,
"preview": "<script lang=\"ts\">\n\ttype Props = {\n\t\tprogress: number | null;\n\t\tmin: number;\n\t\tmax: number;\n\t};\n\n\tlet { progress, min, m"
},
{
"path": "src/lib/components/visual/Toast.svelte",
"chars": 2467,
"preview": "<script lang=\"ts\">\n\timport { fade, fly } from \"$lib/util/animation\";\n\timport {\n\t\tBanIcon,\n\t\tCheckIcon,\n\t\tInfoIcon,\n\t\tTri"
},
{
"path": "src/lib/components/visual/Tooltip.svelte",
"chars": 4362,
"preview": "<script lang=\"ts\">\n\timport { fade } from \"$lib/util/animation\";\n\tinterface Props {\n\t\tchildren: () => any;\n\t\ttext: string"
},
{
"path": "src/lib/components/visual/effects/ProgressiveBlur.svelte",
"chars": 1682,
"preview": "<script lang=\"ts\">\n\ttype Props = {\n\t\titerations: number;\n\t\tendIntensity: number;\n\t\tdirection: \"top\" | \"left\" | \"bottom\" "
},
{
"path": "src/lib/components/visual/svg/Logo.svelte",
"chars": 1463,
"preview": "<svg\n\twidth=\"100%\"\n\theight=\"100%\"\n\tviewBox=\"0 0 300 83\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink="
},
{
"path": "src/lib/components/visual/svg/LogoBeta.svelte",
"chars": 2906,
"preview": "<svg\n\twidth=\"100%\"\n\theight=\"100%\"\n\tviewBox=\"0 0 303 72\"\n\tstyle=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:roun"
},
{
"path": "src/lib/components/visual/svg/VertVBig.svelte",
"chars": 1460,
"preview": "<svg\n\twidth=\"1389\"\n\theight=\"1080\"\n\tviewBox=\"0 0 1389 1080\"\n\tfill=\"none\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n>\n\t<path\n\t\td"
},
{
"path": "src/lib/converters/converter.svelte.ts",
"chars": 2278,
"preview": "import type { VertFile } from \"$lib/types\";\n\nexport type WorkerStatus = \"not-ready\" | \"downloading\" | \"ready\" | \"error\";"
},
{
"path": "src/lib/converters/ffmpeg.svelte.ts",
"chars": 17018,
"preview": "import { VertFile } from \"$lib/types\";\nimport { Converter, FormatInfo } from \"./converter.svelte\";\nimport { FFmpeg } fro"
},
{
"path": "src/lib/converters/index.ts",
"chars": 2080,
"preview": "import type { Categories } from \"$lib/types\";\nimport type { Converter } from \"./converter.svelte\";\nimport { FFmpegConver"
},
{
"path": "src/lib/converters/magick-automated.ts",
"chars": 6168,
"preview": "import { FormatInfo } from \"./converter.svelte\";\n\n// formats added from maya's somewhat automated testing\n// placed into"
},
{
"path": "src/lib/converters/magick.svelte.ts",
"chars": 9760,
"preview": "import { browser } from \"$app/environment\";\nimport { error, log } from \"$lib/util/logger\";\nimport { m } from \"$lib/parag"
},
{
"path": "src/lib/converters/pandoc.svelte.ts",
"chars": 4231,
"preview": "import { VertFile, type WorkerMessage } from \"$lib/types\";\nimport { Converter, FormatInfo } from \"./converter.svelte\";\ni"
},
{
"path": "src/lib/converters/vertd.svelte.ts",
"chars": 11487,
"preview": "import VertdErrorComponent from \"$lib/components/functional/VertdError.svelte\";\nimport { error, log } from \"$lib/util/lo"
},
{
"path": "src/lib/css/app.scss",
"chars": 10849,
"preview": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@import url(@fontsource/radio-canada-big/600.css);\n@import u"
},
{
"path": "src/lib/sections/about/Credits.svelte",
"chars": 3609,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport { HeartHandshakeIcon } from \"lucide"
},
{
"path": "src/lib/sections/about/Donate.svelte",
"chars": 9402,
"preview": "<script lang=\"ts\" module>\n\texport interface Donor {\n\t\tname: string;\n\t\tamount: number;\n\t\tavatar: string;\n\t}\n</script>\n\n<s"
},
{
"path": "src/lib/sections/about/Resources.svelte",
"chars": 1685,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport { CONTACT_EMAIL, DISCORD_URL, GITHU"
},
{
"path": "src/lib/sections/about/Sponsors.svelte",
"chars": 2324,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport { PiggyBankIcon, CopyIcon, CheckIco"
},
{
"path": "src/lib/sections/about/Why.svelte",
"chars": 607,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport { MessageCircleQuestionIcon } from "
},
{
"path": "src/lib/sections/about/index.ts",
"chars": 271,
"preview": "export { default as Credits } from \"./Credits.svelte\";\nexport { default as Donate } from \"./Donate.svelte\";\nexport { def"
},
{
"path": "src/lib/sections/settings/Appearance.svelte",
"chars": 5716,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport {\n\t\ttheme,\n\t\teffects,\n\t\tsetEffects,"
},
{
"path": "src/lib/sections/settings/Conversion.svelte",
"chars": 9659,
"preview": "<script lang=\"ts\">\n\timport FancyTextInput from \"$lib/components/functional/FancyInput.svelte\";\n\timport Panel from \"$lib/"
},
{
"path": "src/lib/sections/settings/Privacy.svelte",
"chars": 7521,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport {\n\t\tChartColumnIcon,\n\t\tPauseIcon,\n\t"
},
{
"path": "src/lib/sections/settings/Vertd.svelte",
"chars": 6127,
"preview": "<script lang=\"ts\">\n\timport Panel from \"$lib/components/visual/Panel.svelte\";\n\timport { GITHUB_URL_VERTD } from \"$lib/uti"
},
{
"path": "src/lib/sections/settings/index.svelte.ts",
"chars": 2369,
"preview": "import { PUB_VERTD_URL } from \"$env/static/public\";\nimport type { ConversionBitrate } from \"$lib/converters/ffmpeg.svelt"
},
{
"path": "src/lib/sections/settings/vertdSettings.svelte.ts",
"chars": 3331,
"preview": "import { ip, type IpInfo } from \"$lib/util/ip\";\nimport { Settings } from \"./index.svelte\";\nimport { PUB_VERTD_URL } from"
},
{
"path": "src/lib/store/DialogProvider.ts",
"chars": 1521,
"preview": "import type { Component } from \"svelte\";\nimport { writable } from \"svelte/store\";\n\ntype DialogType = \"success\" | \"error\""
},
{
"path": "src/lib/store/index.svelte.ts",
"chars": 16420,
"preview": "import { browser } from \"$app/environment\";\nimport { byNative, converters } from \"$lib/converters\";\nimport { error, log "
},
{
"path": "src/lib/types/conversion-worker.ts",
"chars": 855,
"preview": "import { VertFile } from \"./file.svelte\";\r\n\r\ninterface ConvertMessage {\r\n\ttype: \"convert\";\r\n\tinput: {\r\n\t\tfile: File;\r\n\t\t"
},
{
"path": "src/lib/types/file.svelte.ts",
"chars": 9353,
"preview": "import { byNative, converters } from \"$lib/converters\";\nimport type { Converter } from \"$lib/converters/converter.svelte"
},
{
"path": "src/lib/types/index.ts",
"chars": 92,
"preview": "export * from \"./file.svelte\";\nexport * from \"./util\";\nexport * from \"./conversion-worker\";\n"
},
{
"path": "src/lib/types/util.ts",
"chars": 113,
"preview": "export type OmitBetterStrict<T, K extends keyof T> = T extends unknown\n\t? Pick<T, Exclude<keyof T, K>>\n\t: never;\n"
},
{
"path": "src/lib/util/animation.ts",
"chars": 2507,
"preview": "import { isMobile, effects } from \"$lib/store/index.svelte\";\nimport type { AnimationConfig, FlipParams } from \"svelte/an"
},
{
"path": "src/lib/util/consts.ts",
"chars": 774,
"preview": "import { PUB_DISABLE_ALL_EXTERNAL_REQUESTS, PUB_ENV } from \"$env/static/public\";\n\nexport const GITHUB_URL_VERT = \"https:"
},
{
"path": "src/lib/util/ip.ts",
"chars": 1710,
"preview": "import { browser } from \"$app/environment\";\n\nexport interface IpInfo {\n\tip: string;\n\tnetwork: string;\n\tversion: string;\n"
},
{
"path": "src/lib/util/logger.ts",
"chars": 2023,
"preview": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { browser } from \"$app/environment\";\n\nconst randomColorFr"
},
{
"path": "src/lib/util/parse/ani.ts",
"chars": 4259,
"preview": "// THIS CODE IS FROM https://github.com/captbaritone/webamp/blob/15b0312cb794973a0e615d894df942452e920c36/packages/ani-c"
},
{
"path": "src/lib/util/parse/icns/index.ts",
"chars": 0,
"preview": ""
},
{
"path": "src/lib/util/sw.ts",
"chars": 2434,
"preview": "import { browser } from \"$app/environment\";\n\nexport interface CacheInfo {\n\ttotalSize: number;\n\tfileCount: number;\n\tfiles"
},
{
"path": "src/lib/util/toast.svelte.ts",
"chars": 4568,
"preview": "import type { Component } from \"svelte\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"warning\";\n\n// export i"
},
{
"path": "src/lib/util/zip.ts",
"chars": 1341,
"preview": "import { error, log } from \"$lib/util/logger\";\nimport { unzip } from \"fflate\";\nimport { downloadZip } from \"client-zip\";"
},
{
"path": "src/lib/workers/magick.ts",
"chars": 7972,
"preview": "import {\n\tinitializeImageMagick,\n\tMagickFormat,\n\tMagickImage,\n\tMagickImageCollection,\n\tMagickReadSettings,\n\ttype IMagick"
},
{
"path": "src/lib/workers/pandoc.ts",
"chars": 8571,
"preview": "import type { WorkerMessage } from \"$lib/types\";\nimport * as wasiShim from \"@bjorn3/browser_wasi_shim\";\nimport * as zip "
},
{
"path": "src/routes/+layout.server.ts",
"chars": 140,
"preview": "export const load = () => {\n\tconst isAprilFools =\n\t\tnew Date().getDate() === 1 && new Date().getMonth() === 3;\n\treturn {"
},
{
"path": "src/routes/+layout.svelte",
"chars": 6511,
"preview": "<script lang=\"ts\">\n\timport { onMount } from \"svelte\";\n\timport { goto, beforeNavigate, afterNavigate } from \"$app/navigat"
},
{
"path": "src/routes/+layout.ts",
"chars": 310,
"preview": "import { browser } from \"$app/environment\";\n\nexport const load = ({ data }) => {\n\tif (!browser) return data;\n\twindow.pla"
},
{
"path": "src/routes/+page.svelte",
"chars": 8613,
"preview": "<script lang=\"ts\">\n\timport Uploader from \"$lib/components/functional/Uploader.svelte\";\n\timport Tooltip from \"$lib/compon"
},
{
"path": "src/routes/about/+page.svelte",
"chars": 4601,
"preview": "<script lang=\"ts\">\n\timport { error } from \"$lib/util/logger\";\n\timport * as About from \"$lib/sections/about\";\n\timport { I"
},
{
"path": "src/routes/convert/+page.svelte",
"chars": 12665,
"preview": "<script lang=\"ts\">\n\timport ConversionPanel from \"$lib/components/functional/ConversionPanel.svelte\";\n\timport FormatDropd"
},
{
"path": "src/routes/privacy/+page.svelte",
"chars": 2872,
"preview": "<script lang=\"ts\">\n\timport { m } from \"$lib/paraglide/messages\";\n\timport { link, sanitize } from \"$lib/store/index.svelt"
},
{
"path": "src/routes/settings/+page.svelte",
"chars": 2329,
"preview": "<script lang=\"ts\">\n\timport { browser } from \"$app/environment\";\n\timport { log } from \"$lib/util/logger\";\n\timport * as Se"
},
{
"path": "static/manifest.json",
"chars": 615,
"preview": "{\n\t\"name\": \"VERT\",\n\t\"short_name\": \"VERT\",\n\t\"description\": \"The file converter you'll love\",\n\t\"start_url\": \"/\",\n\t\"display"
},
{
"path": "static/robots.txt",
"chars": 61,
"preview": "User-agent: *\nAllow: /\n\nSitemap: https://vert.sh/sitemap.xml\n"
},
{
"path": "static/sitemap.xml",
"chars": 962,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:xsi=\"http:/"
},
{
"path": "static/sw.js",
"chars": 4352,
"preview": "const CACHE_NAME = \"vert-wasm-cache-v2\"; // updated when workers update\n\nconst WASM_FILES = [\n\t\"/pandoc.wasm\",\n\t\"https:/"
},
{
"path": "svelte.config.js",
"chars": 767,
"preview": "import adapter from \"@sveltejs/adapter-static\";\nimport { vitePreprocess } from \"@sveltejs/vite-plugin-svelte\";\n\n/** @typ"
},
{
"path": "tailwind.config.ts",
"chars": 1728,
"preview": "import type { Config } from \"tailwindcss\";\nimport plugin from \"tailwindcss/plugin\";\n\nexport default {\n\tcontent: [\"./src/"
},
{
"path": "tsconfig.json",
"chars": 649,
"preview": "{\n\t\"extends\": \"./.svelte-kit/tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"allowJs\": true,\n\t\t\"checkJs\": true,\n\t\t\"esModuleInte"
},
{
"path": "vite.config.ts",
"chars": 1693,
"preview": "import { paraglideVitePlugin } from \"@inlang/paraglide-js\";\nimport { sveltekit } from \"@sveltejs/kit/vite\";\nimport { def"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the VERT-sh/VERT GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 131 files (51.0 MB), approximately 169.7k tokens, and a symbol index with 192 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.