mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
i18n: Localize Setup & Migrate (#1880)
* Add migration & setup localization strings * Update hard strings in tag panels
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { Button, Card, Container, Form } from "react-bootstrap";
|
import { Button, Card, Container, Form } from "react-bootstrap";
|
||||||
|
import { useIntl, FormattedMessage } from "react-intl";
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { useSystemStatus, mutateMigrate } from "src/core/StashService";
|
import { useSystemStatus, mutateMigrate } from "src/core/StashService";
|
||||||
import { LoadingIndicator } from "../Shared";
|
import { LoadingIndicator } from "../Shared";
|
||||||
@@ -10,6 +11,8 @@ export const Migrate: React.FC = () => {
|
|||||||
const [migrateLoading, setMigrateLoading] = useState(false);
|
const [migrateLoading, setMigrateLoading] = useState(false);
|
||||||
const [migrateError, setMigrateError] = useState("");
|
const [migrateError, setMigrateError] = useState("");
|
||||||
|
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
// make suffix based on current time
|
// make suffix based on current time
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
.toISOString()
|
.toISOString()
|
||||||
@@ -32,7 +35,7 @@ export const Migrate: React.FC = () => {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
>
|
>
|
||||||
Github repository
|
<FormattedMessage id="setup.github_repository" />
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -48,7 +51,11 @@ export const Migrate: React.FC = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (migrateLoading) {
|
if (migrateLoading) {
|
||||||
return <LoadingIndicator message="Migrating database" />;
|
return (
|
||||||
|
<LoadingIndicator
|
||||||
|
message={intl.formatMessage({ id: "setup.migrate.migrating_database" })}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -85,17 +92,23 @@ export const Migrate: React.FC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<section>
|
<section>
|
||||||
<h2 className="text-danger">Migration failed</h2>
|
<h2 className="text-danger">
|
||||||
|
<FormattedMessage id="setup.migrate.migration_failed" />
|
||||||
|
</h2>
|
||||||
|
|
||||||
<p>The following error was encountered while migrating the database:</p>
|
<p>
|
||||||
|
<FormattedMessage id="setup.migrate.migration_failed_error" />
|
||||||
|
</p>
|
||||||
|
|
||||||
<Card>
|
<Card>
|
||||||
<pre>{migrateError}</pre>
|
<pre>{migrateError}</pre>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Please make any necessary corrections and try again. Otherwise, raise
|
<FormattedMessage
|
||||||
a bug on the {githubLink} or seek help in the {discordLink}.
|
id="setup.migrate.migration_failed_help"
|
||||||
|
values={{ discordLink, githubLink }}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
@@ -103,39 +116,50 @@ export const Migrate: React.FC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<h1 className="text-center mb-3">Migration required</h1>
|
<h1 className="text-center mb-3">
|
||||||
|
<FormattedMessage id="setup.migrate.migration_required" />
|
||||||
|
</h1>
|
||||||
<Card>
|
<Card>
|
||||||
<section>
|
<section>
|
||||||
<p>
|
<p>
|
||||||
Your current stash database is schema version{" "}
|
<FormattedMessage
|
||||||
<strong>{status.databaseSchema}</strong> and needs to be migrated to
|
id="setup.migrate.schema_too_old"
|
||||||
version <strong>{status.appSchema}</strong>. This version of Stash
|
values={{
|
||||||
will not function without migrating the database.
|
databaseSchema: <strong>{status.databaseSchema}</strong>,
|
||||||
|
appSchema: <strong>{status.appSchema}</strong>,
|
||||||
|
strong: (chunks: string) => <strong>{chunks}</strong>,
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p className="lead text-center my-5">
|
<p className="lead text-center my-5">
|
||||||
The schema migration process is not reversible. Once the migration
|
<FormattedMessage id="setup.migrate.migration_irreversible_warning" />
|
||||||
is performed, your database will be incompatible with previous
|
|
||||||
versions of stash.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
It is recommended that you backup your existing database before you
|
<FormattedMessage
|
||||||
migrate. We can do this for you, making a copy of your writing a
|
id="setup.migrate.backup_recommended"
|
||||||
backup to <code>{defaultBackupPath}</code> if required.
|
values={{
|
||||||
|
defaultBackupPath,
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<Form.Group id="migrate">
|
<Form.Group id="migrate">
|
||||||
<Form.Label>
|
<Form.Label>
|
||||||
Backup database path (leave empty to disable backup):
|
<FormattedMessage id="setup.migrate.backup_database_path_leave_empty_to_disable_backup" />
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
className="text-input"
|
className="text-input"
|
||||||
name="backupPath"
|
name="backupPath"
|
||||||
defaultValue={backupPath}
|
defaultValue={backupPath}
|
||||||
placeholder="database filename (empty for default)"
|
placeholder={intl.formatMessage({
|
||||||
|
id: "setup.paths.database_filename_empty_for_default",
|
||||||
|
})}
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
||||||
setBackupPath(e.currentTarget.value)
|
setBackupPath(e.currentTarget.value)
|
||||||
}
|
}
|
||||||
@@ -146,7 +170,7 @@ export const Migrate: React.FC = () => {
|
|||||||
<section>
|
<section>
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
<Button variant="primary mx-2 p-5" onClick={() => onMigrate()}>
|
<Button variant="primary mx-2 p-5" onClick={() => onMigrate()}>
|
||||||
Perform schema migration
|
<FormattedMessage id="setup.migrate.perform_schema_migration" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
import {
|
import {
|
||||||
Alert,
|
Alert,
|
||||||
Button,
|
Button,
|
||||||
@@ -23,6 +24,8 @@ export const Setup: React.FC = () => {
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [setupError, setSetupError] = useState("");
|
const [setupError, setSetupError] = useState("");
|
||||||
|
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
const [showGeneratedDialog, setShowGeneratedDialog] = useState(false);
|
const [showGeneratedDialog, setShowGeneratedDialog] = useState(false);
|
||||||
|
|
||||||
const { data: systemStatus, loading: statusLoading } = useSystemStatus();
|
const { data: systemStatus, loading: statusLoading } = useSystemStatus();
|
||||||
@@ -44,7 +47,7 @@ export const Setup: React.FC = () => {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
>
|
>
|
||||||
Github repository
|
<FormattedMessage id="setup.github_repository" />
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -69,27 +72,30 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section>
|
<section>
|
||||||
<h2 className="mb-5">Welcome to Stash</h2>
|
<h2 className="mb-5">
|
||||||
|
<FormattedMessage id="setup.welcome_to_stash" />
|
||||||
|
</h2>
|
||||||
<p className="lead text-center">
|
<p className="lead text-center">
|
||||||
If you're reading this, then Stash couldn't find the
|
<FormattedMessage id="setup.welcome_specific_config.unable_to_locate_specified_config" />
|
||||||
configuration file specified at the command line or the environment.
|
|
||||||
This wizard will guide you through the process of setting up a new
|
|
||||||
configuration.
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Stash will use the following configuration file path:{" "}
|
<FormattedMessage
|
||||||
<code>{configLocation}</code>
|
id="setup.welcome_specific_config.config_path"
|
||||||
|
values={{
|
||||||
|
path: configLocation,
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
When you're ready to proceed with setting up a new system,
|
<FormattedMessage id="setup.welcome_specific_config.next_step" />
|
||||||
click Next.
|
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mt-5">
|
<section className="mt-5">
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
<Button variant="primary mx-2 p-5" onClick={() => next()}>
|
<Button variant="primary mx-2 p-5" onClick={() => next()}>
|
||||||
Next
|
<FormattedMessage id="actions.next_action" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -101,36 +107,36 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section>
|
<section>
|
||||||
<h2 className="mb-5">Welcome to Stash</h2>
|
<h2 className="mb-5">
|
||||||
|
<FormattedMessage id="setup.welcome_to_stash" />
|
||||||
|
</h2>
|
||||||
<p className="lead text-center">
|
<p className="lead text-center">
|
||||||
If you're reading this, then Stash couldn't find an
|
<FormattedMessage id="setup.welcome.unable_to_locate_config" />
|
||||||
existing configuration. This wizard will guide you through the
|
|
||||||
process of setting up a new configuration.
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Stash tries to find its configuration file (<code>config.yml</code>)
|
<FormattedMessage
|
||||||
from the current working directory first, and if it does not find it
|
id="setup.welcome.config_path_logic_explained"
|
||||||
there, it falls back to <code>$HOME/.stash/config.yml</code> (on
|
values={{
|
||||||
Windows, this will be <code>%USERPROFILE%\.stash\config.yml</code>).
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
You can also make Stash read from a specific configuration file by
|
}}
|
||||||
running it with the <code>-c <path to config file></code> or{" "}
|
/>
|
||||||
<code>--config <path to config file></code> options.
|
|
||||||
</p>
|
</p>
|
||||||
<Alert variant="info text-center">
|
<Alert variant="info text-center">
|
||||||
If you're getting this screen unexpectedly, please try
|
<FormattedMessage
|
||||||
restarting Stash in the correct working directory or with the{" "}
|
id="setup.welcome.unexpected_explained"
|
||||||
<code>-c</code> flag.
|
values={{
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Alert>
|
</Alert>
|
||||||
<p>
|
<p>
|
||||||
With all of that out of the way, if you're ready to proceed
|
<FormattedMessage id="setup.welcome.next_step" />
|
||||||
with setting up a new system, choose where you'd like to store
|
|
||||||
your configuration file and click Next.
|
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mt-5">
|
<section className="mt-5">
|
||||||
<h3 className="text-center mb-5">
|
<h3 className="text-center mb-5">
|
||||||
Where do you want to store your Stash configuration?
|
<FormattedMessage id="setup.welcome.store_stash_config" />
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
@@ -138,13 +144,18 @@ export const Setup: React.FC = () => {
|
|||||||
variant="secondary mx-2 p-5"
|
variant="secondary mx-2 p-5"
|
||||||
onClick={() => onConfigLocationChosen("")}
|
onClick={() => onConfigLocationChosen("")}
|
||||||
>
|
>
|
||||||
In the <code>$HOME/.stash</code> directory
|
<FormattedMessage
|
||||||
|
id="setup.welcome.in_current_stash_directory"
|
||||||
|
values={{
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="secondary mx-2 p-5"
|
variant="secondary mx-2 p-5"
|
||||||
onClick={() => onConfigLocationChosen("config.yml")}
|
onClick={() => onConfigLocationChosen("config.yml")}
|
||||||
>
|
>
|
||||||
In the current working directory
|
<FormattedMessage id="setup.welcome.in_the_current_working_directory" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -172,19 +183,20 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section>
|
<section>
|
||||||
<h2 className="mb-3">Set up your paths</h2>
|
<h2 className="mb-3">
|
||||||
|
<FormattedMessage id="setup.paths.set_up_your_paths" />
|
||||||
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
Next up, we need to determine where to find your porn collection,
|
<FormattedMessage id="setup.paths.description" />
|
||||||
where to store the stash database and generated files. These
|
|
||||||
settings can be changed later if needed.
|
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<Form.Group id="stashes">
|
<Form.Group id="stashes">
|
||||||
<h3>Where is your porn located?</h3>
|
<h3>
|
||||||
|
<FormattedMessage id="setup.paths.where_is_your_porn_located" />
|
||||||
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
Add directories containing your porn videos and images. Stash will
|
<FormattedMessage id="setup.paths.where_is_your_porn_located_description" />
|
||||||
use these directories to find videos and images during scanning.
|
|
||||||
</p>
|
</p>
|
||||||
<Card>
|
<Card>
|
||||||
<StashConfiguration
|
<StashConfiguration
|
||||||
@@ -194,40 +206,48 @@ export const Setup: React.FC = () => {
|
|||||||
</Card>
|
</Card>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group id="database">
|
<Form.Group id="database">
|
||||||
<h3>Where can Stash store its database?</h3>
|
<h3>
|
||||||
|
<FormattedMessage id="setup.paths.where_can_stash_store_its_database" />
|
||||||
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
Stash uses an sqlite database to store your porn metadata. By
|
<FormattedMessage
|
||||||
default, this will be created as <code>stash-go.sqlite</code> in
|
id="setup.paths.where_can_stash_store_its_database_description"
|
||||||
the directory containing your config file. If you want to change
|
values={{
|
||||||
this, please enter an absolute or relative (to the current working
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
directory) filename.
|
}}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
className="text-input"
|
className="text-input"
|
||||||
defaultValue={databaseFile}
|
defaultValue={databaseFile}
|
||||||
placeholder="database filename (empty for default)"
|
placeholder={intl.formatMessage({
|
||||||
|
id: "setup.paths.database_filename_empty_for_default",
|
||||||
|
})}
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
||||||
setDatabaseFile(e.currentTarget.value)
|
setDatabaseFile(e.currentTarget.value)
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group id="generated">
|
<Form.Group id="generated">
|
||||||
<h3>Where can Stash store its generated content?</h3>
|
<h3>
|
||||||
|
<FormattedMessage id="setup.paths.where_can_stash_store_its_generated_content" />
|
||||||
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
In order to provide thumbnails, previews and sprites, Stash
|
<FormattedMessage
|
||||||
generates images and videos. This also includes transcodes for
|
id="setup.paths.where_can_stash_store_its_generated_content_description"
|
||||||
unsupported file formats. By default, Stash will create a{" "}
|
values={{
|
||||||
<code>generated</code> directory within the directory containing
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
your config file. If you want to change where this generated media
|
}}
|
||||||
will be stored, please enter an absolute or relative (to the
|
/>
|
||||||
current working directory) path. Stash will create this directory
|
|
||||||
if it does not already exist.
|
|
||||||
</p>
|
</p>
|
||||||
<InputGroup>
|
<InputGroup>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
className="text-input"
|
className="text-input"
|
||||||
value={generatedLocation}
|
value={generatedLocation}
|
||||||
placeholder="path to generated directory (empty for default)"
|
placeholder={intl.formatMessage({
|
||||||
|
id:
|
||||||
|
"setup.paths.path_to_generated_directory_empty_for_default",
|
||||||
|
})}
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
||||||
setGeneratedLocation(e.currentTarget.value)
|
setGeneratedLocation(e.currentTarget.value)
|
||||||
}
|
}
|
||||||
@@ -247,10 +267,10 @@ export const Setup: React.FC = () => {
|
|||||||
<section className="mt-5">
|
<section className="mt-5">
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
<Button variant="secondary mx-2 p-5" onClick={() => goBack()}>
|
<Button variant="secondary mx-2 p-5" onClick={() => goBack()}>
|
||||||
Back
|
<FormattedMessage id="actions.previous_action" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="primary mx-2 p-5" onClick={() => next()}>
|
<Button variant="primary mx-2 p-5" onClick={() => next()}>
|
||||||
Next
|
<FormattedMessage id="actions.next_action" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -320,38 +340,49 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section>
|
<section>
|
||||||
<h2 className="mb-3">Nearly there!</h2>
|
<h2 className="mb-3">
|
||||||
|
<FormattedMessage id="setup.confirm.nearly_there" />
|
||||||
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
We're almost ready to complete the configuration. Please
|
<FormattedMessage id="setup.confirm.almost_ready" />
|
||||||
confirm the following settings. You can click back to change
|
|
||||||
anything incorrect. If everything looks good, click Confirm to
|
|
||||||
create your system.
|
|
||||||
</p>
|
</p>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Configuration file location:</dt>
|
<dt>
|
||||||
|
<FormattedMessage id="setup.confirm.configuration_file_location" />
|
||||||
|
</dt>
|
||||||
<dd>{renderConfigLocation()}</dd>
|
<dd>{renderConfigLocation()}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Stash library directories</dt>
|
<dt>
|
||||||
|
<FormattedMessage id="setup.confirm.stash_library_directories" />
|
||||||
|
</dt>
|
||||||
<dd>{renderStashLibraries()}</dd>
|
<dd>{renderStashLibraries()}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Database file path</dt>
|
<dt>
|
||||||
|
<FormattedMessage id="setup.confirm.database_file_path" />
|
||||||
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<code>
|
<code>
|
||||||
{databaseFile !== ""
|
{databaseFile !== ""
|
||||||
? databaseFile
|
? databaseFile
|
||||||
: `<path containing configuration file>/stash-go.sqlite`}
|
: intl.formatMessage({
|
||||||
|
id: "setup.confirm.default_db_location",
|
||||||
|
})}
|
||||||
</code>
|
</code>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Generated directory</dt>
|
<dt>
|
||||||
|
<FormattedMessage id="setup.confirm.generated_directory" />
|
||||||
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<code>
|
<code>
|
||||||
{generatedLocation !== ""
|
{generatedLocation !== ""
|
||||||
? generatedLocation
|
? generatedLocation
|
||||||
: `<path containing configuration file>/generated`}
|
: intl.formatMessage({
|
||||||
|
id: "setup.confirm.default_generated_content_location",
|
||||||
|
})}
|
||||||
</code>
|
</code>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
@@ -359,10 +390,10 @@ export const Setup: React.FC = () => {
|
|||||||
<section className="mt-5">
|
<section className="mt-5">
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
<Button variant="secondary mx-2 p-5" onClick={() => goBack()}>
|
<Button variant="secondary mx-2 p-5" onClick={() => goBack()}>
|
||||||
Back
|
<FormattedMessage id="actions.previous_action" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="success mx-2 p-5" onClick={() => onSave()}>
|
<Button variant="success mx-2 p-5" onClick={() => onSave()}>
|
||||||
Confirm
|
<FormattedMessage id="actions.confirm" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -374,22 +405,26 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section>
|
<section>
|
||||||
<h2>Oh no! Something went wrong!</h2>
|
<h2>
|
||||||
|
<FormattedMessage id="setup.errors.something_went_wrong" />
|
||||||
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
Something went wrong while setting up your system. Here is the error
|
<FormattedMessage
|
||||||
we received:
|
id="setup.errors.something_went_wrong_while_setting_up_your_system"
|
||||||
<pre>{setupError}</pre>
|
values={{ error: <pre>{setupError}</pre> }}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
If this looks like a problem with your inputs, go ahead and click
|
<FormattedMessage
|
||||||
back to fix them up. Otherwise, raise a bug on the {githubLink}
|
id="setup.errors.something_went_wrong_description"
|
||||||
or seek help in the {discordLink}.
|
values={{ githubLink, discordLink }}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section className="mt-5">
|
<section className="mt-5">
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
<Button variant="secondary mx-2 p-5" onClick={() => goBack(2)}>
|
<Button variant="secondary mx-2 p-5" onClick={() => goBack(2)}>
|
||||||
Back
|
<FormattedMessage id="actions.previous_action" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -401,60 +436,77 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section>
|
<section>
|
||||||
<h2>Success! Your system has been created!</h2>
|
<h2>
|
||||||
|
<FormattedMessage id="setup.success.your_system_has_been_created" />
|
||||||
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
You will be taken to the Configuration page next. This page will
|
<FormattedMessage id="setup.success.next_config_step_one" />
|
||||||
allow you to customize what files to include and exclude, set a
|
|
||||||
username and password to protect your system, and a whole bunch of
|
|
||||||
other options.
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
When you are satisfied with these settings, you can begin scanning
|
<FormattedMessage
|
||||||
your content into Stash by clicking on <code>Tasks</code>, then{" "}
|
id="setup.success.next_config_step_two"
|
||||||
<code>Scan</code>.
|
values={{
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
localized_task: intl.formatMessage({
|
||||||
|
id: "config.categories.tasks",
|
||||||
|
}),
|
||||||
|
localized_scan: intl.formatMessage({ id: "actions.scan" }),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h3>Getting help</h3>
|
<h3>
|
||||||
|
<FormattedMessage id="setup.success.getting_help" />
|
||||||
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
You are encouraged to check out the in-app manual which can be
|
<FormattedMessage
|
||||||
accessed from the icon in the top-right corner of the screen that
|
id="setup.success.in_app_manual_explained"
|
||||||
looks like this: <Icon icon="question-circle" />
|
values={{ icon: <Icon icon="question-circle" /> }}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
If you run into issues or have any questions or suggestions, feel
|
<FormattedMessage
|
||||||
free to open an issue in the {githubLink}, or ask the community in
|
id="setup.success.help_links"
|
||||||
the {discordLink}.
|
values={{ discordLink, githubLink }}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h3>Support us</h3>
|
<h3>
|
||||||
|
<FormattedMessage id="setup.success.support_us" />
|
||||||
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
Check out our{" "}
|
<FormattedMessage
|
||||||
|
id="setup.success.open_collective"
|
||||||
|
values={{
|
||||||
|
open_collective_link: (
|
||||||
<a
|
<a
|
||||||
href="https://opencollective.com/stashapp"
|
href="https://opencollective.com/stashapp"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
>
|
>
|
||||||
OpenCollective
|
{" "}
|
||||||
</a>{" "}
|
OpenCollective{" "}
|
||||||
to see how you can contribute to the continued development of Stash.
|
</a>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
We also welcome contributions in the form of code (bug fixes,
|
<FormattedMessage id="setup.success.welcome_contrib" />
|
||||||
improvements and new features), testing, bug reports, improvement
|
|
||||||
and feature requests, and user support. Details can be found in the
|
|
||||||
Contribution section of the in-app manual.
|
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<p className="lead text-center">Thanks for trying Stash!</p>
|
<p className="lead text-center">
|
||||||
|
<FormattedMessage id="setup.success.thanks_for_trying_stash" />
|
||||||
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section className="mt-5">
|
<section className="mt-5">
|
||||||
<div className="d-flex justify-content-center">
|
<div className="d-flex justify-content-center">
|
||||||
<Link to="/settings?tab=configuration">
|
<Link to="/settings?tab=configuration">
|
||||||
<Button variant="success mx-2 p-5" onClick={() => goBack(2)}>
|
<Button variant="success mx-2 p-5" onClick={() => goBack(2)}>
|
||||||
Finish
|
<FormattedMessage id="actions.finish" />
|
||||||
</Button>
|
</Button>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -495,11 +547,18 @@ export const Setup: React.FC = () => {
|
|||||||
function renderCreating() {
|
function renderCreating() {
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<LoadingIndicator message="Creating your system" />
|
<LoadingIndicator
|
||||||
|
message={intl.formatMessage({
|
||||||
|
id: "setup.creating.creating_your_system",
|
||||||
|
})}
|
||||||
|
/>
|
||||||
<Alert variant="info text-center">
|
<Alert variant="info text-center">
|
||||||
If <code>ffmpeg</code> is not yet in your paths, please be patient
|
<FormattedMessage
|
||||||
while stash downloads it. View the console output to see download
|
id="setup.creating.ffmpeg_notice"
|
||||||
progress.
|
values={{
|
||||||
|
code: (chunks: string) => <code>{chunks}</code>,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Alert>
|
</Alert>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
@@ -508,7 +567,9 @@ export const Setup: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
{maybeRenderGeneratedSelectDialog()}
|
{maybeRenderGeneratedSelectDialog()}
|
||||||
<h1 className="text-center">Stash Setup Wizard</h1>
|
<h1 className="text-center">
|
||||||
|
<FormattedMessage id="setup.stash_setup_wizard" />
|
||||||
|
</h1>
|
||||||
{loading ? renderCreating() : <Card>{steps[step]()}</Card>}
|
{loading ? renderCreating() : <Card>{steps[step]()}</Card>}
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -168,7 +168,9 @@ export const Tag: React.FC = () => {
|
|||||||
if (!tag?.id) return;
|
if (!tag?.id) return;
|
||||||
try {
|
try {
|
||||||
await mutateMetadataAutoTag({ tags: [tag.id] });
|
await mutateMetadataAutoTag({ tags: [tag.id] });
|
||||||
Toast.success({ content: "Started auto tagging" });
|
Toast.success({
|
||||||
|
content: intl.formatMessage({ id: "toast.started_auto_tagging" }),
|
||||||
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Toast.error(e);
|
Toast.error(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export const TagEditPanel: React.FC<ITagEditPanel> = ({
|
|||||||
test: (value: any) => {
|
test: (value: any) => {
|
||||||
return (value ?? []).length === new Set(value).size;
|
return (value ?? []).length === new Set(value).size;
|
||||||
},
|
},
|
||||||
message: "aliases must be unique",
|
message: intl.formatMessage({ id: "dialogs.aliases_must_be_unique" }),
|
||||||
}),
|
}),
|
||||||
parent_ids: yup.array(yup.string().required()).optional().nullable(),
|
parent_ids: yup.array(yup.string().required()).optional().nullable(),
|
||||||
child_ids: yup.array(yup.string().required()).optional().nullable(),
|
child_ids: yup.array(yup.string().required()).optional().nullable(),
|
||||||
@@ -123,7 +123,7 @@ export const TagEditPanel: React.FC<ITagEditPanel> = ({
|
|||||||
if (!isNew && location.pathname.startsWith(`/tags/${tag?.id}`)) {
|
if (!isNew && location.pathname.startsWith(`/tags/${tag?.id}`)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return "Unsaved changes. Are you sure you want to leave?";
|
return intl.formatMessage({ id: "dialogs.unsaved_changes" });
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,10 @@
|
|||||||
"confirm": "Confirm",
|
"confirm": "Confirm",
|
||||||
"select_folders": "Select folders",
|
"select_folders": "Select folders",
|
||||||
"browse_for_image": "Browse for image…",
|
"browse_for_image": "Browse for image…",
|
||||||
"open_random": "Open Random"
|
"open_random": "Open Random",
|
||||||
|
"next_action": "Next",
|
||||||
|
"previous_action": "Back",
|
||||||
|
"finish": "Finish"
|
||||||
},
|
},
|
||||||
"actions_name": "Actions",
|
"actions_name": "Actions",
|
||||||
"age": "Age",
|
"age": "Age",
|
||||||
@@ -519,7 +522,8 @@
|
|||||||
"scrape_results_existing": "Existing",
|
"scrape_results_existing": "Existing",
|
||||||
"scrape_results_scraped": "Scraped",
|
"scrape_results_scraped": "Scraped",
|
||||||
"set_image_url_title": "Image URL",
|
"set_image_url_title": "Image URL",
|
||||||
"unsaved_changes": "Unsaved changes. Are you sure you want to leave?"
|
"unsaved_changes": "Unsaved changes. Are you sure you want to leave?",
|
||||||
|
"aliases_must_be_unique": "aliases must be unique"
|
||||||
},
|
},
|
||||||
"dimensions": "Dimensions",
|
"dimensions": "Dimensions",
|
||||||
"director": "Director",
|
"director": "Director",
|
||||||
@@ -699,5 +703,79 @@
|
|||||||
"image_size": "Images size",
|
"image_size": "Images size",
|
||||||
"scenes_size": "Scenes size",
|
"scenes_size": "Scenes size",
|
||||||
"scenes_duration": "Scenes duration"
|
"scenes_duration": "Scenes duration"
|
||||||
|
},
|
||||||
|
"setup": {
|
||||||
|
"github_repository": "Github repository",
|
||||||
|
"welcome_to_stash": "Welcome to Stash",
|
||||||
|
"welcome_specific_config": {
|
||||||
|
"unable_to_locate_specified_config": "If you're reading this, then Stash couldn't find the configuration file specified at the command line or the environment. This wizard will guide you through the process of setting up a new configuration.",
|
||||||
|
"config_path": "Stash will use the following configuration file path: <code>{path}</code>",
|
||||||
|
"next_step": "When you're ready to proceed with setting up a new system, click Next."
|
||||||
|
},
|
||||||
|
"welcome": {
|
||||||
|
"unable_to_locate_config": "If you're reading this, then Stash couldn't find an existing configuration. This wizard will guide you through the process of setting up a new configuration.",
|
||||||
|
"config_path_logic_explained": "Stash tries to find its configuration file (<code>config.yml</code>) from the current working directory first, and if it does not find it there, it falls back to <code>$HOME/.stash/config.yml</code> (on Windows, this will be <code>%USERPROFILE%\\.stash\\config.yml</code>). You can also make Stash read from a specific configuration file by running it with the <code>-c <path to config file></code> or <code>--config <path to config file></code> options.",
|
||||||
|
"unexpected_explained": "If you're getting this screen unexpectedly, please try restarting Stash in the correct working directory or with the <code>-c</code> flag.",
|
||||||
|
"next_step": "With all of that out of the way, if you're ready to proceed with setting up a new system, choose where you'd like to store your configuration file and click Next.",
|
||||||
|
"store_stash_config": "Where do you want to store your Stash configuration?",
|
||||||
|
"in_the_current_working_directory": "In the current working directory",
|
||||||
|
"in_current_stash_directory": "In the <code>$HOME/.stash</code> directory"
|
||||||
|
},
|
||||||
|
"paths": {
|
||||||
|
"set_up_your_paths": "Set up your paths",
|
||||||
|
"description": "Next up, we need to determine where to find your porn collection, where to store the stash database and generated files. These settings can be changed later if needed.",
|
||||||
|
"where_is_your_porn_located": "Where is your porn located?",
|
||||||
|
"where_is_your_porn_located_description": "Add directories containing your porn videos and images. Stash will use these directories to find videos and images during scanning.",
|
||||||
|
"where_can_stash_store_its_database": "Where can Stash store its database?",
|
||||||
|
"where_can_stash_store_its_database_description": "Stash uses an sqlite database to store your porn metadata. By default, this will be created as <code>stash-go.sqlite</code> in the directory containing your config file. If you want to change this, please enter an absolute or relative (to the current working directory) filename.",
|
||||||
|
"database_filename_empty_for_default": "database filename (empty for default)",
|
||||||
|
"where_can_stash_store_its_generated_content": "Where can Stash store its generated content?",
|
||||||
|
"where_can_stash_store_its_generated_content_description": "In order to provide thumbnails, previews and sprites, Stash generates images and videos. This also includes transcodes for unsupported file formats. By default, Stash will create a <code>generated</code> directory within the directory containing your config file. If you want to change where this generated media will be stored, please enter an absolute or relative (to the current working directory) path. Stash will create this directory if it does not already exist.",
|
||||||
|
"path_to_generated_directory_empty_for_default": "path to generated directory (empty for default)"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"almost_ready": "We're almost ready to complete the configuration. Please confirm the following settings. You can click back to change anything incorrect. If everything looks good, click Confirm to create your system.",
|
||||||
|
"nearly_there": "Nearly there!",
|
||||||
|
"generated_directory": "Generated directory",
|
||||||
|
"database_file_path": "Database file path",
|
||||||
|
"stash_library_directories": "Stash library directories",
|
||||||
|
"configuration_file_location": "Configuration file location:",
|
||||||
|
"default_db_location": "<path containing configuration file>/stash-go.sqlite",
|
||||||
|
"default_generated_content_location": "<path containing configuration file>/generated"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"something_went_wrong": "Oh no! Something went wrong!",
|
||||||
|
"something_went_wrong_while_setting_up_your_system": "Something went wrong while setting up your system. Here is the error we received: {error}",
|
||||||
|
"something_went_wrong_description": "If this looks like a problem with your inputs, go ahead and click back to fix them up. Otherwise, raise a bug on the {githubLink} or seek help in the {discordLink}."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"your_system_has_been_created": "Success! Your system has been created!",
|
||||||
|
"next_config_step_one": "You will be taken to the Configuration page next. This page will allow you to customize what files to include and exclude, set a username and password to protect your system, and a whole bunch of other options.",
|
||||||
|
"next_config_step_two": "When you are satisfied with these settings, you can begin scanning your content into Stash by clicking on <code>{localized_task}</code>, then <code>{localized_scan}</code>.",
|
||||||
|
"thanks_for_trying_stash": "Thanks for trying Stash!",
|
||||||
|
"welcome_contrib": "We also welcome contributions in the form of code (bug fixes, improvements and new features), testing, bug reports, improvement and feature requests, and user support. Details can be found in the Contribution section of the in-app manual.",
|
||||||
|
"getting_help": "Getting help",
|
||||||
|
"in_app_manual_explained": "You are encouraged to check out the in-app manual which can be accessed from the icon in the top-right corner of the screen that looks like this: {icon}",
|
||||||
|
"help_links": "If you run into issues or have any questions or suggestions, feel free to open an issue in the {githubLink}, or ask the community in the {discordLink}.",
|
||||||
|
"open_collective": "Check out our {open_collective_link} to see how you can contribute to the continued development of Stash.",
|
||||||
|
"support_us": "Support us"
|
||||||
|
},
|
||||||
|
"creating": {
|
||||||
|
"creating_your_system": "Creating your system",
|
||||||
|
"ffmpeg_notice": "If <code>ffmpeg</code> is not yet in your paths, please be patient while stash downloads it. View the console output to see download progress."
|
||||||
|
},
|
||||||
|
"stash_setup_wizard": "Stash Setup Wizard",
|
||||||
|
"migrate": {
|
||||||
|
"migrating_database": "Migrating database",
|
||||||
|
"migration_failed": "Migration failed",
|
||||||
|
"migration_failed_error": "The following error was encountered while migrating the database:",
|
||||||
|
"migration_failed_help": "Please make any necessary corrections and try again. Otherwise, raise a bug on the {githubLink} or seek help in the {discordLink}.",
|
||||||
|
"migration_required": "Migration required",
|
||||||
|
"schema_too_old": "Your current stash database is schema version <strong>{databaseSchema}</strong> and needs to be migrated to version <strong>{appSchema}</strong>. This version of Stash will not function without migrating the database.",
|
||||||
|
"migration_irreversible_warning": "The schema migration process is not reversible. Once the migration is performed, your database will be incompatible with previous versions of stash.",
|
||||||
|
"backup_recommended": "It is recommended that you backup your existing database before you migrate. We can do this for you, making a copy of your writing a backup to <code>{defaultBackupPath}</code> if required.",
|
||||||
|
"backup_database_path_leave_empty_to_disable_backup": "Backup database path (leave empty to disable backup):",
|
||||||
|
"perform_schema_migration": "Perform schema migration"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,11 @@
|
|||||||
"open_random": "隨機開啟",
|
"open_random": "隨機開啟",
|
||||||
"scrape_query": "爬蟲搜尋關鍵字",
|
"scrape_query": "爬蟲搜尋關鍵字",
|
||||||
"stop": "停止",
|
"stop": "停止",
|
||||||
"scrape_scene_fragment": "部分爬取"
|
"scrape_scene_fragment": "部分爬取",
|
||||||
|
"clear": "清除",
|
||||||
|
"next_action": "下一步",
|
||||||
|
"previous_action": "上一步",
|
||||||
|
"finish": "完成"
|
||||||
},
|
},
|
||||||
"actions_name": "動作",
|
"actions_name": "動作",
|
||||||
"age": "年齡",
|
"age": "年齡",
|
||||||
@@ -134,7 +138,8 @@
|
|||||||
"match_success": "已成功標記短片",
|
"match_success": "已成功標記短片",
|
||||||
"duration_off": "片長差至少 {number} 秒",
|
"duration_off": "片長差至少 {number} 秒",
|
||||||
"duration_unknown": "未知片長",
|
"duration_unknown": "未知片長",
|
||||||
"unnamed": "未命名"
|
"unnamed": "未命名",
|
||||||
|
"phash_matches": "{count} 個 PHash 匹配"
|
||||||
},
|
},
|
||||||
"verb_match_fp": "特徵碼辨別",
|
"verb_match_fp": "特徵碼辨別",
|
||||||
"verb_matched": "符合",
|
"verb_matched": "符合",
|
||||||
@@ -507,7 +512,8 @@
|
|||||||
"label": "滑動模式",
|
"label": "滑動模式",
|
||||||
"zoom": "放大"
|
"zoom": "放大"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"aliases_must_be_unique": "別名不可重複"
|
||||||
},
|
},
|
||||||
"dimensions": "解析度",
|
"dimensions": "解析度",
|
||||||
"director": "導演",
|
"director": "導演",
|
||||||
@@ -696,5 +702,79 @@
|
|||||||
"sub_tag_count": "子標籤數量",
|
"sub_tag_count": "子標籤數量",
|
||||||
"parent_of": "{children} 的母物件",
|
"parent_of": "{children} 的母物件",
|
||||||
"sub_tag_of": "{parent} 的子標籤",
|
"sub_tag_of": "{parent} 的子標籤",
|
||||||
"part_of": "{parent} 的一部分"
|
"part_of": "{parent} 的一部分",
|
||||||
|
"setup": {
|
||||||
|
"github_repository": "GitHub 版本庫",
|
||||||
|
"welcome_to_stash": "歡迎使用 Stash",
|
||||||
|
"welcome_specific_config": {
|
||||||
|
"config_path": "Stash 將使用下列設定檔案路徑:{path}",
|
||||||
|
"next_step": "當您準備繼續設定時,點擊「下一步」。",
|
||||||
|
"unable_to_locate_specified_config": "如果看到此畫面的話,則代表 Stash 無法找到您在命令列所提供的設定檔路徑。本安裝畫面將帶您建立新的設定檔案。"
|
||||||
|
},
|
||||||
|
"welcome": {
|
||||||
|
"unable_to_locate_config": "如果看到此畫面的話,則代表 Stash 無法找到先前的設定檔案。本安裝畫面將帶您建立新的設定檔案。",
|
||||||
|
"config_path_logic_explained": "Stash 於執行時,會先在執行目錄中找尋其設定檔案 (<code>config.yml</code>),當找不到時,它將會再試著使用 <code>$HOME/.stash/config.yml</code>(於 Windows 中,此路徑為 <code>%USERPROFILE%\\.stash\\config.yml</code>)。您也可在執行 Stash 時透過 <code>-c <設定檔路徑></code> 提供設定路徑,或者 <code>--config <path to config file></code>。",
|
||||||
|
"unexpected_explained": "如果您覺得此畫面不應該出現的話,請試著在正確的 Stash 資料夾中重新啟動本程式,或者將設定路徑設為 <code>-c</code>。",
|
||||||
|
"next_step": "如果您已準備好繼續安裝本程式,請選擇您想要儲存設定檔案的位置,然後點擊「下一步」。 ",
|
||||||
|
"store_stash_config": "您希望在哪裡儲存您的 Stash 設定呢?",
|
||||||
|
"in_the_current_working_directory": "於目前的工作路徑",
|
||||||
|
"in_current_stash_directory": "於 <code>$HOME/.stash</code> 資料夾中"
|
||||||
|
},
|
||||||
|
"paths": {
|
||||||
|
"set_up_your_paths": "設置你的路徑",
|
||||||
|
"description": "接下來,我們需要確定可以在哪裡找到你的片片,在哪裡儲存資料庫及其生成檔案等等。如果需要,您稍後可以再更改這些設定。",
|
||||||
|
"where_is_your_porn_located": "你的片片都藏哪?",
|
||||||
|
"where_is_your_porn_located_description": "在此選擇你A片及圖片的資料夾,Stash 將在掃描影片及圖片時使用這些路徑。",
|
||||||
|
"where_can_stash_store_its_database": "Stash 可以在哪裡儲存資料庫?",
|
||||||
|
"where_can_stash_store_its_database_description": "Stash 使用 SQLite 數據庫來儲存您片片的資料。預設情況下,Stash 將在您的設定檔路徑下以 <code>stash-go.sqlite</code> 這個檔案來儲存本資料庫內容。如果您想要更改此設定,請在此輸入您所想要的絕對或相對路徑(相對於當前工作目錄)。",
|
||||||
|
"database_filename_empty_for_default": "資料庫檔案名稱(留空以使用預設)",
|
||||||
|
"where_can_stash_store_its_generated_content": "Stash 可以在哪裡儲存其生成內容?",
|
||||||
|
"where_can_stash_store_its_generated_content_description": "為提供縮略圖、預覽和其他預覽資料,Stash 將自動生成圖片和影片資訊。這包括不支援的檔案格式之轉碼。預設情況下,Stash 將在包含您設定檔案的資料夾中建立一個新的 <code>generated</code> 資料夾。如果要更改此生成媒體的儲存位置,請在此輸入絕對或相對路徑(相對於當前工作目錄)。如果該資料夾不存在,Stash 將自動建立此目錄。",
|
||||||
|
"path_to_generated_directory_empty_for_default": "生成媒體資料夾路徑(留空以使用預設)"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"almost_ready": "我們快要設定完了,請確認以下設定是否正確。若有任何不正確的內容,您可以回上一步進行修改。若一切看起來正確,請點選下方的「確認」按鈕以完成設定。",
|
||||||
|
"nearly_there": "快好了!",
|
||||||
|
"configuration_file_location": "設定檔案路徑:",
|
||||||
|
"database_file_path": "資料庫檔案路徑",
|
||||||
|
"generated_directory": "生成媒體路徑",
|
||||||
|
"stash_library_directories": "Stash 多媒體檔案路徑",
|
||||||
|
"default_db_location": "<設定檔案位置>/stash-go.sqlite",
|
||||||
|
"default_generated_content_location": "<設定檔案位置>/generated"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"something_went_wrong": "噢不!好像出了些問題!",
|
||||||
|
"something_went_wrong_while_setting_up_your_system": "設定系統時出了些問題。以下是我們收到的錯誤:{error}",
|
||||||
|
"something_went_wrong_description": "如果您所輸入的資料看起來有問題,請點選上一步返回以更正您的資料。否則,請在 {githubLink} 上提出錯誤或在 {discordLink} 中尋求幫助。"
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"your_system_has_been_created": "成功!您的系統已完成安裝!",
|
||||||
|
"next_config_step_one": "接下來您將被帶到設定頁面。此頁面將允許您自訂要包含和排除的文件,設定用戶名和密碼以保護您的系統,以及一大堆其他選項。",
|
||||||
|
"next_config_step_two": "當您對這些設定感到滿意時,您可以點選 <code>{localized_task}</code> 開始將您的內容掃描到 Stash,然後點擊 <code>{localized_scan}</code>。",
|
||||||
|
"thanks_for_trying_stash": "感謝您使用 Stash!",
|
||||||
|
"welcome_contrib": "我們也歡迎以程式碼(錯誤修復、改進和新功能實作)、測試、錯誤報告、改進和功能請求以及用戶支援的形式做出貢獻。詳情請見程式內說明的 Contribution(貢獻)頁面。",
|
||||||
|
"getting_help": "尋求協助",
|
||||||
|
"in_app_manual_explained": "我們鼓勵您查看本程式內建的說明手冊,您可在本程式的右上角的圖案中開啟此手冊,此圖案如下:{icon}",
|
||||||
|
"help_links": "如果您有任何問題或建議,請隨時在 {githubLink} 中建立新的議題(Issue),或在 {discordLink} 中詢求協助。",
|
||||||
|
"open_collective": "您可查看我們的 {open_collective_link},了解您可以如何為 Stash 的持續發展做出貢獻。",
|
||||||
|
"support_us": "支持我們"
|
||||||
|
},
|
||||||
|
"creating": {
|
||||||
|
"creating_your_system": "建立系統中",
|
||||||
|
"ffmpeg_notice": "如果 <code>ffmpeg</code> 尚未在您的全域路徑中,請耐心等待 Stash 進行其下載。您可在命令提示字元中查看下載進度。"
|
||||||
|
},
|
||||||
|
"stash_setup_wizard": "Stash 安裝精靈",
|
||||||
|
"migrate": {
|
||||||
|
"migrating_database": "遷移資料庫中",
|
||||||
|
"migration_failed": "遷移失敗",
|
||||||
|
"migration_failed_help": "請進行所需的更正並重試。否則,請在 {githubLink} 上提出問題或在 {discordLink} 中尋求協助。",
|
||||||
|
"migration_failed_error": "遷移資料庫時遇到以下錯誤:",
|
||||||
|
"migration_required": "遷移須知",
|
||||||
|
"schema_too_old": "您當前的資料庫版本為 {databaseSchema},需要遷移至版本 {appSchema}。如果不進行資料庫遷移,此版本的 Stash 將無法運行。",
|
||||||
|
"migration_irreversible_warning": "架構遷移是不可逆的過程。遷移後,您的資料庫將無法與先前的 Stash 版本相容。",
|
||||||
|
"backup_recommended": "建議您在遷移之前備份現有資料庫檔案。如果需要,我們可以替您完成此操作,並將您的備份複製到 <code>{defaultBackupPath}</code>。",
|
||||||
|
"backup_database_path_leave_empty_to_disable_backup": "備份資料庫路徑(留空以關閉備份):",
|
||||||
|
"perform_schema_migration": "執行架構遷移"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user