diff --git a/apps/web/src/pages/home-page.tsx b/apps/web/src/pages/home-page.tsx
index 2fb50aad..cffc94af 100644
--- a/apps/web/src/pages/home-page.tsx
+++ b/apps/web/src/pages/home-page.tsx
@@ -89,7 +89,7 @@ export function HomePage() {
if (!search || search.length < 2) return;
const timer = setTimeout(() => {
import("@/lib/analytics").then(({ track }) => {
- track(ANALYTICS_EVENTS.SEARCH, { query: search, results_count: searchResults.length });
+ track(ANALYTICS_EVENTS.SEARCH, { results_count: searchResults.length });
});
}, 1000);
return () => clearTimeout(timer);
@@ -195,6 +195,14 @@ function HomeSearchBar({
type="text"
value={value}
onChange={(e) => onChange(e.target.value)}
+ onKeyDown={(e) => {
+ // Escape steps out of the search field: clear a query if present,
+ // otherwise drop focus back to the page.
+ if (e.key === "Escape") {
+ if (value) onChange("");
+ e.currentTarget.blur();
+ }
+ }}
placeholder={placeholder}
aria-label={placeholder}
className="w-full ps-11 pe-20 py-2.5 rounded-lg border border-border bg-card text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary/40 transition-shadow"
@@ -244,7 +252,10 @@ function ModalityTabs({
className={cn(
"px-3.5 py-1.5 rounded-full text-sm font-medium transition-colors whitespace-nowrap",
activeTab === tab.key
- ? "bg-primary text-primary-foreground shadow-sm"
+ ? // Fixed dark text on the orange pill (the orange is the same
+ // in both themes). White on Otter Orange is only ~3:1, below
+ // WCAG AA for this 14px label; near-black reaches ~5.8:1.
+ "bg-primary text-[#1a1814] shadow-sm"
: "text-muted-foreground hover:bg-muted hover:text-foreground",
)}
>
diff --git a/apps/web/src/pages/privacy-policy-page.tsx b/apps/web/src/pages/privacy-policy-page.tsx
index 8ac5775e..daf8ad15 100644
--- a/apps/web/src/pages/privacy-policy-page.tsx
+++ b/apps/web/src/pages/privacy-policy-page.tsx
@@ -43,9 +43,11 @@ export function PrivacyPolicyPage() {
SnapOtter includes basic analytics (tool usage, error reports) to help improve the
software. Your files, file names, and personal data are never part of this. Analytics
- can be disabled by rebuilding with{" "}
- SNAPOTTER_ANALYTICS=off{" "}
- -- everything works normally without it.
+ is on by default and can be disabled at runtime. An administrator can turn anonymous
+ product analytics off under Settings {">"} System {">"} Privacy, with no restart or
+ rebuild needed. For a compile-time hard-off, build with{" "}
+ SNAPOTTER_ANALYTICS=off,
+ which strips it from the bundle entirely. Everything works normally without it.
diff --git a/apps/web/src/stores/analytics-store.ts b/apps/web/src/stores/analytics-store.ts
index c6bf4b70..8984932c 100644
--- a/apps/web/src/stores/analytics-store.ts
+++ b/apps/web/src/stores/analytics-store.ts
@@ -7,11 +7,12 @@ interface AnalyticsState {
fetchConfig: () => Promise
;
}
-export const useAnalyticsStore = create((set, get) => ({
+export const useAnalyticsStore = create((set) => ({
config: null,
configLoaded: false,
+ // No one-shot guard: callers may refetch (e.g. on tab focus) so an
+ // instance-wide opt-out converges in already-open tabs.
fetchConfig: async () => {
- if (get().configLoaded) return;
try {
const res = await fetch("/api/v1/config/analytics");
const config: AnalyticsConfig = await res.json();
diff --git a/apps/web/src/stores/settings-store.ts b/apps/web/src/stores/settings-store.ts
index 51f5619a..02d64f9f 100644
--- a/apps/web/src/stores/settings-store.ts
+++ b/apps/web/src/stores/settings-store.ts
@@ -16,6 +16,12 @@ interface SettingsState {
const VALID_THEMES = new Set(["light", "dark", "system"]);
+// De-duplicate concurrent fetches. Several components (AppLayout, the home grid,
+// the connection monitor) call fetch() on mount; without this guard they would
+// each fire a /v1/settings request before `loaded` flips, inflating the initial
+// network load.
+let inFlight: Promise | null = null;
+
export const useSettingsStore = create((set, get) => ({
disabledTools: [],
experimentalEnabled: false,
@@ -26,27 +32,38 @@ export const useSettingsStore = create((set, get) => ({
fetch: async () => {
if (get().loaded && !get().loadError) return;
+ if (inFlight) return inFlight;
+
+ inFlight = (async () => {
+ try {
+ const data = await apiGet<{
+ settings: Record;
+ }>("/v1/settings");
+
+ const defaultTheme = VALID_THEMES.has(data.settings.defaultTheme)
+ ? (data.settings.defaultTheme as Theme)
+ : "light";
+
+ set({
+ disabledTools: data.settings.disabledTools ? JSON.parse(data.settings.disabledTools) : [],
+ experimentalEnabled: data.settings.enableExperimentalTools === "true",
+ defaultToolView:
+ data.settings.defaultToolView === "fullscreen" ? "fullscreen" : "sidebar",
+ defaultTheme,
+ loaded: true,
+ loadError: false,
+ });
+
+ useThemeStore.getState().applyServerDefault(defaultTheme);
+ } catch {
+ set({ loaded: true, loadError: true });
+ }
+ })();
+
try {
- const data = await apiGet<{
- settings: Record;
- }>("/v1/settings");
-
- const defaultTheme = VALID_THEMES.has(data.settings.defaultTheme)
- ? (data.settings.defaultTheme as Theme)
- : "light";
-
- set({
- disabledTools: data.settings.disabledTools ? JSON.parse(data.settings.disabledTools) : [],
- experimentalEnabled: data.settings.enableExperimentalTools === "true",
- defaultToolView: data.settings.defaultToolView === "fullscreen" ? "fullscreen" : "sidebar",
- defaultTheme,
- loaded: true,
- loadError: false,
- });
-
- useThemeStore.getState().applyServerDefault(defaultTheme);
- } catch {
- set({ loaded: true, loadError: true });
+ await inFlight;
+ } finally {
+ inFlight = null;
}
},
}));
diff --git a/branding/README.md b/branding/README.md
index f7c2a635..a5e713a4 100644
--- a/branding/README.md
+++ b/branding/README.md
@@ -2,7 +2,7 @@
Press kit for use in blog posts, articles, reviews, and other publications about SnapOtter. Free to use when referencing SnapOtter.
-SnapOtter is an open-source, self-hosted file processing suite with 157 tools across image, video, audio, PDF, and file workflows.
+SnapOtter is an open-source, self-hosted file processing suite with 240 tools across image, video, audio, PDF, and file workflows.
## Files
@@ -20,7 +20,7 @@ SnapOtter is an open-source, self-hosted file processing suite with 157 tools ac
| `wordmark.svg` | Scalable | "SnapOtter" text mark (dark text) |
| `wordmark-white.svg` | Scalable | "SnapOtter" text mark (white text, for dark backgrounds) |
| `banner.svg` | Scalable | Wordmark + tagline banner on dark background |
-| `dashboard.gif` | Animated | Scrolling tour of all 157 tools across the five modalities (README hero) |
+| `dashboard.gif` | Animated | Scrolling tour of all 240 tools across the five modalities (README hero) |
## Brand Colors
diff --git a/branding/social-preview.png b/branding/social-preview.png
index 5a1223d9..c3af4c03 100644
Binary files a/branding/social-preview.png and b/branding/social-preview.png differ
diff --git a/package.json b/package.json
index dad7dd71..b13a83b4 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "snapotter",
"version": "2.0.0",
"private": true,
- "description": "Self-hosted file processing suite with 157 tools across image, video, audio, document, and data, plus local AI. Runs as a Docker Compose stack with Postgres and Redis.",
+ "description": "Self-hosted file processing suite with 240 tools across image, video, audio, document, and data, plus local AI. Runs as a Docker Compose stack with Postgres and Redis.",
"homepage": "https://snapotter.com",
"repository": {
"type": "git",
diff --git a/packages/shared/package.json b/packages/shared/package.json
index df193117..e71acc13 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -7,7 +7,8 @@
"types": "./src/index.ts",
"exports": {
".": "./src/index.ts",
- "./i18n/*": "./src/i18n/*"
+ "./i18n/*": "./src/i18n/*",
+ "./search/*": "./src/search/*"
},
"scripts": {
"lint": "biome check src/",
diff --git a/packages/shared/src/analytics/events.ts b/packages/shared/src/analytics/events.ts
index 465239b0..599928d3 100644
--- a/packages/shared/src/analytics/events.ts
+++ b/packages/shared/src/analytics/events.ts
@@ -27,7 +27,6 @@ export interface ToolUsedProperties {
}
export interface SearchProperties {
- query: string;
results_count: number;
clicked_tool_id?: string;
}
diff --git a/packages/shared/src/constants.ts b/packages/shared/src/constants.ts
index 66af6481..59f30e09 100644
--- a/packages/shared/src/constants.ts
+++ b/packages/shared/src/constants.ts
@@ -1,3 +1,4 @@
+import { expandConversionPresets } from "./conversion-presets.js";
import { AUDIO_INPUTS, IMAGE_INPUTS, SUBTITLE_INPUTS, VIDEO_INPUTS } from "./modality.js";
import { toolSection } from "./section.js";
import type { CategoryInfo, SocialMediaPreset, Tool } from "./types.js";
@@ -34,7 +35,7 @@ export const CATEGORIES: CategoryInfo[] = [
{ id: "archives", name: "Archives", icon: "FolderArchive", color: "#6366F1" },
];
-export const TOOLS: Tool[] = [
+const BASE_TOOLS: Tool[] = [
// Essentials
{
id: "resize",
@@ -78,6 +79,14 @@ export const TOOLS: Tool[] = [
route: "/convert",
modality: "image",
acceptedInputs: IMAGE_INPUTS,
+ keywords: [
+ "image converter",
+ "jpg to png",
+ "png to jpg",
+ "heic to jpg",
+ "webp to png",
+ "convert image format",
+ ],
executionHint: "fast",
},
{
@@ -241,7 +250,7 @@ export const TOOLS: Tool[] = [
},
{
id: "ocr",
- name: "OCR / Text Extraction",
+ name: "Extract Text from Image (OCR)",
description: "Extract text from images",
category: "doc-convert",
icon: "ScanText",
@@ -809,6 +818,7 @@ export const TOOLS: Tool[] = [
route: "/convert-video",
modality: "video",
acceptedInputs: VIDEO_INPUTS,
+ keywords: ["video converter", "mov to mp4", "mkv to mp4", "avi to mp4", "webm to mp4"],
executionHint: "long",
},
{
@@ -1111,6 +1121,7 @@ export const TOOLS: Tool[] = [
route: "/convert-audio",
modality: "audio",
acceptedInputs: AUDIO_INPUTS,
+ keywords: ["audio converter", "m4a to mp3", "aac to mp3", "wav to mp3", "ogg to mp3"],
executionHint: "fast",
},
{
@@ -1368,6 +1379,7 @@ export const TOOLS: Tool[] = [
route: "/convert-spreadsheet",
modality: "document",
acceptedInputs: [".xlsx", ".xls", ".ods", ".csv"],
+ keywords: ["excel to csv", "xlsx to csv", "spreadsheet converter"],
executionHint: "long",
},
{
@@ -1798,6 +1810,8 @@ export const TOOLS: Tool[] = [
},
];
+export const TOOLS: Tool[] = [...BASE_TOOLS, ...expandConversionPresets(BASE_TOOLS)];
+
for (const tool of TOOLS) {
const slug = `/${toolSection(tool)}`;
if (!tool.route.startsWith(`${slug}/`)) {
diff --git a/packages/shared/src/conversion-presets.ts b/packages/shared/src/conversion-presets.ts
new file mode 100644
index 00000000..de5ffb1f
--- /dev/null
+++ b/packages/shared/src/conversion-presets.ts
@@ -0,0 +1,612 @@
+import type { Modality } from "./modality.js";
+import { generateConversionKeywords } from "./search/format-aliases.js";
+import type { Tool, ToolCategory } from "./types.js";
+
+/** Which factory path a preset uses on the API side. */
+export type PresetGroup = "registry" | "image-to-pdf" | "pdf-to-image" | "svg-to-raster";
+
+/** Settings UI family for the shared web settings component. */
+export type PresetSettingsKind = "none" | "quality" | "pdf" | "video";
+
+export interface ConversionPreset {
+ id: string;
+ from: string;
+ to: string;
+ base: string;
+ /** Settings forced into the base process call (e.g. { format: "png" }). */
+ locked: Record;
+ /** Input extensions this preset accepts (narrows the base). */
+ sourceInputs: string[];
+}
+
+interface BaseConfig {
+ group: PresetGroup;
+ modality: Modality;
+ outputModality?: Modality;
+ category: ToolCategory;
+ settingsKind: PresetSettingsKind;
+ /** The base tool id whose displayMode the web side mirrors. */
+ displayBase: string;
+}
+
+/** Per-base routing/config. category may override the base tool's own category for grouping. */
+export const BASE_CONFIG: Record = {
+ convert: {
+ group: "registry",
+ modality: "image",
+ category: "format",
+ settingsKind: "quality",
+ displayBase: "convert",
+ },
+ vectorize: {
+ group: "registry",
+ modality: "image",
+ category: "format",
+ settingsKind: "none",
+ displayBase: "vectorize",
+ },
+ "svg-to-raster": {
+ group: "svg-to-raster",
+ modality: "image",
+ category: "format",
+ settingsKind: "quality",
+ displayBase: "svg-to-raster",
+ },
+ "image-to-pdf": {
+ group: "image-to-pdf",
+ modality: "image",
+ outputModality: "document",
+ category: "format",
+ settingsKind: "pdf",
+ displayBase: "image-to-pdf",
+ },
+ "pdf-to-image": {
+ group: "pdf-to-image",
+ modality: "document",
+ outputModality: "image",
+ category: "pdf-organize",
+ settingsKind: "none",
+ displayBase: "pdf-to-image",
+ },
+ "convert-video": {
+ group: "registry",
+ modality: "video",
+ category: "video-convert",
+ settingsKind: "video",
+ displayBase: "convert-video",
+ },
+ "video-to-gif": {
+ group: "registry",
+ modality: "video",
+ outputModality: "image",
+ category: "video-convert",
+ settingsKind: "none",
+ displayBase: "video-to-gif",
+ },
+ "gif-to-video": {
+ group: "registry",
+ modality: "video",
+ category: "video-convert",
+ settingsKind: "none",
+ displayBase: "convert-video",
+ },
+ "extract-audio": {
+ group: "registry",
+ modality: "video",
+ outputModality: "audio",
+ category: "video-convert",
+ settingsKind: "none",
+ displayBase: "convert-video",
+ },
+ "convert-audio": {
+ group: "registry",
+ modality: "audio",
+ category: "audio-convert",
+ settingsKind: "none",
+ displayBase: "convert-audio",
+ },
+ "convert-spreadsheet": {
+ group: "registry",
+ modality: "document",
+ category: "doc-convert",
+ settingsKind: "none",
+ displayBase: "convert-spreadsheet",
+ },
+};
+
+const JPG = [".jpg", ".jpeg"];
+const PNG = [".png"];
+const WEBP = [".webp"];
+const GIF = [".gif"];
+const TIFF = [".tiff", ".tif"];
+const HEIC = [".heic", ".heif"];
+const PSD = [".psd"];
+const EPS = [".eps"];
+const SVG = [".svg", ".svgz"];
+const PDF = [".pdf"];
+
+/** image raster pairs on `convert` */
+function img(
+ id: string,
+ from: string,
+ to: string,
+ format: string,
+ sourceInputs: string[],
+): ConversionPreset {
+ return { id, from, to, base: "convert", locked: { format }, sourceInputs };
+}
+
+export const CONVERSION_PRESETS: ConversionPreset[] = [
+ // Image raster (base: convert)
+ img("jpg-to-png", "JPG", "PNG", "png", JPG),
+ img("png-to-jpg", "PNG", "JPG", "jpg", PNG),
+ img("jpg-to-webp", "JPG", "WebP", "webp", JPG),
+ img("png-to-webp", "PNG", "WebP", "webp", PNG),
+ img("webp-to-jpg", "WebP", "JPG", "jpg", WEBP),
+ img("webp-to-png", "WebP", "PNG", "png", WEBP),
+ img("jpg-to-avif", "JPG", "AVIF", "avif", JPG),
+ img("png-to-avif", "PNG", "AVIF", "avif", PNG),
+ img("webp-to-avif", "WebP", "AVIF", "avif", WEBP),
+ img("heic-to-jpg", "HEIC", "JPG", "jpg", HEIC),
+ img("heic-to-png", "HEIC", "PNG", "png", HEIC),
+ img("heic-to-avif", "HEIC", "AVIF", "avif", HEIC),
+ img("jpg-to-gif", "JPG", "GIF", "gif", JPG),
+ img("png-to-gif", "PNG", "GIF", "gif", PNG),
+ img("gif-to-jpg", "GIF", "JPG", "jpg", GIF),
+ img("gif-to-png", "GIF", "PNG", "png", GIF),
+ img("webp-to-gif", "WebP", "GIF", "gif", WEBP),
+ img("jpg-to-tiff", "JPG", "TIFF", "tiff", JPG),
+ img("png-to-tiff", "PNG", "TIFF", "tiff", PNG),
+ img("tiff-to-jpg", "TIFF", "JPG", "jpg", TIFF),
+ img("tiff-to-png", "TIFF", "PNG", "png", TIFF),
+ img("psd-to-jpg", "PSD", "JPG", "jpg", PSD),
+ img("psd-to-png", "PSD", "PNG", "png", PSD),
+ img("png-to-eps", "PNG", "EPS", "eps", PNG),
+ img("jpg-to-eps", "JPG", "EPS", "eps", JPG),
+ img("eps-to-png", "EPS", "PNG", "png", EPS),
+ img("eps-to-jpg", "EPS", "JPG", "jpg", EPS),
+
+ // Image vector
+ { id: "png-to-svg", from: "PNG", to: "SVG", base: "vectorize", locked: {}, sourceInputs: PNG },
+ { id: "jpg-to-svg", from: "JPG", to: "SVG", base: "vectorize", locked: {}, sourceInputs: JPG },
+ { id: "tiff-to-svg", from: "TIFF", to: "SVG", base: "vectorize", locked: {}, sourceInputs: TIFF },
+ { id: "psd-to-svg", from: "PSD", to: "SVG", base: "vectorize", locked: {}, sourceInputs: PSD },
+ { id: "eps-to-svg", from: "EPS", to: "SVG", base: "vectorize", locked: {}, sourceInputs: EPS },
+ {
+ id: "svg-to-png",
+ from: "SVG",
+ to: "PNG",
+ base: "svg-to-raster",
+ locked: { outputFormat: "png" },
+ sourceInputs: SVG,
+ },
+ {
+ id: "svg-to-jpg",
+ from: "SVG",
+ to: "JPG",
+ base: "svg-to-raster",
+ locked: { outputFormat: "jpg" },
+ sourceInputs: SVG,
+ },
+
+ // Image -> PDF (base: image-to-pdf)
+ { id: "jpg-to-pdf", from: "JPG", to: "PDF", base: "image-to-pdf", locked: {}, sourceInputs: JPG },
+ { id: "png-to-pdf", from: "PNG", to: "PDF", base: "image-to-pdf", locked: {}, sourceInputs: PNG },
+ {
+ id: "heic-to-pdf",
+ from: "HEIC",
+ to: "PDF",
+ base: "image-to-pdf",
+ locked: {},
+ sourceInputs: HEIC,
+ },
+ {
+ id: "tiff-to-pdf",
+ from: "TIFF",
+ to: "PDF",
+ base: "image-to-pdf",
+ locked: {},
+ sourceInputs: TIFF,
+ },
+ {
+ id: "webp-to-pdf",
+ from: "WebP",
+ to: "PDF",
+ base: "image-to-pdf",
+ locked: {},
+ sourceInputs: WEBP,
+ },
+ { id: "gif-to-pdf", from: "GIF", to: "PDF", base: "image-to-pdf", locked: {}, sourceInputs: GIF },
+ { id: "eps-to-pdf", from: "EPS", to: "PDF", base: "image-to-pdf", locked: {}, sourceInputs: EPS },
+
+ // PDF -> image (base: pdf-to-image)
+ {
+ id: "pdf-to-jpg",
+ from: "PDF",
+ to: "JPG",
+ base: "pdf-to-image",
+ locked: { format: "jpg" },
+ sourceInputs: PDF,
+ },
+ {
+ id: "pdf-to-png",
+ from: "PDF",
+ to: "PNG",
+ base: "pdf-to-image",
+ locked: { format: "png" },
+ sourceInputs: PDF,
+ },
+ {
+ id: "pdf-to-tiff",
+ from: "PDF",
+ to: "TIFF",
+ base: "pdf-to-image",
+ locked: { format: "tiff" },
+ sourceInputs: PDF,
+ },
+
+ // Video container (base: convert-video)
+ {
+ id: "mov-to-mp4",
+ from: "MOV",
+ to: "MP4",
+ base: "convert-video",
+ locked: { format: "mp4" },
+ sourceInputs: [".mov"],
+ },
+ {
+ id: "webm-to-mp4",
+ from: "WEBM",
+ to: "MP4",
+ base: "convert-video",
+ locked: { format: "mp4" },
+ sourceInputs: [".webm"],
+ },
+ {
+ id: "mkv-to-mp4",
+ from: "MKV",
+ to: "MP4",
+ base: "convert-video",
+ locked: { format: "mp4" },
+ sourceInputs: [".mkv"],
+ },
+ {
+ id: "avi-to-mp4",
+ from: "AVI",
+ to: "MP4",
+ base: "convert-video",
+ locked: { format: "mp4" },
+ sourceInputs: [".avi"],
+ },
+ {
+ id: "mp4-to-mov",
+ from: "MP4",
+ to: "MOV",
+ base: "convert-video",
+ locked: { format: "mov" },
+ sourceInputs: [".mp4"],
+ },
+ {
+ id: "mp4-to-webm",
+ from: "MP4",
+ to: "WEBM",
+ base: "convert-video",
+ locked: { format: "webm" },
+ sourceInputs: [".mp4"],
+ },
+ {
+ id: "webm-to-mov",
+ from: "WEBM",
+ to: "MOV",
+ base: "convert-video",
+ locked: { format: "mov" },
+ sourceInputs: [".webm"],
+ },
+ {
+ id: "mkv-to-mov",
+ from: "MKV",
+ to: "MOV",
+ base: "convert-video",
+ locked: { format: "mov" },
+ sourceInputs: [".mkv"],
+ },
+ {
+ id: "avi-to-mov",
+ from: "AVI",
+ to: "MOV",
+ base: "convert-video",
+ locked: { format: "mov" },
+ sourceInputs: [".avi"],
+ },
+ // Video container (Tweak: convert-video needs avi/mkv output, Task 5)
+ {
+ id: "mp4-to-avi",
+ from: "MP4",
+ to: "AVI",
+ base: "convert-video",
+ locked: { format: "avi" },
+ sourceInputs: [".mp4"],
+ },
+ {
+ id: "mov-to-avi",
+ from: "MOV",
+ to: "AVI",
+ base: "convert-video",
+ locked: { format: "avi" },
+ sourceInputs: [".mov"],
+ },
+ {
+ id: "mkv-to-avi",
+ from: "MKV",
+ to: "AVI",
+ base: "convert-video",
+ locked: { format: "avi" },
+ sourceInputs: [".mkv"],
+ },
+ {
+ id: "avi-to-mkv",
+ from: "AVI",
+ to: "MKV",
+ base: "convert-video",
+ locked: { format: "mkv" },
+ sourceInputs: [".avi"],
+ },
+
+ // Video -> GIF (base: video-to-gif), registered via group "registry" delegating to video-to-gif
+ {
+ id: "mp4-to-gif",
+ from: "MP4",
+ to: "GIF",
+ base: "video-to-gif",
+ locked: {},
+ sourceInputs: [".mp4"],
+ },
+ {
+ id: "mov-to-gif",
+ from: "MOV",
+ to: "GIF",
+ base: "video-to-gif",
+ locked: {},
+ sourceInputs: [".mov"],
+ },
+ {
+ id: "mkv-to-gif",
+ from: "MKV",
+ to: "GIF",
+ base: "video-to-gif",
+ locked: {},
+ sourceInputs: [".mkv"],
+ },
+ {
+ id: "avi-to-gif",
+ from: "AVI",
+ to: "GIF",
+ base: "video-to-gif",
+ locked: {},
+ sourceInputs: [".avi"],
+ },
+
+ // GIF -> video (base: gif-to-video)
+ {
+ id: "gif-to-mp4",
+ from: "GIF",
+ to: "MP4",
+ base: "gif-to-video",
+ locked: { format: "mp4" },
+ sourceInputs: GIF,
+ },
+ {
+ id: "gif-to-webm",
+ from: "GIF",
+ to: "WEBM",
+ base: "gif-to-video",
+ locked: { format: "webm" },
+ sourceInputs: GIF,
+ },
+ {
+ id: "gif-to-mov",
+ from: "GIF",
+ to: "MOV",
+ base: "gif-to-video",
+ locked: { format: "mov" },
+ sourceInputs: GIF,
+ }, // Tweak
+
+ // Video -> audio (base: extract-audio)
+ {
+ id: "mp4-to-mp3",
+ from: "MP4",
+ to: "MP3",
+ base: "extract-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".mp4"],
+ },
+ {
+ id: "mov-to-mp3",
+ from: "MOV",
+ to: "MP3",
+ base: "extract-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".mov"],
+ },
+ {
+ id: "mkv-to-mp3",
+ from: "MKV",
+ to: "MP3",
+ base: "extract-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".mkv"],
+ },
+ {
+ id: "webm-to-mp3",
+ from: "WEBM",
+ to: "MP3",
+ base: "extract-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".webm"],
+ },
+ {
+ id: "avi-to-mp3",
+ from: "AVI",
+ to: "MP3",
+ base: "extract-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".avi"],
+ },
+ {
+ id: "mp4-to-wav",
+ from: "MP4",
+ to: "WAV",
+ base: "extract-audio",
+ locked: { format: "wav" },
+ sourceInputs: [".mp4"],
+ },
+ {
+ id: "mov-to-wav",
+ from: "MOV",
+ to: "WAV",
+ base: "extract-audio",
+ locked: { format: "wav" },
+ sourceInputs: [".mov"],
+ },
+ {
+ id: "mp4-to-ogg",
+ from: "MP4",
+ to: "OGG",
+ base: "extract-audio",
+ locked: { format: "ogg" },
+ sourceInputs: [".mp4"],
+ }, // Tweak
+
+ // Audio (base: convert-audio)
+ {
+ id: "m4a-to-mp3",
+ from: "M4A",
+ to: "MP3",
+ base: "convert-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".m4a"],
+ },
+ {
+ id: "m4a-to-wav",
+ from: "M4A",
+ to: "WAV",
+ base: "convert-audio",
+ locked: { format: "wav" },
+ sourceInputs: [".m4a"],
+ },
+ {
+ id: "aac-to-mp3",
+ from: "AAC",
+ to: "MP3",
+ base: "convert-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".aac"],
+ },
+ {
+ id: "aac-to-wav",
+ from: "AAC",
+ to: "WAV",
+ base: "convert-audio",
+ locked: { format: "wav" },
+ sourceInputs: [".aac"],
+ },
+ {
+ id: "aac-to-flac",
+ from: "AAC",
+ to: "FLAC",
+ base: "convert-audio",
+ locked: { format: "flac" },
+ sourceInputs: [".aac"],
+ },
+ {
+ id: "ogg-to-mp3",
+ from: "OGG",
+ to: "MP3",
+ base: "convert-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".ogg"],
+ },
+ {
+ id: "ogg-to-wav",
+ from: "OGG",
+ to: "WAV",
+ base: "convert-audio",
+ locked: { format: "wav" },
+ sourceInputs: [".ogg"],
+ },
+ {
+ id: "wav-to-mp3",
+ from: "WAV",
+ to: "MP3",
+ base: "convert-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".wav"],
+ },
+ {
+ id: "mp3-to-wav",
+ from: "MP3",
+ to: "WAV",
+ base: "convert-audio",
+ locked: { format: "wav" },
+ sourceInputs: [".mp3"],
+ },
+ {
+ id: "flac-to-mp3",
+ from: "FLAC",
+ to: "MP3",
+ base: "convert-audio",
+ locked: { format: "mp3" },
+ sourceInputs: [".flac"],
+ },
+
+ // Data (base: convert-spreadsheet)
+ {
+ id: "excel-to-csv",
+ from: "Excel",
+ to: "CSV",
+ base: "convert-spreadsheet",
+ locked: { format: "csv" },
+ sourceInputs: [".xlsx", ".xls"],
+ },
+];
+
+/** Icon per base modality (lucide names already used elsewhere in the catalog). */
+const ICON_BY_GROUP: Record = {
+ image: "FileType",
+ video: "FileVideo",
+ audio: "FileAudio",
+ document: "FileType",
+};
+
+/**
+ * Expand presets into full Tool objects. Reads executionHint/modality from the
+ * base tool in TOOLS (mirrors it), applies the BASE_CONFIG category override,
+ * sets route = `/`, sourceInputs as acceptedInputs, and auto-generates keywords.
+ * `baseTools` is injected to avoid a circular import with constants.ts.
+ */
+export function expandConversionPresets(baseTools?: Pick[]): Tool[] {
+ return CONVERSION_PRESETS.map((p) => {
+ const cfg = BASE_CONFIG[p.base];
+ if (!cfg) throw new Error(`No BASE_CONFIG for base "${p.base}" (preset ${p.id})`);
+ const base = baseTools?.find((t) => t.id === p.base);
+ const executionHint = base?.executionHint ?? (cfg.modality === "image" ? "fast" : "long");
+ return {
+ id: p.id,
+ name: `${p.from} to ${p.to}`,
+ description: `Convert ${p.from} to ${p.to}`,
+ category: cfg.category,
+ icon: ICON_BY_GROUP[cfg.modality] ?? "FileType",
+ route: `/${p.id}`,
+ modality: cfg.modality,
+ acceptedInputs: p.sourceInputs,
+ outputModality: cfg.outputModality,
+ executionHint,
+ keywords: generateConversionKeywords({ from: p.from, to: p.to }),
+ } satisfies Tool;
+ });
+}
+
+export const CONVERSION_PRESET_BY_ID: Record = Object.fromEntries(
+ CONVERSION_PRESETS.map((p) => [p.id, p]),
+);
diff --git a/packages/shared/src/i18n/ar.ts b/packages/shared/src/i18n/ar.ts
index c4cd411c..1bef9fe0 100644
--- a/packages/shared/src/i18n/ar.ts
+++ b/packages/shared/src/i18n/ar.ts
@@ -73,6 +73,340 @@ export const ar: TranslationKeys = {
documentsAndFiles: "PDF وملفات",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG إلى PNG",
+ description: "حوّل JPG إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-jpg": {
+ name: "PNG إلى JPG",
+ description: "حوّل PNG إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-webp": {
+ name: "JPG إلى WebP",
+ description: "حوّل JPG إلى WebP عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-webp": {
+ name: "PNG إلى WebP",
+ description: "حوّل PNG إلى WebP عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webp-to-jpg": {
+ name: "WebP إلى JPG",
+ description: "حوّل WebP إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webp-to-png": {
+ name: "WebP إلى PNG",
+ description: "حوّل WebP إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-avif": {
+ name: "JPG إلى AVIF",
+ description: "حوّل JPG إلى AVIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-avif": {
+ name: "PNG إلى AVIF",
+ description: "حوّل PNG إلى AVIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webp-to-avif": {
+ name: "WebP إلى AVIF",
+ description: "حوّل WebP إلى AVIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC إلى JPG",
+ description: "حوّل HEIC إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "heic-to-png": {
+ name: "HEIC إلى PNG",
+ description: "حوّل HEIC إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "heic-to-avif": {
+ name: "HEIC إلى AVIF",
+ description: "حوّل HEIC إلى AVIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-gif": {
+ name: "JPG إلى GIF",
+ description: "حوّل JPG إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-gif": {
+ name: "PNG إلى GIF",
+ description: "حوّل PNG إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "gif-to-jpg": {
+ name: "GIF إلى JPG",
+ description: "حوّل GIF إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "gif-to-png": {
+ name: "GIF إلى PNG",
+ description: "حوّل GIF إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webp-to-gif": {
+ name: "WebP إلى GIF",
+ description: "حوّل WebP إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG إلى TIFF",
+ description: "حوّل JPG إلى TIFF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-tiff": {
+ name: "PNG إلى TIFF",
+ description: "حوّل PNG إلى TIFF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF إلى JPG",
+ description: "حوّل TIFF إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "tiff-to-png": {
+ name: "TIFF إلى PNG",
+ description: "حوّل TIFF إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "psd-to-jpg": {
+ name: "PSD إلى JPG",
+ description: "حوّل PSD إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "psd-to-png": {
+ name: "PSD إلى PNG",
+ description: "حوّل PSD إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-eps": {
+ name: "PNG إلى EPS",
+ description: "حوّل PNG إلى EPS عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-eps": {
+ name: "JPG إلى EPS",
+ description: "حوّل JPG إلى EPS عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "eps-to-png": {
+ name: "EPS إلى PNG",
+ description: "حوّل EPS إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "eps-to-jpg": {
+ name: "EPS إلى JPG",
+ description: "حوّل EPS إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-svg": {
+ name: "PNG إلى SVG",
+ description: "حوّل PNG إلى SVG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-svg": {
+ name: "JPG إلى SVG",
+ description: "حوّل JPG إلى SVG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF إلى SVG",
+ description: "حوّل TIFF إلى SVG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "psd-to-svg": {
+ name: "PSD إلى SVG",
+ description: "حوّل PSD إلى SVG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "eps-to-svg": {
+ name: "EPS إلى SVG",
+ description: "حوّل EPS إلى SVG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "svg-to-png": {
+ name: "SVG إلى PNG",
+ description: "حوّل SVG إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "svg-to-jpg": {
+ name: "SVG إلى JPG",
+ description: "حوّل SVG إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG إلى PDF",
+ description: "حوّل JPG إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "png-to-pdf": {
+ name: "PNG إلى PDF",
+ description: "حوّل PNG إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC إلى PDF",
+ description: "حوّل HEIC إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF إلى PDF",
+ description: "حوّل TIFF إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webp-to-pdf": {
+ name: "WebP إلى PDF",
+ description: "حوّل WebP إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "gif-to-pdf": {
+ name: "GIF إلى PDF",
+ description: "حوّل GIF إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "eps-to-pdf": {
+ name: "EPS إلى PDF",
+ description: "حوّل EPS إلى PDF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF إلى JPG",
+ description: "حوّل PDF إلى JPG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "pdf-to-png": {
+ name: "PDF إلى PNG",
+ description: "حوّل PDF إلى PNG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF إلى TIFF",
+ description: "حوّل PDF إلى TIFF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mov-to-mp4": {
+ name: "MOV إلى MP4",
+ description: "حوّل MOV إلى MP4 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM إلى MP4",
+ description: "حوّل WEBM إلى MP4 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV إلى MP4",
+ description: "حوّل MKV إلى MP4 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "avi-to-mp4": {
+ name: "AVI إلى MP4",
+ description: "حوّل AVI إلى MP4 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 إلى MOV",
+ description: "حوّل MP4 إلى MOV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 إلى WEBM",
+ description: "حوّل MP4 إلى WEBM عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webm-to-mov": {
+ name: "WEBM إلى MOV",
+ description: "حوّل WEBM إلى MOV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mkv-to-mov": {
+ name: "MKV إلى MOV",
+ description: "حوّل MKV إلى MOV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "avi-to-mov": {
+ name: "AVI إلى MOV",
+ description: "حوّل AVI إلى MOV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 إلى AVI",
+ description: "حوّل MP4 إلى AVI عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mov-to-avi": {
+ name: "MOV إلى AVI",
+ description: "حوّل MOV إلى AVI عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mkv-to-avi": {
+ name: "MKV إلى AVI",
+ description: "حوّل MKV إلى AVI عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "avi-to-mkv": {
+ name: "AVI إلى MKV",
+ description: "حوّل AVI إلى MKV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 إلى GIF",
+ description: "حوّل MP4 إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mov-to-gif": {
+ name: "MOV إلى GIF",
+ description: "حوّل MOV إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mkv-to-gif": {
+ name: "MKV إلى GIF",
+ description: "حوّل MKV إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "avi-to-gif": {
+ name: "AVI إلى GIF",
+ description: "حوّل AVI إلى GIF عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "gif-to-mp4": {
+ name: "GIF إلى MP4",
+ description: "حوّل GIF إلى MP4 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "gif-to-webm": {
+ name: "GIF إلى WEBM",
+ description: "حوّل GIF إلى WEBM عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "gif-to-mov": {
+ name: "GIF إلى MOV",
+ description: "حوّل GIF إلى MOV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 إلى MP3",
+ description: "حوّل MP4 إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mov-to-mp3": {
+ name: "MOV إلى MP3",
+ description: "حوّل MOV إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV إلى MP3",
+ description: "حوّل MKV إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM إلى MP3",
+ description: "حوّل WEBM إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "avi-to-mp3": {
+ name: "AVI إلى MP3",
+ description: "حوّل AVI إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 إلى WAV",
+ description: "حوّل MP4 إلى WAV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mov-to-wav": {
+ name: "MOV إلى WAV",
+ description: "حوّل MOV إلى WAV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 إلى OGG",
+ description: "حوّل MP4 إلى OGG عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A إلى MP3",
+ description: "حوّل M4A إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "m4a-to-wav": {
+ name: "M4A إلى WAV",
+ description: "حوّل M4A إلى WAV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "aac-to-mp3": {
+ name: "AAC إلى MP3",
+ description: "حوّل AAC إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "aac-to-wav": {
+ name: "AAC إلى WAV",
+ description: "حوّل AAC إلى WAV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "aac-to-flac": {
+ name: "AAC إلى FLAC",
+ description: "حوّل AAC إلى FLAC عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG إلى MP3",
+ description: "حوّل OGG إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "ogg-to-wav": {
+ name: "OGG إلى WAV",
+ description: "حوّل OGG إلى WAV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "wav-to-mp3": {
+ name: "WAV إلى MP3",
+ description: "حوّل WAV إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 إلى WAV",
+ description: "حوّل MP3 إلى WAV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC إلى MP3",
+ description: "حوّل FLAC إلى MP3 عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ "excel-to-csv": {
+ name: "Excel إلى CSV",
+ description: "حوّل Excel إلى CSV عبر الإنترنت. سريع ومجاني وخاص.",
+ },
+ // END conversion-presets
resize: {
name: "تغيير الحجم",
description: "تغيير الحجم بالبكسل أو النسبة المئوية أو قوالب وسائل التواصل",
@@ -150,7 +484,7 @@ export const ar: TranslationKeys = {
description: "إزالة الكائنات غير المرغوبة بتقنية AI",
},
ocr: {
- name: "OCR / استخراج النصوص",
+ name: "استخراج النص من صورة (OCR)",
description: "استخراج النصوص من الصور بدقة مدعومة بـ AI",
},
"ocr-pdf": {
@@ -2740,6 +3074,14 @@ export const ar: TranslationKeys = {
"تنزيل ملف تشخيصي مضغوط يحتوي على إعدادات محجوبة وسجلات وبيانات المهام لاستكشاف الأخطاء.",
supportBundleFailed: "فشل تنزيل حزمة الدعم.",
},
+ privacy: {
+ title: "الخصوصية",
+ description:
+ "تساعد تحليلات المنتج المجهولة في تحسين SnapOtter. وهي مفعّلة افتراضيًا ويضبطها المسؤول لكامل النسخة.",
+ analyticsLabel: "تحليلات المنتج المجهولة",
+ analyticsDescription:
+ "شارك بيانات استخدام مجهولة (الأدوات التي تعمل، ومدد التشغيل، ورموز الأخطاء) وتقارير الأعطال. بلا عنوان IP وبلا هوية حساب. لا نجمع أبدًا أسماء ملفاتك أو محتوى الملفات أو مخرجات OCR أو البيانات الوصفية للصور أو نص المستندات. أوقف هذا الخيار لإيقاف كل ذلك.",
+ },
security: {
heading: "الأمان",
description: "إعدادات كلمة المرور والمصادقة.",
@@ -3026,7 +3368,7 @@ export const ar: TranslationKeys = {
heading: "حول",
appName: "SnapOtter",
appDescription:
- "مجموعة أدوات معالجة ملفات ذاتية الاستضافة تركز على الخصوصية مع 157 أداة. تحويل وضغط وتحرير ونسخ صوتي وتعرّف ضوئي وأتمتة سير عمل الصور والفيديو والصوت والمستندات والبيانات دون إرسال البيانات إلى السحابة.",
+ "مجموعة أدوات معالجة ملفات ذاتية الاستضافة تركز على الخصوصية مع 240 أداة. تحويل وضغط وتحرير ونسخ صوتي وتعرّف ضوئي وأتمتة سير عمل الصور والفيديو والصوت والمستندات والبيانات دون إرسال البيانات إلى السحابة.",
versionLabel: "الإصدار:",
linksHeading: "روابط",
githubLink: "مستودع GitHub",
@@ -3082,7 +3424,7 @@ export const ar: TranslationKeys = {
"بلا حدود. بلا قيود خفية.",
"يعمل بدون إنترنت.",
"معالجة جماعية بلا حدود.",
- "157 أداة.",
+ "240 أداة.",
"15 نموذج AI. على جهازك.",
"سريع كالبرق. مبني على Sharp.",
"يعمل في بيئات معزولة.",
@@ -3146,6 +3488,7 @@ export const ar: TranslationKeys = {
toolPalette: "لوحة الأدوات",
clickToAdd: "اضغط للإضافة إلى Pipeline",
savedLabel: "محفوظ",
+ templatesLabel: "القوالب",
importButton: "استيراد",
noSavedPipelines: "لا توجد Pipeline محفوظة",
stepCount: "({count} خطوة)",
@@ -3430,4 +3773,42 @@ export const ar: TranslationKeys = {
navigationMenu: "التنقل",
homeLink: "الصفحة الرئيسية لـ SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "تحسين للويب",
+ description: "تغيير حجم الصورة وتحويلها إلى WebP وضغطها لتحميل سريع على الويب.",
+ },
+ "email-friendly": {
+ name: "مناسب للبريد الإلكتروني",
+ description: "تصغير الصورة بما يكفي لإرفاقها برسالة بريد إلكتروني.",
+ },
+ "privacy-scrub": {
+ name: "تنظيف الخصوصية",
+ description: "إزالة بيانات EXIF وGPS وبيانات التعريف الأخرى، ثم الضغط.",
+ },
+ "social-square": {
+ name: "مربع للتواصل الاجتماعي",
+ description: "اقتصاص الصورة إلى مربع 1:1 وضغطها لمنشورات التواصل الاجتماعي.",
+ },
+ "watermark-batch": {
+ name: "علامة مائية بالدُّفعة",
+ description: "إضافة علامة مائية نصية إلى الصور، ثم ضغطها.",
+ },
+ "shrink-pdf-email": {
+ name: "تصغير PDF للبريد الإلكتروني",
+ description: "تسطيح ملف PDF وضغطه بقوة ليتوافق مع حدود البريد الإلكتروني.",
+ },
+ "podcast-polish": {
+ name: "تحسين البودكاست",
+ description: "إزالة الصمت وتطبيع مستوى الصوت وإضافة تلاشٍ إلى التسجيل.",
+ },
+ "cut-out-subject": {
+ name: "قص العنصر",
+ description: "إزالة الخلفية باستخدام الذكاء الاصطناعي وضغط الصورة الشفافة المقصوصة.",
+ },
+ "restore-old-photo": {
+ name: "ترميم صورة قديمة",
+ description: "إصلاح صورة قديمة أو تالفة وتلوينها وتكبيرها باستخدام الذكاء الاصطناعي.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/de.ts b/packages/shared/src/i18n/de.ts
index 1dab9786..f763f585 100644
--- a/packages/shared/src/i18n/de.ts
+++ b/packages/shared/src/i18n/de.ts
@@ -73,6 +73,340 @@ export const de: TranslationKeys = {
documentsAndFiles: "PDF & Dateien",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG in PNG umwandeln",
+ description: "JPG online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-jpg": {
+ name: "PNG in JPG umwandeln",
+ description: "PNG online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-webp": {
+ name: "JPG in WebP umwandeln",
+ description: "JPG online in WebP umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-webp": {
+ name: "PNG in WebP umwandeln",
+ description: "PNG online in WebP umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webp-to-jpg": {
+ name: "WebP in JPG umwandeln",
+ description: "WebP online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webp-to-png": {
+ name: "WebP in PNG umwandeln",
+ description: "WebP online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-avif": {
+ name: "JPG in AVIF umwandeln",
+ description: "JPG online in AVIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-avif": {
+ name: "PNG in AVIF umwandeln",
+ description: "PNG online in AVIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webp-to-avif": {
+ name: "WebP in AVIF umwandeln",
+ description: "WebP online in AVIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC in JPG umwandeln",
+ description: "HEIC online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "heic-to-png": {
+ name: "HEIC in PNG umwandeln",
+ description: "HEIC online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "heic-to-avif": {
+ name: "HEIC in AVIF umwandeln",
+ description: "HEIC online in AVIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-gif": {
+ name: "JPG in GIF umwandeln",
+ description: "JPG online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-gif": {
+ name: "PNG in GIF umwandeln",
+ description: "PNG online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "gif-to-jpg": {
+ name: "GIF in JPG umwandeln",
+ description: "GIF online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "gif-to-png": {
+ name: "GIF in PNG umwandeln",
+ description: "GIF online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webp-to-gif": {
+ name: "WebP in GIF umwandeln",
+ description: "WebP online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG in TIFF umwandeln",
+ description: "JPG online in TIFF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-tiff": {
+ name: "PNG in TIFF umwandeln",
+ description: "PNG online in TIFF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF in JPG umwandeln",
+ description: "TIFF online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "tiff-to-png": {
+ name: "TIFF in PNG umwandeln",
+ description: "TIFF online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "psd-to-jpg": {
+ name: "PSD in JPG umwandeln",
+ description: "PSD online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "psd-to-png": {
+ name: "PSD in PNG umwandeln",
+ description: "PSD online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-eps": {
+ name: "PNG in EPS umwandeln",
+ description: "PNG online in EPS umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-eps": {
+ name: "JPG in EPS umwandeln",
+ description: "JPG online in EPS umwandeln. Schnell, kostenlos und privat.",
+ },
+ "eps-to-png": {
+ name: "EPS in PNG umwandeln",
+ description: "EPS online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "eps-to-jpg": {
+ name: "EPS in JPG umwandeln",
+ description: "EPS online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-svg": {
+ name: "PNG in SVG umwandeln",
+ description: "PNG online in SVG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-svg": {
+ name: "JPG in SVG umwandeln",
+ description: "JPG online in SVG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF in SVG umwandeln",
+ description: "TIFF online in SVG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "psd-to-svg": {
+ name: "PSD in SVG umwandeln",
+ description: "PSD online in SVG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "eps-to-svg": {
+ name: "EPS in SVG umwandeln",
+ description: "EPS online in SVG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "svg-to-png": {
+ name: "SVG in PNG umwandeln",
+ description: "SVG online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "svg-to-jpg": {
+ name: "SVG in JPG umwandeln",
+ description: "SVG online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG in PDF umwandeln",
+ description: "JPG online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "png-to-pdf": {
+ name: "PNG in PDF umwandeln",
+ description: "PNG online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC in PDF umwandeln",
+ description: "HEIC online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF in PDF umwandeln",
+ description: "TIFF online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webp-to-pdf": {
+ name: "WebP in PDF umwandeln",
+ description: "WebP online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "gif-to-pdf": {
+ name: "GIF in PDF umwandeln",
+ description: "GIF online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "eps-to-pdf": {
+ name: "EPS in PDF umwandeln",
+ description: "EPS online in PDF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF in JPG umwandeln",
+ description: "PDF online in JPG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "pdf-to-png": {
+ name: "PDF in PNG umwandeln",
+ description: "PDF online in PNG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF in TIFF umwandeln",
+ description: "PDF online in TIFF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mov-to-mp4": {
+ name: "MOV in MP4 umwandeln",
+ description: "MOV online in MP4 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM in MP4 umwandeln",
+ description: "WEBM online in MP4 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV in MP4 umwandeln",
+ description: "MKV online in MP4 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "avi-to-mp4": {
+ name: "AVI in MP4 umwandeln",
+ description: "AVI online in MP4 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 in MOV umwandeln",
+ description: "MP4 online in MOV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 in WEBM umwandeln",
+ description: "MP4 online in WEBM umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webm-to-mov": {
+ name: "WEBM in MOV umwandeln",
+ description: "WEBM online in MOV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mkv-to-mov": {
+ name: "MKV in MOV umwandeln",
+ description: "MKV online in MOV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "avi-to-mov": {
+ name: "AVI in MOV umwandeln",
+ description: "AVI online in MOV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 in AVI umwandeln",
+ description: "MP4 online in AVI umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mov-to-avi": {
+ name: "MOV in AVI umwandeln",
+ description: "MOV online in AVI umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mkv-to-avi": {
+ name: "MKV in AVI umwandeln",
+ description: "MKV online in AVI umwandeln. Schnell, kostenlos und privat.",
+ },
+ "avi-to-mkv": {
+ name: "AVI in MKV umwandeln",
+ description: "AVI online in MKV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 in GIF umwandeln",
+ description: "MP4 online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mov-to-gif": {
+ name: "MOV in GIF umwandeln",
+ description: "MOV online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mkv-to-gif": {
+ name: "MKV in GIF umwandeln",
+ description: "MKV online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "avi-to-gif": {
+ name: "AVI in GIF umwandeln",
+ description: "AVI online in GIF umwandeln. Schnell, kostenlos und privat.",
+ },
+ "gif-to-mp4": {
+ name: "GIF in MP4 umwandeln",
+ description: "GIF online in MP4 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "gif-to-webm": {
+ name: "GIF in WEBM umwandeln",
+ description: "GIF online in WEBM umwandeln. Schnell, kostenlos und privat.",
+ },
+ "gif-to-mov": {
+ name: "GIF in MOV umwandeln",
+ description: "GIF online in MOV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 in MP3 umwandeln",
+ description: "MP4 online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mov-to-mp3": {
+ name: "MOV in MP3 umwandeln",
+ description: "MOV online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV in MP3 umwandeln",
+ description: "MKV online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM in MP3 umwandeln",
+ description: "WEBM online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "avi-to-mp3": {
+ name: "AVI in MP3 umwandeln",
+ description: "AVI online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 in WAV umwandeln",
+ description: "MP4 online in WAV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mov-to-wav": {
+ name: "MOV in WAV umwandeln",
+ description: "MOV online in WAV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 in OGG umwandeln",
+ description: "MP4 online in OGG umwandeln. Schnell, kostenlos und privat.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A in MP3 umwandeln",
+ description: "M4A online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "m4a-to-wav": {
+ name: "M4A in WAV umwandeln",
+ description: "M4A online in WAV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "aac-to-mp3": {
+ name: "AAC in MP3 umwandeln",
+ description: "AAC online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "aac-to-wav": {
+ name: "AAC in WAV umwandeln",
+ description: "AAC online in WAV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "aac-to-flac": {
+ name: "AAC in FLAC umwandeln",
+ description: "AAC online in FLAC umwandeln. Schnell, kostenlos und privat.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG in MP3 umwandeln",
+ description: "OGG online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "ogg-to-wav": {
+ name: "OGG in WAV umwandeln",
+ description: "OGG online in WAV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "wav-to-mp3": {
+ name: "WAV in MP3 umwandeln",
+ description: "WAV online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 in WAV umwandeln",
+ description: "MP3 online in WAV umwandeln. Schnell, kostenlos und privat.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC in MP3 umwandeln",
+ description: "FLAC online in MP3 umwandeln. Schnell, kostenlos und privat.",
+ },
+ "excel-to-csv": {
+ name: "Excel in CSV umwandeln",
+ description: "Excel online in CSV umwandeln. Schnell, kostenlos und privat.",
+ },
+ // END conversion-presets
resize: {
name: "Größe ändern",
description: "Größe nach Pixeln, Prozent oder Social-Media-Vorlagen ändern",
@@ -151,7 +485,7 @@ export const de: TranslationKeys = {
description: "Unerwünschte Objekte mit AI entfernen",
},
ocr: {
- name: "OCR / Texterkennung",
+ name: "Text aus Bild extrahieren (OCR)",
description: "Text aus Bildern mit AI-gestützter Genauigkeit extrahieren",
},
"ocr-pdf": {
@@ -2760,6 +3094,14 @@ export const de: TranslationKeys = {
"Diagnosearchiv mit bereinigter Konfiguration, Protokollen und Auftragsdaten zur Fehlerbehebung herunterladen.",
supportBundleFailed: "Support-Paket konnte nicht heruntergeladen werden.",
},
+ privacy: {
+ title: "Datenschutz",
+ description:
+ "Anonyme Produktanalysen helfen, SnapOtter zu verbessern. Sie sind standardmäßig aktiviert und werden von einem Administrator für die gesamte Instanz festgelegt.",
+ analyticsLabel: "Anonyme Produktanalysen",
+ analyticsDescription:
+ "Teilen Sie anonyme Nutzungsdaten (welche Tools ausgeführt werden, Dauer, Fehlercodes) und Absturzberichte. Keine IP-Adresse, keine Kontoidentität. Wir erfassen niemals Ihre Dateinamen, Dateiinhalte, OCR-Ausgaben, Bildmetadaten oder Dokumenttexte. Schalten Sie dies aus, um alles davon zu beenden.",
+ },
security: {
heading: "Sicherheit",
description: "Passwort- und Authentifizierungseinstellungen.",
@@ -3060,7 +3402,7 @@ export const de: TranslationKeys = {
heading: "Info",
appName: "SnapOtter",
appDescription:
- "Eine selbst gehostete, datenschutzorientierte Dateiverarbeitungssuite mit 157 Werkzeugen. Konvertieren, komprimieren, bearbeiten, transkribieren, OCR und Bild-, Video-, Audio-, Dokument- und Datenabläufe automatisieren, ohne Daten in die Cloud zu senden.",
+ "Eine selbst gehostete, datenschutzorientierte Dateiverarbeitungssuite mit 240 Werkzeugen. Konvertieren, komprimieren, bearbeiten, transkribieren, OCR und Bild-, Video-, Audio-, Dokument- und Datenabläufe automatisieren, ohne Daten in die Cloud zu senden.",
versionLabel: "Version:",
linksHeading: "Links",
githubLink: "GitHub-Repository",
@@ -3120,7 +3462,7 @@ export const de: TranslationKeys = {
"Keine Limits. Keine versteckten Grenzen.",
"Funktioniert komplett offline.",
"Unbegrenzte Stapelverarbeitung.",
- "157 Werkzeuge.",
+ "240 Werkzeuge.",
"16 AI-Modelle. Ihre Hardware.",
"Blitzschnell. Basiert auf Sharp.",
"Geeignet für abgeschottete Netzwerke.",
@@ -3185,6 +3527,7 @@ export const de: TranslationKeys = {
toolPalette: "Werkzeugpalette",
clickToAdd: "Zum Hinzufügen zur Pipeline klicken",
savedLabel: "Gespeichert",
+ templatesLabel: "Vorlagen",
importButton: "Importieren",
noSavedPipelines: "Keine gespeicherten Pipelines",
stepCount: "({count} Schritt)",
@@ -3472,4 +3815,44 @@ export const de: TranslationKeys = {
navigationMenu: "Navigation",
homeLink: "SnapOtter Startseite",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Web-optimieren",
+ description:
+ "Bild verkleinern, in WebP umwandeln und komprimieren für schnelles Laden im Web.",
+ },
+ "email-friendly": {
+ name: "E-Mail-tauglich",
+ description: "Bild so verkleinern, dass es als E-Mail-Anhang klein genug ist.",
+ },
+ "privacy-scrub": {
+ name: "Metadaten entfernen",
+ description: "EXIF, GPS und andere Metadaten entfernen, dann komprimieren.",
+ },
+ "social-square": {
+ name: "Social-Quadrat",
+ description: "Auf 1:1 zuschneiden und für Social-Media-Beiträge komprimieren.",
+ },
+ "watermark-batch": {
+ name: "Wasserzeichen-Stapel",
+ description: "Text-Wasserzeichen auf Bilder setzen, dann komprimieren.",
+ },
+ "shrink-pdf-email": {
+ name: "PDF für E-Mail verkleinern",
+ description: "PDF reduzieren und stark komprimieren, damit es E-Mail-Grenzen einhält.",
+ },
+ "podcast-polish": {
+ name: "Podcast-Feinschliff",
+ description: "Stille entfernen, Lautstärke normalisieren und Ein-/Ausblendungen hinzufügen.",
+ },
+ "cut-out-subject": {
+ name: "Motiv freistellen",
+ description:
+ "Hintergrund per KI entfernen und das transparente Freisteller-Bild komprimieren.",
+ },
+ "restore-old-photo": {
+ name: "Altes Foto restaurieren",
+ description: "Altes oder beschädigtes Foto per KI reparieren, kolorieren und hochskalieren.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/en.ts b/packages/shared/src/i18n/en.ts
index 7db0d678..dd9ebb86 100644
--- a/packages/shared/src/i18n/en.ts
+++ b/packages/shared/src/i18n/en.ts
@@ -76,6 +76,340 @@ export const en = {
documentsAndFiles: "PDF & Files",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG to PNG",
+ description: "Convert JPG to PNG online. Fast, free, private, no signup.",
+ },
+ "png-to-jpg": {
+ name: "PNG to JPG",
+ description: "Convert PNG to JPG online. Fast, free, private, no signup.",
+ },
+ "jpg-to-webp": {
+ name: "JPG to WebP",
+ description: "Convert JPG to WebP online. Fast, free, private, no signup.",
+ },
+ "png-to-webp": {
+ name: "PNG to WebP",
+ description: "Convert PNG to WebP online. Fast, free, private, no signup.",
+ },
+ "webp-to-jpg": {
+ name: "WebP to JPG",
+ description: "Convert WebP to JPG online. Fast, free, private, no signup.",
+ },
+ "webp-to-png": {
+ name: "WebP to PNG",
+ description: "Convert WebP to PNG online. Fast, free, private, no signup.",
+ },
+ "jpg-to-avif": {
+ name: "JPG to AVIF",
+ description: "Convert JPG to AVIF online. Fast, free, private, no signup.",
+ },
+ "png-to-avif": {
+ name: "PNG to AVIF",
+ description: "Convert PNG to AVIF online. Fast, free, private, no signup.",
+ },
+ "webp-to-avif": {
+ name: "WebP to AVIF",
+ description: "Convert WebP to AVIF online. Fast, free, private, no signup.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC to JPG",
+ description: "Convert HEIC to JPG online. Fast, free, private, no signup.",
+ },
+ "heic-to-png": {
+ name: "HEIC to PNG",
+ description: "Convert HEIC to PNG online. Fast, free, private, no signup.",
+ },
+ "heic-to-avif": {
+ name: "HEIC to AVIF",
+ description: "Convert HEIC to AVIF online. Fast, free, private, no signup.",
+ },
+ "jpg-to-gif": {
+ name: "JPG to GIF",
+ description: "Convert JPG to GIF online. Fast, free, private, no signup.",
+ },
+ "png-to-gif": {
+ name: "PNG to GIF",
+ description: "Convert PNG to GIF online. Fast, free, private, no signup.",
+ },
+ "gif-to-jpg": {
+ name: "GIF to JPG",
+ description: "Convert GIF to JPG online. Fast, free, private, no signup.",
+ },
+ "gif-to-png": {
+ name: "GIF to PNG",
+ description: "Convert GIF to PNG online. Fast, free, private, no signup.",
+ },
+ "webp-to-gif": {
+ name: "WebP to GIF",
+ description: "Convert WebP to GIF online. Fast, free, private, no signup.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG to TIFF",
+ description: "Convert JPG to TIFF online. Fast, free, private, no signup.",
+ },
+ "png-to-tiff": {
+ name: "PNG to TIFF",
+ description: "Convert PNG to TIFF online. Fast, free, private, no signup.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF to JPG",
+ description: "Convert TIFF to JPG online. Fast, free, private, no signup.",
+ },
+ "tiff-to-png": {
+ name: "TIFF to PNG",
+ description: "Convert TIFF to PNG online. Fast, free, private, no signup.",
+ },
+ "psd-to-jpg": {
+ name: "PSD to JPG",
+ description: "Convert PSD to JPG online. Fast, free, private, no signup.",
+ },
+ "psd-to-png": {
+ name: "PSD to PNG",
+ description: "Convert PSD to PNG online. Fast, free, private, no signup.",
+ },
+ "png-to-eps": {
+ name: "PNG to EPS",
+ description: "Convert PNG to EPS online. Fast, free, private, no signup.",
+ },
+ "jpg-to-eps": {
+ name: "JPG to EPS",
+ description: "Convert JPG to EPS online. Fast, free, private, no signup.",
+ },
+ "eps-to-png": {
+ name: "EPS to PNG",
+ description: "Convert EPS to PNG online. Fast, free, private, no signup.",
+ },
+ "eps-to-jpg": {
+ name: "EPS to JPG",
+ description: "Convert EPS to JPG online. Fast, free, private, no signup.",
+ },
+ "png-to-svg": {
+ name: "PNG to SVG",
+ description: "Convert PNG to SVG online. Fast, free, private, no signup.",
+ },
+ "jpg-to-svg": {
+ name: "JPG to SVG",
+ description: "Convert JPG to SVG online. Fast, free, private, no signup.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF to SVG",
+ description: "Convert TIFF to SVG online. Fast, free, private, no signup.",
+ },
+ "psd-to-svg": {
+ name: "PSD to SVG",
+ description: "Convert PSD to SVG online. Fast, free, private, no signup.",
+ },
+ "eps-to-svg": {
+ name: "EPS to SVG",
+ description: "Convert EPS to SVG online. Fast, free, private, no signup.",
+ },
+ "svg-to-png": {
+ name: "SVG to PNG",
+ description: "Convert SVG to PNG online. Fast, free, private, no signup.",
+ },
+ "svg-to-jpg": {
+ name: "SVG to JPG",
+ description: "Convert SVG to JPG online. Fast, free, private, no signup.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG to PDF",
+ description: "Convert JPG to PDF online. Fast, free, private, no signup.",
+ },
+ "png-to-pdf": {
+ name: "PNG to PDF",
+ description: "Convert PNG to PDF online. Fast, free, private, no signup.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC to PDF",
+ description: "Convert HEIC to PDF online. Fast, free, private, no signup.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF to PDF",
+ description: "Convert TIFF to PDF online. Fast, free, private, no signup.",
+ },
+ "webp-to-pdf": {
+ name: "WebP to PDF",
+ description: "Convert WebP to PDF online. Fast, free, private, no signup.",
+ },
+ "gif-to-pdf": {
+ name: "GIF to PDF",
+ description: "Convert GIF to PDF online. Fast, free, private, no signup.",
+ },
+ "eps-to-pdf": {
+ name: "EPS to PDF",
+ description: "Convert EPS to PDF online. Fast, free, private, no signup.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF to JPG",
+ description: "Convert PDF to JPG online. Fast, free, private, no signup.",
+ },
+ "pdf-to-png": {
+ name: "PDF to PNG",
+ description: "Convert PDF to PNG online. Fast, free, private, no signup.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF to TIFF",
+ description: "Convert PDF to TIFF online. Fast, free, private, no signup.",
+ },
+ "mov-to-mp4": {
+ name: "MOV to MP4",
+ description: "Convert MOV to MP4 online. Fast, free, private, no signup.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM to MP4",
+ description: "Convert WEBM to MP4 online. Fast, free, private, no signup.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV to MP4",
+ description: "Convert MKV to MP4 online. Fast, free, private, no signup.",
+ },
+ "avi-to-mp4": {
+ name: "AVI to MP4",
+ description: "Convert AVI to MP4 online. Fast, free, private, no signup.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 to MOV",
+ description: "Convert MP4 to MOV online. Fast, free, private, no signup.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 to WEBM",
+ description: "Convert MP4 to WEBM online. Fast, free, private, no signup.",
+ },
+ "webm-to-mov": {
+ name: "WEBM to MOV",
+ description: "Convert WEBM to MOV online. Fast, free, private, no signup.",
+ },
+ "mkv-to-mov": {
+ name: "MKV to MOV",
+ description: "Convert MKV to MOV online. Fast, free, private, no signup.",
+ },
+ "avi-to-mov": {
+ name: "AVI to MOV",
+ description: "Convert AVI to MOV online. Fast, free, private, no signup.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 to AVI",
+ description: "Convert MP4 to AVI online. Fast, free, private, no signup.",
+ },
+ "mov-to-avi": {
+ name: "MOV to AVI",
+ description: "Convert MOV to AVI online. Fast, free, private, no signup.",
+ },
+ "mkv-to-avi": {
+ name: "MKV to AVI",
+ description: "Convert MKV to AVI online. Fast, free, private, no signup.",
+ },
+ "avi-to-mkv": {
+ name: "AVI to MKV",
+ description: "Convert AVI to MKV online. Fast, free, private, no signup.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 to GIF",
+ description: "Convert MP4 to GIF online. Fast, free, private, no signup.",
+ },
+ "mov-to-gif": {
+ name: "MOV to GIF",
+ description: "Convert MOV to GIF online. Fast, free, private, no signup.",
+ },
+ "mkv-to-gif": {
+ name: "MKV to GIF",
+ description: "Convert MKV to GIF online. Fast, free, private, no signup.",
+ },
+ "avi-to-gif": {
+ name: "AVI to GIF",
+ description: "Convert AVI to GIF online. Fast, free, private, no signup.",
+ },
+ "gif-to-mp4": {
+ name: "GIF to MP4",
+ description: "Convert GIF to MP4 online. Fast, free, private, no signup.",
+ },
+ "gif-to-webm": {
+ name: "GIF to WEBM",
+ description: "Convert GIF to WEBM online. Fast, free, private, no signup.",
+ },
+ "gif-to-mov": {
+ name: "GIF to MOV",
+ description: "Convert GIF to MOV online. Fast, free, private, no signup.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 to MP3",
+ description: "Convert MP4 to MP3 online. Fast, free, private, no signup.",
+ },
+ "mov-to-mp3": {
+ name: "MOV to MP3",
+ description: "Convert MOV to MP3 online. Fast, free, private, no signup.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV to MP3",
+ description: "Convert MKV to MP3 online. Fast, free, private, no signup.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM to MP3",
+ description: "Convert WEBM to MP3 online. Fast, free, private, no signup.",
+ },
+ "avi-to-mp3": {
+ name: "AVI to MP3",
+ description: "Convert AVI to MP3 online. Fast, free, private, no signup.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 to WAV",
+ description: "Convert MP4 to WAV online. Fast, free, private, no signup.",
+ },
+ "mov-to-wav": {
+ name: "MOV to WAV",
+ description: "Convert MOV to WAV online. Fast, free, private, no signup.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 to OGG",
+ description: "Convert MP4 to OGG online. Fast, free, private, no signup.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A to MP3",
+ description: "Convert M4A to MP3 online. Fast, free, private, no signup.",
+ },
+ "m4a-to-wav": {
+ name: "M4A to WAV",
+ description: "Convert M4A to WAV online. Fast, free, private, no signup.",
+ },
+ "aac-to-mp3": {
+ name: "AAC to MP3",
+ description: "Convert AAC to MP3 online. Fast, free, private, no signup.",
+ },
+ "aac-to-wav": {
+ name: "AAC to WAV",
+ description: "Convert AAC to WAV online. Fast, free, private, no signup.",
+ },
+ "aac-to-flac": {
+ name: "AAC to FLAC",
+ description: "Convert AAC to FLAC online. Fast, free, private, no signup.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG to MP3",
+ description: "Convert OGG to MP3 online. Fast, free, private, no signup.",
+ },
+ "ogg-to-wav": {
+ name: "OGG to WAV",
+ description: "Convert OGG to WAV online. Fast, free, private, no signup.",
+ },
+ "wav-to-mp3": {
+ name: "WAV to MP3",
+ description: "Convert WAV to MP3 online. Fast, free, private, no signup.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 to WAV",
+ description: "Convert MP3 to WAV online. Fast, free, private, no signup.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC to MP3",
+ description: "Convert FLAC to MP3 online. Fast, free, private, no signup.",
+ },
+ "excel-to-csv": {
+ name: "Excel to CSV",
+ description: "Convert Excel to CSV online. Fast, free, private, no signup.",
+ },
+ // END conversion-presets
resize: {
name: "Resize",
description: "Resize by pixels, percentage, or social media presets",
@@ -131,7 +465,7 @@ export const en = {
upscale: { name: "Image Upscaling", description: "AI super-resolution enhancement" },
"erase-object": { name: "Object Eraser", description: "Remove unwanted objects with AI" },
ocr: {
- name: "OCR / Text Extraction",
+ name: "Extract Text from Image (OCR)",
description: "Extract text from images with AI-powered accuracy",
},
"ocr-pdf": {
@@ -2704,6 +3038,14 @@ export const en = {
"Download a diagnostic zip with redacted config, logs, and job data for troubleshooting.",
supportBundleFailed: "Failed to download support bundle.",
},
+ privacy: {
+ title: "Privacy",
+ description:
+ "Anonymous Product Analytics helps improve SnapOtter. It is on by default and set for the whole instance by an administrator.",
+ analyticsLabel: "Anonymous Product Analytics",
+ analyticsDescription:
+ "Share anonymous usage data (which tools run, durations, error codes) and crash reports. No IP address, no account identity. We never collect your file names, file contents, OCR output, image metadata, or document text. Turn this off to stop all of it.",
+ },
security: {
heading: "Security",
description: "Password and authentication settings.",
@@ -2992,7 +3334,7 @@ export const en = {
heading: "About",
appName: "SnapOtter",
appDescription:
- "A self-hosted, privacy-first file processing suite with 157 tools. Convert, compress, edit, transcribe, OCR, and automate image, video, audio, document, and data workflows without sending data to the cloud.",
+ "A self-hosted, privacy-first file processing suite with 240 tools. Convert, compress, edit, transcribe, OCR, and automate image, video, audio, document, and data workflows without sending data to the cloud.",
versionLabel: "Version:",
linksHeading: "Links",
githubLink: "GitHub Repository",
@@ -3051,7 +3393,7 @@ export const en = {
"No limits. No hidden caps.",
"Works fully offline.",
"Unlimited batch processing.",
- "157 tools.",
+ "240 tools.",
"16 AI models. Your hardware.",
"Lightning fast. Built on Sharp.",
"Air-gapped ready.",
@@ -3115,6 +3457,7 @@ export const en = {
toolPalette: "Tool Palette",
clickToAdd: "Click to add to pipeline",
savedLabel: "Saved",
+ templatesLabel: "Templates",
importButton: "Import",
noSavedPipelines: "No saved pipelines",
stepCount: "({count} step)",
@@ -3400,6 +3743,44 @@ export const en = {
navigationMenu: "Navigation",
homeLink: "SnapOtter home",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Web-optimize",
+ description: "Resize, convert to WebP, and compress an image for fast web loading.",
+ },
+ "email-friendly": {
+ name: "Email-friendly",
+ description: "Shrink an image so it's small enough to attach to an email.",
+ },
+ "privacy-scrub": {
+ name: "Privacy scrub",
+ description: "Strip EXIF, GPS, and other metadata, then compress.",
+ },
+ "social-square": {
+ name: "Social square",
+ description: "Crop to a 1:1 square and compress for social posts.",
+ },
+ "watermark-batch": {
+ name: "Watermark batch",
+ description: "Stamp a text watermark on images, then compress.",
+ },
+ "shrink-pdf-email": {
+ name: "Shrink PDF for email",
+ description: "Flatten and aggressively compress a PDF to fit email limits.",
+ },
+ "podcast-polish": {
+ name: "Podcast polish",
+ description: "Remove dead air, normalize loudness, and add fades to a recording.",
+ },
+ "cut-out-subject": {
+ name: "Cut out subject",
+ description: "Remove the background with AI and compress the transparent cutout.",
+ },
+ "restore-old-photo": {
+ name: "Restore old photo",
+ description: "Repair, colorize, and upscale an old or damaged photo with AI.",
+ },
+ },
} as const;
type DeepStringRecord = {
diff --git a/packages/shared/src/i18n/es.ts b/packages/shared/src/i18n/es.ts
index ad3e21ca..780b98e7 100644
--- a/packages/shared/src/i18n/es.ts
+++ b/packages/shared/src/i18n/es.ts
@@ -73,6 +73,340 @@ export const es: TranslationKeys = {
documentsAndFiles: "PDF y archivos",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG a PNG",
+ description: "Convierte JPG a PNG en línea. Rápido, gratis y privado.",
+ },
+ "png-to-jpg": {
+ name: "PNG a JPG",
+ description: "Convierte PNG a JPG en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-webp": {
+ name: "JPG a WebP",
+ description: "Convierte JPG a WebP en línea. Rápido, gratis y privado.",
+ },
+ "png-to-webp": {
+ name: "PNG a WebP",
+ description: "Convierte PNG a WebP en línea. Rápido, gratis y privado.",
+ },
+ "webp-to-jpg": {
+ name: "WebP a JPG",
+ description: "Convierte WebP a JPG en línea. Rápido, gratis y privado.",
+ },
+ "webp-to-png": {
+ name: "WebP a PNG",
+ description: "Convierte WebP a PNG en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-avif": {
+ name: "JPG a AVIF",
+ description: "Convierte JPG a AVIF en línea. Rápido, gratis y privado.",
+ },
+ "png-to-avif": {
+ name: "PNG a AVIF",
+ description: "Convierte PNG a AVIF en línea. Rápido, gratis y privado.",
+ },
+ "webp-to-avif": {
+ name: "WebP a AVIF",
+ description: "Convierte WebP a AVIF en línea. Rápido, gratis y privado.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC a JPG",
+ description: "Convierte HEIC a JPG en línea. Rápido, gratis y privado.",
+ },
+ "heic-to-png": {
+ name: "HEIC a PNG",
+ description: "Convierte HEIC a PNG en línea. Rápido, gratis y privado.",
+ },
+ "heic-to-avif": {
+ name: "HEIC a AVIF",
+ description: "Convierte HEIC a AVIF en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-gif": {
+ name: "JPG a GIF",
+ description: "Convierte JPG a GIF en línea. Rápido, gratis y privado.",
+ },
+ "png-to-gif": {
+ name: "PNG a GIF",
+ description: "Convierte PNG a GIF en línea. Rápido, gratis y privado.",
+ },
+ "gif-to-jpg": {
+ name: "GIF a JPG",
+ description: "Convierte GIF a JPG en línea. Rápido, gratis y privado.",
+ },
+ "gif-to-png": {
+ name: "GIF a PNG",
+ description: "Convierte GIF a PNG en línea. Rápido, gratis y privado.",
+ },
+ "webp-to-gif": {
+ name: "WebP a GIF",
+ description: "Convierte WebP a GIF en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG a TIFF",
+ description: "Convierte JPG a TIFF en línea. Rápido, gratis y privado.",
+ },
+ "png-to-tiff": {
+ name: "PNG a TIFF",
+ description: "Convierte PNG a TIFF en línea. Rápido, gratis y privado.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF a JPG",
+ description: "Convierte TIFF a JPG en línea. Rápido, gratis y privado.",
+ },
+ "tiff-to-png": {
+ name: "TIFF a PNG",
+ description: "Convierte TIFF a PNG en línea. Rápido, gratis y privado.",
+ },
+ "psd-to-jpg": {
+ name: "PSD a JPG",
+ description: "Convierte PSD a JPG en línea. Rápido, gratis y privado.",
+ },
+ "psd-to-png": {
+ name: "PSD a PNG",
+ description: "Convierte PSD a PNG en línea. Rápido, gratis y privado.",
+ },
+ "png-to-eps": {
+ name: "PNG a EPS",
+ description: "Convierte PNG a EPS en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-eps": {
+ name: "JPG a EPS",
+ description: "Convierte JPG a EPS en línea. Rápido, gratis y privado.",
+ },
+ "eps-to-png": {
+ name: "EPS a PNG",
+ description: "Convierte EPS a PNG en línea. Rápido, gratis y privado.",
+ },
+ "eps-to-jpg": {
+ name: "EPS a JPG",
+ description: "Convierte EPS a JPG en línea. Rápido, gratis y privado.",
+ },
+ "png-to-svg": {
+ name: "PNG a SVG",
+ description: "Convierte PNG a SVG en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-svg": {
+ name: "JPG a SVG",
+ description: "Convierte JPG a SVG en línea. Rápido, gratis y privado.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF a SVG",
+ description: "Convierte TIFF a SVG en línea. Rápido, gratis y privado.",
+ },
+ "psd-to-svg": {
+ name: "PSD a SVG",
+ description: "Convierte PSD a SVG en línea. Rápido, gratis y privado.",
+ },
+ "eps-to-svg": {
+ name: "EPS a SVG",
+ description: "Convierte EPS a SVG en línea. Rápido, gratis y privado.",
+ },
+ "svg-to-png": {
+ name: "SVG a PNG",
+ description: "Convierte SVG a PNG en línea. Rápido, gratis y privado.",
+ },
+ "svg-to-jpg": {
+ name: "SVG a JPG",
+ description: "Convierte SVG a JPG en línea. Rápido, gratis y privado.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG a PDF",
+ description: "Convierte JPG a PDF en línea. Rápido, gratis y privado.",
+ },
+ "png-to-pdf": {
+ name: "PNG a PDF",
+ description: "Convierte PNG a PDF en línea. Rápido, gratis y privado.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC a PDF",
+ description: "Convierte HEIC a PDF en línea. Rápido, gratis y privado.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF a PDF",
+ description: "Convierte TIFF a PDF en línea. Rápido, gratis y privado.",
+ },
+ "webp-to-pdf": {
+ name: "WebP a PDF",
+ description: "Convierte WebP a PDF en línea. Rápido, gratis y privado.",
+ },
+ "gif-to-pdf": {
+ name: "GIF a PDF",
+ description: "Convierte GIF a PDF en línea. Rápido, gratis y privado.",
+ },
+ "eps-to-pdf": {
+ name: "EPS a PDF",
+ description: "Convierte EPS a PDF en línea. Rápido, gratis y privado.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF a JPG",
+ description: "Convierte PDF a JPG en línea. Rápido, gratis y privado.",
+ },
+ "pdf-to-png": {
+ name: "PDF a PNG",
+ description: "Convierte PDF a PNG en línea. Rápido, gratis y privado.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF a TIFF",
+ description: "Convierte PDF a TIFF en línea. Rápido, gratis y privado.",
+ },
+ "mov-to-mp4": {
+ name: "MOV a MP4",
+ description: "Convierte MOV a MP4 en línea. Rápido, gratis y privado.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM a MP4",
+ description: "Convierte WEBM a MP4 en línea. Rápido, gratis y privado.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV a MP4",
+ description: "Convierte MKV a MP4 en línea. Rápido, gratis y privado.",
+ },
+ "avi-to-mp4": {
+ name: "AVI a MP4",
+ description: "Convierte AVI a MP4 en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 a MOV",
+ description: "Convierte MP4 a MOV en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 a WEBM",
+ description: "Convierte MP4 a WEBM en línea. Rápido, gratis y privado.",
+ },
+ "webm-to-mov": {
+ name: "WEBM a MOV",
+ description: "Convierte WEBM a MOV en línea. Rápido, gratis y privado.",
+ },
+ "mkv-to-mov": {
+ name: "MKV a MOV",
+ description: "Convierte MKV a MOV en línea. Rápido, gratis y privado.",
+ },
+ "avi-to-mov": {
+ name: "AVI a MOV",
+ description: "Convierte AVI a MOV en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 a AVI",
+ description: "Convierte MP4 a AVI en línea. Rápido, gratis y privado.",
+ },
+ "mov-to-avi": {
+ name: "MOV a AVI",
+ description: "Convierte MOV a AVI en línea. Rápido, gratis y privado.",
+ },
+ "mkv-to-avi": {
+ name: "MKV a AVI",
+ description: "Convierte MKV a AVI en línea. Rápido, gratis y privado.",
+ },
+ "avi-to-mkv": {
+ name: "AVI a MKV",
+ description: "Convierte AVI a MKV en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 a GIF",
+ description: "Convierte MP4 a GIF en línea. Rápido, gratis y privado.",
+ },
+ "mov-to-gif": {
+ name: "MOV a GIF",
+ description: "Convierte MOV a GIF en línea. Rápido, gratis y privado.",
+ },
+ "mkv-to-gif": {
+ name: "MKV a GIF",
+ description: "Convierte MKV a GIF en línea. Rápido, gratis y privado.",
+ },
+ "avi-to-gif": {
+ name: "AVI a GIF",
+ description: "Convierte AVI a GIF en línea. Rápido, gratis y privado.",
+ },
+ "gif-to-mp4": {
+ name: "GIF a MP4",
+ description: "Convierte GIF a MP4 en línea. Rápido, gratis y privado.",
+ },
+ "gif-to-webm": {
+ name: "GIF a WEBM",
+ description: "Convierte GIF a WEBM en línea. Rápido, gratis y privado.",
+ },
+ "gif-to-mov": {
+ name: "GIF a MOV",
+ description: "Convierte GIF a MOV en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 a MP3",
+ description: "Convierte MP4 a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "mov-to-mp3": {
+ name: "MOV a MP3",
+ description: "Convierte MOV a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV a MP3",
+ description: "Convierte MKV a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM a MP3",
+ description: "Convierte WEBM a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "avi-to-mp3": {
+ name: "AVI a MP3",
+ description: "Convierte AVI a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 a WAV",
+ description: "Convierte MP4 a WAV en línea. Rápido, gratis y privado.",
+ },
+ "mov-to-wav": {
+ name: "MOV a WAV",
+ description: "Convierte MOV a WAV en línea. Rápido, gratis y privado.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 a OGG",
+ description: "Convierte MP4 a OGG en línea. Rápido, gratis y privado.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A a MP3",
+ description: "Convierte M4A a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "m4a-to-wav": {
+ name: "M4A a WAV",
+ description: "Convierte M4A a WAV en línea. Rápido, gratis y privado.",
+ },
+ "aac-to-mp3": {
+ name: "AAC a MP3",
+ description: "Convierte AAC a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "aac-to-wav": {
+ name: "AAC a WAV",
+ description: "Convierte AAC a WAV en línea. Rápido, gratis y privado.",
+ },
+ "aac-to-flac": {
+ name: "AAC a FLAC",
+ description: "Convierte AAC a FLAC en línea. Rápido, gratis y privado.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG a MP3",
+ description: "Convierte OGG a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "ogg-to-wav": {
+ name: "OGG a WAV",
+ description: "Convierte OGG a WAV en línea. Rápido, gratis y privado.",
+ },
+ "wav-to-mp3": {
+ name: "WAV a MP3",
+ description: "Convierte WAV a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 a WAV",
+ description: "Convierte MP3 a WAV en línea. Rápido, gratis y privado.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC a MP3",
+ description: "Convierte FLAC a MP3 en línea. Rápido, gratis y privado.",
+ },
+ "excel-to-csv": {
+ name: "Excel a CSV",
+ description: "Convierte Excel a CSV en línea. Rápido, gratis y privado.",
+ },
+ // END conversion-presets
resize: {
name: "Redimensionar",
description: "Redimensiona por píxeles, porcentaje o presets de redes sociales",
@@ -140,7 +474,7 @@ export const es: TranslationKeys = {
description: "Elimina objetos no deseados con AI",
},
ocr: {
- name: "OCR / Extracción de texto",
+ name: "Extraer texto de imagen (OCR)",
description: "Extrae texto de imágenes con precisión potenciada por AI",
},
"ocr-pdf": {
@@ -2743,6 +3077,14 @@ export const es: TranslationKeys = {
"Descarga un ZIP de diagnóstico con configuración anonimizada, registros y datos de trabajos para solución de problemas.",
supportBundleFailed: "Error al descargar el paquete de soporte.",
},
+ privacy: {
+ title: "Privacidad",
+ description:
+ "Las analíticas de producto anónimas ayudan a mejorar SnapOtter. Están activadas de forma predeterminada y un administrador las configura para toda la instancia.",
+ analyticsLabel: "Analíticas de producto anónimas",
+ analyticsDescription:
+ "Comparte datos de uso anónimos (qué herramientas se ejecutan, duraciones, códigos de error) e informes de fallos. Sin dirección IP ni identidad de cuenta. Nunca recopilamos los nombres de tus archivos, su contenido, los resultados de OCR, los metadatos de imágenes ni el texto de los documentos. Desactiva esto para detenerlo todo.",
+ },
security: {
heading: "Seguridad",
description: "Configuración de contraseña y autenticación.",
@@ -3041,7 +3383,7 @@ export const es: TranslationKeys = {
heading: "Acerca de",
appName: "SnapOtter",
appDescription:
- "Una suite de procesamiento de archivos autoalojada y con privacidad como prioridad, con 157 herramientas. Convierte, comprime, edita, transcribe, OCR y automatiza flujos de trabajo de imágenes, video, audio, documentos y datos sin enviar datos a la nube.",
+ "Una suite de procesamiento de archivos autoalojada y con privacidad como prioridad, con 240 herramientas. Convierte, comprime, edita, transcribe, OCR y automatiza flujos de trabajo de imágenes, video, audio, documentos y datos sin enviar datos a la nube.",
versionLabel: "Versión:",
linksHeading: "Enlaces",
githubLink: "Repositorio en GitHub",
@@ -3102,7 +3444,7 @@ export const es: TranslationKeys = {
"Sin límites. Sin topes ocultos.",
"Funciona totalmente sin conexión.",
"Procesamiento por lotes ilimitado.",
- "157 herramientas.",
+ "240 herramientas.",
"15 modelos AI. Tu hardware.",
"Ultra rápido. Construido sobre Sharp.",
"Listo para redes aisladas.",
@@ -3166,6 +3508,7 @@ export const es: TranslationKeys = {
toolPalette: "Paleta de herramientas",
clickToAdd: "Clic para agregar al Pipeline",
savedLabel: "Guardado",
+ templatesLabel: "Plantillas",
importButton: "Importar",
noSavedPipelines: "No hay Pipelines guardados",
stepCount: "({count} paso)",
@@ -3453,4 +3796,45 @@ export const es: TranslationKeys = {
navigationMenu: "Navegación",
homeLink: "Inicio de SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Optimizar para web",
+ description:
+ "Redimensiona, convierte a WebP y comprime una imagen para una carga web rápida.",
+ },
+ "email-friendly": {
+ name: "Apto para correo",
+ description:
+ "Reduce una imagen para que sea lo bastante pequeña para adjuntarla a un correo.",
+ },
+ "privacy-scrub": {
+ name: "Limpieza de privacidad",
+ description: "Elimina los datos EXIF, GPS y otros metadatos, y luego comprime.",
+ },
+ "social-square": {
+ name: "Cuadrado social",
+ description: "Recorta a un cuadrado 1:1 y comprime para publicaciones en redes sociales.",
+ },
+ "watermark-batch": {
+ name: "Marca de agua por lotes",
+ description: "Estampa una marca de agua de texto en las imágenes y luego comprime.",
+ },
+ "shrink-pdf-email": {
+ name: "Reducir PDF para correo",
+ description:
+ "Aplana y comprime de forma agresiva un PDF para que cumpla los límites del correo.",
+ },
+ "podcast-polish": {
+ name: "Pulido de pódcast",
+ description: "Elimina los silencios, normaliza el volumen y añade fundidos a una grabación.",
+ },
+ "cut-out-subject": {
+ name: "Recortar el sujeto",
+ description: "Quita el fondo con IA y comprime el recorte transparente.",
+ },
+ "restore-old-photo": {
+ name: "Restaurar foto antigua",
+ description: "Repara, colorea y amplía una foto antigua o dañada con IA.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/fr.ts b/packages/shared/src/i18n/fr.ts
index 40bc03a9..8f42258a 100644
--- a/packages/shared/src/i18n/fr.ts
+++ b/packages/shared/src/i18n/fr.ts
@@ -73,6 +73,340 @@ export const fr: TranslationKeys = {
documentsAndFiles: "PDF & fichiers",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG en PNG",
+ description: "Convertir JPG en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-jpg": {
+ name: "PNG en JPG",
+ description: "Convertir PNG en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-webp": {
+ name: "JPG en WebP",
+ description: "Convertir JPG en WebP en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-webp": {
+ name: "PNG en WebP",
+ description: "Convertir PNG en WebP en ligne. Rapide, gratuit et privé.",
+ },
+ "webp-to-jpg": {
+ name: "WebP en JPG",
+ description: "Convertir WebP en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "webp-to-png": {
+ name: "WebP en PNG",
+ description: "Convertir WebP en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-avif": {
+ name: "JPG en AVIF",
+ description: "Convertir JPG en AVIF en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-avif": {
+ name: "PNG en AVIF",
+ description: "Convertir PNG en AVIF en ligne. Rapide, gratuit et privé.",
+ },
+ "webp-to-avif": {
+ name: "WebP en AVIF",
+ description: "Convertir WebP en AVIF en ligne. Rapide, gratuit et privé.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC en JPG",
+ description: "Convertir HEIC en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "heic-to-png": {
+ name: "HEIC en PNG",
+ description: "Convertir HEIC en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "heic-to-avif": {
+ name: "HEIC en AVIF",
+ description: "Convertir HEIC en AVIF en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-gif": {
+ name: "JPG en GIF",
+ description: "Convertir JPG en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-gif": {
+ name: "PNG en GIF",
+ description: "Convertir PNG en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "gif-to-jpg": {
+ name: "GIF en JPG",
+ description: "Convertir GIF en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "gif-to-png": {
+ name: "GIF en PNG",
+ description: "Convertir GIF en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "webp-to-gif": {
+ name: "WebP en GIF",
+ description: "Convertir WebP en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG en TIFF",
+ description: "Convertir JPG en TIFF en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-tiff": {
+ name: "PNG en TIFF",
+ description: "Convertir PNG en TIFF en ligne. Rapide, gratuit et privé.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF en JPG",
+ description: "Convertir TIFF en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "tiff-to-png": {
+ name: "TIFF en PNG",
+ description: "Convertir TIFF en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "psd-to-jpg": {
+ name: "PSD en JPG",
+ description: "Convertir PSD en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "psd-to-png": {
+ name: "PSD en PNG",
+ description: "Convertir PSD en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-eps": {
+ name: "PNG en EPS",
+ description: "Convertir PNG en EPS en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-eps": {
+ name: "JPG en EPS",
+ description: "Convertir JPG en EPS en ligne. Rapide, gratuit et privé.",
+ },
+ "eps-to-png": {
+ name: "EPS en PNG",
+ description: "Convertir EPS en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "eps-to-jpg": {
+ name: "EPS en JPG",
+ description: "Convertir EPS en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-svg": {
+ name: "PNG en SVG",
+ description: "Convertir PNG en SVG en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-svg": {
+ name: "JPG en SVG",
+ description: "Convertir JPG en SVG en ligne. Rapide, gratuit et privé.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF en SVG",
+ description: "Convertir TIFF en SVG en ligne. Rapide, gratuit et privé.",
+ },
+ "psd-to-svg": {
+ name: "PSD en SVG",
+ description: "Convertir PSD en SVG en ligne. Rapide, gratuit et privé.",
+ },
+ "eps-to-svg": {
+ name: "EPS en SVG",
+ description: "Convertir EPS en SVG en ligne. Rapide, gratuit et privé.",
+ },
+ "svg-to-png": {
+ name: "SVG en PNG",
+ description: "Convertir SVG en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "svg-to-jpg": {
+ name: "SVG en JPG",
+ description: "Convertir SVG en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG en PDF",
+ description: "Convertir JPG en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "png-to-pdf": {
+ name: "PNG en PDF",
+ description: "Convertir PNG en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC en PDF",
+ description: "Convertir HEIC en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF en PDF",
+ description: "Convertir TIFF en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "webp-to-pdf": {
+ name: "WebP en PDF",
+ description: "Convertir WebP en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "gif-to-pdf": {
+ name: "GIF en PDF",
+ description: "Convertir GIF en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "eps-to-pdf": {
+ name: "EPS en PDF",
+ description: "Convertir EPS en PDF en ligne. Rapide, gratuit et privé.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF en JPG",
+ description: "Convertir PDF en JPG en ligne. Rapide, gratuit et privé.",
+ },
+ "pdf-to-png": {
+ name: "PDF en PNG",
+ description: "Convertir PDF en PNG en ligne. Rapide, gratuit et privé.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF en TIFF",
+ description: "Convertir PDF en TIFF en ligne. Rapide, gratuit et privé.",
+ },
+ "mov-to-mp4": {
+ name: "MOV en MP4",
+ description: "Convertir MOV en MP4 en ligne. Rapide, gratuit et privé.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM en MP4",
+ description: "Convertir WEBM en MP4 en ligne. Rapide, gratuit et privé.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV en MP4",
+ description: "Convertir MKV en MP4 en ligne. Rapide, gratuit et privé.",
+ },
+ "avi-to-mp4": {
+ name: "AVI en MP4",
+ description: "Convertir AVI en MP4 en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 en MOV",
+ description: "Convertir MP4 en MOV en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 en WEBM",
+ description: "Convertir MP4 en WEBM en ligne. Rapide, gratuit et privé.",
+ },
+ "webm-to-mov": {
+ name: "WEBM en MOV",
+ description: "Convertir WEBM en MOV en ligne. Rapide, gratuit et privé.",
+ },
+ "mkv-to-mov": {
+ name: "MKV en MOV",
+ description: "Convertir MKV en MOV en ligne. Rapide, gratuit et privé.",
+ },
+ "avi-to-mov": {
+ name: "AVI en MOV",
+ description: "Convertir AVI en MOV en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 en AVI",
+ description: "Convertir MP4 en AVI en ligne. Rapide, gratuit et privé.",
+ },
+ "mov-to-avi": {
+ name: "MOV en AVI",
+ description: "Convertir MOV en AVI en ligne. Rapide, gratuit et privé.",
+ },
+ "mkv-to-avi": {
+ name: "MKV en AVI",
+ description: "Convertir MKV en AVI en ligne. Rapide, gratuit et privé.",
+ },
+ "avi-to-mkv": {
+ name: "AVI en MKV",
+ description: "Convertir AVI en MKV en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 en GIF",
+ description: "Convertir MP4 en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "mov-to-gif": {
+ name: "MOV en GIF",
+ description: "Convertir MOV en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "mkv-to-gif": {
+ name: "MKV en GIF",
+ description: "Convertir MKV en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "avi-to-gif": {
+ name: "AVI en GIF",
+ description: "Convertir AVI en GIF en ligne. Rapide, gratuit et privé.",
+ },
+ "gif-to-mp4": {
+ name: "GIF en MP4",
+ description: "Convertir GIF en MP4 en ligne. Rapide, gratuit et privé.",
+ },
+ "gif-to-webm": {
+ name: "GIF en WEBM",
+ description: "Convertir GIF en WEBM en ligne. Rapide, gratuit et privé.",
+ },
+ "gif-to-mov": {
+ name: "GIF en MOV",
+ description: "Convertir GIF en MOV en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 en MP3",
+ description: "Convertir MP4 en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "mov-to-mp3": {
+ name: "MOV en MP3",
+ description: "Convertir MOV en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV en MP3",
+ description: "Convertir MKV en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM en MP3",
+ description: "Convertir WEBM en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "avi-to-mp3": {
+ name: "AVI en MP3",
+ description: "Convertir AVI en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 en WAV",
+ description: "Convertir MP4 en WAV en ligne. Rapide, gratuit et privé.",
+ },
+ "mov-to-wav": {
+ name: "MOV en WAV",
+ description: "Convertir MOV en WAV en ligne. Rapide, gratuit et privé.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 en OGG",
+ description: "Convertir MP4 en OGG en ligne. Rapide, gratuit et privé.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A en MP3",
+ description: "Convertir M4A en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "m4a-to-wav": {
+ name: "M4A en WAV",
+ description: "Convertir M4A en WAV en ligne. Rapide, gratuit et privé.",
+ },
+ "aac-to-mp3": {
+ name: "AAC en MP3",
+ description: "Convertir AAC en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "aac-to-wav": {
+ name: "AAC en WAV",
+ description: "Convertir AAC en WAV en ligne. Rapide, gratuit et privé.",
+ },
+ "aac-to-flac": {
+ name: "AAC en FLAC",
+ description: "Convertir AAC en FLAC en ligne. Rapide, gratuit et privé.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG en MP3",
+ description: "Convertir OGG en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "ogg-to-wav": {
+ name: "OGG en WAV",
+ description: "Convertir OGG en WAV en ligne. Rapide, gratuit et privé.",
+ },
+ "wav-to-mp3": {
+ name: "WAV en MP3",
+ description: "Convertir WAV en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 en WAV",
+ description: "Convertir MP3 en WAV en ligne. Rapide, gratuit et privé.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC en MP3",
+ description: "Convertir FLAC en MP3 en ligne. Rapide, gratuit et privé.",
+ },
+ "excel-to-csv": {
+ name: "Excel en CSV",
+ description: "Convertir Excel en CSV en ligne. Rapide, gratuit et privé.",
+ },
+ // END conversion-presets
resize: {
name: "Redimensionner",
description: "Redimensionnez par pixels, pourcentage ou presets pour réseaux sociaux",
@@ -149,7 +483,7 @@ export const fr: TranslationKeys = {
description: "Supprimez les objets indésirables avec l'AI",
},
ocr: {
- name: "OCR / Extraction de texte",
+ name: "Extraire le texte d'une image (OCR)",
description: "Extrayez du texte à partir d'images avec une précision alimentée par l'AI",
},
"ocr-pdf": {
@@ -2766,6 +3100,14 @@ export const fr: TranslationKeys = {
"Téléchargez une archive de diagnostic avec la configuration masquée, les journaux et les données de tâches.",
supportBundleFailed: "Échec du téléchargement du diagnostic.",
},
+ privacy: {
+ title: "Confidentialité",
+ description:
+ "Les statistiques produit anonymes aident à améliorer SnapOtter. Elles sont activées par défaut et configurées pour toute l'instance par un administrateur.",
+ analyticsLabel: "Statistiques produit anonymes",
+ analyticsDescription:
+ "Partagez des données d'usage anonymes (quels outils sont exécutés, durées, codes d'erreur) et des rapports de plantage. Aucune adresse IP, aucune identité de compte. Nous ne collectons jamais vos noms de fichiers, le contenu des fichiers, les résultats d'OCR, les métadonnées d'images ni le texte des documents. Désactivez cette option pour tout arrêter.",
+ },
security: {
heading: "Sécurité",
description: "Paramètres de mot de passe et d'authentification.",
@@ -3064,7 +3406,7 @@ export const fr: TranslationKeys = {
heading: "À propos",
appName: "SnapOtter",
appDescription:
- "Une suite de traitement de fichiers auto-hébergée, axée sur la confidentialité, avec 157 outils. Convertissez, compressez, éditez, transcrivez, OCR et automatisez vos flux de travail image, vidéo, audio, document et données sans envoyer de données vers le cloud.",
+ "Une suite de traitement de fichiers auto-hébergée, axée sur la confidentialité, avec 240 outils. Convertissez, compressez, éditez, transcrivez, OCR et automatisez vos flux de travail image, vidéo, audio, document et données sans envoyer de données vers le cloud.",
versionLabel: "Version :",
linksHeading: "Liens",
githubLink: "Dépôt GitHub",
@@ -3125,7 +3467,7 @@ export const fr: TranslationKeys = {
"Sans limites. Sans plafonds cachés.",
"Fonctionne entièrement hors ligne.",
"Traitement par lot illimité.",
- "157 outils.",
+ "240 outils.",
"15 modèles AI. Votre matériel.",
"Ultra rapide. Propulsé par Sharp.",
"Prêt pour les réseaux isolés.",
@@ -3190,6 +3532,7 @@ export const fr: TranslationKeys = {
toolPalette: "Palette d'outils",
clickToAdd: "Cliquez pour ajouter au Pipeline",
savedLabel: "Enregistré",
+ templatesLabel: "Modèles",
importButton: "Importer",
noSavedPipelines: "Aucun Pipeline enregistré",
stepCount: "({count} étape)",
@@ -3476,4 +3819,45 @@ export const fr: TranslationKeys = {
navigationMenu: "Navigation",
homeLink: "Accueil SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Optimiser pour le web",
+ description:
+ "Redimensionne, convertit en WebP et compresse une image pour un chargement web rapide.",
+ },
+ "email-friendly": {
+ name: "Adapté aux e-mails",
+ description: "Réduit une image pour qu'elle soit assez petite pour être jointe à un e-mail.",
+ },
+ "privacy-scrub": {
+ name: "Nettoyage de confidentialité",
+ description: "Supprime les métadonnées EXIF, GPS et autres, puis compresse.",
+ },
+ "social-square": {
+ name: "Carré pour réseaux sociaux",
+ description:
+ "Recadre au format carré 1:1 et compresse pour les publications sur les réseaux sociaux.",
+ },
+ "watermark-batch": {
+ name: "Filigrane par lot",
+ description: "Appose un filigrane texte sur les images, puis compresse.",
+ },
+ "shrink-pdf-email": {
+ name: "Réduire un PDF pour e-mail",
+ description: "Aplatit et compresse fortement un PDF pour respecter les limites des e-mails.",
+ },
+ "podcast-polish": {
+ name: "Peaufiner un podcast",
+ description:
+ "Supprime les silences, normalise le volume et ajoute des fondus à un enregistrement.",
+ },
+ "cut-out-subject": {
+ name: "Détourer le sujet",
+ description: "Supprime l'arrière-plan avec l'IA et compresse le détourage transparent.",
+ },
+ "restore-old-photo": {
+ name: "Restaurer une vieille photo",
+ description: "Répare, colorise et agrandit une photo ancienne ou abîmée avec l'IA.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/hi.ts b/packages/shared/src/i18n/hi.ts
index 656686c6..eaae214d 100644
--- a/packages/shared/src/i18n/hi.ts
+++ b/packages/shared/src/i18n/hi.ts
@@ -73,6 +73,175 @@ export const hi: TranslationKeys = {
documentsAndFiles: "PDF और फ़ाइलें",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": { name: "JPG से PNG", description: "JPG को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "png-to-jpg": { name: "PNG से JPG", description: "PNG को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "jpg-to-webp": {
+ name: "JPG से WebP",
+ description: "JPG को WebP में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "png-to-webp": {
+ name: "PNG से WebP",
+ description: "PNG को WebP में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "webp-to-jpg": {
+ name: "WebP से JPG",
+ description: "WebP को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "webp-to-png": {
+ name: "WebP से PNG",
+ description: "WebP को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "jpg-to-avif": {
+ name: "JPG से AVIF",
+ description: "JPG को AVIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "png-to-avif": {
+ name: "PNG से AVIF",
+ description: "PNG को AVIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "webp-to-avif": {
+ name: "WebP से AVIF",
+ description: "WebP को AVIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "heic-to-jpg": {
+ name: "HEIC से JPG",
+ description: "HEIC को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "heic-to-png": {
+ name: "HEIC से PNG",
+ description: "HEIC को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "heic-to-avif": {
+ name: "HEIC से AVIF",
+ description: "HEIC को AVIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "jpg-to-gif": { name: "JPG से GIF", description: "JPG को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "png-to-gif": { name: "PNG से GIF", description: "PNG को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "gif-to-jpg": { name: "GIF से JPG", description: "GIF को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "gif-to-png": { name: "GIF से PNG", description: "GIF को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "webp-to-gif": {
+ name: "WebP से GIF",
+ description: "WebP को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "jpg-to-tiff": {
+ name: "JPG से TIFF",
+ description: "JPG को TIFF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "png-to-tiff": {
+ name: "PNG से TIFF",
+ description: "PNG को TIFF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF से JPG",
+ description: "TIFF को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "tiff-to-png": {
+ name: "TIFF से PNG",
+ description: "TIFF को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "psd-to-jpg": { name: "PSD से JPG", description: "PSD को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "psd-to-png": { name: "PSD से PNG", description: "PSD को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "png-to-eps": { name: "PNG से EPS", description: "PNG को EPS में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "jpg-to-eps": { name: "JPG से EPS", description: "JPG को EPS में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "eps-to-png": { name: "EPS से PNG", description: "EPS को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "eps-to-jpg": { name: "EPS से JPG", description: "EPS को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "png-to-svg": { name: "PNG से SVG", description: "PNG को SVG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "jpg-to-svg": { name: "JPG से SVG", description: "JPG को SVG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "tiff-to-svg": {
+ name: "TIFF से SVG",
+ description: "TIFF को SVG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "psd-to-svg": { name: "PSD से SVG", description: "PSD को SVG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "eps-to-svg": { name: "EPS से SVG", description: "EPS को SVG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "svg-to-png": { name: "SVG से PNG", description: "SVG को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "svg-to-jpg": { name: "SVG से JPG", description: "SVG को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "jpg-to-pdf": { name: "JPG से PDF", description: "JPG को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "png-to-pdf": { name: "PNG से PDF", description: "PNG को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "heic-to-pdf": {
+ name: "HEIC से PDF",
+ description: "HEIC को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF से PDF",
+ description: "TIFF को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "webp-to-pdf": {
+ name: "WebP से PDF",
+ description: "WebP को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "gif-to-pdf": { name: "GIF से PDF", description: "GIF को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "eps-to-pdf": { name: "EPS से PDF", description: "EPS को PDF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "pdf-to-jpg": { name: "PDF से JPG", description: "PDF को JPG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "pdf-to-png": { name: "PDF से PNG", description: "PDF को PNG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "pdf-to-tiff": {
+ name: "PDF से TIFF",
+ description: "PDF को TIFF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "mov-to-mp4": { name: "MOV से MP4", description: "MOV को MP4 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "webm-to-mp4": {
+ name: "WEBM से MP4",
+ description: "WEBM को MP4 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "mkv-to-mp4": { name: "MKV से MP4", description: "MKV को MP4 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "avi-to-mp4": { name: "AVI से MP4", description: "AVI को MP4 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-mov": { name: "MP4 से MOV", description: "MP4 को MOV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-webm": {
+ name: "MP4 से WEBM",
+ description: "MP4 को WEBM में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "webm-to-mov": {
+ name: "WEBM से MOV",
+ description: "WEBM को MOV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "mkv-to-mov": { name: "MKV से MOV", description: "MKV को MOV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "avi-to-mov": { name: "AVI से MOV", description: "AVI को MOV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-avi": { name: "MP4 से AVI", description: "MP4 को AVI में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mov-to-avi": { name: "MOV से AVI", description: "MOV को AVI में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mkv-to-avi": { name: "MKV से AVI", description: "MKV को AVI में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "avi-to-mkv": { name: "AVI से MKV", description: "AVI को MKV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-gif": { name: "MP4 से GIF", description: "MP4 को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mov-to-gif": { name: "MOV से GIF", description: "MOV को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mkv-to-gif": { name: "MKV से GIF", description: "MKV को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "avi-to-gif": { name: "AVI से GIF", description: "AVI को GIF में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "gif-to-mp4": { name: "GIF से MP4", description: "GIF को MP4 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "gif-to-webm": {
+ name: "GIF से WEBM",
+ description: "GIF को WEBM में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "gif-to-mov": { name: "GIF से MOV", description: "GIF को MOV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-mp3": { name: "MP4 से MP3", description: "MP4 को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mov-to-mp3": { name: "MOV से MP3", description: "MOV को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mkv-to-mp3": { name: "MKV से MP3", description: "MKV को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "webm-to-mp3": {
+ name: "WEBM से MP3",
+ description: "WEBM को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "avi-to-mp3": { name: "AVI से MP3", description: "AVI को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-wav": { name: "MP4 से WAV", description: "MP4 को WAV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mov-to-wav": { name: "MOV से WAV", description: "MOV को WAV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp4-to-ogg": { name: "MP4 से OGG", description: "MP4 को OGG में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "m4a-to-mp3": { name: "M4A से MP3", description: "M4A को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "m4a-to-wav": { name: "M4A से WAV", description: "M4A को WAV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "aac-to-mp3": { name: "AAC से MP3", description: "AAC को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "aac-to-wav": { name: "AAC से WAV", description: "AAC को WAV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "aac-to-flac": {
+ name: "AAC से FLAC",
+ description: "AAC को FLAC में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "ogg-to-mp3": { name: "OGG से MP3", description: "OGG को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "ogg-to-wav": { name: "OGG से WAV", description: "OGG को WAV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "wav-to-mp3": { name: "WAV से MP3", description: "WAV को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "mp3-to-wav": { name: "MP3 से WAV", description: "MP3 को WAV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।" },
+ "flac-to-mp3": {
+ name: "FLAC से MP3",
+ description: "FLAC को MP3 में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ "excel-to-csv": {
+ name: "Excel से CSV",
+ description: "Excel को CSV में ऑनलाइन बदलें। तेज़, मुफ़्त और निजी।",
+ },
+ // END conversion-presets
resize: {
name: "रीसाइज़",
description: "पिक्सेल, प्रतिशत, या सोशल मीडिया प्रीसेट से रीसाइज़ करें",
@@ -150,7 +319,7 @@ export const hi: TranslationKeys = {
description: "AI से अनचाही वस्तुएं हटाएं",
},
ocr: {
- name: "OCR / टेक्स्ट एक्सट्रैक्शन",
+ name: "छवि से टेक्स्ट निकालें (OCR)",
description: "AI-संचालित सटीकता से इमेज से टेक्स्ट निकालें",
},
"ocr-pdf": {
@@ -2736,6 +2905,14 @@ export const hi: TranslationKeys = {
"समस्या निवारण के लिए संशोधित कॉन्फ़िग, लॉग और जॉब डेटा वाली डायग्नोस्टिक ज़िप डाउनलोड करें।",
supportBundleFailed: "सपोर्ट बंडल डाउनलोड विफल।",
},
+ privacy: {
+ title: "गोपनीयता",
+ description:
+ "अनाम उत्पाद एनालिटिक्स SnapOtter को बेहतर बनाने में मदद करता है। यह डिफ़ॉल्ट रूप से चालू रहता है और पूरे इंस्टेंस के लिए इसे एक प्रशासक द्वारा सेट किया जाता है।",
+ analyticsLabel: "अनाम उत्पाद एनालिटिक्स",
+ analyticsDescription:
+ "अनाम उपयोग डेटा (कौन-से टूल चलते हैं, अवधि, त्रुटि कोड) और क्रैश रिपोर्ट साझा करें। कोई IP पता नहीं, कोई खाता पहचान नहीं। हम आपकी फ़ाइलों के नाम, फ़ाइल सामग्री, OCR आउटपुट, छवि मेटाडेटा या दस्तावेज़ टेक्स्ट कभी एकत्र नहीं करते। यह सब रोकने के लिए इसे बंद कर दें।",
+ },
security: {
heading: "सुरक्षा",
description: "पासवर्ड और ऑथेंटिकेशन सेटिंग्स।",
@@ -3019,7 +3196,7 @@ export const hi: TranslationKeys = {
heading: "जानकारी",
appName: "SnapOtter",
appDescription:
- "157 टूल्स के साथ गोपनीयता-पहले, सेल्फ-होस्टेड फ़ाइल प्रोसेसिंग सूट। क्लाउड को डेटा भेजे बिना कन्वर्ट, कंप्रेस, एडिट, ट्रांसक्राइब, OCR और इमेज, वीडियो, ऑडियो, डॉक्यूमेंट और डेटा वर्कफ्लो ऑटोमेट करें।",
+ "240 टूल्स के साथ गोपनीयता-पहले, सेल्फ-होस्टेड फ़ाइल प्रोसेसिंग सूट। क्लाउड को डेटा भेजे बिना कन्वर्ट, कंप्रेस, एडिट, ट्रांसक्राइब, OCR और इमेज, वीडियो, ऑडियो, डॉक्यूमेंट और डेटा वर्कफ्लो ऑटोमेट करें।",
versionLabel: "वर्शन:",
linksHeading: "लिंक्स",
githubLink: "GitHub रिपॉज़िटरी",
@@ -3077,7 +3254,7 @@ export const hi: TranslationKeys = {
"कोई सीमा नहीं। कोई छुपी हुई कैप नहीं।",
"पूरी तरह ऑफलाइन काम करता है।",
"असीमित बैच प्रोसेसिंग।",
- "157 टूल्स।",
+ "240 टूल्स।",
"16 AI मॉडल। आपका हार्डवेयर।",
"बिजली की तरह तेज़। Sharp पर बनाया गया।",
"एयर-गैप्ड नेटवर्क के लिए तैयार।",
@@ -3141,6 +3318,7 @@ export const hi: TranslationKeys = {
toolPalette: "टूल पैलेट",
clickToAdd: "Pipeline में जोड़ने के लिए क्लिक करें",
savedLabel: "सहेजा गया",
+ templatesLabel: "टेम्पलेट",
importButton: "इम्पोर्ट",
noSavedPipelines: "कोई सहेजा गया Pipeline नहीं",
stepCount: "({count} स्टेप)",
@@ -3425,4 +3603,42 @@ export const hi: TranslationKeys = {
navigationMenu: "नेविगेशन",
homeLink: "SnapOtter होम",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "वेब के लिए अनुकूलित करें",
+ description: "तेज़ वेब लोडिंग के लिए छवि का आकार बदलें, उसे WebP में बदलें और संपीड़ित करें।",
+ },
+ "email-friendly": {
+ name: "ईमेल के अनुकूल",
+ description: "छवि को इतना छोटा करें कि उसे ईमेल में अटैच किया जा सके।",
+ },
+ "privacy-scrub": {
+ name: "गोपनीयता सफ़ाई",
+ description: "EXIF, GPS और अन्य मेटाडेटा हटाएँ, फिर संपीड़ित करें।",
+ },
+ "social-square": {
+ name: "सोशल वर्ग",
+ description: "1:1 वर्ग में क्रॉप करें और सोशल पोस्ट के लिए संपीड़ित करें।",
+ },
+ "watermark-batch": {
+ name: "वॉटरमार्क बैच",
+ description: "छवियों पर टेक्स्ट वॉटरमार्क लगाएँ, फिर संपीड़ित करें।",
+ },
+ "shrink-pdf-email": {
+ name: "ईमेल के लिए PDF छोटा करें",
+ description: "PDF को समतल करें और ईमेल सीमा में फ़िट करने के लिए ज़ोरदार ढंग से संपीड़ित करें।",
+ },
+ "podcast-polish": {
+ name: "पॉडकास्ट निखार",
+ description: "रिकॉर्डिंग से ख़ामोशी हटाएँ, ध्वनि स्तर सामान्य करें और फ़ेड जोड़ें।",
+ },
+ "cut-out-subject": {
+ name: "विषय काटें",
+ description: "एआई से पृष्ठभूमि हटाएँ और पारदर्शी कटआउट को संपीड़ित करें।",
+ },
+ "restore-old-photo": {
+ name: "पुरानी फ़ोटो पुनर्स्थापित करें",
+ description: "एआई से पुरानी या क्षतिग्रस्त फ़ोटो की मरम्मत करें, रंग भरें और बड़ा करें।",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/id.ts b/packages/shared/src/i18n/id.ts
index 6571270a..16b2c33f 100644
--- a/packages/shared/src/i18n/id.ts
+++ b/packages/shared/src/i18n/id.ts
@@ -73,6 +73,340 @@ export const id: TranslationKeys = {
documentsAndFiles: "PDF & File",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG ke PNG",
+ description: "Konversi JPG ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "png-to-jpg": {
+ name: "PNG ke JPG",
+ description: "Konversi PNG ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-webp": {
+ name: "JPG ke WebP",
+ description: "Konversi JPG ke WebP online. Cepat, gratis, dan privat.",
+ },
+ "png-to-webp": {
+ name: "PNG ke WebP",
+ description: "Konversi PNG ke WebP online. Cepat, gratis, dan privat.",
+ },
+ "webp-to-jpg": {
+ name: "WebP ke JPG",
+ description: "Konversi WebP ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "webp-to-png": {
+ name: "WebP ke PNG",
+ description: "Konversi WebP ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-avif": {
+ name: "JPG ke AVIF",
+ description: "Konversi JPG ke AVIF online. Cepat, gratis, dan privat.",
+ },
+ "png-to-avif": {
+ name: "PNG ke AVIF",
+ description: "Konversi PNG ke AVIF online. Cepat, gratis, dan privat.",
+ },
+ "webp-to-avif": {
+ name: "WebP ke AVIF",
+ description: "Konversi WebP ke AVIF online. Cepat, gratis, dan privat.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC ke JPG",
+ description: "Konversi HEIC ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "heic-to-png": {
+ name: "HEIC ke PNG",
+ description: "Konversi HEIC ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "heic-to-avif": {
+ name: "HEIC ke AVIF",
+ description: "Konversi HEIC ke AVIF online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-gif": {
+ name: "JPG ke GIF",
+ description: "Konversi JPG ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "png-to-gif": {
+ name: "PNG ke GIF",
+ description: "Konversi PNG ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "gif-to-jpg": {
+ name: "GIF ke JPG",
+ description: "Konversi GIF ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "gif-to-png": {
+ name: "GIF ke PNG",
+ description: "Konversi GIF ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "webp-to-gif": {
+ name: "WebP ke GIF",
+ description: "Konversi WebP ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG ke TIFF",
+ description: "Konversi JPG ke TIFF online. Cepat, gratis, dan privat.",
+ },
+ "png-to-tiff": {
+ name: "PNG ke TIFF",
+ description: "Konversi PNG ke TIFF online. Cepat, gratis, dan privat.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF ke JPG",
+ description: "Konversi TIFF ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "tiff-to-png": {
+ name: "TIFF ke PNG",
+ description: "Konversi TIFF ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "psd-to-jpg": {
+ name: "PSD ke JPG",
+ description: "Konversi PSD ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "psd-to-png": {
+ name: "PSD ke PNG",
+ description: "Konversi PSD ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "png-to-eps": {
+ name: "PNG ke EPS",
+ description: "Konversi PNG ke EPS online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-eps": {
+ name: "JPG ke EPS",
+ description: "Konversi JPG ke EPS online. Cepat, gratis, dan privat.",
+ },
+ "eps-to-png": {
+ name: "EPS ke PNG",
+ description: "Konversi EPS ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "eps-to-jpg": {
+ name: "EPS ke JPG",
+ description: "Konversi EPS ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "png-to-svg": {
+ name: "PNG ke SVG",
+ description: "Konversi PNG ke SVG online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-svg": {
+ name: "JPG ke SVG",
+ description: "Konversi JPG ke SVG online. Cepat, gratis, dan privat.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF ke SVG",
+ description: "Konversi TIFF ke SVG online. Cepat, gratis, dan privat.",
+ },
+ "psd-to-svg": {
+ name: "PSD ke SVG",
+ description: "Konversi PSD ke SVG online. Cepat, gratis, dan privat.",
+ },
+ "eps-to-svg": {
+ name: "EPS ke SVG",
+ description: "Konversi EPS ke SVG online. Cepat, gratis, dan privat.",
+ },
+ "svg-to-png": {
+ name: "SVG ke PNG",
+ description: "Konversi SVG ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "svg-to-jpg": {
+ name: "SVG ke JPG",
+ description: "Konversi SVG ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG ke PDF",
+ description: "Konversi JPG ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "png-to-pdf": {
+ name: "PNG ke PDF",
+ description: "Konversi PNG ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC ke PDF",
+ description: "Konversi HEIC ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF ke PDF",
+ description: "Konversi TIFF ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "webp-to-pdf": {
+ name: "WebP ke PDF",
+ description: "Konversi WebP ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "gif-to-pdf": {
+ name: "GIF ke PDF",
+ description: "Konversi GIF ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "eps-to-pdf": {
+ name: "EPS ke PDF",
+ description: "Konversi EPS ke PDF online. Cepat, gratis, dan privat.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF ke JPG",
+ description: "Konversi PDF ke JPG online. Cepat, gratis, dan privat.",
+ },
+ "pdf-to-png": {
+ name: "PDF ke PNG",
+ description: "Konversi PDF ke PNG online. Cepat, gratis, dan privat.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF ke TIFF",
+ description: "Konversi PDF ke TIFF online. Cepat, gratis, dan privat.",
+ },
+ "mov-to-mp4": {
+ name: "MOV ke MP4",
+ description: "Konversi MOV ke MP4 online. Cepat, gratis, dan privat.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM ke MP4",
+ description: "Konversi WEBM ke MP4 online. Cepat, gratis, dan privat.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV ke MP4",
+ description: "Konversi MKV ke MP4 online. Cepat, gratis, dan privat.",
+ },
+ "avi-to-mp4": {
+ name: "AVI ke MP4",
+ description: "Konversi AVI ke MP4 online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 ke MOV",
+ description: "Konversi MP4 ke MOV online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 ke WEBM",
+ description: "Konversi MP4 ke WEBM online. Cepat, gratis, dan privat.",
+ },
+ "webm-to-mov": {
+ name: "WEBM ke MOV",
+ description: "Konversi WEBM ke MOV online. Cepat, gratis, dan privat.",
+ },
+ "mkv-to-mov": {
+ name: "MKV ke MOV",
+ description: "Konversi MKV ke MOV online. Cepat, gratis, dan privat.",
+ },
+ "avi-to-mov": {
+ name: "AVI ke MOV",
+ description: "Konversi AVI ke MOV online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 ke AVI",
+ description: "Konversi MP4 ke AVI online. Cepat, gratis, dan privat.",
+ },
+ "mov-to-avi": {
+ name: "MOV ke AVI",
+ description: "Konversi MOV ke AVI online. Cepat, gratis, dan privat.",
+ },
+ "mkv-to-avi": {
+ name: "MKV ke AVI",
+ description: "Konversi MKV ke AVI online. Cepat, gratis, dan privat.",
+ },
+ "avi-to-mkv": {
+ name: "AVI ke MKV",
+ description: "Konversi AVI ke MKV online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 ke GIF",
+ description: "Konversi MP4 ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "mov-to-gif": {
+ name: "MOV ke GIF",
+ description: "Konversi MOV ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "mkv-to-gif": {
+ name: "MKV ke GIF",
+ description: "Konversi MKV ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "avi-to-gif": {
+ name: "AVI ke GIF",
+ description: "Konversi AVI ke GIF online. Cepat, gratis, dan privat.",
+ },
+ "gif-to-mp4": {
+ name: "GIF ke MP4",
+ description: "Konversi GIF ke MP4 online. Cepat, gratis, dan privat.",
+ },
+ "gif-to-webm": {
+ name: "GIF ke WEBM",
+ description: "Konversi GIF ke WEBM online. Cepat, gratis, dan privat.",
+ },
+ "gif-to-mov": {
+ name: "GIF ke MOV",
+ description: "Konversi GIF ke MOV online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 ke MP3",
+ description: "Konversi MP4 ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "mov-to-mp3": {
+ name: "MOV ke MP3",
+ description: "Konversi MOV ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV ke MP3",
+ description: "Konversi MKV ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM ke MP3",
+ description: "Konversi WEBM ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "avi-to-mp3": {
+ name: "AVI ke MP3",
+ description: "Konversi AVI ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 ke WAV",
+ description: "Konversi MP4 ke WAV online. Cepat, gratis, dan privat.",
+ },
+ "mov-to-wav": {
+ name: "MOV ke WAV",
+ description: "Konversi MOV ke WAV online. Cepat, gratis, dan privat.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 ke OGG",
+ description: "Konversi MP4 ke OGG online. Cepat, gratis, dan privat.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A ke MP3",
+ description: "Konversi M4A ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "m4a-to-wav": {
+ name: "M4A ke WAV",
+ description: "Konversi M4A ke WAV online. Cepat, gratis, dan privat.",
+ },
+ "aac-to-mp3": {
+ name: "AAC ke MP3",
+ description: "Konversi AAC ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "aac-to-wav": {
+ name: "AAC ke WAV",
+ description: "Konversi AAC ke WAV online. Cepat, gratis, dan privat.",
+ },
+ "aac-to-flac": {
+ name: "AAC ke FLAC",
+ description: "Konversi AAC ke FLAC online. Cepat, gratis, dan privat.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG ke MP3",
+ description: "Konversi OGG ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "ogg-to-wav": {
+ name: "OGG ke WAV",
+ description: "Konversi OGG ke WAV online. Cepat, gratis, dan privat.",
+ },
+ "wav-to-mp3": {
+ name: "WAV ke MP3",
+ description: "Konversi WAV ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 ke WAV",
+ description: "Konversi MP3 ke WAV online. Cepat, gratis, dan privat.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC ke MP3",
+ description: "Konversi FLAC ke MP3 online. Cepat, gratis, dan privat.",
+ },
+ "excel-to-csv": {
+ name: "Excel ke CSV",
+ description: "Konversi Excel ke CSV online. Cepat, gratis, dan privat.",
+ },
+ // END conversion-presets
resize: {
name: "Ubah Ukuran",
description: "Ubah ukuran berdasarkan piksel, persentase, atau preset media sosial",
@@ -151,7 +485,7 @@ export const id: TranslationKeys = {
description: "Hapus objek yang tidak diinginkan dengan AI",
},
ocr: {
- name: "OCR / Ekstraksi Teks",
+ name: "Ekstrak Teks dari Gambar (OCR)",
description: "Ekstrak teks dari gambar dengan akurasi AI",
},
"ocr-pdf": {
@@ -2750,6 +3084,14 @@ export const id: TranslationKeys = {
"Unduh ZIP diagnostik berisi konfigurasi yang disunting, log, dan data pekerjaan untuk pemecahan masalah.",
supportBundleFailed: "Gagal mengunduh paket dukungan.",
},
+ privacy: {
+ title: "Privasi",
+ description:
+ "Analitik Produk Anonim membantu meningkatkan SnapOtter. Fitur ini aktif secara default dan diatur untuk seluruh instance oleh administrator.",
+ analyticsLabel: "Analitik Produk Anonim",
+ analyticsDescription:
+ "Bagikan data penggunaan anonim (alat mana yang dijalankan, durasi, kode kesalahan) dan laporan kerusakan. Tanpa alamat IP, tanpa identitas akun. Kami tidak pernah mengumpulkan nama file, isi file, keluaran OCR, metadata gambar, atau teks dokumen Anda. Matikan ini untuk menghentikan semuanya.",
+ },
security: {
heading: "Keamanan",
description: "Pengaturan kata sandi dan autentikasi.",
@@ -3043,7 +3385,7 @@ export const id: TranslationKeys = {
heading: "Tentang",
appName: "SnapOtter",
appDescription:
- "Suite pemrosesan file self-hosted yang mengutamakan privasi dengan 157 alat. Konversi, kompres, edit, transkrip, OCR, dan otomasi alur kerja gambar, video, audio, dokumen, dan data tanpa mengirim data ke cloud.",
+ "Suite pemrosesan file self-hosted yang mengutamakan privasi dengan 240 alat. Konversi, kompres, edit, transkrip, OCR, dan otomasi alur kerja gambar, video, audio, dokumen, dan data tanpa mengirim data ke cloud.",
versionLabel: "Versi:",
linksHeading: "Tautan",
githubLink: "Repositori GitHub",
@@ -3102,7 +3444,7 @@ export const id: TranslationKeys = {
"Tanpa batas. Tanpa batasan tersembunyi.",
"Berfungsi sepenuhnya offline.",
"Pemrosesan batch tanpa batas.",
- "157 alat.",
+ "240 alat.",
"15 model AI. Di perangkat Anda.",
"Secepat kilat. Dibangun di atas Sharp.",
"Siap untuk jaringan terisolasi.",
@@ -3167,6 +3509,7 @@ export const id: TranslationKeys = {
toolPalette: "Palet Alat",
clickToAdd: "Klik untuk menambahkan ke Pipeline",
savedLabel: "Tersimpan",
+ templatesLabel: "Templat",
importButton: "Impor",
noSavedPipelines: "Tidak ada Pipeline tersimpan",
stepCount: "({count} langkah)",
@@ -3453,4 +3796,43 @@ export const id: TranslationKeys = {
navigationMenu: "Navigasi",
homeLink: "Beranda SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Optimalkan untuk web",
+ description: "Ubah ukuran, konversi ke WebP, dan kompres gambar agar cepat dimuat di web.",
+ },
+ "email-friendly": {
+ name: "Ramah email",
+ description: "Perkecil gambar agar cukup kecil untuk dilampirkan ke email.",
+ },
+ "privacy-scrub": {
+ name: "Pembersihan privasi",
+ description: "Hapus EXIF, GPS, dan metadata lainnya, lalu kompres.",
+ },
+ "social-square": {
+ name: "Persegi media sosial",
+ description: "Pangkas menjadi persegi 1:1 dan kompres untuk unggahan media sosial.",
+ },
+ "watermark-batch": {
+ name: "Tanda air massal",
+ description: "Bubuhkan tanda air teks pada gambar, lalu kompres.",
+ },
+ "shrink-pdf-email": {
+ name: "Perkecil PDF untuk email",
+ description: "Ratakan dan kompres PDF secara agresif agar sesuai batas email.",
+ },
+ "podcast-polish": {
+ name: "Pemolesan podcast",
+ description:
+ "Hapus jeda hening, normalkan kenyaringan, dan tambahkan transisi pudar ke rekaman.",
+ },
+ "cut-out-subject": {
+ name: "Potong subjek",
+ description: "Hapus latar belakang dengan AI dan kompres potongan transparan.",
+ },
+ "restore-old-photo": {
+ name: "Pulihkan foto lama",
+ description: "Perbaiki, beri warna, dan perbesar foto lama atau rusak dengan AI.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/it.ts b/packages/shared/src/i18n/it.ts
index 65942bc4..b55f83f6 100644
--- a/packages/shared/src/i18n/it.ts
+++ b/packages/shared/src/i18n/it.ts
@@ -73,6 +73,340 @@ export const it: TranslationKeys = {
documentsAndFiles: "PDF e File",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "Da JPG a PNG",
+ description: "Converti JPG in PNG online. Veloce, gratuito e privato.",
+ },
+ "png-to-jpg": {
+ name: "Da PNG a JPG",
+ description: "Converti PNG in JPG online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-webp": {
+ name: "Da JPG a WebP",
+ description: "Converti JPG in WebP online. Veloce, gratuito e privato.",
+ },
+ "png-to-webp": {
+ name: "Da PNG a WebP",
+ description: "Converti PNG in WebP online. Veloce, gratuito e privato.",
+ },
+ "webp-to-jpg": {
+ name: "Da WebP a JPG",
+ description: "Converti WebP in JPG online. Veloce, gratuito e privato.",
+ },
+ "webp-to-png": {
+ name: "Da WebP a PNG",
+ description: "Converti WebP in PNG online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-avif": {
+ name: "Da JPG a AVIF",
+ description: "Converti JPG in AVIF online. Veloce, gratuito e privato.",
+ },
+ "png-to-avif": {
+ name: "Da PNG a AVIF",
+ description: "Converti PNG in AVIF online. Veloce, gratuito e privato.",
+ },
+ "webp-to-avif": {
+ name: "Da WebP a AVIF",
+ description: "Converti WebP in AVIF online. Veloce, gratuito e privato.",
+ },
+ "heic-to-jpg": {
+ name: "Da HEIC a JPG",
+ description: "Converti HEIC in JPG online. Veloce, gratuito e privato.",
+ },
+ "heic-to-png": {
+ name: "Da HEIC a PNG",
+ description: "Converti HEIC in PNG online. Veloce, gratuito e privato.",
+ },
+ "heic-to-avif": {
+ name: "Da HEIC a AVIF",
+ description: "Converti HEIC in AVIF online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-gif": {
+ name: "Da JPG a GIF",
+ description: "Converti JPG in GIF online. Veloce, gratuito e privato.",
+ },
+ "png-to-gif": {
+ name: "Da PNG a GIF",
+ description: "Converti PNG in GIF online. Veloce, gratuito e privato.",
+ },
+ "gif-to-jpg": {
+ name: "Da GIF a JPG",
+ description: "Converti GIF in JPG online. Veloce, gratuito e privato.",
+ },
+ "gif-to-png": {
+ name: "Da GIF a PNG",
+ description: "Converti GIF in PNG online. Veloce, gratuito e privato.",
+ },
+ "webp-to-gif": {
+ name: "Da WebP a GIF",
+ description: "Converti WebP in GIF online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-tiff": {
+ name: "Da JPG a TIFF",
+ description: "Converti JPG in TIFF online. Veloce, gratuito e privato.",
+ },
+ "png-to-tiff": {
+ name: "Da PNG a TIFF",
+ description: "Converti PNG in TIFF online. Veloce, gratuito e privato.",
+ },
+ "tiff-to-jpg": {
+ name: "Da TIFF a JPG",
+ description: "Converti TIFF in JPG online. Veloce, gratuito e privato.",
+ },
+ "tiff-to-png": {
+ name: "Da TIFF a PNG",
+ description: "Converti TIFF in PNG online. Veloce, gratuito e privato.",
+ },
+ "psd-to-jpg": {
+ name: "Da PSD a JPG",
+ description: "Converti PSD in JPG online. Veloce, gratuito e privato.",
+ },
+ "psd-to-png": {
+ name: "Da PSD a PNG",
+ description: "Converti PSD in PNG online. Veloce, gratuito e privato.",
+ },
+ "png-to-eps": {
+ name: "Da PNG a EPS",
+ description: "Converti PNG in EPS online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-eps": {
+ name: "Da JPG a EPS",
+ description: "Converti JPG in EPS online. Veloce, gratuito e privato.",
+ },
+ "eps-to-png": {
+ name: "Da EPS a PNG",
+ description: "Converti EPS in PNG online. Veloce, gratuito e privato.",
+ },
+ "eps-to-jpg": {
+ name: "Da EPS a JPG",
+ description: "Converti EPS in JPG online. Veloce, gratuito e privato.",
+ },
+ "png-to-svg": {
+ name: "Da PNG a SVG",
+ description: "Converti PNG in SVG online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-svg": {
+ name: "Da JPG a SVG",
+ description: "Converti JPG in SVG online. Veloce, gratuito e privato.",
+ },
+ "tiff-to-svg": {
+ name: "Da TIFF a SVG",
+ description: "Converti TIFF in SVG online. Veloce, gratuito e privato.",
+ },
+ "psd-to-svg": {
+ name: "Da PSD a SVG",
+ description: "Converti PSD in SVG online. Veloce, gratuito e privato.",
+ },
+ "eps-to-svg": {
+ name: "Da EPS a SVG",
+ description: "Converti EPS in SVG online. Veloce, gratuito e privato.",
+ },
+ "svg-to-png": {
+ name: "Da SVG a PNG",
+ description: "Converti SVG in PNG online. Veloce, gratuito e privato.",
+ },
+ "svg-to-jpg": {
+ name: "Da SVG a JPG",
+ description: "Converti SVG in JPG online. Veloce, gratuito e privato.",
+ },
+ "jpg-to-pdf": {
+ name: "Da JPG a PDF",
+ description: "Converti JPG in PDF online. Veloce, gratuito e privato.",
+ },
+ "png-to-pdf": {
+ name: "Da PNG a PDF",
+ description: "Converti PNG in PDF online. Veloce, gratuito e privato.",
+ },
+ "heic-to-pdf": {
+ name: "Da HEIC a PDF",
+ description: "Converti HEIC in PDF online. Veloce, gratuito e privato.",
+ },
+ "tiff-to-pdf": {
+ name: "Da TIFF a PDF",
+ description: "Converti TIFF in PDF online. Veloce, gratuito e privato.",
+ },
+ "webp-to-pdf": {
+ name: "Da WebP a PDF",
+ description: "Converti WebP in PDF online. Veloce, gratuito e privato.",
+ },
+ "gif-to-pdf": {
+ name: "Da GIF a PDF",
+ description: "Converti GIF in PDF online. Veloce, gratuito e privato.",
+ },
+ "eps-to-pdf": {
+ name: "Da EPS a PDF",
+ description: "Converti EPS in PDF online. Veloce, gratuito e privato.",
+ },
+ "pdf-to-jpg": {
+ name: "Da PDF a JPG",
+ description: "Converti PDF in JPG online. Veloce, gratuito e privato.",
+ },
+ "pdf-to-png": {
+ name: "Da PDF a PNG",
+ description: "Converti PDF in PNG online. Veloce, gratuito e privato.",
+ },
+ "pdf-to-tiff": {
+ name: "Da PDF a TIFF",
+ description: "Converti PDF in TIFF online. Veloce, gratuito e privato.",
+ },
+ "mov-to-mp4": {
+ name: "Da MOV a MP4",
+ description: "Converti MOV in MP4 online. Veloce, gratuito e privato.",
+ },
+ "webm-to-mp4": {
+ name: "Da WEBM a MP4",
+ description: "Converti WEBM in MP4 online. Veloce, gratuito e privato.",
+ },
+ "mkv-to-mp4": {
+ name: "Da MKV a MP4",
+ description: "Converti MKV in MP4 online. Veloce, gratuito e privato.",
+ },
+ "avi-to-mp4": {
+ name: "Da AVI a MP4",
+ description: "Converti AVI in MP4 online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-mov": {
+ name: "Da MP4 a MOV",
+ description: "Converti MP4 in MOV online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-webm": {
+ name: "Da MP4 a WEBM",
+ description: "Converti MP4 in WEBM online. Veloce, gratuito e privato.",
+ },
+ "webm-to-mov": {
+ name: "Da WEBM a MOV",
+ description: "Converti WEBM in MOV online. Veloce, gratuito e privato.",
+ },
+ "mkv-to-mov": {
+ name: "Da MKV a MOV",
+ description: "Converti MKV in MOV online. Veloce, gratuito e privato.",
+ },
+ "avi-to-mov": {
+ name: "Da AVI a MOV",
+ description: "Converti AVI in MOV online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-avi": {
+ name: "Da MP4 a AVI",
+ description: "Converti MP4 in AVI online. Veloce, gratuito e privato.",
+ },
+ "mov-to-avi": {
+ name: "Da MOV a AVI",
+ description: "Converti MOV in AVI online. Veloce, gratuito e privato.",
+ },
+ "mkv-to-avi": {
+ name: "Da MKV a AVI",
+ description: "Converti MKV in AVI online. Veloce, gratuito e privato.",
+ },
+ "avi-to-mkv": {
+ name: "Da AVI a MKV",
+ description: "Converti AVI in MKV online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-gif": {
+ name: "Da MP4 a GIF",
+ description: "Converti MP4 in GIF online. Veloce, gratuito e privato.",
+ },
+ "mov-to-gif": {
+ name: "Da MOV a GIF",
+ description: "Converti MOV in GIF online. Veloce, gratuito e privato.",
+ },
+ "mkv-to-gif": {
+ name: "Da MKV a GIF",
+ description: "Converti MKV in GIF online. Veloce, gratuito e privato.",
+ },
+ "avi-to-gif": {
+ name: "Da AVI a GIF",
+ description: "Converti AVI in GIF online. Veloce, gratuito e privato.",
+ },
+ "gif-to-mp4": {
+ name: "Da GIF a MP4",
+ description: "Converti GIF in MP4 online. Veloce, gratuito e privato.",
+ },
+ "gif-to-webm": {
+ name: "Da GIF a WEBM",
+ description: "Converti GIF in WEBM online. Veloce, gratuito e privato.",
+ },
+ "gif-to-mov": {
+ name: "Da GIF a MOV",
+ description: "Converti GIF in MOV online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-mp3": {
+ name: "Da MP4 a MP3",
+ description: "Converti MP4 in MP3 online. Veloce, gratuito e privato.",
+ },
+ "mov-to-mp3": {
+ name: "Da MOV a MP3",
+ description: "Converti MOV in MP3 online. Veloce, gratuito e privato.",
+ },
+ "mkv-to-mp3": {
+ name: "Da MKV a MP3",
+ description: "Converti MKV in MP3 online. Veloce, gratuito e privato.",
+ },
+ "webm-to-mp3": {
+ name: "Da WEBM a MP3",
+ description: "Converti WEBM in MP3 online. Veloce, gratuito e privato.",
+ },
+ "avi-to-mp3": {
+ name: "Da AVI a MP3",
+ description: "Converti AVI in MP3 online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-wav": {
+ name: "Da MP4 a WAV",
+ description: "Converti MP4 in WAV online. Veloce, gratuito e privato.",
+ },
+ "mov-to-wav": {
+ name: "Da MOV a WAV",
+ description: "Converti MOV in WAV online. Veloce, gratuito e privato.",
+ },
+ "mp4-to-ogg": {
+ name: "Da MP4 a OGG",
+ description: "Converti MP4 in OGG online. Veloce, gratuito e privato.",
+ },
+ "m4a-to-mp3": {
+ name: "Da M4A a MP3",
+ description: "Converti M4A in MP3 online. Veloce, gratuito e privato.",
+ },
+ "m4a-to-wav": {
+ name: "Da M4A a WAV",
+ description: "Converti M4A in WAV online. Veloce, gratuito e privato.",
+ },
+ "aac-to-mp3": {
+ name: "Da AAC a MP3",
+ description: "Converti AAC in MP3 online. Veloce, gratuito e privato.",
+ },
+ "aac-to-wav": {
+ name: "Da AAC a WAV",
+ description: "Converti AAC in WAV online. Veloce, gratuito e privato.",
+ },
+ "aac-to-flac": {
+ name: "Da AAC a FLAC",
+ description: "Converti AAC in FLAC online. Veloce, gratuito e privato.",
+ },
+ "ogg-to-mp3": {
+ name: "Da OGG a MP3",
+ description: "Converti OGG in MP3 online. Veloce, gratuito e privato.",
+ },
+ "ogg-to-wav": {
+ name: "Da OGG a WAV",
+ description: "Converti OGG in WAV online. Veloce, gratuito e privato.",
+ },
+ "wav-to-mp3": {
+ name: "Da WAV a MP3",
+ description: "Converti WAV in MP3 online. Veloce, gratuito e privato.",
+ },
+ "mp3-to-wav": {
+ name: "Da MP3 a WAV",
+ description: "Converti MP3 in WAV online. Veloce, gratuito e privato.",
+ },
+ "flac-to-mp3": {
+ name: "Da FLAC a MP3",
+ description: "Converti FLAC in MP3 online. Veloce, gratuito e privato.",
+ },
+ "excel-to-csv": {
+ name: "Da Excel a CSV",
+ description: "Converti Excel in CSV online. Veloce, gratuito e privato.",
+ },
+ // END conversion-presets
resize: {
name: "Ridimensiona",
description: "Ridimensiona per pixel, percentuale o preset per social media",
@@ -150,7 +484,7 @@ export const it: TranslationKeys = {
description: "Rimuovi oggetti indesiderati con l'IA",
},
ocr: {
- name: "OCR / Estrazione testo",
+ name: "Estrai testo da immagine (OCR)",
description: "Estrai testo dalle immagini con precisione basata sull'IA",
},
"ocr-pdf": {
@@ -2757,6 +3091,14 @@ export const it: TranslationKeys = {
"Scarica uno ZIP diagnostico con configurazioni oscurate, log e dati dei job per la risoluzione dei problemi.",
supportBundleFailed: "Impossibile scaricare il pacchetto di supporto.",
},
+ privacy: {
+ title: "Privacy",
+ description:
+ "Le analisi di prodotto anonime aiutano a migliorare SnapOtter. Sono attive per impostazione predefinita e vengono configurate per l'intera istanza da un amministratore.",
+ analyticsLabel: "Analisi di prodotto anonime",
+ analyticsDescription:
+ "Condividi dati d'uso anonimi (quali strumenti vengono eseguiti, durate, codici di errore) e segnalazioni di arresto anomalo. Nessun indirizzo IP, nessuna identità dell'account. Non raccogliamo mai i nomi dei tuoi file, il contenuto dei file, l'output OCR, i metadati delle immagini o il testo dei documenti. Disattiva questa opzione per fermare tutto.",
+ },
security: {
heading: "Sicurezza",
description: "Impostazioni di password e autenticazione.",
@@ -3054,7 +3396,7 @@ export const it: TranslationKeys = {
heading: "Informazioni",
appName: "SnapOtter",
appDescription:
- "Una suite di elaborazione file self-hosted e orientata alla privacy, con 157 strumenti. Converti, comprimi, modifica, trascrivi, OCR e automatizza flussi di lavoro per immagini, video, audio, documenti e dati senza inviare dati al cloud.",
+ "Una suite di elaborazione file self-hosted e orientata alla privacy, con 240 strumenti. Converti, comprimi, modifica, trascrivi, OCR e automatizza flussi di lavoro per immagini, video, audio, documenti e dati senza inviare dati al cloud.",
versionLabel: "Versione:",
linksHeading: "Link",
githubLink: "Repository GitHub",
@@ -3114,7 +3456,7 @@ export const it: TranslationKeys = {
"Nessun limite. Nessun tetto nascosto.",
"Funziona completamente offline.",
"Elaborazione in blocco illimitata.",
- "157 strumenti.",
+ "240 strumenti.",
"15 modelli IA. Il tuo hardware.",
"Velocissimo. Basato su Sharp.",
"Pronto per reti isolate.",
@@ -3179,6 +3521,7 @@ export const it: TranslationKeys = {
toolPalette: "Palette strumenti",
clickToAdd: "Fai clic per aggiungere al Pipeline",
savedLabel: "Salvato",
+ templatesLabel: "Modelli",
importButton: "Importa",
noSavedPipelines: "Nessun Pipeline salvato",
stepCount: "({count} passaggio)",
@@ -3465,4 +3808,45 @@ export const it: TranslationKeys = {
navigationMenu: "Menu di navigazione",
homeLink: "Home di SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Ottimizza per il web",
+ description:
+ "Ridimensiona, converti in WebP e comprimi un'immagine per un caricamento web veloce.",
+ },
+ "email-friendly": {
+ name: "Adatta alle email",
+ description: "Riduci un'immagine così da renderla abbastanza piccola da allegare a un'email.",
+ },
+ "privacy-scrub": {
+ name: "Pulizia privacy",
+ description: "Rimuovi EXIF, GPS e altri metadati, poi comprimi.",
+ },
+ "social-square": {
+ name: "Quadrato social",
+ description: "Ritaglia in un quadrato 1:1 e comprimi per i post sui social.",
+ },
+ "watermark-batch": {
+ name: "Filigrana in serie",
+ description: "Applica una filigrana di testo alle immagini, poi comprimi.",
+ },
+ "shrink-pdf-email": {
+ name: "Riduci PDF per email",
+ description:
+ "Appiattisci e comprimi con decisione un PDF per rispettare i limiti delle email.",
+ },
+ "podcast-polish": {
+ name: "Rifinitura podcast",
+ description:
+ "Rimuovi i silenzi, normalizza il volume e aggiungi dissolvenze a una registrazione.",
+ },
+ "cut-out-subject": {
+ name: "Scontorna il soggetto",
+ description: "Rimuovi lo sfondo con l'IA e comprimi il ritaglio trasparente.",
+ },
+ "restore-old-photo": {
+ name: "Restaura vecchia foto",
+ description: "Ripara, colora e ingrandisci una foto vecchia o danneggiata con l'IA.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/ja.ts b/packages/shared/src/i18n/ja.ts
index e32f4d18..69b1481b 100644
--- a/packages/shared/src/i18n/ja.ts
+++ b/packages/shared/src/i18n/ja.ts
@@ -73,6 +73,340 @@ export const ja: TranslationKeys = {
documentsAndFiles: "PDF & ファイル",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPGをPNGに変換",
+ description: "JPGをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-jpg": {
+ name: "PNGをJPGに変換",
+ description: "PNGをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-webp": {
+ name: "JPGをWebPに変換",
+ description: "JPGをWebPにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-webp": {
+ name: "PNGをWebPに変換",
+ description: "PNGをWebPにオンラインで変換。高速、無料、プライベート。",
+ },
+ "webp-to-jpg": {
+ name: "WebPをJPGに変換",
+ description: "WebPをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "webp-to-png": {
+ name: "WebPをPNGに変換",
+ description: "WebPをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-avif": {
+ name: "JPGをAVIFに変換",
+ description: "JPGをAVIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-avif": {
+ name: "PNGをAVIFに変換",
+ description: "PNGをAVIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "webp-to-avif": {
+ name: "WebPをAVIFに変換",
+ description: "WebPをAVIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "heic-to-jpg": {
+ name: "HEICをJPGに変換",
+ description: "HEICをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "heic-to-png": {
+ name: "HEICをPNGに変換",
+ description: "HEICをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "heic-to-avif": {
+ name: "HEICをAVIFに変換",
+ description: "HEICをAVIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-gif": {
+ name: "JPGをGIFに変換",
+ description: "JPGをGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-gif": {
+ name: "PNGをGIFに変換",
+ description: "PNGをGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "gif-to-jpg": {
+ name: "GIFをJPGに変換",
+ description: "GIFをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "gif-to-png": {
+ name: "GIFをPNGに変換",
+ description: "GIFをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "webp-to-gif": {
+ name: "WebPをGIFに変換",
+ description: "WebPをGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-tiff": {
+ name: "JPGをTIFFに変換",
+ description: "JPGをTIFFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-tiff": {
+ name: "PNGをTIFFに変換",
+ description: "PNGをTIFFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "tiff-to-jpg": {
+ name: "TIFFをJPGに変換",
+ description: "TIFFをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "tiff-to-png": {
+ name: "TIFFをPNGに変換",
+ description: "TIFFをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "psd-to-jpg": {
+ name: "PSDをJPGに変換",
+ description: "PSDをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "psd-to-png": {
+ name: "PSDをPNGに変換",
+ description: "PSDをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-eps": {
+ name: "PNGをEPSに変換",
+ description: "PNGをEPSにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-eps": {
+ name: "JPGをEPSに変換",
+ description: "JPGをEPSにオンラインで変換。高速、無料、プライベート。",
+ },
+ "eps-to-png": {
+ name: "EPSをPNGに変換",
+ description: "EPSをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "eps-to-jpg": {
+ name: "EPSをJPGに変換",
+ description: "EPSをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-svg": {
+ name: "PNGをSVGに変換",
+ description: "PNGをSVGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-svg": {
+ name: "JPGをSVGに変換",
+ description: "JPGをSVGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "tiff-to-svg": {
+ name: "TIFFをSVGに変換",
+ description: "TIFFをSVGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "psd-to-svg": {
+ name: "PSDをSVGに変換",
+ description: "PSDをSVGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "eps-to-svg": {
+ name: "EPSをSVGに変換",
+ description: "EPSをSVGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "svg-to-png": {
+ name: "SVGをPNGに変換",
+ description: "SVGをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "svg-to-jpg": {
+ name: "SVGをJPGに変換",
+ description: "SVGをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "jpg-to-pdf": {
+ name: "JPGをPDFに変換",
+ description: "JPGをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "png-to-pdf": {
+ name: "PNGをPDFに変換",
+ description: "PNGをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "heic-to-pdf": {
+ name: "HEICをPDFに変換",
+ description: "HEICをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "tiff-to-pdf": {
+ name: "TIFFをPDFに変換",
+ description: "TIFFをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "webp-to-pdf": {
+ name: "WebPをPDFに変換",
+ description: "WebPをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "gif-to-pdf": {
+ name: "GIFをPDFに変換",
+ description: "GIFをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "eps-to-pdf": {
+ name: "EPSをPDFに変換",
+ description: "EPSをPDFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "pdf-to-jpg": {
+ name: "PDFをJPGに変換",
+ description: "PDFをJPGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "pdf-to-png": {
+ name: "PDFをPNGに変換",
+ description: "PDFをPNGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "pdf-to-tiff": {
+ name: "PDFをTIFFに変換",
+ description: "PDFをTIFFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mov-to-mp4": {
+ name: "MOVをMP4に変換",
+ description: "MOVをMP4にオンラインで変換。高速、無料、プライベート。",
+ },
+ "webm-to-mp4": {
+ name: "WEBMをMP4に変換",
+ description: "WEBMをMP4にオンラインで変換。高速、無料、プライベート。",
+ },
+ "mkv-to-mp4": {
+ name: "MKVをMP4に変換",
+ description: "MKVをMP4にオンラインで変換。高速、無料、プライベート。",
+ },
+ "avi-to-mp4": {
+ name: "AVIをMP4に変換",
+ description: "AVIをMP4にオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-mov": {
+ name: "MP4をMOVに変換",
+ description: "MP4をMOVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-webm": {
+ name: "MP4をWEBMに変換",
+ description: "MP4をWEBMにオンラインで変換。高速、無料、プライベート。",
+ },
+ "webm-to-mov": {
+ name: "WEBMをMOVに変換",
+ description: "WEBMをMOVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mkv-to-mov": {
+ name: "MKVをMOVに変換",
+ description: "MKVをMOVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "avi-to-mov": {
+ name: "AVIをMOVに変換",
+ description: "AVIをMOVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-avi": {
+ name: "MP4をAVIに変換",
+ description: "MP4をAVIにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mov-to-avi": {
+ name: "MOVをAVIに変換",
+ description: "MOVをAVIにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mkv-to-avi": {
+ name: "MKVをAVIに変換",
+ description: "MKVをAVIにオンラインで変換。高速、無料、プライベート。",
+ },
+ "avi-to-mkv": {
+ name: "AVIをMKVに変換",
+ description: "AVIをMKVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-gif": {
+ name: "MP4をGIFに変換",
+ description: "MP4をGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mov-to-gif": {
+ name: "MOVをGIFに変換",
+ description: "MOVをGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mkv-to-gif": {
+ name: "MKVをGIFに変換",
+ description: "MKVをGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "avi-to-gif": {
+ name: "AVIをGIFに変換",
+ description: "AVIをGIFにオンラインで変換。高速、無料、プライベート。",
+ },
+ "gif-to-mp4": {
+ name: "GIFをMP4に変換",
+ description: "GIFをMP4にオンラインで変換。高速、無料、プライベート。",
+ },
+ "gif-to-webm": {
+ name: "GIFをWEBMに変換",
+ description: "GIFをWEBMにオンラインで変換。高速、無料、プライベート。",
+ },
+ "gif-to-mov": {
+ name: "GIFをMOVに変換",
+ description: "GIFをMOVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-mp3": {
+ name: "MP4をMP3に変換",
+ description: "MP4をMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "mov-to-mp3": {
+ name: "MOVをMP3に変換",
+ description: "MOVをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "mkv-to-mp3": {
+ name: "MKVをMP3に変換",
+ description: "MKVをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "webm-to-mp3": {
+ name: "WEBMをMP3に変換",
+ description: "WEBMをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "avi-to-mp3": {
+ name: "AVIをMP3に変換",
+ description: "AVIをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-wav": {
+ name: "MP4をWAVに変換",
+ description: "MP4をWAVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mov-to-wav": {
+ name: "MOVをWAVに変換",
+ description: "MOVをWAVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp4-to-ogg": {
+ name: "MP4をOGGに変換",
+ description: "MP4をOGGにオンラインで変換。高速、無料、プライベート。",
+ },
+ "m4a-to-mp3": {
+ name: "M4AをMP3に変換",
+ description: "M4AをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "m4a-to-wav": {
+ name: "M4AをWAVに変換",
+ description: "M4AをWAVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "aac-to-mp3": {
+ name: "AACをMP3に変換",
+ description: "AACをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "aac-to-wav": {
+ name: "AACをWAVに変換",
+ description: "AACをWAVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "aac-to-flac": {
+ name: "AACをFLACに変換",
+ description: "AACをFLACにオンラインで変換。高速、無料、プライベート。",
+ },
+ "ogg-to-mp3": {
+ name: "OGGをMP3に変換",
+ description: "OGGをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "ogg-to-wav": {
+ name: "OGGをWAVに変換",
+ description: "OGGをWAVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "wav-to-mp3": {
+ name: "WAVをMP3に変換",
+ description: "WAVをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "mp3-to-wav": {
+ name: "MP3をWAVに変換",
+ description: "MP3をWAVにオンラインで変換。高速、無料、プライベート。",
+ },
+ "flac-to-mp3": {
+ name: "FLACをMP3に変換",
+ description: "FLACをMP3にオンラインで変換。高速、無料、プライベート。",
+ },
+ "excel-to-csv": {
+ name: "ExcelをCSVに変換",
+ description: "ExcelをCSVにオンラインで変換。高速、無料、プライベート。",
+ },
+ // END conversion-presets
resize: {
name: "リサイズ",
description: "ピクセル、パーセント、SNSプリセットでリサイズ",
@@ -129,7 +463,7 @@ export const ja: TranslationKeys = {
upscale: { name: "画像アップスケール", description: "AI超解像エンハンスメント" },
"erase-object": { name: "オブジェクト消去", description: "AIで不要なオブジェクトを除去" },
ocr: {
- name: "OCR / テキスト抽出",
+ name: "画像から文字を抽出 (OCR)",
description: "AIで画像からテキストを高精度に抽出",
},
"ocr-pdf": {
@@ -2708,6 +3042,14 @@ export const ja: TranslationKeys = {
"トラブルシューティング用の診断 ZIP(設定、ログ、ジョブデータを含む)をダウンロードします。",
supportBundleFailed: "サポートバンドルのダウンロードに失敗しました。",
},
+ privacy: {
+ title: "プライバシー",
+ description:
+ "匿名のプロダクト分析は SnapOtter の改善に役立ちます。既定で有効になっており、インスタンス全体に対して管理者が設定します。",
+ analyticsLabel: "匿名のプロダクト分析",
+ analyticsDescription:
+ "匿名の使用状況データ(実行されたツール、処理時間、エラーコード)とクラッシュレポートを共有します。IP アドレスやアカウント情報は含まれません。ファイル名、ファイルの内容、OCR の出力、画像のメタデータ、ドキュメントのテキストを収集することは一切ありません。これをオフにすると、すべて停止します。",
+ },
security: {
heading: "セキュリティ",
description: "パスワードと認証の設定。",
@@ -2996,7 +3338,7 @@ export const ja: TranslationKeys = {
heading: "SnapOtterについて",
appName: "SnapOtter",
appDescription:
- "セルフホスト型、プライバシー第一のファイル処理スイート。157のツールを搭載。変換、圧縮、編集、文字起こし、OCRなど、画像・動画・音声・ドキュメント・データのワークフローをクラウドにデータを送ることなく自動化できます。",
+ "セルフホスト型、プライバシー第一のファイル処理スイート。240のツールを搭載。変換、圧縮、編集、文字起こし、OCRなど、画像・動画・音声・ドキュメント・データのワークフローをクラウドにデータを送ることなく自動化できます。",
versionLabel: "バージョン:",
linksHeading: "リンク",
githubLink: "GitHubリポジトリ",
@@ -3054,7 +3396,7 @@ export const ja: TranslationKeys = {
"制限なし。隠れた上限なし。",
"完全オフラインで動作。",
"バッチ処理も無制限。",
- "157のツールを搭載。",
+ "240のツールを搭載。",
"15のAIモデル。あなたのハードウェアで。",
"Sharp搭載で超高速処理。",
"エアギャップ環境にも対応。",
@@ -3118,6 +3460,7 @@ export const ja: TranslationKeys = {
toolPalette: "ツールパレット",
clickToAdd: "クリックでPipelineに追加",
savedLabel: "保存済み",
+ templatesLabel: "テンプレート",
importButton: "インポート",
noSavedPipelines: "保存されたPipelineはありません",
stepCount: "({count}ステップ)",
@@ -3405,6 +3748,44 @@ export const ja: TranslationKeys = {
navigationMenu: "ナビゲーション",
homeLink: "SnapOtter ホーム",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Web向けに最適化",
+ description: "画像をリサイズし、WebPに変換して圧縮し、Webでの読み込みを高速化します。",
+ },
+ "email-friendly": {
+ name: "メール添付向け",
+ description: "メールに添付できるよう、画像を十分に小さく縮小します。",
+ },
+ "privacy-scrub": {
+ name: "プライバシー消去",
+ description: "EXIF、GPS、その他のメタデータを削除してから圧縮します。",
+ },
+ "social-square": {
+ name: "SNS用スクエア",
+ description: "1:1の正方形にトリミングし、SNS投稿向けに圧縮します。",
+ },
+ "watermark-batch": {
+ name: "透かし一括",
+ description: "画像にテキストの透かしを入れてから圧縮します。",
+ },
+ "shrink-pdf-email": {
+ name: "メール用にPDFを縮小",
+ description: "PDFをフラット化し、メールの制限に収まるよう強力に圧縮します。",
+ },
+ "podcast-polish": {
+ name: "ポッドキャスト仕上げ",
+ description: "無音部分を削除し、音量を正規化して、録音にフェードを追加します。",
+ },
+ "cut-out-subject": {
+ name: "被写体を切り抜き",
+ description: "AIで背景を除去し、透明な切り抜きを圧縮します。",
+ },
+ "restore-old-photo": {
+ name: "古い写真を復元",
+ description: "AIで古い写真や傷んだ写真を修復し、着色して拡大します。",
+ },
+ },
} as const;
export default ja;
diff --git a/packages/shared/src/i18n/ko.ts b/packages/shared/src/i18n/ko.ts
index f9053b94..a24758f4 100644
--- a/packages/shared/src/i18n/ko.ts
+++ b/packages/shared/src/i18n/ko.ts
@@ -73,6 +73,340 @@ export const ko: TranslationKeys = {
documentsAndFiles: "PDF & 파일",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG을(를) PNG(으)로",
+ description: "JPG을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-jpg": {
+ name: "PNG을(를) JPG(으)로",
+ description: "PNG을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-webp": {
+ name: "JPG을(를) WebP(으)로",
+ description: "JPG을(를) WebP(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-webp": {
+ name: "PNG을(를) WebP(으)로",
+ description: "PNG을(를) WebP(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webp-to-jpg": {
+ name: "WebP을(를) JPG(으)로",
+ description: "WebP을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webp-to-png": {
+ name: "WebP을(를) PNG(으)로",
+ description: "WebP을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-avif": {
+ name: "JPG을(를) AVIF(으)로",
+ description: "JPG을(를) AVIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-avif": {
+ name: "PNG을(를) AVIF(으)로",
+ description: "PNG을(를) AVIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webp-to-avif": {
+ name: "WebP을(를) AVIF(으)로",
+ description: "WebP을(를) AVIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC을(를) JPG(으)로",
+ description: "HEIC을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "heic-to-png": {
+ name: "HEIC을(를) PNG(으)로",
+ description: "HEIC을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "heic-to-avif": {
+ name: "HEIC을(를) AVIF(으)로",
+ description: "HEIC을(를) AVIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-gif": {
+ name: "JPG을(를) GIF(으)로",
+ description: "JPG을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-gif": {
+ name: "PNG을(를) GIF(으)로",
+ description: "PNG을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "gif-to-jpg": {
+ name: "GIF을(를) JPG(으)로",
+ description: "GIF을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "gif-to-png": {
+ name: "GIF을(를) PNG(으)로",
+ description: "GIF을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webp-to-gif": {
+ name: "WebP을(를) GIF(으)로",
+ description: "WebP을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG을(를) TIFF(으)로",
+ description: "JPG을(를) TIFF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-tiff": {
+ name: "PNG을(를) TIFF(으)로",
+ description: "PNG을(를) TIFF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF을(를) JPG(으)로",
+ description: "TIFF을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "tiff-to-png": {
+ name: "TIFF을(를) PNG(으)로",
+ description: "TIFF을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "psd-to-jpg": {
+ name: "PSD을(를) JPG(으)로",
+ description: "PSD을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "psd-to-png": {
+ name: "PSD을(를) PNG(으)로",
+ description: "PSD을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-eps": {
+ name: "PNG을(를) EPS(으)로",
+ description: "PNG을(를) EPS(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-eps": {
+ name: "JPG을(를) EPS(으)로",
+ description: "JPG을(를) EPS(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "eps-to-png": {
+ name: "EPS을(를) PNG(으)로",
+ description: "EPS을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "eps-to-jpg": {
+ name: "EPS을(를) JPG(으)로",
+ description: "EPS을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-svg": {
+ name: "PNG을(를) SVG(으)로",
+ description: "PNG을(를) SVG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-svg": {
+ name: "JPG을(를) SVG(으)로",
+ description: "JPG을(를) SVG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF을(를) SVG(으)로",
+ description: "TIFF을(를) SVG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "psd-to-svg": {
+ name: "PSD을(를) SVG(으)로",
+ description: "PSD을(를) SVG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "eps-to-svg": {
+ name: "EPS을(를) SVG(으)로",
+ description: "EPS을(를) SVG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "svg-to-png": {
+ name: "SVG을(를) PNG(으)로",
+ description: "SVG을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "svg-to-jpg": {
+ name: "SVG을(를) JPG(으)로",
+ description: "SVG을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG을(를) PDF(으)로",
+ description: "JPG을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "png-to-pdf": {
+ name: "PNG을(를) PDF(으)로",
+ description: "PNG을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC을(를) PDF(으)로",
+ description: "HEIC을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF을(를) PDF(으)로",
+ description: "TIFF을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webp-to-pdf": {
+ name: "WebP을(를) PDF(으)로",
+ description: "WebP을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "gif-to-pdf": {
+ name: "GIF을(를) PDF(으)로",
+ description: "GIF을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "eps-to-pdf": {
+ name: "EPS을(를) PDF(으)로",
+ description: "EPS을(를) PDF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF을(를) JPG(으)로",
+ description: "PDF을(를) JPG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "pdf-to-png": {
+ name: "PDF을(를) PNG(으)로",
+ description: "PDF을(를) PNG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF을(를) TIFF(으)로",
+ description: "PDF을(를) TIFF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mov-to-mp4": {
+ name: "MOV을(를) MP4(으)로",
+ description: "MOV을(를) MP4(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM을(를) MP4(으)로",
+ description: "WEBM을(를) MP4(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV을(를) MP4(으)로",
+ description: "MKV을(를) MP4(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "avi-to-mp4": {
+ name: "AVI을(를) MP4(으)로",
+ description: "AVI을(를) MP4(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-mov": {
+ name: "MP4을(를) MOV(으)로",
+ description: "MP4을(를) MOV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-webm": {
+ name: "MP4을(를) WEBM(으)로",
+ description: "MP4을(를) WEBM(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webm-to-mov": {
+ name: "WEBM을(를) MOV(으)로",
+ description: "WEBM을(를) MOV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mkv-to-mov": {
+ name: "MKV을(를) MOV(으)로",
+ description: "MKV을(를) MOV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "avi-to-mov": {
+ name: "AVI을(를) MOV(으)로",
+ description: "AVI을(를) MOV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-avi": {
+ name: "MP4을(를) AVI(으)로",
+ description: "MP4을(를) AVI(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mov-to-avi": {
+ name: "MOV을(를) AVI(으)로",
+ description: "MOV을(를) AVI(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mkv-to-avi": {
+ name: "MKV을(를) AVI(으)로",
+ description: "MKV을(를) AVI(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "avi-to-mkv": {
+ name: "AVI을(를) MKV(으)로",
+ description: "AVI을(를) MKV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-gif": {
+ name: "MP4을(를) GIF(으)로",
+ description: "MP4을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mov-to-gif": {
+ name: "MOV을(를) GIF(으)로",
+ description: "MOV을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mkv-to-gif": {
+ name: "MKV을(를) GIF(으)로",
+ description: "MKV을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "avi-to-gif": {
+ name: "AVI을(를) GIF(으)로",
+ description: "AVI을(를) GIF(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "gif-to-mp4": {
+ name: "GIF을(를) MP4(으)로",
+ description: "GIF을(를) MP4(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "gif-to-webm": {
+ name: "GIF을(를) WEBM(으)로",
+ description: "GIF을(를) WEBM(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "gif-to-mov": {
+ name: "GIF을(를) MOV(으)로",
+ description: "GIF을(를) MOV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4을(를) MP3(으)로",
+ description: "MP4을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mov-to-mp3": {
+ name: "MOV을(를) MP3(으)로",
+ description: "MOV을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV을(를) MP3(으)로",
+ description: "MKV을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM을(를) MP3(으)로",
+ description: "WEBM을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "avi-to-mp3": {
+ name: "AVI을(를) MP3(으)로",
+ description: "AVI을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-wav": {
+ name: "MP4을(를) WAV(으)로",
+ description: "MP4을(를) WAV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mov-to-wav": {
+ name: "MOV을(를) WAV(으)로",
+ description: "MOV을(를) WAV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4을(를) OGG(으)로",
+ description: "MP4을(를) OGG(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A을(를) MP3(으)로",
+ description: "M4A을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "m4a-to-wav": {
+ name: "M4A을(를) WAV(으)로",
+ description: "M4A을(를) WAV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "aac-to-mp3": {
+ name: "AAC을(를) MP3(으)로",
+ description: "AAC을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "aac-to-wav": {
+ name: "AAC을(를) WAV(으)로",
+ description: "AAC을(를) WAV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "aac-to-flac": {
+ name: "AAC을(를) FLAC(으)로",
+ description: "AAC을(를) FLAC(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG을(를) MP3(으)로",
+ description: "OGG을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "ogg-to-wav": {
+ name: "OGG을(를) WAV(으)로",
+ description: "OGG을(를) WAV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "wav-to-mp3": {
+ name: "WAV을(를) MP3(으)로",
+ description: "WAV을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "mp3-to-wav": {
+ name: "MP3을(를) WAV(으)로",
+ description: "MP3을(를) WAV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC을(를) MP3(으)로",
+ description: "FLAC을(를) MP3(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ "excel-to-csv": {
+ name: "Excel을(를) CSV(으)로",
+ description: "Excel을(를) CSV(으)로 온라인 변환. 빠르고 무료이며 비공개입니다.",
+ },
+ // END conversion-presets
resize: {
name: "리사이즈",
description: "픽셀, 퍼센트 또는 소셜 미디어 프리셋으로 리사이즈",
@@ -126,7 +460,7 @@ export const ko: TranslationKeys = {
upscale: { name: "이미지 업스케일", description: "AI 초해상도 향상" },
"erase-object": { name: "객체 지우기", description: "AI로 원하지 않는 객체 제거" },
ocr: {
- name: "OCR / 텍스트 추출",
+ name: "이미지에서 텍스트 추출 (OCR)",
description: "AI로 이미지에서 높은 정확도로 텍스트 추출",
},
"ocr-pdf": {
@@ -2692,6 +3026,14 @@ export const ko: TranslationKeys = {
"편집된 설정, 로그 및 작업 데이터가 포함된 진단 zip을 다운로드합니다.",
supportBundleFailed: "지원 번들 다운로드에 실패했습니다.",
},
+ privacy: {
+ title: "개인정보",
+ description:
+ "익명 제품 분석은 SnapOtter 개선에 도움이 됩니다. 기본적으로 켜져 있으며 관리자가 전체 인스턴스에 대해 설정합니다.",
+ analyticsLabel: "익명 제품 분석",
+ analyticsDescription:
+ "익명 사용 데이터(실행된 도구, 소요 시간, 오류 코드)와 충돌 보고서를 공유합니다. IP 주소나 계정 정보는 포함되지 않습니다. 파일 이름, 파일 내용, OCR 결과, 이미지 메타데이터, 문서 텍스트는 절대 수집하지 않습니다. 모두 중단하려면 이 옵션을 끄세요.",
+ },
security: {
heading: "보안",
description: "비밀번호 및 인증 설정.",
@@ -2980,7 +3322,7 @@ export const ko: TranslationKeys = {
heading: "정보",
appName: "SnapOtter",
appDescription:
- "셀프 호스팅, 개인정보 우선의 파일 처리 도구 모음으로 157개의 도구를 제공합니다. 변환, 압축, 편집, 전사, OCR 등 이미지, 동영상, 오디오, 문서, 데이터 워크플로를 클라우드에 데이터를 보내지 않고 자동화할 수 있습니다.",
+ "셀프 호스팅, 개인정보 우선의 파일 처리 도구 모음으로 240개의 도구를 제공합니다. 변환, 압축, 편집, 전사, OCR 등 이미지, 동영상, 오디오, 문서, 데이터 워크플로를 클라우드에 데이터를 보내지 않고 자동화할 수 있습니다.",
versionLabel: "버전:",
linksHeading: "링크",
githubLink: "GitHub 저장소",
@@ -3037,7 +3379,7 @@ export const ko: TranslationKeys = {
"제한 없음. 숨겨진 상한 없음.",
"완전히 오프라인으로 작동해요.",
"무제한 일괄 처리.",
- "157개의 도구.",
+ "240개의 도구.",
"15개 AI 모델. 당신의 하드웨어에서.",
"Sharp 기반의 초고속 처리.",
"에어갭 환경에서도 사용 가능.",
@@ -3101,6 +3443,7 @@ export const ko: TranslationKeys = {
toolPalette: "도구 팔레트",
clickToAdd: "클릭하여 Pipeline에 추가",
savedLabel: "저장됨",
+ templatesLabel: "템플릿",
importButton: "가져오기",
noSavedPipelines: "저장된 Pipeline이 없습니다",
stepCount: "({count}단계)",
@@ -3387,6 +3730,45 @@ export const ko: TranslationKeys = {
navigationMenu: "탐색 메뉴",
homeLink: "SnapOtter 홈",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "웹 최적화",
+ description:
+ "이미지 크기를 조정하고 WebP로 변환한 뒤 압축하여 웹에서 빠르게 로드되도록 합니다.",
+ },
+ "email-friendly": {
+ name: "이메일 적합",
+ description: "이메일에 첨부할 수 있을 만큼 이미지를 충분히 작게 줄입니다.",
+ },
+ "privacy-scrub": {
+ name: "개인정보 정리",
+ description: "EXIF, GPS 및 기타 메타데이터를 제거한 뒤 압축합니다.",
+ },
+ "social-square": {
+ name: "소셜 정사각형",
+ description: "1:1 정사각형으로 자르고 소셜 게시물용으로 압축합니다.",
+ },
+ "watermark-batch": {
+ name: "워터마크 일괄 처리",
+ description: "이미지에 텍스트 워터마크를 찍은 뒤 압축합니다.",
+ },
+ "shrink-pdf-email": {
+ name: "이메일용 PDF 축소",
+ description: "PDF를 평면화하고 이메일 용량 제한에 맞게 강하게 압축합니다.",
+ },
+ "podcast-polish": {
+ name: "팟캐스트 다듬기",
+ description: "무음 구간을 제거하고 음량을 정규화한 뒤 녹음에 페이드를 추가합니다.",
+ },
+ "cut-out-subject": {
+ name: "피사체 오려내기",
+ description: "AI로 배경을 제거하고 투명한 누끼 이미지를 압축합니다.",
+ },
+ "restore-old-photo": {
+ name: "오래된 사진 복원",
+ description: "AI로 오래되거나 손상된 사진을 복구하고 색을 입히며 업스케일합니다.",
+ },
+ },
} as const;
export default ko;
diff --git a/packages/shared/src/i18n/nl.ts b/packages/shared/src/i18n/nl.ts
index 39b74373..b999b91a 100644
--- a/packages/shared/src/i18n/nl.ts
+++ b/packages/shared/src/i18n/nl.ts
@@ -73,6 +73,340 @@ export const nl: TranslationKeys = {
documentsAndFiles: "PDF & bestanden",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG naar PNG",
+ description: "Zet JPG online om naar PNG. Snel, gratis en privé.",
+ },
+ "png-to-jpg": {
+ name: "PNG naar JPG",
+ description: "Zet PNG online om naar JPG. Snel, gratis en privé.",
+ },
+ "jpg-to-webp": {
+ name: "JPG naar WebP",
+ description: "Zet JPG online om naar WebP. Snel, gratis en privé.",
+ },
+ "png-to-webp": {
+ name: "PNG naar WebP",
+ description: "Zet PNG online om naar WebP. Snel, gratis en privé.",
+ },
+ "webp-to-jpg": {
+ name: "WebP naar JPG",
+ description: "Zet WebP online om naar JPG. Snel, gratis en privé.",
+ },
+ "webp-to-png": {
+ name: "WebP naar PNG",
+ description: "Zet WebP online om naar PNG. Snel, gratis en privé.",
+ },
+ "jpg-to-avif": {
+ name: "JPG naar AVIF",
+ description: "Zet JPG online om naar AVIF. Snel, gratis en privé.",
+ },
+ "png-to-avif": {
+ name: "PNG naar AVIF",
+ description: "Zet PNG online om naar AVIF. Snel, gratis en privé.",
+ },
+ "webp-to-avif": {
+ name: "WebP naar AVIF",
+ description: "Zet WebP online om naar AVIF. Snel, gratis en privé.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC naar JPG",
+ description: "Zet HEIC online om naar JPG. Snel, gratis en privé.",
+ },
+ "heic-to-png": {
+ name: "HEIC naar PNG",
+ description: "Zet HEIC online om naar PNG. Snel, gratis en privé.",
+ },
+ "heic-to-avif": {
+ name: "HEIC naar AVIF",
+ description: "Zet HEIC online om naar AVIF. Snel, gratis en privé.",
+ },
+ "jpg-to-gif": {
+ name: "JPG naar GIF",
+ description: "Zet JPG online om naar GIF. Snel, gratis en privé.",
+ },
+ "png-to-gif": {
+ name: "PNG naar GIF",
+ description: "Zet PNG online om naar GIF. Snel, gratis en privé.",
+ },
+ "gif-to-jpg": {
+ name: "GIF naar JPG",
+ description: "Zet GIF online om naar JPG. Snel, gratis en privé.",
+ },
+ "gif-to-png": {
+ name: "GIF naar PNG",
+ description: "Zet GIF online om naar PNG. Snel, gratis en privé.",
+ },
+ "webp-to-gif": {
+ name: "WebP naar GIF",
+ description: "Zet WebP online om naar GIF. Snel, gratis en privé.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG naar TIFF",
+ description: "Zet JPG online om naar TIFF. Snel, gratis en privé.",
+ },
+ "png-to-tiff": {
+ name: "PNG naar TIFF",
+ description: "Zet PNG online om naar TIFF. Snel, gratis en privé.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF naar JPG",
+ description: "Zet TIFF online om naar JPG. Snel, gratis en privé.",
+ },
+ "tiff-to-png": {
+ name: "TIFF naar PNG",
+ description: "Zet TIFF online om naar PNG. Snel, gratis en privé.",
+ },
+ "psd-to-jpg": {
+ name: "PSD naar JPG",
+ description: "Zet PSD online om naar JPG. Snel, gratis en privé.",
+ },
+ "psd-to-png": {
+ name: "PSD naar PNG",
+ description: "Zet PSD online om naar PNG. Snel, gratis en privé.",
+ },
+ "png-to-eps": {
+ name: "PNG naar EPS",
+ description: "Zet PNG online om naar EPS. Snel, gratis en privé.",
+ },
+ "jpg-to-eps": {
+ name: "JPG naar EPS",
+ description: "Zet JPG online om naar EPS. Snel, gratis en privé.",
+ },
+ "eps-to-png": {
+ name: "EPS naar PNG",
+ description: "Zet EPS online om naar PNG. Snel, gratis en privé.",
+ },
+ "eps-to-jpg": {
+ name: "EPS naar JPG",
+ description: "Zet EPS online om naar JPG. Snel, gratis en privé.",
+ },
+ "png-to-svg": {
+ name: "PNG naar SVG",
+ description: "Zet PNG online om naar SVG. Snel, gratis en privé.",
+ },
+ "jpg-to-svg": {
+ name: "JPG naar SVG",
+ description: "Zet JPG online om naar SVG. Snel, gratis en privé.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF naar SVG",
+ description: "Zet TIFF online om naar SVG. Snel, gratis en privé.",
+ },
+ "psd-to-svg": {
+ name: "PSD naar SVG",
+ description: "Zet PSD online om naar SVG. Snel, gratis en privé.",
+ },
+ "eps-to-svg": {
+ name: "EPS naar SVG",
+ description: "Zet EPS online om naar SVG. Snel, gratis en privé.",
+ },
+ "svg-to-png": {
+ name: "SVG naar PNG",
+ description: "Zet SVG online om naar PNG. Snel, gratis en privé.",
+ },
+ "svg-to-jpg": {
+ name: "SVG naar JPG",
+ description: "Zet SVG online om naar JPG. Snel, gratis en privé.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG naar PDF",
+ description: "Zet JPG online om naar PDF. Snel, gratis en privé.",
+ },
+ "png-to-pdf": {
+ name: "PNG naar PDF",
+ description: "Zet PNG online om naar PDF. Snel, gratis en privé.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC naar PDF",
+ description: "Zet HEIC online om naar PDF. Snel, gratis en privé.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF naar PDF",
+ description: "Zet TIFF online om naar PDF. Snel, gratis en privé.",
+ },
+ "webp-to-pdf": {
+ name: "WebP naar PDF",
+ description: "Zet WebP online om naar PDF. Snel, gratis en privé.",
+ },
+ "gif-to-pdf": {
+ name: "GIF naar PDF",
+ description: "Zet GIF online om naar PDF. Snel, gratis en privé.",
+ },
+ "eps-to-pdf": {
+ name: "EPS naar PDF",
+ description: "Zet EPS online om naar PDF. Snel, gratis en privé.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF naar JPG",
+ description: "Zet PDF online om naar JPG. Snel, gratis en privé.",
+ },
+ "pdf-to-png": {
+ name: "PDF naar PNG",
+ description: "Zet PDF online om naar PNG. Snel, gratis en privé.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF naar TIFF",
+ description: "Zet PDF online om naar TIFF. Snel, gratis en privé.",
+ },
+ "mov-to-mp4": {
+ name: "MOV naar MP4",
+ description: "Zet MOV online om naar MP4. Snel, gratis en privé.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM naar MP4",
+ description: "Zet WEBM online om naar MP4. Snel, gratis en privé.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV naar MP4",
+ description: "Zet MKV online om naar MP4. Snel, gratis en privé.",
+ },
+ "avi-to-mp4": {
+ name: "AVI naar MP4",
+ description: "Zet AVI online om naar MP4. Snel, gratis en privé.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 naar MOV",
+ description: "Zet MP4 online om naar MOV. Snel, gratis en privé.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 naar WEBM",
+ description: "Zet MP4 online om naar WEBM. Snel, gratis en privé.",
+ },
+ "webm-to-mov": {
+ name: "WEBM naar MOV",
+ description: "Zet WEBM online om naar MOV. Snel, gratis en privé.",
+ },
+ "mkv-to-mov": {
+ name: "MKV naar MOV",
+ description: "Zet MKV online om naar MOV. Snel, gratis en privé.",
+ },
+ "avi-to-mov": {
+ name: "AVI naar MOV",
+ description: "Zet AVI online om naar MOV. Snel, gratis en privé.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 naar AVI",
+ description: "Zet MP4 online om naar AVI. Snel, gratis en privé.",
+ },
+ "mov-to-avi": {
+ name: "MOV naar AVI",
+ description: "Zet MOV online om naar AVI. Snel, gratis en privé.",
+ },
+ "mkv-to-avi": {
+ name: "MKV naar AVI",
+ description: "Zet MKV online om naar AVI. Snel, gratis en privé.",
+ },
+ "avi-to-mkv": {
+ name: "AVI naar MKV",
+ description: "Zet AVI online om naar MKV. Snel, gratis en privé.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 naar GIF",
+ description: "Zet MP4 online om naar GIF. Snel, gratis en privé.",
+ },
+ "mov-to-gif": {
+ name: "MOV naar GIF",
+ description: "Zet MOV online om naar GIF. Snel, gratis en privé.",
+ },
+ "mkv-to-gif": {
+ name: "MKV naar GIF",
+ description: "Zet MKV online om naar GIF. Snel, gratis en privé.",
+ },
+ "avi-to-gif": {
+ name: "AVI naar GIF",
+ description: "Zet AVI online om naar GIF. Snel, gratis en privé.",
+ },
+ "gif-to-mp4": {
+ name: "GIF naar MP4",
+ description: "Zet GIF online om naar MP4. Snel, gratis en privé.",
+ },
+ "gif-to-webm": {
+ name: "GIF naar WEBM",
+ description: "Zet GIF online om naar WEBM. Snel, gratis en privé.",
+ },
+ "gif-to-mov": {
+ name: "GIF naar MOV",
+ description: "Zet GIF online om naar MOV. Snel, gratis en privé.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 naar MP3",
+ description: "Zet MP4 online om naar MP3. Snel, gratis en privé.",
+ },
+ "mov-to-mp3": {
+ name: "MOV naar MP3",
+ description: "Zet MOV online om naar MP3. Snel, gratis en privé.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV naar MP3",
+ description: "Zet MKV online om naar MP3. Snel, gratis en privé.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM naar MP3",
+ description: "Zet WEBM online om naar MP3. Snel, gratis en privé.",
+ },
+ "avi-to-mp3": {
+ name: "AVI naar MP3",
+ description: "Zet AVI online om naar MP3. Snel, gratis en privé.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 naar WAV",
+ description: "Zet MP4 online om naar WAV. Snel, gratis en privé.",
+ },
+ "mov-to-wav": {
+ name: "MOV naar WAV",
+ description: "Zet MOV online om naar WAV. Snel, gratis en privé.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 naar OGG",
+ description: "Zet MP4 online om naar OGG. Snel, gratis en privé.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A naar MP3",
+ description: "Zet M4A online om naar MP3. Snel, gratis en privé.",
+ },
+ "m4a-to-wav": {
+ name: "M4A naar WAV",
+ description: "Zet M4A online om naar WAV. Snel, gratis en privé.",
+ },
+ "aac-to-mp3": {
+ name: "AAC naar MP3",
+ description: "Zet AAC online om naar MP3. Snel, gratis en privé.",
+ },
+ "aac-to-wav": {
+ name: "AAC naar WAV",
+ description: "Zet AAC online om naar WAV. Snel, gratis en privé.",
+ },
+ "aac-to-flac": {
+ name: "AAC naar FLAC",
+ description: "Zet AAC online om naar FLAC. Snel, gratis en privé.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG naar MP3",
+ description: "Zet OGG online om naar MP3. Snel, gratis en privé.",
+ },
+ "ogg-to-wav": {
+ name: "OGG naar WAV",
+ description: "Zet OGG online om naar WAV. Snel, gratis en privé.",
+ },
+ "wav-to-mp3": {
+ name: "WAV naar MP3",
+ description: "Zet WAV online om naar MP3. Snel, gratis en privé.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 naar WAV",
+ description: "Zet MP3 online om naar WAV. Snel, gratis en privé.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC naar MP3",
+ description: "Zet FLAC online om naar MP3. Snel, gratis en privé.",
+ },
+ "excel-to-csv": {
+ name: "Excel naar CSV",
+ description: "Zet Excel online om naar CSV. Snel, gratis en privé.",
+ },
+ // END conversion-presets
resize: {
name: "Formaat wijzigen",
description: "Formaat wijzigen op pixels, percentage of social media-presets",
@@ -153,7 +487,7 @@ export const nl: TranslationKeys = {
description: "Ongewenste objecten verwijderen met AI",
},
ocr: {
- name: "OCR / Tekstherkenning",
+ name: "Tekst uit afbeelding halen (OCR)",
description: "Tekst uit afbeeldingen halen met AI-nauwkeurigheid",
},
"ocr-pdf": {
@@ -2757,6 +3091,14 @@ export const nl: TranslationKeys = {
"Download een diagnostisch zipbestand met afgeschermde configuratie, logs en taakgegevens voor probleemoplossing.",
supportBundleFailed: "Ondersteuningsbundel downloaden mislukt.",
},
+ privacy: {
+ title: "Privacy",
+ description:
+ "Anonieme productanalyse helpt SnapOtter te verbeteren. Deze staat standaard aan en wordt voor de hele instantie ingesteld door een beheerder.",
+ analyticsLabel: "Anonieme productanalyse",
+ analyticsDescription:
+ "Deel anonieme gebruiksgegevens (welke tools worden uitgevoerd, duur, foutcodes) en crashrapporten. Geen IP-adres, geen accountidentiteit. We verzamelen nooit uw bestandsnamen, bestandsinhoud, OCR-uitvoer, afbeeldingsmetadata of documenttekst. Schakel dit uit om alles te stoppen.",
+ },
security: {
heading: "Beveiliging",
description: "Wachtwoord- en authenticatie-instellingen.",
@@ -3051,7 +3393,7 @@ export const nl: TranslationKeys = {
heading: "Over",
appName: "SnapOtter",
appDescription:
- "Een zelf-gehoste, privacy-first bestandsverwerkingssuite met 157 tools. Converteren, comprimeren, bewerken, transcriberen, OCR en automatiseer je beeld-, video-, audio-, document- en dataworkflows zonder data naar de cloud te sturen.",
+ "Een zelf-gehoste, privacy-first bestandsverwerkingssuite met 240 tools. Converteren, comprimeren, bewerken, transcriberen, OCR en automatiseer je beeld-, video-, audio-, document- en dataworkflows zonder data naar de cloud te sturen.",
versionLabel: "Versie:",
linksHeading: "Links",
githubLink: "GitHub-repository",
@@ -3110,7 +3452,7 @@ export const nl: TranslationKeys = {
"Geen limieten. Geen verborgen plafonds.",
"Werkt volledig offline.",
"Onbeperkte batchverwerking.",
- "157 tools.",
+ "240 tools.",
"16 AI-modellen. Jouw hardware.",
"Razendsnel. Gebouwd op Sharp.",
"Geschikt voor air-gapped netwerken.",
@@ -3175,6 +3517,7 @@ export const nl: TranslationKeys = {
toolPalette: "Gereedschapspalet",
clickToAdd: "Klik om toe te voegen aan pipeline",
savedLabel: "Opgeslagen",
+ templatesLabel: "Sjablonen",
importButton: "Importeren",
noSavedPipelines: "Geen opgeslagen pipelines",
stepCount: "({count} stap)",
@@ -3461,4 +3804,45 @@ export const nl: TranslationKeys = {
navigationMenu: "Navigatie",
homeLink: "SnapOtter startpagina",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Optimaliseren voor web",
+ description:
+ "Verklein, converteer naar WebP en comprimeer een afbeelding voor snel laden op het web.",
+ },
+ "email-friendly": {
+ name: "E-mailvriendelijk",
+ description:
+ "Verklein een afbeelding zodat die klein genoeg is om aan een e-mail toe te voegen.",
+ },
+ "privacy-scrub": {
+ name: "Privacy opschonen",
+ description: "Verwijder EXIF, GPS en andere metadata en comprimeer daarna.",
+ },
+ "social-square": {
+ name: "Sociaal vierkant",
+ description:
+ "Bijsnijden tot een vierkant van 1:1 en comprimeren voor berichten op sociale media.",
+ },
+ "watermark-batch": {
+ name: "Watermerk in batch",
+ description: "Plaats een tekstwatermerk op afbeeldingen en comprimeer daarna.",
+ },
+ "shrink-pdf-email": {
+ name: "PDF verkleinen voor e-mail",
+ description: "Plat maken en een PDF stevig comprimeren zodat die binnen e-maillimieten past.",
+ },
+ "podcast-polish": {
+ name: "Podcast bijschaven",
+ description: "Verwijder stiltes, normaliseer het volume en voeg fades toe aan een opname.",
+ },
+ "cut-out-subject": {
+ name: "Onderwerp uitsnijden",
+ description: "Verwijder de achtergrond met AI en comprimeer de transparante uitsnede.",
+ },
+ "restore-old-photo": {
+ name: "Oude foto herstellen",
+ description: "Repareer, kleur in en vergroot een oude of beschadigde foto met AI.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/pl.ts b/packages/shared/src/i18n/pl.ts
index 4e7e4f64..a675be3c 100644
--- a/packages/shared/src/i18n/pl.ts
+++ b/packages/shared/src/i18n/pl.ts
@@ -73,6 +73,340 @@ export const pl: TranslationKeys = {
documentsAndFiles: "PDF i pliki",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG na PNG",
+ description: "Konwertuj JPG na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-jpg": {
+ name: "PNG na JPG",
+ description: "Konwertuj PNG na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-webp": {
+ name: "JPG na WebP",
+ description: "Konwertuj JPG na WebP online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-webp": {
+ name: "PNG na WebP",
+ description: "Konwertuj PNG na WebP online. Szybko, za darmo i prywatnie.",
+ },
+ "webp-to-jpg": {
+ name: "WebP na JPG",
+ description: "Konwertuj WebP na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "webp-to-png": {
+ name: "WebP na PNG",
+ description: "Konwertuj WebP na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-avif": {
+ name: "JPG na AVIF",
+ description: "Konwertuj JPG na AVIF online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-avif": {
+ name: "PNG na AVIF",
+ description: "Konwertuj PNG na AVIF online. Szybko, za darmo i prywatnie.",
+ },
+ "webp-to-avif": {
+ name: "WebP na AVIF",
+ description: "Konwertuj WebP na AVIF online. Szybko, za darmo i prywatnie.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC na JPG",
+ description: "Konwertuj HEIC na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "heic-to-png": {
+ name: "HEIC na PNG",
+ description: "Konwertuj HEIC na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "heic-to-avif": {
+ name: "HEIC na AVIF",
+ description: "Konwertuj HEIC na AVIF online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-gif": {
+ name: "JPG na GIF",
+ description: "Konwertuj JPG na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-gif": {
+ name: "PNG na GIF",
+ description: "Konwertuj PNG na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "gif-to-jpg": {
+ name: "GIF na JPG",
+ description: "Konwertuj GIF na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "gif-to-png": {
+ name: "GIF na PNG",
+ description: "Konwertuj GIF na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "webp-to-gif": {
+ name: "WebP na GIF",
+ description: "Konwertuj WebP na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG na TIFF",
+ description: "Konwertuj JPG na TIFF online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-tiff": {
+ name: "PNG na TIFF",
+ description: "Konwertuj PNG na TIFF online. Szybko, za darmo i prywatnie.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF na JPG",
+ description: "Konwertuj TIFF na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "tiff-to-png": {
+ name: "TIFF na PNG",
+ description: "Konwertuj TIFF na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "psd-to-jpg": {
+ name: "PSD na JPG",
+ description: "Konwertuj PSD na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "psd-to-png": {
+ name: "PSD na PNG",
+ description: "Konwertuj PSD na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-eps": {
+ name: "PNG na EPS",
+ description: "Konwertuj PNG na EPS online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-eps": {
+ name: "JPG na EPS",
+ description: "Konwertuj JPG na EPS online. Szybko, za darmo i prywatnie.",
+ },
+ "eps-to-png": {
+ name: "EPS na PNG",
+ description: "Konwertuj EPS na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "eps-to-jpg": {
+ name: "EPS na JPG",
+ description: "Konwertuj EPS na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-svg": {
+ name: "PNG na SVG",
+ description: "Konwertuj PNG na SVG online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-svg": {
+ name: "JPG na SVG",
+ description: "Konwertuj JPG na SVG online. Szybko, za darmo i prywatnie.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF na SVG",
+ description: "Konwertuj TIFF na SVG online. Szybko, za darmo i prywatnie.",
+ },
+ "psd-to-svg": {
+ name: "PSD na SVG",
+ description: "Konwertuj PSD na SVG online. Szybko, za darmo i prywatnie.",
+ },
+ "eps-to-svg": {
+ name: "EPS na SVG",
+ description: "Konwertuj EPS na SVG online. Szybko, za darmo i prywatnie.",
+ },
+ "svg-to-png": {
+ name: "SVG na PNG",
+ description: "Konwertuj SVG na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "svg-to-jpg": {
+ name: "SVG na JPG",
+ description: "Konwertuj SVG na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG na PDF",
+ description: "Konwertuj JPG na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "png-to-pdf": {
+ name: "PNG na PDF",
+ description: "Konwertuj PNG na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC na PDF",
+ description: "Konwertuj HEIC na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF na PDF",
+ description: "Konwertuj TIFF na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "webp-to-pdf": {
+ name: "WebP na PDF",
+ description: "Konwertuj WebP na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "gif-to-pdf": {
+ name: "GIF na PDF",
+ description: "Konwertuj GIF na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "eps-to-pdf": {
+ name: "EPS na PDF",
+ description: "Konwertuj EPS na PDF online. Szybko, za darmo i prywatnie.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF na JPG",
+ description: "Konwertuj PDF na JPG online. Szybko, za darmo i prywatnie.",
+ },
+ "pdf-to-png": {
+ name: "PDF na PNG",
+ description: "Konwertuj PDF na PNG online. Szybko, za darmo i prywatnie.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF na TIFF",
+ description: "Konwertuj PDF na TIFF online. Szybko, za darmo i prywatnie.",
+ },
+ "mov-to-mp4": {
+ name: "MOV na MP4",
+ description: "Konwertuj MOV na MP4 online. Szybko, za darmo i prywatnie.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM na MP4",
+ description: "Konwertuj WEBM na MP4 online. Szybko, za darmo i prywatnie.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV na MP4",
+ description: "Konwertuj MKV na MP4 online. Szybko, za darmo i prywatnie.",
+ },
+ "avi-to-mp4": {
+ name: "AVI na MP4",
+ description: "Konwertuj AVI na MP4 online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 na MOV",
+ description: "Konwertuj MP4 na MOV online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 na WEBM",
+ description: "Konwertuj MP4 na WEBM online. Szybko, za darmo i prywatnie.",
+ },
+ "webm-to-mov": {
+ name: "WEBM na MOV",
+ description: "Konwertuj WEBM na MOV online. Szybko, za darmo i prywatnie.",
+ },
+ "mkv-to-mov": {
+ name: "MKV na MOV",
+ description: "Konwertuj MKV na MOV online. Szybko, za darmo i prywatnie.",
+ },
+ "avi-to-mov": {
+ name: "AVI na MOV",
+ description: "Konwertuj AVI na MOV online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 na AVI",
+ description: "Konwertuj MP4 na AVI online. Szybko, za darmo i prywatnie.",
+ },
+ "mov-to-avi": {
+ name: "MOV na AVI",
+ description: "Konwertuj MOV na AVI online. Szybko, za darmo i prywatnie.",
+ },
+ "mkv-to-avi": {
+ name: "MKV na AVI",
+ description: "Konwertuj MKV na AVI online. Szybko, za darmo i prywatnie.",
+ },
+ "avi-to-mkv": {
+ name: "AVI na MKV",
+ description: "Konwertuj AVI na MKV online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 na GIF",
+ description: "Konwertuj MP4 na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "mov-to-gif": {
+ name: "MOV na GIF",
+ description: "Konwertuj MOV na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "mkv-to-gif": {
+ name: "MKV na GIF",
+ description: "Konwertuj MKV na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "avi-to-gif": {
+ name: "AVI na GIF",
+ description: "Konwertuj AVI na GIF online. Szybko, za darmo i prywatnie.",
+ },
+ "gif-to-mp4": {
+ name: "GIF na MP4",
+ description: "Konwertuj GIF na MP4 online. Szybko, za darmo i prywatnie.",
+ },
+ "gif-to-webm": {
+ name: "GIF na WEBM",
+ description: "Konwertuj GIF na WEBM online. Szybko, za darmo i prywatnie.",
+ },
+ "gif-to-mov": {
+ name: "GIF na MOV",
+ description: "Konwertuj GIF na MOV online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 na MP3",
+ description: "Konwertuj MP4 na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "mov-to-mp3": {
+ name: "MOV na MP3",
+ description: "Konwertuj MOV na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV na MP3",
+ description: "Konwertuj MKV na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM na MP3",
+ description: "Konwertuj WEBM na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "avi-to-mp3": {
+ name: "AVI na MP3",
+ description: "Konwertuj AVI na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 na WAV",
+ description: "Konwertuj MP4 na WAV online. Szybko, za darmo i prywatnie.",
+ },
+ "mov-to-wav": {
+ name: "MOV na WAV",
+ description: "Konwertuj MOV na WAV online. Szybko, za darmo i prywatnie.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 na OGG",
+ description: "Konwertuj MP4 na OGG online. Szybko, za darmo i prywatnie.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A na MP3",
+ description: "Konwertuj M4A na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "m4a-to-wav": {
+ name: "M4A na WAV",
+ description: "Konwertuj M4A na WAV online. Szybko, za darmo i prywatnie.",
+ },
+ "aac-to-mp3": {
+ name: "AAC na MP3",
+ description: "Konwertuj AAC na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "aac-to-wav": {
+ name: "AAC na WAV",
+ description: "Konwertuj AAC na WAV online. Szybko, za darmo i prywatnie.",
+ },
+ "aac-to-flac": {
+ name: "AAC na FLAC",
+ description: "Konwertuj AAC na FLAC online. Szybko, za darmo i prywatnie.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG na MP3",
+ description: "Konwertuj OGG na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "ogg-to-wav": {
+ name: "OGG na WAV",
+ description: "Konwertuj OGG na WAV online. Szybko, za darmo i prywatnie.",
+ },
+ "wav-to-mp3": {
+ name: "WAV na MP3",
+ description: "Konwertuj WAV na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 na WAV",
+ description: "Konwertuj MP3 na WAV online. Szybko, za darmo i prywatnie.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC na MP3",
+ description: "Konwertuj FLAC na MP3 online. Szybko, za darmo i prywatnie.",
+ },
+ "excel-to-csv": {
+ name: "Excel na CSV",
+ description: "Konwertuj Excel na CSV online. Szybko, za darmo i prywatnie.",
+ },
+ // END conversion-presets
resize: {
name: "Zmiana rozmiaru",
description:
@@ -149,7 +483,7 @@ export const pl: TranslationKeys = {
description: "Usuwanie niechcianych obiektów za pomocą AI",
},
ocr: {
- name: "OCR / Wyodrębnianie tekstu",
+ name: "Wyodrębnij tekst z obrazu (OCR)",
description: "Wyodrębnianie tekstu z obrazów z dokładnością AI",
},
"ocr-pdf": {
@@ -2757,6 +3091,14 @@ export const pl: TranslationKeys = {
"Pobierz archiwum diagnostyczne z zanonimizowaną konfiguracją, logami i danymi zadań do rozwiązywania problemów.",
supportBundleFailed: "Nie udało się pobrać pakietu diagnostycznego.",
},
+ privacy: {
+ title: "Prywatność",
+ description:
+ "Anonimowe analizy produktu pomagają ulepszać SnapOtter. Są domyślnie włączone i ustawiane dla całej instancji przez administratora.",
+ analyticsLabel: "Anonimowe analizy produktu",
+ analyticsDescription:
+ "Udostępniaj anonimowe dane o użyciu (które narzędzia są uruchamiane, czasy trwania, kody błędów) oraz raporty o awariach. Bez adresu IP, bez tożsamości konta. Nigdy nie zbieramy nazw plików, ich zawartości, wyników OCR, metadanych obrazów ani tekstu dokumentów. Wyłącz tę opcję, aby wszystko zatrzymać.",
+ },
security: {
heading: "Bezpieczeństwo",
description: "Ustawienia hasła i uwierzytelniania.",
@@ -3056,7 +3398,7 @@ export const pl: TranslationKeys = {
heading: "Informacje",
appName: "SnapOtter",
appDescription:
- "Samoobsługowy pakiet narzędzi do przetwarzania plików z priorytetem prywatności. 157 narzędzi. Konwersja, kompresja, edycja, transkrypcja, OCR i automatyzacja procesów obrazów, wideo, audio, dokumentów i danych bez wysyłania danych do chmury.",
+ "Samoobsługowy pakiet narzędzi do przetwarzania plików z priorytetem prywatności. 240 narzędzi. Konwersja, kompresja, edycja, transkrypcja, OCR i automatyzacja procesów obrazów, wideo, audio, dokumentów i danych bez wysyłania danych do chmury.",
versionLabel: "Wersja:",
linksHeading: "Odnośniki",
githubLink: "Repozytorium GitHub",
@@ -3117,7 +3459,7 @@ export const pl: TranslationKeys = {
"Bez ograniczeń. Bez ukrytych limitów.",
"Działa w pełni offline.",
"Przetwarzanie wsadowe bez ograniczeń.",
- "157 narzędzi.",
+ "240 narzędzi.",
"15 modeli AI. Na Twoim sprzęcie.",
"Błyskawiczna szybkość. Oparte na Sharp.",
"Gotowe do sieci izolowanych.",
@@ -3182,6 +3524,7 @@ export const pl: TranslationKeys = {
toolPalette: "Paleta narzędzi",
clickToAdd: "Kliknij, aby dodać do Pipeline",
savedLabel: "Zapisane",
+ templatesLabel: "Szablony",
importButton: "Importuj",
noSavedPipelines: "Brak zapisanych Pipeline",
stepCount: "({count} krok)",
@@ -3468,4 +3811,45 @@ export const pl: TranslationKeys = {
navigationMenu: "Nawigacja",
homeLink: "Strona główna SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Optymalizuj pod kątem sieci",
+ description:
+ "Zmień rozmiar, przekonwertuj na WebP i skompresuj obraz, aby szybko wczytywał się w sieci.",
+ },
+ "email-friendly": {
+ name: "Przyjazny dla e-maila",
+ description:
+ "Zmniejsz obraz tak, aby był wystarczająco mały do dołączenia do wiadomości e-mail.",
+ },
+ "privacy-scrub": {
+ name: "Czyszczenie prywatności",
+ description: "Usuń dane EXIF, GPS i inne metadane, a następnie skompresuj.",
+ },
+ "social-square": {
+ name: "Kwadrat społecznościowy",
+ description:
+ "Przytnij do kwadratu 1:1 i skompresuj na potrzeby wpisów w mediach społecznościowych.",
+ },
+ "watermark-batch": {
+ name: "Znak wodny wsadowo",
+ description: "Nanieś tekstowy znak wodny na obrazy, a następnie skompresuj.",
+ },
+ "shrink-pdf-email": {
+ name: "Zmniejsz PDF do e-maila",
+ description: "Spłaszcz i mocno skompresuj plik PDF, aby zmieścił się w limitach e-maila.",
+ },
+ "podcast-polish": {
+ name: "Dopracowanie podcastu",
+ description: "Usuń ciszę, znormalizuj głośność i dodaj przejścia do nagrania.",
+ },
+ "cut-out-subject": {
+ name: "Wytnij obiekt",
+ description: "Usuń tło za pomocą AI i skompresuj przezroczysty wycinek.",
+ },
+ "restore-old-photo": {
+ name: "Odnów stare zdjęcie",
+ description: "Napraw, pokoloruj i powiększ stare lub uszkodzone zdjęcie za pomocą AI.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/pt-BR.ts b/packages/shared/src/i18n/pt-BR.ts
index 76694f26..60fe5912 100644
--- a/packages/shared/src/i18n/pt-BR.ts
+++ b/packages/shared/src/i18n/pt-BR.ts
@@ -73,6 +73,340 @@ export const ptBR: TranslationKeys = {
documentsAndFiles: "PDF & Arquivos",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG para PNG",
+ description: "Converta JPG para PNG online. Rápido, grátis e privado.",
+ },
+ "png-to-jpg": {
+ name: "PNG para JPG",
+ description: "Converta PNG para JPG online. Rápido, grátis e privado.",
+ },
+ "jpg-to-webp": {
+ name: "JPG para WebP",
+ description: "Converta JPG para WebP online. Rápido, grátis e privado.",
+ },
+ "png-to-webp": {
+ name: "PNG para WebP",
+ description: "Converta PNG para WebP online. Rápido, grátis e privado.",
+ },
+ "webp-to-jpg": {
+ name: "WebP para JPG",
+ description: "Converta WebP para JPG online. Rápido, grátis e privado.",
+ },
+ "webp-to-png": {
+ name: "WebP para PNG",
+ description: "Converta WebP para PNG online. Rápido, grátis e privado.",
+ },
+ "jpg-to-avif": {
+ name: "JPG para AVIF",
+ description: "Converta JPG para AVIF online. Rápido, grátis e privado.",
+ },
+ "png-to-avif": {
+ name: "PNG para AVIF",
+ description: "Converta PNG para AVIF online. Rápido, grátis e privado.",
+ },
+ "webp-to-avif": {
+ name: "WebP para AVIF",
+ description: "Converta WebP para AVIF online. Rápido, grátis e privado.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC para JPG",
+ description: "Converta HEIC para JPG online. Rápido, grátis e privado.",
+ },
+ "heic-to-png": {
+ name: "HEIC para PNG",
+ description: "Converta HEIC para PNG online. Rápido, grátis e privado.",
+ },
+ "heic-to-avif": {
+ name: "HEIC para AVIF",
+ description: "Converta HEIC para AVIF online. Rápido, grátis e privado.",
+ },
+ "jpg-to-gif": {
+ name: "JPG para GIF",
+ description: "Converta JPG para GIF online. Rápido, grátis e privado.",
+ },
+ "png-to-gif": {
+ name: "PNG para GIF",
+ description: "Converta PNG para GIF online. Rápido, grátis e privado.",
+ },
+ "gif-to-jpg": {
+ name: "GIF para JPG",
+ description: "Converta GIF para JPG online. Rápido, grátis e privado.",
+ },
+ "gif-to-png": {
+ name: "GIF para PNG",
+ description: "Converta GIF para PNG online. Rápido, grátis e privado.",
+ },
+ "webp-to-gif": {
+ name: "WebP para GIF",
+ description: "Converta WebP para GIF online. Rápido, grátis e privado.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG para TIFF",
+ description: "Converta JPG para TIFF online. Rápido, grátis e privado.",
+ },
+ "png-to-tiff": {
+ name: "PNG para TIFF",
+ description: "Converta PNG para TIFF online. Rápido, grátis e privado.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF para JPG",
+ description: "Converta TIFF para JPG online. Rápido, grátis e privado.",
+ },
+ "tiff-to-png": {
+ name: "TIFF para PNG",
+ description: "Converta TIFF para PNG online. Rápido, grátis e privado.",
+ },
+ "psd-to-jpg": {
+ name: "PSD para JPG",
+ description: "Converta PSD para JPG online. Rápido, grátis e privado.",
+ },
+ "psd-to-png": {
+ name: "PSD para PNG",
+ description: "Converta PSD para PNG online. Rápido, grátis e privado.",
+ },
+ "png-to-eps": {
+ name: "PNG para EPS",
+ description: "Converta PNG para EPS online. Rápido, grátis e privado.",
+ },
+ "jpg-to-eps": {
+ name: "JPG para EPS",
+ description: "Converta JPG para EPS online. Rápido, grátis e privado.",
+ },
+ "eps-to-png": {
+ name: "EPS para PNG",
+ description: "Converta EPS para PNG online. Rápido, grátis e privado.",
+ },
+ "eps-to-jpg": {
+ name: "EPS para JPG",
+ description: "Converta EPS para JPG online. Rápido, grátis e privado.",
+ },
+ "png-to-svg": {
+ name: "PNG para SVG",
+ description: "Converta PNG para SVG online. Rápido, grátis e privado.",
+ },
+ "jpg-to-svg": {
+ name: "JPG para SVG",
+ description: "Converta JPG para SVG online. Rápido, grátis e privado.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF para SVG",
+ description: "Converta TIFF para SVG online. Rápido, grátis e privado.",
+ },
+ "psd-to-svg": {
+ name: "PSD para SVG",
+ description: "Converta PSD para SVG online. Rápido, grátis e privado.",
+ },
+ "eps-to-svg": {
+ name: "EPS para SVG",
+ description: "Converta EPS para SVG online. Rápido, grátis e privado.",
+ },
+ "svg-to-png": {
+ name: "SVG para PNG",
+ description: "Converta SVG para PNG online. Rápido, grátis e privado.",
+ },
+ "svg-to-jpg": {
+ name: "SVG para JPG",
+ description: "Converta SVG para JPG online. Rápido, grátis e privado.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG para PDF",
+ description: "Converta JPG para PDF online. Rápido, grátis e privado.",
+ },
+ "png-to-pdf": {
+ name: "PNG para PDF",
+ description: "Converta PNG para PDF online. Rápido, grátis e privado.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC para PDF",
+ description: "Converta HEIC para PDF online. Rápido, grátis e privado.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF para PDF",
+ description: "Converta TIFF para PDF online. Rápido, grátis e privado.",
+ },
+ "webp-to-pdf": {
+ name: "WebP para PDF",
+ description: "Converta WebP para PDF online. Rápido, grátis e privado.",
+ },
+ "gif-to-pdf": {
+ name: "GIF para PDF",
+ description: "Converta GIF para PDF online. Rápido, grátis e privado.",
+ },
+ "eps-to-pdf": {
+ name: "EPS para PDF",
+ description: "Converta EPS para PDF online. Rápido, grátis e privado.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF para JPG",
+ description: "Converta PDF para JPG online. Rápido, grátis e privado.",
+ },
+ "pdf-to-png": {
+ name: "PDF para PNG",
+ description: "Converta PDF para PNG online. Rápido, grátis e privado.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF para TIFF",
+ description: "Converta PDF para TIFF online. Rápido, grátis e privado.",
+ },
+ "mov-to-mp4": {
+ name: "MOV para MP4",
+ description: "Converta MOV para MP4 online. Rápido, grátis e privado.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM para MP4",
+ description: "Converta WEBM para MP4 online. Rápido, grátis e privado.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV para MP4",
+ description: "Converta MKV para MP4 online. Rápido, grátis e privado.",
+ },
+ "avi-to-mp4": {
+ name: "AVI para MP4",
+ description: "Converta AVI para MP4 online. Rápido, grátis e privado.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 para MOV",
+ description: "Converta MP4 para MOV online. Rápido, grátis e privado.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 para WEBM",
+ description: "Converta MP4 para WEBM online. Rápido, grátis e privado.",
+ },
+ "webm-to-mov": {
+ name: "WEBM para MOV",
+ description: "Converta WEBM para MOV online. Rápido, grátis e privado.",
+ },
+ "mkv-to-mov": {
+ name: "MKV para MOV",
+ description: "Converta MKV para MOV online. Rápido, grátis e privado.",
+ },
+ "avi-to-mov": {
+ name: "AVI para MOV",
+ description: "Converta AVI para MOV online. Rápido, grátis e privado.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 para AVI",
+ description: "Converta MP4 para AVI online. Rápido, grátis e privado.",
+ },
+ "mov-to-avi": {
+ name: "MOV para AVI",
+ description: "Converta MOV para AVI online. Rápido, grátis e privado.",
+ },
+ "mkv-to-avi": {
+ name: "MKV para AVI",
+ description: "Converta MKV para AVI online. Rápido, grátis e privado.",
+ },
+ "avi-to-mkv": {
+ name: "AVI para MKV",
+ description: "Converta AVI para MKV online. Rápido, grátis e privado.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 para GIF",
+ description: "Converta MP4 para GIF online. Rápido, grátis e privado.",
+ },
+ "mov-to-gif": {
+ name: "MOV para GIF",
+ description: "Converta MOV para GIF online. Rápido, grátis e privado.",
+ },
+ "mkv-to-gif": {
+ name: "MKV para GIF",
+ description: "Converta MKV para GIF online. Rápido, grátis e privado.",
+ },
+ "avi-to-gif": {
+ name: "AVI para GIF",
+ description: "Converta AVI para GIF online. Rápido, grátis e privado.",
+ },
+ "gif-to-mp4": {
+ name: "GIF para MP4",
+ description: "Converta GIF para MP4 online. Rápido, grátis e privado.",
+ },
+ "gif-to-webm": {
+ name: "GIF para WEBM",
+ description: "Converta GIF para WEBM online. Rápido, grátis e privado.",
+ },
+ "gif-to-mov": {
+ name: "GIF para MOV",
+ description: "Converta GIF para MOV online. Rápido, grátis e privado.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 para MP3",
+ description: "Converta MP4 para MP3 online. Rápido, grátis e privado.",
+ },
+ "mov-to-mp3": {
+ name: "MOV para MP3",
+ description: "Converta MOV para MP3 online. Rápido, grátis e privado.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV para MP3",
+ description: "Converta MKV para MP3 online. Rápido, grátis e privado.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM para MP3",
+ description: "Converta WEBM para MP3 online. Rápido, grátis e privado.",
+ },
+ "avi-to-mp3": {
+ name: "AVI para MP3",
+ description: "Converta AVI para MP3 online. Rápido, grátis e privado.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 para WAV",
+ description: "Converta MP4 para WAV online. Rápido, grátis e privado.",
+ },
+ "mov-to-wav": {
+ name: "MOV para WAV",
+ description: "Converta MOV para WAV online. Rápido, grátis e privado.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 para OGG",
+ description: "Converta MP4 para OGG online. Rápido, grátis e privado.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A para MP3",
+ description: "Converta M4A para MP3 online. Rápido, grátis e privado.",
+ },
+ "m4a-to-wav": {
+ name: "M4A para WAV",
+ description: "Converta M4A para WAV online. Rápido, grátis e privado.",
+ },
+ "aac-to-mp3": {
+ name: "AAC para MP3",
+ description: "Converta AAC para MP3 online. Rápido, grátis e privado.",
+ },
+ "aac-to-wav": {
+ name: "AAC para WAV",
+ description: "Converta AAC para WAV online. Rápido, grátis e privado.",
+ },
+ "aac-to-flac": {
+ name: "AAC para FLAC",
+ description: "Converta AAC para FLAC online. Rápido, grátis e privado.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG para MP3",
+ description: "Converta OGG para MP3 online. Rápido, grátis e privado.",
+ },
+ "ogg-to-wav": {
+ name: "OGG para WAV",
+ description: "Converta OGG para WAV online. Rápido, grátis e privado.",
+ },
+ "wav-to-mp3": {
+ name: "WAV para MP3",
+ description: "Converta WAV para MP3 online. Rápido, grátis e privado.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 para WAV",
+ description: "Converta MP3 para WAV online. Rápido, grátis e privado.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC para MP3",
+ description: "Converta FLAC para MP3 online. Rápido, grátis e privado.",
+ },
+ "excel-to-csv": {
+ name: "Excel para CSV",
+ description: "Converta Excel para CSV online. Rápido, grátis e privado.",
+ },
+ // END conversion-presets
resize: {
name: "Redimensionar",
description: "Redimensione por pixels, porcentagem ou presets de redes sociais",
@@ -149,7 +483,7 @@ export const ptBR: TranslationKeys = {
description: "Remova objetos indesejados com AI",
},
ocr: {
- name: "OCR / Extração de texto",
+ name: "Extrair texto de imagem (OCR)",
description: "Extraia texto de imagens com precisão alimentada por AI",
},
"ocr-pdf": {
@@ -2754,6 +3088,14 @@ export const ptBR: TranslationKeys = {
"Baixe um ZIP de diagnóstico com configurações ocultadas, logs e dados de tarefas para solução de problemas.",
supportBundleFailed: "Falha ao baixar o pacote de suporte.",
},
+ privacy: {
+ title: "Privacidade",
+ description:
+ "As análises de produto anônimas ajudam a melhorar o SnapOtter. Elas ficam ativadas por padrão e são configuradas para toda a instância por um administrador.",
+ analyticsLabel: "Análises de produto anônimas",
+ analyticsDescription:
+ "Compartilhe dados de uso anônimos (quais ferramentas são executadas, durações, códigos de erro) e relatórios de falha. Sem endereço IP, sem identidade de conta. Nunca coletamos os nomes dos seus arquivos, o conteúdo dos arquivos, a saída de OCR, os metadados de imagem ou o texto de documentos. Desative isso para interromper tudo.",
+ },
security: {
heading: "Segurança",
description: "Configurações de senha e autenticação.",
@@ -3049,7 +3391,7 @@ export const ptBR: TranslationKeys = {
heading: "Sobre",
appName: "SnapOtter",
appDescription:
- "Uma suite de processamento de arquivos auto-hospedada e focada em privacidade, com 157 ferramentas. Converta, comprima, edite, transcreva, OCR, e automatize fluxos de trabalho de imagem, vídeo, áudio, documentos e dados sem enviar dados para a nuvem.",
+ "Uma suite de processamento de arquivos auto-hospedada e focada em privacidade, com 240 ferramentas. Converta, comprima, edite, transcreva, OCR, e automatize fluxos de trabalho de imagem, vídeo, áudio, documentos e dados sem enviar dados para a nuvem.",
versionLabel: "Versão:",
linksHeading: "Links",
githubLink: "Repositório no GitHub",
@@ -3110,7 +3452,7 @@ export const ptBR: TranslationKeys = {
"Sem limites. Sem tetos ocultos.",
"Funciona totalmente offline.",
"Processamento em lote ilimitado.",
- "157 ferramentas.",
+ "240 ferramentas.",
"15 modelos AI. Seu hardware.",
"Ultra rápido. Construído sobre Sharp.",
"Pronto para redes isoladas.",
@@ -3174,6 +3516,7 @@ export const ptBR: TranslationKeys = {
toolPalette: "Paleta de ferramentas",
clickToAdd: "Clique para adicionar ao Pipeline",
savedLabel: "Salvo",
+ templatesLabel: "Modelos",
importButton: "Importar",
noSavedPipelines: "Nenhum Pipeline salvo",
stepCount: "({count} passo)",
@@ -3460,6 +3803,46 @@ export const ptBR: TranslationKeys = {
navigationMenu: "Navegação",
homeLink: "Início do SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Otimizar para a web",
+ description:
+ "Redimensione, converta para WebP e comprima uma imagem para carregamento rápido na web.",
+ },
+ "email-friendly": {
+ name: "Compatível com e-mail",
+ description: "Reduza uma imagem para que fique pequena o suficiente para anexar a um e-mail.",
+ },
+ "privacy-scrub": {
+ name: "Limpeza de privacidade",
+ description: "Remova EXIF, GPS e outros metadados e, em seguida, comprima.",
+ },
+ "social-square": {
+ name: "Quadrado para redes sociais",
+ description: "Recorte em um quadrado 1:1 e comprima para publicações nas redes sociais.",
+ },
+ "watermark-batch": {
+ name: "Marca-d'água em lote",
+ description: "Aplique uma marca-d'água de texto nas imagens e, em seguida, comprima.",
+ },
+ "shrink-pdf-email": {
+ name: "Reduzir PDF para e-mail",
+ description:
+ "Achate e comprima um PDF de forma agressiva para respeitar os limites de e-mail.",
+ },
+ "podcast-polish": {
+ name: "Acabamento de podcast",
+ description: "Remova os silêncios, normalize o volume e adicione fades a uma gravação.",
+ },
+ "cut-out-subject": {
+ name: "Recortar o objeto",
+ description: "Remova o fundo com IA e comprima o recorte transparente.",
+ },
+ "restore-old-photo": {
+ name: "Restaurar foto antiga",
+ description: "Repare, colorize e amplie uma foto antiga ou danificada com IA.",
+ },
+ },
} as const;
export default ptBR;
diff --git a/packages/shared/src/i18n/ru.ts b/packages/shared/src/i18n/ru.ts
index 0d85e476..bfa8ecec 100644
--- a/packages/shared/src/i18n/ru.ts
+++ b/packages/shared/src/i18n/ru.ts
@@ -73,6 +73,340 @@ export const ru: TranslationKeys = {
documentsAndFiles: "PDF и файлы",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG в PNG",
+ description: "Конвертируйте JPG в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-jpg": {
+ name: "PNG в JPG",
+ description: "Конвертируйте PNG в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-webp": {
+ name: "JPG в WebP",
+ description: "Конвертируйте JPG в WebP онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-webp": {
+ name: "PNG в WebP",
+ description: "Конвертируйте PNG в WebP онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webp-to-jpg": {
+ name: "WebP в JPG",
+ description: "Конвертируйте WebP в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webp-to-png": {
+ name: "WebP в PNG",
+ description: "Конвертируйте WebP в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-avif": {
+ name: "JPG в AVIF",
+ description: "Конвертируйте JPG в AVIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-avif": {
+ name: "PNG в AVIF",
+ description: "Конвертируйте PNG в AVIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webp-to-avif": {
+ name: "WebP в AVIF",
+ description: "Конвертируйте WebP в AVIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC в JPG",
+ description: "Конвертируйте HEIC в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "heic-to-png": {
+ name: "HEIC в PNG",
+ description: "Конвертируйте HEIC в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "heic-to-avif": {
+ name: "HEIC в AVIF",
+ description: "Конвертируйте HEIC в AVIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-gif": {
+ name: "JPG в GIF",
+ description: "Конвертируйте JPG в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-gif": {
+ name: "PNG в GIF",
+ description: "Конвертируйте PNG в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "gif-to-jpg": {
+ name: "GIF в JPG",
+ description: "Конвертируйте GIF в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "gif-to-png": {
+ name: "GIF в PNG",
+ description: "Конвертируйте GIF в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webp-to-gif": {
+ name: "WebP в GIF",
+ description: "Конвертируйте WebP в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG в TIFF",
+ description: "Конвертируйте JPG в TIFF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-tiff": {
+ name: "PNG в TIFF",
+ description: "Конвертируйте PNG в TIFF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF в JPG",
+ description: "Конвертируйте TIFF в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "tiff-to-png": {
+ name: "TIFF в PNG",
+ description: "Конвертируйте TIFF в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "psd-to-jpg": {
+ name: "PSD в JPG",
+ description: "Конвертируйте PSD в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "psd-to-png": {
+ name: "PSD в PNG",
+ description: "Конвертируйте PSD в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-eps": {
+ name: "PNG в EPS",
+ description: "Конвертируйте PNG в EPS онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-eps": {
+ name: "JPG в EPS",
+ description: "Конвертируйте JPG в EPS онлайн. Быстро, бесплатно и приватно.",
+ },
+ "eps-to-png": {
+ name: "EPS в PNG",
+ description: "Конвертируйте EPS в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "eps-to-jpg": {
+ name: "EPS в JPG",
+ description: "Конвертируйте EPS в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-svg": {
+ name: "PNG в SVG",
+ description: "Конвертируйте PNG в SVG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-svg": {
+ name: "JPG в SVG",
+ description: "Конвертируйте JPG в SVG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF в SVG",
+ description: "Конвертируйте TIFF в SVG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "psd-to-svg": {
+ name: "PSD в SVG",
+ description: "Конвертируйте PSD в SVG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "eps-to-svg": {
+ name: "EPS в SVG",
+ description: "Конвертируйте EPS в SVG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "svg-to-png": {
+ name: "SVG в PNG",
+ description: "Конвертируйте SVG в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "svg-to-jpg": {
+ name: "SVG в JPG",
+ description: "Конвертируйте SVG в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG в PDF",
+ description: "Конвертируйте JPG в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "png-to-pdf": {
+ name: "PNG в PDF",
+ description: "Конвертируйте PNG в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC в PDF",
+ description: "Конвертируйте HEIC в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF в PDF",
+ description: "Конвертируйте TIFF в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webp-to-pdf": {
+ name: "WebP в PDF",
+ description: "Конвертируйте WebP в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "gif-to-pdf": {
+ name: "GIF в PDF",
+ description: "Конвертируйте GIF в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "eps-to-pdf": {
+ name: "EPS в PDF",
+ description: "Конвертируйте EPS в PDF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF в JPG",
+ description: "Конвертируйте PDF в JPG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "pdf-to-png": {
+ name: "PDF в PNG",
+ description: "Конвертируйте PDF в PNG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF в TIFF",
+ description: "Конвертируйте PDF в TIFF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mov-to-mp4": {
+ name: "MOV в MP4",
+ description: "Конвертируйте MOV в MP4 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM в MP4",
+ description: "Конвертируйте WEBM в MP4 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV в MP4",
+ description: "Конвертируйте MKV в MP4 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "avi-to-mp4": {
+ name: "AVI в MP4",
+ description: "Конвертируйте AVI в MP4 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 в MOV",
+ description: "Конвертируйте MP4 в MOV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 в WEBM",
+ description: "Конвертируйте MP4 в WEBM онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webm-to-mov": {
+ name: "WEBM в MOV",
+ description: "Конвертируйте WEBM в MOV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mkv-to-mov": {
+ name: "MKV в MOV",
+ description: "Конвертируйте MKV в MOV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "avi-to-mov": {
+ name: "AVI в MOV",
+ description: "Конвертируйте AVI в MOV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 в AVI",
+ description: "Конвертируйте MP4 в AVI онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mov-to-avi": {
+ name: "MOV в AVI",
+ description: "Конвертируйте MOV в AVI онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mkv-to-avi": {
+ name: "MKV в AVI",
+ description: "Конвертируйте MKV в AVI онлайн. Быстро, бесплатно и приватно.",
+ },
+ "avi-to-mkv": {
+ name: "AVI в MKV",
+ description: "Конвертируйте AVI в MKV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 в GIF",
+ description: "Конвертируйте MP4 в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mov-to-gif": {
+ name: "MOV в GIF",
+ description: "Конвертируйте MOV в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mkv-to-gif": {
+ name: "MKV в GIF",
+ description: "Конвертируйте MKV в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "avi-to-gif": {
+ name: "AVI в GIF",
+ description: "Конвертируйте AVI в GIF онлайн. Быстро, бесплатно и приватно.",
+ },
+ "gif-to-mp4": {
+ name: "GIF в MP4",
+ description: "Конвертируйте GIF в MP4 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "gif-to-webm": {
+ name: "GIF в WEBM",
+ description: "Конвертируйте GIF в WEBM онлайн. Быстро, бесплатно и приватно.",
+ },
+ "gif-to-mov": {
+ name: "GIF в MOV",
+ description: "Конвертируйте GIF в MOV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 в MP3",
+ description: "Конвертируйте MP4 в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mov-to-mp3": {
+ name: "MOV в MP3",
+ description: "Конвертируйте MOV в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV в MP3",
+ description: "Конвертируйте MKV в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM в MP3",
+ description: "Конвертируйте WEBM в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "avi-to-mp3": {
+ name: "AVI в MP3",
+ description: "Конвертируйте AVI в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 в WAV",
+ description: "Конвертируйте MP4 в WAV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mov-to-wav": {
+ name: "MOV в WAV",
+ description: "Конвертируйте MOV в WAV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 в OGG",
+ description: "Конвертируйте MP4 в OGG онлайн. Быстро, бесплатно и приватно.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A в MP3",
+ description: "Конвертируйте M4A в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "m4a-to-wav": {
+ name: "M4A в WAV",
+ description: "Конвертируйте M4A в WAV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "aac-to-mp3": {
+ name: "AAC в MP3",
+ description: "Конвертируйте AAC в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "aac-to-wav": {
+ name: "AAC в WAV",
+ description: "Конвертируйте AAC в WAV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "aac-to-flac": {
+ name: "AAC в FLAC",
+ description: "Конвертируйте AAC в FLAC онлайн. Быстро, бесплатно и приватно.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG в MP3",
+ description: "Конвертируйте OGG в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "ogg-to-wav": {
+ name: "OGG в WAV",
+ description: "Конвертируйте OGG в WAV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "wav-to-mp3": {
+ name: "WAV в MP3",
+ description: "Конвертируйте WAV в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 в WAV",
+ description: "Конвертируйте MP3 в WAV онлайн. Быстро, бесплатно и приватно.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC в MP3",
+ description: "Конвертируйте FLAC в MP3 онлайн. Быстро, бесплатно и приватно.",
+ },
+ "excel-to-csv": {
+ name: "Excel в CSV",
+ description: "Конвертируйте Excel в CSV онлайн. Быстро, бесплатно и приватно.",
+ },
+ // END conversion-presets
resize: {
name: "Изменение размера",
description: "Изменение размера в пикселях, процентах или по шаблонам соцсетей",
@@ -150,7 +484,7 @@ export const ru: TranslationKeys = {
description: "Удаление нежелательных объектов с помощью AI",
},
ocr: {
- name: "OCR / Извлечение текста",
+ name: "Извлечь текст из изображения (OCR)",
description: "Извлечение текста из изображений с точностью AI",
},
"ocr-pdf": {
@@ -2751,6 +3085,14 @@ export const ru: TranslationKeys = {
"Скачать архив с обезличенной конфигурацией, логами и данными задач для диагностики.",
supportBundleFailed: "Не удалось скачать диагностический архив.",
},
+ privacy: {
+ title: "Конфиденциальность",
+ description:
+ "Анонимная продуктовая аналитика помогает улучшать SnapOtter. Она включена по умолчанию и настраивается для всего экземпляра администратором.",
+ analyticsLabel: "Анонимная продуктовая аналитика",
+ analyticsDescription:
+ "Делитесь анонимными данными об использовании (какие инструменты запускаются, длительность, коды ошибок) и отчётами о сбоях. Без IP-адреса и без идентификации аккаунта. Мы никогда не собираем имена ваших файлов, их содержимое, результаты OCR, метаданные изображений или текст документов. Отключите это, чтобы остановить всё.",
+ },
security: {
heading: "Безопасность",
description: "Настройки пароля и аутентификации.",
@@ -3046,7 +3388,7 @@ export const ru: TranslationKeys = {
heading: "О программе",
appName: "SnapOtter",
appDescription:
- "Самостоятельно размещаемый набор инструментов для обработки файлов с приоритетом конфиденциальности. 157 инструментов. Конвертация, сжатие, редактирование, транскрипция, OCR и автоматизация рабочих процессов с изображениями, видео, аудио, документами и данными без отправки данных в облако.",
+ "Самостоятельно размещаемый набор инструментов для обработки файлов с приоритетом конфиденциальности. 240 инструментов. Конвертация, сжатие, редактирование, транскрипция, OCR и автоматизация рабочих процессов с изображениями, видео, аудио, документами и данными без отправки данных в облако.",
versionLabel: "Версия:",
linksHeading: "Ссылки",
githubLink: "Репозиторий GitHub",
@@ -3105,7 +3447,7 @@ export const ru: TranslationKeys = {
"Без ограничений. Без скрытых лимитов.",
"Работает полностью офлайн.",
"Пакетная обработка без ограничений.",
- "157 инструментов.",
+ "240 инструментов.",
"16 AI-моделей. На Вашем оборудовании.",
"Молниеносная скорость. На базе Sharp.",
"Готов к изолированным сетям.",
@@ -3170,6 +3512,7 @@ export const ru: TranslationKeys = {
toolPalette: "Палитра инструментов",
clickToAdd: "Нажмите для добавления в Pipeline",
savedLabel: "Сохранённые",
+ templatesLabel: "Шаблоны",
importButton: "Импорт",
noSavedPipelines: "Нет сохранённых Pipeline",
stepCount: "({count} шаг)",
@@ -3456,4 +3799,44 @@ export const ru: TranslationKeys = {
navigationMenu: "Навигация",
homeLink: "Главная SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Оптимизация для веба",
+ description:
+ "Измените размер, преобразуйте в WebP и сожмите изображение для быстрой загрузки в вебе.",
+ },
+ "email-friendly": {
+ name: "Для электронной почты",
+ description: "Уменьшите изображение, чтобы его можно было прикрепить к электронному письму.",
+ },
+ "privacy-scrub": {
+ name: "Очистка конфиденциальности",
+ description: "Удалите EXIF, GPS и другие метаданные, затем сожмите.",
+ },
+ "social-square": {
+ name: "Квадрат для соцсетей",
+ description: "Обрежьте до квадрата 1:1 и сожмите для публикаций в соцсетях.",
+ },
+ "watermark-batch": {
+ name: "Водяной знак пакетно",
+ description: "Нанесите текстовый водяной знак на изображения, затем сожмите.",
+ },
+ "shrink-pdf-email": {
+ name: "Уменьшить PDF для почты",
+ description: "Сведите и сильно сожмите PDF, чтобы он уложился в лимиты электронной почты.",
+ },
+ "podcast-polish": {
+ name: "Шлифовка подкаста",
+ description: "Удалите тишину, нормализуйте громкость и добавьте плавные переходы к записи.",
+ },
+ "cut-out-subject": {
+ name: "Вырезать объект",
+ description: "Удалите фон с помощью ИИ и сожмите прозрачную вырезку.",
+ },
+ "restore-old-photo": {
+ name: "Восстановить старое фото",
+ description:
+ "Восстановите, раскрасьте и увеличьте старое или повреждённое фото с помощью ИИ.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/sv.ts b/packages/shared/src/i18n/sv.ts
index 5cc871ae..ae432e48 100644
--- a/packages/shared/src/i18n/sv.ts
+++ b/packages/shared/src/i18n/sv.ts
@@ -73,6 +73,340 @@ export const sv: TranslationKeys = {
documentsAndFiles: "PDF & Filer",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG till PNG",
+ description: "Konvertera JPG till PNG online. Snabbt, gratis och privat.",
+ },
+ "png-to-jpg": {
+ name: "PNG till JPG",
+ description: "Konvertera PNG till JPG online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-webp": {
+ name: "JPG till WebP",
+ description: "Konvertera JPG till WebP online. Snabbt, gratis och privat.",
+ },
+ "png-to-webp": {
+ name: "PNG till WebP",
+ description: "Konvertera PNG till WebP online. Snabbt, gratis och privat.",
+ },
+ "webp-to-jpg": {
+ name: "WebP till JPG",
+ description: "Konvertera WebP till JPG online. Snabbt, gratis och privat.",
+ },
+ "webp-to-png": {
+ name: "WebP till PNG",
+ description: "Konvertera WebP till PNG online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-avif": {
+ name: "JPG till AVIF",
+ description: "Konvertera JPG till AVIF online. Snabbt, gratis och privat.",
+ },
+ "png-to-avif": {
+ name: "PNG till AVIF",
+ description: "Konvertera PNG till AVIF online. Snabbt, gratis och privat.",
+ },
+ "webp-to-avif": {
+ name: "WebP till AVIF",
+ description: "Konvertera WebP till AVIF online. Snabbt, gratis och privat.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC till JPG",
+ description: "Konvertera HEIC till JPG online. Snabbt, gratis och privat.",
+ },
+ "heic-to-png": {
+ name: "HEIC till PNG",
+ description: "Konvertera HEIC till PNG online. Snabbt, gratis och privat.",
+ },
+ "heic-to-avif": {
+ name: "HEIC till AVIF",
+ description: "Konvertera HEIC till AVIF online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-gif": {
+ name: "JPG till GIF",
+ description: "Konvertera JPG till GIF online. Snabbt, gratis och privat.",
+ },
+ "png-to-gif": {
+ name: "PNG till GIF",
+ description: "Konvertera PNG till GIF online. Snabbt, gratis och privat.",
+ },
+ "gif-to-jpg": {
+ name: "GIF till JPG",
+ description: "Konvertera GIF till JPG online. Snabbt, gratis och privat.",
+ },
+ "gif-to-png": {
+ name: "GIF till PNG",
+ description: "Konvertera GIF till PNG online. Snabbt, gratis och privat.",
+ },
+ "webp-to-gif": {
+ name: "WebP till GIF",
+ description: "Konvertera WebP till GIF online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG till TIFF",
+ description: "Konvertera JPG till TIFF online. Snabbt, gratis och privat.",
+ },
+ "png-to-tiff": {
+ name: "PNG till TIFF",
+ description: "Konvertera PNG till TIFF online. Snabbt, gratis och privat.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF till JPG",
+ description: "Konvertera TIFF till JPG online. Snabbt, gratis och privat.",
+ },
+ "tiff-to-png": {
+ name: "TIFF till PNG",
+ description: "Konvertera TIFF till PNG online. Snabbt, gratis och privat.",
+ },
+ "psd-to-jpg": {
+ name: "PSD till JPG",
+ description: "Konvertera PSD till JPG online. Snabbt, gratis och privat.",
+ },
+ "psd-to-png": {
+ name: "PSD till PNG",
+ description: "Konvertera PSD till PNG online. Snabbt, gratis och privat.",
+ },
+ "png-to-eps": {
+ name: "PNG till EPS",
+ description: "Konvertera PNG till EPS online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-eps": {
+ name: "JPG till EPS",
+ description: "Konvertera JPG till EPS online. Snabbt, gratis och privat.",
+ },
+ "eps-to-png": {
+ name: "EPS till PNG",
+ description: "Konvertera EPS till PNG online. Snabbt, gratis och privat.",
+ },
+ "eps-to-jpg": {
+ name: "EPS till JPG",
+ description: "Konvertera EPS till JPG online. Snabbt, gratis och privat.",
+ },
+ "png-to-svg": {
+ name: "PNG till SVG",
+ description: "Konvertera PNG till SVG online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-svg": {
+ name: "JPG till SVG",
+ description: "Konvertera JPG till SVG online. Snabbt, gratis och privat.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF till SVG",
+ description: "Konvertera TIFF till SVG online. Snabbt, gratis och privat.",
+ },
+ "psd-to-svg": {
+ name: "PSD till SVG",
+ description: "Konvertera PSD till SVG online. Snabbt, gratis och privat.",
+ },
+ "eps-to-svg": {
+ name: "EPS till SVG",
+ description: "Konvertera EPS till SVG online. Snabbt, gratis och privat.",
+ },
+ "svg-to-png": {
+ name: "SVG till PNG",
+ description: "Konvertera SVG till PNG online. Snabbt, gratis och privat.",
+ },
+ "svg-to-jpg": {
+ name: "SVG till JPG",
+ description: "Konvertera SVG till JPG online. Snabbt, gratis och privat.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG till PDF",
+ description: "Konvertera JPG till PDF online. Snabbt, gratis och privat.",
+ },
+ "png-to-pdf": {
+ name: "PNG till PDF",
+ description: "Konvertera PNG till PDF online. Snabbt, gratis och privat.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC till PDF",
+ description: "Konvertera HEIC till PDF online. Snabbt, gratis och privat.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF till PDF",
+ description: "Konvertera TIFF till PDF online. Snabbt, gratis och privat.",
+ },
+ "webp-to-pdf": {
+ name: "WebP till PDF",
+ description: "Konvertera WebP till PDF online. Snabbt, gratis och privat.",
+ },
+ "gif-to-pdf": {
+ name: "GIF till PDF",
+ description: "Konvertera GIF till PDF online. Snabbt, gratis och privat.",
+ },
+ "eps-to-pdf": {
+ name: "EPS till PDF",
+ description: "Konvertera EPS till PDF online. Snabbt, gratis och privat.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF till JPG",
+ description: "Konvertera PDF till JPG online. Snabbt, gratis och privat.",
+ },
+ "pdf-to-png": {
+ name: "PDF till PNG",
+ description: "Konvertera PDF till PNG online. Snabbt, gratis och privat.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF till TIFF",
+ description: "Konvertera PDF till TIFF online. Snabbt, gratis och privat.",
+ },
+ "mov-to-mp4": {
+ name: "MOV till MP4",
+ description: "Konvertera MOV till MP4 online. Snabbt, gratis och privat.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM till MP4",
+ description: "Konvertera WEBM till MP4 online. Snabbt, gratis och privat.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV till MP4",
+ description: "Konvertera MKV till MP4 online. Snabbt, gratis och privat.",
+ },
+ "avi-to-mp4": {
+ name: "AVI till MP4",
+ description: "Konvertera AVI till MP4 online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 till MOV",
+ description: "Konvertera MP4 till MOV online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 till WEBM",
+ description: "Konvertera MP4 till WEBM online. Snabbt, gratis och privat.",
+ },
+ "webm-to-mov": {
+ name: "WEBM till MOV",
+ description: "Konvertera WEBM till MOV online. Snabbt, gratis och privat.",
+ },
+ "mkv-to-mov": {
+ name: "MKV till MOV",
+ description: "Konvertera MKV till MOV online. Snabbt, gratis och privat.",
+ },
+ "avi-to-mov": {
+ name: "AVI till MOV",
+ description: "Konvertera AVI till MOV online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 till AVI",
+ description: "Konvertera MP4 till AVI online. Snabbt, gratis och privat.",
+ },
+ "mov-to-avi": {
+ name: "MOV till AVI",
+ description: "Konvertera MOV till AVI online. Snabbt, gratis och privat.",
+ },
+ "mkv-to-avi": {
+ name: "MKV till AVI",
+ description: "Konvertera MKV till AVI online. Snabbt, gratis och privat.",
+ },
+ "avi-to-mkv": {
+ name: "AVI till MKV",
+ description: "Konvertera AVI till MKV online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 till GIF",
+ description: "Konvertera MP4 till GIF online. Snabbt, gratis och privat.",
+ },
+ "mov-to-gif": {
+ name: "MOV till GIF",
+ description: "Konvertera MOV till GIF online. Snabbt, gratis och privat.",
+ },
+ "mkv-to-gif": {
+ name: "MKV till GIF",
+ description: "Konvertera MKV till GIF online. Snabbt, gratis och privat.",
+ },
+ "avi-to-gif": {
+ name: "AVI till GIF",
+ description: "Konvertera AVI till GIF online. Snabbt, gratis och privat.",
+ },
+ "gif-to-mp4": {
+ name: "GIF till MP4",
+ description: "Konvertera GIF till MP4 online. Snabbt, gratis och privat.",
+ },
+ "gif-to-webm": {
+ name: "GIF till WEBM",
+ description: "Konvertera GIF till WEBM online. Snabbt, gratis och privat.",
+ },
+ "gif-to-mov": {
+ name: "GIF till MOV",
+ description: "Konvertera GIF till MOV online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 till MP3",
+ description: "Konvertera MP4 till MP3 online. Snabbt, gratis och privat.",
+ },
+ "mov-to-mp3": {
+ name: "MOV till MP3",
+ description: "Konvertera MOV till MP3 online. Snabbt, gratis och privat.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV till MP3",
+ description: "Konvertera MKV till MP3 online. Snabbt, gratis och privat.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM till MP3",
+ description: "Konvertera WEBM till MP3 online. Snabbt, gratis och privat.",
+ },
+ "avi-to-mp3": {
+ name: "AVI till MP3",
+ description: "Konvertera AVI till MP3 online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 till WAV",
+ description: "Konvertera MP4 till WAV online. Snabbt, gratis och privat.",
+ },
+ "mov-to-wav": {
+ name: "MOV till WAV",
+ description: "Konvertera MOV till WAV online. Snabbt, gratis och privat.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 till OGG",
+ description: "Konvertera MP4 till OGG online. Snabbt, gratis och privat.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A till MP3",
+ description: "Konvertera M4A till MP3 online. Snabbt, gratis och privat.",
+ },
+ "m4a-to-wav": {
+ name: "M4A till WAV",
+ description: "Konvertera M4A till WAV online. Snabbt, gratis och privat.",
+ },
+ "aac-to-mp3": {
+ name: "AAC till MP3",
+ description: "Konvertera AAC till MP3 online. Snabbt, gratis och privat.",
+ },
+ "aac-to-wav": {
+ name: "AAC till WAV",
+ description: "Konvertera AAC till WAV online. Snabbt, gratis och privat.",
+ },
+ "aac-to-flac": {
+ name: "AAC till FLAC",
+ description: "Konvertera AAC till FLAC online. Snabbt, gratis och privat.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG till MP3",
+ description: "Konvertera OGG till MP3 online. Snabbt, gratis och privat.",
+ },
+ "ogg-to-wav": {
+ name: "OGG till WAV",
+ description: "Konvertera OGG till WAV online. Snabbt, gratis och privat.",
+ },
+ "wav-to-mp3": {
+ name: "WAV till MP3",
+ description: "Konvertera WAV till MP3 online. Snabbt, gratis och privat.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 till WAV",
+ description: "Konvertera MP3 till WAV online. Snabbt, gratis och privat.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC till MP3",
+ description: "Konvertera FLAC till MP3 online. Snabbt, gratis och privat.",
+ },
+ "excel-to-csv": {
+ name: "Excel till CSV",
+ description: "Konvertera Excel till CSV online. Snabbt, gratis och privat.",
+ },
+ // END conversion-presets
resize: {
name: "Ändra storlek",
description: "Ändra storlek efter pixlar, procent eller sociala medier-mallar",
@@ -151,7 +485,7 @@ export const sv: TranslationKeys = {
description: "Ta bort oönskade objekt med AI",
},
ocr: {
- name: "OCR / Textextraktion",
+ name: "Extrahera text från bild (OCR)",
description: "Extrahera text från bilder med AI-precision",
},
"ocr-pdf": {
@@ -2748,6 +3082,14 @@ export const sv: TranslationKeys = {
"Ladda ner en diagnostisk ZIP med maskerad konfiguration, loggar och jobbdata för felsökning.",
supportBundleFailed: "Kunde inte ladda ner supportpaket.",
},
+ privacy: {
+ title: "Integritet",
+ description:
+ "Anonym produktanalys hjälper till att förbättra SnapOtter. Den är på som standard och ställs in för hela instansen av en administratör.",
+ analyticsLabel: "Anonym produktanalys",
+ analyticsDescription:
+ "Dela anonyma användningsdata (vilka verktyg som körs, tidsåtgång, felkoder) och kraschrapporter. Ingen IP-adress, ingen kontoidentitet. Vi samlar aldrig in dina filnamn, filinnehåll, OCR-utdata, bildmetadata eller dokumenttext. Stäng av det här för att stoppa allt.",
+ },
security: {
heading: "Säkerhet",
description: "Lösenords- och autentiseringsinställningar.",
@@ -3040,7 +3382,7 @@ export const sv: TranslationKeys = {
heading: "Om",
appName: "SnapOtter",
appDescription:
- "En självhostad, integritetsfokuserad filbehandlingssvit med 157 verktyg. Konvertera, komprimera, redigera, transkribera, OCR, och automatisera bild-, video-, ljud-, dokument- och dataarbetsflöden utan att skicka data till molnet.",
+ "En självhostad, integritetsfokuserad filbehandlingssvit med 240 verktyg. Konvertera, komprimera, redigera, transkribera, OCR, och automatisera bild-, video-, ljud-, dokument- och dataarbetsflöden utan att skicka data till molnet.",
versionLabel: "Version:",
linksHeading: "Länkar",
githubLink: "GitHub-arkiv",
@@ -3099,7 +3441,7 @@ export const sv: TranslationKeys = {
"Inga gränser. Inga dolda tak.",
"Fungerar helt offline.",
"Obegränsad batchbearbetning.",
- "157 verktyg.",
+ "240 verktyg.",
"16 AI-modeller. Din hårdvara.",
"Blixtsnabb. Byggd på Sharp.",
"Fungerar i slutna nätverk.",
@@ -3163,6 +3505,7 @@ export const sv: TranslationKeys = {
toolPalette: "Verktygspalett",
clickToAdd: "Klicka för att lägga till i pipeline",
savedLabel: "Sparad",
+ templatesLabel: "Mallar",
importButton: "Importera",
noSavedPipelines: "Inga sparade pipelines",
stepCount: "({count} steg)",
@@ -3448,4 +3791,44 @@ export const sv: TranslationKeys = {
navigationMenu: "Navigering",
homeLink: "SnapOtter hem",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Webboptimera",
+ description:
+ "Ändra storlek, konvertera till WebP och komprimera en bild för snabb webbinläsning.",
+ },
+ "email-friendly": {
+ name: "E-postvänlig",
+ description:
+ "Krymp en bild så att den blir tillräckligt liten för att bifoga i ett e-postmeddelande.",
+ },
+ "privacy-scrub": {
+ name: "Integritetsrensning",
+ description: "Ta bort EXIF, GPS och andra metadata, och komprimera sedan.",
+ },
+ "social-square": {
+ name: "Social kvadrat",
+ description: "Beskär till en kvadrat på 1:1 och komprimera för inlägg på sociala medier.",
+ },
+ "watermark-batch": {
+ name: "Vattenstämpel i grupp",
+ description: "Stämpla en textvattenstämpel på bilder och komprimera sedan.",
+ },
+ "shrink-pdf-email": {
+ name: "Krymp PDF för e-post",
+ description: "Platta ut och komprimera en PDF kraftigt så att den ryms inom e-postgränserna.",
+ },
+ "podcast-polish": {
+ name: "Putsa podd",
+ description: "Ta bort tystnad, normalisera ljudnivån och lägg till toningar i en inspelning.",
+ },
+ "cut-out-subject": {
+ name: "Klipp ut motivet",
+ description: "Ta bort bakgrunden med AI och komprimera den transparenta urklippsbilden.",
+ },
+ "restore-old-photo": {
+ name: "Återställ gammalt foto",
+ description: "Reparera, färglägg och skala upp ett gammalt eller skadat foto med AI.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/th.ts b/packages/shared/src/i18n/th.ts
index 8e8b31a4..0d5b01dc 100644
--- a/packages/shared/src/i18n/th.ts
+++ b/packages/shared/src/i18n/th.ts
@@ -73,6 +73,340 @@ export const th: TranslationKeys = {
documentsAndFiles: "PDF และไฟล์",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG เป็น PNG",
+ description: "แปลง JPG เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-jpg": {
+ name: "PNG เป็น JPG",
+ description: "แปลง PNG เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-webp": {
+ name: "JPG เป็น WebP",
+ description: "แปลง JPG เป็น WebP ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-webp": {
+ name: "PNG เป็น WebP",
+ description: "แปลง PNG เป็น WebP ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webp-to-jpg": {
+ name: "WebP เป็น JPG",
+ description: "แปลง WebP เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webp-to-png": {
+ name: "WebP เป็น PNG",
+ description: "แปลง WebP เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-avif": {
+ name: "JPG เป็น AVIF",
+ description: "แปลง JPG เป็น AVIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-avif": {
+ name: "PNG เป็น AVIF",
+ description: "แปลง PNG เป็น AVIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webp-to-avif": {
+ name: "WebP เป็น AVIF",
+ description: "แปลง WebP เป็น AVIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "heic-to-jpg": {
+ name: "HEIC เป็น JPG",
+ description: "แปลง HEIC เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "heic-to-png": {
+ name: "HEIC เป็น PNG",
+ description: "แปลง HEIC เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "heic-to-avif": {
+ name: "HEIC เป็น AVIF",
+ description: "แปลง HEIC เป็น AVIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-gif": {
+ name: "JPG เป็น GIF",
+ description: "แปลง JPG เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-gif": {
+ name: "PNG เป็น GIF",
+ description: "แปลง PNG เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "gif-to-jpg": {
+ name: "GIF เป็น JPG",
+ description: "แปลง GIF เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "gif-to-png": {
+ name: "GIF เป็น PNG",
+ description: "แปลง GIF เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webp-to-gif": {
+ name: "WebP เป็น GIF",
+ description: "แปลง WebP เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-tiff": {
+ name: "JPG เป็น TIFF",
+ description: "แปลง JPG เป็น TIFF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-tiff": {
+ name: "PNG เป็น TIFF",
+ description: "แปลง PNG เป็น TIFF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF เป็น JPG",
+ description: "แปลง TIFF เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "tiff-to-png": {
+ name: "TIFF เป็น PNG",
+ description: "แปลง TIFF เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "psd-to-jpg": {
+ name: "PSD เป็น JPG",
+ description: "แปลง PSD เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "psd-to-png": {
+ name: "PSD เป็น PNG",
+ description: "แปลง PSD เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-eps": {
+ name: "PNG เป็น EPS",
+ description: "แปลง PNG เป็น EPS ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-eps": {
+ name: "JPG เป็น EPS",
+ description: "แปลง JPG เป็น EPS ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "eps-to-png": {
+ name: "EPS เป็น PNG",
+ description: "แปลง EPS เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "eps-to-jpg": {
+ name: "EPS เป็น JPG",
+ description: "แปลง EPS เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-svg": {
+ name: "PNG เป็น SVG",
+ description: "แปลง PNG เป็น SVG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-svg": {
+ name: "JPG เป็น SVG",
+ description: "แปลง JPG เป็น SVG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "tiff-to-svg": {
+ name: "TIFF เป็น SVG",
+ description: "แปลง TIFF เป็น SVG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "psd-to-svg": {
+ name: "PSD เป็น SVG",
+ description: "แปลง PSD เป็น SVG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "eps-to-svg": {
+ name: "EPS เป็น SVG",
+ description: "แปลง EPS เป็น SVG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "svg-to-png": {
+ name: "SVG เป็น PNG",
+ description: "แปลง SVG เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "svg-to-jpg": {
+ name: "SVG เป็น JPG",
+ description: "แปลง SVG เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "jpg-to-pdf": {
+ name: "JPG เป็น PDF",
+ description: "แปลง JPG เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "png-to-pdf": {
+ name: "PNG เป็น PDF",
+ description: "แปลง PNG เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "heic-to-pdf": {
+ name: "HEIC เป็น PDF",
+ description: "แปลง HEIC เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF เป็น PDF",
+ description: "แปลง TIFF เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webp-to-pdf": {
+ name: "WebP เป็น PDF",
+ description: "แปลง WebP เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "gif-to-pdf": {
+ name: "GIF เป็น PDF",
+ description: "แปลง GIF เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "eps-to-pdf": {
+ name: "EPS เป็น PDF",
+ description: "แปลง EPS เป็น PDF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "pdf-to-jpg": {
+ name: "PDF เป็น JPG",
+ description: "แปลง PDF เป็น JPG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "pdf-to-png": {
+ name: "PDF เป็น PNG",
+ description: "แปลง PDF เป็น PNG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "pdf-to-tiff": {
+ name: "PDF เป็น TIFF",
+ description: "แปลง PDF เป็น TIFF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mov-to-mp4": {
+ name: "MOV เป็น MP4",
+ description: "แปลง MOV เป็น MP4 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webm-to-mp4": {
+ name: "WEBM เป็น MP4",
+ description: "แปลง WEBM เป็น MP4 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mkv-to-mp4": {
+ name: "MKV เป็น MP4",
+ description: "แปลง MKV เป็น MP4 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "avi-to-mp4": {
+ name: "AVI เป็น MP4",
+ description: "แปลง AVI เป็น MP4 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-mov": {
+ name: "MP4 เป็น MOV",
+ description: "แปลง MP4 เป็น MOV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-webm": {
+ name: "MP4 เป็น WEBM",
+ description: "แปลง MP4 เป็น WEBM ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webm-to-mov": {
+ name: "WEBM เป็น MOV",
+ description: "แปลง WEBM เป็น MOV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mkv-to-mov": {
+ name: "MKV เป็น MOV",
+ description: "แปลง MKV เป็น MOV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "avi-to-mov": {
+ name: "AVI เป็น MOV",
+ description: "แปลง AVI เป็น MOV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-avi": {
+ name: "MP4 เป็น AVI",
+ description: "แปลง MP4 เป็น AVI ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mov-to-avi": {
+ name: "MOV เป็น AVI",
+ description: "แปลง MOV เป็น AVI ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mkv-to-avi": {
+ name: "MKV เป็น AVI",
+ description: "แปลง MKV เป็น AVI ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "avi-to-mkv": {
+ name: "AVI เป็น MKV",
+ description: "แปลง AVI เป็น MKV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-gif": {
+ name: "MP4 เป็น GIF",
+ description: "แปลง MP4 เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mov-to-gif": {
+ name: "MOV เป็น GIF",
+ description: "แปลง MOV เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mkv-to-gif": {
+ name: "MKV เป็น GIF",
+ description: "แปลง MKV เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "avi-to-gif": {
+ name: "AVI เป็น GIF",
+ description: "แปลง AVI เป็น GIF ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "gif-to-mp4": {
+ name: "GIF เป็น MP4",
+ description: "แปลง GIF เป็น MP4 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "gif-to-webm": {
+ name: "GIF เป็น WEBM",
+ description: "แปลง GIF เป็น WEBM ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "gif-to-mov": {
+ name: "GIF เป็น MOV",
+ description: "แปลง GIF เป็น MOV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 เป็น MP3",
+ description: "แปลง MP4 เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mov-to-mp3": {
+ name: "MOV เป็น MP3",
+ description: "แปลง MOV เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mkv-to-mp3": {
+ name: "MKV เป็น MP3",
+ description: "แปลง MKV เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "webm-to-mp3": {
+ name: "WEBM เป็น MP3",
+ description: "แปลง WEBM เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "avi-to-mp3": {
+ name: "AVI เป็น MP3",
+ description: "แปลง AVI เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-wav": {
+ name: "MP4 เป็น WAV",
+ description: "แปลง MP4 เป็น WAV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mov-to-wav": {
+ name: "MOV เป็น WAV",
+ description: "แปลง MOV เป็น WAV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 เป็น OGG",
+ description: "แปลง MP4 เป็น OGG ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "m4a-to-mp3": {
+ name: "M4A เป็น MP3",
+ description: "แปลง M4A เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "m4a-to-wav": {
+ name: "M4A เป็น WAV",
+ description: "แปลง M4A เป็น WAV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "aac-to-mp3": {
+ name: "AAC เป็น MP3",
+ description: "แปลง AAC เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "aac-to-wav": {
+ name: "AAC เป็น WAV",
+ description: "แปลง AAC เป็น WAV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "aac-to-flac": {
+ name: "AAC เป็น FLAC",
+ description: "แปลง AAC เป็น FLAC ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "ogg-to-mp3": {
+ name: "OGG เป็น MP3",
+ description: "แปลง OGG เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "ogg-to-wav": {
+ name: "OGG เป็น WAV",
+ description: "แปลง OGG เป็น WAV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "wav-to-mp3": {
+ name: "WAV เป็น MP3",
+ description: "แปลง WAV เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "mp3-to-wav": {
+ name: "MP3 เป็น WAV",
+ description: "แปลง MP3 เป็น WAV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "flac-to-mp3": {
+ name: "FLAC เป็น MP3",
+ description: "แปลง FLAC เป็น MP3 ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ "excel-to-csv": {
+ name: "Excel เป็น CSV",
+ description: "แปลง Excel เป็น CSV ออนไลน์ รวดเร็ว ฟรี และเป็นส่วนตัว",
+ },
+ // END conversion-presets
resize: {
name: "ปรับขนาด",
description: "ปรับขนาดตามพิกเซล เปอร์เซ็นต์ หรือพรีเซ็ตสื่อสังคม",
@@ -150,7 +484,7 @@ export const th: TranslationKeys = {
description: "ลบวัตถุที่ไม่ต้องการด้วย AI",
},
ocr: {
- name: "OCR / แยกข้อความ",
+ name: "แยกข้อความจากรูปภาพ (OCR)",
description: "แยกข้อความจากภาพด้วยความแม่นยำของ AI",
},
"ocr-pdf": {
@@ -2724,6 +3058,14 @@ export const th: TranslationKeys = {
"ดาวน์โหลดไฟล์ ZIP วินิจฉัยที่มีการตั้งค่า บันทึก และข้อมูลงานที่ปกปิดข้อมูลอ่อนไหวแล้ว สำหรับการแก้ไขปัญหา",
supportBundleFailed: "ดาวน์โหลดชุดข้อมูลสนับสนุนไม่สำเร็จ",
},
+ privacy: {
+ title: "ความเป็นส่วนตัว",
+ description:
+ "การวิเคราะห์ผลิตภัณฑ์แบบไม่ระบุตัวตนช่วยพัฒนา SnapOtter ให้ดียิ่งขึ้น โดยเปิดใช้งานเป็นค่าเริ่มต้นและผู้ดูแลระบบเป็นผู้ตั้งค่าสำหรับทั้งอินสแตนซ์",
+ analyticsLabel: "การวิเคราะห์ผลิตภัณฑ์แบบไม่ระบุตัวตน",
+ analyticsDescription:
+ "แชร์ข้อมูลการใช้งานแบบไม่ระบุตัวตน (เครื่องมือที่ทำงาน ระยะเวลา รหัสข้อผิดพลาด) และรายงานข้อขัดข้อง ไม่มีที่อยู่ IP และไม่มีข้อมูลระบุตัวตนของบัญชี เราจะไม่เก็บชื่อไฟล์ เนื้อหาไฟล์ ผลลัพธ์ OCR ข้อมูลเมตาของรูปภาพ หรือข้อความในเอกสารของคุณเลย ปิดตัวเลือกนี้เพื่อหยุดทั้งหมด",
+ },
security: {
heading: "ความปลอดภัย",
description: "การตั้งค่ารหัสผ่านและการยืนยันตัวตน",
@@ -3007,7 +3349,7 @@ export const th: TranslationKeys = {
heading: "เกี่ยวกับ",
appName: "SnapOtter",
appDescription:
- "ชุดเครื่องมือประมวลผลไฟล์แบบโฮสต์เองที่เน้นความเป็นส่วนตัวพร้อม 157 เครื่องมือ แปลง บีบอัด แก้ไข ถอดเสียง OCR และทำงานอัตโนมัติกับภาพ วิดีโอ เสียง เอกสาร และข้อมูลโดยไม่ต้องส่งข้อมูลไปคลาวด์",
+ "ชุดเครื่องมือประมวลผลไฟล์แบบโฮสต์เองที่เน้นความเป็นส่วนตัวพร้อม 240 เครื่องมือ แปลง บีบอัด แก้ไข ถอดเสียง OCR และทำงานอัตโนมัติกับภาพ วิดีโอ เสียง เอกสาร และข้อมูลโดยไม่ต้องส่งข้อมูลไปคลาวด์",
versionLabel: "เวอร์ชัน:",
linksHeading: "ลิงก์",
githubLink: "คลังเก็บโค้ด GitHub",
@@ -3063,7 +3405,7 @@ export const th: TranslationKeys = {
"ไม่จำกัด ไม่มีเพดานซ่อน",
"ใช้งานออฟไลน์ได้เต็มที่",
"ประมวลผลเป็นชุดไม่จำกัด",
- "157 เครื่องมือ",
+ "240 เครื่องมือ",
"15 โมเดล AI บนฮาร์ดแวร์ของคุณ",
"เร็วสายฟ้าแลบ สร้างบน Sharp",
"พร้อมใช้ในเครือข่ายปิด",
@@ -3127,6 +3469,7 @@ export const th: TranslationKeys = {
toolPalette: "จานเครื่องมือ",
clickToAdd: "คลิกเพื่อเพิ่มใน Pipeline",
savedLabel: "บันทึกแล้ว",
+ templatesLabel: "เทมเพลต",
importButton: "นำเข้า",
noSavedPipelines: "ไม่มี Pipeline ที่บันทึก",
stepCount: "({count} ขั้นตอน)",
@@ -3410,4 +3753,42 @@ export const th: TranslationKeys = {
navigationMenu: "เมนูนำทาง",
homeLink: "หน้าแรก SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "ปรับให้เหมาะกับเว็บ",
+ description: "ปรับขนาด แปลงเป็น WebP และบีบอัดภาพเพื่อให้โหลดบนเว็บได้รวดเร็ว",
+ },
+ "email-friendly": {
+ name: "เหมาะกับอีเมล",
+ description: "ย่อภาพให้เล็กพอที่จะแนบไปกับอีเมลได้",
+ },
+ "privacy-scrub": {
+ name: "ล้างข้อมูลความเป็นส่วนตัว",
+ description: "ลบ EXIF, GPS และข้อมูลเมตาอื่น ๆ แล้วบีบอัด",
+ },
+ "social-square": {
+ name: "สี่เหลี่ยมจัตุรัสโซเชียล",
+ description: "ครอปเป็นสี่เหลี่ยมจัตุรัส 1:1 และบีบอัดสำหรับโพสต์โซเชียล",
+ },
+ "watermark-batch": {
+ name: "ลายน้ำเป็นชุด",
+ description: "ประทับลายน้ำข้อความลงบนภาพ แล้วบีบอัด",
+ },
+ "shrink-pdf-email": {
+ name: "ย่อ PDF สำหรับอีเมล",
+ description: "ปรับให้แบนและบีบอัด PDF อย่างหนักเพื่อให้อยู่ในขีดจำกัดของอีเมล",
+ },
+ "podcast-polish": {
+ name: "ขัดเกลาพอดแคสต์",
+ description: "ลบช่วงเงียบ ปรับความดังให้สม่ำเสมอ และเพิ่มเสียงเฟดให้กับการบันทึก",
+ },
+ "cut-out-subject": {
+ name: "ตัดวัตถุออกมา",
+ description: "ลบพื้นหลังด้วย AI และบีบอัดภาพที่ตัดออกมาแบบโปร่งใส",
+ },
+ "restore-old-photo": {
+ name: "ฟื้นฟูภาพถ่ายเก่า",
+ description: "ซ่อมแซม ลงสี และขยายภาพถ่ายเก่าหรือที่เสียหายด้วย AI",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/tr.ts b/packages/shared/src/i18n/tr.ts
index 0dea0dcb..388b5de9 100644
--- a/packages/shared/src/i18n/tr.ts
+++ b/packages/shared/src/i18n/tr.ts
@@ -73,6 +73,340 @@ export const tr: TranslationKeys = {
documentsAndFiles: "PDF ve Dosyalar",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG - PNG",
+ description: "JPG dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-jpg": {
+ name: "PNG - JPG",
+ description: "PNG dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-webp": {
+ name: "JPG - WebP",
+ description: "JPG dosyasını çevrimiçi WebP biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-webp": {
+ name: "PNG - WebP",
+ description: "PNG dosyasını çevrimiçi WebP biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webp-to-jpg": {
+ name: "WebP - JPG",
+ description: "WebP dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webp-to-png": {
+ name: "WebP - PNG",
+ description: "WebP dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-avif": {
+ name: "JPG - AVIF",
+ description: "JPG dosyasını çevrimiçi AVIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-avif": {
+ name: "PNG - AVIF",
+ description: "PNG dosyasını çevrimiçi AVIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webp-to-avif": {
+ name: "WebP - AVIF",
+ description: "WebP dosyasını çevrimiçi AVIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC - JPG",
+ description: "HEIC dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "heic-to-png": {
+ name: "HEIC - PNG",
+ description: "HEIC dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "heic-to-avif": {
+ name: "HEIC - AVIF",
+ description: "HEIC dosyasını çevrimiçi AVIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-gif": {
+ name: "JPG - GIF",
+ description: "JPG dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-gif": {
+ name: "PNG - GIF",
+ description: "PNG dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "gif-to-jpg": {
+ name: "GIF - JPG",
+ description: "GIF dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "gif-to-png": {
+ name: "GIF - PNG",
+ description: "GIF dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webp-to-gif": {
+ name: "WebP - GIF",
+ description: "WebP dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG - TIFF",
+ description: "JPG dosyasını çevrimiçi TIFF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-tiff": {
+ name: "PNG - TIFF",
+ description: "PNG dosyasını çevrimiçi TIFF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF - JPG",
+ description: "TIFF dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "tiff-to-png": {
+ name: "TIFF - PNG",
+ description: "TIFF dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "psd-to-jpg": {
+ name: "PSD - JPG",
+ description: "PSD dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "psd-to-png": {
+ name: "PSD - PNG",
+ description: "PSD dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-eps": {
+ name: "PNG - EPS",
+ description: "PNG dosyasını çevrimiçi EPS biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-eps": {
+ name: "JPG - EPS",
+ description: "JPG dosyasını çevrimiçi EPS biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "eps-to-png": {
+ name: "EPS - PNG",
+ description: "EPS dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "eps-to-jpg": {
+ name: "EPS - JPG",
+ description: "EPS dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-svg": {
+ name: "PNG - SVG",
+ description: "PNG dosyasını çevrimiçi SVG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-svg": {
+ name: "JPG - SVG",
+ description: "JPG dosyasını çevrimiçi SVG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF - SVG",
+ description: "TIFF dosyasını çevrimiçi SVG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "psd-to-svg": {
+ name: "PSD - SVG",
+ description: "PSD dosyasını çevrimiçi SVG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "eps-to-svg": {
+ name: "EPS - SVG",
+ description: "EPS dosyasını çevrimiçi SVG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "svg-to-png": {
+ name: "SVG - PNG",
+ description: "SVG dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "svg-to-jpg": {
+ name: "SVG - JPG",
+ description: "SVG dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG - PDF",
+ description: "JPG dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "png-to-pdf": {
+ name: "PNG - PDF",
+ description: "PNG dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC - PDF",
+ description: "HEIC dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF - PDF",
+ description: "TIFF dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webp-to-pdf": {
+ name: "WebP - PDF",
+ description: "WebP dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "gif-to-pdf": {
+ name: "GIF - PDF",
+ description: "GIF dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "eps-to-pdf": {
+ name: "EPS - PDF",
+ description: "EPS dosyasını çevrimiçi PDF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF - JPG",
+ description: "PDF dosyasını çevrimiçi JPG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "pdf-to-png": {
+ name: "PDF - PNG",
+ description: "PDF dosyasını çevrimiçi PNG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF - TIFF",
+ description: "PDF dosyasını çevrimiçi TIFF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mov-to-mp4": {
+ name: "MOV - MP4",
+ description: "MOV dosyasını çevrimiçi MP4 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM - MP4",
+ description: "WEBM dosyasını çevrimiçi MP4 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV - MP4",
+ description: "MKV dosyasını çevrimiçi MP4 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "avi-to-mp4": {
+ name: "AVI - MP4",
+ description: "AVI dosyasını çevrimiçi MP4 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 - MOV",
+ description: "MP4 dosyasını çevrimiçi MOV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 - WEBM",
+ description: "MP4 dosyasını çevrimiçi WEBM biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webm-to-mov": {
+ name: "WEBM - MOV",
+ description: "WEBM dosyasını çevrimiçi MOV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mkv-to-mov": {
+ name: "MKV - MOV",
+ description: "MKV dosyasını çevrimiçi MOV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "avi-to-mov": {
+ name: "AVI - MOV",
+ description: "AVI dosyasını çevrimiçi MOV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 - AVI",
+ description: "MP4 dosyasını çevrimiçi AVI biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mov-to-avi": {
+ name: "MOV - AVI",
+ description: "MOV dosyasını çevrimiçi AVI biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mkv-to-avi": {
+ name: "MKV - AVI",
+ description: "MKV dosyasını çevrimiçi AVI biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "avi-to-mkv": {
+ name: "AVI - MKV",
+ description: "AVI dosyasını çevrimiçi MKV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 - GIF",
+ description: "MP4 dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mov-to-gif": {
+ name: "MOV - GIF",
+ description: "MOV dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mkv-to-gif": {
+ name: "MKV - GIF",
+ description: "MKV dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "avi-to-gif": {
+ name: "AVI - GIF",
+ description: "AVI dosyasını çevrimiçi GIF biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "gif-to-mp4": {
+ name: "GIF - MP4",
+ description: "GIF dosyasını çevrimiçi MP4 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "gif-to-webm": {
+ name: "GIF - WEBM",
+ description: "GIF dosyasını çevrimiçi WEBM biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "gif-to-mov": {
+ name: "GIF - MOV",
+ description: "GIF dosyasını çevrimiçi MOV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 - MP3",
+ description: "MP4 dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mov-to-mp3": {
+ name: "MOV - MP3",
+ description: "MOV dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV - MP3",
+ description: "MKV dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM - MP3",
+ description: "WEBM dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "avi-to-mp3": {
+ name: "AVI - MP3",
+ description: "AVI dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 - WAV",
+ description: "MP4 dosyasını çevrimiçi WAV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mov-to-wav": {
+ name: "MOV - WAV",
+ description: "MOV dosyasını çevrimiçi WAV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 - OGG",
+ description: "MP4 dosyasını çevrimiçi OGG biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A - MP3",
+ description: "M4A dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "m4a-to-wav": {
+ name: "M4A - WAV",
+ description: "M4A dosyasını çevrimiçi WAV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "aac-to-mp3": {
+ name: "AAC - MP3",
+ description: "AAC dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "aac-to-wav": {
+ name: "AAC - WAV",
+ description: "AAC dosyasını çevrimiçi WAV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "aac-to-flac": {
+ name: "AAC - FLAC",
+ description: "AAC dosyasını çevrimiçi FLAC biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG - MP3",
+ description: "OGG dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "ogg-to-wav": {
+ name: "OGG - WAV",
+ description: "OGG dosyasını çevrimiçi WAV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "wav-to-mp3": {
+ name: "WAV - MP3",
+ description: "WAV dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 - WAV",
+ description: "MP3 dosyasını çevrimiçi WAV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC - MP3",
+ description: "FLAC dosyasını çevrimiçi MP3 biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ "excel-to-csv": {
+ name: "Excel - CSV",
+ description: "Excel dosyasını çevrimiçi CSV biçimine dönüştürün. Hızlı, ücretsiz ve gizli.",
+ },
+ // END conversion-presets
resize: {
name: "Boyutlandır",
description: "Piksel, yüzde veya sosyal medya şablonlarıyla boyutlandırın",
@@ -151,7 +485,7 @@ export const tr: TranslationKeys = {
description: "İstenmeyen nesneleri AI ile kaldırın",
},
ocr: {
- name: "OCR / Metin Çıkarma",
+ name: "Görüntüden Metin Çıkarma (OCR)",
description: "AI destekli doğrulukla görüntülerden metin çıkarın",
},
"ocr-pdf": {
@@ -2755,6 +3089,14 @@ export const tr: TranslationKeys = {
"Sorun giderme için gizlenmiş yapılandırma, günlükler ve iş verilerini içeren tanı ZIP dosyasını indirin.",
supportBundleFailed: "Destek paketi indirilemedi.",
},
+ privacy: {
+ title: "Gizlilik",
+ description:
+ "Anonim Ürün Analitiği, SnapOtter'ı geliştirmeye yardımcı olur. Varsayılan olarak açıktır ve tüm örnek için bir yönetici tarafından ayarlanır.",
+ analyticsLabel: "Anonim Ürün Analitiği",
+ analyticsDescription:
+ "Anonim kullanım verilerini (hangi araçların çalıştığı, süreler, hata kodları) ve çökme raporlarını paylaşın. IP adresi yok, hesap kimliği yok. Dosya adlarınızı, dosya içeriklerinizi, OCR çıktısını, görüntü meta verilerini veya belge metnini asla toplamayız. Hepsini durdurmak için bunu kapatın.",
+ },
security: {
heading: "Güvenlik",
description: "Parola ve kimlik doğrulama ayarları.",
@@ -3050,7 +3392,7 @@ export const tr: TranslationKeys = {
heading: "Hakkında",
appName: "SnapOtter",
appDescription:
- "157 araçla gizlilik odaklı, kendi sunucunuzda barındırılan bir dosya işleme paketi. Buluta veri göndermeden dönüştürme, sıkıştırma, düzenleme, transkripsiyon, OCR ve görüntü, video, ses, belge ve veri iş akışlarınızı otomatikleştirme.",
+ "240 araçla gizlilik odaklı, kendi sunucunuzda barındırılan bir dosya işleme paketi. Buluta veri göndermeden dönüştürme, sıkıştırma, düzenleme, transkripsiyon, OCR ve görüntü, video, ses, belge ve veri iş akışlarınızı otomatikleştirme.",
versionLabel: "Sürüm:",
linksHeading: "Bağlantılar",
githubLink: "GitHub Deposu",
@@ -3110,7 +3452,7 @@ export const tr: TranslationKeys = {
"Limit yok. Gizli kota yok.",
"Tamamen çevrimdışı çalışır.",
"Sınırsız toplu işleme.",
- "157 araç.",
+ "240 araç.",
"16 AI modeli. Sizin donanımınız.",
"Yıldırım hızında. Sharp ile geliştirildi.",
"Hava boşluklu ağlar için hazır.",
@@ -3175,6 +3517,7 @@ export const tr: TranslationKeys = {
toolPalette: "Araç Paleti",
clickToAdd: "Pipeline'a eklemek için tıklayın",
savedLabel: "Kaydedildi",
+ templatesLabel: "Şablonlar",
importButton: "İçe Aktar",
noSavedPipelines: "Kayıtlı Pipeline yok",
stepCount: "({count} adım)",
@@ -3461,4 +3804,44 @@ export const tr: TranslationKeys = {
navigationMenu: "Gezinme",
homeLink: "SnapOtter ana sayfa",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Web için optimize et",
+ description:
+ "Hızlı web yüklemesi için bir görseli yeniden boyutlandır, WebP'ye dönüştür ve sıkıştır.",
+ },
+ "email-friendly": {
+ name: "E-postaya uygun",
+ description: "Bir görseli e-postaya eklenebilecek kadar küçült.",
+ },
+ "privacy-scrub": {
+ name: "Gizlilik temizliği",
+ description: "EXIF, GPS ve diğer meta verileri kaldır, ardından sıkıştır.",
+ },
+ "social-square": {
+ name: "Sosyal kare",
+ description: "1:1 kareye kırp ve sosyal medya gönderileri için sıkıştır.",
+ },
+ "watermark-batch": {
+ name: "Toplu filigran",
+ description: "Görsellere metin filigranı bas, ardından sıkıştır.",
+ },
+ "shrink-pdf-email": {
+ name: "E-posta için PDF'yi küçült",
+ description:
+ "Bir PDF'yi düzleştir ve e-posta sınırlarına sığması için güçlü biçimde sıkıştır.",
+ },
+ "podcast-polish": {
+ name: "Podcast rötuşu",
+ description: "Sessizlikleri kaldır, ses düzeyini normalleştir ve kayda geçişler ekle.",
+ },
+ "cut-out-subject": {
+ name: "Özneyi kes",
+ description: "Arka planı yapay zekâ ile kaldır ve saydam kesiti sıkıştır.",
+ },
+ "restore-old-photo": {
+ name: "Eski fotoğrafı onar",
+ description: "Eski veya hasarlı bir fotoğrafı yapay zekâ ile onar, renklendir ve büyüt.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/uk.ts b/packages/shared/src/i18n/uk.ts
index 4fa9f417..a34ccc8c 100644
--- a/packages/shared/src/i18n/uk.ts
+++ b/packages/shared/src/i18n/uk.ts
@@ -73,6 +73,340 @@ export const uk: TranslationKeys = {
documentsAndFiles: "PDF та файли",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG у PNG",
+ description: "Конвертуйте JPG у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-jpg": {
+ name: "PNG у JPG",
+ description: "Конвертуйте PNG у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-webp": {
+ name: "JPG у WebP",
+ description: "Конвертуйте JPG у WebP онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-webp": {
+ name: "PNG у WebP",
+ description: "Конвертуйте PNG у WebP онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webp-to-jpg": {
+ name: "WebP у JPG",
+ description: "Конвертуйте WebP у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webp-to-png": {
+ name: "WebP у PNG",
+ description: "Конвертуйте WebP у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-avif": {
+ name: "JPG у AVIF",
+ description: "Конвертуйте JPG у AVIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-avif": {
+ name: "PNG у AVIF",
+ description: "Конвертуйте PNG у AVIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webp-to-avif": {
+ name: "WebP у AVIF",
+ description: "Конвертуйте WebP у AVIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC у JPG",
+ description: "Конвертуйте HEIC у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "heic-to-png": {
+ name: "HEIC у PNG",
+ description: "Конвертуйте HEIC у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "heic-to-avif": {
+ name: "HEIC у AVIF",
+ description: "Конвертуйте HEIC у AVIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-gif": {
+ name: "JPG у GIF",
+ description: "Конвертуйте JPG у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-gif": {
+ name: "PNG у GIF",
+ description: "Конвертуйте PNG у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "gif-to-jpg": {
+ name: "GIF у JPG",
+ description: "Конвертуйте GIF у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "gif-to-png": {
+ name: "GIF у PNG",
+ description: "Конвертуйте GIF у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webp-to-gif": {
+ name: "WebP у GIF",
+ description: "Конвертуйте WebP у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG у TIFF",
+ description: "Конвертуйте JPG у TIFF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-tiff": {
+ name: "PNG у TIFF",
+ description: "Конвертуйте PNG у TIFF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF у JPG",
+ description: "Конвертуйте TIFF у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "tiff-to-png": {
+ name: "TIFF у PNG",
+ description: "Конвертуйте TIFF у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "psd-to-jpg": {
+ name: "PSD у JPG",
+ description: "Конвертуйте PSD у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "psd-to-png": {
+ name: "PSD у PNG",
+ description: "Конвертуйте PSD у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-eps": {
+ name: "PNG у EPS",
+ description: "Конвертуйте PNG у EPS онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-eps": {
+ name: "JPG у EPS",
+ description: "Конвертуйте JPG у EPS онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "eps-to-png": {
+ name: "EPS у PNG",
+ description: "Конвертуйте EPS у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "eps-to-jpg": {
+ name: "EPS у JPG",
+ description: "Конвертуйте EPS у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-svg": {
+ name: "PNG у SVG",
+ description: "Конвертуйте PNG у SVG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-svg": {
+ name: "JPG у SVG",
+ description: "Конвертуйте JPG у SVG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF у SVG",
+ description: "Конвертуйте TIFF у SVG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "psd-to-svg": {
+ name: "PSD у SVG",
+ description: "Конвертуйте PSD у SVG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "eps-to-svg": {
+ name: "EPS у SVG",
+ description: "Конвертуйте EPS у SVG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "svg-to-png": {
+ name: "SVG у PNG",
+ description: "Конвертуйте SVG у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "svg-to-jpg": {
+ name: "SVG у JPG",
+ description: "Конвертуйте SVG у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG у PDF",
+ description: "Конвертуйте JPG у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "png-to-pdf": {
+ name: "PNG у PDF",
+ description: "Конвертуйте PNG у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC у PDF",
+ description: "Конвертуйте HEIC у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF у PDF",
+ description: "Конвертуйте TIFF у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webp-to-pdf": {
+ name: "WebP у PDF",
+ description: "Конвертуйте WebP у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "gif-to-pdf": {
+ name: "GIF у PDF",
+ description: "Конвертуйте GIF у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "eps-to-pdf": {
+ name: "EPS у PDF",
+ description: "Конвертуйте EPS у PDF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF у JPG",
+ description: "Конвертуйте PDF у JPG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "pdf-to-png": {
+ name: "PDF у PNG",
+ description: "Конвертуйте PDF у PNG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF у TIFF",
+ description: "Конвертуйте PDF у TIFF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mov-to-mp4": {
+ name: "MOV у MP4",
+ description: "Конвертуйте MOV у MP4 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM у MP4",
+ description: "Конвертуйте WEBM у MP4 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV у MP4",
+ description: "Конвертуйте MKV у MP4 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "avi-to-mp4": {
+ name: "AVI у MP4",
+ description: "Конвертуйте AVI у MP4 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 у MOV",
+ description: "Конвертуйте MP4 у MOV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 у WEBM",
+ description: "Конвертуйте MP4 у WEBM онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webm-to-mov": {
+ name: "WEBM у MOV",
+ description: "Конвертуйте WEBM у MOV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mkv-to-mov": {
+ name: "MKV у MOV",
+ description: "Конвертуйте MKV у MOV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "avi-to-mov": {
+ name: "AVI у MOV",
+ description: "Конвертуйте AVI у MOV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 у AVI",
+ description: "Конвертуйте MP4 у AVI онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mov-to-avi": {
+ name: "MOV у AVI",
+ description: "Конвертуйте MOV у AVI онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mkv-to-avi": {
+ name: "MKV у AVI",
+ description: "Конвертуйте MKV у AVI онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "avi-to-mkv": {
+ name: "AVI у MKV",
+ description: "Конвертуйте AVI у MKV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 у GIF",
+ description: "Конвертуйте MP4 у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mov-to-gif": {
+ name: "MOV у GIF",
+ description: "Конвертуйте MOV у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mkv-to-gif": {
+ name: "MKV у GIF",
+ description: "Конвертуйте MKV у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "avi-to-gif": {
+ name: "AVI у GIF",
+ description: "Конвертуйте AVI у GIF онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "gif-to-mp4": {
+ name: "GIF у MP4",
+ description: "Конвертуйте GIF у MP4 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "gif-to-webm": {
+ name: "GIF у WEBM",
+ description: "Конвертуйте GIF у WEBM онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "gif-to-mov": {
+ name: "GIF у MOV",
+ description: "Конвертуйте GIF у MOV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 у MP3",
+ description: "Конвертуйте MP4 у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mov-to-mp3": {
+ name: "MOV у MP3",
+ description: "Конвертуйте MOV у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV у MP3",
+ description: "Конвертуйте MKV у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM у MP3",
+ description: "Конвертуйте WEBM у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "avi-to-mp3": {
+ name: "AVI у MP3",
+ description: "Конвертуйте AVI у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 у WAV",
+ description: "Конвертуйте MP4 у WAV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mov-to-wav": {
+ name: "MOV у WAV",
+ description: "Конвертуйте MOV у WAV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 у OGG",
+ description: "Конвертуйте MP4 у OGG онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A у MP3",
+ description: "Конвертуйте M4A у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "m4a-to-wav": {
+ name: "M4A у WAV",
+ description: "Конвертуйте M4A у WAV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "aac-to-mp3": {
+ name: "AAC у MP3",
+ description: "Конвертуйте AAC у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "aac-to-wav": {
+ name: "AAC у WAV",
+ description: "Конвертуйте AAC у WAV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "aac-to-flac": {
+ name: "AAC у FLAC",
+ description: "Конвертуйте AAC у FLAC онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG у MP3",
+ description: "Конвертуйте OGG у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "ogg-to-wav": {
+ name: "OGG у WAV",
+ description: "Конвертуйте OGG у WAV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "wav-to-mp3": {
+ name: "WAV у MP3",
+ description: "Конвертуйте WAV у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 у WAV",
+ description: "Конвертуйте MP3 у WAV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC у MP3",
+ description: "Конвертуйте FLAC у MP3 онлайн. Швидко, безкоштовно та приватно.",
+ },
+ "excel-to-csv": {
+ name: "Excel у CSV",
+ description: "Конвертуйте Excel у CSV онлайн. Швидко, безкоштовно та приватно.",
+ },
+ // END conversion-presets
resize: {
name: "Зміна розміру",
description: "Зміна розміру в пікселях, відсотках або за шаблонами соцмереж",
@@ -149,7 +483,7 @@ export const uk: TranslationKeys = {
description: "Видалення небажаних об'єктів за допомогою AI",
},
ocr: {
- name: "OCR / Витягування тексту",
+ name: "Витягти текст із зображення (OCR)",
description: "Витягування тексту із зображень з точністю AI",
},
"ocr-pdf": {
@@ -2754,6 +3088,14 @@ export const uk: TranslationKeys = {
"Завантажте діагностичний архів із відредагованими конфігурацією, журналами та даними завдань для усунення неполадок.",
supportBundleFailed: "Не вдалося завантажити пакет підтримки.",
},
+ privacy: {
+ title: "Конфіденційність",
+ description:
+ "Анонімна продуктова аналітика допомагає покращувати SnapOtter. Вона ввімкнена за замовчуванням і налаштовується для всього екземпляра адміністратором.",
+ analyticsLabel: "Анонімна продуктова аналітика",
+ analyticsDescription:
+ "Діліться анонімними даними про використання (які інструменти запускаються, тривалість, коди помилок) та звітами про збої. Без IP-адреси та без ідентифікації облікового запису. Ми ніколи не збираємо назви ваших файлів, вміст файлів, результати OCR, метадані зображень чи текст документів. Вимкніть це, щоб зупинити все.",
+ },
security: {
heading: "Безпека",
description: "Налаштування пароля та автентифікації.",
@@ -3047,7 +3389,7 @@ export const uk: TranslationKeys = {
heading: "Про програму",
appName: "SnapOtter",
appDescription:
- "Самостійно розміщуваний набір інструментів для обробки файлів з пріоритетом конфіденційності, 157 інструментів. Конвертація, стиснення, редагування, транскрипція, OCR та автоматизація робочих процесів із зображеннями, відео, аудіо, документами та даними без надсилання даних у хмару.",
+ "Самостійно розміщуваний набір інструментів для обробки файлів з пріоритетом конфіденційності, 240 інструментів. Конвертація, стиснення, редагування, транскрипція, OCR та автоматизація робочих процесів із зображеннями, відео, аудіо, документами та даними без надсилання даних у хмару.",
versionLabel: "Версія:",
linksHeading: "Посилання",
githubLink: "Репозиторій GitHub",
@@ -3107,7 +3449,7 @@ export const uk: TranslationKeys = {
"Без обмежень. Без прихованих лімітів.",
"Повністю працює офлайн.",
"Пакетна обробка без обмежень.",
- "157 інструментів.",
+ "240 інструментів.",
"16 AI-моделей. На Вашому обладнанні.",
"Блискавична швидкість. На базі Sharp.",
"Готовий до ізольованих мереж.",
@@ -3172,6 +3514,7 @@ export const uk: TranslationKeys = {
toolPalette: "Палітра інструментів",
clickToAdd: "Натисніть для додавання до Pipeline",
savedLabel: "Збережені",
+ templatesLabel: "Шаблони",
importButton: "Імпорт",
noSavedPipelines: "Немає збережених Pipeline",
stepCount: "({count} крок)",
@@ -3458,4 +3801,44 @@ export const uk: TranslationKeys = {
navigationMenu: "Навігація",
homeLink: "Головна SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Оптимізація для вебу",
+ description:
+ "Змініть розмір, перетворіть на WebP і стисніть зображення для швидкого завантаження у вебі.",
+ },
+ "email-friendly": {
+ name: "Для електронної пошти",
+ description: "Зменшіть зображення, щоб його можна було прикріпити до електронного листа.",
+ },
+ "privacy-scrub": {
+ name: "Очищення конфіденційності",
+ description: "Видаліть EXIF, GPS та інші метадані, потім стисніть.",
+ },
+ "social-square": {
+ name: "Квадрат для соцмереж",
+ description: "Обріжте до квадрата 1:1 і стисніть для дописів у соцмережах.",
+ },
+ "watermark-batch": {
+ name: "Водяний знак пакетно",
+ description: "Нанесіть текстовий водяний знак на зображення, потім стисніть.",
+ },
+ "shrink-pdf-email": {
+ name: "Зменшити PDF для пошти",
+ description: "Зведіть і сильно стисніть PDF, щоб він уклався в обмеження електронної пошти.",
+ },
+ "podcast-polish": {
+ name: "Шліфування подкасту",
+ description: "Видаліть тишу, нормалізуйте гучність і додайте плавні переходи до запису.",
+ },
+ "cut-out-subject": {
+ name: "Вирізати об'єкт",
+ description: "Видаліть тло за допомогою ШІ та стисніть прозору вирізку.",
+ },
+ "restore-old-photo": {
+ name: "Відновити старе фото",
+ description:
+ "Відремонтуйте, розфарбуйте та збільште старе чи пошкоджене фото за допомогою ШІ.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/vi.ts b/packages/shared/src/i18n/vi.ts
index 07224d66..11a5dcc9 100644
--- a/packages/shared/src/i18n/vi.ts
+++ b/packages/shared/src/i18n/vi.ts
@@ -73,6 +73,340 @@ export const vi: TranslationKeys = {
documentsAndFiles: "PDF & Tệp",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": {
+ name: "JPG sang PNG",
+ description: "Chuyển đổi JPG sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-jpg": {
+ name: "PNG sang JPG",
+ description: "Chuyển đổi PNG sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-webp": {
+ name: "JPG sang WebP",
+ description: "Chuyển đổi JPG sang WebP trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-webp": {
+ name: "PNG sang WebP",
+ description: "Chuyển đổi PNG sang WebP trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webp-to-jpg": {
+ name: "WebP sang JPG",
+ description: "Chuyển đổi WebP sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webp-to-png": {
+ name: "WebP sang PNG",
+ description: "Chuyển đổi WebP sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-avif": {
+ name: "JPG sang AVIF",
+ description: "Chuyển đổi JPG sang AVIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-avif": {
+ name: "PNG sang AVIF",
+ description: "Chuyển đổi PNG sang AVIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webp-to-avif": {
+ name: "WebP sang AVIF",
+ description: "Chuyển đổi WebP sang AVIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "heic-to-jpg": {
+ name: "HEIC sang JPG",
+ description: "Chuyển đổi HEIC sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "heic-to-png": {
+ name: "HEIC sang PNG",
+ description: "Chuyển đổi HEIC sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "heic-to-avif": {
+ name: "HEIC sang AVIF",
+ description: "Chuyển đổi HEIC sang AVIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-gif": {
+ name: "JPG sang GIF",
+ description: "Chuyển đổi JPG sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-gif": {
+ name: "PNG sang GIF",
+ description: "Chuyển đổi PNG sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "gif-to-jpg": {
+ name: "GIF sang JPG",
+ description: "Chuyển đổi GIF sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "gif-to-png": {
+ name: "GIF sang PNG",
+ description: "Chuyển đổi GIF sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webp-to-gif": {
+ name: "WebP sang GIF",
+ description: "Chuyển đổi WebP sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-tiff": {
+ name: "JPG sang TIFF",
+ description: "Chuyển đổi JPG sang TIFF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-tiff": {
+ name: "PNG sang TIFF",
+ description: "Chuyển đổi PNG sang TIFF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF sang JPG",
+ description: "Chuyển đổi TIFF sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "tiff-to-png": {
+ name: "TIFF sang PNG",
+ description: "Chuyển đổi TIFF sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "psd-to-jpg": {
+ name: "PSD sang JPG",
+ description: "Chuyển đổi PSD sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "psd-to-png": {
+ name: "PSD sang PNG",
+ description: "Chuyển đổi PSD sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-eps": {
+ name: "PNG sang EPS",
+ description: "Chuyển đổi PNG sang EPS trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-eps": {
+ name: "JPG sang EPS",
+ description: "Chuyển đổi JPG sang EPS trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "eps-to-png": {
+ name: "EPS sang PNG",
+ description: "Chuyển đổi EPS sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "eps-to-jpg": {
+ name: "EPS sang JPG",
+ description: "Chuyển đổi EPS sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-svg": {
+ name: "PNG sang SVG",
+ description: "Chuyển đổi PNG sang SVG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-svg": {
+ name: "JPG sang SVG",
+ description: "Chuyển đổi JPG sang SVG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "tiff-to-svg": {
+ name: "TIFF sang SVG",
+ description: "Chuyển đổi TIFF sang SVG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "psd-to-svg": {
+ name: "PSD sang SVG",
+ description: "Chuyển đổi PSD sang SVG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "eps-to-svg": {
+ name: "EPS sang SVG",
+ description: "Chuyển đổi EPS sang SVG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "svg-to-png": {
+ name: "SVG sang PNG",
+ description: "Chuyển đổi SVG sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "svg-to-jpg": {
+ name: "SVG sang JPG",
+ description: "Chuyển đổi SVG sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "jpg-to-pdf": {
+ name: "JPG sang PDF",
+ description: "Chuyển đổi JPG sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "png-to-pdf": {
+ name: "PNG sang PDF",
+ description: "Chuyển đổi PNG sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "heic-to-pdf": {
+ name: "HEIC sang PDF",
+ description: "Chuyển đổi HEIC sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF sang PDF",
+ description: "Chuyển đổi TIFF sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webp-to-pdf": {
+ name: "WebP sang PDF",
+ description: "Chuyển đổi WebP sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "gif-to-pdf": {
+ name: "GIF sang PDF",
+ description: "Chuyển đổi GIF sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "eps-to-pdf": {
+ name: "EPS sang PDF",
+ description: "Chuyển đổi EPS sang PDF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "pdf-to-jpg": {
+ name: "PDF sang JPG",
+ description: "Chuyển đổi PDF sang JPG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "pdf-to-png": {
+ name: "PDF sang PNG",
+ description: "Chuyển đổi PDF sang PNG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "pdf-to-tiff": {
+ name: "PDF sang TIFF",
+ description: "Chuyển đổi PDF sang TIFF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mov-to-mp4": {
+ name: "MOV sang MP4",
+ description: "Chuyển đổi MOV sang MP4 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webm-to-mp4": {
+ name: "WEBM sang MP4",
+ description: "Chuyển đổi WEBM sang MP4 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mkv-to-mp4": {
+ name: "MKV sang MP4",
+ description: "Chuyển đổi MKV sang MP4 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "avi-to-mp4": {
+ name: "AVI sang MP4",
+ description: "Chuyển đổi AVI sang MP4 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-mov": {
+ name: "MP4 sang MOV",
+ description: "Chuyển đổi MP4 sang MOV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-webm": {
+ name: "MP4 sang WEBM",
+ description: "Chuyển đổi MP4 sang WEBM trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webm-to-mov": {
+ name: "WEBM sang MOV",
+ description: "Chuyển đổi WEBM sang MOV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mkv-to-mov": {
+ name: "MKV sang MOV",
+ description: "Chuyển đổi MKV sang MOV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "avi-to-mov": {
+ name: "AVI sang MOV",
+ description: "Chuyển đổi AVI sang MOV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-avi": {
+ name: "MP4 sang AVI",
+ description: "Chuyển đổi MP4 sang AVI trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mov-to-avi": {
+ name: "MOV sang AVI",
+ description: "Chuyển đổi MOV sang AVI trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mkv-to-avi": {
+ name: "MKV sang AVI",
+ description: "Chuyển đổi MKV sang AVI trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "avi-to-mkv": {
+ name: "AVI sang MKV",
+ description: "Chuyển đổi AVI sang MKV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-gif": {
+ name: "MP4 sang GIF",
+ description: "Chuyển đổi MP4 sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mov-to-gif": {
+ name: "MOV sang GIF",
+ description: "Chuyển đổi MOV sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mkv-to-gif": {
+ name: "MKV sang GIF",
+ description: "Chuyển đổi MKV sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "avi-to-gif": {
+ name: "AVI sang GIF",
+ description: "Chuyển đổi AVI sang GIF trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "gif-to-mp4": {
+ name: "GIF sang MP4",
+ description: "Chuyển đổi GIF sang MP4 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "gif-to-webm": {
+ name: "GIF sang WEBM",
+ description: "Chuyển đổi GIF sang WEBM trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "gif-to-mov": {
+ name: "GIF sang MOV",
+ description: "Chuyển đổi GIF sang MOV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-mp3": {
+ name: "MP4 sang MP3",
+ description: "Chuyển đổi MP4 sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mov-to-mp3": {
+ name: "MOV sang MP3",
+ description: "Chuyển đổi MOV sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mkv-to-mp3": {
+ name: "MKV sang MP3",
+ description: "Chuyển đổi MKV sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "webm-to-mp3": {
+ name: "WEBM sang MP3",
+ description: "Chuyển đổi WEBM sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "avi-to-mp3": {
+ name: "AVI sang MP3",
+ description: "Chuyển đổi AVI sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-wav": {
+ name: "MP4 sang WAV",
+ description: "Chuyển đổi MP4 sang WAV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mov-to-wav": {
+ name: "MOV sang WAV",
+ description: "Chuyển đổi MOV sang WAV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp4-to-ogg": {
+ name: "MP4 sang OGG",
+ description: "Chuyển đổi MP4 sang OGG trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "m4a-to-mp3": {
+ name: "M4A sang MP3",
+ description: "Chuyển đổi M4A sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "m4a-to-wav": {
+ name: "M4A sang WAV",
+ description: "Chuyển đổi M4A sang WAV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "aac-to-mp3": {
+ name: "AAC sang MP3",
+ description: "Chuyển đổi AAC sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "aac-to-wav": {
+ name: "AAC sang WAV",
+ description: "Chuyển đổi AAC sang WAV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "aac-to-flac": {
+ name: "AAC sang FLAC",
+ description: "Chuyển đổi AAC sang FLAC trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "ogg-to-mp3": {
+ name: "OGG sang MP3",
+ description: "Chuyển đổi OGG sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "ogg-to-wav": {
+ name: "OGG sang WAV",
+ description: "Chuyển đổi OGG sang WAV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "wav-to-mp3": {
+ name: "WAV sang MP3",
+ description: "Chuyển đổi WAV sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "mp3-to-wav": {
+ name: "MP3 sang WAV",
+ description: "Chuyển đổi MP3 sang WAV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "flac-to-mp3": {
+ name: "FLAC sang MP3",
+ description: "Chuyển đổi FLAC sang MP3 trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ "excel-to-csv": {
+ name: "Excel sang CSV",
+ description: "Chuyển đổi Excel sang CSV trực tuyến. Nhanh, miễn phí và riêng tư.",
+ },
+ // END conversion-presets
resize: {
name: "Thay đổi kích thước",
description: "Thay đổi kích thước theo pixel, phần trăm hoặc mẫu mạng xã hội",
@@ -152,7 +486,7 @@ export const vi: TranslationKeys = {
description: "Xóa các đối tượng không mong muốn bằng AI",
},
ocr: {
- name: "OCR / Trích xuất văn bản",
+ name: "Trích xuất văn bản từ ảnh (OCR)",
description: "Trích xuất văn bản từ hình ảnh với độ chính xác cao nhờ AI",
},
"ocr-pdf": {
@@ -2750,6 +3084,14 @@ export const vi: TranslationKeys = {
"Tải tệp zip chẩn đoán với cấu hình đã ẩn, nhật ký và dữ liệu công việc để khắc phục sự cố.",
supportBundleFailed: "Không thể tải gói hỗ trợ.",
},
+ privacy: {
+ title: "Quyền riêng tư",
+ description:
+ "Phân tích sản phẩm ẩn danh giúp cải thiện SnapOtter. Tính năng này được bật theo mặc định và do quản trị viên thiết lập cho toàn bộ phiên bản.",
+ analyticsLabel: "Phân tích sản phẩm ẩn danh",
+ analyticsDescription:
+ "Chia sẻ dữ liệu sử dụng ẩn danh (công cụ nào chạy, thời lượng, mã lỗi) và báo cáo sự cố. Không có địa chỉ IP, không có danh tính tài khoản. Chúng tôi không bao giờ thu thập tên tệp, nội dung tệp, kết quả OCR, siêu dữ liệu hình ảnh hay văn bản tài liệu của bạn. Tắt tùy chọn này để dừng tất cả.",
+ },
security: {
heading: "Bảo mật",
description: "Cài đặt mật khẩu và xác thực.",
@@ -3041,7 +3383,7 @@ export const vi: TranslationKeys = {
heading: "Giới thiệu",
appName: "SnapOtter",
appDescription:
- "Bộ công cụ xử lý tệp tự lưu trữ, ưu tiên quyền riêng tư với 157 công cụ. Chuyển đổi, nén, chỉnh sửa, phiên âm, OCR và tự động hóa quy trình xử lý ảnh, video, âm thanh, tài liệu và dữ liệu mà không cần gửi dữ liệu lên đám mây.",
+ "Bộ công cụ xử lý tệp tự lưu trữ, ưu tiên quyền riêng tư với 240 công cụ. Chuyển đổi, nén, chỉnh sửa, phiên âm, OCR và tự động hóa quy trình xử lý ảnh, video, âm thanh, tài liệu và dữ liệu mà không cần gửi dữ liệu lên đám mây.",
versionLabel: "Phiên bản:",
linksHeading: "Liên kết",
githubLink: "Kho mã nguồn GitHub",
@@ -3100,7 +3442,7 @@ export const vi: TranslationKeys = {
"Không giới hạn. Không ẩn giấu.",
"Hoạt động hoàn toàn ngoại tuyến.",
"Xử lý hàng loạt không giới hạn.",
- "157 công cụ.",
+ "240 công cụ.",
"15 mô hình AI. Chạy trên phần cứng của bạn.",
"Nhanh như chớp. Xây dựng trên Sharp.",
"Sẵn sàng cho môi trường cách ly mạng.",
@@ -3164,6 +3506,7 @@ export const vi: TranslationKeys = {
toolPalette: "Bảng công cụ",
clickToAdd: "Nhấp để thêm vào Pipeline",
savedLabel: "Đã lưu",
+ templatesLabel: "Mẫu",
importButton: "Nhập",
noSavedPipelines: "Không có Pipeline đã lưu",
stepCount: "({count} bước)",
@@ -3449,4 +3792,42 @@ export const vi: TranslationKeys = {
navigationMenu: "Điều hướng",
homeLink: "Trang chủ SnapOtter",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "Tối ưu cho web",
+ description: "Đổi kích thước, chuyển sang WebP và nén ảnh để tải nhanh trên web.",
+ },
+ "email-friendly": {
+ name: "Thân thiện với email",
+ description: "Thu nhỏ ảnh sao cho đủ nhỏ để đính kèm vào email.",
+ },
+ "privacy-scrub": {
+ name: "Dọn quyền riêng tư",
+ description: "Xóa EXIF, GPS và các siêu dữ liệu khác, rồi nén.",
+ },
+ "social-square": {
+ name: "Vuông mạng xã hội",
+ description: "Cắt thành hình vuông 1:1 và nén cho bài đăng mạng xã hội.",
+ },
+ "watermark-batch": {
+ name: "Đóng dấu mờ hàng loạt",
+ description: "Đóng dấu mờ văn bản lên ảnh, rồi nén.",
+ },
+ "shrink-pdf-email": {
+ name: "Thu nhỏ PDF cho email",
+ description: "Làm phẳng và nén mạnh tệp PDF để vừa với giới hạn email.",
+ },
+ "podcast-polish": {
+ name: "Hoàn thiện podcast",
+ description: "Loại bỏ khoảng lặng, chuẩn hóa độ lớn và thêm hiệu ứng mờ dần vào bản ghi.",
+ },
+ "cut-out-subject": {
+ name: "Tách chủ thể",
+ description: "Xóa nền bằng AI và nén ảnh tách nền trong suốt.",
+ },
+ "restore-old-photo": {
+ name: "Phục hồi ảnh cũ",
+ description: "Sửa chữa, tô màu và phóng to ảnh cũ hoặc hư hỏng bằng AI.",
+ },
+ },
} as const;
diff --git a/packages/shared/src/i18n/zh-CN.ts b/packages/shared/src/i18n/zh-CN.ts
index 8bd17c57..0b311620 100644
--- a/packages/shared/src/i18n/zh-CN.ts
+++ b/packages/shared/src/i18n/zh-CN.ts
@@ -73,6 +73,175 @@ export const zhCN: TranslationKeys = {
documentsAndFiles: "PDF 与文件",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": { name: "JPG 转 PNG", description: "在线将 JPG 转换为 PNG。快速、免费、私密。" },
+ "png-to-jpg": { name: "PNG 转 JPG", description: "在线将 PNG 转换为 JPG。快速、免费、私密。" },
+ "jpg-to-webp": {
+ name: "JPG 转 WebP",
+ description: "在线将 JPG 转换为 WebP。快速、免费、私密。",
+ },
+ "png-to-webp": {
+ name: "PNG 转 WebP",
+ description: "在线将 PNG 转换为 WebP。快速、免费、私密。",
+ },
+ "webp-to-jpg": {
+ name: "WebP 转 JPG",
+ description: "在线将 WebP 转换为 JPG。快速、免费、私密。",
+ },
+ "webp-to-png": {
+ name: "WebP 转 PNG",
+ description: "在线将 WebP 转换为 PNG。快速、免费、私密。",
+ },
+ "jpg-to-avif": {
+ name: "JPG 转 AVIF",
+ description: "在线将 JPG 转换为 AVIF。快速、免费、私密。",
+ },
+ "png-to-avif": {
+ name: "PNG 转 AVIF",
+ description: "在线将 PNG 转换为 AVIF。快速、免费、私密。",
+ },
+ "webp-to-avif": {
+ name: "WebP 转 AVIF",
+ description: "在线将 WebP 转换为 AVIF。快速、免费、私密。",
+ },
+ "heic-to-jpg": {
+ name: "HEIC 转 JPG",
+ description: "在线将 HEIC 转换为 JPG。快速、免费、私密。",
+ },
+ "heic-to-png": {
+ name: "HEIC 转 PNG",
+ description: "在线将 HEIC 转换为 PNG。快速、免费、私密。",
+ },
+ "heic-to-avif": {
+ name: "HEIC 转 AVIF",
+ description: "在线将 HEIC 转换为 AVIF。快速、免费、私密。",
+ },
+ "jpg-to-gif": { name: "JPG 转 GIF", description: "在线将 JPG 转换为 GIF。快速、免费、私密。" },
+ "png-to-gif": { name: "PNG 转 GIF", description: "在线将 PNG 转换为 GIF。快速、免费、私密。" },
+ "gif-to-jpg": { name: "GIF 转 JPG", description: "在线将 GIF 转换为 JPG。快速、免费、私密。" },
+ "gif-to-png": { name: "GIF 转 PNG", description: "在线将 GIF 转换为 PNG。快速、免费、私密。" },
+ "webp-to-gif": {
+ name: "WebP 转 GIF",
+ description: "在线将 WebP 转换为 GIF。快速、免费、私密。",
+ },
+ "jpg-to-tiff": {
+ name: "JPG 转 TIFF",
+ description: "在线将 JPG 转换为 TIFF。快速、免费、私密。",
+ },
+ "png-to-tiff": {
+ name: "PNG 转 TIFF",
+ description: "在线将 PNG 转换为 TIFF。快速、免费、私密。",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF 转 JPG",
+ description: "在线将 TIFF 转换为 JPG。快速、免费、私密。",
+ },
+ "tiff-to-png": {
+ name: "TIFF 转 PNG",
+ description: "在线将 TIFF 转换为 PNG。快速、免费、私密。",
+ },
+ "psd-to-jpg": { name: "PSD 转 JPG", description: "在线将 PSD 转换为 JPG。快速、免费、私密。" },
+ "psd-to-png": { name: "PSD 转 PNG", description: "在线将 PSD 转换为 PNG。快速、免费、私密。" },
+ "png-to-eps": { name: "PNG 转 EPS", description: "在线将 PNG 转换为 EPS。快速、免费、私密。" },
+ "jpg-to-eps": { name: "JPG 转 EPS", description: "在线将 JPG 转换为 EPS。快速、免费、私密。" },
+ "eps-to-png": { name: "EPS 转 PNG", description: "在线将 EPS 转换为 PNG。快速、免费、私密。" },
+ "eps-to-jpg": { name: "EPS 转 JPG", description: "在线将 EPS 转换为 JPG。快速、免费、私密。" },
+ "png-to-svg": { name: "PNG 转 SVG", description: "在线将 PNG 转换为 SVG。快速、免费、私密。" },
+ "jpg-to-svg": { name: "JPG 转 SVG", description: "在线将 JPG 转换为 SVG。快速、免费、私密。" },
+ "tiff-to-svg": {
+ name: "TIFF 转 SVG",
+ description: "在线将 TIFF 转换为 SVG。快速、免费、私密。",
+ },
+ "psd-to-svg": { name: "PSD 转 SVG", description: "在线将 PSD 转换为 SVG。快速、免费、私密。" },
+ "eps-to-svg": { name: "EPS 转 SVG", description: "在线将 EPS 转换为 SVG。快速、免费、私密。" },
+ "svg-to-png": { name: "SVG 转 PNG", description: "在线将 SVG 转换为 PNG。快速、免费、私密。" },
+ "svg-to-jpg": { name: "SVG 转 JPG", description: "在线将 SVG 转换为 JPG。快速、免费、私密。" },
+ "jpg-to-pdf": { name: "JPG 转 PDF", description: "在线将 JPG 转换为 PDF。快速、免费、私密。" },
+ "png-to-pdf": { name: "PNG 转 PDF", description: "在线将 PNG 转换为 PDF。快速、免费、私密。" },
+ "heic-to-pdf": {
+ name: "HEIC 转 PDF",
+ description: "在线将 HEIC 转换为 PDF。快速、免费、私密。",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF 转 PDF",
+ description: "在线将 TIFF 转换为 PDF。快速、免费、私密。",
+ },
+ "webp-to-pdf": {
+ name: "WebP 转 PDF",
+ description: "在线将 WebP 转换为 PDF。快速、免费、私密。",
+ },
+ "gif-to-pdf": { name: "GIF 转 PDF", description: "在线将 GIF 转换为 PDF。快速、免费、私密。" },
+ "eps-to-pdf": { name: "EPS 转 PDF", description: "在线将 EPS 转换为 PDF。快速、免费、私密。" },
+ "pdf-to-jpg": { name: "PDF 转 JPG", description: "在线将 PDF 转换为 JPG。快速、免费、私密。" },
+ "pdf-to-png": { name: "PDF 转 PNG", description: "在线将 PDF 转换为 PNG。快速、免费、私密。" },
+ "pdf-to-tiff": {
+ name: "PDF 转 TIFF",
+ description: "在线将 PDF 转换为 TIFF。快速、免费、私密。",
+ },
+ "mov-to-mp4": { name: "MOV 转 MP4", description: "在线将 MOV 转换为 MP4。快速、免费、私密。" },
+ "webm-to-mp4": {
+ name: "WEBM 转 MP4",
+ description: "在线将 WEBM 转换为 MP4。快速、免费、私密。",
+ },
+ "mkv-to-mp4": { name: "MKV 转 MP4", description: "在线将 MKV 转换为 MP4。快速、免费、私密。" },
+ "avi-to-mp4": { name: "AVI 转 MP4", description: "在线将 AVI 转换为 MP4。快速、免费、私密。" },
+ "mp4-to-mov": { name: "MP4 转 MOV", description: "在线将 MP4 转换为 MOV。快速、免费、私密。" },
+ "mp4-to-webm": {
+ name: "MP4 转 WEBM",
+ description: "在线将 MP4 转换为 WEBM。快速、免费、私密。",
+ },
+ "webm-to-mov": {
+ name: "WEBM 转 MOV",
+ description: "在线将 WEBM 转换为 MOV。快速、免费、私密。",
+ },
+ "mkv-to-mov": { name: "MKV 转 MOV", description: "在线将 MKV 转换为 MOV。快速、免费、私密。" },
+ "avi-to-mov": { name: "AVI 转 MOV", description: "在线将 AVI 转换为 MOV。快速、免费、私密。" },
+ "mp4-to-avi": { name: "MP4 转 AVI", description: "在线将 MP4 转换为 AVI。快速、免费、私密。" },
+ "mov-to-avi": { name: "MOV 转 AVI", description: "在线将 MOV 转换为 AVI。快速、免费、私密。" },
+ "mkv-to-avi": { name: "MKV 转 AVI", description: "在线将 MKV 转换为 AVI。快速、免费、私密。" },
+ "avi-to-mkv": { name: "AVI 转 MKV", description: "在线将 AVI 转换为 MKV。快速、免费、私密。" },
+ "mp4-to-gif": { name: "MP4 转 GIF", description: "在线将 MP4 转换为 GIF。快速、免费、私密。" },
+ "mov-to-gif": { name: "MOV 转 GIF", description: "在线将 MOV 转换为 GIF。快速、免费、私密。" },
+ "mkv-to-gif": { name: "MKV 转 GIF", description: "在线将 MKV 转换为 GIF。快速、免费、私密。" },
+ "avi-to-gif": { name: "AVI 转 GIF", description: "在线将 AVI 转换为 GIF。快速、免费、私密。" },
+ "gif-to-mp4": { name: "GIF 转 MP4", description: "在线将 GIF 转换为 MP4。快速、免费、私密。" },
+ "gif-to-webm": {
+ name: "GIF 转 WEBM",
+ description: "在线将 GIF 转换为 WEBM。快速、免费、私密。",
+ },
+ "gif-to-mov": { name: "GIF 转 MOV", description: "在线将 GIF 转换为 MOV。快速、免费、私密。" },
+ "mp4-to-mp3": { name: "MP4 转 MP3", description: "在线将 MP4 转换为 MP3。快速、免费、私密。" },
+ "mov-to-mp3": { name: "MOV 转 MP3", description: "在线将 MOV 转换为 MP3。快速、免费、私密。" },
+ "mkv-to-mp3": { name: "MKV 转 MP3", description: "在线将 MKV 转换为 MP3。快速、免费、私密。" },
+ "webm-to-mp3": {
+ name: "WEBM 转 MP3",
+ description: "在线将 WEBM 转换为 MP3。快速、免费、私密。",
+ },
+ "avi-to-mp3": { name: "AVI 转 MP3", description: "在线将 AVI 转换为 MP3。快速、免费、私密。" },
+ "mp4-to-wav": { name: "MP4 转 WAV", description: "在线将 MP4 转换为 WAV。快速、免费、私密。" },
+ "mov-to-wav": { name: "MOV 转 WAV", description: "在线将 MOV 转换为 WAV。快速、免费、私密。" },
+ "mp4-to-ogg": { name: "MP4 转 OGG", description: "在线将 MP4 转换为 OGG。快速、免费、私密。" },
+ "m4a-to-mp3": { name: "M4A 转 MP3", description: "在线将 M4A 转换为 MP3。快速、免费、私密。" },
+ "m4a-to-wav": { name: "M4A 转 WAV", description: "在线将 M4A 转换为 WAV。快速、免费、私密。" },
+ "aac-to-mp3": { name: "AAC 转 MP3", description: "在线将 AAC 转换为 MP3。快速、免费、私密。" },
+ "aac-to-wav": { name: "AAC 转 WAV", description: "在线将 AAC 转换为 WAV。快速、免费、私密。" },
+ "aac-to-flac": {
+ name: "AAC 转 FLAC",
+ description: "在线将 AAC 转换为 FLAC。快速、免费、私密。",
+ },
+ "ogg-to-mp3": { name: "OGG 转 MP3", description: "在线将 OGG 转换为 MP3。快速、免费、私密。" },
+ "ogg-to-wav": { name: "OGG 转 WAV", description: "在线将 OGG 转换为 WAV。快速、免费、私密。" },
+ "wav-to-mp3": { name: "WAV 转 MP3", description: "在线将 WAV 转换为 MP3。快速、免费、私密。" },
+ "mp3-to-wav": { name: "MP3 转 WAV", description: "在线将 MP3 转换为 WAV。快速、免费、私密。" },
+ "flac-to-mp3": {
+ name: "FLAC 转 MP3",
+ description: "在线将 FLAC 转换为 MP3。快速、免费、私密。",
+ },
+ "excel-to-csv": {
+ name: "Excel 转 CSV",
+ description: "在线将 Excel 转换为 CSV。快速、免费、私密。",
+ },
+ // END conversion-presets
resize: {
name: "调整大小",
description: "按像素、百分比或社交媒体预设调整大小",
@@ -126,7 +295,7 @@ export const zhCN: TranslationKeys = {
upscale: { name: "图片放大", description: "AI 超分辨率增强" },
"erase-object": { name: "物体擦除", description: "AI 智能移除不需要的物体" },
ocr: {
- name: "OCR / 文字提取",
+ name: "从图片提取文字 (OCR)",
description: "AI 高精度图片文字识别",
},
"ocr-pdf": {
@@ -2676,6 +2845,14 @@ export const zhCN: TranslationKeys = {
supportBundleDescription: "下载包含脱敏配置、日志和任务数据的诊断压缩包,用于故障排查。",
supportBundleFailed: "下载支持包失败。",
},
+ privacy: {
+ title: "隐私",
+ description:
+ "匿名产品分析有助于改进 SnapOtter。该功能默认开启,并由管理员为整个实例统一设置。",
+ analyticsLabel: "匿名产品分析",
+ analyticsDescription:
+ "共享匿名使用数据(运行了哪些工具、时长、错误代码)和崩溃报告。不含 IP 地址,不含账户身份。我们绝不收集您的文件名、文件内容、OCR 输出、图像元数据或文档文本。关闭此项即可停止所有这些收集。",
+ },
security: {
heading: "安全",
description: "密码和认证设置。",
@@ -2959,7 +3136,7 @@ export const zhCN: TranslationKeys = {
heading: "关于",
appName: "SnapOtter",
appDescription:
- "自托管、隐私优先的文件处理套件,包含 157 种工具。转换、压缩、编辑、转录、OCR,自动化图片、视频、音频、文档和数据工作流,无需将数据发送到云端。",
+ "自托管、隐私优先的文件处理套件,包含 240 种工具。转换、压缩、编辑、转录、OCR,自动化图片、视频、音频、文档和数据工作流,无需将数据发送到云端。",
versionLabel: "版本:",
linksHeading: "链接",
githubLink: "GitHub 仓库",
@@ -3014,7 +3191,7 @@ export const zhCN: TranslationKeys = {
"无限制,无隐藏上限。",
"完全离线可用。",
"无限批量处理。",
- "157 种工具。",
+ "240 种工具。",
"15 个 AI 模型,在你自己的设备上运行。",
"基于 Sharp 构建,闪电般快速。",
"支持内网隔离部署。",
@@ -3077,6 +3254,7 @@ export const zhCN: TranslationKeys = {
toolPalette: "工具面板",
clickToAdd: "点击添加到 Pipeline",
savedLabel: "已保存",
+ templatesLabel: "模板",
importButton: "导入",
noSavedPipelines: "暂无已保存的 Pipeline",
stepCount: "({count} 个步骤)",
@@ -3359,6 +3537,44 @@ export const zhCN: TranslationKeys = {
navigationMenu: "导航",
homeLink: "SnapOtter 首页",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "网页优化",
+ description: "调整尺寸、转换为 WebP 并压缩图片,以便在网页上快速加载。",
+ },
+ "email-friendly": {
+ name: "适合邮件",
+ description: "将图片缩小到足够小,以便附加到电子邮件中。",
+ },
+ "privacy-scrub": {
+ name: "隐私清理",
+ description: "去除 EXIF、GPS 和其他元数据,然后压缩。",
+ },
+ "social-square": {
+ name: "社交方图",
+ description: "裁剪为 1:1 方形并压缩,用于社交媒体帖子。",
+ },
+ "watermark-batch": {
+ name: "批量水印",
+ description: "在图片上加盖文字水印,然后压缩。",
+ },
+ "shrink-pdf-email": {
+ name: "为邮件缩小 PDF",
+ description: "拼合并大力压缩 PDF,使其符合邮件大小限制。",
+ },
+ "podcast-polish": {
+ name: "播客润色",
+ description: "去除静音、统一响度,并为录音添加淡入淡出。",
+ },
+ "cut-out-subject": {
+ name: "抠出主体",
+ description: "用 AI 去除背景,并压缩透明的抠图。",
+ },
+ "restore-old-photo": {
+ name: "修复老照片",
+ description: "用 AI 修复、上色并放大老旧或受损的照片。",
+ },
+ },
} as const;
export default zhCN;
diff --git a/packages/shared/src/i18n/zh-TW.ts b/packages/shared/src/i18n/zh-TW.ts
index fc0e4036..f30b81e7 100644
--- a/packages/shared/src/i18n/zh-TW.ts
+++ b/packages/shared/src/i18n/zh-TW.ts
@@ -73,6 +73,175 @@ export const zhTW: TranslationKeys = {
documentsAndFiles: "PDF 與檔案",
},
tools: {
+ // BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
+ "jpg-to-png": { name: "JPG 轉 PNG", description: "線上將 JPG 轉換為 PNG。快速、免費、私密。" },
+ "png-to-jpg": { name: "PNG 轉 JPG", description: "線上將 PNG 轉換為 JPG。快速、免費、私密。" },
+ "jpg-to-webp": {
+ name: "JPG 轉 WebP",
+ description: "線上將 JPG 轉換為 WebP。快速、免費、私密。",
+ },
+ "png-to-webp": {
+ name: "PNG 轉 WebP",
+ description: "線上將 PNG 轉換為 WebP。快速、免費、私密。",
+ },
+ "webp-to-jpg": {
+ name: "WebP 轉 JPG",
+ description: "線上將 WebP 轉換為 JPG。快速、免費、私密。",
+ },
+ "webp-to-png": {
+ name: "WebP 轉 PNG",
+ description: "線上將 WebP 轉換為 PNG。快速、免費、私密。",
+ },
+ "jpg-to-avif": {
+ name: "JPG 轉 AVIF",
+ description: "線上將 JPG 轉換為 AVIF。快速、免費、私密。",
+ },
+ "png-to-avif": {
+ name: "PNG 轉 AVIF",
+ description: "線上將 PNG 轉換為 AVIF。快速、免費、私密。",
+ },
+ "webp-to-avif": {
+ name: "WebP 轉 AVIF",
+ description: "線上將 WebP 轉換為 AVIF。快速、免費、私密。",
+ },
+ "heic-to-jpg": {
+ name: "HEIC 轉 JPG",
+ description: "線上將 HEIC 轉換為 JPG。快速、免費、私密。",
+ },
+ "heic-to-png": {
+ name: "HEIC 轉 PNG",
+ description: "線上將 HEIC 轉換為 PNG。快速、免費、私密。",
+ },
+ "heic-to-avif": {
+ name: "HEIC 轉 AVIF",
+ description: "線上將 HEIC 轉換為 AVIF。快速、免費、私密。",
+ },
+ "jpg-to-gif": { name: "JPG 轉 GIF", description: "線上將 JPG 轉換為 GIF。快速、免費、私密。" },
+ "png-to-gif": { name: "PNG 轉 GIF", description: "線上將 PNG 轉換為 GIF。快速、免費、私密。" },
+ "gif-to-jpg": { name: "GIF 轉 JPG", description: "線上將 GIF 轉換為 JPG。快速、免費、私密。" },
+ "gif-to-png": { name: "GIF 轉 PNG", description: "線上將 GIF 轉換為 PNG。快速、免費、私密。" },
+ "webp-to-gif": {
+ name: "WebP 轉 GIF",
+ description: "線上將 WebP 轉換為 GIF。快速、免費、私密。",
+ },
+ "jpg-to-tiff": {
+ name: "JPG 轉 TIFF",
+ description: "線上將 JPG 轉換為 TIFF。快速、免費、私密。",
+ },
+ "png-to-tiff": {
+ name: "PNG 轉 TIFF",
+ description: "線上將 PNG 轉換為 TIFF。快速、免費、私密。",
+ },
+ "tiff-to-jpg": {
+ name: "TIFF 轉 JPG",
+ description: "線上將 TIFF 轉換為 JPG。快速、免費、私密。",
+ },
+ "tiff-to-png": {
+ name: "TIFF 轉 PNG",
+ description: "線上將 TIFF 轉換為 PNG。快速、免費、私密。",
+ },
+ "psd-to-jpg": { name: "PSD 轉 JPG", description: "線上將 PSD 轉換為 JPG。快速、免費、私密。" },
+ "psd-to-png": { name: "PSD 轉 PNG", description: "線上將 PSD 轉換為 PNG。快速、免費、私密。" },
+ "png-to-eps": { name: "PNG 轉 EPS", description: "線上將 PNG 轉換為 EPS。快速、免費、私密。" },
+ "jpg-to-eps": { name: "JPG 轉 EPS", description: "線上將 JPG 轉換為 EPS。快速、免費、私密。" },
+ "eps-to-png": { name: "EPS 轉 PNG", description: "線上將 EPS 轉換為 PNG。快速、免費、私密。" },
+ "eps-to-jpg": { name: "EPS 轉 JPG", description: "線上將 EPS 轉換為 JPG。快速、免費、私密。" },
+ "png-to-svg": { name: "PNG 轉 SVG", description: "線上將 PNG 轉換為 SVG。快速、免費、私密。" },
+ "jpg-to-svg": { name: "JPG 轉 SVG", description: "線上將 JPG 轉換為 SVG。快速、免費、私密。" },
+ "tiff-to-svg": {
+ name: "TIFF 轉 SVG",
+ description: "線上將 TIFF 轉換為 SVG。快速、免費、私密。",
+ },
+ "psd-to-svg": { name: "PSD 轉 SVG", description: "線上將 PSD 轉換為 SVG。快速、免費、私密。" },
+ "eps-to-svg": { name: "EPS 轉 SVG", description: "線上將 EPS 轉換為 SVG。快速、免費、私密。" },
+ "svg-to-png": { name: "SVG 轉 PNG", description: "線上將 SVG 轉換為 PNG。快速、免費、私密。" },
+ "svg-to-jpg": { name: "SVG 轉 JPG", description: "線上將 SVG 轉換為 JPG。快速、免費、私密。" },
+ "jpg-to-pdf": { name: "JPG 轉 PDF", description: "線上將 JPG 轉換為 PDF。快速、免費、私密。" },
+ "png-to-pdf": { name: "PNG 轉 PDF", description: "線上將 PNG 轉換為 PDF。快速、免費、私密。" },
+ "heic-to-pdf": {
+ name: "HEIC 轉 PDF",
+ description: "線上將 HEIC 轉換為 PDF。快速、免費、私密。",
+ },
+ "tiff-to-pdf": {
+ name: "TIFF 轉 PDF",
+ description: "線上將 TIFF 轉換為 PDF。快速、免費、私密。",
+ },
+ "webp-to-pdf": {
+ name: "WebP 轉 PDF",
+ description: "線上將 WebP 轉換為 PDF。快速、免費、私密。",
+ },
+ "gif-to-pdf": { name: "GIF 轉 PDF", description: "線上將 GIF 轉換為 PDF。快速、免費、私密。" },
+ "eps-to-pdf": { name: "EPS 轉 PDF", description: "線上將 EPS 轉換為 PDF。快速、免費、私密。" },
+ "pdf-to-jpg": { name: "PDF 轉 JPG", description: "線上將 PDF 轉換為 JPG。快速、免費、私密。" },
+ "pdf-to-png": { name: "PDF 轉 PNG", description: "線上將 PDF 轉換為 PNG。快速、免費、私密。" },
+ "pdf-to-tiff": {
+ name: "PDF 轉 TIFF",
+ description: "線上將 PDF 轉換為 TIFF。快速、免費、私密。",
+ },
+ "mov-to-mp4": { name: "MOV 轉 MP4", description: "線上將 MOV 轉換為 MP4。快速、免費、私密。" },
+ "webm-to-mp4": {
+ name: "WEBM 轉 MP4",
+ description: "線上將 WEBM 轉換為 MP4。快速、免費、私密。",
+ },
+ "mkv-to-mp4": { name: "MKV 轉 MP4", description: "線上將 MKV 轉換為 MP4。快速、免費、私密。" },
+ "avi-to-mp4": { name: "AVI 轉 MP4", description: "線上將 AVI 轉換為 MP4。快速、免費、私密。" },
+ "mp4-to-mov": { name: "MP4 轉 MOV", description: "線上將 MP4 轉換為 MOV。快速、免費、私密。" },
+ "mp4-to-webm": {
+ name: "MP4 轉 WEBM",
+ description: "線上將 MP4 轉換為 WEBM。快速、免費、私密。",
+ },
+ "webm-to-mov": {
+ name: "WEBM 轉 MOV",
+ description: "線上將 WEBM 轉換為 MOV。快速、免費、私密。",
+ },
+ "mkv-to-mov": { name: "MKV 轉 MOV", description: "線上將 MKV 轉換為 MOV。快速、免費、私密。" },
+ "avi-to-mov": { name: "AVI 轉 MOV", description: "線上將 AVI 轉換為 MOV。快速、免費、私密。" },
+ "mp4-to-avi": { name: "MP4 轉 AVI", description: "線上將 MP4 轉換為 AVI。快速、免費、私密。" },
+ "mov-to-avi": { name: "MOV 轉 AVI", description: "線上將 MOV 轉換為 AVI。快速、免費、私密。" },
+ "mkv-to-avi": { name: "MKV 轉 AVI", description: "線上將 MKV 轉換為 AVI。快速、免費、私密。" },
+ "avi-to-mkv": { name: "AVI 轉 MKV", description: "線上將 AVI 轉換為 MKV。快速、免費、私密。" },
+ "mp4-to-gif": { name: "MP4 轉 GIF", description: "線上將 MP4 轉換為 GIF。快速、免費、私密。" },
+ "mov-to-gif": { name: "MOV 轉 GIF", description: "線上將 MOV 轉換為 GIF。快速、免費、私密。" },
+ "mkv-to-gif": { name: "MKV 轉 GIF", description: "線上將 MKV 轉換為 GIF。快速、免費、私密。" },
+ "avi-to-gif": { name: "AVI 轉 GIF", description: "線上將 AVI 轉換為 GIF。快速、免費、私密。" },
+ "gif-to-mp4": { name: "GIF 轉 MP4", description: "線上將 GIF 轉換為 MP4。快速、免費、私密。" },
+ "gif-to-webm": {
+ name: "GIF 轉 WEBM",
+ description: "線上將 GIF 轉換為 WEBM。快速、免費、私密。",
+ },
+ "gif-to-mov": { name: "GIF 轉 MOV", description: "線上將 GIF 轉換為 MOV。快速、免費、私密。" },
+ "mp4-to-mp3": { name: "MP4 轉 MP3", description: "線上將 MP4 轉換為 MP3。快速、免費、私密。" },
+ "mov-to-mp3": { name: "MOV 轉 MP3", description: "線上將 MOV 轉換為 MP3。快速、免費、私密。" },
+ "mkv-to-mp3": { name: "MKV 轉 MP3", description: "線上將 MKV 轉換為 MP3。快速、免費、私密。" },
+ "webm-to-mp3": {
+ name: "WEBM 轉 MP3",
+ description: "線上將 WEBM 轉換為 MP3。快速、免費、私密。",
+ },
+ "avi-to-mp3": { name: "AVI 轉 MP3", description: "線上將 AVI 轉換為 MP3。快速、免費、私密。" },
+ "mp4-to-wav": { name: "MP4 轉 WAV", description: "線上將 MP4 轉換為 WAV。快速、免費、私密。" },
+ "mov-to-wav": { name: "MOV 轉 WAV", description: "線上將 MOV 轉換為 WAV。快速、免費、私密。" },
+ "mp4-to-ogg": { name: "MP4 轉 OGG", description: "線上將 MP4 轉換為 OGG。快速、免費、私密。" },
+ "m4a-to-mp3": { name: "M4A 轉 MP3", description: "線上將 M4A 轉換為 MP3。快速、免費、私密。" },
+ "m4a-to-wav": { name: "M4A 轉 WAV", description: "線上將 M4A 轉換為 WAV。快速、免費、私密。" },
+ "aac-to-mp3": { name: "AAC 轉 MP3", description: "線上將 AAC 轉換為 MP3。快速、免費、私密。" },
+ "aac-to-wav": { name: "AAC 轉 WAV", description: "線上將 AAC 轉換為 WAV。快速、免費、私密。" },
+ "aac-to-flac": {
+ name: "AAC 轉 FLAC",
+ description: "線上將 AAC 轉換為 FLAC。快速、免費、私密。",
+ },
+ "ogg-to-mp3": { name: "OGG 轉 MP3", description: "線上將 OGG 轉換為 MP3。快速、免費、私密。" },
+ "ogg-to-wav": { name: "OGG 轉 WAV", description: "線上將 OGG 轉換為 WAV。快速、免費、私密。" },
+ "wav-to-mp3": { name: "WAV 轉 MP3", description: "線上將 WAV 轉換為 MP3。快速、免費、私密。" },
+ "mp3-to-wav": { name: "MP3 轉 WAV", description: "線上將 MP3 轉換為 WAV。快速、免費、私密。" },
+ "flac-to-mp3": {
+ name: "FLAC 轉 MP3",
+ description: "線上將 FLAC 轉換為 MP3。快速、免費、私密。",
+ },
+ "excel-to-csv": {
+ name: "Excel 轉 CSV",
+ description: "線上將 Excel 轉換為 CSV。快速、免費、私密。",
+ },
+ // END conversion-presets
resize: {
name: "調整大小",
description: "依像素、百分比或社群媒體預設調整大小",
@@ -126,7 +295,7 @@ export const zhTW: TranslationKeys = {
upscale: { name: "影像放大", description: "AI超解析度增強" },
"erase-object": { name: "物件擦除", description: "用AI移除不需要的物件" },
ocr: {
- name: "OCR / 文字擷取",
+ name: "從圖片擷取文字 (OCR)",
description: "透過AI精準辨識擷取影像中的文字",
},
"ocr-pdf": {
@@ -2674,6 +2843,14 @@ export const zhTW: TranslationKeys = {
supportBundleDescription: "下載包含已遮蔽設定、記錄檔及工作資料的診斷壓縮檔,用於問題排解。",
supportBundleFailed: "下載支援包失敗。",
},
+ privacy: {
+ title: "隱私",
+ description:
+ "匿名產品分析有助於改進 SnapOtter。此功能預設開啟,並由管理員為整個實例統一設定。",
+ analyticsLabel: "匿名產品分析",
+ analyticsDescription:
+ "分享匿名使用資料(執行了哪些工具、時長、錯誤代碼)與當機報告。不含 IP 位址,不含帳戶身分。我們絕不收集您的檔案名稱、檔案內容、OCR 輸出、影像中繼資料或文件文字。關閉此項即可停止上述所有收集。",
+ },
security: {
heading: "安全性",
description: "密碼和驗證設定。",
@@ -2957,7 +3134,7 @@ export const zhTW: TranslationKeys = {
heading: "關於",
appName: "SnapOtter",
appDescription:
- "自架式、隱私優先的檔案處理套件,內含157個工具。轉檔、壓縮、編輯、轉錄、OCR,自動化影像、影片、音訊、文件和資料工作流程,無需將資料傳送到雲端。",
+ "自架式、隱私優先的檔案處理套件,內含240個工具。轉檔、壓縮、編輯、轉錄、OCR,自動化影像、影片、音訊、文件和資料工作流程,無需將資料傳送到雲端。",
versionLabel: "版本:",
linksHeading: "連結",
githubLink: "GitHub儲存庫",
@@ -3013,7 +3190,7 @@ export const zhTW: TranslationKeys = {
"無限制,無隱藏上限。",
"完全離線可用。",
"無限批次處理。",
- "157個工具。",
+ "240個工具。",
"15個AI模型,在你的硬體上執行。",
"極速處理,基於Sharp打造。",
"支援內網部署。",
@@ -3076,6 +3253,7 @@ export const zhTW: TranslationKeys = {
toolPalette: "工具面板",
clickToAdd: "點擊加入到Pipeline",
savedLabel: "已儲存",
+ templatesLabel: "範本",
importButton: "匯入",
noSavedPipelines: "沒有已儲存的Pipeline",
stepCount: "({count}個步驟)",
@@ -3359,6 +3537,44 @@ export const zhTW: TranslationKeys = {
navigationMenu: "導覽選單",
homeLink: "SnapOtter 首頁",
},
+ pipelineTemplates: {
+ "web-optimize": {
+ name: "網頁最佳化",
+ description: "調整尺寸、轉換為 WebP 並壓縮影像,以便在網頁上快速載入。",
+ },
+ "email-friendly": {
+ name: "適合電子郵件",
+ description: "將影像縮小到足夠小,以便附加到電子郵件中。",
+ },
+ "privacy-scrub": {
+ name: "隱私清理",
+ description: "移除 EXIF、GPS 和其他中繼資料,然後壓縮。",
+ },
+ "social-square": {
+ name: "社群方形",
+ description: "裁切為 1:1 方形並壓縮,用於社群媒體貼文。",
+ },
+ "watermark-batch": {
+ name: "批次浮水印",
+ description: "在影像上加上文字浮水印,然後壓縮。",
+ },
+ "shrink-pdf-email": {
+ name: "為電子郵件縮小 PDF",
+ description: "平面化並大幅壓縮 PDF,使其符合電子郵件大小限制。",
+ },
+ "podcast-polish": {
+ name: "播客潤飾",
+ description: "移除靜音、統一響度,並為錄音加入淡入淡出。",
+ },
+ "cut-out-subject": {
+ name: "去背主體",
+ description: "用 AI 移除背景,並壓縮透明的去背圖。",
+ },
+ "restore-old-photo": {
+ name: "修復老照片",
+ description: "用 AI 修復、上色並放大老舊或受損的照片。",
+ },
+ },
} as const;
export default zhTW;
diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts
index 247aa023..1eb90764 100644
--- a/packages/shared/src/index.ts
+++ b/packages/shared/src/index.ts
@@ -3,9 +3,12 @@ export * from "./analytics/events.js";
export * from "./analytics/types.js";
export * from "./audit-events.js";
export * from "./constants.js";
+export * from "./conversion-presets.js";
export * from "./features.js";
export * from "./i18n/index.js";
export * from "./modality.js";
export * from "./permissions.js";
+export * from "./pipeline-templates.js";
+export * from "./search/format-aliases.js";
export * from "./section.js";
export * from "./types.js";
diff --git a/packages/shared/src/pipeline-templates.ts b/packages/shared/src/pipeline-templates.ts
new file mode 100644
index 00000000..5a2d77f7
--- /dev/null
+++ b/packages/shared/src/pipeline-templates.ts
@@ -0,0 +1,125 @@
+import { getRequiredBundlesForTool } from "./features.js";
+import type { Modality } from "./modality.js";
+
+export interface PipelineTemplateStep {
+ toolId: string;
+ settings: Record;
+}
+
+export interface PipelineTemplate {
+ /** Stable id; also the key into the `pipelineTemplates` i18n namespace. */
+ id: string;
+ /** Primary modality, used for grouping in the Automate UI. */
+ modality: Modality;
+ steps: PipelineTemplateStep[];
+}
+
+export const PIPELINE_TEMPLATES: PipelineTemplate[] = [
+ {
+ id: "web-optimize",
+ modality: "image",
+ steps: [
+ { toolId: "resize", settings: { width: 1920, fit: "inside", withoutEnlargement: true } },
+ { toolId: "convert", settings: { format: "webp", quality: 80 } },
+ ],
+ },
+ {
+ id: "email-friendly",
+ modality: "image",
+ steps: [
+ { toolId: "resize", settings: { width: 1024, fit: "inside", withoutEnlargement: true } },
+ { toolId: "compress", settings: { mode: "quality", quality: 70 } },
+ ],
+ },
+ {
+ id: "privacy-scrub",
+ modality: "image",
+ steps: [
+ { toolId: "strip-metadata", settings: { stripAll: true } },
+ { toolId: "compress", settings: { mode: "quality", quality: 85 } },
+ ],
+ },
+ {
+ id: "social-square",
+ modality: "image",
+ steps: [
+ { toolId: "resize", settings: { width: 1080, height: 1080, fit: "cover" } },
+ { toolId: "compress", settings: { mode: "quality", quality: 80 } },
+ ],
+ },
+ {
+ id: "watermark-batch",
+ modality: "image",
+ steps: [
+ {
+ toolId: "watermark-text",
+ settings: { text: "Your watermark", position: "bottom-right", opacity: 50 },
+ },
+ { toolId: "compress", settings: { mode: "quality", quality: 80 } },
+ ],
+ },
+ {
+ id: "shrink-pdf-email",
+ modality: "document",
+ steps: [
+ { toolId: "flatten-pdf", settings: {} },
+ { toolId: "compress-pdf", settings: { mode: "quality", quality: 50 } },
+ ],
+ },
+ {
+ id: "podcast-polish",
+ modality: "audio",
+ steps: [
+ { toolId: "silence-removal", settings: { thresholdDb: -50, minSilenceS: 0.5 } },
+ { toolId: "normalize-audio", settings: {} },
+ { toolId: "fade-audio", settings: { fadeInS: 2, fadeOutS: 2 } },
+ ],
+ },
+ {
+ id: "cut-out-subject",
+ modality: "image",
+ steps: [
+ {
+ toolId: "remove-background",
+ settings: {
+ backgroundType: "transparent",
+ outputFormat: "webp",
+ edgeRefine: 1,
+ decontaminate: true,
+ },
+ },
+ { toolId: "compress", settings: { mode: "quality", quality: 90 } },
+ ],
+ },
+ {
+ id: "restore-old-photo",
+ modality: "image",
+ steps: [
+ {
+ toolId: "restore-photo",
+ settings: {
+ scratchRemoval: true,
+ faceEnhancement: true,
+ fidelity: 0.7,
+ denoise: true,
+ denoiseStrength: 25,
+ colorize: false,
+ colorizeStrength: 85,
+ },
+ },
+ { toolId: "colorize", settings: { intensity: 1, model: "auto" } },
+ { toolId: "upscale", settings: { scale: 2 } },
+ ],
+ },
+];
+
+/** Union of model bundles required by a template's steps (empty for OOTB templates). */
+export function templateRequiredBundles(template: PipelineTemplate): string[] {
+ const bundles = new Set();
+ for (const step of template.steps) {
+ for (const bundleId of getRequiredBundlesForTool(step.toolId)) {
+ bundles.add(bundleId);
+ }
+ }
+ return [...bundles];
+}
diff --git a/packages/shared/src/search/format-aliases.ts b/packages/shared/src/search/format-aliases.ts
new file mode 100644
index 00000000..c2f1f401
--- /dev/null
+++ b/packages/shared/src/search/format-aliases.ts
@@ -0,0 +1,109 @@
+/** Format synonyms: canonical -> equivalent spellings. Used both ways during normalization. */
+export const FORMAT_ALIASES: Record = {
+ jpg: ["jpeg", "jpe"],
+ tif: ["tiff"],
+ heic: ["heif"],
+ word: ["doc", "docx"],
+ excel: ["xls", "xlsx", "spreadsheet"],
+ powerpoint: ["ppt", "pptx"],
+ markdown: ["md"],
+ image: ["photo", "pic", "picture", "img"],
+};
+
+/** Reverse lookup: any alias -> its canonical form. */
+const ALIAS_TO_CANONICAL: Record = (() => {
+ const map: Record = {};
+ for (const [canonical, aliases] of Object.entries(FORMAT_ALIASES)) {
+ for (const a of aliases) map[a] = canonical;
+ }
+ return map;
+})();
+
+/** Common misspellings of tool verbs, mapped to the intended word. */
+export const MISSPELLINGS: Record = {
+ compres: "compress",
+ covert: "convert",
+ conver: "convert",
+ resise: "resize",
+ resze: "resize",
+};
+
+/** Filler words stripped from queries so "convert mp4 to mp3 file" reduces to "mp4 to mp3". */
+const FILLER = new Set([
+ "convert",
+ "to",
+ "into",
+ "file",
+ "online",
+ "free",
+ "a",
+ "an",
+ "the",
+ "from",
+]);
+
+/**
+ * Normalize a search query to a canonical token string. Lowercases, collapses
+ * separators, splits joined forms (jpg2png, jpgtopng), maps the standalone
+ * digit 2 to "to", expands synonyms and fixes misspellings, drops filler.
+ * Returns a space-joined token string (filler-stripped except the connective).
+ */
+export function normalizeSearchQuery(raw: string): string {
+ let s = raw.toLowerCase().trim();
+ // Split alpha/digit boundaries so "jpg2png" -> "jpg 2 png", "mp4" stays intact only at word edges.
+ s = s.replace(/([a-z])2([a-z])/g, "$1 to $2");
+ // "jpgtopng" -> "jpg to png" (only when "to" sits between two known-ish letter runs)
+ s = s.replace(/([a-z]{2,5})to([a-z]{2,5})/g, (_m, a, b) => `${a} to ${b}`);
+ // Collapse separators to spaces.
+ s = s.replace(/[-_.]+/g, " ");
+ const tokens = s.split(/\s+/).filter(Boolean);
+ const out: string[] = [];
+ for (let tok of tokens) {
+ if (tok === "2") tok = "to";
+ if (MISSPELLINGS[tok]) tok = MISSPELLINGS[tok];
+ if (ALIAS_TO_CANONICAL[tok]) tok = ALIAS_TO_CANONICAL[tok];
+ if (tok === "to") {
+ out.push("to");
+ continue;
+ }
+ if (FILLER.has(tok)) continue;
+ out.push(tok);
+ }
+ // Drop a leading/trailing dangling "to".
+ while (out[0] === "to") out.shift();
+ while (out[out.length - 1] === "to") out.pop();
+ return out.join(" ");
+}
+
+/** Lowercased aliases for a format token (the token plus its known equivalents). */
+function aliasesFor(fmt: string): string[] {
+ const f = fmt.toLowerCase();
+ const canonical = ALIAS_TO_CANONICAL[f] ?? f;
+ const set = new Set([f, canonical, ...(FORMAT_ALIASES[canonical] ?? [])]);
+ return [...set];
+}
+
+/**
+ * Generate search keywords for an "X to Y" conversion from display labels.
+ * Returns deduped lowercase variants: formats + aliases, natural phrasings,
+ * compact forms, reverse phrasing, and " converter".
+ */
+export function generateConversionKeywords({ from, to }: { from: string; to: string }): string[] {
+ const fromVariants = aliasesFor(from);
+ const toVariants = aliasesFor(to);
+ const out = new Set();
+ for (const f of fromVariants) out.add(f);
+ for (const t of toVariants) out.add(t);
+ for (const f of fromVariants) {
+ for (const t of toVariants) {
+ out.add(`${f} to ${t}`);
+ out.add(`${f} ${t}`);
+ out.add(`${f}2${t}`);
+ out.add(`${f}to${t}`);
+ out.add(`${t} from ${f}`);
+ }
+ out.add(`${f} converter`);
+ }
+ for (const t of toVariants) out.add(`${t} converter`);
+ return [...out];
+}
diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts
index 6d54c36c..10c9ae33 100644
--- a/packages/shared/src/types.ts
+++ b/packages/shared/src/types.ts
@@ -9,6 +9,8 @@ export interface Tool {
route: string;
modality: Modality;
acceptedInputs: string[];
+ /** Optional search aliases/variants (e.g. "jpeg to png", "jpg2png"). Indexed by app + landing search. */
+ keywords?: string[];
/** Modality of this tool's output, when it differs from `modality`. Defaults to `modality`. */
outputModality?: Modality;
executionHint: "fast" | "long";
diff --git a/playwright.analytics-local.config.ts b/playwright.analytics-local.config.ts
index 62196ad9..52c3be41 100644
--- a/playwright.analytics-local.config.ts
+++ b/playwright.analytics-local.config.ts
@@ -47,7 +47,11 @@ export default defineConfig({
],
webServer: [
{
- command: `node tests/e2e-pg-create-db.cjs ${e2eDbName} && pnpm --filter @snapotter/api dev`,
+ // NOTE: use the `start` script, not `dev`. The `dev` script hard-codes
+ // `PORT=13490`, which would override the isolated TEST_API_PORT below and
+ // collide with a developer's running dev server. `start` reads PORT from
+ // the env, so the PORT set in this webServer.env block is honored.
+ command: `node tests/e2e-pg-create-db.cjs ${e2eDbName} && pnpm --filter @snapotter/api start`,
port: TEST_API_PORT,
reuseExistingServer: !process.env.CI,
env: {
@@ -57,6 +61,11 @@ export default defineConfig({
RATE_LIMIT_PER_MIN: "50000",
SKIP_MUST_CHANGE_PASSWORD: "true",
ANALYTICS_ENABLED: "true",
+ // Force the compile-time bake ON (dev/test only) so the effective
+ // analytics state is enabled by default and the opt-out toggle can be
+ // exercised end to end. bakedEnabled() honors this when
+ // NODE_ENV !== "production".
+ ANALYTICS_BAKED_OVERRIDE: "on",
DATABASE_URL: e2eDatabaseUrl,
REDIS_URL: process.env.REDIS_URL ?? "redis://localhost:6379",
BULLMQ_PREFIX: e2eDbName,
diff --git a/playwright.config.ts b/playwright.config.ts
index 3f67b1be..b71feaa6 100644
--- a/playwright.config.ts
+++ b/playwright.config.ts
@@ -131,6 +131,11 @@ export default defineConfig({
},
testMatch: DEVICE_SPECS,
grep: /@mobile/,
+ // @visual baselines are platform-suffixed but not browser-suffixed, so a
+ // single baseline cannot match both chromium and webkit rendering. Visual
+ // regression runs on the chromium device projects only; webkit covers the
+ // functional device flows.
+ grepInvert: /@visual/,
dependencies: ["setup"],
},
{
@@ -141,6 +146,7 @@ export default defineConfig({
},
testMatch: DEVICE_SPECS,
grep: /@tablet/,
+ grepInvert: /@visual/,
dependencies: ["setup"],
},
{
@@ -164,14 +170,32 @@ export default defineConfig({
DEFAULT_USERNAME: "admin",
DEFAULT_PASSWORD: "admin",
RATE_LIMIT_PER_MIN: "50000",
+ // The login route has its own per-minute attempt cap (default 10). The
+ // RBAC/settings specs sign in many times in quick succession, so raise
+ // it well above any single run to avoid 429s that cascade into
+ // create-user 401s and login timeouts.
+ LOGIN_ATTEMPT_LIMIT: "100000",
SKIP_MUST_CHANGE_PASSWORD: "true",
ANALYTICS_ENABLED: "false",
+ // The api-keys management routes cap at 30/min per IP in production. The
+ // serial api-keys specs hit the list endpoint far more than that on a
+ // shared IP, so raise the cap well above any single run.
+ API_KEYS_RATE_LIMIT_PER_MIN: "100000",
DATABASE_URL: e2eDatabaseUrl,
REDIS_URL: process.env.REDIS_URL ?? "redis://localhost:6379",
BULLMQ_PREFIX: e2eDbName,
// The in-repo docker/feature-manifest.json makes the API think it is
// inside Docker and try to mkdir /data; point it somewhere writable.
DATA_DIR: path.join(__dirname, "test-results", ".e2e-data"),
+ // Point feature-manifest detection at a path that does not exist so the
+ // API runs in native mode: it reports every AI bundle as available
+ // (apps/api/src/routes/features.ts) instead of gating each AI tool
+ // behind a multi-GB "requires an additional download" install prompt.
+ // The e2e env never downloads the model bundles, so without this every
+ // AI-tool GUI test is blocked before reaching a control. Real inference
+ // still no-ops, but the AI GUI specs assert on settings only and the
+ // processing specs skip when the sidecar is absent.
+ FEATURE_MANIFEST_PATH: path.join(__dirname, "test-results", ".no-feature-manifest.json"),
},
timeout: 30_000,
},
diff --git a/scripts/branding/generate-social-preview.mjs b/scripts/branding/generate-social-preview.mjs
index ea3416f8..2c9f0f9e 100644
--- a/scripts/branding/generate-social-preview.mjs
+++ b/scripts/branding/generate-social-preview.mjs
@@ -1,6 +1,6 @@
// Generates branding/social-preview.png (1280x640) -- the SnapOtter social/OG card.
-// Echoes the landing hero: trust badges, the "Every file tool you need / Nothing
-// leaves your network" headline, the supporting subhead, and the five modality
+// Echoes the landing hero: trust badges, the "Every file tool you need / Your files
+// never leave your network" headline, the supporting subhead, and the five modality
// cards. Rendered from HTML with the real brand fonts via headless Chromium.
// Run: node scripts/branding/generate-social-preview.mjs
//
@@ -127,7 +127,7 @@ html,body{width:1280px;height:640px}
SnapOtter${total} tools
${badgesHtml}
-
Every file tool you need.Nothing leaves your network.
+
Every file tool you need.Your files never leave your network.
The file-processing suite for teams that keep sensitive data in-house.
${cardsHtml}