1
0
mirror of https://github.com/upscayl/upscayl.git synced 2024-11-30 18:24:27 +01:00

Update to new schema, ADD: zh, ja, ru, es and fr

MOD: All necessary strings to match
This commit is contained in:
NayamAmarshe 2024-09-03 13:04:58 +05:30 committed by Aaron Liu
parent bacbee8fa8
commit d721e7ae7f
No known key found for this signature in database
GPG Key ID: 2D4DA57B12065A35
36 changed files with 1579 additions and 982 deletions

View File

@ -2,11 +2,14 @@ import { atom } from "jotai";
import en from "../locales/en.json"; import en from "../locales/en.json";
import ru from "../locales/ru.json"; import ru from "../locales/ru.json";
import ja from "../locales/ja.json"; import ja from "../locales/ja.json";
import zh from "../locales/zh.json";
import es from "../locales/es.json";
import fr from "../locales/fr.json";
import { atomWithStorage } from "jotai/utils"; import { atomWithStorage } from "jotai/utils";
// Define the shape of the translations // Define the shape of the translations
type Translations = typeof en; type Translations = typeof en;
type Locales = "en" | "ru" | "ja"; type Locales = "en" | "ru" | "ja" | "zh" | "es" | "fr";
// Utility function to access nested translation keys // Utility function to access nested translation keys
const getNestedTranslation = (obj: Translations, key: string): string => { const getNestedTranslation = (obj: Translations, key: string): string => {
@ -21,7 +24,14 @@ export const localeAtom = atomWithStorage<Locales>("language", "en");
// Atom to get the translation function based on the current locale // Atom to get the translation function based on the current locale
export const translationAtom = atom((get) => { export const translationAtom = atom((get) => {
const locale = get(localeAtom); const locale = get(localeAtom);
const translations: Record<Locales, Translations> = { en, ru, ja }; const translations: Record<Locales, Translations> = {
en,
ru,
ja,
zh,
es,
fr,
};
return (key: string, params: Record<string, string> = {}): string => { return (key: string, params: Record<string, string> = {}): string => {
const template = getNestedTranslation(translations[locale], key); const template = getNestedTranslation(translations[locale], key);

View File

@ -15,27 +15,27 @@ function Footer() {
className="badge badge-neutral mb-2" className="badge badge-neutral mb-2"
onClick={() => setShowNewsModal(true)} onClick={() => setShowNewsModal(true)}
> >
{t("APP.FOOTER.NEWS_TITLE")} {t("FOOTER.NEWS_TITLE")}
</button> </button>
)} )}
<p> <p>
{t("APP.FOOTER.COPYRIGHT")} {new Date().getFullYear()} -{" "} {t("FOOTER.COPYRIGHT")} {new Date().getFullYear()} -{" "}
<a <a
className="font-bold" className="font-bold"
href="https://github.com/upscayl/upscayl" href="https://github.com/upscayl/upscayl"
target="_blank" target="_blank"
> >
{t("APP.TITLE")} {t("TITLE")}
</a> </a>
</p> </p>
<p> <p>
{t("APP.FOOTER.BY")} {t("FOOTER.TITLE")}
<a <a
href="https://github.com/upscayl" href="https://github.com/upscayl"
className="font-bold" className="font-bold"
target="_blank" target="_blank"
> >
{t("APP.FOOTER.APP_TEAM")} {t("FOOTER.LINK_TITLE")}
</a> </a>
</p> </p>
</div> </div>

View File

@ -13,18 +13,18 @@ export default function Header({ version }: { version: string }) {
target="_blank" target="_blank"
className={`outline-none focus-visible:ring-2`} className={`outline-none focus-visible:ring-2`}
data-tooltip-id="tooltip" data-tooltip-id="tooltip"
data-tooltip-content={t("APP.HEADER.GITHUB_STAR_TT_INFO")} data-tooltip-content={t("HEADER.GITHUB_BUTTON_TITLE")}
> >
<div className="flex items-center gap-3 px-5 py-5"> <div className="flex items-center gap-3 px-5 py-5">
<Logo className="inline-block h-14 w-14" /> <Logo className="inline-block h-14 w-14" />
<div className="flex flex-col justify-center"> <div className="flex flex-col justify-center">
<h1 className="text-3xl font-bold"> <h1 className="text-3xl font-bold">
{t("APP.TITLE")} {t("TITLE")}
<span className="text-xs"> <span className="text-xs">
{version} {featureFlags.APP_STORE_BUILD && "Mac"} {version} {featureFlags.APP_STORE_BUILD && "Mac"}
</span> </span>
</h1> </h1>
<p className="">{t("APP.HEADER.APP_INFO")}</p> <p className="">{t("HEADER.DESCRIPTION")}</p>
</div> </div>
</div> </div>
</a> </a>

View File

@ -58,7 +58,7 @@ export const NewsModal = ({
<form method="dialog" className="modal-backdrop"> <form method="dialog" className="modal-backdrop">
<button onClick={() => setShow(false)}> <button onClick={() => setShow(false)}>
{t("APP.INFOS.DIALOG_BOX.CLOSE")} {t("APP.DIALOG_BOX.CLOSE")}
</button> </button>
</form> </form>
</dialog> </dialog>

View File

@ -18,7 +18,7 @@ const Tabs = ({ selectedTab, setSelectedTab }: TabsProps) => {
setSelectedTab(0); setSelectedTab(0);
}} }}
> >
{t("APP.TITLE")} {t("TITLE")}
</a> </a>
<a <a
className={`tab ${selectedTab === 1 && "tab-active"}`} className={`tab ${selectedTab === 1 && "tab-active"}`}
@ -26,7 +26,7 @@ const Tabs = ({ selectedTab, setSelectedTab }: TabsProps) => {
setSelectedTab(1); setSelectedTab(1);
}} }}
> >
{t("APP.SETTINGS.TITLE")} {t("SETTINGS.TITLE")}
</a> </a>
</div> </div>
); );

View File

@ -43,16 +43,16 @@ export const UpscaylCloudModal = ({ show, setShow, setDontShowCloudModal }) => {
</svg> </svg>
</button> </button>
<p className="badge badge-neutral text-xs"> <p className="badge badge-neutral text-xs">
{t("APP.UPSCAYL_CLOUD.COMING_SOON")} {t("UPSCAYL_CLOUD.COMING_SOON")}
</p> </p>
<p className="text-2xl font-semibold">{t("APP.INTRO")}</p> <p className="text-2xl font-semibold">{t("INTRO")}</p>
<p className="w-9/12 text-lg font-medium"> <p className="w-9/12 text-lg font-medium">
{t("APP.UPSCAYL_CLOUD.CATCHY_PHRASE_1")} {t("UPSCAYL_CLOUD.CATCHY_PHRASE_1")}
</p> </p>
<div className="flex flex-col gap-2 text-start"> <div className="flex flex-col gap-2 text-start">
<pre style={{ fontFamily: "inherit" }} className="leading-8"> <pre style={{ fontFamily: "inherit" }} className="leading-8">
{t("APP.UPSCAYL_CLOUD.CATCHY_PHRASE_2")} {t("UPSCAYL_CLOUD.CATCHY_PHRASE_2")}
</pre> </pre>
</div> </div>
@ -72,16 +72,16 @@ export const UpscaylCloudModal = ({ show, setShow, setDontShowCloudModal }) => {
email, email,
}); });
} catch (error) { } catch (error) {
alert(t("APP.UPSCAYL_CLOUD.ALREADY_REGISTERED", { name })); alert(t("UPSCAYL_CLOUD.ALREADY_REGISTERED_ALERT", { name }));
return; return;
} }
setName(""); setName("");
setEmail(""); setEmail("");
setDontShowCloudModal(true); setDontShowCloudModal(true);
setShow(false); setShow(false);
alert(t("APP.UPSCAYL_CLOUD.ADD_SUCCESS")); alert(t("UPSCAYL_CLOUD.ADD_SUCCESS"));
} else { } else {
alert(t("APP.UPSCAYL_CLOUD.INCORRECT_FIELDS")); alert(t("UPSCAYL_CLOUD.INCORRECT_FIELDS_ALERT"));
} }
}} }}
> >
@ -105,7 +105,7 @@ export const UpscaylCloudModal = ({ show, setShow, setDontShowCloudModal }) => {
type="submit" type="submit"
className="rounded-2xl bg-success px-4 py-2 text-success-content" className="rounded-2xl bg-success px-4 py-2 text-success-content"
> >
{t("APP.UPSCAYL_CLOUD.JOIN_WAITLIST")} {t("UPSCAYL_CLOUD.JOIN_WAITLIST")}
</button> </button>
<button <button
@ -116,14 +116,14 @@ export const UpscaylCloudModal = ({ show, setShow, setDontShowCloudModal }) => {
}} }}
type="button" type="button"
> >
{t("APP.UPSCAYL_CLOUD.DONT_SHOW_AGAIN")} {t("UPSCAYL_CLOUD.DONT_SHOW_AGAIN")}
</button> </button>
</form> </form>
</div> </div>
<form method="dialog" className="modal-backdrop"> <form method="dialog" className="modal-backdrop">
<button onClick={() => setShow(false)}> <button onClick={() => setShow(false)}>
{t("APP.INFOS.DIALOG_BOX.CLOSE")} {t("APP.DIALOG_BOX.CLOSE")}
</button> </button>
</form> </form>
</dialog> </dialog>

View File

@ -16,14 +16,14 @@ export function CompressionInput({
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<div className="flex gap-1 text-sm font-medium uppercase"> <div className="flex gap-1 text-sm font-medium uppercase">
<p className="shrink-0"> <p className="shrink-0">
{t("APP.INFOS.IMAGE_COMPRESSION.TITLE", { {t("SETTINGS.IMAGE_COMPRESSION.TITLE", {
compression: compression.toString(), compression: compression.toString(),
})} })}
</p> </p>
</div> </div>
{compression > 0 && ( {compression > 0 && (
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.IMAGE_COMPRESSION.LOSSLESS_TIP")} {t("SETTINGS.IMAGE_COMPRESSION.DESCRIPTION")}
</p> </p>
)} )}
<input <input

View File

@ -16,15 +16,15 @@ export function CustomModelsFolderSelect({
return ( return (
<div className="flex flex-col items-start gap-2"> <div className="flex flex-col items-start gap-2">
<p className="text-sm font-medium">{t("APP.INFOS.CUSTOM_MODELS.ADD")}</p> <p className="text-sm font-medium">{t("SETTINGS.CUSTOM_MODELS.TITLE")}</p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.CUSTOM_MODELS.INFO")} {t("SETTINGS.CUSTOM_MODELS.DESCRIPTION")}
<a <a
href="https://github.com/upscayl/custom-models/blob/main/README.md" href="https://github.com/upscayl/custom-models/blob/main/README.md"
className="link underline" className="link underline"
target="_blank" target="_blank"
> >
{t("APP.INFOS.CUSTOM_MODELS.LINK_TEXT")} {t("SETTINGS.CUSTOM_MODELS.LINK_TITLE")}
</a> </a>
</p> </p>
<p className="text-sm text-base-content/60">{customModelsPath}</p> <p className="text-sm text-base-content/60">{customModelsPath}</p>
@ -43,7 +43,7 @@ export function CustomModelsFolderSelect({
} }
}} }}
> >
{t("APP.INFOS.CUSTOM_MODELS.SELECT_FOLDER")} {t("SETTINGS.CUSTOM_MODELS.BUTTON_FOLDER")}
</button> </button>
</div> </div>
); );

View File

