mirror of https://github.com/usememos/memos
feat: update home layout (#1242)
parent
9d4bb5b3af
commit
6ab58f294e
@ -0,0 +1,92 @@
|
||||
import { isUndefined } from "lodash-es";
|
||||
import { useEffect } from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { useLocationStore, useUserStore } from "../store/module";
|
||||
import Icon from "./Icon";
|
||||
import showDailyReviewDialog from "./DailyReviewDialog";
|
||||
import showResourcesDialog from "./ResourcesDialog";
|
||||
import showSettingDialog from "./SettingDialog";
|
||||
import UserBanner from "./UserBanner";
|
||||
import "../less/header.less";
|
||||
|
||||
const Header = () => {
|
||||
const { t } = useTranslation();
|
||||
const userStore = useUserStore();
|
||||
const locationStore = useLocationStore();
|
||||
const query = locationStore.state.query;
|
||||
|
||||
useEffect(() => {
|
||||
toggleHeader(false);
|
||||
}, [query]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="mask" onClick={() => toggleHeader(false)}></div>
|
||||
<header className="header-wrapper">
|
||||
<UserBanner />
|
||||
<div className="w-full px-2 my-2 mt-4 flex flex-col justify-start items-start shrink-0 space-y-2">
|
||||
<Link
|
||||
to="/"
|
||||
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"
|
||||
>
|
||||
<Icon.Home className="mr-4 w-6 h-auto opacity-80" /> {t("common.home")}
|
||||
</Link>
|
||||
<button
|
||||
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={() => showDailyReviewDialog()}
|
||||
>
|
||||
<Icon.Calendar className="mr-4 w-6 h-auto opacity-80" /> {t("common.daily-review")}
|
||||
</button>
|
||||
<Link
|
||||
to="/explore"
|
||||
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"
|
||||
>
|
||||
<Icon.Hash className="mr-4 w-6 h-auto opacity-80" /> {t("common.explore")}
|
||||
</Link>
|
||||
{!userStore.isVisitorMode() && (
|
||||
<>
|
||||
<button
|
||||
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={() => showResourcesDialog()}
|
||||
>
|
||||
<Icon.Paperclip className="mr-4 w-6 h-auto opacity-80" /> {t("common.resources")}
|
||||
</button>
|
||||
<button
|
||||
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={() => showDailyReviewDialog()}
|
||||
>
|
||||
<Icon.Archive className="mr-4 w-6 h-auto opacity-80" /> {t("common.archive")}
|
||||
</button>
|
||||
<button
|
||||
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={() => showSettingDialog()}
|
||||
>
|
||||
<Icon.Settings className="mr-4 w-6 h-auto opacity-80" /> {t("common.settings")}
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</header>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export const toggleHeader = (show?: boolean) => {
|
||||
const headerEl = document.body.querySelector(".header-wrapper") as HTMLDivElement;
|
||||
const maskEl = headerEl.previousSibling as HTMLDivElement;
|
||||
|
||||
if (isUndefined(show)) {
|
||||
show = !headerEl.classList.contains("show");
|
||||
}
|
||||
|
||||
if (show) {
|
||||
headerEl.classList.add("show");
|
||||
maskEl.classList.add("show");
|
||||
} else {
|
||||
headerEl.classList.remove("show");
|
||||
maskEl.classList.remove("show");
|
||||
}
|
||||
};
|
||||
|
||||
export default Header;
|
@ -0,0 +1,48 @@
|
||||
import { isUndefined } from "lodash-es";
|
||||
import { useEffect } from "react";
|
||||
import { useLocationStore } from "../store/module";
|
||||
import ShortcutList from "./ShortcutList";
|
||||
import TagList from "./TagList";
|
||||
import SearchBar from "./SearchBar";
|
||||
import "../less/home-sidebar.less";
|
||||
|
||||
const HomeSidebar = () => {
|
||||
const locationStore = useLocationStore();
|
||||
const query = locationStore.state.query;
|
||||
|
||||
useEffect(() => {
|
||||
toggleHomeSidebar(false);
|
||||
}, [query]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="mask" onClick={() => toggleHomeSidebar(false)}></div>
|
||||
<aside className="sidebar-wrapper">
|
||||
<div className="pl-6 pr-2 mb-4 w-full">
|
||||
<SearchBar />
|
||||
</div>
|
||||
<ShortcutList />
|
||||
<TagList />
|
||||
</aside>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export const toggleHomeSidebar = (show?: boolean) => {
|
||||
const sidebarEl = document.body.querySelector(".sidebar-wrapper") as HTMLDivElement;
|
||||
const maskEl = sidebarEl.previousSibling as HTMLDivElement;
|
||||
|
||||
if (isUndefined(show)) {
|
||||
show = !sidebarEl.classList.contains("show");
|
||||
}
|
||||
|
||||
if (show) {
|
||||
sidebarEl.classList.add("show");
|
||||
maskEl.classList.add("show");
|
||||
} else {
|
||||
sidebarEl.classList.remove("show");
|
||||
maskEl.classList.remove("show");
|
||||
}
|
||||
};
|
||||
|
||||
export default HomeSidebar;
|
@ -1,62 +0,0 @@
|
||||
import { useCallback, useEffect, useState } from "react";
|
||||
import { useLocationStore, useMemoStore, useShortcutStore, useUserStore } from "../store/module";
|
||||
import Icon from "./Icon";
|
||||
import SearchBar from "./SearchBar";
|
||||
import { toggleSidebar } from "./Sidebar";
|
||||
import "../less/memos-header.less";
|
||||
|
||||
let prevRequestTimestamp = Date.now();
|
||||
|
||||
const MemosHeader = () => {
|
||||
const locationStore = useLocationStore();
|
||||
const memoStore = useMemoStore();
|
||||
const shortcutStore = useShortcutStore();
|
||||
const userStore = useUserStore();
|
||||
const user = userStore.state.user;
|
||||
const query = locationStore.state.query;
|
||||
const shortcuts = shortcutStore.state.shortcuts;
|
||||
const [titleText, setTitleText] = useState("MEMOS");
|
||||
|
||||
useEffect(() => {
|
||||
if (!query?.shortcutId) {
|
||||
setTitleText("MEMOS");
|
||||
return;
|
||||
}
|
||||
|
||||
const shortcut = shortcutStore.getShortcutById(query?.shortcutId);
|
||||
if (shortcut) {
|
||||
setTitleText(shortcut.title);
|
||||
}
|
||||
}, [query, shortcuts]);
|
||||
|
||||
const handleTitleTextClick = useCallback(() => {
|
||||
const now = Date.now();
|
||||
if (now - prevRequestTimestamp > 1 * 1000) {
|
||||
prevRequestTimestamp = now;
|
||||
memoStore.fetchMemos().catch(() => {
|
||||
// do nth
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="memos-header-container">
|
||||
<div className="title-container">
|
||||
<div className="action-btn" onClick={() => toggleSidebar(true)}>
|
||||
<Icon.Menu className="icon-img" />
|
||||
</div>
|
||||
<span className="title-text" onClick={handleTitleTextClick}>
|
||||
{titleText}
|
||||
</span>
|
||||
{user && (
|
||||
<a className="dark:text-white" href={"/u/" + user.id + "/rss.xml"} target="_blank" rel="noreferrer">
|
||||
<Icon.Rss className="w-4 h-auto opacity-40 hover:opacity-60" />
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
<SearchBar />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default MemosHeader;
|
@ -0,0 +1,62 @@
|
||||
import { useCallback, useEffect, useState } from "react";
|
||||
import { useLocationStore, useMemoStore, useShortcutStore } from "../store/module";
|
||||
import Icon from "./Icon";
|
||||
import { toggleHeader } from "./Header";
|
||||
import { toggleHomeSidebar } from "./HomeSidebar";
|
||||
|
||||
let prevRequestTimestamp = Date.now();
|
||||
|
||||
const MobileHeader = () => {
|
||||
const locationStore = useLocationStore();
|
||||
const memoStore = useMemoStore();
|
||||
const shortcutStore = useShortcutStore();
|
||||
const query = locationStore.state.query;
|
||||
const shortcuts = shortcutStore.state.shortcuts;
|
||||
const [titleText, setTitleText] = useState("MEMOS");
|
||||
|
||||
useEffect(() => {
|
||||
if (!query?.shortcutId) {
|
||||
setTitleText("MEMOS");
|
||||
return;
|
||||
}
|
||||
|
||||
const shortcut = shortcutStore.getShortcutById(query?.shortcutId);
|
||||
if (shortcut) {
|
||||
setTitleText(shortcut.title);
|
||||
}
|
||||
}, [query, shortcuts]);
|
||||
|
||||
const handleTitleTextClick = useCallback(() => {
|
||||
const now = Date.now();
|
||||
if (now - prevRequestTimestamp > 1 * 1000) {
|
||||
prevRequestTimestamp = now;
|
||||
memoStore.fetchMemos().catch(() => {
|
||||
// do nth
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="sticky top-0 pt-4 pb-1 mb-1 backdrop-blur-sm flex sm:hidden flex-row justify-between items-center w-full h-auto flex-nowrap shrink-0 z-10">
|
||||
<div className="flex flex-row justify-start items-center mr-2 shrink-0 overflow-hidden">
|
||||
<div
|
||||
className="flex sm:hidden flex-row justify-center items-center w-6 h-6 mr-1 shrink-0 bg-transparent"
|
||||
onClick={() => toggleHeader(true)}
|
||||
>
|
||||
<Icon.Menu className="w-5 h-auto dark:text-gray-200" />
|
||||
</div>
|
||||
<span
|
||||
className="font-bold text-lg leading-10 mr-1 text-ellipsis shrink-0 cursor-pointer overflow-hidden text-gray-700 dark:text-gray-200"
|
||||
onClick={handleTitleTextClick}
|
||||
>
|
||||
{titleText}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex flex-row justify-end items-center pr-1">
|
||||
<Icon.Search className="w-5 h-auto dark:text-gray-200" onClick={() => toggleHomeSidebar(true)} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default MobileHeader;
|
@ -1,53 +0,0 @@
|
||||
.page-wrapper.explore {
|
||||
@apply w-full h-full overflow-y-auto overflow-x-hidden bg-zinc-100 dark:bg-zinc-800;
|
||||
|
||||
> .page-container {
|
||||
@apply relative w-full min-h-full mx-auto flex flex-col justify-start items-center pb-8;
|
||||
|
||||
> .page-header {
|
||||
@apply sticky top-0 z-10 max-w-2xl w-full h-auto flex flex-row justify-between backdrop-blur-sm items-center px-4 sm:pr-6 pt-6 mb-2 ml-calc;
|
||||
|
||||
> .title-container {
|
||||
@apply flex flex-row justify-start items-center;
|
||||
|
||||
> .logo-img {
|
||||
@apply h-12 w-auto rounded-md mr-2;
|
||||
}
|
||||
|
||||
> .title-text {
|
||||
@apply text-xl sm:text-4xl text-gray-700 dark:text-gray-200;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> .memos-wrapper {
|
||||
@apply relative flex-grow max-w-2xl w-full h-auto flex flex-col justify-start items-start px-4 sm:pr-6 ml-calc;
|
||||
|
||||
> .memo-container {
|
||||
@apply relative flex flex-col justify-start items-start w-full p-4 mt-2 bg-white dark:bg-zinc-700 rounded-lg border border-white dark:border-zinc-800 hover:border-gray-200 dark:hover:border-zinc-600;
|
||||
|
||||
&.pinned {
|
||||
@apply border-gray-200 border-2 dark:border-zinc-600;
|
||||
}
|
||||
|
||||
> .corner-container {
|
||||
@apply absolute top-0 right-0 z-1;
|
||||
|
||||
&::after {
|
||||
@apply rounded-tr-md absolute top-0 right-0 border-transparent border-t-green-600 border-r-green-600;
|
||||
content: "";
|
||||
border-width: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
> .memo-header {
|
||||
@apply mb-2 w-full flex flex-row justify-start items-center text-sm text-gray-400;
|
||||
|
||||
> .name-text {
|
||||
@apply ml-2 hover:text-green-600 hover:underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
.sidebar-wrapper {
|
||||
@apply fixed sm:sticky top-0 z-30 sm:z-0 -translate-x-64 sm:translate-x-0 sm:flex flex-col justify-start items-start w-64 h-auto max-h-screen py-4 pl-2 bg-white dark:bg-zinc-800 sm:bg-transparent overflow-x-hidden overflow-y-auto transition-transform duration-300 overscroll-contain hide-scrollbar;
|
||||
.header-wrapper {
|
||||
@apply fixed sm:sticky top-0 z-30 sm:z-0 -translate-x-64 sm:translate-x-0 sm:flex flex-col justify-start items-start w-56 h-full py-4 pl-2 bg-white dark:bg-zinc-800 sm:bg-transparent overflow-x-hidden overflow-y-auto transition-transform duration-300 overscroll-contain hide-scrollbar;
|
||||
|
||||
&.show {
|
||||
@apply translate-x-0 shadow-2xl sm:shadow-none;
|
@ -0,0 +1,15 @@
|
||||
.sidebar-wrapper {
|
||||
@apply flex-shrink-0 fixed sm:sticky top-0 z-30 sm:z-0 translate-x-56 sm:translate-x-0 hidden md:flex flex-col justify-start items-start w-56 h-full py-4 bg-white dark:bg-zinc-800 sm:bg-transparent overflow-x-hidden overflow-y-auto transition-transform duration-300 overscroll-contain hide-scrollbar;
|
||||
|
||||
&.show {
|
||||
@apply flex translate-x-0 right-0 shadow-2xl sm:shadow-none;
|
||||
}
|
||||
}
|
||||
|
||||
.mask {
|
||||
@apply fixed top-0 left-0 w-full h-full bg-black opacity-0 transition-opacity duration-300 pointer-events-none z-20 sm:hidden;
|
||||
|
||||
&.show {
|
||||
@apply opacity-60 pointer-events-auto;
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
.memos-header-container {
|
||||
@apply sticky top-0 pt-4 pb-1 mb-1 backdrop-blur-sm flex flex-row justify-between items-center w-full h-auto flex-nowrap shrink-0 z-10;
|
||||
|
||||
> .title-container {
|
||||
@apply flex flex-row justify-start items-center mr-2 shrink-0 overflow-hidden;
|
||||
|
||||
> .action-btn {
|
||||
@apply flex sm:hidden flex-row justify-center items-center w-6 h-6 mr-1 shrink-0 bg-transparent;
|
||||
|
||||
> .icon-img {
|
||||
@apply w-5 h-auto dark:text-gray-200;
|
||||
}
|
||||
}
|
||||
|
||||
> .title-text {
|
||||
@apply font-bold text-lg leading-10 mr-1 text-ellipsis shrink-0 cursor-pointer overflow-hidden text-gray-700 dark:text-gray-200;
|
||||
}
|
||||
}
|
||||
|
||||
> .btns-container {
|
||||
@apply flex flex-row justify-end items-center;
|
||||
}
|
||||
}
|
@ -1,271 +1,267 @@
|
||||
{
|
||||
"common": {
|
||||
"about": "关于",
|
||||
"email": "邮箱",
|
||||
"password": "密码",
|
||||
"repeat-password-short": "重复密码",
|
||||
"repeat-password": "重复密码",
|
||||
"new-password": "新密码",
|
||||
"repeat-new-password": "重复新密码",
|
||||
"username": "用户名",
|
||||
"nickname": "昵称",
|
||||
"save": "保存",
|
||||
"close": "关闭",
|
||||
"cancel": "退出",
|
||||
"create": "创建",
|
||||
"change": "修改",
|
||||
"confirm": "确定",
|
||||
"reset": "重置",
|
||||
"language": "语言",
|
||||
"version": "版本",
|
||||
"pin": "置顶",
|
||||
"unpin": "取消置顶",
|
||||
"edit": "编辑",
|
||||
"restore": "恢复",
|
||||
"delete": "删除",
|
||||
"null": "空",
|
||||
"share": "分享",
|
||||
"archive": "归档",
|
||||
"basic": "基础",
|
||||
"admin": "管理员",
|
||||
"explore": "探索",
|
||||
"sign-in": "登录",
|
||||
"sign-up": "注册",
|
||||
"sign-out": "退出登录",
|
||||
"back-to-home": "回到主页",
|
||||
"type": "类型",
|
||||
"shortcuts": "捷径",
|
||||
"title": "标题",
|
||||
"filter": "过滤器",
|
||||
"tags": "全部标签",
|
||||
"yourself": "你自己",
|
||||
"archived-at": "归档于",
|
||||
"changed": "已更改",
|
||||
"update-on": "更新于",
|
||||
"fold": "折叠",
|
||||
"expand": "展开",
|
||||
"image": "图片",
|
||||
"link": "链接",
|
||||
"vacuum": "清理",
|
||||
"select": "选择",
|
||||
"database": "数据库",
|
||||
"avatar": "头像"
|
||||
},
|
||||
"slogan": "一个可用于知识管理和社交网络的开源、自托管的备忘录中心。",
|
||||
"auth": {
|
||||
"signup-as-host": "注册为 Host",
|
||||
"host-tip": "你正在注册为 Host 用户账号。",
|
||||
"not-host-tip": "如果你没有账号,请联系站点 Host"
|
||||
},
|
||||
"sidebar": {
|
||||
"daily-review": "每日回顾",
|
||||
"resources": "资源库",
|
||||
"setting": "设置",
|
||||
"archived": "已归档"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "啊哦,空空荡荡。"
|
||||
},
|
||||
"resources": {
|
||||
"description": "查看在 Memo 中的静态资源。例如:图片",
|
||||
"no-resources": "没有资源",
|
||||
"fetching-data": "请求数据中...",
|
||||
"upload": "上传",
|
||||
"preview": "预览",
|
||||
"copy-link": "拷贝链接",
|
||||
"delete-resource": "删除资源",
|
||||
"warning-text": "确定删除这个资源么?此操作不可逆❗",
|
||||
"linked-amount": "链接的 Memo 数量",
|
||||
"rename": "重命名",
|
||||
"clear": "清除",
|
||||
"warning-text-unused": "确定删除这些无用资源么?此操作不可逆❗",
|
||||
"no-unused-resources": "无可删除的资源",
|
||||
"name": "资源名称"
|
||||
},
|
||||
"archived": {
|
||||
"archived-memos": "已归档的 Memo",
|
||||
"no-archived-memos": "没有归档的 Memo",
|
||||
"fetching-data": "请求数据中..."
|
||||
},
|
||||
"editor": {
|
||||
"editing": "编辑中...",
|
||||
"cancel-edit": "退出编辑",
|
||||
"save": "记下",
|
||||
"placeholder": "现在的想法是...",
|
||||
"only-image-supported": "仅支持图片文件。",
|
||||
"cant-empty": "内容不能为空",
|
||||
"local": "本地上传",
|
||||
"resources": "资源库"
|
||||
},
|
||||
"memo": {
|
||||
"view-detail": "查看详情",
|
||||
"copy": "复制",
|
||||
"visibility": {
|
||||
"private": "仅自己可见",
|
||||
"protected": "登录用户可见",
|
||||
"public": "所有人可见",
|
||||
"disabled": "公共memos已禁用"
|
||||
}
|
||||
"common": {
|
||||
"about": "关于",
|
||||
"home": "主页",
|
||||
"resources": "资源库",
|
||||
"settings": "设置",
|
||||
"daily-review": "每日回顾",
|
||||
"email": "邮箱",
|
||||
"password": "密码",
|
||||
"username": "用户名",
|
||||
"nickname": "昵称",
|
||||
"new-password": "新密码",
|
||||
"repeat-new-password": "重复新密码",
|
||||
"save": "保存",
|
||||
"close": "关闭",
|
||||
"cancel": "退出",
|
||||
"create": "创建",
|
||||
"change": "修改",
|
||||
"confirm": "确定",
|
||||
"reset": "重置",
|
||||
"language": "语言",
|
||||
"version": "版本",
|
||||
"pin": "置顶",
|
||||
"unpin": "取消置顶",
|
||||
"edit": "编辑",
|
||||
"restore": "恢复",
|
||||
"delete": "删除",
|
||||
"null": "空",
|
||||
"share": "分享",
|
||||
"archive": "归档",
|
||||
"basic": "基础",
|
||||
"admin": "管理员",
|
||||
"explore": "探索",
|
||||
"sign-in": "登录",
|
||||
"sign-up": "注册",
|
||||
"sign-out": "退出登录",
|
||||
"back-to-home": "回到主页",
|
||||
"type": "类型",
|
||||
"shortcuts": "捷径",
|
||||
"title": "标题",
|
||||
"filter": "过滤器",
|
||||
"tags": "全部标签",
|
||||
"yourself": "你自己",
|
||||
"archived-at": "归档于",
|
||||
"changed": "已更改",
|
||||
"update-on": "更新于",
|
||||
"fold": "折叠",
|
||||
"expand": "展开",
|
||||
"image": "图片",
|
||||
"link": "链接",
|
||||
"vacuum": "清理",
|
||||
"select": "选择",
|
||||
"database": "数据库",
|
||||
"avatar": "头像"
|
||||
},
|
||||
"slogan": "一个可用于知识管理和社交网络的开源、自托管的备忘录中心。",
|
||||
"auth": {
|
||||
"signup-as-host": "注册为 Host",
|
||||
"host-tip": "你正在注册为 Host 用户账号。",
|
||||
"not-host-tip": "如果你没有账号,请联系站点 Host"
|
||||
},
|
||||
"daily-review": {
|
||||
"oops-nothing": "啊哦,空空荡荡。"
|
||||
},
|
||||
"resources": {
|
||||
"description": "查看在 Memo 中的静态资源。例如:图片",
|
||||
"no-resources": "没有资源",
|
||||
"fetching-data": "请求数据中...",
|
||||
"upload": "上传",
|
||||
"preview": "预览",
|
||||
"copy-link": "拷贝链接",
|
||||
"delete-resource": "删除资源",
|
||||
"warning-text": "确定删除这个资源么?此操作不可逆❗",
|
||||
"linked-amount": "链接的 Memo 数量",
|
||||
"rename": "重命名",
|
||||
"clear": "清除",
|
||||
"warning-text-unused": "确定删除这些无用资源么?此操作不可逆❗",
|
||||
"no-unused-resources": "无可删除的资源",
|
||||
"name": "资源名称"
|
||||
},
|
||||
"archived": {
|
||||
"archived-memos": "已归档的 Memo",
|
||||
"no-archived-memos": "没有归档的 Memo",
|
||||
"fetching-data": "请求数据中..."
|
||||
},
|
||||
"editor": {
|
||||
"editing": "编辑中...",
|
||||
"cancel-edit": "退出编辑",
|
||||
"save": "记下",
|
||||
"placeholder": "现在的想法是...",
|
||||
"only-image-supported": "仅支持图片文件。",
|
||||
"cant-empty": "内容不能为空",
|
||||
"local": "本地上传",
|
||||
"resources": "资源库"
|
||||
},
|
||||
"memo": {
|
||||
"view-detail": "查看详情",
|
||||
"copy": "复制",
|
||||
"visibility": {
|
||||
"private": "仅自己可见",
|
||||
"protected": "登录用户可见",
|
||||
"public": "所有人可见",
|
||||
"disabled": "公共memos已禁用"
|
||||
}
|
||||
},
|
||||
"memo-list": {
|
||||
"fetching-data": "请求数据中...",
|
||||
"fetch-more": "点击加载更多"
|
||||
},
|
||||
"shortcut-list": {
|
||||
"shortcut-title": "捷径标题",
|
||||
"create-shortcut": "创建捷径",
|
||||
"edit-shortcut": "编辑捷径",
|
||||
"eligible-memo": "符合条件的 Memo",
|
||||
"fill-previous": "请填写之前的过滤值",
|
||||
"title-required": "标题是必填项",
|
||||
"value-required": "过滤值是必填项"
|
||||
},
|
||||
"filter": {
|
||||
"new-filter": "新建过滤器",
|
||||
"type": {
|
||||
"tag": "标签",
|
||||
"type": "类型",
|
||||
"text": "文本",
|
||||
"display-time": "显示时间",
|
||||
"visibility": "可见性"
|
||||
},
|
||||
"memo-list": {
|
||||
"fetching-data": "请求数据中...",
|
||||
"fetch-more": "点击加载更多"
|
||||
"operator": {
|
||||
"contains": "包含",
|
||||
"not-contains": "不包含",
|
||||
"is": "是",
|
||||
"is-not": "不是",
|
||||
"before": "早于",
|
||||
"after": "晚于"
|
||||
},
|
||||
"shortcut-list": {
|
||||
"shortcut-title": "捷径标题",
|
||||
"create-shortcut": "创建捷径",
|
||||
"edit-shortcut": "编辑捷径",
|
||||
"eligible-memo": "符合条件的 Memo",
|
||||
"fill-previous": "请填写之前的过滤值",
|
||||
"title-required": "标题是必填项",
|
||||
"value-required": "过滤值是必填项"
|
||||
"value": {
|
||||
"not-tagged": "无标签",
|
||||
"linked": "包含链接"
|
||||
},
|
||||
"filter": {
|
||||
"new-filter": "新建过滤器",
|
||||
"type": {
|
||||
"tag": "标签",
|
||||
"type": "类型",
|
||||
"text": "文本",
|
||||
"display-time": "显示时间",
|
||||
"visibility": "可见性"
|
||||
},
|
||||
"operator": {
|
||||
"contains": "包含",
|
||||
"not-contains": "不包含",
|
||||
"is": "是",
|
||||
"is-not": "不是",
|
||||
"before": "早于",
|
||||
"after": "晚于"
|
||||
},
|
||||
"value": {
|
||||
"not-tagged": "无标签",
|
||||
"linked": "包含链接"
|
||||
},
|
||||
"text-placeholder": "以 ^ 开头使用正则表达式"
|
||||
"text-placeholder": "以 ^ 开头使用正则表达式"
|
||||
},
|
||||
"tag-list": {
|
||||
"tip-text": "输入`#tag `来创建标签"
|
||||
},
|
||||
"search": {
|
||||
"quickly-filter": "快速过滤"
|
||||
},
|
||||
"setting": {
|
||||
"my-account": "我的账号",
|
||||
"preference": "偏好设置",
|
||||
"storage": "存储设置",
|
||||
"member": "成员",
|
||||
"member-list": "成员列表",
|
||||
"system": "系统",
|
||||
"account-section": {
|
||||
"title": "账号信息",
|
||||
"update-information": "更新个人信息",
|
||||
"change-password": "修改密码"
|
||||
},
|
||||
"tag-list": {
|
||||
"tip-text": "输入`#tag `来创建标签"
|
||||
"preference-section": {
|
||||
"theme": "主题",
|
||||
"default-memo-visibility": "默认 Memo 可见性",
|
||||
"enable-folding-memo": "开启折叠 Memo",
|
||||
"enable-double-click": "开启双击编辑",
|
||||
"editor-font-style": "编辑器字体样式",
|
||||
"mobile-editor-style": "移动端编辑器样式",
|
||||
"default-memo-sort-option": "Memo 显示时间",
|
||||
"created_ts": "创建时间",
|
||||
"updated_ts": "更新时间"
|
||||
},
|
||||
"search": {
|
||||
"quickly-filter": "快速过滤"
|
||||
"storage-section": {
|
||||
"storage-services-list": "存储服务列表",
|
||||
"create-a-service": "新建服务",
|
||||
"update-a-service": "更新服务",
|
||||
"delete-storage": "删除存储服务",
|
||||
"warning-text": "确定删除这个存储服务么?此操作不可逆❗"
|
||||
},
|
||||
"setting": {
|
||||
"my-account": "我的账号",
|
||||
"preference": "偏好设置",
|
||||
"storage": "存储设置",
|
||||
"member": "成员",
|
||||
"member-list": "成员列表",
|
||||
"system": "系统",
|
||||
"account-section": {
|
||||
"title": "账号信息",
|
||||
"update-information": "更新个人信息",
|
||||
"change-password": "修改密码"
|
||||
},
|
||||
"preference-section": {
|
||||
"theme": "主题",
|
||||
"default-memo-visibility": "默认 Memo 可见性",
|
||||
"enable-folding-memo": "开启折叠 Memo",
|
||||
"enable-double-click": "开启双击编辑",
|
||||
"editor-font-style": "编辑器字体样式",
|
||||
"mobile-editor-style": "移动端编辑器样式",
|
||||
"default-memo-sort-option": "Memo 显示时间",
|
||||
"created_ts": "创建时间",
|
||||
"updated_ts": "更新时间"
|
||||
},
|
||||
"storage-section": {
|
||||
"storage-services-list": "存储服务列表",
|
||||
"create-a-service": "新建服务",
|
||||
"update-a-service": "更新服务",
|
||||
"delete-storage": "删除存储服务",
|
||||
"warning-text": "确定删除这个存储服务么?此操作不可逆❗"
|
||||
},
|
||||
"member-section": {
|
||||
"create-a-member": "创建成员"
|
||||
},
|
||||
"system-section": {
|
||||
"server-name": "服务名称",
|
||||
"customize-server": {
|
||||
"title": "自定义服务",
|
||||
"default": "默认为 memos",
|
||||
"icon-url": "图标 URL"
|
||||
},
|
||||
"database-file-size": "数据库文件大小",
|
||||
"allow-user-signup": "允许用户注册",
|
||||
"additional-style": "自定义样式",
|
||||
"additional-script": "自定义脚本",
|
||||
"additional-style-placeholder": "自定义 CSS 代码",
|
||||
"additional-script-placeholder": "自定义 JavaScript 代码",
|
||||
"disable-public-memos": "禁用公共memos"
|
||||
},
|
||||
"apperance-option": {
|
||||
"system": "跟随系统",
|
||||
"light": "总是浅色",
|
||||
"dark": "总是深色"
|
||||
},
|
||||
"sso": "SSO"
|
||||
"member-section": {
|
||||
"create-a-member": "创建成员"
|
||||
},
|
||||
"amount-text": {
|
||||
"memo_other": "MEMOS",
|
||||
"tag_other": "TAGS",
|
||||
"day_other": "DAYS",
|
||||
"memo_one": "MEMO",
|
||||
"tag_one": "TAG",
|
||||
"day_one": "DAY"
|
||||
"system-section": {
|
||||
"server-name": "服务名称",
|
||||
"customize-server": {
|
||||
"title": "自定义服务",
|
||||
"default": "默认为 memos",
|
||||
"icon-url": "图标 URL"
|
||||
},
|
||||
"database-file-size": "数据库文件大小",
|
||||
"allow-user-signup": "允许用户注册",
|
||||
"additional-style": "自定义样式",
|
||||
"additional-script": "自定义脚本",
|
||||
"additional-style-placeholder": "自定义 CSS 代码",
|
||||
"additional-script-placeholder": "自定义 JavaScript 代码",
|
||||
"disable-public-memos": "禁用公共memos"
|
||||
},
|
||||
"message": {
|
||||
"no-memos": "没有 Memo 了 🌃",
|
||||
"memos-ready": "所有 Memo 已就绪 🎉",
|
||||
"restored-successfully": "恢复成功",
|
||||
"memo-updated-datetime": "Memo 创建日期时间已更改。",
|
||||
"invalid-created-datetime": "创建的日期时间无效。",
|
||||
"change-memo-created-time": "更改 Memo 创建时间",
|
||||
"memo-not-found": "找不到 Memo。",
|
||||
"fill-all": "请填写所有字段。",
|
||||
"password-not-match": "密码不一致。",
|
||||
"new-password-not-match": "新密码不匹配。",
|
||||
"image-load-failed": "图片加载失败",
|
||||
"fill-form": "请填写此表单",
|
||||
"login-failed": "登录失败",
|
||||
"signup-failed": "注册失败",
|
||||
"user-not-found": "未找到用户",
|
||||
"password-changed": "密码已修改",
|
||||
"private-only": "此 Memo 仅自己可见",
|
||||
"copied": "已复制",
|
||||
"succeed-copy-content": "复制内容到剪贴板成功。",
|
||||
"succeed-copy-code": "复制代码到剪贴板成功。",
|
||||
"succeed-copy-link": "复制链接到剪贴板成功。",
|
||||
"change-resource-filename": "更改资源文件名",
|
||||
"resource-filename-updated": "资源文件名更改成功。",
|
||||
"invalid-resource-filename": "无效的资源文件名",
|
||||
"click-to-save-the-image": "点击保存图片",
|
||||
"generating-the-screenshot": "正在生成图片...",
|
||||
"count-selected-resources": "所选资源总数",
|
||||
"too-short": "过短",
|
||||
"too-long": "过长",
|
||||
"not-allow-space": "不允许包含空格",
|
||||
"not-allow-chinese": "不允许包含中文",
|
||||
"succeed-update-additional-style": "更新附加样式成功",
|
||||
"succeed-copy-resource-link": "复制资源链接到剪贴板成功",
|
||||
"succeed-update-customized-profile": "更新自定义配置文件成功",
|
||||
"succeed-update-additional-script": "更新附加脚本成功",
|
||||
"update-succeed": "更新成功",
|
||||
"page-not-found": "404 - 未找到网页 😥",
|
||||
"succeed-vacuum-database": "清理数据库成功"
|
||||
"apperance-option": {
|
||||
"system": "跟随系统",
|
||||
"light": "总是浅色",
|
||||
"dark": "总是深色"
|
||||
},
|
||||
"days": {
|
||||
"monday": "星期一",
|
||||
"mon": "一",
|
||||
"tuesday": "星期二",
|
||||
"tue": "二",
|
||||
"wednesday": "星期三",
|
||||
"wed": "三",
|
||||
"thursday": "星期四",
|
||||
"thu": "四",
|
||||
"friday": "星期五",
|
||||
"fri": "五",
|
||||
"saturday": "星期六",
|
||||
"sat": "六",
|
||||
"sunday": "星期天",
|
||||
"sun": "日"
|
||||
}
|
||||
"sso": "SSO"
|
||||
},
|
||||
"amount-text": {
|
||||
"memo_other": "MEMOS",
|
||||
"tag_other": "TAGS",
|
||||
"day_other": "DAYS",
|
||||
"memo_one": "MEMO",
|
||||
"tag_one": "TAG",
|
||||
"day_one": "DAY"
|
||||
},
|
||||
"message": {
|
||||
"no-memos": "没有 Memo 了 🌃",
|
||||
"memos-ready": "所有 Memo 已就绪 🎉",
|
||||
"restored-successfully": "恢复成功",
|
||||
"memo-updated-datetime": "Memo 创建日期时间已更改。",
|
||||
"invalid-created-datetime": "创建的日期时间无效。",
|
||||
"change-memo-created-time": "更改 Memo 创建时间",
|
||||
"memo-not-found": "找不到 Memo。",
|
||||
"fill-all": "请填写所有字段。",
|
||||
"password-not-match": "密码不一致。",
|
||||
"new-password-not-match": "新密码不匹配。",
|
||||
"image-load-failed": "图片加载失败",
|
||||
"fill-form": "请填写此表单",
|
||||
"login-failed": "登录失败",
|
||||
"signup-failed": "注册失败",
|
||||
"user-not-found": "未找到用户",
|
||||
"password-changed": "密码已修改",
|
||||
"private-only": "此 Memo 仅自己可见",
|
||||
"copied": "已复制",
|
||||
"succeed-copy-content": "复制内容到剪贴板成功。",
|
||||
"succeed-copy-code": "复制代码到剪贴板成功。",
|
||||
"succeed-copy-link": "复制链接到剪贴板成功。",
|
||||
"change-resource-filename": "更改资源文件名",
|
||||
"resource-filename-updated": "资源文件名更改成功。",
|
||||
"invalid-resource-filename": "无效的资源文件名",
|
||||
"click-to-save-the-image": "点击保存图片",
|
||||
"generating-the-screenshot": "正在生成图片...",
|
||||
"count-selected-resources": "所选资源总数",
|
||||
"too-short": "过短",
|
||||
"too-long": "过长",
|
||||
"not-allow-space": "不允许包含空格",
|
||||
"not-allow-chinese": "不允许包含中文",
|
||||
"succeed-update-additional-style": "更新附加样式成功",
|
||||
"succeed-copy-resource-link": "复制资源链接到剪贴板成功",
|
||||
"succeed-update-customized-profile": "更新自定义配置文件成功",
|
||||
"succeed-update-additional-script": "更新附加脚本成功",
|
||||
"update-succeed": "更新成功",
|
||||
"page-not-found": "404 - 未找到网页 😥",
|
||||
"succeed-vacuum-database": "清理数据库成功"
|
||||
},
|
||||
"days": {
|
||||
"monday": "星期一",
|
||||
"mon": "一",
|
||||
"tuesday": "星期二",
|
||||
"tue": "二",
|
||||
"wednesday": "星期三",
|
||||
"wed": "三",
|
||||
"thursday": "星期四",
|
||||
"thu": "四",
|
||||
"friday": "星期五",
|
||||
"fri": "五",
|
||||
"saturday": "星期六",
|
||||
"sat": "六",
|
||||
"sunday": "星期天",
|
||||
"sun": "日"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue