i18n: Migrate hard strings (#2353)

Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
Still Hsu 2022-03-09 09:42:08 +08:00 committed by GitHub
parent d88515abcd
commit a05952829c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 209 additions and 74 deletions

View File

@ -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,

View File

@ -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>

View File

@ -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" }),

View File

@ -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)}
/>

View File

@ -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" }),

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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" />

View File

@ -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>

View File

@ -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>

View File

@ -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 {

View File

@ -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);
}}

View File

@ -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 =

View File

@ -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}

View File

@ -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}
/>

View File

@ -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" />

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": "動画",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": "视频",

View File

@ -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": "影片",