mirror of https://github.com/stashapp/stash.git
i18n: Migrate hard strings (#2353)
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
parent
d88515abcd
commit
a05952829c
|
@ -78,7 +78,7 @@ export const GalleryImagesPanel: React.FC<IGalleryDetailsProps> = ({
|
|||
|
||||
const otherOperations = [
|
||||
{
|
||||
text: "Remove from Gallery",
|
||||
text: intl.formatMessage({ id: "actions.remove_from_gallery" }),
|
||||
onClick: removeImages,
|
||||
isDisplayed: showWhenSelected,
|
||||
postRefetch: true,
|
||||
|
|
|
@ -25,7 +25,6 @@ interface IMenuItem {
|
|||
hotkey: string;
|
||||
userCreatable?: boolean;
|
||||
}
|
||||
|
||||
const messages = defineMessages({
|
||||
scenes: {
|
||||
id: "scenes",
|
||||
|
@ -231,7 +230,7 @@ export const MainNavbar: React.FC = () => {
|
|||
<Button
|
||||
className="minimal logout-button d-flex align-items-center"
|
||||
href="/logout"
|
||||
title="Log out"
|
||||
title={intl.formatMessage({ id: "actions.logout" })}
|
||||
>
|
||||
<Icon icon="sign-out-alt" />
|
||||
</Button>
|
||||
|
@ -250,7 +249,10 @@ export const MainNavbar: React.FC = () => {
|
|||
target="_blank"
|
||||
onClick={handleDismiss}
|
||||
>
|
||||
<Button className="minimal donate" title="Donate">
|
||||
<Button
|
||||
className="minimal donate"
|
||||
title={intl.formatMessage({ id: "donate" })}
|
||||
>
|
||||
<Icon icon="heart" />
|
||||
<span className="d-none d-sm-inline">
|
||||
{intl.formatMessage(messages.donate)}
|
||||
|
@ -268,7 +270,7 @@ export const MainNavbar: React.FC = () => {
|
|||
<Button
|
||||
className="nav-utility minimal"
|
||||
onClick={() => openManual()}
|
||||
title="Help"
|
||||
title={intl.formatMessage({ id: "help" })}
|
||||
>
|
||||
<Icon icon="question-circle" />
|
||||
</Button>
|
||||
|
|
|
@ -102,7 +102,10 @@ export const EditMoviesDialog: React.FC<IListOperationProps> = (
|
|||
<Modal
|
||||
show
|
||||
icon="pencil-alt"
|
||||
header="Edit Movies"
|
||||
header={intl.formatMessage(
|
||||
{ id: "actions.edit_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "movies" }) }
|
||||
)}
|
||||
accept={{
|
||||
onClick: onSave,
|
||||
text: intl.formatMessage({ id: "actions.apply" }),
|
||||
|
|
|
@ -195,33 +195,33 @@ export const MovieScrapeDialog: React.FC<IMovieScrapeDialogProps> = (
|
|||
return (
|
||||
<>
|
||||
<ScrapedInputGroupRow
|
||||
title="Name"
|
||||
title={intl.formatMessage({ id: "name" })}
|
||||
result={name}
|
||||
onChange={(value) => setName(value)}
|
||||
/>
|
||||
<ScrapedInputGroupRow
|
||||
title="Aliases"
|
||||
title={intl.formatMessage({ id: "aliases" })}
|
||||
result={aliases}
|
||||
onChange={(value) => setAliases(value)}
|
||||
/>
|
||||
<ScrapedInputGroupRow
|
||||
title="Duration"
|
||||
title={intl.formatMessage({ id: "duration" })}
|
||||
result={duration}
|
||||
onChange={(value) => setDuration(value)}
|
||||
/>
|
||||
<ScrapedInputGroupRow
|
||||
title="Date"
|
||||
title={intl.formatMessage({ id: "date" })}
|
||||
placeholder="YYYY-MM-DD"
|
||||
result={date}
|
||||
onChange={(value) => setDate(value)}
|
||||
/>
|
||||
<ScrapedInputGroupRow
|
||||
title="Director"
|
||||
title={intl.formatMessage({ id: "director" })}
|
||||
result={director}
|
||||
onChange={(value) => setDirector(value)}
|
||||
/>
|
||||
<ScrapedTextAreaRow
|
||||
title="Synopsis"
|
||||
title={intl.formatMessage({ id: "synopsis" })}
|
||||
result={synopsis}
|
||||
onChange={(value) => setSynopsis(value)}
|
||||
/>
|
||||
|
|
|
@ -198,7 +198,10 @@ export const EditPerformersDialog: React.FC<IListOperationProps> = (
|
|||
<Modal
|
||||
show
|
||||
icon="pencil-alt"
|
||||
header="Edit Performers"
|
||||
header={intl.formatMessage(
|
||||
{ id: "actions.edit_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "performers" }) }
|
||||
)}
|
||||
accept={{
|
||||
onClick: onSave,
|
||||
text: intl.formatMessage({ id: "actions.apply" }),
|
||||
|
|
|
@ -390,7 +390,11 @@ const PerformerPage: React.FC<IProps> = ({ performer }) => {
|
|||
<LoadingIndicator message="Encoding image..." />
|
||||
) : (
|
||||
<Button variant="link" onClick={() => showLightbox()}>
|
||||
<img className="performer" src={activeImage} alt="Performer" />
|
||||
<img
|
||||
className="performer"
|
||||
src={activeImage}
|
||||
alt={intl.formatMessage({ id: "performer" })}
|
||||
/>
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React, { useState } from "react";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
import { LoadingIndicator } from "src/components/Shared";
|
||||
import { PerformerEditPanel } from "./PerformerEditPanel";
|
||||
|
||||
|
@ -7,6 +8,7 @@ const PerformerCreate: React.FC = () => {
|
|||
const [imageEncoding, setImageEncoding] = useState<boolean>(false);
|
||||
|
||||
const activeImage = imagePreview ?? "";
|
||||
const intl = useIntl();
|
||||
|
||||
const onImageChange = (image?: string | null) => setImagePreview(image);
|
||||
const onImageEncoding = (isEncoding = false) => setImageEncoding(isEncoding);
|
||||
|
@ -16,7 +18,13 @@ const PerformerCreate: React.FC = () => {
|
|||
return <LoadingIndicator message="Encoding image..." />;
|
||||
}
|
||||
if (activeImage) {
|
||||
return <img className="performer" src={activeImage} alt="Performer" />;
|
||||
return (
|
||||
<img
|
||||
className="performer"
|
||||
src={activeImage}
|
||||
alt={intl.formatMessage({ id: "performer" })}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,7 +34,12 @@ const PerformerCreate: React.FC = () => {
|
|||
{renderPerformerImage()}
|
||||
</div>
|
||||
<div className="col-md-8">
|
||||
<h2>Create Performer</h2>
|
||||
<h2>
|
||||
<FormattedMessage
|
||||
id="actions.create_entity"
|
||||
values={{ entityType: intl.formatMessage({ id: "performer" }) }}
|
||||
/>
|
||||
</h2>
|
||||
<PerformerEditPanel
|
||||
performer={{}}
|
||||
isVisible
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import { Button, Form, Col, Row, Badge, Dropdown } from "react-bootstrap";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
import Mousetrap from "mousetrap";
|
||||
import * as GQL from "src/core/generated-graphql";
|
||||
import * as yup from "yup";
|
||||
|
@ -84,6 +84,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
const imageEncoding = ImageUtils.usePasteImage(onImageLoad, true);
|
||||
|
||||
const [createTag] = useTagCreate();
|
||||
const intl = useIntl();
|
||||
|
||||
const genderOptions = [""].concat(genderStrings);
|
||||
|
||||
|
@ -775,7 +776,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
<Button
|
||||
variant="danger"
|
||||
className="mr-2 py-0"
|
||||
title="Delete StashID"
|
||||
title={intl.formatMessage({ id: "actions.delete_stashid" })}
|
||||
onClick={() => removeStashID(stashID)}
|
||||
>
|
||||
<Icon icon="trash-alt" />
|
||||
|
@ -815,7 +816,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
|
||||
<Prompt
|
||||
when={formik.dirty}
|
||||
message="Unsaved changes. Are you sure you want to leave?"
|
||||
message={intl.formatMessage({ id: "dialogs.unsaved_changes" })}
|
||||
/>
|
||||
{renderButtons("mb-3")}
|
||||
|
||||
|
@ -827,7 +828,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
<Col xs={fieldXS} xl={fieldXL}>
|
||||
<Form.Control
|
||||
className="text-input"
|
||||
placeholder="Name"
|
||||
placeholder={intl.formatMessage({ id: "name" })}
|
||||
{...formik.getFieldProps("name")}
|
||||
isInvalid={!!formik.errors.name}
|
||||
/>
|
||||
|
@ -845,7 +846,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
<Form.Control
|
||||
as="textarea"
|
||||
className="text-input"
|
||||
placeholder="Alias"
|
||||
placeholder={intl.formatMessage({ id: "aliases" })}
|
||||
{...formik.getFieldProps("aliases")}
|
||||
/>
|
||||
</Col>
|
||||
|
@ -889,7 +890,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
<Form.Control
|
||||
as="textarea"
|
||||
className="text-input"
|
||||
placeholder="Tattoos"
|
||||
placeholder={intl.formatMessage({ id: "tattoos" })}
|
||||
{...formik.getFieldProps("tattoos")}
|
||||
/>
|
||||
</Col>
|
||||
|
@ -903,7 +904,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
<Form.Control
|
||||
as="textarea"
|
||||
className="text-input"
|
||||
placeholder="Piercings"
|
||||
placeholder={intl.formatMessage({ id: "piercings" })}
|
||||
{...formik.getFieldProps("piercings")}
|
||||
/>
|
||||
</Col>
|
||||
|
@ -934,7 +935,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
|
|||
<Form.Control
|
||||
as="textarea"
|
||||
className="text-input"
|
||||
placeholder="Details"
|
||||
placeholder={intl.formatMessage({ id: "details" })}
|
||||
{...formik.getFieldProps("details")}
|
||||
/>
|
||||
</Col>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import React from "react";
|
||||
import { Button } from "react-bootstrap";
|
||||
import { useIntl } from "react-intl";
|
||||
import { Icon } from "src/components/Shared";
|
||||
import { SceneDataFragment } from "src/core/generated-graphql";
|
||||
import { TextUtils } from "src/utils";
|
||||
|
@ -13,6 +14,7 @@ export const ExternalPlayerButton: React.FC<IExternalPlayerButtonProps> = ({
|
|||
}) => {
|
||||
const isAndroid = /(android)/i.test(navigator.userAgent);
|
||||
const isAppleDevice = /(ipod|iphone|ipad)/i.test(navigator.userAgent);
|
||||
const intl = useIntl();
|
||||
|
||||
const { paths, path, title } = scene;
|
||||
|
||||
|
@ -44,7 +46,7 @@ export const ExternalPlayerButton: React.FC<IExternalPlayerButtonProps> = ({
|
|||
<Button
|
||||
className="minimal px-0 px-sm-2 pt-2"
|
||||
variant="secondary"
|
||||
title="Open in external player"
|
||||
title={intl.formatMessage({ id: "actions.open_in_external_player" })}
|
||||
>
|
||||
<a href={url}>
|
||||
<Icon icon="external-link-alt" color="white" />
|
||||
|
|
|
@ -348,7 +348,7 @@ const ScenePage: React.FC<IProps> = ({ scene, refetch }) => {
|
|||
variant="secondary"
|
||||
id="operation-menu"
|
||||
className="minimal"
|
||||
title="Operations"
|
||||
title={intl.formatMessage({ id: "operations" })}
|
||||
>
|
||||
<Icon icon="ellipsis-v" />
|
||||
</Dropdown.Toggle>
|
||||
|
|
|
@ -288,14 +288,14 @@ export const SettingModal = <T extends {}>(props: ISettingModal<T>) => {
|
|||
</Modal.Body>
|
||||
<Modal.Footer>
|
||||
<Button variant="secondary" onClick={() => close()}>
|
||||
Cancel
|
||||
<FormattedMessage id="actions.cancel" />
|
||||
</Button>
|
||||
<Button
|
||||
type="submit"
|
||||
variant="primary"
|
||||
onClick={() => close(currentValue)}
|
||||
>
|
||||
Confirm
|
||||
<FormattedMessage id="actions.confirm" />
|
||||
</Button>
|
||||
</Modal.Footer>
|
||||
</Form>
|
||||
|
|
|
@ -57,10 +57,18 @@ export const SettingsServicesPanel: React.FC = () => {
|
|||
try {
|
||||
if (enableDisable) {
|
||||
await enableDLNA(input);
|
||||
Toast.success({ content: "Enabled DLNA temporarily" });
|
||||
Toast.success({
|
||||
content: intl.formatMessage({
|
||||
id: "config.dlna.enabled_dlna_temporarily",
|
||||
}),
|
||||
});
|
||||
} else {
|
||||
await disableDLNA(input);
|
||||
Toast.success({ content: "Disabled DLNA temporarily" });
|
||||
Toast.success({
|
||||
content: intl.formatMessage({
|
||||
id: "config.dlna.disabled_dlna_temporarily",
|
||||
}),
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
Toast.error(e);
|
||||
|
@ -86,7 +94,11 @@ export const SettingsServicesPanel: React.FC = () => {
|
|||
|
||||
try {
|
||||
await addTempDLANIP(input);
|
||||
Toast.success({ content: "Allowed IP temporarily" });
|
||||
Toast.success({
|
||||
content: intl.formatMessage({
|
||||
id: "config.dlna.allowed_ip_temporarily",
|
||||
}),
|
||||
});
|
||||
} catch (e) {
|
||||
Toast.error(e);
|
||||
} finally {
|
||||
|
@ -106,7 +118,9 @@ export const SettingsServicesPanel: React.FC = () => {
|
|||
|
||||
try {
|
||||
await removeTempDLNAIP(input);
|
||||
Toast.success({ content: "Disallowed IP" });
|
||||
Toast.success({
|
||||
content: intl.formatMessage({ id: "config.dlna.disallowed_ip" }),
|
||||
});
|
||||
} catch (e) {
|
||||
Toast.error(e);
|
||||
} finally {
|
||||
|
@ -184,7 +198,11 @@ export const SettingsServicesPanel: React.FC = () => {
|
|||
} else {
|
||||
await disableDLNA(input);
|
||||
}
|
||||
Toast.success({ content: "Successfully cancelled temporary behaviour" });
|
||||
Toast.success({
|
||||
content: intl.formatMessage({
|
||||
id: "config.dlna.successfully_cancelled_temporary_behaviour",
|
||||
}),
|
||||
});
|
||||
} catch (e) {
|
||||
Toast.error(e);
|
||||
} finally {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React, { useEffect, useState, useMemo } from "react";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
import { Button, InputGroup, Form } from "react-bootstrap";
|
||||
import { debounce } from "lodash";
|
||||
import { Icon, LoadingIndicator } from "src/components/Shared";
|
||||
|
@ -22,6 +22,7 @@ export const FolderSelect: React.FC<IProps> = ({
|
|||
currentDirectory
|
||||
);
|
||||
const { data, error, loading } = useDirectory(debouncedDirectory);
|
||||
const intl = useIntl();
|
||||
|
||||
const selectableDirectories: string[] = currentDirectory
|
||||
? data?.directory.directories ?? defaultDirectories ?? []
|
||||
|
@ -62,7 +63,7 @@ export const FolderSelect: React.FC<IProps> = ({
|
|||
currentDirectory && data?.directory?.parent ? (
|
||||
<li className="folder-list-parent folder-list-item">
|
||||
<Button variant="link" onClick={() => goUp()}>
|
||||
<FormattedMessage defaultMessage="Up a directory" id="up-dir" />
|
||||
<FormattedMessage id="setup.folder.up_dir" />
|
||||
</Button>
|
||||
</li>
|
||||
) : null;
|
||||
|
@ -71,7 +72,7 @@ export const FolderSelect: React.FC<IProps> = ({
|
|||
<>
|
||||
<InputGroup>
|
||||
<Form.Control
|
||||
placeholder="File path"
|
||||
placeholder={intl.formatMessage({ id: "setup.folder.file_path" })}
|
||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
setDebounced(e.currentTarget.value);
|
||||
}}
|
||||
|
|
|
@ -25,6 +25,7 @@ import { useToast } from "src/hooks";
|
|||
import { TextUtils } from "src/utils";
|
||||
import { SelectComponents } from "react-select/src/components";
|
||||
import { ConfigurationContext } from "src/hooks/Config";
|
||||
import { useIntl } from "react-intl";
|
||||
|
||||
export type ValidTypes =
|
||||
| GQL.SlimPerformerDataFragment
|
||||
|
@ -402,6 +403,7 @@ export const PerformerSelect: React.FC<IFilterProps> = (props) => {
|
|||
const [createPerformer] = usePerformerCreate();
|
||||
|
||||
const { configuration } = React.useContext(ConfigurationContext);
|
||||
const intl = useIntl();
|
||||
const defaultCreatable =
|
||||
!configuration?.interface.disableDropdownCreate.performer ?? true;
|
||||
|
||||
|
@ -426,7 +428,13 @@ export const PerformerSelect: React.FC<IFilterProps> = (props) => {
|
|||
type="performers"
|
||||
isLoading={loading}
|
||||
items={performers}
|
||||
placeholder={props.noSelectionString ?? "Select performer..."}
|
||||
placeholder={
|
||||
props.noSelectionString ??
|
||||
intl.formatMessage(
|
||||
{ id: "actions.select_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "performer" }) }
|
||||
)
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -440,6 +448,7 @@ export const StudioSelect: React.FC<
|
|||
const [allAliases, setAllAliases] = useState<string[]>([]);
|
||||
const { data, loading } = useAllStudiosForFilter();
|
||||
const [createStudio] = useStudioCreate();
|
||||
const intl = useIntl();
|
||||
|
||||
const { configuration } = React.useContext(ConfigurationContext);
|
||||
const defaultCreatable =
|
||||
|
@ -550,7 +559,13 @@ export const StudioSelect: React.FC<
|
|||
type="studios"
|
||||
isLoading={loading}
|
||||
items={studios}
|
||||
placeholder={props.noSelectionString ?? "Select studio..."}
|
||||
placeholder={
|
||||
props.noSelectionString ??
|
||||
intl.formatMessage(
|
||||
{ id: "actions.select_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "studio" }) }
|
||||
)
|
||||
}
|
||||
creatable={props.creatable ?? defaultCreatable}
|
||||
onCreate={onCreate}
|
||||
/>
|
||||
|
@ -560,6 +575,7 @@ export const StudioSelect: React.FC<
|
|||
export const MovieSelect: React.FC<IFilterProps> = (props) => {
|
||||
const { data, loading } = useAllMoviesForFilter();
|
||||
const items = data?.allMovies ?? [];
|
||||
const intl = useIntl();
|
||||
|
||||
return (
|
||||
<FilterSelectComponent
|
||||
|
@ -568,7 +584,13 @@ export const MovieSelect: React.FC<IFilterProps> = (props) => {
|
|||
type="movies"
|
||||
isLoading={loading}
|
||||
items={items}
|
||||
placeholder={props.noSelectionString ?? "Select movie..."}
|
||||
placeholder={
|
||||
props.noSelectionString ??
|
||||
intl.formatMessage(
|
||||
{ id: "actions.select_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "movie" }) }
|
||||
)
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -580,7 +602,13 @@ export const TagSelect: React.FC<IFilterProps & { excludeIds?: string[] }> = (
|
|||
const [allAliases, setAllAliases] = useState<string[]>([]);
|
||||
const { data, loading } = useAllTagsForFilter();
|
||||
const [createTag] = useTagCreate();
|
||||
const placeholder = props.noSelectionString ?? "Select tags...";
|
||||
const intl = useIntl();
|
||||
const placeholder =
|
||||
props.noSelectionString ??
|
||||
intl.formatMessage(
|
||||
{ id: "actions.select_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "tags" }) }
|
||||
);
|
||||
|
||||
const { configuration } = React.useContext(ConfigurationContext);
|
||||
const defaultCreatable =
|
||||
|
|
|
@ -4,6 +4,7 @@ import * as GQL from "src/core/generated-graphql";
|
|||
import StudioModal from "./StudioModal";
|
||||
import PerformerModal from "../PerformerModal";
|
||||
import { TaggerStateContext } from "../context";
|
||||
import { useIntl } from "react-intl";
|
||||
|
||||
type PerformerModalCallback = (toCreate?: GQL.PerformerCreateInput) => void;
|
||||
type StudioModalCallback = (toCreate?: GQL.StudioCreateInput) => void;
|
||||
|
@ -43,6 +44,8 @@ export const SceneTaggerModals: React.FC = ({ children }) => {
|
|||
StudioModalCallback | undefined
|
||||
>();
|
||||
|
||||
const intl = useIntl();
|
||||
|
||||
function handlePerformerSave(toCreate: GQL.PerformerCreateInput) {
|
||||
if (performerCallback) {
|
||||
performerCallback(toCreate);
|
||||
|
@ -110,7 +113,10 @@ export const SceneTaggerModals: React.FC = ({ children }) => {
|
|||
performer={performerToCreate}
|
||||
onSave={handlePerformerSave}
|
||||
icon="tags"
|
||||
header="Create Performer"
|
||||
header={intl.formatMessage(
|
||||
{ id: "actions.create_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "performer" }) }
|
||||
)}
|
||||
endpoint={endpoint}
|
||||
create
|
||||
/>
|
||||
|
@ -122,7 +128,10 @@ export const SceneTaggerModals: React.FC = ({ children }) => {
|
|||
studio={studioToCreate}
|
||||
handleStudioCreate={handleStudioSave}
|
||||
icon="tags"
|
||||
header="Create Studio"
|
||||
header={intl.formatMessage(
|
||||
{ id: "actions.create_entity" },
|
||||
{ entityType: intl.formatMessage({ id: "studio" }) }
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
{children}
|
||||
|
|
|
@ -135,7 +135,7 @@ export const TagEditPanel: React.FC<ITagEditPanel> = ({
|
|||
<Col xs={fieldXS} xl={fieldXL}>
|
||||
<Form.Control
|
||||
className="text-input"
|
||||
placeholder="Name"
|
||||
placeholder={intl.formatMessage({ id: "name" })}
|
||||
{...formik.getFieldProps("name")}
|
||||
isInvalid={!!formik.errors.name}
|
||||
/>
|
||||
|
|
|
@ -592,7 +592,9 @@ export const LightboxComponent: React.FC<IProps> = ({
|
|||
<Button
|
||||
ref={overlayTarget}
|
||||
variant="link"
|
||||
title="Options"
|
||||
title={intl.formatMessage({
|
||||
id: "dialogs.lightbox.options",
|
||||
})}
|
||||
onClick={() => setShowOptions(!showOptions)}
|
||||
>
|
||||
<Icon icon="cog" />
|
||||
|
|
|
@ -858,7 +858,10 @@
|
|||
"next_step": "Wenn du bereit bist ein neues System anzulegen, klicke Weiter.",
|
||||
"unable_to_locate_specified_config": "Wenn du das hier liest, konnte Stash die Konfigurationsdatei, welche spezifiziert wurde, nicht finden. Dieser Wizard wird dich deshalb durch den Prozess führen, eine neue Konfiguration anzulegen."
|
||||
},
|
||||
"welcome_to_stash": "Willkommen zu Stash"
|
||||
"welcome_to_stash": "Willkommen zu Stash",
|
||||
"folder": {
|
||||
"up_dir": "Ein Verzeichnis hoch"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash-ID",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -900,7 +903,6 @@
|
|||
"total": "Gesamt",
|
||||
"true": "Wahr",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Ein Verzeichnis hoch",
|
||||
"updated_at": "Aktualisiert am",
|
||||
"url": "URL",
|
||||
"videos": "Videos",
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
"download": "Download",
|
||||
"download_backup": "Download Backup",
|
||||
"edit": "Edit",
|
||||
"edit_entity": "Edit {entityType}",
|
||||
"export": "Export…",
|
||||
"export_all": "Export all…",
|
||||
"find": "Find",
|
||||
|
@ -83,6 +84,7 @@
|
|||
"selective_auto_tag": "Selective Auto Tag",
|
||||
"selective_clean": "Selective Clean",
|
||||
"selective_scan": "Selective Scan",
|
||||
"select_entity": "Select {entityType}",
|
||||
"set_as_default": "Set as default",
|
||||
"set_back_image": "Back image…",
|
||||
"set_front_image": "Front image…",
|
||||
|
@ -102,7 +104,11 @@
|
|||
"use_default": "Use default",
|
||||
"view_random": "View Random",
|
||||
"continue": "Continue",
|
||||
"submit": "Submit"
|
||||
"submit": "Submit",
|
||||
"logout": "Log out",
|
||||
"remove_from_gallery": "Remove from Gallery",
|
||||
"delete_stashid": "Delete StashID",
|
||||
"open_in_external_player": "Open in external player"
|
||||
},
|
||||
"actions_name": "Actions",
|
||||
"age": "Age",
|
||||
|
@ -201,7 +207,12 @@
|
|||
"recent_ip_addresses": "Recent IP addresses",
|
||||
"server_display_name": "Server Display Name",
|
||||
"server_display_name_desc": "Display name for the DLNA server. Defaults to {server_name} if empty.",
|
||||
"until_restart": "until restart"
|
||||
"until_restart": "until restart",
|
||||
"allowed_ip_temporarily": "Allowed IP temporarily",
|
||||
"disabled_dlna_temporarily": "Disabled DLNA temporarily",
|
||||
"disallowed_ip": "Disallowed IP",
|
||||
"enabled_dlna_temporarily": "Enabled DLNA temporarily",
|
||||
"successfully_cancelled_temporary_behaviour": "Successfully cancelled temporary behaviour"
|
||||
},
|
||||
"general": {
|
||||
"auth": {
|
||||
|
@ -868,7 +879,11 @@
|
|||
"next_step": "When you're ready to proceed with setting up a new system, click Next.",
|
||||
"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."
|
||||
},
|
||||
"welcome_to_stash": "Welcome to Stash"
|
||||
"welcome_to_stash": "Welcome to Stash",
|
||||
"folder": {
|
||||
"file_path": "File path",
|
||||
"up_dir": "Up a directory"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -910,7 +925,6 @@
|
|||
"total": "Total",
|
||||
"true": "True",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Up a directory",
|
||||
"updated_at": "Updated At",
|
||||
"url": "URL",
|
||||
"videos": "Videos",
|
||||
|
|
|
@ -833,7 +833,10 @@
|
|||
"next_step": "Cuando estés preparado para la creación de un nuevo entorno pulsa Siguiente.",
|
||||
"unable_to_locate_specified_config": "Si estás leyendo esto es que Stash no ha podido encontrar el fichero de configuración especificado en la línea de comandos o en el entorno en el que está instalado. Este asistente te guiará durante el proceso de creación de una nueva configuración."
|
||||
},
|
||||
"welcome_to_stash": "Bienvenido a Stash"
|
||||
"welcome_to_stash": "Bienvenido a Stash",
|
||||
"folder": {
|
||||
"up_dir": "Ascender en el árbol de directorios"
|
||||
}
|
||||
},
|
||||
"stash_id": "Identificador único Stash",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -875,7 +878,6 @@
|
|||
"total": "Total",
|
||||
"true": "Sí",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Ascender en el árbol de directorios",
|
||||
"updated_at": "Fecha de modificación",
|
||||
"url": "URL",
|
||||
"weight": "Peso",
|
||||
|
|
|
@ -817,7 +817,10 @@
|
|||
"next_step": "Kun olet valmis etenemään järjestelmän luontiin, paina Seuraava.",
|
||||
"unable_to_locate_specified_config": "Mikäli luet tätä, Stash ei löydä konfiguraatiotiedostoa, joka on määritelty joko komentorivillä tai muualla. Tämä velho auttaa sinua uuden konfiguraation luomisessa."
|
||||
},
|
||||
"welcome_to_stash": "Tervetuloa Stashiin"
|
||||
"welcome_to_stash": "Tervetuloa Stashiin",
|
||||
"folder": {
|
||||
"up_dir": "Ylös"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash ID:t",
|
||||
|
@ -859,7 +862,6 @@
|
|||
"total": "Yhteensä",
|
||||
"true": "On",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Ylös",
|
||||
"updated_at": "Päivitetty",
|
||||
"url": "URL",
|
||||
"videos": "Videot",
|
||||
|
|
|
@ -851,7 +851,10 @@
|
|||
"next_step": "Lorsque vous êtes prêt à procéder à la configuration d'un nouveau système, cliquez sur Suivant.",
|
||||
"unable_to_locate_specified_config": "Si vous lisez ceci, alors Stash n'a pas pu trouver le fichier de configuration spécifié sur la ligne de commande ou l'environnement. Cet assistant vous guidera tout au long du processus de configuration d'une nouvelle configuration."
|
||||
},
|
||||
"welcome_to_stash": "Bienvenue sur Stash"
|
||||
"welcome_to_stash": "Bienvenue sur Stash",
|
||||
"folder": {
|
||||
"up_dir": "Remonter d'un répertoire"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -893,7 +896,6 @@
|
|||
"total": "Total",
|
||||
"true": "Vrai",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Remonter d'un répertoire",
|
||||
"updated_at": "Date de modification",
|
||||
"url": "URL",
|
||||
"videos": "Vidéos",
|
||||
|
|
|
@ -901,7 +901,10 @@
|
|||
"next_step": "Quando siete pronti a procedere all'impostazione di un nuovo sistema, cliccate Prossimo.",
|
||||
"unable_to_locate_specified_config": "Se state leggendo questo, allora Stash non ha potuto trovare il file di configurazione specificato nella linea di comando o ambiente. Questa procedura guidata vi guiderà attraverso il processo di impostazione di una nuova configurazione."
|
||||
},
|
||||
"welcome_to_stash": "Benvenuti su Stash"
|
||||
"welcome_to_stash": "Benvenuti su Stash",
|
||||
"folder": {
|
||||
"up_dir": "Sali una cartella"
|
||||
}
|
||||
},
|
||||
"stash_id": "ID Stash",
|
||||
"stash_ids": "ID Stash",
|
||||
|
@ -949,7 +952,6 @@
|
|||
"total": "Totale",
|
||||
"true": "Vero",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Sali una cartella",
|
||||
"updated_at": "Aggiornato Al",
|
||||
"url": "URL",
|
||||
"videos": "Video",
|
||||
|
|
|
@ -901,7 +901,10 @@
|
|||
"next_step": "新しいシステムの構築準備が整ったら、次へをクリックしてください。",
|
||||
"unable_to_locate_specified_config": "このメッセージをお読みいただいている場合、Stashはコマンドラインまたは環境変数で指定された構成ファイルを見つけることができませんでした。 このウィザードで、新しい構成をセットアップするプロセスをご案内します。"
|
||||
},
|
||||
"welcome_to_stash": "Stashへようこそ"
|
||||
"welcome_to_stash": "Stashへようこそ",
|
||||
"folder": {
|
||||
"up_dir": "上の階層へ"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash ID",
|
||||
|
@ -949,7 +952,6 @@
|
|||
"total": "合計",
|
||||
"true": "有効",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "上の階層へ",
|
||||
"updated_at": "更新日:",
|
||||
"url": "URL",
|
||||
"videos": "動画",
|
||||
|
|
|
@ -854,7 +854,10 @@
|
|||
"next_step": "Wanneer u klaar bent om door te gaan met het instellen van een nieuw systeem, klikt u op Volgende.",
|
||||
"unable_to_locate_specified_config": "Als je dit leest, kan Stash het opgegeven configuratiebestand op de opdrachtregel of in de omgeving niet vinden. Deze wizard leidt u door het proces van het opzetten van een nieuwe configuratiebestand."
|
||||
},
|
||||
"welcome_to_stash": "Welkom bij Stash"
|
||||
"welcome_to_stash": "Welkom bij Stash",
|
||||
"folder": {
|
||||
"up_dir": "Een directory omhoog"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -896,7 +899,6 @@
|
|||
"total": "Totaal",
|
||||
"true": "Waar",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Een directory omhoog",
|
||||
"updated_at": "Bijgewerkt op",
|
||||
"url": "URL",
|
||||
"videos": "Video's",
|
||||
|
|
|
@ -901,7 +901,10 @@
|
|||
"next_step": "Quando estiver pronto para prosseguir com a criação do novo sistema, clique Próximo.",
|
||||
"unable_to_locate_specified_config": "Se está lendo isto, então o Stash não pôde encontrar o arquivo de configuração especificado na linha de comando ou no ambiente. Este assistente irá te guiar durante o processo de criação de uma nova configuração."
|
||||
},
|
||||
"welcome_to_stash": "Bem-vindo ao Stash"
|
||||
"welcome_to_stash": "Bem-vindo ao Stash",
|
||||
"folder": {
|
||||
"up_dir": "Subir um diretório"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -949,7 +952,6 @@
|
|||
"total": "Total",
|
||||
"true": "Verdadeiro",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Subir um diretório",
|
||||
"updated_at": "Atualizado em",
|
||||
"url": "URL",
|
||||
"videos": "Vídeos",
|
||||
|
|
|
@ -901,7 +901,10 @@
|
|||
"next_step": "När du är redo att fortsätta med uppstarten av ett nytt system tryck på Nästa.",
|
||||
"unable_to_locate_specified_config": "Om du läser detta så kunde Stash inte hitta konfigurationsfilen som specifierades via kommandoraden eller miljön. Denna hjälp kommer guida dig genom processen av att ställa in en ny konfiguration."
|
||||
},
|
||||
"welcome_to_stash": "Välkommen till Stash"
|
||||
"welcome_to_stash": "Välkommen till Stash",
|
||||
"folder": {
|
||||
"up_dir": "Upp en mapp"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash ID:er",
|
||||
|
@ -949,7 +952,6 @@
|
|||
"total": "Total",
|
||||
"true": "Sant",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Upp en mapp",
|
||||
"updated_at": "Uppdaterad vid",
|
||||
"url": "URL",
|
||||
"videos": "Videor",
|
||||
|
|
|
@ -845,7 +845,10 @@
|
|||
"next_step": "Yeni bir sistem oluşturmak için hazır olduğunuzda Sonraki düğmesine basın.",
|
||||
"unable_to_locate_specified_config": "Eğer bunu okuyorsanız, Stash yapılandırma dosyasını bulamamış demektir. Bu sihirbaz yeni bir yapılandırma sırasında size yol gösterecektir."
|
||||
},
|
||||
"welcome_to_stash": "Stash uygulamasına hoşgeldiniz"
|
||||
"welcome_to_stash": "Stash uygulamasına hoşgeldiniz",
|
||||
"folder": {
|
||||
"up_dir": "Bir dizin üste çık"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash Kimliği (ID)",
|
||||
"stash_ids": "Stash Kimlikleri (ID)",
|
||||
|
@ -887,7 +890,6 @@
|
|||
"total": "Toplam",
|
||||
"true": "Doğru",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "Bir dizin üste çık",
|
||||
"updated_at": "Güncellenme Zamanı",
|
||||
"url": "Internet Adresi (URL)",
|
||||
"videos": "Videolar",
|
||||
|
|
|
@ -854,7 +854,10 @@
|
|||
"next_step": "当你准备好建立一个新系统时,点击“下一个”。",
|
||||
"unable_to_locate_specified_config": "如果你看到这,就意味着Stash无法用命令行或者环境变量找到配置文件。这个向导将指引你去建立一个新的配置。"
|
||||
},
|
||||
"welcome_to_stash": "欢迎使用Stash"
|
||||
"welcome_to_stash": "欢迎使用Stash",
|
||||
"folder": {
|
||||
"up_dir": "上级目录"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash 号",
|
||||
"stash_ids": "Stash号",
|
||||
|
@ -896,7 +899,6 @@
|
|||
"total": "总共",
|
||||
"true": "真",
|
||||
"twitter": "推特",
|
||||
"up-dir": "上级目录",
|
||||
"updated_at": "更新时间",
|
||||
"url": "链接",
|
||||
"videos": "视频",
|
||||
|
|
|
@ -102,7 +102,12 @@
|
|||
"temp_disable": "暫時關閉…",
|
||||
"temp_enable": "暫時啟用…",
|
||||
"use_default": "使用預設選項",
|
||||
"view_random": "隨機開啟"
|
||||
"view_random": "隨機開啟",
|
||||
"logout": "登出",
|
||||
"remove_from_gallery": "自圖庫中移除",
|
||||
"delete_stashid": "刪除 StashID",
|
||||
"edit_entity": "編輯{entityType}",
|
||||
"open_in_external_player": "透過外部播放器開啟"
|
||||
},
|
||||
"actions_name": "動作",
|
||||
"age": "年齡",
|
||||
|
@ -201,7 +206,12 @@
|
|||
"recent_ip_addresses": "最近的 IP 位址",
|
||||
"server_display_name": "伺服器顯示名稱",
|
||||
"server_display_name_desc": "DLNA 伺服器的顯示名稱。如果為空,則預設為 {server_name}。",
|
||||
"until_restart": "直到重啟"
|
||||
"until_restart": "直到重啟",
|
||||
"allowed_ip_temporarily": "已暫時允許 IP 位址",
|
||||
"disabled_dlna_temporarily": "已暫時關閉 DLNA 伺服器",
|
||||
"disallowed_ip": "已禁止的 IP 位址",
|
||||
"enabled_dlna_temporarily": "已暫時開啟 DLNA 伺服器",
|
||||
"successfully_cancelled_temporary_behaviour": "已關閉暫時啟用伺服器的功能"
|
||||
},
|
||||
"general": {
|
||||
"auth": {
|
||||
|
@ -901,7 +911,11 @@
|
|||
"next_step": "當您準備繼續設定時,點擊「下一步」。",
|
||||
"unable_to_locate_specified_config": "如果看到此畫面的話,則代表 Stash 無法找到您在命令列所提供的設定檔路徑。本安裝畫面將帶您建立新的設定檔案。"
|
||||
},
|
||||
"welcome_to_stash": "歡迎使用 Stash"
|
||||
"welcome_to_stash": "歡迎使用 Stash",
|
||||
"folder": {
|
||||
"up_dir": "往上一層",
|
||||
"file_path": "檔案路徑"
|
||||
}
|
||||
},
|
||||
"stash_id": "Stash ID",
|
||||
"stash_ids": "Stash IDs",
|
||||
|
@ -949,7 +963,6 @@
|
|||
"total": "總計",
|
||||
"true": "是",
|
||||
"twitter": "Twitter",
|
||||
"up-dir": "往上一層",
|
||||
"updated_at": "更新於",
|
||||
"url": "連結",
|
||||
"videos": "影片",
|
||||
|
|
Loading…
Reference in New Issue