@ -12,12 +12,12 @@ export function CustomResolutionInput() {
<div> <div>
<div className="flex flex-col gap-1"> <div className="flex flex-col gap-1">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.CUSTOM_INPUT_RESOLUTION.WIDTH")} {t("SETTINGS.CUSTOM_INPUT_RESOLUTION.TITLE")}
</p> </p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
<b>{t("APP.INFOS.CUSTOM_INPUT_RESOLUTION.RESTART")}</b> <b>{t("SETTINGS.CUSTOM_INPUT_RESOLUTION.RESTART")}</b>
<br /> <br />
{t("APP.INFOS.CUSTOM_INPUT_RESOLUTION.CUSTOM_WIDTH_TIP")} {t("SETTINGS.CUSTOM_INPUT_RESOLUTION.DESCRIPTION")}
</p> </p>
</div> </div>
<div className="mt-2 flex items-center gap-2"> <div className="mt-2 flex items-center gap-2">

View File

@ -7,13 +7,13 @@ export function DonateButton() {
return ( return (
<div className="flex flex-col gap-2 text-sm font-medium"> <div className="flex flex-col gap-2 text-sm font-medium">
<p>{t("APP.INFOS.DONATE.IF_LIKED")}</p> <p>{t("SETTINGS.DONATE.DESCRIPTION")}</p>
<a <a
href="https://buymeacoffee.com/fossisthefuture" href="https://buymeacoffee.com/fossisthefuture"
target="_blank" target="_blank"
className="btn btn-primary" className="btn btn-primary"
> >
{t("APP.INFOS.DONATE.DONATE")} {t("SETTINGS.DONATE.BUTTON_TITLE")}
</a> </a>
</div> </div>
); );

View File

@ -12,13 +12,13 @@ export function GpuIdInput({ gpuId, handleGpuIdChange }) {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium">{t("APP.INFOS.GPU_ID_INPUT.ID")}</p> <p className="text-sm font-medium">{t("SETTINGS.GPU_ID_INPUT.TITLE")}</p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.GPU_ID_INPUT.READ_DOCS")} {t("SETTINGS.GPU_ID_INPUT.DESCRIPTION")}
</p> </p>
{window.electron.platform === "win" && ( {window.electron.platform === "win" && (
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.GPU_ID_INPUT.ENABLE_PERF_MODE")} {t("SETTINGS.GPU_ID_INPUT.ADDITIONAL_DESCRIPTION")}
</p> </p>
)} )}
<input <input

View File

@ -18,7 +18,7 @@ export function ImageFormatSelect({
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<div className="flex flex-row gap-1"> <div className="flex flex-row gap-1">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.IMAGE_FORMAT.SAVE_AS")} {t("SETTINGS.IMAGE_FORMAT.TITLE")}
</p> </p>
{/* <p className="badge-primary badge text-[10px] font-medium"> {/* <p className="badge-primary badge text-[10px] font-medium">
EXPERIMENTAL EXPERIMENTAL
@ -32,21 +32,21 @@ export function ImageFormatSelect({
className={`btn ${saveImageAs === "png" && "btn-primary"}`} className={`btn ${saveImageAs === "png" && "btn-primary"}`}
onClick={() => setExportType("png")} onClick={() => setExportType("png")}
> >
{t("APP.INFOS.IMAGE_FORMAT.PNG")} {t("SETTINGS.IMAGE_FORMAT.PNG")}
</button> </button>
{/* JPG */} {/* JPG */}
<button <button
className={`btn ${saveImageAs === "jpg" && "btn-primary"}`} className={`btn ${saveImageAs === "jpg" && "btn-primary"}`}
onClick={() => setExportType("jpg")} onClick={() => setExportType("jpg")}
> >
{t("APP.INFOS.IMAGE_FORMAT.JPG")} {t("SETTINGS.IMAGE_FORMAT.JPG")}
</button> </button>
{/* WEBP */} {/* WEBP */}
<button <button
className={`btn ${saveImageAs === "webp" && "btn-primary"}`} className={`btn ${saveImageAs === "webp" && "btn-primary"}`}
onClick={() => setExportType("webp")} onClick={() => setExportType("webp")}
> >
{t("APP.INFOS.IMAGE_FORMAT.WEBP")} {t("SETTINGS.IMAGE_FORMAT.WEBP")}
</button> </button>
</div> </div>
</div> </div>

View File

@ -22,9 +22,9 @@ export function ImageScaleSelect({
{hideInfo ? ( {hideInfo ? (
<> <>
<p className="text-sm"> <p className="text-sm">
{t("APP.INFOS.IMAGE_SCALE.TITLE")}{" "} {t("SETTINGS.IMAGE_SCALE.TITLE")}{" "}
<span className="text-xs"> <span className="text-xs">
{t("APP.INFOS.IMAGE_SCALE.SCALES_TIMES", { {t("SETTINGS.IMAGE_SCALE.IMAGE_SCALED_BY", {
scale, scale,
})} })}
</span> </span>
@ -33,9 +33,7 @@ export function ImageScaleSelect({
<p <p
className="badge badge-warning text-xs font-bold" className="badge badge-warning text-xs font-bold"
data-tooltip-id="tooltip" data-tooltip-id="tooltip"
data-tooltip-content={t( data-tooltip-content={t("SETTINGS.IMAGE_SCALE.WARNING")}
"APP.ERRORS.IMAGE_SCALE_WARN.PERF_ISSUE",
)}
> >
! !
</p> </p>
@ -43,8 +41,8 @@ export function ImageScaleSelect({
</> </>
) : ( ) : (
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.IMAGE_SCALE.TITLE_CAPS")}{" "} {t("SETTINGS.IMAGE_SCALE.TITLE")}{" "}
{t("APP.INFOS.IMAGE_SCALE.SCALES_TIMES", { {t("SETTINGS.IMAGE_SCALE.IMAGE_SCALED_BY", {
scale, scale,
})}{" "} })}{" "}
{useCustomWidth && "DISABLED"} {useCustomWidth && "DISABLED"}
@ -53,12 +51,12 @@ export function ImageScaleSelect({
</div> </div>
{!hideInfo && ( {!hideInfo && (
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.IMAGE_SCALE.AI_UPSCALE_RESIZE_INFO")} {t("SETTINGS.IMAGE_SCALE.DESCRIPTION")}
</p> </p>
)} )}
{!hideInfo && parseInt(scale) >= 6 && ( {!hideInfo && parseInt(scale) >= 6 && (
<p className="text-xs text-base-content/80 text-red-500"> <p className="text-xs text-base-content/80 text-red-500">
{t("APP.ERRORS.IMAGE_SCALE_WARN.PERF_ISSUE_DEVICE")} {t("SETTINGS.IMAGE_SCALE.ADDITIONAL_WARNING")}
</p> </p>
)} )}

View File

@ -28,9 +28,9 @@ export function LogArea({
<p className="text-sm font-medium">LOGS</p> <p className="text-sm font-medium">LOGS</p>
<button className="btn btn-primary btn-xs" onClick={copyOnClickHandler}> <button className="btn btn-primary btn-xs" onClick={copyOnClickHandler}>
{isCopied ? ( {isCopied ? (
<span>{t("APP.INFOS.LOG_AREA.ON_COPY")}</span> <span>{t("SETTINGS.LOG_AREA.ON_COPY")}</span>
) : ( ) : (
<span>{t("APP.INFOS.LOG_AREA.COPY")}</span> <span>{t("SETTINGS.LOG_AREA.BUTTON_TITLE")}</span>
)} )}
</button> </button>
</div> </div>
@ -40,7 +40,7 @@ export function LogArea({
> >
{logData.length === 0 && ( {logData.length === 0 && (
<p className="text-base-content/70"> <p className="text-base-content/70">
{t("APP.INFOS.LOG_AREA.NO_LOGS")} {t("SETTINGS.LOG_AREA.NO_LOGS")}
</p> </p>
)} )}

View File

@ -10,10 +10,10 @@ const OverwriteToggle = () => {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.OVERWRITE_TOGGLE.OW_PREV")} {t("SETTINGS.OVERWRITE_TOGGLE.TITLE")}
</p> </p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.OVERWRITE_TOGGLE.OW_TIP")} {t("SETTINGS.OVERWRITE_TOGGLE.DESCRIPTION")}
</p> </p>
<input <input
type="checkbox" type="checkbox"

View File

@ -7,16 +7,16 @@ export function ResetSettings() {
return ( return (
<div className="flex flex-col items-start gap-2"> <div className="flex flex-col items-start gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.RESET_SETTINGS.TITLE")} {t("SETTINGS.RESET_SETTINGS.BUTTON_TITLE")}
</p> </p>
<button <button
className="btn btn-primary" className="btn btn-primary"
onClick={async () => { onClick={async () => {
localStorage.clear(); localStorage.clear();
alert(t("APP.INFOS.RESET_SETTINGS.ON_RESET")); alert(t("SETTINGS.RESET_SETTINGS.ALERT"));
}} }}
> >
{t("APP.INFOS.RESET_SETTINGS.TITLE")} {t("SETTINGS.RESET_SETTINGS.BUTTON_TITLE")}
</button> </button>
</div> </div>
); );

View File

@ -15,10 +15,10 @@ export function SaveOutputFolderToggle() {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.SAVE_OUTPUT_FOLDER.TITLE")} {t("SETTINGS.SAVE_OUTPUT_FOLDER.TITLE")}
</p> </p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.SAVE_OUTPUT_FOLDER.DESC")} {t("SETTINGS.SAVE_OUTPUT_FOLDER.DESCRIPTION")}
</p> </p>
<p className="font-mono text-sm">{outputPath}</p> <p className="font-mono text-sm">{outputPath}</p>

View File

@ -38,7 +38,7 @@ export function ThemeSelect() {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium">{t("APP.INFOS.THEME.TITLE")}</p> <p className="text-sm font-medium">{t("SETTINGS.THEME.TITLE")}</p>
<select data-choose-theme className="select select-primary"> <select data-choose-theme className="select select-primary">
{availableThemes.map((theme) => { {availableThemes.map((theme) => {
return ( return (

View File

@ -11,11 +11,11 @@ export function TileSizeInput() {
<div> <div>
<div className="flex flex-col gap-1"> <div className="flex flex-col gap-1">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.CUSTOM_TILE_SIZE.TITLE")} {t("SETTINGS.CUSTOM_TILE_SIZE.TITLE")}
</p> </p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
<br /> <br />
{t("APP.INFOS.CUSTOM_TILE_SIZE.DESC")} {t("SETTINGS.CUSTOM_TILE_SIZE.DESCRIPTION")}
</p> </p>
</div> </div>
<div className="mt-2 flex items-center gap-2"> <div className="mt-2 flex items-center gap-2">

View File

@ -11,10 +11,10 @@ const TurnOffNotificationsToggle = () => {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.TURN_OFF_NOTIFICATIONS.TITLE")} {t("SETTINGS.TURN_OFF_NOTIFICATIONS.TITLE")}
</p> </p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
{t("APP.INFOS.TURN_OFF_NOTIFICATIONS.DESC")} {t("SETTINGS.TURN_OFF_NOTIFICATIONS.DESCRIPTION")}
</p> </p>
<input <input
type="checkbox" type="checkbox"

View File

@ -186,13 +186,13 @@ function SettingsTab({
}} }}
> >
<div className="flex flex-col gap-2 text-sm font-medium uppercase"> <div className="flex flex-col gap-2 text-sm font-medium uppercase">
<p>{t("APP.ERRORS.ISSUE_CHECK.TITLE")}</p> <p>{t("SETTINGS.SUPPORT.TITLE")}</p>
<a <a
className="btn btn-primary" className="btn btn-primary"
href="https://docs.upscayl.org/" href="https://docs.upscayl.org/"
target="_blank" target="_blank"
> >
{t("APP.ERRORS.ISSUE_CHECK.GET_HELP")} {t("SETTINGS.SUPPORT.DOCS_BUTTON_TITLE")}
</a> </a>
{featureFlags.APP_STORE_BUILD && ( {featureFlags.APP_STORE_BUILD && (
<a <a
@ -200,7 +200,7 @@ function SettingsTab({
href={`mailto:upscayl@gmail.com?subject=Upscayl%20Issue%3A%20%3CIssue%20name%20here%3E&body=Device%20Name%3A%20%3CYOUR%20DEVICE%20MODEL%3E%0AOperating%20System%3A%20%3CYOUR%20OPERATING%20SYSTEM%20VERSION%3E%0AUpscayl%20Version%3A%20${upscaylVersion}%0A%0AHi%2C%20I'm%20having%20an%20issue%20with%20Upscayl.%20%3CDESCRIBE%20ISSUE%20HERE%3E`} href={`mailto:upscayl@gmail.com?subject=Upscayl%20Issue%3A%20%3CIssue%20name%20here%3E&body=Device%20Name%3A%20%3CYOUR%20DEVICE%20MODEL%3E%0AOperating%20System%3A%20%3CYOUR%20OPERATING%20SYSTEM%20VERSION%3E%0AUpscayl%20Version%3A%20${upscaylVersion}%0A%0AHi%2C%20I'm%20having%20an%20issue%20with%20Upscayl.%20%3CDESCRIBE%20ISSUE%20HERE%3E`}
target="_blank" target="_blank"
> >
{t("APP.ERRORS.ISSUE_CHECK.EMAIL_DEV")} {t("SETTINGS.SUPPORT.EMAIL_BUTTON_TITLE")}
</a> </a>
)} )}
{!featureFlags.APP_STORE_BUILD && <DonateButton />} {!featureFlags.APP_STORE_BUILD && <DonateButton />}
@ -261,7 +261,7 @@ function SettingsTab({
setShow(true); setShow(true);
}} }}
> >
{t("APP.INTRO")} {t("INTRO")}
</button> </button>
<UpscaylCloudModal <UpscaylCloudModal

View File

@ -5,6 +5,9 @@ const locales = {
en: "English", en: "English",
ru: "Русский", ru: "Русский",
ja: "日本語", ja: "日本語",
zh: "漢語",
es: "Español",
fr: "Français",
}; };
const LanguageSwitcher = () => { const LanguageSwitcher = () => {
@ -14,7 +17,7 @@ const LanguageSwitcher = () => {
return ( return (
<div> <div>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium">{t("APP.SETTINGS.CHANGE_LANG")}</p> <p className="text-sm font-medium">{t("SETTINGS.LANGUAGE.TITLE")}</p>
<select <select
data-choose-theme data-choose-theme
className="select select-primary" className="select select-primary"

View File

@ -47,7 +47,7 @@ const DialogContent = React.forwardRef<
{children} {children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none"> <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none">
<X className="h-4 w-4" /> <X className="h-4 w-4" />
<span className="sr-only">{t("APP.INFOS.DIALOG_BOX.CLOSE")}</span> <span className="sr-only">{t("APP.DIALOG_BOX.CLOSE")}</span>
</DialogPrimitive.Close> </DialogPrimitive.Close>
</DialogPrimitive.Content> </DialogPrimitive.Content>
</DialogPortal> </DialogPortal>

View File

@ -198,17 +198,15 @@ function LeftPaneImageSteps({
<p <p
className="mr-1 inline-block cursor-help text-sm" className="mr-1 inline-block cursor-help text-sm"
data-tooltip-id="tooltip" data-tooltip-id="tooltip"
data-tooltip-content={t("APP.INFOS.LEFT_PANE_PROCESS.BATCH.TT_INFO")} data-tooltip-content={t("APP.BATCH_MODE.DESCRIPTION")}
> >
{t("APP.INFOS.LEFT_PANE_PROCESS.BATCH.TITLE")} {t("APP.BATCH_MODE.TITLE")}
</p> </p>
</div> </div>
{/* STEP 1 */} {/* STEP 1 */}
<div className="animate-step-in"> <div className="animate-step-in">
<p className="step-heading"> <p className="step-heading">{t("APP.FILE_SELECTION.TITLE")}</p>
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_1.TITLE")}
</p>
<button <button
className="btn btn-primary" className="btn btn-primary"
onClick={!batchMode ? selectImageHandler : selectFolderHandler} onClick={!batchMode ? selectImageHandler : selectFolderHandler}
@ -216,20 +214,16 @@ function LeftPaneImageSteps({
data-tooltip-content={imagePath} data-tooltip-content={imagePath}
> >
{batchMode {batchMode
? t("APP.INFOS.LEFT_PANE_PROCESS.STEP_1.BATCH_YES") ? t("APP.FILE_SELECTION.BATCH_MODE_TYPE")
: t("APP.INFOS.LEFT_PANE_PROCESS.STEP_1.BATCH_NO")} : t("APP.FILE_SELECTION.SINGLE_MODE_TYPE")}
</button> </button>
</div> </div>
{/* STEP 2 */} {/* STEP 2 */}
<div className="animate-step-in group flex flex-col gap-4"> <div className="animate-step-in group flex flex-col gap-4">
<div> <div>
<p className="step-heading"> <p className="step-heading">{t("APP.MODEL_SELECTION.TITLE")}</p>
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_2.TITLE")} <p className="mb-2 text-sm">{t("APP.MODEL_SELECTION.DESCRIPTION")}</p>
</p>
<p className="mb-2 text-sm">
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_2.SELECT_MODEL")}
</p>
<Select <Select
onMenuOpen={() => setOpen(true)} onMenuOpen={() => setOpen(true)}
@ -272,14 +266,12 @@ function LeftPaneImageSteps({
setDoubleUpscayl(!doubleUpscayl); setDoubleUpscayl(!doubleUpscayl);
}} }}
> >
{t("APP.INFOS.LEFT_PANE_PROCESS.DOUBLE_UPSCAYL.TITLE")} {t("APP.DOUBLE_UPSCAYL.TITLE")}
</p> </p>
<button <button
className="badge badge-neutral badge-sm cursor-help" className="badge badge-neutral badge-sm cursor-help"
data-tooltip-id="tooltip" data-tooltip-id="tooltip"
data-tooltip-content={t( data-tooltip-content={t("APP.DOUBLE_UPSCAYL.DESCRIPTION")}
"APP.INFOS.LEFT_PANE_PROCESS.DOUBLE_UPSCAYL.TT_INFO",
)}
> >
? ?
</button> </button>
@ -294,17 +286,13 @@ function LeftPaneImageSteps({
<div className="flex flex-col pb-2"> <div className="flex flex-col pb-2">
<div className="step-heading flex items-center gap-2"> <div className="step-heading flex items-center gap-2">
<span className="leading-none"> <span className="leading-none">
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_3.TITLE")} {t("APP.OUTPUT_PATH_SELECTION.TITLE")}
</span> </span>
{featureFlags.APP_STORE_BUILD && ( {featureFlags.APP_STORE_BUILD && (
<button <button
className="badge badge-outline badge-sm cursor-pointer" className="badge badge-outline badge-sm cursor-pointer"
onClick={() => onClick={() =>
alert( alert(t("APP.OUTPUT_PATH_SELECTION.MAC_APP_STORE_ALERT"))
t(
"APP.INFOS.LEFT_PANE_PROCESS.STEP_3.MACOS_RESTRICTION_ALERT",
),
)
} }
> >
? ?
@ -314,7 +302,7 @@ function LeftPaneImageSteps({
{!outputPath && featureFlags.APP_STORE_BUILD && ( {!outputPath && featureFlags.APP_STORE_BUILD && (
<div className="text-xs"> <div className="text-xs">
<span className="rounded-btn bg-base-200 px-2 font-medium uppercase text-base-content/50"> <span className="rounded-btn bg-base-200 px-2 font-medium uppercase text-base-content/50">
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_3.NOT_SELECTED")} {t("APP.OUTPUT_PATH_SELECTION.NOT_SELECTED")}
</span> </span>
</div> </div>
)} )}
@ -322,8 +310,8 @@ function LeftPaneImageSteps({
{!batchMode && !featureFlags.APP_STORE_BUILD && ( {!batchMode && !featureFlags.APP_STORE_BUILD && (
<p className="mb-2 text-sm"> <p className="mb-2 text-sm">
{!batchMode {!batchMode
? t("APP.INFOS.LEFT_PANE_PROCESS.STEP_3.DEFAULT_IMG_PATH") ? t("APP.OUTPUT_PATH_SELECTION.DEFAULT_IMG_PATH")
: t("APP.INFOS.LEFT_PANE_PROCESS.STEP_3.DEFAULT_FOLDER_PATH")} : t("APP.OUTPUT_PATH_SELECTION.DEFAULT_FOLDER_PATH")}
</p> </p>
)} )}
<button <button
@ -332,22 +320,20 @@ function LeftPaneImageSteps({
data-tooltip-id="tooltip" data-tooltip-id="tooltip"
onClick={outputHandler} onClick={outputHandler}
> >
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_3.SET_OUTPUT_FOLDER")} {t("APP.OUTPUT_PATH_SELECTION.BUTTON_TITLE")}
</button> </button>
</div> </div>
{/* STEP 4 */} {/* STEP 4 */}
<div className="animate-step-in"> <div className="animate-step-in">
<p className="step-heading"> <p className="step-heading">{t("APP.SCALE_SELECTION.TITLE")}</p>
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_4.TITLE")}
</p>
{dimensions.width && dimensions.height && ( {dimensions.width && dimensions.height && (
<p className="mb-2 text-sm"> <p className="mb-2 text-sm">
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_4.UPSCAYL_FROM")} {t("APP.SCALE_SELECTION.FROM_TITLE")}
<span className="font-bold"> <span className="font-bold">
{dimensions.width}x{dimensions.height} {dimensions.width}x{dimensions.height}
</span> </span>
{t("APP.INFOS.LEFT_PANE_PROCESS.STEP_4.UPSCAYL_TO")} {t("APP.SCALE_SELECTION.TO_TITLE")}
<span className="font-bold"> <span className="font-bold">
{getUpscaleResolution().width}x{getUpscaleResolution().height} {getUpscaleResolution().width}x{getUpscaleResolution().height}
</span> </span>
@ -360,15 +346,15 @@ function LeftPaneImageSteps({
? () => ? () =>
toast({ toast({
description: t( description: t(
"APP.INFOS.LEFT_PANE_PROCESS.STEP_4.FOLDER_ALERT", "APP.SCALE_SELECTION.NO_OUTPUT_FOLDER_ALERT",
), ),
}) })
: upscaylHandler : upscaylHandler
} }
> >
{progress.length > 0 {progress.length > 0
? t("APP.INFOS.LEFT_PANE_PROCESS.STEP_4.PROCESS_IN_PROGRESS") ? t("APP.SCALE_SELECTION.IN_PROGRESS_BUTTON_TITLE")
: t("APP.INFOS.LEFT_PANE_PROCESS.STEP_4.PROCESS_START")} : t("APP.SCALE_SELECTION.START_BUTTON_TITLE")}
</button> </button>
</div> </div>

View File

@ -54,12 +54,12 @@ const ImageOptions = ({
<div className="flex flex-col justify-center gap-5 overflow-auto p-5"> <div className="flex flex-col justify-center gap-5 overflow-auto p-5">
<button className="btn btn-primary" onClick={resetImagePaths}> <button className="btn btn-primary" onClick={resetImagePaths}>
{t("APP.INFOS.IMAGE_OPTIONS.RESET")} {t("APP.IMAGE_OPTIONS.RESET_BUTTON_TITLE")}
</button> </button>
<div className="flex flex-row items-center gap-2"> <div className="flex flex-row items-center gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.IMAGE_OPTIONS.LENS_VIEW")} {t("APP.IMAGE_OPTIONS.LENS_VIEW_TITLE")}
</p> </p>
<input <input
type="checkbox" type="checkbox"
@ -70,13 +70,13 @@ const ImageOptions = ({
}} }}
/> />
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.IMAGE_OPTIONS.SLIDER_VIEW")} {t("APP.IMAGE_OPTIONS.SLIDER_VIEW_TITLE")}
</p> </p>
</div> </div>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.IMAGE_OPTIONS.ZOOM_AMOUNT")} ({zoomAmount}%) {t("APP.IMAGE_OPTIONS.ZOOM_AMOUNT_TITLE")} ({zoomAmount}%)
</p> </p>
<input <input
type="range" type="range"
@ -94,7 +94,7 @@ const ImageOptions = ({
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium"> <p className="text-sm font-medium">
{t("APP.INFOS.IMAGE_OPTIONS.LENS_SIZE")} ({lensSize / 10}) {t("APP.IMAGE_OPTIONS.LENS_SIZE_TITLE")} ({lensSize / 10})
</p> </p>
<input <input
type="range" type="range"

View File

@ -47,7 +47,7 @@ function ProgressBar({
<Logo className="spinner h-12 w-12" /> <Logo className="spinner h-12 w-12" />
<p className="rounded-full px-2 pb-2 font-bold"> <p className="rounded-full px-2 pb-2 font-bold">
{batchMode && {batchMode &&
`${t("APP.INFOS.PROGRESS_BAR.IN_PROGRESS")} ${batchProgress}`} `${t("APP.PROGRESS_BAR.BATCH_UPSCAYL_IN_PROGRESS_TITLE")} ${batchProgress}`}
</p> </p>
<div className="flex flex-col items-center gap-1"> <div className="flex flex-col items-center gap-1">
{progress !== "Hold on..." ? ( {progress !== "Hold on..." ? (
@ -61,11 +61,11 @@ function ProgressBar({
<p className="text-sm font-bold">{progress}</p> <p className="text-sm font-bold">{progress}</p>
)} )}
<p className="animate-pulse rounded-full px-2 pb-3 text-xs font-medium text-neutral-content/50"> <p className="animate-pulse rounded-full px-2 pb-3 text-xs font-medium text-neutral-content/50">
{t("APP.INFOS.PROGRESS_BAR.PROGRESS_CATCHY")} {t("APP.PROGRESS_BAR.IN_PROGRESS_TITLE")}
</p> </p>
</div> </div>
<button onClick={stopHandler} className="btn btn-outline"> <button onClick={stopHandler} className="btn btn-outline">
{t("APP.INFOS.PROGRESS_BAR.STOP")} {t("APP.PROGRESS_BAR.STOP_BUTTON_TITLE")}
</button> </button>
</div> </div>
</div> </div>

View File

@ -10,7 +10,7 @@ function ResetButton(props) {
className="animate bg-gradient-blue absolute right-1 top-1 z-10 rounded-full px-4 py-2 text-white opacity-30 hover:opacity-100" className="animate bg-gradient-blue absolute right-1 top-1 z-10 rounded-full px-4 py-2 text-white opacity-30 hover:opacity-100"
onClick={props.resetImagePaths} onClick={props.resetImagePaths}
> >
{t("APP.INFOS.RESET")} {t("APP.RESET_BUTTON_TITLE")}
</button> </button>
); );
} }

View File

@ -9,21 +9,19 @@ function RightPaneInfo({ version, batchMode }) {
<div className="flex flex-col items-center rounded-btn bg-base-200 p-4"> <div className="flex flex-col items-center rounded-btn bg-base-200 p-4">
<p className="pb-1 text-lg font-semibold"> <p className="pb-1 text-lg font-semibold">
{batchMode {batchMode
? t("APP.INFOS.RIGHT_PANE_INFO.SELECT_FOLDER") ? t("APP.RIGHT_PANE_INFO.SELECT_FOLDER")
: t("APP.INFOS.RIGHT_PANE_INFO.SELECT_IMAGE")} : t("APP.RIGHT_PANE_INFO.SELECT_IMAGE")}
</p> </p>
{batchMode ? ( {batchMode ? (
<p className="w-full pb-5 text-center text-base-content/80 md:w-96"> <p className="w-full pb-5 text-center text-base-content/80 md:w-96">
{t("APP.INFOS.RIGHT_PANE_INFO.NOTE_SPECIFIC_FORMATS_IN_FOLDER")} {t("APP.RIGHT_PANE_INFO.SELECT_FOLDER_DESCRIPTION")}
</p> </p>
) : ( ) : (
<p className="w-full pb-5 text-center text-base-content/80 md:w-96"> <p className="w-full pb-5 text-center text-base-content/80 md:w-96">
{t("APP.INFOS.RIGHT_PANE_INFO.SELECT_IMAGES")} {t("APP.RIGHT_PANE_INFO.SELECT_IMAGES_DESCRIPTION")}
</p> </p>
)} )}
<p className="badge badge-primary text-sm"> <p className="badge badge-primary text-sm">Upscayl v{version}</p>
{t("APP.INFOS.RIGHT_PANE_INFO.APP_VERSION", { version })}
</p>
</div> </div>
); );
} }

View File

@ -1,89 +1,72 @@
{ {
"APP": {
"TITLE": "Upscayl", "TITLE": "Upscayl",
"INTRO": "Introducing Upscayl Cloud!", "INTRO": "Introducing Upscayl Cloud!",
"HEADER": { "HEADER": {
"GITHUB_STAR_TT_INFO": "Star us on GitHub 😁", "GITHUB_BUTTON_TITLE": "Star us on GitHub 😁",
"APP_INFO": "AI Image Upscaler" "DESCRIPTION": "AI Image Upscaler"
}, },
"FOOTER": { "FOOTER": {
"NEWS_TITLE": "UPSCAYL NEWS", "NEWS_TITLE": "UPSCAYL NEWS",
"COPYRIGHT": "Copyright ©", "COPYRIGHT": "Copyright ©",
"BY": "By ", "TITLE": "By ",
"APP_TEAM": "The Upscayl Team" "LINK_TITLE": "The Upscayl Team"
}, },
"SETTINGS": { "SETTINGS": {
"TITLE": "SETTINGS", "TITLE": "SETTINGS",
"CHANGE_LANG": "Change Language" "CHANGE_LANGUAGE": { "TITLE": "Change Language" },
},
"INFOS": {
"IMAGE_PROCESSING": {
"START": "Processing the image...",
"SCALE_CONVERT": "Scaling and converting image...",
"WAIT": "Hold on...",
"SUCCESS": "Upscayl Successful!",
"BATCH": {
"SELECT": "Selected folder:",
"DONE": "All done!",
"OPEN_DONE_FOLDER": "Open Upscayled Folder"
}
},
"COMPARISION": {
"SLIDER_ORIGINAL": "Original",
"SLIDER_PROCESSED": "Upscayled"
},
"IMAGE_COMPRESSION": { "IMAGE_COMPRESSION": {
"TITLE": "Image Compression ({compression}%)", "TITLE": "Image Compression",
"LOSSLESS_TIP": "PNG compression is lossless, so it might not reduce the file size significantly and higher compression values might affect the performance. JPG and WebP compression is lossy." "DESCRIPTION": "PNG compression is lossless, so it might not reduce the file size significantly and higher compression values might affect the performance. JPG and WebP compression is lossy."
}, },
"CUSTOM_MODELS": { "CUSTOM_MODELS": {
"ADD": "ADD CUSTOM MODELS", "TITLE": "ADD CUSTOM MODELS",
"SELECT_FOLDER": "Select Folder", "BUTTON_FOLDER": "Select Folder",
"INFO": "You can add your own models easily. For more details:", "DESCRIPTION": "You can add your own models easily. For more details:",
"LINK_TEXT": "Custom Models Repository" "LINK_TITLE": "Custom Models Repository"
}, },
"CUSTOM_INPUT_RESOLUTION": { "CUSTOM_INPUT_RESOLUTION": {
"WIDTH": "CUSTOM OUTPUT WIDTH", "TITLE": "CUSTOM OUTPUT WIDTH",
"RESTART": "REQUIRES RESTART", "RESTART": "REQUIRES RESTART",
"CUSTOM_WIDTH_TIP": "Use a custom width for the output images. The height will be adjusted automatically. Enabling this will override the scale setting." "DESCRIPTION": "Use a custom width for the output images. The height will be adjusted automatically. Enabling this will override the scale setting."
}, },
"DONATE": { "DONATE": {
"IF_LIKED": "If you like what we do :)", "DESCRIPTION": "If you like what we do :)",
"DONATE": "💎 DONATE" "BUTTON_TITLE": "💎 DONATE"
}, },
"GPU_ID_INPUT": { "GPU_ID_INPUT": {
"ID": "GPU ID", "TITLE": "GPU ID",
"READ_DOCS": "Please read the Upscayl Documentation for more information.", "DESCRIPTION": "Please read the Upscayl Documentation for more information.",
"ENABLE_PERF_MODE": "Enable performance mode on Windows for better results." "ADDITIONAL_DESCRIPTION": "Enable performance mode on Windows for better results."
}, },
"IMAGE_FORMAT": { "IMAGE_FORMAT": {
"SAVE_AS": "SAVE IMAGE AS", "TITLE": "SAVE IMAGE AS",
"PNG": "PNG", "PNG": "PNG",
"JPG": "JPG", "JPG": "JPG",
"WEBP": "WEBP" "WEBP": "WEBP"
}, },
"IMAGE_SCALE": { "IMAGE_SCALE": {
"TITLE": "Image Scale", "TITLE": "Image Scale",
"TITLE_CAPS": "IMAGE SCALE", "IMAGE_SCALED_BY": "IMAGE SCALE ({scale}X)",
"SCALES_TIMES": "({scale}X)", "DESCRIPTION": "Anything above 4X (except 16X Double Upscayl) only resizes the image and does not use AI upscaling.",
"AI_UPSCALE_RESIZE_INFO": "Anything above 4X (except 16X Double Upscayl) only resizes the image and does not use AI upscaling." "WARNING": "Anything above 5X may cause performance issues on some devices!",
"ADDITIONAL_WARNING": "This may cause performance issues on some devices!"
}, },
"LOG_AREA": { "LOG_AREA": {
"ON_COPY": "COPIED ✅", "ON_COPY": "COPIED ✅",
"COPY": "COPY LOGS 📋", "BUTTON_TITLE": "COPY LOGS 📋",
"NO_LOGS": "No logs to show" "NO_LOGS": "No logs to show"
}, },
"OVERWRITE_TOGGLE": { "OVERWRITE_TOGGLE": {
"OW_PREV": "OVERWRITE PREVIOUS UPSCALE", "TITLE": "OVERWRITE PREVIOUS UPSCALE",
"OW_TIP": "If enabled, Upscayl will process the image again instead of loading it directly." "DESCRIPTION": "If enabled, Upscayl will process the image again instead of loading it directly."
}, },
"RESET_SETTINGS": { "RESET_SETTINGS": {
"TITLE": "RESET UPSCAYL", "BUTTON_TITLE": "RESET UPSCAYL",
"ON_RESET": "Upscayl has been reset. Please restart the app." "ALERT": "Upscayl has been reset. Please restart the app."
}, },
"SAVE_OUTPUT_FOLDER": { "SAVE_OUTPUT_FOLDER": {
"TITLE": "SAVE OUTPUT FOLDER", "TITLE": "SAVE OUTPUT FOLDER",
"DESC": "If enabled, the output folder will be remembered between sessions." "DESCRIPTION": "If enabled, the output folder will be remembered between sessions."
}, },
"THEME": { "THEME": {
"TITLE": "UPSCAYL THEME" "TITLE": "UPSCAYL THEME"
@ -93,125 +76,135 @@
}, },
"CUSTOM_TILE_SIZE": { "CUSTOM_TILE_SIZE": {
"TITLE": "CUSTOM TILE SIZE", "TITLE": "CUSTOM TILE SIZE",
"DESC": "Use a custom tile size for segmenting the image. This can help process images faster by reducing the number of tiles generated." "DESCRIPTION": "Use a custom tile size for segmenting the image. This can help process images faster by reducing the number of tiles generated."
}, },
"TURN_OFF_NOTIFICATIONS": { "TURN_OFF_NOTIFICATIONS": {
"TITLE": "TURN OFF NOTIFICATIONS", "TITLE": "TURN OFF NOTIFICATIONS",
"DESC": "If enabled, Upscayl will not send any system notifications on success or failure." "DESCRIPTION": "If enabled, Upscayl will not send any system notifications on success or failure."
}, },
"DIALOG_BOX": { "SUPPORT": {
"CLOSE": "Close" "TITLE": "Having issues?",
"DOCS_BUTTON_TITLE": "🙏 GET HELP",
"EMAIL_BUTTON_TITLE": "📧 EMAIL DEVELOPER"
}
}, },
"LEFT_PANE_PROCESS": { "APP": {
"BATCH": { "TITLE": "Upscayl",
"BATCH_MODE": {
"TITLE": "Batch Upscayl", "TITLE": "Batch Upscayl",
"TT_INFO": "This will let you Upscayl all files in a folder at once" "DESCRIPTION": "This will let you Upscayl all files in a folder at once"
}, },
"STEP_1": { "FILE_SELECTION": {
"TITLE": "Step 1", "TITLE": "Step 1",
"BATCH_YES": "Select Folder", "BATCH_MODE_TYPE": "Select Folder",
"BATCH_NO": "Select Image" "SINGLE_MODE_TYPE": "Select Image"
}, },
"STEP_2": { "MODEL_SELECTION": {
"TITLE": "Step 2", "TITLE": "Step 2",
"SELECT_MODEL": "Select Model" "DESCRIPTION": "Select Model"
}, },
"DOUBLE_UPSCAYL": { "DOUBLE_UPSCAYL": {
"TITLE": "Double Upscayl", "TITLE": "Double Upscayl",
"TT_INFO": "Enable this option to run upscayl twice on an image. Note that this may cause a significant increase in processing time and possibly performance issues for scales greater than 4X." "DESCRIPTION": "Enable this option to run upscayl twice on an image. Note that this may cause a significant increase in processing time and possibly performance issues for scales greater than 4X."
}, },
"STEP_3": { "OUTPUT_PATH_SELECTION": {
"TITLE": "Step 3", "TITLE": "Step 3",
"MACOS_RESTRICTION_ALERT": "Due to MacOS App Store security restrictions, Upscayl requires you to select an output folder everytime you start it.\n\nTo avoid this, you can permanently save a default output folder in the Upscayl 'Settings' tab.", "MAC_APP_STORE_ALERT": "Due to MacOS App Store security restrictions, Upscayl requires you to select an output folder everytime you start it.\n\nTo avoid this, you can permanently save a default output folder in the Upscayl 'Settings' tab.",
"NOT_SELECTED": "Not Selected", "NOT_SELECTED": "Not Selected",
"DEFAULT_IMG_PATH": "Defaults to Image's path", "DEFAULT_IMG_PATH": "Defaults to Image's path",
"DEFAULT_FOLDER_PATH": "Defaults to Folder's path", "DEFAULT_FOLDER_PATH": "Defaults to Folder's path",
"SET_OUTPUT_FOLDER": "Set Output Folder" "BUTTON_TITLE": "Set Output Folder"
}, },
"STEP_4": { "SCALE_SELECTION": {
"TITLE": "Step 4", "TITLE": "Step 4",
"UPSCAYL_FROM": "Upscayl from ", "FROM_TITLE": "Upscayl from ",
"UPSCAYL_TO": " to ", "TO_TITLE": " to ",
"FOLDER_ALERT": "Please select an output folder first", "NO_OUTPUT_FOLDER_ALERT": "Please select an output folder first",
"PROCESS_START": "Upscayl", "START_BUTTON_TITLE": "Upscayl",
"PROCESS_IN_PROGRESS": "Upscayling⏳" "IN_PROGRESS_BUTTON_TITLE": "Upscayling⏳"
}
}, },
"IMAGE_OPTIONS": { "IMAGE_OPTIONS": {
"RESET": "Reset Image", "RESET_BUTTON_TITLE": "Reset Image",
"LENS_VIEW": "Lens View", "LENS_VIEW_TITLE": "Lens View",
"SLIDER_VIEW": "Slider View", "SLIDER_VIEW_TITLE": "Slider View",
"ZOOM_AMOUNT": "Zoom Amount", "ZOOM_AMOUNT_TITLE": "Zoom Amount",
"LENS_SIZE": "Lens Size" "LENS_SIZE_TITLE": "Lens Size"
}, },
"PROGRESS_BAR": { "PROGRESS_BAR": {
"IN_PROGRESS": "Batch Upscayl In Progress:", "BATCH_UPSCAYL_IN_PROGRESS_TITLE": "Batch Upscayl In Progress:",
"PROGRESS_CATCHY": "Doing the Upscayl magic...", "IN_PROGRESS_TITLE": "Doing the Upscayl magic...",
"STOP": "STOP" "STOP_BUTTON_TITLE": "STOP"
}, },
"RESET": "Reset", "RESET_BUTTON_TITLE": "Reset",
"RIGHT_PANE_INFO": { "RIGHT_PANE_INFO": {
"SELECT_FOLDER": "Select a Folder to Upscayl", "SELECT_FOLDER": "Select a Folder to Upscayl",
"SELECT_IMAGE": "Select an Image to Upscayl", "SELECT_IMAGE": "Select an Image to Upscayl",
"NOTE_SPECIFIC_FORMATS_IN_FOLDER": "Make sure that the folder doesn't contain anything except PNG, JPG, JPEG & WEBP images.", "SELECT_FOLDER_DESCRIPTION": "Make sure that the folder doesn't contain anything except PNG, JPG, JPEG & WEBP images.",
"SELECT_IMAGES": "Select or drag and drop a PNG, JPG, JPEG or WEBP image.", "SELECT_IMAGES_DESCRIPTION": "Select or drag and drop a PNG, JPG, JPEG or WEBP image."
"APP_VERSION": "Upscayl v{version}" },
"PROGRESS": {
"PROCESSING_TITLE": "Processing the image...",
"SCALING_CONVERTING_TITLE": "Scaling and converting image...",
"WAIT_TITLE": "Hold on...",
"SUCCESS_TITLE": "Upscayl Successful!",
"BATCH": {
"SELECTED_FOLDER_TITLE": "Selected folder:",
"DONE_TITLE": "All done!",
"OPEN_UPSCAYLED_FOLDER_TITLE": "Open Upscayled Folder"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "Original",
"UPSCAYLED_TITLE": "Upscayled"
},
"DIALOG_BOX": {
"CLOSE": "Close"
} }
}, },
"ERRORS": { "ERRORS": {
"GPU_ERROR": { "GPU_ERROR": {
"TITLE": "GPU Error", "TITLE": "GPU Error",
"DESC": "Ran into an issue with the GPU. Please read the docs for troubleshooting! ({data})" "DESCRIPTION": "Ran into an issue with the GPU. Please read the docs for troubleshooting! ({data})"
}, },
"COPY_ERROR": { "COPY_ERROR": {
"TITLE": "Copy Error", "TITLE": "Copy Error",
"DESC": "" "DESCRIPTION": ""
}, },
"OPEN_DOCS": "Open Docs",
"TROUBLESHOOT": "Troubleshoot",
"READ_WRITE_ERROR": { "READ_WRITE_ERROR": {
"TITLE": "Read/Write Error", "TITLE": "Read/Write Error",
"DESC": "Make sure that the path is correct and you have proper read/write permissions \n({data})" "DESCRIPTION": "Make sure that the path is correct and you have proper read/write permissions \n({data})"
}, },
"TILE_SIZE_ERROR": { "TILE_SIZE_ERROR": {
"TITLE": "Error", "TITLE": "Error",
"DESC": "The tile size is wrong. Please change the tile size in the settings or set to 0 ({data})" "DESCRIPTION": "The tile size is wrong. Please change the tile size in the settings or set to 0 ({data})"
}, },
"EXCEPTION_ERROR": { "EXCEPTION_ERROR": {
"TITLE": "Exception Error", "TITLE": "Exception Error",
"DESC": "Upscayl encountered an error. Possibly, the upscayl binary failed to execute the commands properly. Try checking the logs to see if you get any information. You can post an issue on Upscayl's GitHub repository for more help." "DESCRIPTION": "Upscayl encountered an error. Possibly, the upscayl binary failed to execute the commands properly. Try checking the logs to see if you get any information. You can post an issue on Upscayl's GitHub repository for more help."
}, },
"GENERIC_ERROR": { "GENERIC_ERROR": {
"TITLE": "Error" "TITLE": "Error"
}, },
"INVALID_IMAGE_ERROR": { "INVALID_IMAGE_ERROR": {
"TITLE": "Invalid Image", "TITLE": "Invalid Image",
"DESC": "Please select an image with a valid extension like PNG, JPG, JPEG, or WEBP.", "DESCRIPTION": "Please select an image with a valid extension like PNG, JPG, JPEG, or WEBP.",
"DRAG_DESC": "Please drag and drop an image" "ADDITIONAL_DESCRIPTION": "Please drag and drop an image"
}, },
"NO_IMAGE_ERROR": { "NO_IMAGE_ERROR": {
"TITLE": "No image selected", "TITLE": "No image selected",
"DESC": "Please select an image to upscale" "DESCRIPTION": "Please select an image to upscale"
}, },
"IMAGE_SCALE_WARN": { "OPEN_DOCS_TITLE": "Open Docs",
"PERF_ISSUE": "Anything above 5X may cause performance issues on some devices!", "OPEN_DOCS_BUTTON_TITLE": "Troubleshoot"
"PERF_ISSUE_DEVICE": "This may cause performance issues on some devices!"
},
"ISSUE_CHECK": {
"TITLE": "Having issues?",
"GET_HELP": "🙏 GET HELP",
"EMAIL_DEV": "📧 EMAIL DEVELOPER"
}
}, },
"UPSCAYL_CLOUD": { "UPSCAYL_CLOUD": {
"COMING_SOON": "Coming soon!", "COMING_SOON": "Coming soon!",
"CATCHY_PHRASE_1": "No more errors, hardware issues, quality compromises or long loading times!", "CATCHY_PHRASE_1": "No more errors, hardware issues, quality compromises or long loading times!",
"CATCHY_PHRASE_2": "🌐 Upscayl anywhere, anytime, any device\n☁ No Graphics Card or hardware required\n👩 Face Enhancement\n🦋 10+ models to choose from\n🏎 5x faster than Upscayl Desktop\n🎞 Video Upscaling\n💰 Commercial Usage\n😴 Upscayl while you sleep", "CATCHY_PHRASE_2": "🌐 Upscayl anywhere, anytime, any device\n☁ No Graphics Card or hardware required\n👩 Face Enhancement\n🦋 10+ models to choose from\n🏎 5x faster than Upscayl Desktop\n🎞 Video Upscaling\n💰 Commercial Usage\n😴 Upscayl while you sleep",
"ALREADY_REGISTERED": "Thank you {name}! It seems that your email has already been registered :D If that's not the case, please try again.", "ALREADY_REGISTERED_ALERT": "Thank you {name}! It seems that your email has already been registered :D If that's not the case, please try again.",
"ADD_SUCCESS": "Thank you for joining the waitlist! We will notify you when Upscayl Cloud is ready for you.", "ADD_SUCCESS": "Thank you for joining the waitlist! We will notify you when Upscayl Cloud is ready for you.",
"INCORRECT_FIELDS": "Please fill in all the fields correctly.", "INCORRECT_FIELDS_ALERT": "Please fill in all the fields correctly.",
"JOIN_WAITLIST": "Join the waitlist", "JOIN_WAITLIST": "Join the waitlist",
"DONT_SHOW_AGAIN": "DON'T SHOW AGAIN" "DONT_SHOW_AGAIN": "DON'T SHOW AGAIN"
} }
}
} }

210
renderer/locales/es.json Normal file
View File

@ -0,0 +1,210 @@
{
"TITLE": "Upscayl",
"INTRO": "¡Presentamos Upscayl Cloud!",
"HEADER": {
"GITHUB_BUTTON_TITLE": "Danos una estrella en GitHub 😁",
"DESCRIPTION": "Aumentador de imágenes con IA"
},
"FOOTER": {
"NEWS_TITLE": "NOTICIAS DE UPSCAYL",
"COPYRIGHT": "Copyright ©",
"TITLE": "Por ",
"LINK_TITLE": "El equipo de Upscayl"
},
"SETTINGS": {
"TITLE": "AJUSTES",
"CHANGE_LANGUAGE": { "TITLE": "Cambiar idioma" },
"IMAGE_COMPRESSION": {
"TITLE": "Compresión de imagen",
"DESCRIPTION": "La compresión PNG es sin pérdida, por lo que puede que no reduzca el tamaño del archivo significativamente y los valores de compresión más altos podrían afectar el rendimiento. La compresión JPG y WebP es con pérdida."
},
"CUSTOM_MODELS": {
"TITLE": "AÑADIR MODELOS PERSONALIZADOS",
"BUTTON_FOLDER": "Seleccionar carpeta",
"DESCRIPTION": "Puedes añadir tus propios modelos fácilmente. Para más detalles:",
"LINK_TITLE": "Repositorio de Modelos Personalizados"
},
"CUSTOM_INPUT_RESOLUTION": {
"TITLE": "ANCHO DE SALIDA PERSONALIZADO",
"RESTART": "REQUIERE REINICIO",
"DESCRIPTION": "Usa un ancho personalizado para las imágenes de salida. La altura se ajustará automáticamente. Al habilitar esto, se anulará la configuración de escala."
},
"DONATE": {
"DESCRIPTION": "Si te gusta lo que hacemos :)",
"BUTTON_TITLE": "💎 DONAR"
},
"GPU_ID_INPUT": {
"TITLE": "ID de GPU",
"DESCRIPTION": "Por favor, lee la documentación de Upscayl para más información.",
"ADDITIONAL_DESCRIPTION": "Habilita el modo de rendimiento en Windows para obtener mejores resultados."
},
"IMAGE_FORMAT": {
"TITLE": "GUARDAR IMAGEN COMO",
"PNG": "PNG",
"JPG": "JPG",
"WEBP": "WEBP"
},
"IMAGE_SCALE": {
"TITLE": "Escala de imagen",
"IMAGE_SCALED_BY": "ESCALA DE IMAGEN ({scale}X)",
"DESCRIPTION": "Cualquier cosa por encima de 4X (excepto 16X Double Upscayl) solo redimensiona la imagen y no usa aumento con IA.",
"WARNING": "¡Cualquier cosa por encima de 5X puede causar problemas de rendimiento en algunos dispositivos!",
"ADDITIONAL_WARNING": "¡Esto puede causar problemas de rendimiento en algunos dispositivos!"
},
"LOG_AREA": {
"ON_COPY": "COPIADO ✅",
"BUTTON_TITLE": "COPIAR REGISTROS 📋",
"NO_LOGS": "No hay registros para mostrar"
},
"OVERWRITE_TOGGLE": {
"TITLE": "SOBREESCRIBIR AUMENTO ANTERIOR",
"DESCRIPTION": "Si está habilitado, Upscayl procesará la imagen de nuevo en lugar de cargarla directamente."
},
"RESET_SETTINGS": {
"BUTTON_TITLE": "REINICIAR UPSCAYL",
"ALERT": "Upscayl ha sido reiniciado. Por favor, reinicia la aplicación."
},
"SAVE_OUTPUT_FOLDER": {
"TITLE": "GUARDAR CARPETA DE SALIDA",
"DESCRIPTION": "Si está habilitado, la carpeta de salida se recordará entre sesiones."
},
"THEME": {
"TITLE": "TEMA DE UPSCAYL"
},
"LANGUAGE": {
"TITLE": "IDIOMA DE UPSCAYL"
},
"CUSTOM_TILE_SIZE": {
"TITLE": "TAMAÑO DE MOSAICO PERSONALIZADO",
"DESCRIPTION": "Usa un tamaño de mosaico personalizado para segmentar la imagen. Esto puede ayudar a procesar las imágenes más rápido al reducir el número de mosaicos generados."
},
"TURN_OFF_NOTIFICATIONS": {
"TITLE": "APAGAR NOTIFICACIONES",
"DESCRIPTION": "Si está habilitado, Upscayl no enviará notificaciones del sistema al tener éxito o fallar."
},
"SUPPORT": {
"TITLE": "¿Tienes problemas?",
"DOCS_BUTTON_TITLE": "🙏 OBTENER AYUDA",
"EMAIL_BUTTON_TITLE": "📧 CORREO AL DESARROLLADOR"
}
},
"APP": {
"TITLE": "Upscayl",
"BATCH_MODE": {
"TITLE": "Aumento por lotes",
"DESCRIPTION": "Esto te permitirá aumentar todas las imágenes en una carpeta a la vez"
},
"FILE_SELECTION": {
"TITLE": "Paso 1",
"BATCH_MODE_TYPE": "Seleccionar carpeta",
"SINGLE_MODE_TYPE": "Seleccionar imagen"
},
"MODEL_SELECTION": {
"TITLE": "Paso 2",
"DESCRIPTION": "Seleccionar modelo"
},
"DOUBLE_UPSCAYL": {
"TITLE": "Doble Upscayl",
"DESCRIPTION": "Habilita esta opción para realizar dos aumentos en una imagen. Ten en cuenta que esto puede causar un aumento significativo en el tiempo de procesamiento y posiblemente problemas de rendimiento para escalas superiores a 4X."
},
"OUTPUT_PATH_SELECTION": {
"TITLE": "Paso 3",
"MAC_APP_STORE_ALERT": "Debido a las restricciones de seguridad de la MacOS App Store, Upscayl requiere que selecciones una carpeta de salida cada vez que lo inicies.\n\nPara evitar esto, puedes guardar permanentemente una carpeta de salida predeterminada en la pestaña 'Ajustes' de Upscayl.",
"NOT_SELECTED": "No seleccionado",
"DEFAULT_IMG_PATH": "Ruta predeterminada de la imagen",
"DEFAULT_FOLDER_PATH": "Ruta predeterminada de la carpeta",
"BUTTON_TITLE": "Establecer carpeta de salida"
},
"SCALE_SELECTION": {
"TITLE": "Paso 4",
"FROM_TITLE": "Aumentar desde ",
"TO_TITLE": " a ",
"NO_OUTPUT_FOLDER_ALERT": "Por favor, selecciona primero una carpeta de salida",
"START_BUTTON_TITLE": "Upscayl",
"IN_PROGRESS_BUTTON_TITLE": "Aumentando⏳"
},
"IMAGE_OPTIONS": {
"RESET_BUTTON_TITLE": "Restablecer imagen",
"LENS_VIEW_TITLE": "Vista de lente",
"SLIDER_VIEW_TITLE": "Vista de deslizador",
"ZOOM_AMOUNT_TITLE": "Cantidad de zoom",
"LENS_SIZE_TITLE": "Tamaño de lente"
},
"PROGRESS_BAR": {
"BATCH_UPSCAYL_IN_PROGRESS_TITLE": "Aumento por lotes en progreso:",
"IN_PROGRESS_TITLE": "Haciendo la magia de Upscayl...",
"STOP_BUTTON_TITLE": "DETENER"
},
"RESET_BUTTON_TITLE": "Restablecer",
"RIGHT_PANE_INFO": {
"SELECT_FOLDER": "Selecciona una carpeta para aumentar",
"SELECT_IMAGE": "Selecciona una imagen para aumentar",
"SELECT_FOLDER_DESCRIPTION": "Asegúrate de que la carpeta no contenga nada excepto imágenes PNG, JPG, JPEG y WEBP.",
"SELECT_IMAGES_DESCRIPTION": "Selecciona o arrastra y suelta una imagen PNG, JPG, JPEG o WEBP."
},
"PROGRESS": {
"PROCESSING_TITLE": "Procesando la imagen...",
"SCALING_CONVERTING_TITLE": "Escalando y convirtiendo la imagen...",
"WAIT_TITLE": "Espera un momento...",
"SUCCESS_TITLE": "¡Aumento exitoso!",
"BATCH": {
"SELECTED_FOLDER_TITLE": "Carpeta seleccionada:",
"DONE_TITLE": "¡Todo listo!",
"OPEN_UPSCAYLED_FOLDER_TITLE": "Abrir carpeta con imágenes aumentadas"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "Original",
"UPSCAYLED_TITLE": "Aumentado"
},
"DIALOG_BOX": {
"CLOSE": "Cerrar"
}
},
"ERRORS": {
"GPU_ERROR": {
"TITLE": "Error de GPU",
"DESCRIPTION": "Se encontró un problema con la GPU. Por favor, lee la documentación para solucionar problemas. ({data})"
},
"COPY_ERROR": {
"TITLE": "Error de copiado",
"DESCRIPTION": ""
},
"READ_WRITE_ERROR": {
"TITLE": "Error de lectura/escritura",
"DESCRIPTION": "Asegúrate de que la ruta sea correcta y que tengas los permisos adecuados de lectura/escritura \n({data})"
},
"TILE_SIZE_ERROR": {
"TITLE": "Error",
"DESCRIPTION": "El tamaño del mosaico es incorrecto. Cambia el tamaño del mosaico en los ajustes o configúralo en 0 ({data})"
},
"EXCEPTION_ERROR": {
"TITLE": "Error de excepción",
"DESCRIPTION": "Upscayl encontró un error. Es posible que el binario de Upscayl no haya ejecutado los comandos correctamente. Intenta revisar los registros para ver si obtienes alguna información. Puedes publicar un problema en el repositorio de GitHub de Upscayl para obtener más ayuda."
},
"GENERIC_ERROR": {
"TITLE": "Error"
},
"INVALID_IMAGE_ERROR": {
"TITLE": "Imagen inválida",
"DESCRIPTION": "Por favor, selecciona una imagen con una extensión válida como PNG, JPG, JPEG o WEBP.",
"ADDITIONAL_DESCRIPTION": "Por favor, arrastra y suelta una imagen"
},
"NO_IMAGE_ERROR": {
"TITLE": "No se ha seleccionado imagen",
"DESCRIPTION": "Por favor, selecciona una imagen para aumentar"
},
"OPEN_DOCS_TITLE": "Abrir documentación",
"OPEN_DOCS_BUTTON_TITLE": "Solucionar problemas"
},
"UPSCAYL_CLOUD": {
"COMING_SOON": "¡Próximamente!",
"CATCHY_PHRASE_1": "¡No más errores, problemas de hardware, compromisos de calidad o largos tiempos de carga!",
"CATCHY_PHRASE_2": "🌐 Aumenta en cualquier lugar, en cualquier momento, en cualquier dispositivo\n☁ No se requiere tarjeta gráfica ni hardware\n👩 Mejora de rostros\n🦋 Más de 10 modelos para elegir\n🏎 5 veces más rápido que Upscayl Desktop\n🎞 Aumento de videos\n💰 Uso comercial\n😴 Aumenta mientras duermes",
"ALREADY_REGISTERED_ALERT": "¡Gracias {name}! Parece que tu correo electrónico ya ha sido registrado :D Si no es así, por favor intenta de nuevo.",
"ADD_SUCCESS": "¡Gracias por unirte a la lista de espera! Te notificaremos cuando Upscayl Cloud esté listo para ti.",
"INCORRECT_FIELDS_ALERT": "Por favor, completa todos los campos correctamente.",
"JOIN_WAITLIST": "Únete a la lista de espera",
"DONT_SHOW_AGAIN": "NO MOSTRAR DE NUEVO"
}
}

210
renderer/locales/fr.json Normal file
View File

@ -0,0 +1,210 @@
{
"TITLE": "Upscayl",
"INTRO": "Présentation de Upscayl Cloud !",
"HEADER": {
"GITHUB_BUTTON_TITLE": "Étoilez-nous sur GitHub 😁",
"DESCRIPTION": "Suréchantillonneur d'images AI"
},
"FOOTER": {
"NEWS_TITLE": "NOUVELLES UPSCAYL",
"COPYRIGHT": "Droits d'auteur ©",
"TITLE": "Par ",
"LINK_TITLE": "L'équipe Upscayl"
},
"SETTINGS": {
"TITLE": "PARAMÈTRES",
"CHANGE_LANGUAGE": { "TITLE": "Changer de langue" },
"IMAGE_COMPRESSION": {
"TITLE": "Compression d'image",
"DESCRIPTION": "La compression PNG est sans perte, donc elle pourrait ne pas réduire la taille du fichier de manière significative et des valeurs de compression plus élevées pourraient affecter les performances. La compression JPG et WebP est avec perte."
},
"CUSTOM_MODELS": {
"TITLE": "AJOUTER DES MODÈLES PERSONNALISÉS",
"BUTTON_FOLDER": "Sélectionner un dossier",
"DESCRIPTION": "Vous pouvez ajouter vos propres modèles facilement. Pour plus de détails :",
"LINK_TITLE": "Répertoire des modèles personnalisés"
},
"CUSTOM_INPUT_RESOLUTION": {
"TITLE": "LARGEUR DE SORTIE PERSONNALISÉE",
"RESTART": "NÉCESSITE UN REDÉMARRAGE",
"DESCRIPTION": "Utilisez une largeur personnalisée pour les images de sortie. La hauteur sera ajustée automatiquement. Activer cela remplacera le paramètre d'échelle."
},
"DONATE": {
"DESCRIPTION": "Si vous aimez ce que nous faisons :)",
"BUTTON_TITLE": "💎 FAIRE UN DON"
},
"GPU_ID_INPUT": {
"TITLE": "ID GPU",
"DESCRIPTION": "Veuillez lire la documentation Upscayl pour plus d'informations.",
"ADDITIONAL_DESCRIPTION": "Activez le mode performance sur Windows pour de meilleurs résultats."
},
"IMAGE_FORMAT": {
"TITLE": "ENREGISTRER L'IMAGE SOUS",
"PNG": "PNG",
"JPG": "JPG",
"WEBP": "WEBP"
},
"IMAGE_SCALE": {
"TITLE": "Échelle de l'image",
"IMAGE_SCALED_BY": "ÉCHELLE DE L'IMAGE ({scale}X)",
"DESCRIPTION": "Tout ce qui dépasse 4X (sauf 16X Double Upscayl) ne fait que redimensionner l'image et n'utilise pas le suréchantillonnage AI.",
"WARNING": "Tout ce qui dépasse 5X peut causer des problèmes de performance sur certains appareils !",
"ADDITIONAL_WARNING": "Cela peut causer des problèmes de performance sur certains appareils !"
},
"LOG_AREA": {
"ON_COPY": "COPIÉ ✅",
"BUTTON_TITLE": "COPIER LES JOURNAUX 📋",
"NO_LOGS": "Aucun journal à afficher"
},
"OVERWRITE_TOGGLE": {
"TITLE": "ÉCRASER LE SURÉCHANTILLONNAGE PRÉCÉDENT",
"DESCRIPTION": "Si activé, Upscayl traitera à nouveau l'image au lieu de la charger directement."
},
"RESET_SETTINGS": {
"BUTTON_TITLE": "RÉINITIALISER UPSCAYL",
"ALERT": "Upscayl a été réinitialisé. Veuillez redémarrer l'application."
},
"SAVE_OUTPUT_FOLDER": {
"TITLE": "ENREGISTRER LE DOSSIER DE SORTIE",
"DESCRIPTION": "Si activé, le dossier de sortie sera mémorisé entre les sessions."
},
"THEME": {
"TITLE": "THÈME UPSCAYL"
},
"LANGUAGE": {
"TITLE": "LANGUE UPSCAYL"
},
"CUSTOM_TILE_SIZE": {
"TITLE": "TAILLE DE TUILE PERSONNALISÉE",
"DESCRIPTION": "Utilisez une taille de tuile personnalisée pour segmenter l'image. Cela peut aider à traiter les images plus rapidement en réduisant le nombre de tuiles générées."
},
"TURN_OFF_NOTIFICATIONS": {
"TITLE": "DÉSACTIVER LES NOTIFICATIONS",
"DESCRIPTION": "Si activé, Upscayl n'enverra aucune notification système en cas de succès ou d'échec."
},
"SUPPORT": {
"TITLE": "Vous avez des problèmes ?",
"DOCS_BUTTON_TITLE": "🙏 OBTENIR DE L'AIDE",
"EMAIL_BUTTON_TITLE": "📧 EMAIL AU DÉVELOPPEUR"
}
},
"APP": {
"TITLE": "Upscayl",
"BATCH_MODE": {
"TITLE": "Suréchantillonnage par lot",
"DESCRIPTION": "Cela vous permettra de suréchantillonner tous les fichiers d'un dossier en une seule fois"
},
"FILE_SELECTION": {
"TITLE": "Étape 1",
"BATCH_MODE_TYPE": "Sélectionner un dossier",
"SINGLE_MODE_TYPE": "Sélectionner une image"
},
"MODEL_SELECTION": {
"TITLE": "Étape 2",
"DESCRIPTION": "Sélectionner un modèle"
},
"DOUBLE_UPSCAYL": {
"TITLE": "Double Upscayl",
"DESCRIPTION": "Activez cette option pour exécuter le suréchantillonnage deux fois sur une image. Notez que cela peut entraîner une augmentation significative du temps de traitement et éventuellement des problèmes de performance pour des échelles supérieures à 4X."
},
"OUTPUT_PATH_SELECTION": {
"TITLE": "Étape 3",
"MAC_APP_STORE_ALERT": "En raison des restrictions de sécurité de l'App Store MacOS, Upscayl vous demande de sélectionner un dossier de sortie à chaque démarrage.\n\nPour éviter cela, vous pouvez enregistrer de manière permanente un dossier de sortie par défaut dans l'onglet 'Paramètres' d'Upscayl.",
"NOT_SELECTED": "Non sélectionné",
"DEFAULT_IMG_PATH": "Par défaut au chemin de l'image",
"DEFAULT_FOLDER_PATH": "Par défaut au chemin du dossier",
"BUTTON_TITLE": "Définir le dossier de sortie"
},
"SCALE_SELECTION": {
"TITLE": "Étape 4",
"FROM_TITLE": "Suréchantillonner de ",
"TO_TITLE": " à ",
"NO_OUTPUT_FOLDER_ALERT": "Veuillez d'abord sélectionner un dossier de sortie",
"START_BUTTON_TITLE": "Suréchantillonner",
"IN_PROGRESS_BUTTON_TITLE": "Suréchantillonnage⏳"
},
"IMAGE_OPTIONS": {
"RESET_BUTTON_TITLE": "Réinitialiser l'image",
"LENS_VIEW_TITLE": "Vue de la lentille",
"SLIDER_VIEW_TITLE": "Vue du curseur",
"ZOOM_AMOUNT_TITLE": "Niveau de zoom",
"LENS_SIZE_TITLE": "Taille de la lentille"
},
"PROGRESS_BAR": {
"BATCH_UPSCAYL_IN_PROGRESS_TITLE": "Suréchantillonnage par lot en cours :",
"IN_PROGRESS_TITLE": "Faire la magie du suréchantillonnage...",
"STOP_BUTTON_TITLE": "ARRÊTER"
},
"RESET_BUTTON_TITLE": "Réinitialiser",
"RIGHT_PANE_INFO": {
"SELECT_FOLDER": "Sélectionnez un dossier à suréchantillonner",
"SELECT_IMAGE": "Sélectionnez une image à suréchantillonner",
"SELECT_FOLDER_DESCRIPTION": "Assurez-vous que le dossier ne contient rien d'autre que des images PNG, JPG, JPEG et WEBP.",
"SELECT_IMAGES_DESCRIPTION": "Sélectionnez ou glissez-déposez une image PNG, JPG, JPEG ou WEBP."
},
"PROGRESS": {
"PROCESSING_TITLE": "Traitement de l'image...",
"SCALING_CONVERTING_TITLE": "Mise à l'échelle et conversion de l'image...",
"WAIT_TITLE": "Patientez...",
"SUCCESS_TITLE": "Suréchantillonnage réussi !",
"BATCH": {
"SELECTED_FOLDER_TITLE": "Dossier sélectionné :",
"DONE_TITLE": "Tout est terminé !",
"OPEN_UPSCAYLED_FOLDER_TITLE": "Ouvrir le dossier suréchantillonné"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "Original",
"UPSCAYLED_TITLE": "Suréchantillonné"
},
"DIALOG_BOX": {
"CLOSE": "Fermer"
}
},
"ERRORS": {
"GPU_ERROR": {
"TITLE": "Erreur GPU",
"DESCRIPTION": "Un problème est survenu avec le GPU. Veuillez lire la documentation pour le dépannage ! ({data})"
},
"COPY_ERROR": {
"TITLE": "Erreur de copie",
"DESCRIPTION": ""
},
"READ_WRITE_ERROR": {
"TITLE": "Erreur de lecture/écriture",
"DESCRIPTION": "Assurez-vous que le chemin est correct et que vous avez les permissions de lecture/écriture appropriées \n({data})"
},
"TILE_SIZE_ERROR": {
"TITLE": "Erreur",
"DESCRIPTION": "La taille de la tuile est incorrecte. Veuillez changer la taille de la tuile dans les paramètres ou la définir à 0 ({data})"
},
"EXCEPTION_ERROR": {
"TITLE": "Erreur d'exception",
"DESCRIPTION": "Upscayl a rencontré une erreur. Il est possible que le binaire Upscayl n'ait pas réussi à exécuter correctement les commandes. Essayez de vérifier les journaux pour voir si vous obtenez des informations. Vous pouvez poster un problème sur le dépôt GitHub d'Upscayl pour obtenir plus d'aide."
},
"GENERIC_ERROR": {
"TITLE": "Erreur"
},
"INVALID_IMAGE_ERROR": {
"TITLE": "Image invalide",
"DESCRIPTION": "Veuillez sélectionner une image avec une extension valide comme PNG, JPG, JPEG ou WEBP.",
"ADDITIONAL_DESCRIPTION": "Veuillez glisser-déposer une image"
},
"NO_IMAGE_ERROR": {
"TITLE": "Aucune image sélectionnée",
"DESCRIPTION": "Veuillez sélectionner une image à suréchantillonner"
},
"OPEN_DOCS_TITLE": "Ouvrir la documentation",
"OPEN_DOCS_BUTTON_TITLE": "Dépanner"
},
"UPSCAYL_CLOUD": {
"COMING_SOON": "Bientôt disponible !",
"CATCHY_PHRASE_1": "Plus d'erreurs, de problèmes matériels, de compromis sur la qualité ou de longs temps de chargement !",
"CATCHY_PHRASE_2": "🌐 Suréchantillonnez n'importe où, n'importe quand, sur n'importe quel appareil\n☁ Pas de carte graphique ou de matériel requis\n👩 Amélioration du visage\n🦋 Plus de 10 modèles au choix\n🏎 5x plus rapide que Upscayl Desktop\n🎞 Suréchantillonnage vidéo\n💰 Utilisation commerciale\n😴 Suréchantillonnez pendant que vous dormez",
"ALREADY_REGISTERED_ALERT": "Merci {name} ! Il semble que votre email ait déjà été enregistré :D Si ce n'est pas le cas, veuillez réessayer.",
"ADD_SUCCESS": "Merci de rejoindre la liste d'attente ! Nous vous informerons lorsque Upscayl Cloud sera prêt pour vous.",
"INCORRECT_FIELDS_ALERT": "Veuillez remplir correctement tous les champs.",
"JOIN_WAITLIST": "Rejoindre la liste d'attente",
"DONT_SHOW_AGAIN": "NE PLUS AFFICHER"
}
}

View File

@ -1,217 +1,210 @@
{ {
"APP": {
"TITLE": "Upscayl", "TITLE": "Upscayl",
"INTRO": "Upscayl Cloudの紹介", "INTRO": "Upscayl Cloudを紹介します",
"HEADER": { "HEADER": {
"GITHUB_STAR_TT_INFO": "GitHubでスターをつけてください 😁", "GITHUB_BUTTON_TITLE": "GitHubでスターをつけてください 😁",
"APP_INFO": "AI画像アップスケーラー" "DESCRIPTION": "AI画像アップスケーラー"
}, },
"FOOTER": { "FOOTER": {
"NEWS_TITLE": "UPSCAYLニュース", "NEWS_TITLE": "UPSCAYLニュース",
"COPYRIGHT": "著作権 ©", "COPYRIGHT": "著作権 ©",
"BY": "作成者 ", "TITLE": "作成者: ",
"APP_TEAM": "Upscaylチーム" "LINK_TITLE": "Upscaylチーム"
}, },
"SETTINGS": { "SETTINGS": {
"TITLE": "設定", "TITLE": "設定",
"CHANGE_LANG": "言語を変更" "CHANGE_LANGUAGE": { "TITLE": "言語を変更する" },
},
"INFOS": {
"IMAGE_PROCESSING": {
"START": "画像を処理中...",
"SCALE_CONVERT": "画像をスケールして変換中...",
"WAIT": "少々お待ちください...",
"SUCCESS": "Upscaylに成功しました",
"BATCH": {
"SELECT": "選択されたフォルダ:",
"DONE": "すべて完了!",
"OPEN_DONE_FOLDER": "Upscayledフォルダを開く"
}
},
"COMPARISION": {
"SLIDER_ORIGINAL": "オリジナル",
"SLIDER_PROCESSED": "Upscayled"
},
"IMAGE_COMPRESSION": { "IMAGE_COMPRESSION": {
"TITLE": "画像圧縮 ({compression}%)", "TITLE": "画像圧縮",
"LOSSLESS_TIP": "PNG圧縮は無損失のため、ファイルサイズが大幅に減らない可能性があります。圧縮率を高くするとパフォーマンスに影響が出る場合があります。JPGとWebPの圧縮は有損です。" "DESCRIPTION": "PNG圧縮は非可逆的であるため、ファイルサイズが大幅に削減されることはなく、高い圧縮値はパフォーマンスに影響を与える可能性があります。JPGおよびWebP圧縮は可逆的です。"
}, },
"CUSTOM_MODELS": { "CUSTOM_MODELS": {
"ADD": "カスタムモデルを追加", "TITLE": "カスタムモデルを追加",
"SELECT_FOLDER": "フォルダを選択", "BUTTON_FOLDER": "フォルダを選択",
"INFO": "簡単に独自のモデルを追加できます。詳細については:", "DESCRIPTION": "簡単に独自のモデルを追加できます。詳細については:",
"LINK_TEXT": "カスタムモデルリポジトリ" "LINK_TITLE": "カスタムモデルリポジトリ"
}, },
"CUSTOM_INPUT_RESOLUTION": { "CUSTOM_INPUT_RESOLUTION": {
"WIDTH": "カスタム出力幅", "TITLE": "カスタム出力幅",
"RESTART": "再起動が必要", "RESTART": "再起動が必要",
"CUSTOM_WIDTH_TIP": "出力画像のカスタム幅を使用します。高さは自動的に調整されます。これを有効にすると、スケール設定が無効になります。" "DESCRIPTION": "出力画像のカスタム幅を使用します。高さは自動的に調整されます。これを有効にすると、スケール設定が上書きされます。"
}, },
"DONATE": { "DONATE": {
"IF_LIKED": "気に入っていただけたら :)", "DESCRIPTION": "私たちの活動が気に入ったら :)",
"DONATE": "💎 寄付する" "BUTTON_TITLE": "💎 寄付する"
}, },
"GPU_ID_INPUT": { "GPU_ID_INPUT": {
"ID": "GPU ID", "TITLE": "GPU ID",
"READ_DOCS": "詳細については、Upscaylのドキュメントをお読みください。", "DESCRIPTION": "詳細については、Upscaylのドキュメントをお読みください。",
"ENABLE_PERF_MODE": "Windowsでパフォーマンスモードを有効にして、より良い結果を得る。" "ADDITIONAL_DESCRIPTION": "Windowsでパフォーマンスモードを有効にして、より良い結果を得ることができます。"
}, },
"IMAGE_FORMAT": { "IMAGE_FORMAT": {
"SAVE_AS": "画像を保存", "TITLE": "画像を保存する形式",
"PNG": "PNG", "PNG": "PNG",
"JPG": "JPG", "JPG": "JPG",
"WEBP": "WEBP" "WEBP": "WEBP"
}, },
"IMAGE_SCALE": { "IMAGE_SCALE": {
"TITLE": "画像スケール", "TITLE": "画像スケール",
"TITLE_CAPS": "画像スケール", "IMAGE_SCALED_BY": "画像スケール ({scale}X)",
"SCALES_TIMES": "({scale}倍)", "DESCRIPTION": "4X以上のスケール16X Double Upscaylを除くは、画像をリサイズするだけで、AIアップスケーリングは行われません。",
"AI_UPSCALE_RESIZE_INFO": "4倍以上16倍のDouble Upscaylを除くは、画像のサイズ変更のみで、AIアップスケールは行われません。" "WARNING": "5X以上は一部のデバイスでパフォーマンスに問題を引き起こす可能性があります",
"ADDITIONAL_WARNING": "これにより、一部のデバイスでパフォーマンスに問題が発生する可能性があります!"
}, },
"LOG_AREA": { "LOG_AREA": {
"ON_COPY": "コピーされました ✅", "ON_COPY": "コピーされました ✅",
"COPY": "ログをコピー 📋", "BUTTON_TITLE": "ログをコピー 📋",
"NO_LOGS": "表示するログがありません" "NO_LOGS": "表示するログがありません"
}, },
"OVERWRITE_TOGGLE": { "OVERWRITE_TOGGLE": {
"OW_PREV": "以前のアップスケールを上書き", "TITLE": "以前のアップスケールを上書き",
"OW_TIP": "有効にすると、Upscaylは画像を再処理し、直接読み込むのではなく処理します。" "DESCRIPTION": "有効にすると、Upscaylは画像を再処理し、直接ロードするのではなく再度処理します。"
}, },
"RESET_SETTINGS": { "RESET_SETTINGS": {
"TITLE": "UPSCAYLをリセット", "BUTTON_TITLE": "Upscaylをリセット",
"ON_RESET": "Upscaylがリセットされました。アプリを再起動してください。" "ALERT": "Upscaylがリセットされました。アプリを再起動してください。"
}, },
"SAVE_OUTPUT_FOLDER": { "SAVE_OUTPUT_FOLDER": {
"TITLE": "出力フォルダを保存", "TITLE": "出力フォルダを保存",
"DESC": "有効にすると、セッション間で出力フォルダが記憶されます。" "DESCRIPTION": "有効にすると、セッション間で出力フォルダが記憶されます。"
}, },
"THEME": { "THEME": {
"TITLE": "UPSCAYL テーマ" "TITLE": "UPSCAYLテーマ"
}, },
"LANGUAGE": { "LANGUAGE": {
"TITLE": "UPSCAYL 言語" "TITLE": "UPSCAYLの言語"
}, },
"CUSTOM_TILE_SIZE": { "CUSTOM_TILE_SIZE": {
"TITLE": "カスタムタイルサイズ", "TITLE": "カスタムタイルサイズ",
"DESC": "画像を分割するためのカスタムタイルサイズを使用します。これにより、生成されるタイルの数を減らすことで、画像処理を高速化できます。" "DESCRIPTION": "画像をセグメント化するためにカスタムタイルサイズを使用します。これにより、生成されるタイルの数を減らして画像をより速く処理できます。"
}, },
"TURN_OFF_NOTIFICATIONS": { "TURN_OFF_NOTIFICATIONS": {
"TITLE": "通知をオフにする", "TITLE": "通知をオフにする",
"DESC": "有効にすると、Upscaylは成功や失敗時のシステム通知を送信しません。" "DESCRIPTION": "有効にすると、Upscaylは成功または失敗時にシステム通知を送信しなくなります。"
}, },
"DIALOG_BOX": { "SUPPORT": {
"CLOSE": "閉じる" "TITLE": "問題がありますか?",
"DOCS_BUTTON_TITLE": "🙏 サポートを受ける",
"EMAIL_BUTTON_TITLE": "📧 開発者にメール"
}
}, },
"LEFT_PANE_PROCESS": { "APP": {
"BATCH": { "TITLE": "Upscayl",
"BATCH_MODE": {
"TITLE": "バッチUpscayl", "TITLE": "バッチUpscayl",
"TT_INFO": "これにより、フォルダ内のすべてのファイルを一度にUpscaylできます" "DESCRIPTION": "これにより、フォルダ内のすべてのファイルを一度にUpscaylできます"
}, },
"STEP_1": { "FILE_SELECTION": {
"TITLE": "ステップ1", "TITLE": "ステップ 1",
"BATCH_YES": "フォルダを選択", "BATCH_MODE_TYPE": "フォルダを選択",
"BATCH_NO": "画像を選択" "SINGLE_MODE_TYPE": "画像を選択"
}, },
"STEP_2": { "MODEL_SELECTION": {
"TITLE": "ステップ2", "TITLE": "ステップ 2",
"SELECT_MODEL": "モデルを選択" "DESCRIPTION": "モデルを選択"
}, },
"DOUBLE_UPSCAYL": { "DOUBLE_UPSCAYL": {
"TITLE": "Double Upscayl", "TITLE": "Double Upscayl",
"TT_INFO": "このオプションを有効にすると、画像に対して2回Upscaylを実行します。4倍以上のスケールでは、処理時間が大幅に増加し、パフォーマンス問題が発生する可能性があります。" "DESCRIPTION": "このオプションを有効にすると、画像に対して2回Upscaylを実行します。4X以上のスケールでは、処理時間が大幅に増加し、パフォーマンスに問題が発生する可能性があることに注意してください。"
}, },
"STEP_3": { "OUTPUT_PATH_SELECTION": {
"TITLE": "ステップ3", "TITLE": "ステップ 3",
"MACOS_RESTRICTION_ALERT": "MacOS App Storeのセキュリティ制限のため、Upscaylを起動するたびに出力フォルダを選択する必要があります。\n\nこれを避けるために、Upscaylの「設定」タブでデフォルトの出力フォルダを永続的に保存できます。", "MAC_APP_STORE_ALERT": "MacOS App Storeのセキュリティ制限のため、Upscaylを開始するたびに出力フォルダを選択する必要があります。\n\nこれを回避するには、Upscaylの「設定」タブでデフォルトの出力フォルダを永久に保存できます。",
"NOT_SELECTED": "未選択", "NOT_SELECTED": "未選択",
"DEFAULT_IMG_PATH": "画像のパスにデフォルト設定", "DEFAULT_IMG_PATH": "画像のパスがデフォルトになります",
"DEFAULT_FOLDER_PATH": "フォルダのパスにデフォルト設定", "DEFAULT_FOLDER_PATH": "フォルダのパスがデフォルトになります",
"SET_OUTPUT_FOLDER": "出力フォルダを設定" "BUTTON_TITLE": "出力フォルダを設定"
}, },
"STEP_4": { "SCALE_SELECTION": {
"TITLE": "ステップ4", "TITLE": "ステップ 4",
"UPSCAYL_FROM": "Upscaylから ", "FROM_TITLE": "Upscayl元 ",
"UPSCAYL_TO": " まで", "TO_TITLE": " から ",
"FOLDER_ALERT": "まず出力フォルダを選択してください", "NO_OUTPUT_FOLDER_ALERT": "まず出力フォルダを選択してください",
"PROCESS_START": "Upscayl", "START_BUTTON_TITLE": "Upscayl",
"PROCESS_IN_PROGRESS": "Upscayling⏳" "IN_PROGRESS_BUTTON_TITLE": "Upscayl中⏳"
}
}, },
"IMAGE_OPTIONS": { "IMAGE_OPTIONS": {
"RESET": "画像をリセット", "RESET_BUTTON_TITLE": "画像をリセット",
"LENS_VIEW": "レンズビュー", "LENS_VIEW_TITLE": "レンズビュー",
"SLIDER_VIEW": "スライダービュー", "SLIDER_VIEW_TITLE": "スライダービュー",
"ZOOM_AMOUNT": "ズーム量", "ZOOM_AMOUNT_TITLE": "ズーム量",
"LENS_SIZE": "レンズサイズ" "LENS_SIZE_TITLE": "レンズサイズ"
}, },
"PROGRESS_BAR": { "PROGRESS_BAR": {
"IN_PROGRESS": "バッチUpscayl進行中:", "BATCH_UPSCAYL_IN_PROGRESS_TITLE": "バッチUpscayl進行中",
"PROGRESS_CATCHY": "Upscaylの魔法を実行中...", "IN_PROGRESS_TITLE": "Upscaylの魔法をかけています...",
"STOP": "停止" "STOP_BUTTON_TITLE": "停止"
}, },
"RESET": "リセット", "RESET_BUTTON_TITLE": "リセット",
"RIGHT_PANE_INFO": { "RIGHT_PANE_INFO": {
"SELECT_FOLDER": "Upscaylするフォルダを選択", "SELECT_FOLDER": "Upscaylするフォルダを選択",
"SELECT_IMAGE": "Upscaylする画像を選択", "SELECT_IMAGE": "Upscaylする画像を選択",
"NOTE_SPECIFIC_FORMATS_IN_FOLDER": "フォルダにはPNG、JPG、JPEG、およびWEBP画像以外を含めないでください。", "SELECT_FOLDER_DESCRIPTION": "フォルダにはPNG、JPG、JPEG、WEBPの画像以外のものが含まれていないことを確認してください。",
"SELECT_IMAGES": "PNG、JPG、JPEGまたはWEBP画像を選択するか、ドラッグドロップしてください。", "SELECT_IMAGES_DESCRIPTION": "PNG、JPG、JPEG、またはWEBP画像を選択するか、ドラッグアンドドロップしてください。"
"APP_VERSION": "Upscayl v{version}" },
"PROGRESS": {
"PROCESSING_TITLE": "画像を処理中...",
"SCALING_CONVERTING_TITLE": "画像をスケールおよび変換中...",
"WAIT_TITLE": "少々お待ちください...",
"SUCCESS_TITLE": "Upscaylが成功しました",
"BATCH": {
"SELECTED_FOLDER_TITLE": "選択されたフォルダ:",
"DONE_TITLE": "すべて完了しました!",
"OPEN_UPSCAYLED_FOLDER_TITLE": "Upscaylされたフォルダを開く"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "オリジナル",
"UPSCAYLED_TITLE": "Upscayl後"
},
"DIALOG_BOX": {
"CLOSE": "閉じる"
} }
}, },
"ERRORS": { "ERRORS": {
"GPU_ERROR": { "GPU_ERROR": {
"TITLE": "GPUエラー", "TITLE": "GPUエラー",
"DESC": "GPUに問題が発生しました。トラブルシューティングについてはドキュメントをお読みください ({data})" "DESCRIPTION": "GPUに問題が発生しました。トラブルシューティングのためにドキュメントを参照してください! ({data})"
}, },
"COPY_ERROR": { "COPY_ERROR": {
"TITLE": "コピーエラー", "TITLE": "コピーエラー",
"DESC": "" "DESCRIPTION": ""
}, },
"OPEN_DOCS": "ドキュメントを開く",
"TROUBLESHOOT": "トラブルシューティング",
"READ_WRITE_ERROR": { "READ_WRITE_ERROR": {
"TITLE": "読み書きエラー", "TITLE": "読み取り/書き込みエラー",
"DESC": "パスが正しく、適切な読み書き権限があることを確認してください \n({data})" "DESCRIPTION": "パスが正しいことを確認し、適切な読み取り/書き込み権限を持っていることを確認してください \n({data})"
}, },
"TILE_SIZE_ERROR": { "TILE_SIZE_ERROR": {
"TITLE": "エラー", "TITLE": "エラー",
"DESC": "タイルサイズが間違っています。設定でタイルサイズを変更するか、0に設定してください ({data})" "DESCRIPTION": "タイルサイズが正しくありません。設定でタイルサイズを変更するか、0に設定してください ({data})"
}, },
"EXCEPTION_ERROR": { "EXCEPTION_ERROR": {
"TITLE": "例外エラー", "TITLE": "例外エラー",
"DESC": "Upscaylでエラーが発生しました。おそらく、Upscaylバイナリがコマンドを正しく実行できなかった可能性があります。ログを確認して情報を得てください。さらに支援が必要な場合は、UpscaylのGitHubリポジトリに問題を投稿できます。" "DESCRIPTION": "Upscaylでエラーが発生しました。おそらく、Upscaylのバイナリがコマンドを適切に実行できなかった可能性があります。ログを確認して情報をしてみてください。さらに支援が必要な場合は、UpscaylのGitHubリポジトリに問題を投稿することができます。"
}, },
"GENERIC_ERROR": { "GENERIC_ERROR": {
"TITLE": "エラー" "TITLE": "エラー"
}, },
"INVALID_IMAGE_ERROR": { "INVALID_IMAGE_ERROR": {
"TITLE": "無効な画像", "TITLE": "無効な画像",
"DESC": "PNG、JPG、JPEG、またはWEBPの有効な拡張子を持つ画像を選択してください。", "DESCRIPTION": "PNG、JPG、JPEG、またはWEBPなどの有効な拡張子を持つ画像を選択してください。",
"DRAG_DESC": "画像をドラッグ&ドロップしてください" "ADDITIONAL_DESCRIPTION": "画像をドラッグアンドドロップしてください"
}, },
"NO_IMAGE_ERROR": { "NO_IMAGE_ERROR": {
"TITLE": "画像が選択されていません", "TITLE": "画像が選択されていません",
"DESC": "アップスケールする画像を選択してください" "DESCRIPTION": "アップスケールする画像を選択してください"
}, },
"IMAGE_SCALE_WARN": { "OPEN_DOCS_TITLE": "ドキュメントを開く",
"PERF_ISSUE": "5倍以上は一部のデバイスでパフォーマンス問題を引き起こす可能性があります", "OPEN_DOCS_BUTTON_TITLE": "トラブルシューティング"
"PERF_ISSUE_DEVICE": "一部のデバイスでパフォーマンス問題が発生する可能性があります!"
},
"ISSUE_CHECK": {
"TITLE": "問題がありますか?",
"GET_HELP": "🙏 助けを得る",
"EMAIL_DEV": "📧 開発者にメール"
}
}, },
"UPSCAYL_CLOUD": { "UPSCAYL_CLOUD": {
"COMING_SOON": "近日公開!", "COMING_SOON": "近日公開!",
"CATCHY_PHRASE_1": "エラー、ハードウェアの問題、品質の妥協、長い読み込み時間はもうありません!", "CATCHY_PHRASE_1": "もうエラー、ハードウェアの問題、品質の妥協や長い読み込み時間はありません!",
"CATCHY_PHRASE_2": "🌐 どこでも、いつでも、どんなデバイスでもUpscayl\n☁ グラフィックカードやハードウェア不要\n👩 顔の強化\n🦋 10以上のモデルから選択可能\n🏎 Upscaylデスクトップより5倍速い\n🎞 ビデオアップスケーリング\n💰 商用利用可\n😴 眠っている間にUpscayl", "CATCHY_PHRASE_2": "🌐 いつでもどこでも、どのデバイスでもUpscayl\n☁ グラフィックカードやハードウェアは不要\n👩 顔の改善\n🦋 10以上のモデルから選べます\n🏎 Upscaylデスクトップの5倍の速さ\n🎞 ビデオアップスケーリング\n💰 商用利用\n😴 寝ている間にUpscayl",
"ALREADY_REGISTERED": "ありがとう{name}!あなたのメールはすでに登録されているようです :D もしそうでない場合は、もう一度お試しください。", "ALREADY_REGISTERED_ALERT": "ありがとう {name}!あなたのメールはすでに登録されているようです :D そうでない場合は、もう一度お試しください。",
"ADD_SUCCESS": "待機リストへのご参加ありがとうございますUpscayl Cloudが準備でき次第ご連絡いたします。", "ADD_SUCCESS": "待機リストにご参加いただきありがとうございますUpscayl Cloudが準備でき次第お知らせします。",
"INCORRECT_FIELDS": "すべてのフィールドに正しく記入してください。", "INCORRECT_FIELDS_ALERT": "すべてのフィールドに正しく入力してください。",
"JOIN_WAITLIST": "待機リストに参加する", "JOIN_WAITLIST": "待機リストに参加",
"DONT_SHOW_AGAIN": "再び表示しない" "DONT_SHOW_AGAIN": "再表示しない"
}
} }
} }

View File

@ -5,91 +5,74 @@
// !!!!!!!!!!!!!!!!!!!!!KEEP ANYTHING PRESENT WITHIN FLOWER BRACES {variable} - THEY ARE VARIABLES!!!!!!!!!!!!!!!!!!!!!!! // !!!!!!!!!!!!!!!!!!!!!KEEP ANYTHING PRESENT WITHIN FLOWER BRACES {variable} - THEY ARE VARIABLES!!!!!!!!!!!!!!!!!!!!!!!
// Delete these comments starting with "//" as json format does not accept comments // Delete these comments starting with "//" as json format does not accept comments
{ {
"APP": {
"TITLE": "Upscayl", "TITLE": "Upscayl",
"INTRO": "Introducing Upscayl Cloud!", "INTRO": "Introducing Upscayl Cloud!",
"HEADER": { "HEADER": {
"GITHUB_STAR_TT_INFO": "Star us on GitHub 😁", "GITHUB_BUTTON_TITLE": "Star us on GitHub 😁",
"APP_INFO": "AI Image Upscaler" "DESCRIPTION": "AI Image Upscaler"
}, },
"FOOTER": { "FOOTER": {
"NEWS_TITLE": "UPSCAYL NEWS", "NEWS_TITLE": "UPSCAYL NEWS",
"COPYRIGHT": "Copyright ©", "COPYRIGHT": "Copyright ©",
"BY": "By ", "TITLE": "By ",
"APP_TEAM": "The Upscayl Team" "LINK_TITLE": "The Upscayl Team"
}, },
"SETTINGS": { "SETTINGS": {
"TITLE": "SETTINGS", "TITLE": "SETTINGS",
"CHANGE_LANG": "Change Language" "CHANGE_LANGUAGE": { "TITLE": "Change Language" },
},
"INFOS": {
"IMAGE_PROCESSING": {
"START": "Processing the image...",
"SCALE_CONVERT": "Scaling and converting image...",
"WAIT": "Hold on...",
"SUCCESS": "Upscayl Successful!",
"BATCH": {
"SELECT": "Selected folder:",
"DONE": "All done!",
"OPEN_DONE_FOLDER": "Open Upscayled Folder"
}
},
"COMPARISION": {
"SLIDER_ORIGINAL": "Original",
"SLIDER_PROCESSED": "Upscayled"
},
"IMAGE_COMPRESSION": { "IMAGE_COMPRESSION": {
"TITLE": "Image Compression ({compression}%)", "TITLE": "Image Compression",
"LOSSLESS_TIP": "PNG compression is lossless, so it might not reduce the file size significantly and higher compression values might affect the performance. JPG and WebP compression is lossy." "DESCRIPTION": "PNG compression is lossless, so it might not reduce the file size significantly and higher compression values might affect the performance. JPG and WebP compression is lossy."
}, },
"CUSTOM_MODELS": { "CUSTOM_MODELS": {
"ADD": "ADD CUSTOM MODELS", "TITLE": "ADD CUSTOM MODELS",
"SELECT_FOLDER": "Select Folder", "BUTTON_FOLDER": "Select Folder",
"INFO": "You can add your own models easily. For more details:", "DESCRIPTION": "You can add your own models easily. For more details:",
"LINK_TEXT": "Custom Models Repository" "LINK_TITLE": "Custom Models Repository"
}, },
"CUSTOM_INPUT_RESOLUTION": { "CUSTOM_INPUT_RESOLUTION": {
"WIDTH": "CUSTOM OUTPUT WIDTH", "TITLE": "CUSTOM OUTPUT WIDTH",
"RESTART": "REQUIRES RESTART", "RESTART": "REQUIRES RESTART",
"CUSTOM_WIDTH_TIP": "Use a custom width for the output images. The height will be adjusted automatically. Enabling this will override the scale setting." "DESCRIPTION": "Use a custom width for the output images. The height will be adjusted automatically. Enabling this will override the scale setting."
}, },
"DONATE": { "DONATE": {
"IF_LIKED": "If you like what we do :)", "DESCRIPTION": "If you like what we do :)",
"DONATE": "💎 DONATE" "BUTTON_TITLE": "💎 DONATE"
}, },
"GPU_ID_INPUT": { "GPU_ID_INPUT": {
"ID": "GPU ID", "TITLE": "GPU ID",
"READ_DOCS": "Please read the Upscayl Documentation for more information.", "DESCRIPTION": "Please read the Upscayl Documentation for more information.",
"ENABLE_PERF_MODE": "Enable performance mode on Windows for better results." "ADDITIONAL_DESCRIPTION": "Enable performance mode on Windows for better results."
}, },
"IMAGE_FORMAT": { "IMAGE_FORMAT": {
"SAVE_AS": "SAVE IMAGE AS", "TITLE": "SAVE IMAGE AS",
"PNG": "PNG", "PNG": "PNG",
"JPG": "JPG", "JPG": "JPG",
"WEBP": "WEBP" "WEBP": "WEBP"
}, },
"IMAGE_SCALE": { "IMAGE_SCALE": {
"TITLE": "Image Scale", "TITLE": "Image Scale",
"TITLE_CAPS": "IMAGE SCALE", "IMAGE_SCALED_BY": "IMAGE SCALE ({scale}X)",
"SCALES_TIMES": "({scale}X)", "DESCRIPTION": "Anything above 4X (except 16X Double Upscayl) only resizes the image and does not use AI upscaling.",
"AI_UPSCALE_RESIZE_INFO": "Anything above 4X (except 16X Double Upscayl) only resizes the image and does not use AI upscaling." "WARNING": "Anything above 5X may cause performance issues on some devices!",
"ADDITIONAL_WARNING": "This may cause performance issues on some devices!"
}, },
"LOG_AREA": { "LOG_AREA": {
"ON_COPY": "COPIED ✅", "ON_COPY": "COPIED ✅",
"COPY": "COPY LOGS 📋", "BUTTON_TITLE": "COPY LOGS 📋",
"NO_LOGS": "No logs to show" "NO_LOGS": "No logs to show"
}, },
"OVERWRITE_TOGGLE": { "OVERWRITE_TOGGLE": {
"OW_PREV": "OVERWRITE PREVIOUS UPSCALE", "TITLE": "OVERWRITE PREVIOUS UPSCALE",
"OW_TIP": "If enabled, Upscayl will process the image again instead of loading it directly." "DESCRIPTION": "If enabled, Upscayl will process the image again instead of loading it directly."
}, },
"RESET_SETTINGS": { "RESET_SETTINGS": {
"TITLE": "RESET UPSCAYL", "BUTTON_TITLE": "RESET UPSCAYL",
"ON_RESET": "Upscayl has been reset. Please restart the app." "ALERT": "Upscayl has been reset. Please restart the app."
}, },
"SAVE_OUTPUT_FOLDER": { "SAVE_OUTPUT_FOLDER": {
"TITLE": "SAVE OUTPUT FOLDER", "TITLE": "SAVE OUTPUT FOLDER",
"DESC": "If enabled, the output folder will be remembered between sessions." "DESCRIPTION": "If enabled, the output folder will be remembered between sessions."
}, },
"THEME": { "THEME": {
"TITLE": "UPSCAYL THEME" "TITLE": "UPSCAYL THEME"
@ -99,125 +82,135 @@
}, },
"CUSTOM_TILE_SIZE": { "CUSTOM_TILE_SIZE": {
"TITLE": "CUSTOM TILE SIZE", "TITLE": "CUSTOM TILE SIZE",
"DESC": "Use a custom tile size for segmenting the image. This can help process images faster by reducing the number of tiles generated." "DESCRIPTION": "Use a custom tile size for segmenting the image. This can help process images faster by reducing the number of tiles generated."
}, },
"TURN_OFF_NOTIFICATIONS": { "TURN_OFF_NOTIFICATIONS": {
"TITLE": "TURN OFF NOTIFICATIONS", "TITLE": "TURN OFF NOTIFICATIONS",
"DESC": "If enabled, Upscayl will not send any system notifications on success or failure." "DESCRIPTION": "If enabled, Upscayl will not send any system notifications on success or failure."
}, },
"DIALOG_BOX": { "SUPPORT": {
"CLOSE": "Close" "TITLE": "Having issues?",
"DOCS_BUTTON_TITLE": "🙏 GET HELP",
"EMAIL_BUTTON_TITLE": "📧 EMAIL DEVELOPER"
}
}, },
"LEFT_PANE_PROCESS": { "APP": {
"BATCH": { "TITLE": "Upscayl",
"BATCH_MODE": {
"TITLE": "Batch Upscayl", "TITLE": "Batch Upscayl",
"TT_INFO": "This will let you Upscayl all files in a folder at once" "DESCRIPTION": "This will let you Upscayl all files in a folder at once"
}, },
"STEP_1": { "FILE_SELECTION": {
"TITLE": "Step 1", "TITLE": "Step 1",
"BATCH_YES": "Select Folder", "BATCH_MODE_TYPE": "Select Folder",
"BATCH_NO": "Select Image" "SINGLE_MODE_TYPE": "Select Image"
}, },
"STEP_2": { "MODEL_SELECTION": {
"TITLE": "Step 2", "TITLE": "Step 2",
"SELECT_MODEL": "Select Model" "DESCRIPTION": "Select Model"
}, },
"DOUBLE_UPSCAYL": { "DOUBLE_UPSCAYL": {
"TITLE": "Double Upscayl", "TITLE": "Double Upscayl",
"TT_INFO": "Enable this option to run upscayl twice on an image. Note that this may cause a significant increase in processing time and possibly performance issues for scales greater than 4X." "DESCRIPTION": "Enable this option to run upscayl twice on an image. Note that this may cause a significant increase in processing time and possibly performance issues for scales greater than 4X."
}, },
"STEP_3": { "OUTPUT_PATH_SELECTION": {
"TITLE": "Step 3", "TITLE": "Step 3",
"MACOS_RESTRICTION_ALERT": "Due to MacOS App Store security restrictions, Upscayl requires you to select an output folder everytime you start it.\n\nTo avoid this, you can permanently save a default output folder in the Upscayl 'Settings' tab.", "MAC_APP_STORE_ALERT": "Due to MacOS App Store security restrictions, Upscayl requires you to select an output folder everytime you start it.\n\nTo avoid this, you can permanently save a default output folder in the Upscayl 'Settings' tab.",
"NOT_SELECTED": "Not Selected", "NOT_SELECTED": "Not Selected",
"DEFAULT_IMG_PATH": "Defaults to Image's path", "DEFAULT_IMG_PATH": "Defaults to Image's path",
"DEFAULT_FOLDER_PATH": "Defaults to Folder's path", "DEFAULT_FOLDER_PATH": "Defaults to Folder's path",
"SET_OUTPUT_FOLDER": "Set Output Folder" "BUTTON_TITLE": "Set Output Folder"
}, },
"STEP_4": { "SCALE_SELECTION": {
"TITLE": "Step 4", "TITLE": "Step 4",
"UPSCAYL_FROM": "Upscayl from ", "FROM_TITLE": "Upscayl from ",
"UPSCAYL_TO": " to ", "TO_TITLE": " to ",
"FOLDER_ALERT": "Please select an output folder first", "NO_OUTPUT_FOLDER_ALERT": "Please select an output folder first",
"PROCESS_START": "Upscayl", "START_BUTTON_TITLE": "Upscayl",
"PROCESS_IN_PROGRESS": "Upscayling⏳" "IN_PROGRESS_BUTTON_TITLE": "Upscayling⏳"
}
}, },
"IMAGE_OPTIONS": { "IMAGE_OPTIONS": {
"RESET": "Reset Image", "RESET_BUTTON_TITLE": "Reset Image",
"LENS_VIEW": "Lens View", "LENS_VIEW_TITLE": "Lens View",
"SLIDER_VIEW": "Slider View", "SLIDER_VIEW_TITLE": "Slider View",
"ZOOM_AMOUNT": "Zoom Amount", "ZOOM_AMOUNT_TITLE": "Zoom Amount",
"LENS_SIZE": "Lens Size" "LENS_SIZE_TITLE": "Lens Size"
}, },
"PROGRESS_BAR": { "PROGRESS_BAR": {
"IN_PROGRESS": "Batch Upscayl In Progress:", "BATCH_UPSCAYL_IN_PROGRESS_TITLE": "Batch Upscayl In Progress:",
"PROGRESS_CATCHY": "Doing the Upscayl magic...", "IN_PROGRESS_TITLE": "Doing the Upscayl magic...",
"STOP": "STOP" "STOP_BUTTON_TITLE": "STOP"
}, },
"RESET": "Reset", "RESET_BUTTON_TITLE": "Reset",
"RIGHT_PANE_INFO": { "RIGHT_PANE_INFO": {
"SELECT_FOLDER": "Select a Folder to Upscayl", "SELECT_FOLDER": "Select a Folder to Upscayl",
"SELECT_IMAGE": "Select an Image to Upscayl", "SELECT_IMAGE": "Select an Image to Upscayl",
"NOTE_SPECIFIC_FORMATS_IN_FOLDER": "Make sure that the folder doesn't contain anything except PNG, JPG, JPEG & WEBP images.", "SELECT_FOLDER_DESCRIPTION": "Make sure that the folder doesn't contain anything except PNG, JPG, JPEG & WEBP images.",
"SELECT_IMAGES": "Select or drag and drop a PNG, JPG, JPEG or WEBP image.", "SELECT_IMAGES_DESCRIPTION": "Select or drag and drop a PNG, JPG, JPEG or WEBP image."
"APP_VERSION": "Upscayl v{version}" },
"PROGRESS": {
"PROCESSING_TITLE": "Processing the image...",
"SCALING_CONVERTING_TITLE": "Scaling and converting image...",
"WAIT_TITLE": "Hold on...",
"SUCCESS_TITLE": "Upscayl Successful!",
"BATCH": {
"SELECTED_FOLDER_TITLE": "Selected folder:",
"DONE_TITLE": "All done!",
"OPEN_UPSCAYLED_FOLDER_TITLE": "Open Upscayled Folder"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "Original",
"UPSCAYLED_TITLE": "Upscayled"
},
"DIALOG_BOX": {
"CLOSE": "Close"
} }
}, },
"ERRORS": { "ERRORS": {
"GPU_ERROR": { "GPU_ERROR": {
"TITLE": "GPU Error", "TITLE": "GPU Error",
"DESC": "Ran into an issue with the GPU. Please read the docs for troubleshooting! ({data})" "DESCRIPTION": "Ran into an issue with the GPU. Please read the docs for troubleshooting! ({data})"
}, },
"COPY_ERROR": { "COPY_ERROR": {
"TITLE": "Copy Error", "TITLE": "Copy Error",
"DESC": "" "DESCRIPTION": ""
}, },
"OPEN_DOCS": "Open Docs",
"TROUBLESHOOT": "Troubleshoot",
"READ_WRITE_ERROR": { "READ_WRITE_ERROR": {
"TITLE": "Read/Write Error", "TITLE": "Read/Write Error",
"DESC": "Make sure that the path is correct and you have proper read/write permissions \n({data})" "DESCRIPTION": "Make sure that the path is correct and you have proper read/write permissions \n({data})"
}, },
"TILE_SIZE_ERROR": { "TILE_SIZE_ERROR": {
"TITLE": "Error", "TITLE": "Error",
"DESC": "The tile size is wrong. Please change the tile size in the settings or set to 0 ({data})" "DESCRIPTION": "The tile size is wrong. Please change the tile size in the settings or set to 0 ({data})"
}, },
"EXCEPTION_ERROR": { "EXCEPTION_ERROR": {
"TITLE": "Exception Error", "TITLE": "Exception Error",
"DESC": "Upscayl encountered an error. Possibly, the upscayl binary failed to execute the commands properly. Try checking the logs to see if you get any information. You can post an issue on Upscayl's GitHub repository for more help." "DESCRIPTION": "Upscayl encountered an error. Possibly, the upscayl binary failed to execute the commands properly. Try checking the logs to see if you get any information. You can post an issue on Upscayl's GitHub repository for more help."
}, },
"GENERIC_ERROR": { "GENERIC_ERROR": {
"TITLE": "Error" "TITLE": "Error"
}, },
"INVALID_IMAGE_ERROR": { "INVALID_IMAGE_ERROR": {
"TITLE": "Invalid Image", "TITLE": "Invalid Image",
"DESC": "Please select an image with a valid extension like PNG, JPG, JPEG, or WEBP.", "DESCRIPTION": "Please select an image with a valid extension like PNG, JPG, JPEG, or WEBP.",
"DRAG_DESC": "Please drag and drop an image" "ADDITIONAL_DESCRIPTION": "Please drag and drop an image"
}, },
"NO_IMAGE_ERROR": { "NO_IMAGE_ERROR": {
"TITLE": "No image selected", "TITLE": "No image selected",
"DESC": "Please select an image to upscale" "DESCRIPTION": "Please select an image to upscale"
}, },
"IMAGE_SCALE_WARN": { "OPEN_DOCS_TITLE": "Open Docs",
"PERF_ISSUE": "Anything above 5X may cause performance issues on some devices!", "OPEN_DOCS_BUTTON_TITLE": "Troubleshoot"
"PERF_ISSUE_DEVICE": "This may cause performance issues on some devices!"
},
"ISSUE_CHECK": {
"TITLE": "Having issues?",
"GET_HELP": "🙏 GET HELP",
"EMAIL_DEV": "📧 EMAIL DEVELOPER"
}
}, },
"UPSCAYL_CLOUD": { "UPSCAYL_CLOUD": {
"COMING_SOON": "Coming soon!", "COMING_SOON": "Coming soon!",
"CATCHY_PHRASE_1": "No more errors, hardware issues, quality compromises or long loading times!", "CATCHY_PHRASE_1": "No more errors, hardware issues, quality compromises or long loading times!",
"CATCHY_PHRASE_2": "🌐 Upscayl anywhere, anytime, any device\n☁ No Graphics Card or hardware required\n👩 Face Enhancement\n🦋 10+ models to choose from\n🏎 5x faster than Upscayl Desktop\n🎞 Video Upscaling\n💰 Commercial Usage\n😴 Upscayl while you sleep", "CATCHY_PHRASE_2": "🌐 Upscayl anywhere, anytime, any device\n☁ No Graphics Card or hardware required\n👩 Face Enhancement\n🦋 10+ models to choose from\n🏎 5x faster than Upscayl Desktop\n🎞 Video Upscaling\n💰 Commercial Usage\n😴 Upscayl while you sleep",
"ALREADY_REGISTERED": "Thank you {name}! It seems that your email has already been registered :D If that's not the case, please try again.", "ALREADY_REGISTERED_ALERT": "Thank you {name}! It seems that your email has already been registered :D If that's not the case, please try again.",
"ADD_SUCCESS": "Thank you for joining the waitlist! We will notify you when Upscayl Cloud is ready for you.", "ADD_SUCCESS": "Thank you for joining the waitlist! We will notify you when Upscayl Cloud is ready for you.",
"INCORRECT_FIELDS": "Please fill in all the fields correctly.", "INCORRECT_FIELDS_ALERT": "Please fill in all the fields correctly.",
"JOIN_WAITLIST": "Join the waitlist", "JOIN_WAITLIST": "Join the waitlist",
"DONT_SHOW_AGAIN": "DON'T SHOW AGAIN" "DONT_SHOW_AGAIN": "DON'T SHOW AGAIN"
} }
}
} }

View File

@ -1,89 +1,72 @@
{ {
"APP": {
"TITLE": "Upscayl", "TITLE": "Upscayl",
"INTRO": "Представляем Upscayl Cloud!", "INTRO": "Представляем Upscayl Cloud!",
"HEADER": { "HEADER": {
"GITHUB_STAR_TT_INFO": "Поставьте нам звезду на GitHub 😁", "GITHUB_BUTTON_TITLE": "Оцените нас на GitHub 😁",
"APP_INFO": "Улучшение изображений с помощью ИИ" "DESCRIPTION": "AI увеличитель изображений"
}, },
"FOOTER": { "FOOTER": {
"NEWS_TITLE": "НОВОСТИ UPSCAYL", "NEWS_TITLE": "НОВОСТИ UPSCAYL",
"COPYRIGHT": "Авторское право ©", "COPYRIGHT": "Авторское право ©",
"BY": "От ", "TITLE": "От ",
"APP_TEAM": "Команда Upscayl" "LINK_TITLE": "Команда Upscayl"
}, },
"SETTINGS": { "SETTINGS": {
"TITLE": "НАСТРОЙКИ", "TITLE": "НАСТРОЙКИ",
"CHANGE_LANG": "Изменить язык" "CHANGE_LANGUAGE": { "TITLE": "Сменить язык" },
},
"INFOS": {
"IMAGE_PROCESSING": {
"START": "Обработка изображения...",
"SCALE_CONVERT": "Масштабирование и конвертация изображения...",
"WAIT": "Подождите...",
"SUCCESS": "Upscayl выполнен успешно!",
"BATCH": {
"SELECT": "Выбранная папка:",
"DONE": "Все готово!",
"OPEN_DONE_FOLDER": "Открыть папку с Upscayl"
}
},
"COMPARISION": {
"SLIDER_ORIGINAL": "Оригинал",
"SLIDER_PROCESSED": "Upscayl"
},
"IMAGE_COMPRESSION": { "IMAGE_COMPRESSION": {
"TITLE": "Сжатие изображения ({compression}%)", "TITLE": "Сжатие изображения",
"LOSSLESS_TIP": "Сжатие PNG без потерь, поэтому размер файла может не уменьшиться значительно, а более высокие значения сжатия могут повлиять на производительность. Сжатие JPG и WebP с потерями." "DESCRIPTION": "Сжатие PNG без потерь, поэтому размер файла может не значительно уменьшиться, а более высокие значения сжатия могут повлиять на производительность. Сжатие JPG и WebP с потерями."
}, },
"CUSTOM_MODELS": { "CUSTOM_MODELS": {
"ADD": "ДОБАВИТЬ СОБСТВЕННЫЕ МОДЕЛИ", "TITLE": "ДОБАВИТЬ ПОЛЬЗОВАТЕЛЬСКИЕ МОДЕЛИ",
"SELECT_FOLDER": "Выбрать папку", "BUTTON_FOLDER": "Выбрать папку",
"INFO": "Вы можете легко добавить свои модели. Для получения дополнительной информации:", "DESCRIPTION": "Вы можете легко добавить свои модели. Для получения дополнительной информации:",
"LINK_TEXT": "Репозиторий пользовательских моделей" "LINK_TITLE": "Репозиторий пользовательских моделей"
}, },
"CUSTOM_INPUT_RESOLUTION": { "CUSTOM_INPUT_RESOLUTION": {
"WIDTH": "ПОЛЬЗОВАТЕЛЬСКАЯ ШИРИНА ВЫВОДА", "TITLE": "ПОЛЬЗОВАТЕЛЬСКАЯ ШИРИНА ВЫХОДА",
"RESTART": "ТРЕБУЕТСЯ ПЕРЕЗАГРУЗКА", "RESTART": "ТРЕБУЕТСЯ ПЕРЕЗАПУСК",
"CUSTOM_WIDTH_TIP": "Используйте пользовательскую ширину для выходных изображений. Высота будет скорректирована автоматически. Включение этой опции отменит настройку масштаба." "DESCRIPTION": "Используйте пользовательскую ширину для выходных изображений. Высота будет скорректирована автоматически. Включение этой функции заменит настройку масштаба."
}, },
"DONATE": { "DONATE": {
"IF_LIKED": "Если вам нравится то, что мы делаем :)", "DESCRIPTION": "Если вам нравится то, что мы делаем :)",
"DONATE": "💎 ПОЖЕРТВОВАТЬ" "BUTTON_TITLE": "💎 ПОЖЕРТВОВАТЬ"
}, },
"GPU_ID_INPUT": { "GPU_ID_INPUT": {
"ID": "ID GPU", "TITLE": "ID GPU",
"READ_DOCS": "Пожалуйста, ознакомьтесь с документацией Upscayl для получения дополнительной информации.", "DESCRIPTION": "Пожалуйста, прочитайте документацию Upscayl для получения дополнительной информации.",
"ENABLE_PERF_MODE": "Включите режим производительности в Windows для улучшения результатов." "ADDITIONAL_DESCRIPTION": "Включите режим производительности на Windows для лучших результатов."
}, },
"IMAGE_FORMAT": { "IMAGE_FORMAT": {
"SAVE_AS": "СОХРАНИТЬ ИЗОБРАЖЕНИЕ КАК", "TITLE": "СОХРАНИТЬ ИЗОБРАЖЕНИЕ КАК",
"PNG": "PNG", "PNG": "PNG",
"JPG": "JPG", "JPG": "JPG",
"WEBP": "WEBP" "WEBP": "WEBP"
}, },
"IMAGE_SCALE": { "IMAGE_SCALE": {
"TITLE": "Масштаб изображения", "TITLE": "Масштаб изображения",
"TITLE_CAPS": "МАСШТАБ ИЗОБРАЖЕНИЯ", "IMAGE_SCALED_BY": "МАСШТАБ ИЗОБРАЖЕНИЯ ({scale}X)",
"SCALES_TIMES": "({scale}X)", "DESCRIPTION": "Любое значение выше 4X (кроме 16X Double Upscayl) только изменяет размер изображения и не использует AI-увеличение.",
"AI_UPSCALE_RESIZE_INFO": "Все, что выше 4X (кроме 16X Double Upscayl), только изменяет размер изображения и не использует улучшение с помощью ИИ." "WARNING": "Любое значение выше 5X может вызвать проблемы с производительностью на некоторых устройствах!",
"ADDITIONAL_WARNING": "Это может вызвать проблемы с производительностью на некоторых устройствах!"
}, },
"LOG_AREA": { "LOG_AREA": {
"ON_COPY": "СКОПИРОВАНО ✅", "ON_COPY": "СКОПИРОВАНО ✅",
"COPY": "СКОПИРОВАТЬ ЛОГИ 📋", "BUTTON_TITLE": "СКОПИРОВАТЬ ЛОГИ 📋",
"NO_LOGS": "Нет логов для отображения" "NO_LOGS": "Нет логов для отображения"
}, },
"OVERWRITE_TOGGLE": { "OVERWRITE_TOGGLE": {
"OW_PREV": "ПЕРЕЗАПИСАТЬ ПРЕДЫДУЩИЙ UPSCALE", "TITLE": "ПЕРЕЗАПИСАТЬ ПРЕДЫДУЩЕЕ УВЕЛИЧЕНИЕ",
"OW_TIP": "Если включено, Upscayl обработает изображение заново, вместо загрузки его напрямую." "DESCRIPTION": "Если включено, Upscayl снова обработает изображение вместо того, чтобы загружать его напрямую."
}, },
"RESET_SETTINGS": { "RESET_SETTINGS": {
"TITLE": "СБРОС UPSCAYL", "BUTTON_TITLE": "СБРОСИТЬ UPSCAYL",
"ON_RESET": "Upscayl был сброшен. Пожалуйста, перезапустите приложение." "ALERT": "Upscayl был сброшен. Пожалуйста, перезапустите приложение."
}, },
"SAVE_OUTPUT_FOLDER": { "SAVE_OUTPUT_FOLDER": {
"TITLE": "СОХРАНИТЬ ПАПКУ ВЫВОДА", "TITLE": "СОХРАНИТЬ ПАПКУ ВЫВОДА",
"DESC": "Если включено, папка вывода будет запомнена между сеансами." "DESCRIPTION": "Если включено, папка вывода будет запоминаться между сеансами."
}, },
"THEME": { "THEME": {
"TITLE": "ТЕМА UPSCAYL" "TITLE": "ТЕМА UPSCAYL"
@ -93,125 +76,135 @@
}, },
"CUSTOM_TILE_SIZE": { "CUSTOM_TILE_SIZE": {
"TITLE": "ПОЛЬЗОВАТЕЛЬСКИЙ РАЗМЕР ПЛИТКИ", "TITLE": "ПОЛЬЗОВАТЕЛЬСКИЙ РАЗМЕР ПЛИТКИ",
"DESC": "Используйте пользовательский размер плитки для сегментации изображения. Это может помочь ускорить обработку изображений за счет уменьшения количества создаваемых плиток." "DESCRIPTION": "Используйте пользовательский размер плитки для сегментации изображения. Это может помочь ускорить обработку изображений за счет уменьшения количества генерируемых плиток."
}, },
"TURN_OFF_NOTIFICATIONS": { "TURN_OFF_NOTIFICATIONS": {
"TITLE": "ОТКЛЮЧИТЬ УВЕДОМЛЕНИЯ", "TITLE": "ВЫКЛЮЧИТЬ УВЕДОМЛЕНИЯ",
"DESC": "Если включено, Upscayl не будет отправлять системные уведомления о успехе или неудаче." "DESCRIPTION": "Если включено, Upscayl не будет отправлять системные уведомления о завершении или ошибках."
}, },
"DIALOG_BOX": { "SUPPORT": {
"CLOSE": "Закрыть" "TITLE": "Возникли проблемы?",
"DOCS_BUTTON_TITLE": "🙏 ПОЛУЧИТЬ ПОМОЩЬ",
"EMAIL_BUTTON_TITLE": "📧 НАПИСАТЬ РАЗРАБОТЧИКУ"
}
}, },
"LEFT_PANE_PROCESS": { "APP": {
"BATCH": { "TITLE": "Upscayl",
"TITLE": "Массовый Upscayl", "BATCH_MODE": {
"TT_INFO": "Это позволит вам обработать все файлы в папке сразу" "TITLE": "Пакетное увеличение",
"DESCRIPTION": "Это позволит вам увеличить все файлы в папке сразу"
}, },
"STEP_1": { "FILE_SELECTION": {
"TITLE": "Шаг 1", "TITLE": "Шаг 1",
"BATCH_YES": "Выбрать папку", "BATCH_MODE_TYPE": "Выбрать папку",
"BATCH_NO": "Выбрать изображение" "SINGLE_MODE_TYPE": "Выбрать изображение"
}, },
"STEP_2": { "MODEL_SELECTION": {
"TITLE": "Шаг 2", "TITLE": "Шаг 2",
"SELECT_MODEL": "Выбрать модель" "DESCRIPTION": "Выберите модель"
}, },
"DOUBLE_UPSCAYL": { "DOUBLE_UPSCAYL": {
"TITLE": "Двойной Upscayl", "TITLE": "Двойное увеличение",
"TT_INFO": "Включите эту опцию, чтобы дважды обработать изображение с помощью Upscayl. Обратите внимание, что это может значительно увеличить время обработки и возможные проблемы с производительностью при масштабах больше 4X." "DESCRIPTION": "Включите эту опцию, чтобы дважды увеличить изображение. Обратите внимание, что это может значительно увеличить время обработки и, возможно, вызвать проблемы с производительностью для масштабов больше 4X."
}, },
"STEP_3": { "OUTPUT_PATH_SELECTION": {
"TITLE": "Шаг 3", "TITLE": "Шаг 3",
"MACOS_RESTRICTION_ALERT": "Из-за ограничений безопасности App Store на MacOS, Upscayl требует, чтобы вы выбирали папку вывода каждый раз при запуске.\n\nЧтобы избежать этого, вы можете навсегда сохранить папку вывода по умолчанию во вкладке 'Настройки' Upscayl.", "MAC_APP_STORE_ALERT": "Из-за ограничений безопасности MacOS App Store Upscayl требует выбора папки вывода каждый раз при запуске.\n\nЧтобы избежать этого, вы можете навсегда сохранить папку вывода по умолчанию на вкладке «Настройки» Upscayl.",
"NOT_SELECTED": "Не выбрано", "NOT_SELECTED": "Не выбрано",
"DEFAULT_IMG_PATH": "По умолчанию путь изображения", "DEFAULT_IMG_PATH": "По умолчанию путь изображения",
"DEFAULT_FOLDER_PATH": "По умолчанию путь папки", "DEFAULT_FOLDER_PATH": "По умолчанию путь папки",
"SET_OUTPUT_FOLDER": "Установить папку вывода" "BUTTON_TITLE": "Установить папку вывода"
}, },
"STEP_4": { "SCALE_SELECTION": {
"TITLE": "Шаг 4", "TITLE": "Шаг 4",
"UPSCAYL_FROM": "Upscayl с ", "FROM_TITLE": "Увеличить с ",
"UPSCAYL_TO": " до ", "TO_TITLE": " до ",
"FOLDER_ALERT": "Пожалуйста, сначала выберите папку вывода", "NO_OUTPUT_FOLDER_ALERT": "Пожалуйста, сначала выберите папку вывода",
"PROCESS_START": "Upscayl", "START_BUTTON_TITLE": "Увеличить",
"PROCESS_IN_PROGRESS": "Upscayling⏳" "IN_PROGRESS_BUTTON_TITLE": "Увеличение⏳"
}
}, },
"IMAGE_OPTIONS": { "IMAGE_OPTIONS": {
"RESET": "Сбросить изображение", "RESET_BUTTON_TITLE": "Сбросить изображение",
"LENS_VIEW": "Вид через линзу", "LENS_VIEW_TITLE": "Просмотр через линзу",
"SLIDER_VIEW": "Просмотр через слайдер", "SLIDER_VIEW_TITLE": "Просмотр с ползунком",
"ZOOM_AMOUNT": "Увеличение", "ZOOM_AMOUNT_TITLE": "Увеличение",
"LENS_SIZE": "Размер линзы" "LENS_SIZE_TITLE": "Размер линзы"
}, },
"PROGRESS_BAR": { "PROGRESS_BAR": {
"IN_PROGRESS": "Массовый Upscayl в процессе:", "BATCH_UPSCAYL_IN_PROGRESS_TITLE": "Пакетное увеличение в процессе:",
"PROGRESS_CATCHY": "Происходит магия Upscayl...", "IN_PROGRESS_TITLE": "Магия увеличения в процессе...",
"STOP": "ОСТАНОВИТЬ" "STOP_BUTTON_TITLE": "СТОП"
}, },
"RESET": "Сброс", "RESET_BUTTON_TITLE": "Сбросить",
"RIGHT_PANE_INFO": { "RIGHT_PANE_INFO": {
"SELECT_FOLDER": "Выберите папку для Upscayl", "SELECT_FOLDER": "Выберите папку для увеличения",
"SELECT_IMAGE": "Выберите изображение для Upscayl", "SELECT_IMAGE": "Выберите изображение для увеличения",
"NOTE_SPECIFIC_FORMATS_IN_FOLDER": "Убедитесь, что в папке нет ничего, кроме изображений форматов PNG, JPG, JPEG и WEBP.", "SELECT_FOLDER_DESCRIPTION": "Убедитесь, что в папке нет ничего, кроме изображений PNG, JPG, JPEG и WEBP.",
"SELECT_IMAGES": "Выберите или перетащите изображение формата PNG, JPG, JPEG или WEBP.", "SELECT_IMAGES_DESCRIPTION": "Выберите или перетащите изображение в формате PNG, JPG, JPEG или WEBP."
"APP_VERSION": "Upscayl v{version}" },
"PROGRESS": {
"PROCESSING_TITLE": "Обработка изображения...",
"SCALING_CONVERTING_TITLE": "Масштабирование и конвертация изображения...",
"WAIT_TITLE": "Пожалуйста, подождите...",
"SUCCESS_TITLE": "Увеличение успешно!",
"BATCH": {
"SELECTED_FOLDER_TITLE": "Выбранная папка:",
"DONE_TITLE": "Все готово!",
"OPEN_UPSCAYLED_FOLDER_TITLE": "Открыть папку с увеличенными изображениями"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "Оригинал",
"UPSCAYLED_TITLE": "Увеличено"
},
"DIALOG_BOX": {
"CLOSE": "Закрыть"
} }
}, },
"ERRORS": { "ERRORS": {
"GPU_ERROR": { "GPU_ERROR": {
"TITLE": "Ошибка GPU", "TITLE": "Ошибка GPU",
"DESC": "Произошла ошибка с GPU. Пожалуйста, ознакомьтесь с документацией для устранения неполадок! ({data})" "DESCRIPTION": "Произошла проблема с GPU. Пожалуйста, прочитайте документацию для устранения неполадок! ({data})"
}, },
"COPY_ERROR": { "COPY_ERROR": {
"TITLE": "Ошибка копирования", "TITLE": "Ошибка копирования",
"DESC": "" "DESCRIPTION": ""
}, },
"OPEN_DOCS": "Открыть документацию",
"TROUBLESHOOT": "Устранение неполадок",
"READ_WRITE_ERROR": { "READ_WRITE_ERROR": {
"TITLE": "Ошибка чтения/записи", "TITLE": "Ошибка чтения/записи",
"DESC": "Убедитесь, что путь указан правильно и у вас есть соответствующие права на чтение/запись \n({data})" "DESCRIPTION": "Убедитесь, что путь указан правильно и у вас есть необходимые права на чтение/запись \n({data})"
}, },
"TILE_SIZE_ERROR": { "TILE_SIZE_ERROR": {
"TITLE": "Ошибка", "TITLE": "Ошибка",
"DESC": "Неправильный размер плитки. Пожалуйста, измените размер плитки в настройках или установите на 0 ({data})" "DESCRIPTION": "Неправильный размер плитки. Пожалуйста, измените размер плитки в настройках или установите значение 0 ({data})"
}, },
"EXCEPTION_ERROR": { "EXCEPTION_ERROR": {
"TITLE": "Ошибка исключения", "TITLE": "Ошибка исключения",
"DESC": "Upscayl столкнулся с ошибкой. Возможно, двоичный файл upscayl не смог правильно выполнить команды. Попробуйте проверить логи, чтобы получить информацию. Вы можете создать запрос в репозитории Upscayl на GitHub для получения дополнительной помощи." "DESCRIPTION": "Upscayl столкнулся с ошибкой. Возможно, двоичный файл upscayl не смог правильно выполнить команды. Попробуйте проверить логи, чтобы узнать больше информации. Вы можете оставить запрос в репозитории GitHub Upscayl для получения дополнительной помощи."
}, },
"GENERIC_ERROR": { "GENERIC_ERROR": {
"TITLE": "Ошибка" "TITLE": "Ошибка"
}, },
"INVALID_IMAGE_ERROR": { "INVALID_IMAGE_ERROR": {
"TITLE": "Недопустимое изображение", "TITLE": "Неверное изображение",
"DESC": "Пожалуйста, выберите изображение с допустимым расширением, таким как PNG, JPG, JPEG или WEBP.", "DESCRIPTION": "Пожалуйста, выберите изображение с правильным расширением, таким как PNG, JPG, JPEG или WEBP.",
"DRAG_DESC": "Пожалуйста, перетащите изображение" "ADDITIONAL_DESCRIPTION": "Пожалуйста, перетащите изображение"
}, },
"NO_IMAGE_ERROR": { "NO_IMAGE_ERROR": {
"TITLE": "Изображение не выбрано", "TITLE": "Изображение не выбрано",
"DESC": "Пожалуйста, выберите изображение для улучшения" "DESCRIPTION": "Пожалуйста, выберите изображение для увеличения"
}, },
"IMAGE_SCALE_WARN": { "OPEN_DOCS_TITLE": "Открыть документацию",
"PERF_ISSUE": "Масштабирование более чем на 5X может вызвать проблемы с производительностью на некоторых устройствах!", "OPEN_DOCS_BUTTON_TITLE": "Устранение неполадок"
"PERF_ISSUE_DEVICE": "Это может вызвать проблемы с производительностью на некоторых устройствах!"
},
"ISSUE_CHECK": {
"TITLE": "Возникли проблемы?",
"GET_HELP": "🙏 ПОЛУЧИТЕ ПОМОЩЬ",
"EMAIL_DEV": "📧 НАПИСАТЬ РАЗРАБОТЧИКУ"
}
}, },
"UPSCAYL_CLOUD": { "UPSCAYL_CLOUD": {
"COMING_SOON": "Скоро будет доступно!", "COMING_SOON": "Скоро будет доступно!",
"CATCHY_PHRASE_1": "Больше никаких ошибок, проблем с оборудованием, компромиссов по качеству или долгих загрузок!", "CATCHY_PHRASE_1": "Больше никаких ошибок, проблем с оборудованием, компромиссов в качестве или долгих загрузок!",
"CATCHY_PHRASE_2": "🌐 Upscayl везде, в любое время, на любом устройстве\n☁ Не требуется видеокарта или оборудование\n👩 Улучшение лица\n🦋 Более 10 моделей на выбор\n🏎 В 5 раз быстрее, чем Upscayl Desktop\n🎞 Улучшение видео\n💰 Коммерческое использование\n😴 Upscayl, пока вы спите", "CATCHY_PHRASE_2": "🌐 Upscayl где угодно, в любое время, на любом устройстве\n☁ Не требуется видеокарта или оборудование\n👩 Улучшение лиц\n🦋 Более 10 моделей на выбор\n🏎 В 5 раз быстрее, чем настольная версия Upscayl\n🎞 Увеличение видео\n💰 Коммерческое использование\n😴 Увеличивайте, пока спите",
"ALREADY_REGISTERED": "Спасибо {name}! Похоже, ваш email уже зарегистрирован :D Если это не так, попробуйте снова.", "ALREADY_REGISTERED_ALERT": "Спасибо, {name}! Похоже, ваш email уже зарегистрирован :D Если это не так, пожалуйста, попробуйте снова.",
"ADD_SUCCESS": "Спасибо за участие в списке ожидания! Мы уведомим вас, когда Upscayl Cloud будет готов для вас.", "ADD_SUCCESS": "Спасибо за присоединение к списку ожидания! Мы уведомим вас, когда Upscayl Cloud будет готов для вас.",
"INCORRECT_FIELDS": "Пожалуйста, заполните все поля правильно.", "INCORRECT_FIELDS_ALERT": "Пожалуйста, правильно заполните все поля.",
"JOIN_WAITLIST": "Присоединиться к списку ожидания", "JOIN_WAITLIST": "Присоединиться к списку ожидания",
"DONT_SHOW_AGAIN": "БОЛЬШЕ НЕ ПОКАЗЫВАТЬ" "DONT_SHOW_AGAIN": "БОЛЬШЕ НЕ ПОКАЗЫВАТЬ"
} }
}
} }

210
renderer/locales/zh.json Normal file
View File

@ -0,0 +1,210 @@
{
"TITLE": "Upscayl",
"INTRO": "介绍 Upscayl 云端!",
"HEADER": {
"GITHUB_BUTTON_TITLE": "在 GitHub 上给我们加星 😁",
"DESCRIPTION": "AI 图片放大工具"
},
"FOOTER": {
"NEWS_TITLE": "UPSCAYL 新闻",
"COPYRIGHT": "版权所有 ©",
"TITLE": "由 ",
"LINK_TITLE": "Upscayl 团队"
},
"SETTINGS": {
"TITLE": "设置",
"CHANGE_LANGUAGE": { "TITLE": "更改语言" },
"IMAGE_COMPRESSION": {
"TITLE": "图片压缩",
"DESCRIPTION": "PNG 压缩是无损的因此可能不会显著减少文件大小而更高的压缩值可能会影响性能。JPG 和 WebP 压缩是有损的。"
},
"CUSTOM_MODELS": {
"TITLE": "添加自定义模型",
"BUTTON_FOLDER": "选择文件夹",
"DESCRIPTION": "您可以轻松添加自己的模型。详情请见:",
"LINK_TITLE": "自定义模型库"
},
"CUSTOM_INPUT_RESOLUTION": {
"TITLE": "自定义输出宽度",
"RESTART": "需要重启",
"DESCRIPTION": "使用自定义宽度生成输出图片,高度将自动调整。启用此选项将覆盖缩放设置。"
},
"DONATE": {
"DESCRIPTION": "如果您喜欢我们做的事情 :)",
"BUTTON_TITLE": "💎 捐赠"
},
"GPU_ID_INPUT": {
"TITLE": "GPU ID",
"DESCRIPTION": "有关更多信息,请阅读 Upscayl 文档。",
"ADDITIONAL_DESCRIPTION": "在 Windows 上启用性能模式以获得更好的效果。"
},
"IMAGE_FORMAT": {
"TITLE": "保存图片为",
"PNG": "PNG",
"JPG": "JPG",
"WEBP": "WEBP"
},
"IMAGE_SCALE": {
"TITLE": "图片缩放",
"IMAGE_SCALED_BY": "图片缩放 ({scale}X)",
"DESCRIPTION": "超过 4X除 16X 双重 Upscayl 外)只会调整图片大小,不会使用 AI 放大。",
"WARNING": "超过 5X 可能会在某些设备上引发性能问题!",
"ADDITIONAL_WARNING": "这可能会导致某些设备上的性能问题!"
},
"LOG_AREA": {
"ON_COPY": "已复制 ✅",
"BUTTON_TITLE": "复制日志 📋",
"NO_LOGS": "无日志显示"
},
"OVERWRITE_TOGGLE": {
"TITLE": "覆盖以前的放大",
"DESCRIPTION": "如果启用Upscayl 将重新处理图片,而不是直接加载。"
},
"RESET_SETTINGS": {
"BUTTON_TITLE": "重置 UPSCAYL",
"ALERT": "Upscayl 已被重置。请重新启动应用程序。"
},
"SAVE_OUTPUT_FOLDER": {
"TITLE": "保存输出文件夹",
"DESCRIPTION": "如果启用,输出文件夹将在会话之间被记住。"
},
"THEME": {
"TITLE": "UPSCAYL 主题"
},
"LANGUAGE": {
"TITLE": "UPSCAYL 语言"
},
"CUSTOM_TILE_SIZE": {
"TITLE": "自定义瓦片大小",
"DESCRIPTION": "使用自定义瓦片大小对图片进行分割。这样可以通过减少生成的瓦片数量来加快图片处理速度。"
},
"TURN_OFF_NOTIFICATIONS": {
"TITLE": "关闭通知",
"DESCRIPTION": "如果启用Upscayl 将不会在成功或失败时发送任何系统通知。"
},
"SUPPORT": {
"TITLE": "遇到问题?",
"DOCS_BUTTON_TITLE": "🙏 获取帮助",
"EMAIL_BUTTON_TITLE": "📧 邮件开发者"
}
},
"APP": {
"TITLE": "Upscayl",
"BATCH_MODE": {
"TITLE": "批量 Upscayl",
"DESCRIPTION": "这将允许您一次性放大文件夹中的所有文件"
},
"FILE_SELECTION": {
"TITLE": "步骤 1",
"BATCH_MODE_TYPE": "选择文件夹",
"SINGLE_MODE_TYPE": "选择图片"
},
"MODEL_SELECTION": {
"TITLE": "步骤 2",
"DESCRIPTION": "选择模型"
},
"DOUBLE_UPSCAYL": {
"TITLE": "双重 Upscayl",
"DESCRIPTION": "启用此选项可对图片进行两次放大。请注意,这可能会显著增加处理时间,并且可能在超过 4X 的缩放比例时导致性能问题。"
},
"OUTPUT_PATH_SELECTION": {
"TITLE": "步骤 3",
"MAC_APP_STORE_ALERT": "由于 MacOS 应用商店的安全限制Upscayl 每次启动时都需要您选择一个输出文件夹。\n\n为避免此情况您可以在 Upscayl 的“设置”选项卡中永久保存默认输出文件夹。",
"NOT_SELECTED": "未选择",
"DEFAULT_IMG_PATH": "默认图片路径",
"DEFAULT_FOLDER_PATH": "默认文件夹路径",
"BUTTON_TITLE": "设置输出文件夹"
},
"SCALE_SELECTION": {
"TITLE": "步骤 4",
"FROM_TITLE": "从 Upscayl ",
"TO_TITLE": " 到 ",
"NO_OUTPUT_FOLDER_ALERT": "请先选择一个输出文件夹",
"START_BUTTON_TITLE": "Upscayl",
"IN_PROGRESS_BUTTON_TITLE": "正在放大⏳"
},
"IMAGE_OPTIONS": {
"RESET_BUTTON_TITLE": "重置图片",
"LENS_VIEW_TITLE": "透镜视图",
"SLIDER_VIEW_TITLE": "滑块视图",
"ZOOM_AMOUNT_TITLE": "缩放量",
"LENS_SIZE_TITLE": "透镜大小"
},
"PROGRESS_BAR": {
"BATCH_UPSCAYL_IN_PROGRESS_TITLE": "批量 Upscayl 进行中:",
"IN_PROGRESS_TITLE": "正在进行 Upscayl 魔法...",
"STOP_BUTTON_TITLE": "停止"
},
"RESET_BUTTON_TITLE": "重置",
"RIGHT_PANE_INFO": {
"SELECT_FOLDER": "选择要 Upscayl 的文件夹",
"SELECT_IMAGE": "选择要 Upscayl 的图片",
"SELECT_FOLDER_DESCRIPTION": "确保文件夹中只包含 PNG、JPG、JPEG 和 WEBP 图片。",
"SELECT_IMAGES_DESCRIPTION": "选择或拖放 PNG、JPG、JPEG 或 WEBP 图片。"
},
"PROGRESS": {
"PROCESSING_TITLE": "正在处理图片...",
"SCALING_CONVERTING_TITLE": "正在缩放和转换图片...",
"WAIT_TITLE": "请稍等...",
"SUCCESS_TITLE": "Upscayl 成功!",
"BATCH": {
"SELECTED_FOLDER_TITLE": "选择的文件夹:",
"DONE_TITLE": "全部完成!",
"OPEN_UPSCAYLED_FOLDER_TITLE": "打开已放大的文件夹"
}
},
"SLIDER": {
"ORIGINAL_TITLE": "原始",
"UPSCAYLED_TITLE": "已放大"
},
"DIALOG_BOX": {
"CLOSE": "关闭"
}
},
"ERRORS": {
"GPU_ERROR": {
"TITLE": "GPU 错误",
"DESCRIPTION": "遇到 GPU 问题。请阅读文档以进行故障排除!({data})"
},
"COPY_ERROR": {
"TITLE": "复制错误",
"DESCRIPTION": ""
},
"READ_WRITE_ERROR": {
"TITLE": "读/写错误",
"DESCRIPTION": "确保路径正确并且您拥有适当的读/写权限\n({data})"
},
"TILE_SIZE_ERROR": {
"TITLE": "错误",
"DESCRIPTION": "瓦片大小错误。请在设置中更改瓦片大小或设置为 0 ({data})"
},
"EXCEPTION_ERROR": {
"TITLE": "异常错误",
"DESCRIPTION": "Upscayl 遇到错误。可能是 Upscayl 二进制文件未能正确执行命令。请检查日志以查看是否有任何信息。您可以在 Upscayl 的 GitHub 仓库中发布问题以获取更多帮助。"
},
"GENERIC_ERROR": {
"TITLE": "错误"
},
"INVALID_IMAGE_ERROR": {
"TITLE": "无效图片",
"DESCRIPTION": "请选择一个有效扩展名为 PNG、JPG、JPEG 或 WEBP 的图片。",
"ADDITIONAL_DESCRIPTION": "请拖放图片"
},
"NO_IMAGE_ERROR": {
"TITLE": "未选择图片",
"DESCRIPTION": "请选择一张图片进行放大"
},
"OPEN_DOCS_TITLE": "打开文档",
"OPEN_DOCS_BUTTON_TITLE": "故障排除"
},
"UPSCAYL_CLOUD": {
"COMING_SOON": "即将推出!",
"CATCHY_PHRASE_1": "告别错误、硬件问题、质量妥协或长时间加载!",
"CATCHY_PHRASE_2": "🌐 随时随地,任何设备都能 Upscayl\n☁ 无需显卡或硬件\n👩 面部增强\n🦋 10+ 模型可供选择\n🏎 比 Upscayl 桌面版快 5 倍\n🎞 视频放大\n💰 商业用途\n😴 睡觉时 Upscayl",
"ALREADY_REGISTERED_ALERT": "感谢您 {name}!看起来您的邮箱已被注册 :D 如果不是这样,请再试一次。",
"ADD_SUCCESS": "感谢您加入候补名单!我们将会在 Upscayl 云端准备就绪时通知您。",
"INCORRECT_FIELDS_ALERT": "请正确填写所有字段。",
"JOIN_WAITLIST": "加入候补名单",
"DONT_SHOW_AGAIN": "不再显示"
}
}

View File

@ -140,21 +140,21 @@ const Home = () => {
const handleErrors = (data: string) => { const handleErrors = (data: string) => {
if (data.includes("Invalid GPU")) { if (data.includes("Invalid GPU")) {
toast({ toast({
title: t("APP.ERRORS.GPU_ERROR.TITLE"), title: t("ERRORS.GPU_ERROR.TITLE"),
description: t("APP.ERRORS.GPU_ERROR.DESC", { data }), description: t("ERRORS.GPU_ERROR.DESCRIPTION", { data }),
action: ( action: (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<ToastAction <ToastAction
altText={t("APP.ERRORS.COPY_ERROR.TITLE")} altText={t("ERRORS.COPY_ERROR.TITLE")}
onClick={() => { onClick={() => {
navigator.clipboard.writeText(data); navigator.clipboard.writeText(data);
}} }}
> >
{t("APP.ERRORS.COPY_ERROR.TITLE")} {t("ERRORS.COPY_ERROR.TITLE")}
</ToastAction> </ToastAction>
<a href="https://docs.upscayl.org/" target="_blank"> <a href="https://docs.upscayl.org/" target="_blank">
<ToastAction altText={t("APP.ERRORS.OPEN_DOCS")}> <ToastAction altText={t("ERRORS.OPEN_DOCS_TITLE")}>
{t("APP.ERRORS.TROUBLESHOOT")} {t("ERRORS.OPEN_DOCS_BUTTON_TITLE")}
</ToastAction> </ToastAction>
</a> </a>
</div> </div>
@ -164,8 +164,8 @@ const Home = () => {
} else if (data.includes("write") || data.includes("read")) { } else if (data.includes("write") || data.includes("read")) {
if (batchMode) return; if (batchMode) return;
toast({ toast({
title: t("APP.ERRORS.READ_WRITE_ERROR.TITLE"), title: t("ERRORS.READ_WRITE_ERROR.TITLE"),
description: t("APP.ERRORS.READ_WRITE_ERROR.DESC", { data }), description: t("ERRORS.READ_WRITE_ERROR.DESCRIPTION", { data }),
action: ( action: (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<ToastAction <ToastAction
@ -174,11 +174,11 @@ const Home = () => {
navigator.clipboard.writeText(data); navigator.clipboard.writeText(data);
}} }}
> >
{t("APP.ERRORS.COPY_ERROR.TITLE")} {t("ERRORS.COPY_ERROR.TITLE")}
</ToastAction> </ToastAction>
<a href="https://docs.upscayl.org/" target="_blank"> <a href="https://docs.upscayl.org/" target="_blank">
<ToastAction altText={t("APP.ERRORS.OPEN_DOCS")}> <ToastAction altText={t("ERRORS.OPEN_DOCS_TITLE")}>
{t("APP.ERRORS.TROUBLESHOOT")} {t("ERRORS.OPEN_DOCS_BUTTON_TITLE")}
</ToastAction> </ToastAction>
</a> </a>
</div> </div>
@ -187,14 +187,14 @@ const Home = () => {
resetImagePaths(); resetImagePaths();
} else if (data.includes("tile size")) { } else if (data.includes("tile size")) {
toast({ toast({
title: t("APP.ERRORS.TILE_SIZE_ERROR.TITLE"), title: t("ERRORS.TILE_SIZE_ERROR.TITLE"),
description: t("APP.ERRORS.TILE_SIZE_ERROR.DESC", { data }), description: t("ERRORS.TILE_SIZE_ERROR.DESCRIPTION", { data }),
}); });
resetImagePaths(); resetImagePaths();
} else if (data.includes("uncaughtException")) { } else if (data.includes("uncaughtException")) {
toast({ toast({
title: t("APP.ERRORS.EXCEPTION_ERROR.TITLE"), title: t("ERRORS.EXCEPTION_ERROR.TITLE"),
description: t("APP.ERRORS.EXCEPTION_ERROR.DESC"), description: t("ERRORS.EXCEPTION_ERROR.DESCRIPTION"),
}); });
resetImagePaths(); resetImagePaths();
} }
@ -214,12 +214,12 @@ const Home = () => {
}); });
// SCALING AND CONVERTING // SCALING AND CONVERTING
window.electron.on(COMMAND.SCALING_AND_CONVERTING, (_, data: string) => { window.electron.on(COMMAND.SCALING_AND_CONVERTING, (_, data: string) => {
setProgress(t("APP.INFOS.IMAGE_PROCESSING.START")); setProgress(t("APP.PROGRESS.PROCESSING_TITLE"));
}); });
// UPSCAYL ERROR // UPSCAYL ERROR
window.electron.on(COMMAND.UPSCAYL_ERROR, (_, data: string) => { window.electron.on(COMMAND.UPSCAYL_ERROR, (_, data: string) => {
toast({ toast({
title: t("APP.ERRORS.GENERIC_ERROR.TITLE"), title: t("ERRORS.GENERIC_ERROR.TITLE"),
description: data, description: data,
}); });
resetImagePaths(); resetImagePaths();
@ -229,9 +229,9 @@ const Home = () => {
if (data.length > 0 && data.length < 10) { if (data.length > 0 && data.length < 10) {
setProgress(data); setProgress(data);
} else if (data.includes("converting")) { } else if (data.includes("converting")) {
setProgress(t("APP.INFOS.IMAGE_PROCESSING.SCALE_CONVERT")); setProgress(t("APP.PROGRESS.SCALING_CONVERTING_TITLE"));
} else if (data.includes("Successful")) { } else if (data.includes("Successful")) {
setProgress(t("APP.INFOS.IMAGE_PROCESSING.SUCCESS")); setProgress(t("APP.PROGRESS.SUCCESS_TITLE"));
} }
handleErrors(data); handleErrors(data);
logit(`🚧 UPSCAYL_PROGRESS: `, data); logit(`🚧 UPSCAYL_PROGRESS: `, data);
@ -239,7 +239,7 @@ const Home = () => {
// FOLDER UPSCAYL PROGRESS // FOLDER UPSCAYL PROGRESS
window.electron.on(COMMAND.FOLDER_UPSCAYL_PROGRESS, (_, data: string) => { window.electron.on(COMMAND.FOLDER_UPSCAYL_PROGRESS, (_, data: string) => {
if (data.includes("Successful")) { if (data.includes("Successful")) {
setProgress(t("APP.INFOS.IMAGE_PROCESSING.SUCCESS")); setProgress(t("APP.PROGRESS.SUCCESS_TITLE"));
} }
if (data.length > 0 && data.length < 10) { if (data.length > 0 && data.length < 10) {
setProgress(data); setProgress(data);
@ -378,8 +378,8 @@ const Home = () => {
logit("🔤 Extension: ", extension); logit("🔤 Extension: ", extension);
if (!allowedFileTypes.includes(extension.toLowerCase())) { if (!allowedFileTypes.includes(extension.toLowerCase())) {
toast({ toast({
title: t("APP.ERRORS.INVALID_IMAGE_ERROR.TITLE"), title: t("ERRORS.INVALID_IMAGE_ERROR.TITLE"),
description: t("APP.ERRORS.INVALID_IMAGE_ERROR.DESC"), description: t("ERRORS.INVALID_IMAGE_ERROR.DESCRIPTION"),
}); });
resetImagePaths(); resetImagePaths();
} }
@ -466,8 +466,8 @@ const Home = () => {
) { ) {
logit("👎 No valid files dropped"); logit("👎 No valid files dropped");
toast({ toast({
title: t("APP.ERRORS.INVALID_IMAGE_ERROR.TITLE"), title: t("ERRORS.INVALID_IMAGE_ERROR.TITLE"),
description: t("APP.ERRORS.INVALID_IMAGE_ERROR.DRAG_DESC"), description: t("ERRORS.INVALID_IMAGE_ERROR.ADDITIONAL_DESCRIPTION"),
}); });
return; return;
} }
@ -481,8 +481,8 @@ const Home = () => {
) { ) {
logit("🚫 Invalid file dropped"); logit("🚫 Invalid file dropped");
toast({ toast({
title: t("APP.ERRORS.INVALID_IMAGE_ERROR.TITLE"), title: t("ERRORS.INVALID_IMAGE_ERROR.TITLE"),
description: t("APP.ERRORS.INVALID_IMAGE_ERROR.DRAG_DESC"), description: t("ERRORS.INVALID_IMAGE_ERROR.ADDITIONAL_DESCRIPTION"),
}); });
} else { } else {
logit("🖼 Setting image path: ", filePath); logit("🖼 Setting image path: ", filePath);
@ -510,8 +510,8 @@ const Home = () => {
!allowedFileTypes.includes(extension.toLowerCase()) !allowedFileTypes.includes(extension.toLowerCase())
) { ) {
toast({ toast({
title: t("APP.ERRORS.INVALID_IMAGE_ERROR.TITLE"), title: t("ERRORS.INVALID_IMAGE_ERROR.TITLE"),
description: t("APP.ERRORS.INVALID_IMAGE_ERROR.DRAG_DESC"), description: t("ERRORS.INVALID_IMAGE_ERROR.ADDITIONAL_DESCRIPTION"),
}); });
} else { } else {
setImagePath(filePath); setImagePath(filePath);
@ -528,7 +528,7 @@ const Home = () => {
setUpscaledImagePath(""); setUpscaledImagePath("");
setUpscaledBatchFolderPath(""); setUpscaledBatchFolderPath("");
if (imagePath !== "" || batchFolderPath !== "") { if (imagePath !== "" || batchFolderPath !== "") {
setProgress(t("APP.INFOS.IMAGE_PROCESSING.WAIT")); setProgress(t("APP.PROGRESS.WAIT_TITLE"));
// Double Upscayl // Double Upscayl
if (doubleUpscayl) { if (doubleUpscayl) {
window.electron.send<DoubleUpscaylPayload>(COMMAND.DOUBLE_UPSCAYL, { window.electron.send<DoubleUpscaylPayload>(COMMAND.DOUBLE_UPSCAYL, {
@ -582,8 +582,8 @@ const Home = () => {
} }
} else { } else {
toast({ toast({
title: t("APP.ERRORS.NO_IMAGE_ERROR.TITLE"), title: t("ERRORS.NO_IMAGE_ERROR.TITLE"),
description: t("APP.ERRORS.NO_IMAGE_ERROR.DESC"), description: t("ERRORS.NO_IMAGE_ERROR.DESCRIPTION"),
}); });
logit("🚫 No valid image selected"); logit("🚫 No valid image selected");
} }
@ -607,7 +607,7 @@ const Home = () => {
{!showSidebar && ( {!showSidebar && (
<div className="fixed right-2 top-2 z-50 flex items-center justify-center gap-2 rounded-[7px] bg-base-300 px-2 py-1 font-medium text-base-content "> <div className="fixed right-2 top-2 z-50 flex items-center justify-center gap-2 rounded-[7px] bg-base-300 px-2 py-1 font-medium text-base-content ">
<Logo className="w-5" /> <Logo className="w-5" />
{t("APP.TITLE")} {t("TITLE")}
</div> </div>
)} )}
@ -654,7 +654,7 @@ const Home = () => {
setShowCloudModal(true); setShowCloudModal(true);
}} }}
> >
{t("APP.INTRO")} {t("INTRO")}
</button> </button>
)} )}
@ -779,7 +779,7 @@ const Home = () => {
batchFolderPath.length > 0 && ( batchFolderPath.length > 0 && (
<p className="select-none text-base-content"> <p className="select-none text-base-content">
<span className="font-bold"> <span className="font-bold">
{t("APP.INFOS.IMAGE_PROCESSING.BATCH.SELECT")} {t("APP.PROGRESS.BATCH.SELECTED_FOLDER_TITLE")}
</span>{" "} </span>{" "}
{batchFolderPath} {batchFolderPath}
</p> </p>
@ -788,13 +788,13 @@ const Home = () => {
{batchMode && upscaledBatchFolderPath.length > 0 && ( {batchMode && upscaledBatchFolderPath.length > 0 && (
<div className="z-50 flex flex-col items-center"> <div className="z-50 flex flex-col items-center">
<p className="select-none py-4 font-bold text-base-content"> <p className="select-none py-4 font-bold text-base-content">
{t("APP.INFOS.IMAGE_PROCESSING.BATCH.DONE")} {t("APP.PROGRESS.BATCH.DONE_TITLE")}
</p> </p>
<button <button
className="bg-gradient-blue btn btn-primary rounded-btn p-3 font-medium text-white/90 transition-colors" className="bg-gradient-blue btn btn-primary rounded-btn p-3 font-medium text-white/90 transition-colors"
onClick={openFolderHandler} onClick={openFolderHandler}
> >
{t("APP.INFOS.IMAGE_PROCESSING.BATCH.OPEN_DONE_FOLDER")} {t("APP.PROGRESS.BATCH.OPEN_UPSCAYLED_FOLDER_TITLE")}
</button> </button>
</div> </div>
)} )}
@ -860,13 +860,13 @@ const Home = () => {
itemOne={ itemOne={
<> <>
<p className="absolute bottom-1 left-1 rounded-md bg-black p-1 text-sm font-medium text-white opacity-30"> <p className="absolute bottom-1 left-1 rounded-md bg-black p-1 text-sm font-medium text-white opacity-30">
{t("APP.INFOS.COMPARISION.SLIDER_ORIGINAL")} {t("APP.SLIDER.ORIGINAL_TITLE")}
</p> </p>
<img <img
/* USE REGEX TO GET THE FILENAME AND ENCODE IT INTO PROPER FORM IN ORDER TO AVOID ERRORS DUE TO SPECIAL CHARACTERS */ /* USE REGEX TO GET THE FILENAME AND ENCODE IT INTO PROPER FORM IN ORDER TO AVOID ERRORS DUE TO SPECIAL CHARACTERS */
src={"file:///" + sanitizedImagePath} src={"file:///" + sanitizedImagePath}
alt={t("APP.INFOS.COMPARISION.SLIDER_ORIGINAL")} alt={t("APP.SLIDER.ORIGINAL_TITLE")}
onMouseMove={handleMouseMove} onMouseMove={handleMouseMove}
style={{ style={{
objectFit: "contain", objectFit: "contain",
@ -880,12 +880,12 @@ const Home = () => {
itemTwo={ itemTwo={
<> <>
<p className="absolute bottom-1 right-1 rounded-md bg-black p-1 text-sm font-medium text-white opacity-30"> <p className="absolute bottom-1 right-1 rounded-md bg-black p-1 text-sm font-medium text-white opacity-30">
{t("APP.INFOS.COMPARISION.SLIDER_PROCESSED")} {t("APP.SLIDER.UPSCAYLED_TITLE")}
</p> </p>
<img <img
/* USE REGEX TO GET THE FILENAME AND ENCODE IT INTO PROPER FORM IN ORDER TO AVOID ERRORS DUE TO SPECIAL CHARACTERS */ /* USE REGEX TO GET THE FILENAME AND ENCODE IT INTO PROPER FORM IN ORDER TO AVOID ERRORS DUE TO SPECIAL CHARACTERS */
src={"file:///" + sanitizedUpscaledImagePath} src={"file:///" + sanitizedUpscaledImagePath}
alt="Upscayl" alt={t("APP.SLIDER.UPSCAYLED_TITLE")}
style={{ style={{
objectFit: "contain", objectFit: "contain",
backgroundPosition: "0% 0%", backgroundPosition: "0% 0%",