mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: update locale file structure (#1478)
This commit is contained in:
@ -54,7 +54,7 @@ const ArchivedMemo: React.FC<Props> = (props: Props) => {
|
||||
<div className={`memo-wrapper archived ${"memos-" + memo.id}`} onMouseLeave={handleMouseLeaveMemoWrapper}>
|
||||
<div className="memo-top-wrapper">
|
||||
<span className="time-text">
|
||||
{t("common.archived-at")} {utils.getDateTimeString(memo.updatedTs)}
|
||||
{t("memo.archived-at")} {utils.getDateTimeString(memo.updatedTs)}
|
||||
</span>
|
||||
<div className="btns-container">
|
||||
<span className="btn-text" onClick={handleRestoreMemoClick}>
|
||||
|
@ -36,7 +36,7 @@ const ArchivedMemoDialog: React.FC<Props> = (props: Props) => {
|
||||
return (
|
||||
<>
|
||||
<div className="dialog-header-container">
|
||||
<p className="title-text">{t("archived.archived-memos")}</p>
|
||||
<p className="title-text">{t("memo.archived-memos")}</p>
|
||||
<button className="btn close-btn" onClick={destroy}>
|
||||
<Icon.X className="icon-img" />
|
||||
</button>
|
||||
@ -44,11 +44,11 @@ const ArchivedMemoDialog: React.FC<Props> = (props: Props) => {
|
||||
<div className="dialog-content-container">
|
||||
{loadingState.isLoading ? (
|
||||
<div className="tip-text-container">
|
||||
<p className="tip-text">{t("archived.fetching-data")}</p>
|
||||
<p className="tip-text">{t("memo.fetching-data")}</p>
|
||||
</div>
|
||||
) : archivedMemos.length === 0 ? (
|
||||
<div className="tip-text-container">
|
||||
<p className="tip-text">{t("archived.no-archived-memos")}</p>
|
||||
<p className="tip-text">{t("memo.no-archived-memos")}</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="archived-memos-container">
|
||||
|
@ -70,19 +70,19 @@ const ChangeMemberPasswordDialog: React.FC<Props> = (props: Props) => {
|
||||
</button>
|
||||
</div>
|
||||
<div className="dialog-content-container">
|
||||
<p className="text-sm mb-1">{t("common.new-password")}</p>
|
||||
<p className="text-sm mb-1">{t("auth.new-password")}</p>
|
||||
<input
|
||||
type="password"
|
||||
className="input-text"
|
||||
placeholder={t("common.repeat-new-password")}
|
||||
placeholder={t("auth.repeat-new-password")}
|
||||
value={newPassword}
|
||||
onChange={handleNewPasswordChanged}
|
||||
/>
|
||||
<p className="text-sm mb-1 mt-2">{t("common.repeat-new-password")}</p>
|
||||
<p className="text-sm mb-1 mt-2">{t("auth.repeat-new-password")}</p>
|
||||
<input
|
||||
type="password"
|
||||
className="input-text"
|
||||
placeholder={t("common.repeat-new-password")}
|
||||
placeholder={t("auth.repeat-new-password")}
|
||||
value={newPasswordAgain}
|
||||
onChange={handleNewPasswordAgainChanged}
|
||||
/>
|
||||
|
@ -66,21 +66,21 @@ const ChangePasswordDialog: React.FC<Props> = ({ destroy }: Props) => {
|
||||
</button>
|
||||
</div>
|
||||
<div className="dialog-content-container">
|
||||
<p className="text-sm mb-1">{t("common.new-password")}</p>
|
||||
<p className="text-sm mb-1">{t("auth.new-password")}</p>
|
||||
<input
|
||||
type="password"
|
||||
autoComplete="new-password"
|
||||
className="input-text"
|
||||
placeholder={t("common.repeat-new-password")}
|
||||
placeholder={t("auth.repeat-new-password")}
|
||||
value={newPassword}
|
||||
onChange={handleNewPasswordChanged}
|
||||
/>
|
||||
<p className="text-sm mb-1 mt-2">{t("common.repeat-new-password")}</p>
|
||||
<p className="text-sm mb-1 mt-2">{t("auth.repeat-new-password")}</p>
|
||||
<input
|
||||
type="password"
|
||||
autoComplete="new-password"
|
||||
className="input-text"
|
||||
placeholder={t("common.repeat-new-password")}
|
||||
placeholder={t("auth.repeat-new-password")}
|
||||
value={newPasswordAgain}
|
||||
onChange={handleNewPasswordAgainChanged}
|
||||
/>
|
||||
|
@ -146,14 +146,14 @@ const CreateResourceDialog: React.FC<Props> = (props: Props) => {
|
||||
return (
|
||||
<>
|
||||
<div className="dialog-header-container">
|
||||
<p className="title-text">{t("resources.create-dialog.title")}</p>
|
||||
<p className="title-text">{t("resource.create-dialog.title")}</p>
|
||||
<button className="btn close-btn" onClick={handleCloseDialog}>
|
||||
<Icon.X />
|
||||
</button>
|
||||
</div>
|
||||
<div className="dialog-content-container !w-80">
|
||||
<Typography className="!mb-1" level="body2">
|
||||
{t("resources.create-dialog.upload-method")}
|
||||
{t("resource.create-dialog.upload-method")}
|
||||
</Typography>
|
||||
<Select
|
||||
className="w-full mb-2"
|
||||
@ -161,15 +161,15 @@ const CreateResourceDialog: React.FC<Props> = (props: Props) => {
|
||||
value={state.selectedMode}
|
||||
startDecorator={<Icon.File className="w-4 h-auto" />}
|
||||
>
|
||||
<Option value="local-file">{t("resources.create-dialog.local-file.option")}</Option>
|
||||
<Option value="external-link">{t("resources.create-dialog.external-link.option")}</Option>
|
||||
<Option value="local-file">{t("resource.create-dialog.local-file.option")}</Option>
|
||||
<Option value="external-link">{t("resource.create-dialog.external-link.option")}</Option>
|
||||
</Select>
|
||||
|
||||
{state.selectedMode === "local-file" && (
|
||||
<>
|
||||
<div className="w-full relative bg-blue-50 dark:bg-zinc-900 rounded-md flex flex-row justify-center items-center py-8">
|
||||
<label htmlFor="files" className="p-2 px-4 text-sm text-white cursor-pointer bg-blue-500 block rounded hover:opacity-80">
|
||||
{t("resources.create-dialog.local-file.choose")}
|
||||
{t("resource.create-dialog.local-file.choose")}
|
||||
</label>
|
||||
<input
|
||||
className="absolute inset-0 w-full h-full opacity-0"
|
||||
@ -196,7 +196,7 @@ const CreateResourceDialog: React.FC<Props> = (props: Props) => {
|
||||
{state.selectedMode === "external-link" && (
|
||||
<>
|
||||
<Typography className="!mb-1" level="body2">
|
||||
{t("resources.create-dialog.external-link.link")}
|
||||
{t("resource.create-dialog.external-link.link")}
|
||||
</Typography>
|
||||
<Input
|
||||
className="mb-2"
|
||||
@ -206,22 +206,22 @@ const CreateResourceDialog: React.FC<Props> = (props: Props) => {
|
||||
fullWidth
|
||||
/>
|
||||
<Typography className="!mb-1" level="body2">
|
||||
{t("resources.create-dialog.external-link.file-name")}
|
||||
{t("resource.create-dialog.external-link.file-name")}
|
||||
</Typography>
|
||||
<Input
|
||||
className="mb-2"
|
||||
placeholder={t("resources.create-dialog.external-link.file-name-placeholder")}
|
||||
placeholder={t("resource.create-dialog.external-link.file-name-placeholder")}
|
||||
value={resourceCreate.filename}
|
||||
onChange={handleFileNameChanged}
|
||||
fullWidth
|
||||
/>
|
||||
<Typography className="!mb-1" level="body2">
|
||||
{t("resources.create-dialog.external-link.type")}
|
||||
{t("resource.create-dialog.external-link.type")}
|
||||
</Typography>
|
||||
<Autocomplete
|
||||
className="w-full"
|
||||
size="sm"
|
||||
placeholder={t("resources.create-dialog.external-link.type-placeholder")}
|
||||
placeholder={t("resource.create-dialog.external-link.type-placeholder")}
|
||||
freeSolo={true}
|
||||
options={fileTypeAutocompleteOptions}
|
||||
onChange={(_, value) => handleFileTypeChanged(value || "")}
|
||||
|
@ -74,7 +74,7 @@ const Header = () => {
|
||||
}
|
||||
>
|
||||
<>
|
||||
<Icon.Calendar className="mr-4 w-6 h-auto opacity-80" /> {t("common.daily-review")}
|
||||
<Icon.Calendar className="mr-4 w-6 h-auto opacity-80" /> {t("daily-review.title")}
|
||||
</>
|
||||
</NavLink>
|
||||
<NavLink
|
||||
@ -112,7 +112,7 @@ const Header = () => {
|
||||
className="px-4 pr-5 py-2 rounded-lg flex flex-row items-center text-lg dark:text-gray-200 hover:bg-white hover:shadow dark:hover:bg-zinc-700"
|
||||
onClick={() => showAskAIDialog()}
|
||||
>
|
||||
<Icon.Bot className="mr-4 w-6 h-auto opacity-80" /> {t("common.ask-ai")}
|
||||
<Icon.Bot className="mr-4 w-6 h-auto opacity-80" /> {t("ask-ai.title")}
|
||||
</button>
|
||||
<button
|
||||
id="header-archived-memo"
|
||||
|
@ -139,7 +139,7 @@ const MemoList = () => {
|
||||
))}
|
||||
{isFetching ? (
|
||||
<div className="status-text-container fetching-tip">
|
||||
<p className="status-text">{t("memo-list.fetching-data")}</p>
|
||||
<p className="status-text">{t("memo.fetching-data")}</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="status-text-container">
|
||||
@ -153,7 +153,7 @@ const MemoList = () => {
|
||||
) : (
|
||||
<>
|
||||
<span className="cursor-pointer hover:text-green-600" onClick={handleFetchMoreClick}>
|
||||
{t("memo-list.fetch-more")}
|
||||
{t("memo.fetch-more")}
|
||||
</span>
|
||||
</>
|
||||
)}
|
||||
|
@ -57,13 +57,13 @@ const ResourceItemDropdown = ({ resource }: Props) => {
|
||||
};
|
||||
|
||||
const handleDeleteResourceBtnClick = (resource: Resource) => {
|
||||
let warningText = t("resources.warning-text");
|
||||
let warningText = t("resource.warning-text");
|
||||
if (resource.linkedMemoAmount > 0) {
|
||||
warningText = warningText + `\n${t("resources.linked-amount")}: ${resource.linkedMemoAmount}`;
|
||||
warningText = warningText + `\n${t("resource.linked-amount")}: ${resource.linkedMemoAmount}`;
|
||||
}
|
||||
|
||||
showCommonDialog({
|
||||
title: t("resources.delete-resource"),
|
||||
title: t("resource.delete-resource"),
|
||||
content: warningText,
|
||||
style: "warning",
|
||||
dialogName: "delete-resource-dialog",
|
||||
@ -83,13 +83,13 @@ const ResourceItemDropdown = ({ resource }: Props) => {
|
||||
className="w-full text-left text-sm leading-6 py-1 px-3 cursor-pointer rounded hover:bg-gray-100 dark:hover:bg-zinc-600"
|
||||
onClick={() => handlePreviewBtnClick(resource)}
|
||||
>
|
||||
{t("resources.preview")}
|
||||
{t("common.preview")}
|
||||
</button>
|
||||
<button
|
||||
className="w-full text-left text-sm leading-6 py-1 px-3 cursor-pointer rounded hover:bg-gray-100 dark:hover:bg-zinc-600"
|
||||
onClick={() => handleCopyResourceLinkBtnClick(resource)}
|
||||
>
|
||||
{t("resources.copy-link")}
|
||||
{t("resource.copy-link")}
|
||||
</button>
|
||||
<button
|
||||
className="w-full text-left text-sm leading-6 py-1 px-3 cursor-pointer rounded hover:bg-gray-100 dark:hover:bg-zinc-600"
|
||||
@ -101,7 +101,7 @@ const ResourceItemDropdown = ({ resource }: Props) => {
|
||||
className="w-full text-left text-sm leading-6 py-1 px-3 cursor-pointer rounded hover:bg-gray-100 dark:hover:bg-zinc-600"
|
||||
onClick={() => handleRenameBtnClick(resource)}
|
||||
>
|
||||
{t("resources.rename")}
|
||||
{t("common.rename")}
|
||||
</button>
|
||||
<button
|
||||
className="w-full text-left text-sm leading-6 py-1 px-3 cursor-pointer rounded text-red-600 hover:bg-gray-100 dark:hover:bg-zinc-600"
|
||||
|
@ -31,7 +31,7 @@ const ResourceSearchBar = ({ setQuery }: ResourceSearchBarProps) => {
|
||||
<input
|
||||
className="flex ml-2 w-24 grow text-sm outline-none bg-transparent dark:text-gray-200"
|
||||
type="text"
|
||||
placeholder={t("resources.search-bar-placeholder")}
|
||||
placeholder={t("resource.search-bar-placeholder")}
|
||||
ref={inputRef}
|
||||
value={queryText}
|
||||
onChange={handleTextQueryInput}
|
||||
|
@ -87,17 +87,17 @@ const ResourcesSelectorDialog: React.FC<Props> = (props: Props) => {
|
||||
<div className="dialog-content-container">
|
||||
{loadingState.isLoading ? (
|
||||
<div className="loading-text-container">
|
||||
<p className="tip-text">{t("resources.fetching-data")}</p>
|
||||
<p className="tip-text">{t("resource.fetching-data")}</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="resource-table-container">
|
||||
<div className="fields-container">
|
||||
<span className="field-text name-text">{t("resources.name")}</span>
|
||||
<span className="field-text name-text">{t("common.name")}</span>
|
||||
<span className="field-text type-text">Type</span>
|
||||
<span></span>
|
||||
</div>
|
||||
{resources.length === 0 ? (
|
||||
<p className="tip-text">{t("resources.no-resources")}</p>
|
||||
<p className="tip-text">{t("resource.no-resources")}</p>
|
||||
) : (
|
||||
resources.map((resource, index) => (
|
||||
<div key={resource.id} className="resource-container">
|
||||
|
@ -66,7 +66,7 @@ const SearchBar = () => {
|
||||
<input
|
||||
className="flex ml-2 w-24 grow text-sm outline-none bg-transparent dark:text-gray-200"
|
||||
type="text"
|
||||
placeholder={t("search-bar.input-placeholder")}
|
||||
placeholder={t("memo.search-placeholder")}
|
||||
ref={inputRef}
|
||||
value={queryText}
|
||||
onChange={handleTextQueryInput}
|
||||
|
1
web/src/helpers/site.ts
Normal file
1
web/src/helpers/site.ts
Normal file
@ -0,0 +1 @@
|
||||
export const slogan = "A lightweight, self-hosted memo hub. Open Source and Free forever.";
|
@ -51,7 +51,6 @@
|
||||
"avatar": "Avatar",
|
||||
"database": "Database"
|
||||
},
|
||||
"slogan": "Eine quelloffene, selbst gehostete Sammlung an Memos zur Wissensverwaltung und Vernetzung.",
|
||||
"auth": {
|
||||
"signup-as-host": "Als Host registrieren",
|
||||
"host-tip": "Du registrierst dich als Host dieser Seite.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Einstellung",
|
||||
"archived": "Archiviert"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ups, hier ist nichts."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"no-resources": "Keine Ressourcen.",
|
||||
"fetching-data": "Lade Daten...",
|
||||
"upload": "Hochladen",
|
||||
|
@ -4,16 +4,12 @@
|
||||
"home": "Home",
|
||||
"resources": "Resources",
|
||||
"settings": "Settings",
|
||||
"daily-review": "Daily Review",
|
||||
"ask-ai": "Ask AI",
|
||||
"archived": "Archived",
|
||||
"email": "Email",
|
||||
"password": "Password",
|
||||
"avatar": "Avatar",
|
||||
"username": "Username",
|
||||
"nickname": "Nickname",
|
||||
"new-password": "New password",
|
||||
"repeat-new-password": "Repeat the new password",
|
||||
"save": "Save",
|
||||
"close": "Close",
|
||||
"cancel": "Cancel",
|
||||
@ -37,53 +33,76 @@
|
||||
"sign-in": "Sign in",
|
||||
"sign-up": "Sign up",
|
||||
"sign-out": "Sign out",
|
||||
"back-to-home": "Back to Home",
|
||||
"type": "Type",
|
||||
"shortcuts": "Shortcuts",
|
||||
"title": "Title",
|
||||
"filter": "Filter",
|
||||
"tags": "Tags",
|
||||
"yourself": "Yourself",
|
||||
"archived-at": "Archived at",
|
||||
"changed": "changed",
|
||||
"update-on": "Update on",
|
||||
"fold": "Fold",
|
||||
"expand": "Expand",
|
||||
"image": "Image",
|
||||
"link": "Link",
|
||||
"vacuum": "Vacuum",
|
||||
"select": "Select",
|
||||
"database": "Database"
|
||||
"database": "Database",
|
||||
"upload": "Upload",
|
||||
"preview": "Preview",
|
||||
"rename": "Rename",
|
||||
"clear": "Clear",
|
||||
"name": "Name"
|
||||
},
|
||||
"router": {
|
||||
"back-to-home": "Back to Home"
|
||||
},
|
||||
"slogan": "An open-source, self-hosted memo hub with knowledge management and social networking.",
|
||||
"auth": {
|
||||
"signup-as-host": "Sign up as Host",
|
||||
"host-tip": "You are registering as the Site Host.",
|
||||
"not-host-tip": "If you don't have an account, please contact the site host."
|
||||
"not-host-tip": "If you don't have an account, please contact the site host.",
|
||||
"new-password": "New password",
|
||||
"repeat-new-password": "Repeat the new password"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oops, there is nothing."
|
||||
"editor": {
|
||||
"editing": "Editing...",
|
||||
"cancel-edit": "Cancel edit",
|
||||
"save": "Save",
|
||||
"placeholder": "Any thoughts...",
|
||||
"only-image-supported": "Only image file supported.",
|
||||
"cant-empty": "Content can't be empty",
|
||||
"local": "Local",
|
||||
"resources": "Resources"
|
||||
},
|
||||
"resources": {
|
||||
"description": "View your static resources in memos. e.g. images",
|
||||
"memo": {
|
||||
"view-detail": "View Detail",
|
||||
"copy": "Copy",
|
||||
"embed": "Embed memo",
|
||||
"archived-memos": "Archived Memos",
|
||||
"no-archived-memos": "No archived memos.",
|
||||
"fetching-data": "fetching data...",
|
||||
"fetch-more": "Click here to fetch more",
|
||||
"archived-at": "Archived at",
|
||||
"search-placeholder": "Search memos",
|
||||
"visibility": {
|
||||
"private": "Only visible to you",
|
||||
"protected": "Visible to members",
|
||||
"public": "Everyone can see",
|
||||
"disabled": "Public memos are disabled"
|
||||
}
|
||||
},
|
||||
"resource": {
|
||||
"no-resources": "No resources.",
|
||||
"fetching-data": "fetching data...",
|
||||
"upload": "Upload",
|
||||
"preview": "Preview",
|
||||
"copy-link": "Copy Link",
|
||||
"delete-resource": "Delete Resource",
|
||||
"warning-text": "Are you sure to delete this resource? THIS ACTION IS IRREVERSIBLE❗",
|
||||
"linked-amount": "Linked memo amount",
|
||||
"rename": "Rename",
|
||||
"clear": "Clear",
|
||||
"warning-text-unused": "Are you sure to delete these unused resources? THIS ACTION IS IRREVERSIBLE❗",
|
||||
"no-unused-resources": "No unused resources",
|
||||
"name": "Name",
|
||||
"delete-selected-resources": "Delete Selected Resources",
|
||||
"no-files-selected": "No files selected❗",
|
||||
"upload-successfully": "Upload successfully",
|
||||
"file-drag-drop-prompt": "Drag and drop your file here to upload file",
|
||||
"select": "Select",
|
||||
"search-bar-placeholder": "Search resource",
|
||||
"create-dialog": {
|
||||
"title": "Create Resource",
|
||||
@ -102,36 +121,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"archived": {
|
||||
"archived-memos": "Archived Memos",
|
||||
"no-archived-memos": "No archived memos.",
|
||||
"fetching-data": "fetching data..."
|
||||
},
|
||||
"editor": {
|
||||
"editing": "Editing...",
|
||||
"cancel-edit": "Cancel edit",
|
||||
"save": "Save",
|
||||
"placeholder": "Any thoughts...",
|
||||
"only-image-supported": "Only image file supported.",
|
||||
"cant-empty": "Content can't be empty",
|
||||
"local": "Local",
|
||||
"resources": "Resources"
|
||||
},
|
||||
"memo": {
|
||||
"view-detail": "View Detail",
|
||||
"copy": "Copy",
|
||||
"embed": "Embed memo",
|
||||
"visibility": {
|
||||
"private": "Only visible to you",
|
||||
"protected": "Visible to members",
|
||||
"public": "Everyone can see",
|
||||
"disabled": "Public memos are disabled"
|
||||
}
|
||||
},
|
||||
"memo-list": {
|
||||
"fetching-data": "fetching data...",
|
||||
"fetch-more": "Click here to fetch more"
|
||||
},
|
||||
"shortcut-list": {
|
||||
"shortcut-title": "shortcut title",
|
||||
"create-shortcut": "Create Shortcut",
|
||||
@ -141,41 +130,14 @@
|
||||
"title-required": "Title is required",
|
||||
"value-required": "Filter value is required"
|
||||
},
|
||||
"filter": {
|
||||
"new-filter": "New Filter",
|
||||
"type": {
|
||||
"tag": "Tag",
|
||||
"type": "Type",
|
||||
"text": "Text",
|
||||
"display-time": "Display Time",
|
||||
"visibility": "Visibility"
|
||||
},
|
||||
"operator": {
|
||||
"contains": "Contains",
|
||||
"not-contains": "Does not contain",
|
||||
"is": "Is",
|
||||
"is-not": "Is Not",
|
||||
"before": "Before",
|
||||
"after": "After"
|
||||
},
|
||||
"value": {
|
||||
"not-tagged": "No tags",
|
||||
"linked": "Has links",
|
||||
"has-attachment": "Has attachments"
|
||||
},
|
||||
"text-placeholder": "Starts with ^ to use regex"
|
||||
},
|
||||
"tag-list": {
|
||||
"tip-text": "Input `#tag` to create",
|
||||
"create-tag": "Create Tag",
|
||||
"all-tags": "All Tags",
|
||||
"tag-name": "TAG_NAME"
|
||||
},
|
||||
"search": {
|
||||
"quickly-filter": "Quickly filter"
|
||||
},
|
||||
"search-bar": {
|
||||
"input-placeholder": "Search memos"
|
||||
"daily-review": {
|
||||
"title": "Daily Review"
|
||||
},
|
||||
"setting": {
|
||||
"my-account": "My Account",
|
||||
@ -234,13 +196,29 @@
|
||||
"dark": "Always dark"
|
||||
}
|
||||
},
|
||||
"amount-text": {
|
||||
"memo_one": "MEMO",
|
||||
"memo_other": "MEMOS",
|
||||
"tag_one": "TAG",
|
||||
"tag_other": "TAGS",
|
||||
"day_one": "DAY",
|
||||
"day_other": "DAYS"
|
||||
"filter": {
|
||||
"new-filter": "New Filter",
|
||||
"type": {
|
||||
"tag": "Tag",
|
||||
"type": "Type",
|
||||
"text": "Text",
|
||||
"display-time": "Display Time",
|
||||
"visibility": "Visibility"
|
||||
},
|
||||
"operator": {
|
||||
"contains": "Contains",
|
||||
"not-contains": "Does not contain",
|
||||
"is": "Is",
|
||||
"is-not": "Is Not",
|
||||
"before": "Before",
|
||||
"after": "After"
|
||||
},
|
||||
"value": {
|
||||
"not-tagged": "No tags",
|
||||
"linked": "Has links",
|
||||
"has-attachment": "Has attachments"
|
||||
},
|
||||
"text-placeholder": "Starts with ^ to use regex"
|
||||
},
|
||||
"message": {
|
||||
"no-memos": "no memos 🌃",
|
||||
@ -285,19 +263,12 @@
|
||||
"page-not-found": "404 - Page Not Found 😥"
|
||||
},
|
||||
"days": {
|
||||
"monday": "Monday",
|
||||
"mon": "Mon",
|
||||
"tuesday": "Tuesday",
|
||||
"tue": "Tue",
|
||||
"wednesday": "Wednesday",
|
||||
"wed": "Wed",
|
||||
"thursday": "Thursday",
|
||||
"thu": "Thu",
|
||||
"friday": "Friday",
|
||||
"fri": "Fri",
|
||||
"saturday": "Saturday",
|
||||
"sat": "Sat",
|
||||
"sunday": "Sunday",
|
||||
"sun": "Sun"
|
||||
},
|
||||
"ask-ai": {
|
||||
@ -311,10 +282,5 @@
|
||||
"text": "Copy and paste the below codes into your blog or website.",
|
||||
"only-public-supported": "* Only the public memo supports.",
|
||||
"copy": "Copy"
|
||||
},
|
||||
"visibility": {
|
||||
"PUBLIC": "PUBLIC",
|
||||
"PROTECTED": "PROTECTED",
|
||||
"PRIVATE": "PRIVATE"
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,6 @@
|
||||
"database": "Base de datos",
|
||||
"avatar": "Avatar"
|
||||
},
|
||||
"slogan": "Un código abierto, centro de notas autoalojado con la gestión del conocimiento y la socialización.",
|
||||
"auth": {
|
||||
"signup-as-host": "Registrarse como Anfitrión",
|
||||
"host-tip": "Te estás registrando como Anfitrión del Sitio.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Ajustes",
|
||||
"archived": "Archivado"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ups, no hay nada."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Visualiza tus recursos estáticos en notas. p.ej., imágenes",
|
||||
"no-resources": "Sin recursos.",
|
||||
"fetching-data": "obteniendo datos...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"avatar": "Avatar",
|
||||
"database": "Database"
|
||||
},
|
||||
"slogan": "An open-source, self-hosted memo hub with knowledge management and social networking.",
|
||||
"auth": {
|
||||
"signup-as-host": "S'inscrire en tant qu'hôte",
|
||||
"host-tip": "Vous vous inscrivez en tant qu'hébergeur du site.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Réglage",
|
||||
"archived": "Archivé"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oups, il n'y a rien."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Visualisez vos ressources statiques dans des mémos, par exemple des images.",
|
||||
"no-resources": "Aucune ressource.",
|
||||
"fetching-data": "récupération des données...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"avatar": "Avatar",
|
||||
"database": "Database"
|
||||
},
|
||||
"slogan": "An open-source, self-hosted memo hub with knowledge management and social networking.",
|
||||
"auth": {
|
||||
"signup-as-host": "Registrati come Host",
|
||||
"host-tip": "Ti stai registrando come Host del sito.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Impostazioni",
|
||||
"archived": "Archiviati"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oops, non c'è niente."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Visualizza le tue risorse statiche nei memo. es: immagini",
|
||||
"no-resources": "Nessuna risorsa.",
|
||||
"fetching-data": "recupero i dati...",
|
||||
|
@ -81,16 +81,12 @@
|
||||
"tag_one": "TAG",
|
||||
"tag_other": "TAGS"
|
||||
},
|
||||
"slogan": "지식 정리와 소셜 네트워킹 기능을 갖춘 자체 호스팅의 오픈 소스 메모 허브입니다.",
|
||||
"auth": {
|
||||
"signup-as-host": "호스트로서 회원등록",
|
||||
"host-tip": "사이트 주인으로서의 계정을 등록합니다.",
|
||||
"not-host-tip": "계정이 없다면 사이트 주인에게 문의해 주세요."
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "앗, 아무것도 없네요."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"clear": "정리",
|
||||
"copy-link": "링크 복사",
|
||||
"delete-resource": "리소스 삭제",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"select": "Selecteer",
|
||||
"database": "Database"
|
||||
},
|
||||
"slogan": "Een open-source, zelf-beheerd memo applicatie voor kennismanagement en collaboratie.",
|
||||
"auth": {
|
||||
"signup-as-host": "Registreren als Host",
|
||||
"host-tip": "Je registreert je als Site Host.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Instellingen",
|
||||
"archived": "Gearchiveerd"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oeps, er is niets."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Bekijk je statische bronnen in memos, zoals foto's.",
|
||||
"no-resources": "Geen bronnen.",
|
||||
"fetching-data": "data aan het ophalen...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"select": "Wybierz",
|
||||
"database": "Baza danych"
|
||||
},
|
||||
"slogan": "Open-source centrum notatek do samodzielnego hostowania z zarządzaniem wiedzą i sieciami społecznościowymi.",
|
||||
"auth": {
|
||||
"signup-as-host": "Zarejestruj się jako właściciel",
|
||||
"host-tip": "Rejestrujesz się jako właściciel.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Ustawienia",
|
||||
"archived": "Zarchiwizowane"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ups, nic tu nie ma."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Zobacz statyczne zasoby w notatkach, na przykład obrazki",
|
||||
"no-resources": "Brak zasobów.",
|
||||
"fetching-data": "pobieranie danych...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"select": "Selecionar",
|
||||
"database": "Banco de dados"
|
||||
},
|
||||
"slogan": "An open-source, self-hosted memo hub with knowledge management and social networking.",
|
||||
"auth": {
|
||||
"signup-as-host": "Sign up as Host",
|
||||
"host-tip": "You are registering as the Site Host.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Configurações",
|
||||
"archived": "Arquivado"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oops, não há nada aqui."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "View your static resources in memos. e.g. images",
|
||||
"no-resources": "No resources.",
|
||||
"fetching-data": "fetching data...",
|
||||
@ -204,14 +200,6 @@
|
||||
"dark": "Always dark"
|
||||
}
|
||||
},
|
||||
"amount-text": {
|
||||
"memo_one": "MEMO",
|
||||
"memo_many": "",
|
||||
"tag_one": "TAG",
|
||||
"tag_many": "",
|
||||
"day_one": "DAY",
|
||||
"day_many": ""
|
||||
},
|
||||
"message": {
|
||||
"no-memos": "no memos 🌃",
|
||||
"memos-ready": "all memos are ready 🎉",
|
||||
@ -253,19 +241,12 @@
|
||||
"page-not-found": "404 - Page Not Found 😥"
|
||||
},
|
||||
"days": {
|
||||
"monday": "Monday",
|
||||
"mon": "Mon",
|
||||
"tuesday": "Tuesday",
|
||||
"tue": "Tue",
|
||||
"wednesday": "Wednesday",
|
||||
"wed": "Wed",
|
||||
"thursday": "Thursday",
|
||||
"thu": "Thu",
|
||||
"friday": "Friday",
|
||||
"fri": "Fri",
|
||||
"saturday": "Saturday",
|
||||
"sat": "Sat",
|
||||
"sunday": "Sunday",
|
||||
"sun": "Sun"
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,6 @@
|
||||
"database": "База-Данных",
|
||||
"settings": "Настройки"
|
||||
},
|
||||
"slogan": "Self-hosted платформа с открытым исходным кодом для заметок и управления записями с поддержкой социальных функций.",
|
||||
"auth": {
|
||||
"signup-as-host": "Зарегистрироваться как владелец",
|
||||
"host-tip": "Вы регистрируете владельца сайта.",
|
||||
@ -69,10 +68,7 @@
|
||||
"setting": "Настройки",
|
||||
"archived": "Заархивировано"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ой, здесь ничего нет."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Посмотреть ваши статические ресурсы в Memos (изображения и пр.)",
|
||||
"no-resources": "Нет ресурсов.",
|
||||
"fetching-data": "загрузка данных...",
|
||||
|
@ -55,16 +55,12 @@
|
||||
"select": "Izberi",
|
||||
"database": "Baza"
|
||||
},
|
||||
"slogan": "Odprtokodno, samo-gostovano vozlišče beležk z nadzorom znanja in socialne mreže.",
|
||||
"auth": {
|
||||
"signup-as-host": "Prijavite se kot gostitelj",
|
||||
"host-tip": "Registrirani ste kot gostitelj strani.",
|
||||
"not-host-tip": "Če nimate računa, prosim kontaktirajte gostitelja strani."
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ups, tu ni še ničesar."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Poglejte svoje statične vire v beležkah npr. slike",
|
||||
"no-resources": "Ni virov.",
|
||||
"fetching-data": "pridobivam podatke...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"avatar": "Avatar",
|
||||
"database": "Databas"
|
||||
},
|
||||
"slogan": "En öppen källkod, self-hosted antecknings hubb med kunskapshantering och socialisering",
|
||||
"auth": {
|
||||
"signup-as-host": "Registera dig som värd",
|
||||
"host-tip": "Du registerar dig som webbplatsvärd.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Inställningar",
|
||||
"archived": "Arkiverade"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oj, det finns inget här."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Visa dina statiska resurser i anteckningarn. t.ex bilder.",
|
||||
"no-resources": "Inga resurser.",
|
||||
"fetching-data": "hämtar data...",
|
||||
|
@ -41,7 +41,6 @@
|
||||
"yourself": "Sen",
|
||||
"archived-at": "Arşivlendi"
|
||||
},
|
||||
"slogan": "Açık kaynaklı bir not ve sosyalleşme platformu olan self-hosted.",
|
||||
"auth": {
|
||||
"signup-as-host": "Sahip olarak kaydolun",
|
||||
"host-tip": "Site sahibi olarak kaydoluyorsunuz.",
|
||||
@ -53,10 +52,7 @@
|
||||
"setting": "Ayarlar",
|
||||
"archived": "Arşivlenmiş"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Oops, burada hiçbir şey yok."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Memos'taki statik kaynaklarınızı (fotoğraflar) görüntüleyin",
|
||||
"no-resources": "Kaynak yok.",
|
||||
"fetching-data": "veriler yükleniyor...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"database": "Database",
|
||||
"avatar": "Avatar"
|
||||
},
|
||||
"slogan": "Self-hosted платформа для записок та соціалізації з відкритим кодом An open-source.",
|
||||
"auth": {
|
||||
"signup-as-host": "Зареєструватися як власник",
|
||||
"host-tip": "Ви реєструєте власника сайту.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Налаштування",
|
||||
"archived": "Заархівовані"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ой, тут нічого немає."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Переглянути ваші статичні ресурси в Memos (світлини)",
|
||||
"no-resources": "Немає ресурсів.",
|
||||
"fetching-data": "завантаження даних...",
|
||||
|
@ -51,7 +51,6 @@
|
||||
"avatar": "Avatar",
|
||||
"database": "Database"
|
||||
},
|
||||
"slogan": "Mã nguồn mở ghi chú cho phép quản lý tri thức và chia sẻ cộng đồng.",
|
||||
"auth": {
|
||||
"signup-as-host": "Đăng ký như chủ nhân",
|
||||
"host-tip": "Bạn đang đăng ký với tư cách chủ nhân của trang web này.",
|
||||
@ -63,10 +62,7 @@
|
||||
"setting": "Cài Đặt",
|
||||
"archived": "Lưu Trữ"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "Ồ, chẳng có gì ở đây cả."
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "Xem toàn bộ tài nguyên của trang web. Ví dụ như các hình ảnh.",
|
||||
"no-resources": "Không có tài nguyên.",
|
||||
"fetching-data": "đang tải dữ liệu...",
|
||||
|
@ -54,16 +54,12 @@
|
||||
"database": "資料庫",
|
||||
"avatar": "頭像"
|
||||
},
|
||||
"slogan": "一個可用於知識管理和社交網絡的開源、自托管的備忘錄中心。",
|
||||
"auth": {
|
||||
"signup-as-host": "註冊為管理員",
|
||||
"host-tip": "你正在註冊為管理員帳號。",
|
||||
"not-host-tip": "如果你沒有帳號,請聯絡網站管理員。"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "啊哦,空空蕩蕩。"
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "查看在 Memo 中的靜態資源。例如:圖片",
|
||||
"no-resources": "沒有資源",
|
||||
"fetching-data": "擷取資料中...",
|
||||
|
@ -54,16 +54,12 @@
|
||||
"database": "数据库",
|
||||
"avatar": "头像"
|
||||
},
|
||||
"slogan": "一个可用于知识管理和社交网络的开源、自托管的备忘录中心。",
|
||||
"auth": {
|
||||
"signup-as-host": "注册为 Host",
|
||||
"host-tip": "你正在注册为 Host 用户账号。",
|
||||
"not-host-tip": "如果你没有账号,请联系站点 Host"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "啊哦,空空荡荡。"
|
||||
},
|
||||
"resources": {
|
||||
"resource": {
|
||||
"description": "查看在 Memo 中的静态资源。例如:图片",
|
||||
"no-resources": "没有资源",
|
||||
"fetching-data": "请求数据中...",
|
||||
|
@ -4,6 +4,7 @@ import { toast } from "react-hot-toast";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { useGlobalStore, useUserStore } from "@/store/module";
|
||||
import * as api from "@/helpers/api";
|
||||
import { slogan } from "@/helpers/site";
|
||||
import { absolutifyLink } from "@/helpers/utils";
|
||||
import useLoading from "@/hooks/useLoading";
|
||||
import Icon from "@/components/Icon";
|
||||
@ -132,7 +133,7 @@ const Auth = () => {
|
||||
<img className="h-12 w-auto rounded-lg mr-1" src={systemStatus.customizedProfile.logoUrl} alt="" />
|
||||
<p className="text-6xl tracking-wide text-black opacity-80 dark:text-gray-200">{systemStatus.customizedProfile.name}</p>
|
||||
</div>
|
||||
<p className="text-sm text-gray-700 dark:text-gray-300">{systemStatus.customizedProfile.description || t("slogan")}</p>
|
||||
<p className="text-sm text-gray-700 dark:text-gray-300">{systemStatus.customizedProfile.description || slogan}</p>
|
||||
</div>
|
||||
<form className="w-full" onSubmit={handleFormSubmit}>
|
||||
<div className={`flex flex-col justify-start items-start w-full ${actionBtnLoadingState.isLoading && "opacity-80"}`}>
|
||||
|
@ -90,7 +90,7 @@ const DailyReview = () => {
|
||||
className="px-2 py-1 flex flex-row justify-start items-center cursor-pointer select-none rounded hover:bg-gray-100 dark:hover:bg-zinc-700"
|
||||
onClick={() => toggleShowDatePicker()}
|
||||
>
|
||||
<Icon.Calendar className="w-5 h-auto mr-1" /> {t("common.daily-review")}
|
||||
<Icon.Calendar className="w-5 h-auto mr-1" /> {t("daily-review.title")}
|
||||
</p>
|
||||
<div className="flex flex-row justify-end items-center">
|
||||
<button
|
||||
@ -138,7 +138,7 @@ const DailyReview = () => {
|
||||
</div>
|
||||
{dailyMemos.length === 0 ? (
|
||||
<div className="mx-auto pt-4 pb-5 px-0">
|
||||
<p className="italic text-gray-400">{t("daily-review.oops-nothing")}</p>
|
||||
<p className="italic text-gray-400">Oops, there is nothing.</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex flex-col justify-start items-start w-full mt-2">
|
||||
|
@ -98,7 +98,7 @@ const Explore = () => {
|
||||
) : null
|
||||
) : (
|
||||
<p className="m-auto text-center mt-4 italic cursor-pointer text-gray-500 hover:text-green-600" onClick={handleFetchMoreClick}>
|
||||
{t("memo-list.fetch-more")}
|
||||
{t("memo.fetch-more")}
|
||||
</p>
|
||||
)}
|
||||
</main>
|
||||
|
@ -61,7 +61,7 @@ const MemoDetail = () => {
|
||||
<>
|
||||
{user ? (
|
||||
<Link to="/" className="btn">
|
||||
<span className="icon">🏠</span> {t("common.back-to-home")}
|
||||
<span className="icon">🏠</span> {t("router.back-to-home")}
|
||||
</Link>
|
||||
) : (
|
||||
<Link to="/auth" className="btn">
|
||||
|
@ -11,7 +11,7 @@ const NotFound = () => {
|
||||
<p className="title-text">{t("message.page-not-found")}</p>
|
||||
<div className="action-button-container">
|
||||
<Link to="/" className="link-btn">
|
||||
<span>🏠</span> {t("common.back-to-home")}
|
||||
<span>🏠</span> {t("router.back-to-home")}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -54,7 +54,7 @@ const ResourcesDashboard = () => {
|
||||
};
|
||||
|
||||
const handleDeleteUnusedResourcesBtnClick = async () => {
|
||||
let warningText = t("resources.warning-text-unused");
|
||||
let warningText = t("resource.warning-text-unused");
|
||||
const allResources = await fetchAllResources();
|
||||
const unusedResources = allResources.filter((resource) => {
|
||||
if (resource.linkedMemoAmount === 0) {
|
||||
@ -64,12 +64,12 @@ const ResourcesDashboard = () => {
|
||||
return false;
|
||||
});
|
||||
if (unusedResources.length === 0) {
|
||||
toast.success(t("resources.no-unused-resources"));
|
||||
toast.success(t("resource.no-unused-resources"));
|
||||
return;
|
||||
}
|
||||
|
||||
showCommonDialog({
|
||||
title: t("resources.delete-resource"),
|
||||
title: t("resource.delete-resource"),
|
||||
content: warningText,
|
||||
style: "warning",
|
||||
dialogName: "delete-unused-resources",
|
||||
@ -83,11 +83,11 @@ const ResourcesDashboard = () => {
|
||||
|
||||
const handleDeleteSelectedBtnClick = () => {
|
||||
if (selectedList.length == 0) {
|
||||
toast.error(t("resources.no-files-selected"));
|
||||
toast.error(t("resource.no-files-selected"));
|
||||
} else {
|
||||
const warningText = t("resources.warning-text");
|
||||
const warningText = t("resource.warning-text");
|
||||
showCommonDialog({
|
||||
title: t("resources.delete-resource"),
|
||||
title: t("resource.delete-resource"),
|
||||
content: warningText,
|
||||
style: "warning",
|
||||
dialogName: "delete-resource-dialog",
|
||||
@ -182,7 +182,7 @@ const ResourcesDashboard = () => {
|
||||
await resourceStore.createResourcesWithBlob(e.dataTransfer.files).then(
|
||||
(res) => {
|
||||
for (const resource of res) {
|
||||
toast.success(`${resource.filename} ${t("resources.upload-successfully")}`);
|
||||
toast.success(`${resource.filename} ${t("resource.upload-successfully")}`);
|
||||
}
|
||||
},
|
||||
(reason) => {
|
||||
@ -205,7 +205,7 @@ const ResourcesDashboard = () => {
|
||||
onDrop={handleDrop}
|
||||
>
|
||||
<div className="flex h-full w-full">
|
||||
<p className="m-auto text-2xl text-white dark:text-black">{t("resources.file-drag-drop-prompt")}</p>
|
||||
<p className="m-auto text-2xl text-white dark:text-black">{t("resource.file-drag-drop-prompt")}</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@ -242,7 +242,7 @@ const ResourcesDashboard = () => {
|
||||
onClick={handleDeleteUnusedResourcesBtnClick}
|
||||
>
|
||||
<Icon.Trash2 className="w-4 h-auto mr-2" />
|
||||
{t("resources.clear")}
|
||||
{t("common.clear")}
|
||||
</button>
|
||||
</>
|
||||
}
|
||||
@ -269,7 +269,7 @@ const ResourcesDashboard = () => {
|
||||
<div className="w-full flex flex-col justify-start items-start mt-4 mb-6">
|
||||
{loadingState.isLoading ? (
|
||||
<div className="w-full h-32 flex flex-col justify-center items-center">
|
||||
<p className="w-full text-center text-base my-6 mt-8">{t("resources.fetching-data")}</p>
|
||||
<p className="w-full text-center text-base my-6 mt-8">{t("resource.fetching-data")}</p>
|
||||
</div>
|
||||
) : (
|
||||
<div
|
||||
@ -283,12 +283,12 @@ const ResourcesDashboard = () => {
|
||||
<div className="px-2 py-2 w-full grid grid-cols-10 border-b dark:border-b-zinc-600">
|
||||
<span></span>
|
||||
<span className="col-span-2">ID</span>
|
||||
<span className="col-span-6">{t("resources.name")}</span>
|
||||
<span className="col-span-6">{t("common.name")}</span>
|
||||
<span></span>
|
||||
</div>
|
||||
)}
|
||||
{resourceList.length === 0 ? (
|
||||
<p className="w-full text-center text-base my-6 mt-8">{t("resources.no-resources")}</p>
|
||||
<p className="w-full text-center text-base my-6 mt-8">{t("resource.no-resources")}</p>
|
||||
) : (
|
||||
resourceList
|
||||
)}
|
||||
@ -299,7 +299,7 @@ const ResourcesDashboard = () => {
|
||||
<p className="text-sm text-gray-400 italic">
|
||||
{!isComplete && (
|
||||
<span className="cursor-pointer my-6 hover:text-green-600" onClick={handleFetchMoreResourceBtnClick}>
|
||||
{t("memo-list.fetch-more")}
|
||||
{t("memo.fetch-more")}
|
||||
</span>
|
||||
)}
|
||||
</p>
|
||||
|
Reference in New Issue
Block a user