@rigel-cms/rigel 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/docs/extensions.md +194 -0
- package/package.json +15 -3
- package/src/article-body.ts +49 -37
- package/src/article-render.ts +25 -2
- package/src/article.ts +44 -0
- package/src/config.ts +12 -2
- package/src/editor/App.svelte +98 -97
- package/src/editor/blocks/extension.ts +29 -0
- package/src/editor/blocks/index.ts +17 -15
- package/src/editor/blocks/video.ts +2 -1
- package/src/editor/i18n/README.md +23 -0
- package/src/editor/i18n/de/connection.json +136 -0
- package/src/editor/i18n/de/defaults.json +6 -0
- package/src/editor/i18n/de/fields.json +130 -0
- package/src/editor/i18n/de/local.json +49 -0
- package/src/editor/i18n/de/media.json +166 -0
- package/src/editor/i18n/de/richtext.json +116 -0
- package/src/editor/i18n/de/shell.json +181 -0
- package/src/editor/i18n/de/system.json +14 -0
- package/src/editor/i18n/de/validation.json +82 -0
- package/src/editor/i18n/en/connection.json +136 -0
- package/src/editor/i18n/en/defaults.json +6 -0
- package/src/editor/i18n/en/fields.json +130 -0
- package/src/editor/i18n/en/local.json +49 -0
- package/src/editor/i18n/en/media.json +166 -0
- package/src/editor/i18n/en/richtext.json +116 -0
- package/src/editor/i18n/en/shell.json +181 -0
- package/src/editor/i18n/en/system.json +14 -0
- package/src/editor/i18n/en/validation.json +82 -0
- package/src/editor/i18n/es/connection.json +136 -0
- package/src/editor/i18n/es/defaults.json +6 -0
- package/src/editor/i18n/es/fields.json +130 -0
- package/src/editor/i18n/es/local.json +49 -0
- package/src/editor/i18n/es/media.json +166 -0
- package/src/editor/i18n/es/richtext.json +116 -0
- package/src/editor/i18n/es/shell.json +181 -0
- package/src/editor/i18n/es/system.json +14 -0
- package/src/editor/i18n/es/validation.json +82 -0
- package/src/editor/i18n/format.ts +26 -0
- package/src/editor/i18n/fr/connection.json +136 -0
- package/src/editor/i18n/fr/defaults.json +6 -0
- package/src/editor/i18n/fr/fields.json +130 -0
- package/src/editor/i18n/fr/local.json +49 -0
- package/src/editor/i18n/fr/media.json +166 -0
- package/src/editor/i18n/fr/richtext.json +116 -0
- package/src/editor/i18n/fr/shell.json +181 -0
- package/src/editor/i18n/fr/system.json +14 -0
- package/src/editor/i18n/fr/validation.json +82 -0
- package/src/editor/i18n/index.ts +18 -0
- package/src/editor/i18n/it/connection.json +136 -0
- package/src/editor/i18n/it/defaults.json +6 -0
- package/src/editor/i18n/it/fields.json +130 -0
- package/src/editor/i18n/it/local.json +49 -0
- package/src/editor/i18n/it/media.json +166 -0
- package/src/editor/i18n/it/richtext.json +116 -0
- package/src/editor/i18n/it/shell.json +181 -0
- package/src/editor/i18n/it/system.json +14 -0
- package/src/editor/i18n/it/validation.json +82 -0
- package/src/editor/i18n/ja/connection.json +136 -0
- package/src/editor/i18n/ja/defaults.json +6 -0
- package/src/editor/i18n/ja/fields.json +130 -0
- package/src/editor/i18n/ja/local.json +49 -0
- package/src/editor/i18n/ja/media.json +166 -0
- package/src/editor/i18n/ja/richtext.json +116 -0
- package/src/editor/i18n/ja/shell.json +181 -0
- package/src/editor/i18n/ja/system.json +14 -0
- package/src/editor/i18n/ja/validation.json +82 -0
- package/src/editor/i18n/locales.ts +13 -0
- package/src/editor/i18n/nl/connection.json +136 -0
- package/src/editor/i18n/nl/defaults.json +6 -0
- package/src/editor/i18n/nl/fields.json +130 -0
- package/src/editor/i18n/nl/local.json +49 -0
- package/src/editor/i18n/nl/media.json +166 -0
- package/src/editor/i18n/nl/richtext.json +116 -0
- package/src/editor/i18n/nl/shell.json +181 -0
- package/src/editor/i18n/nl/system.json +14 -0
- package/src/editor/i18n/nl/validation.json +82 -0
- package/src/editor/i18n/ru/connection.json +138 -0
- package/src/editor/i18n/ru/defaults.json +6 -0
- package/src/editor/i18n/ru/fields.json +132 -0
- package/src/editor/i18n/ru/local.json +49 -0
- package/src/editor/i18n/ru/media.json +166 -0
- package/src/editor/i18n/ru/richtext.json +116 -0
- package/src/editor/i18n/ru/shell.json +181 -0
- package/src/editor/i18n/ru/system.json +14 -0
- package/src/editor/i18n/ru/validation.json +82 -0
- package/src/editor/i18n/server.ts +13 -0
- package/src/editor/i18n/zh/connection.json +136 -0
- package/src/editor/i18n/zh/defaults.json +6 -0
- package/src/editor/i18n/zh/fields.json +130 -0
- package/src/editor/i18n/zh/local.json +49 -0
- package/src/editor/i18n/zh/media.json +166 -0
- package/src/editor/i18n/zh/richtext.json +116 -0
- package/src/editor/i18n/zh/shell.json +181 -0
- package/src/editor/i18n/zh/system.json +14 -0
- package/src/editor/i18n/zh/validation.json +82 -0
- package/src/editor/lib/ActionDialog.svelte +5 -4
- package/src/editor/lib/BlockEditor.svelte +305 -88
- package/src/editor/lib/CollectionPanel.svelte +17 -15
- package/src/editor/lib/DatePicker.svelte +15 -12
- package/src/editor/lib/ExtensionMount.svelte +12 -0
- package/src/editor/lib/Field.svelte +3 -2
- package/src/editor/lib/ImagePicker.svelte +82 -81
- package/src/editor/lib/MarkdownEditor.svelte +25 -24
- package/src/editor/lib/MediaPicker.svelte +6 -5
- package/src/editor/lib/MenuEditor.svelte +31 -30
- package/src/editor/lib/PreviewFrame.svelte +11 -6
- package/src/editor/lib/PropertiesTabs.svelte +3 -2
- package/src/editor/lib/PublishDialog.svelte +15 -14
- package/src/editor/lib/ReferenceSelect.svelte +3 -2
- package/src/editor/lib/SchemaField.svelte +15 -13
- package/src/editor/lib/SchemaPanel.svelte +20 -19
- package/src/editor/lib/Select.svelte +3 -2
- package/src/editor/lib/SeoGuidance.svelte +6 -5
- package/src/editor/lib/Settings.svelte +54 -54
- package/src/editor/lib/Shortcuts.svelte +7 -6
- package/src/editor/lib/SitePreview.svelte +10 -9
- package/src/editor/lib/TopBar.svelte +18 -17
- package/src/editor/lib/UnsavedChanges.svelte +7 -6
- package/src/editor/lib/VisualEditor.svelte +14 -13
- package/src/editor/lib/calendar.ts +10 -4
- package/src/editor/lib/embed-preview.ts +23 -5
- package/src/editor/lib/extension-preview.ts +121 -0
- package/src/editor/lib/github-auth.ts +23 -22
- package/src/editor/lib/github-backend.ts +96 -91
- package/src/editor/lib/images.ts +33 -31
- package/src/editor/lib/menu-tree.ts +5 -4
- package/src/editor/lib/preview-frame.ts +4 -3
- package/src/editor/lib/schema-edit.ts +3 -2
- package/src/editor/lib/settings.ts +5 -3
- package/src/editor/lib/slash-command.ts +1 -0
- package/src/editor/lib/tooltip.ts +1 -1
- package/src/editor/main.ts +9 -0
- package/src/editor/styles.css +6 -3
- package/src/env.d.ts +11 -1
- package/src/extensions.ts +160 -0
- package/src/manifest/collections.ts +6 -5
- package/src/manifest/menu.ts +12 -10
- package/src/manifest/navigation.ts +9 -8
- package/src/manifest/references.ts +8 -7
- package/src/manifest/seo.ts +4 -3
- package/src/manifest/types.ts +1 -0
- package/src/preview.ts +22 -2
- package/src/routes/local-api.ts +5 -3
- package/src/routes/local-documents.ts +20 -16
- package/src/routes/local-media.ts +21 -16
- package/src/routes/local-menu.ts +9 -7
- package/src/routes/local-post.ts +18 -12
- package/src/routes/media-files.ts +10 -8
- package/src/routes/rigel-page.astro +2 -1
- package/src/schema/store.ts +22 -20
- package/src/schema/types.ts +1 -0
- package/src/schema/validate.ts +73 -69
- package/src/slugs.ts +11 -10
- package/src/vite/manifest-plugin.ts +33 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"validation.body.invalidTree": "Некорректное или слишком большое дерево блоков статьи",
|
|
3
|
+
"validation.body.unsupportedBlock": "Неподдерживаемый блок статьи",
|
|
4
|
+
"validation.body.expectedBlock": "Ожидается блок статьи",
|
|
5
|
+
"validation.body.nestedTable": "Вложенные таблицы не поддерживаются",
|
|
6
|
+
"validation.body.tableStructure": "Некорректная структура таблицы",
|
|
7
|
+
"validation.body.tableContent": "Некорректное содержимое таблицы",
|
|
8
|
+
"validation.body.tableCell": "Некорректная ячейка таблицы или неподдерживаемые объединённые ячейки",
|
|
9
|
+
"validation.body.tableCellStyles": "Пользовательские стили ячеек таблицы не поддерживаются",
|
|
10
|
+
"validation.body.tableDimensions": "Некорректные размеры таблицы",
|
|
11
|
+
"validation.body.tableColumnWidths": "Некорректная ширина столбцов таблицы",
|
|
12
|
+
"validation.body.listItems": "Списки должны содержать элементы списка",
|
|
13
|
+
"validation.body.inlineContent": "Ожидается строчное содержимое статьи",
|
|
14
|
+
"validation.body.headingLevel": "Используйте заголовки уровней 1–6",
|
|
15
|
+
"validation.body.listType": "Неподдерживаемый тип списка",
|
|
16
|
+
"validation.body.listStart": "Некорректное начальное значение списка",
|
|
17
|
+
"validation.body.invalidText": "Некорректный текст статьи",
|
|
18
|
+
"validation.body.textSize": "Слишком большой объём текста статьи",
|
|
19
|
+
"validation.body.customStyles": "Пользовательские стили статьи не поддерживаются",
|
|
20
|
+
"validation.body.imageRequired": "Для изображений обязательны URL и альтернативный текст",
|
|
21
|
+
"validation.body.linkRequired": "Для ссылок обязателен URL",
|
|
22
|
+
"validation.body.imageUrl": "Небезопасный URL изображения",
|
|
23
|
+
"validation.body.imageLinkUrl": "Небезопасный URL ссылки изображения",
|
|
24
|
+
"validation.body.linkUrl": "Небезопасный URL ссылки",
|
|
25
|
+
"validation.body.videoUrl": "Небезопасный URL видео",
|
|
26
|
+
"validation.body.videoPosterUrl": "Небезопасный URL обложки видео",
|
|
27
|
+
"validation.body.videoCaption": "Некорректная подпись к видео",
|
|
28
|
+
"validation.body.videoPlayback": "Некорректная настройка воспроизведения видео",
|
|
29
|
+
"validation.body.videoEmbed": "Некорректная видеовставка",
|
|
30
|
+
"validation.body.embedTitle": "Некорректный заголовок вставки",
|
|
31
|
+
"validation.body.imageCredit": "Некорректное указание авторства изображения",
|
|
32
|
+
"validation.body.imageCreditUrl": "Небезопасный URL источника изображения",
|
|
33
|
+
"validation.body.childrenRequired": "Блок статьи должен содержать дочерние элементы",
|
|
34
|
+
"validation.body.emptyTable": "Элементы таблицы не могут быть пустыми",
|
|
35
|
+
"validation.body.tableSize": "Таблица должна быть прямоугольной: не более 50 строк и 20 столбцов",
|
|
36
|
+
"validation.body.unexpectedChildren": "Недопустимые дочерние элементы статьи",
|
|
37
|
+
"validation.body.expectedBody": "Ожидается текст статьи в формате Lexical",
|
|
38
|
+
"validation.slug.required": "URL slug должен содержать буквы или цифры.",
|
|
39
|
+
"validation.slug.invalid": "Некорректный URL slug; используйте строчные буквы, цифры и одиночные дефисы.",
|
|
40
|
+
"validation.slug.duplicate": "URL slug «{slug}» уже используется.",
|
|
41
|
+
"validation.collection.invalid": "Некорректные метаданные статьи (frontmatter)",
|
|
42
|
+
"validation.collection.required": "{label}: обязательное поле",
|
|
43
|
+
"validation.collection.expected": "{label}: ожидается тип {type}",
|
|
44
|
+
"validation.menu.maxDepth": "Значение maxDepth меню должно быть целым числом от 1 до 10",
|
|
45
|
+
"validation.menu.required": "Для меню обязательны slug из строчных букв, цифр и дефисов, title и массив items",
|
|
46
|
+
"validation.menu.depth": "Меню превышает максимальную глубину {maxDepth}",
|
|
47
|
+
"validation.menu.itemRequired": "Для пунктов меню обязательны непустые id, label, url и массив children",
|
|
48
|
+
"validation.menu.duplicateId": "Повторяющийся id пункта меню: {id}",
|
|
49
|
+
"validation.menu.newTab": "Значение newTab пункта меню должно быть логическим",
|
|
50
|
+
"validation.menu.unsafeUrl": "Небезопасный URL меню",
|
|
51
|
+
"validation.menu.invalidUrl": "Некорректный URL меню",
|
|
52
|
+
"validation.menu.unsafeProtocol": "Небезопасный протокол URL меню",
|
|
53
|
+
"validation.schema.unknownObject": "{path}: неизвестный тип объекта",
|
|
54
|
+
"validation.schema.unknownDocument": "{path}: неизвестный тип документа",
|
|
55
|
+
"validation.schema.required": "{path}: обязательное поле",
|
|
56
|
+
"validation.schema.unsafeKey": "{path}: небезопасный ключ {key}",
|
|
57
|
+
"validation.schema.object": "{path}: значение должно быть объектом",
|
|
58
|
+
"validation.schema.array": "{path}: значение должно быть массивом",
|
|
59
|
+
"validation.schema.minItems": "{path}: минимум элементов — {min}",
|
|
60
|
+
"validation.schema.maxItems": "{path}: максимум элементов — {max}",
|
|
61
|
+
"validation.schema.reference": "{path}: значение должно быть ссылкой на запись",
|
|
62
|
+
"validation.schema.section": "{path}: значение должно быть разделом типа {name}",
|
|
63
|
+
"validation.schema.scalar": "{path}: ожидается тип {type}",
|
|
64
|
+
"validation.schema.stableKey": "{path}: требуется стабильный _key",
|
|
65
|
+
"validation.schema.duplicateKey": "{path}: повторяющийся _key {key}",
|
|
66
|
+
"validation.schema.unknownSection": "{path}: неизвестный тип раздела {type}",
|
|
67
|
+
"validation.schema.arrayItem": "{path}: значение не соответствует ни одному из допустимых типов элементов массива",
|
|
68
|
+
"validation.schema.referenceId": "{path}: некорректный id ссылки на запись",
|
|
69
|
+
"validation.schema.referenceTarget": "{path}: ссылка на запись должна указывать на {targets}",
|
|
70
|
+
"validation.schema.referenceAlternatives": "{target} или {alternatives}",
|
|
71
|
+
"validation.schema.referenceProperty": "{path}: неизвестное свойство ссылки на запись {key}",
|
|
72
|
+
"validation.schema.unresolvedTarget": "{path}: целевая запись {ref} не найдена",
|
|
73
|
+
"validation.schema.undeclaredTarget": "{path}: тип целевой записи не объявлен",
|
|
74
|
+
"validation.schema.duplicateDocument": "Повторяющийся id документа: {id}",
|
|
75
|
+
"validation.schema.slug": "{path}: slug должен состоять из строчных букв, цифр и одиночных дефисов",
|
|
76
|
+
"validation.schema.documentObject": "{path}: документ должен быть объектом",
|
|
77
|
+
"validation.schema.documentType": "{path}: значение _type должно быть {type}",
|
|
78
|
+
"validation.schema.documentId": "{path}: значение _id должно быть {id}",
|
|
79
|
+
"validation.schema.selfReference": "{path}: документ не может ссылаться на себя",
|
|
80
|
+
"validation.schema.unresolvedReference": "{path}: запись по ссылке {ref} не найдена",
|
|
81
|
+
"validation.schema.disallowedReference": "{path}: ссылка на запись {ref} не входит в список допустимых"
|
|
82
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { formatMessage, type Translator } from "./format";
|
|
2
|
+
import dictionaries from "virtual:rigel-i18n";
|
|
3
|
+
|
|
4
|
+
export function requestTranslator(request: Request): Translator {
|
|
5
|
+
const preferences = (request.headers.get("Accept-Language") ?? "").split(",").map(entry => {
|
|
6
|
+
const [tag, ...parameters] = entry.trim().toLowerCase().split(";");
|
|
7
|
+
const quality = parameters.find(parameter => parameter.trim().startsWith("q="))?.trim().slice(2);
|
|
8
|
+
const weight = quality === undefined ? 1 : /^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/.test(quality) ? Number(quality) : 0;
|
|
9
|
+
return { language: /^[a-z]{2}(?:-[a-z0-9]{1,8})*$/.test(tag) ? tag.split("-")[0] : "", weight };
|
|
10
|
+
}).filter(({ language, weight }) => weight > 0 && Object.hasOwn(dictionaries, language)).sort((a, b) => b.weight - a.weight);
|
|
11
|
+
const language = preferences[0]?.language ?? "en";
|
|
12
|
+
return (key, parameters) => formatMessage(dictionaries, language, key, parameters);
|
|
13
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
{
|
|
2
|
+
"connection.invalidAuthOrigin": "身份验证网关源无效。",
|
|
3
|
+
"connection.authorizationDenied": "GitHub 授权被拒绝。请重新登录并批准访问以继续。",
|
|
4
|
+
"connection.tokenExchangeFailed": "身份验证网关无法使用 GitHub 授权码换取令牌。尚未检查仓库访问权限。",
|
|
5
|
+
"connection.loginFailed": "GitHub 登录失败。请重新尝试登录。",
|
|
6
|
+
"connection.invalidCredentials": "GitHub 返回的凭据无效或已过期。请重新登录。",
|
|
7
|
+
"connection.loginOpenFailed": "无法打开 GitHub 登录窗口。请允许弹出窗口后重试。",
|
|
8
|
+
"connection.loginBlocked": "GitHub 登录弹窗被拦截。请允许弹出窗口后重试。",
|
|
9
|
+
"connection.loginCancelled": "GitHub 登录已取消。请重试。",
|
|
10
|
+
"connection.loginTimeout": "GitHub 登录超时。请重试。",
|
|
11
|
+
"connection.invalidSession": "GitHub 会话无效。请重新登录。",
|
|
12
|
+
"connection.invalidConfiguration": "GitHub 仓库或应用配置无效。",
|
|
13
|
+
"connection.unreachable": "无法连接 GitHub。请检查网络连接后重试。",
|
|
14
|
+
"connection.sessionExpired": "GitHub 会话已过期或被撤销。请重新登录。",
|
|
15
|
+
"connection.accessRateLimited": "已达到 GitHub 请求频率限制。请等待几分钟后重试。",
|
|
16
|
+
"connection.accessDenied": "GitHub 访问被拒绝。请检查应用权限和组织批准状态,然后重新登录。",
|
|
17
|
+
"connection.repositoryUnavailable": "GitHub 仓库或应用安装不可用。请检查仓库名称和应用安装情况后重试。",
|
|
18
|
+
"connection.accessCheckFailed": "GitHub 无法验证访问权限。请稍后重试。",
|
|
19
|
+
"connection.invalidAccessResponse": "GitHub 返回的访问响应无效。请重试。",
|
|
20
|
+
"connection.incompleteAccessListing": "GitHub 访问列表不完整。请重试,或缩小应用可访问的仓库范围。",
|
|
21
|
+
"connection.invalidUser": "GitHub 返回的用户无效。请重新登录。",
|
|
22
|
+
"connection.invalidRepository": "GitHub 返回的仓库无效。请重试。",
|
|
23
|
+
"connection.unsafePath": "GitHub 内容路径不安全",
|
|
24
|
+
"connection.invalidBranch": "GitHub 分支无效",
|
|
25
|
+
"connection.connectFirst": "请先连接已配置的 GitHub 仓库",
|
|
26
|
+
"connection.dedicatedDraftBranch": "GitHub 内容更改必须使用专用的草稿分支,绝不能使用发布分支",
|
|
27
|
+
"connection.overlappingDirectories": "GitHub 内容目录不得重叠",
|
|
28
|
+
"connection.invalidFilename": "内容文件名无效",
|
|
29
|
+
"connection.requestFailed": "GitHub 请求失败;请检查网络连接并重新连接",
|
|
30
|
+
"connection.malformedResponse": "GitHub API 响应格式错误",
|
|
31
|
+
"connection.malformedSha": "GitHub SHA 格式错误",
|
|
32
|
+
"connection.malformedPayload": "GitHub 内容载荷格式错误",
|
|
33
|
+
"connection.invalidPayload": "GitHub 内容载荷无效或过大",
|
|
34
|
+
"connection.invalidUtf8": "GitHub 内容载荷不是有效的 UTF-8",
|
|
35
|
+
"connection.contentTooLarge": "内容超出 1 MiB 限制",
|
|
36
|
+
"connection.invalidRemoteJson": "远程内容 JSON 无效",
|
|
37
|
+
"connection.incompleteTree": "GitHub 目录树不完整;无法安全加载内容",
|
|
38
|
+
"connection.malformedTreeEntry": "GitHub 目录树条目格式错误",
|
|
39
|
+
"connection.duplicateTreePath": "GitHub 目录树路径重复",
|
|
40
|
+
"connection.invalidDirectory": "内容目录必须是真实的 GitHub 目录",
|
|
41
|
+
"connection.invalidFile": "内容必须是现有的 GitHub 普通文件",
|
|
42
|
+
"connection.blobShaMismatch": "GitHub blob SHA 不匹配",
|
|
43
|
+
"connection.invalidRemoteFilename": "远程内容文件名无效",
|
|
44
|
+
"connection.invalidCopyGroups": "文案分组必须包含值对象",
|
|
45
|
+
"connection.invalidDocument": "远程文档必须是对象",
|
|
46
|
+
"connection.missingCollection": "缺少已配置的 GitHub 集合",
|
|
47
|
+
"connection.invalidArticle": "远程文章无效",
|
|
48
|
+
"connection.menuSlugMismatch": "远程菜单的 slug 与文件名不匹配",
|
|
49
|
+
"connection.reloadDraft": "保存到此仓库前,请重新加载草稿内容",
|
|
50
|
+
"connection.draftConflictUnsaved": "GitHub 草稿分支冲突;请重新加载后再保存。未保存的编辑仍在此处保留。",
|
|
51
|
+
"connection.draftConflict": "GitHub 草稿分支冲突;请重新加载后再保存。",
|
|
52
|
+
"connection.branchUpdateUnverified": "无法验证 GitHub 分支更新结果;请重试或重新加载。",
|
|
53
|
+
"connection.deletionUnverified": "无法验证 GitHub 删除结果;请重新加载",
|
|
54
|
+
"connection.saveChanged": "GitHub 保存的内容在验证前发生了变化;请重新加载",
|
|
55
|
+
"connection.waitBeforeSaving": "请等待发布完成后再保存。",
|
|
56
|
+
"connection.invalidValues": "内容值必须是对象",
|
|
57
|
+
"connection.unknownCopyPage": "未知的文案页面",
|
|
58
|
+
"connection.reloadCopyPage": "请重新加载文案页面后再保存",
|
|
59
|
+
"connection.unknownCollection": "未知集合",
|
|
60
|
+
"connection.missingSchema": "未配置文档结构定义",
|
|
61
|
+
"connection.unknownDocument": "未知的文档类型或 slug",
|
|
62
|
+
"connection.creationDisabled": "此文档类型已禁用新建条目",
|
|
63
|
+
"connection.menusNotConfigured": "菜单必须由网站开发者配置",
|
|
64
|
+
"connection.selectContent": "请先选择可编辑的内容,再保存",
|
|
65
|
+
"connection.incompletePublishTree": "GitHub 目录树不完整。无法发布;请在 GitHub 上审查此次更改。",
|
|
66
|
+
"connection.malformedPublishTree": "GitHub 发布目录树格式错误",
|
|
67
|
+
"connection.malformedPublishTreeMode": "GitHub 发布目录树的 mode 格式错误",
|
|
68
|
+
"connection.publishWriteRequired": "发布需要仓库写入权限。",
|
|
69
|
+
"connection.squashDisabled": "压缩合并已禁用。请让仓库所有者启用后再发布。",
|
|
70
|
+
"connection.automaticDeletionEnabled": "请让仓库所有者在发布前禁用自动删除源分支,以保留草稿分支。",
|
|
71
|
+
"connection.comparisonTargetMismatch": "GitHub 比较结果与已审查的目标不匹配。",
|
|
72
|
+
"connection.comparisonLimit": "不支持比较 300 个或更多文件。请在 GitHub 上发布此次更改;此处不会显示不完整的列表。",
|
|
73
|
+
"connection.unsupportedComparison": "GitHub 文件比较结果不完整或不受支持。请在 GitHub 上发布此次更改。",
|
|
74
|
+
"connection.incompleteRename": "GitHub 重命名比较结果不完整",
|
|
75
|
+
"connection.incompleteComparison": "GitHub 文件比较结果不完整。无法发布;此处不会显示不完整的列表。",
|
|
76
|
+
"connection.publishFileLimit": "不支持发布 300 个或更多文件。请在 GitHub 上审查并发布此次更改。",
|
|
77
|
+
"connection.branchesChangedDuringReview": "审查期间分支发生了变化。请重新审查更改后再发布。",
|
|
78
|
+
"connection.waitForWrite": "请等待当前保存或发布完成。",
|
|
79
|
+
"connection.reviewFirst": "请先审查已保存的更改,再发布。",
|
|
80
|
+
"connection.branchesChanged": "分支发生了变化。请重新审查更改后再发布。",
|
|
81
|
+
"connection.pullRequestMismatch": "拉取请求已与此次审查不符。请重新审查更改。",
|
|
82
|
+
"connection.incompletePullRequests": "GitHub 拉取请求列表不完整",
|
|
83
|
+
"connection.multiplePullRequests": "存在多个匹配的拉取请求。请先在 GitHub 上处理,再发布。",
|
|
84
|
+
"connection.pullRequestListingStopped": "GitHub 拉取请求列表不完整;发布已停止。",
|
|
85
|
+
"connection.publishSettingsChanged": "发布设置或访问权限发生了变化。请启用压缩合并、禁用自动删除分支并验证写入权限,然后重新审查。",
|
|
86
|
+
"connection.pullRequestCreationUnconfirmed": "上一次创建拉取请求的结果尚未确认。请检查 GitHub 后再重试;未创建重复的拉取请求。",
|
|
87
|
+
"connection.pullRequestTargetChanged": "拉取请求或目标发生了变化。请重新审查更改后再发布。",
|
|
88
|
+
"connection.syncUnverified": "GitHub 仍在同步草稿,或无法验证同步结果。请稍候,重新加载草稿内容并再次审查。未发布任何内容。",
|
|
89
|
+
"connection.mergeBlocked": "GitHub 尚未允许此次合并。请在 GitHub 上解决冲突、必需的检查、审查或分支保护要求,然后重试。不会绕过任何保护措施。",
|
|
90
|
+
"connection.mergeFailed": "GitHub 未合并此拉取请求。请检查必需的检查、审查和分支保护要求后重试。",
|
|
91
|
+
"connection.publishUnverified": "无法验证发布结果。请在 GitHub 上检查此拉取请求后再重试。",
|
|
92
|
+
"connection.publishPermissions": "发布需要 GitHub App 的 Contents 和 Pull requests 读写权限、安装所有者批准及仓库写入权限。批准后请重新连接。分支保护仍然适用。",
|
|
93
|
+
"connection.publishRejected": "GitHub 拒绝了发布。请检查冲突、必需的检查和审查、分支保护及压缩合并设置。若任一分支发生变化,请重新审查更改。",
|
|
94
|
+
"connection.waitBeforeDeleting": "请等待发布完成后再删除。",
|
|
95
|
+
"connection.contentExists": "内容已存在;请选择其他 slug",
|
|
96
|
+
"connection.reloadContent": "请重新加载此内容后再更改",
|
|
97
|
+
"connection.requestRateLimited": "已达到 GitHub 请求频率限制;请稍候重试({status})",
|
|
98
|
+
"connection.requestSessionExpired": "GitHub 会话已过期;请重新连接({status})",
|
|
99
|
+
"connection.requestAccessDenied": "GitHub 访问被拒绝;请检查仓库应用安装的权限({status})",
|
|
100
|
+
"connection.requestUnavailable": "GitHub 仓库、分支或文件不可用;请检查访问权限并重新加载({status})",
|
|
101
|
+
"connection.requestConflict": "GitHub 内容冲突;请重新加载后再保存({status})",
|
|
102
|
+
"connection.requestRejected": "GitHub 拒绝了此次更改;路径或分支可能已存在;请重新加载({status})",
|
|
103
|
+
"connection.requestError": "GitHub 请求失败;请检查仓库访问权限后重试({status})",
|
|
104
|
+
"connection.publishOutcomeUnconfirmed": "发布结果尚未确认。请在 GitHub 上检查拉取请求 #{number},或重试以验证结果,再发起新的发布。",
|
|
105
|
+
"connection.cancel": "取消",
|
|
106
|
+
"connection.working": "正在处理…",
|
|
107
|
+
"connection.actionFailed": "无法完成操作。请重试。",
|
|
108
|
+
"connection.publishTitle": "发布已保存的更改",
|
|
109
|
+
"connection.closePublishReview": "关闭发布审查",
|
|
110
|
+
"connection.publishDescription": "发布范围为{scope},也包括 CMS 内容文件夹之外的文件。未保存的编辑绝不会包含在内,也不会自动保存。",
|
|
111
|
+
"connection.publishScope": "草稿分支上所有已保存的更改",
|
|
112
|
+
"connection.loadingReview": "正在加载完整文件审查…",
|
|
113
|
+
"connection.publishBranches": "从 {branch} 合并到 {publishBranch},压缩为一次提交。",
|
|
114
|
+
"connection.syncDescription": "发布分支包含草稿分支中没有的更改,包括先前的压缩合并发布。请先使用 GitHub 的普通合并操作,手动将发布分支同步到草稿分支。此操作不会发布。遇到冲突时同步会停止。然后请重新审查更新后的文件,再发布。",
|
|
115
|
+
"connection.treeDifferences": "以下是当前目录树的差异,并非最终发布列表:",
|
|
116
|
+
"connection.fileCount.one": "{count} 个文件",
|
|
117
|
+
"connection.fileCount.other": "{count} 个文件",
|
|
118
|
+
"connection.allChangedFiles": "所有已更改的文件",
|
|
119
|
+
"connection.previousFilename": "原文件名:{filename}",
|
|
120
|
+
"connection.noSavedChanges": "没有可发布的已保存更改。两个分支的目录树完全相同。",
|
|
121
|
+
"connection.publishSafety": "发布前会再次检查两个分支的修订版本。GitHub 会固定草稿的修订版本,但无法以原子方式锁定目标修订版本;若目标在最后一刻更新,仍可能发生竞态。必需的检查、审查和分支保护仍然适用。",
|
|
122
|
+
"connection.close": "关闭",
|
|
123
|
+
"connection.reviewAgain": "重新审查",
|
|
124
|
+
"connection.syncDraftsFirst": "先同步草稿",
|
|
125
|
+
"connection.confirmPublish": "确认发布",
|
|
126
|
+
"connection.unsavedTitle": "未保存的更改",
|
|
127
|
+
"connection.keepEditing": "继续编辑",
|
|
128
|
+
"connection.unsavedDescription": "你有未保存的更改。要先保存再离开,还是放弃此草稿?",
|
|
129
|
+
"connection.discardChanges": "放弃更改",
|
|
130
|
+
"connection.saving": "正在保存…",
|
|
131
|
+
"connection.saveAndLeave": "保存并离开",
|
|
132
|
+
"connection.fileStatus.added": "已添加",
|
|
133
|
+
"connection.fileStatus.modified": "已修改",
|
|
134
|
+
"connection.fileStatus.removed": "已删除",
|
|
135
|
+
"connection.fileStatus.renamed": "已重命名"
|
|
136
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fields.remove": "移除",
|
|
3
|
+
"fields.addItem": "添加项目",
|
|
4
|
+
"fields.colorPicker": "{label}选择器",
|
|
5
|
+
"fields.colorHexValue": "{label}十六进制值",
|
|
6
|
+
"fields.hideValue": "隐藏{label}",
|
|
7
|
+
"fields.showValue": "显示{label}",
|
|
8
|
+
"fields.choose": "选择…",
|
|
9
|
+
"fields.itemNumber": "第 {number} 项",
|
|
10
|
+
"fields.moveItemUp": "将{label}的第 {number} 项上移",
|
|
11
|
+
"fields.moveItemDown": "将{label}的第 {number} 项下移",
|
|
12
|
+
"fields.duplicateItem": "复制{label}的第 {number} 项",
|
|
13
|
+
"fields.removeItem": "移除{label}的第 {number} 项",
|
|
14
|
+
"fields.itemLabel": "{label}的第 {number} 项",
|
|
15
|
+
"fields.moveUp": "上移",
|
|
16
|
+
"fields.moveDown": "下移",
|
|
17
|
+
"fields.duplicate": "复制",
|
|
18
|
+
"fields.selectLabel": "选择{label}…",
|
|
19
|
+
"fields.unavailableReference": "不可用({id})",
|
|
20
|
+
"fields.noEntries": "尚未声明任何条目。",
|
|
21
|
+
"fields.properties": "属性",
|
|
22
|
+
"fields.content": "内容",
|
|
23
|
+
"fields.seo": "SEO",
|
|
24
|
+
"fields.selectOptions": "选择选项…",
|
|
25
|
+
"fields.noOptions": "没有可用选项。",
|
|
26
|
+
"fields.demoContentNotice": "用于测试的字段示例。这些值与网站设置相互独立。",
|
|
27
|
+
"fields.sharedContentNotice": "共享内容。更改会显示在所有引用此内容的页面上。",
|
|
28
|
+
"fields.pageProperties": "页面属性",
|
|
29
|
+
"fields.urlSlug": "URL别名",
|
|
30
|
+
"fields.documentSlugHint": "仅更改 URL,不会更改文档标识符或文件名。网站路由须使用 slug 元数据。",
|
|
31
|
+
"fields.newPageNotice": "新页面。保存会写入 JSON 文件;网站获取该文件后,路由才会生效。",
|
|
32
|
+
"fields.structure": "结构",
|
|
33
|
+
"fields.moveSectionUp": "上移{label}",
|
|
34
|
+
"fields.moveSectionDown": "下移{label}",
|
|
35
|
+
"fields.duplicateSection": "复制{label}",
|
|
36
|
+
"fields.removeSection": "移除{label}",
|
|
37
|
+
"fields.sectionTypeToAdd": "要添加的区块类型",
|
|
38
|
+
"fields.chooseSection": "选择区块…",
|
|
39
|
+
"fields.addSection": "添加区块",
|
|
40
|
+
"fields.pendingSections.one": "{count} 个新区块将在保存后显示。",
|
|
41
|
+
"fields.pendingSections.other": "{count} 个新区块将在保存后显示。",
|
|
42
|
+
"fields.sectionProperties": "区块属性",
|
|
43
|
+
"fields.editReference": "编辑{label} ↗",
|
|
44
|
+
"fields.articleDetails": "文章详情",
|
|
45
|
+
"fields.collectionSlugHint": "仅更改 URL,不会更改内容文件名。网站路由须使用 slug 元数据。",
|
|
46
|
+
"fields.commaSeparatedLabel": "{label}(以逗号分隔)",
|
|
47
|
+
"fields.editArticleBody": "在预览中编辑文章正文",
|
|
48
|
+
"fields.loadingPreview": "正在加载预览…",
|
|
49
|
+
"fields.editArticleBodyHint": "点击预览中的文章正文即可编辑。内容更改后需保存。",
|
|
50
|
+
"fields.seoNotSet": "未设置",
|
|
51
|
+
"fields.seoTooShort": "过短",
|
|
52
|
+
"fields.seoTooLong": "过长",
|
|
53
|
+
"fields.seoRecommendedLength": "建议长度",
|
|
54
|
+
"fields.seoTitleLength": "SEO 标题长度",
|
|
55
|
+
"fields.seoDescriptionLength": "SEO 描述长度",
|
|
56
|
+
"fields.seoLengthDetails": "{count} 个字符。{status}。建议 {min} 至 {max} 个字符。",
|
|
57
|
+
"fields.seoRecommendedCharacters": "建议:{min}–{max} 个字符。",
|
|
58
|
+
"fields.seoRecommendedImageSize": "建议尺寸:1200 × 628 px。",
|
|
59
|
+
"fields.section": "区块",
|
|
60
|
+
"fields.menuItemNotFound": "找不到菜单项",
|
|
61
|
+
"fields.menuMoveIntoSelf": "不能将菜单项移入自身或其子项",
|
|
62
|
+
"fields.menuDropTargetMissing": "放置目标已不存在",
|
|
63
|
+
"fields.menuMoveDepthLimit": "此次移动会超出 {maxDepth} 层的限制",
|
|
64
|
+
"fields.menuItemMoved": "菜单项已移动",
|
|
65
|
+
"fields.menuCannotMoveItem": "无法移动菜单项",
|
|
66
|
+
"fields.menuMaximumLevels": "最多 {maxDepth} 层",
|
|
67
|
+
"fields.menuNewItem": "新菜单项",
|
|
68
|
+
"fields.menuItemAdded": "菜单项已添加",
|
|
69
|
+
"fields.menuMoveCancelled": "已取消移动",
|
|
70
|
+
"fields.menuItems": "菜单项",
|
|
71
|
+
"fields.menuPath": "菜单路径",
|
|
72
|
+
"fields.menuUntitledItem": "未命名菜单项",
|
|
73
|
+
"fields.menuItemDetails": "{label}详情",
|
|
74
|
+
"fields.menuItemActions": "{label}的操作",
|
|
75
|
+
"fields.menuUp": "上移",
|
|
76
|
+
"fields.menuDown": "下移",
|
|
77
|
+
"fields.menuIndent": "增加缩进",
|
|
78
|
+
"fields.menuOutdent": "减少缩进",
|
|
79
|
+
"fields.menuLabel": "显示名称",
|
|
80
|
+
"fields.menuLabelFor": "{id}的显示名称",
|
|
81
|
+
"fields.menuUrl": "URL",
|
|
82
|
+
"fields.menuUrlFor": "{id}的 URL",
|
|
83
|
+
"fields.menuUrlPlaceholder": "/about 或 https://example.com",
|
|
84
|
+
"fields.menuOpenInNewTab": "在新标签页中打开",
|
|
85
|
+
"fields.menuGroupItems": "菜单项",
|
|
86
|
+
"fields.menuDragItem": "拖动{label}",
|
|
87
|
+
"fields.menuOpenItem": "打开{label}",
|
|
88
|
+
"fields.menuEmptyGroup": "此分组中没有菜单项。",
|
|
89
|
+
"fields.menuEmpty": "暂无菜单项。",
|
|
90
|
+
"fields.menuAddChild": "添加子项",
|
|
91
|
+
"fields.menuMaximumLevelsHint": "最多 {maxDepth} 层。",
|
|
92
|
+
"fields.menuRemoveTitle": "移除“{label}”?",
|
|
93
|
+
"fields.menuRemoveDescription": "将从草稿中移除此菜单项及其所有子项。点击保存以保留更改。",
|
|
94
|
+
"fields.menuItemRemoved": "菜单项已移除",
|
|
95
|
+
"fields.calendarHeading": "{year}年{month}",
|
|
96
|
+
"fields.chooseDate": "选择日期…",
|
|
97
|
+
"fields.calendarFor": "{label}日历",
|
|
98
|
+
"fields.previousMonth": "上个月",
|
|
99
|
+
"fields.calendarMonth": "日历月份",
|
|
100
|
+
"fields.calendarYear": "日历年份",
|
|
101
|
+
"fields.nextMonth": "下个月",
|
|
102
|
+
"fields.today": "今天",
|
|
103
|
+
"fields.clear": "清除",
|
|
104
|
+
"fields.month.january": "一月",
|
|
105
|
+
"fields.month.february": "二月",
|
|
106
|
+
"fields.month.march": "三月",
|
|
107
|
+
"fields.month.april": "四月",
|
|
108
|
+
"fields.month.may": "五月",
|
|
109
|
+
"fields.month.june": "六月",
|
|
110
|
+
"fields.month.july": "七月",
|
|
111
|
+
"fields.month.august": "八月",
|
|
112
|
+
"fields.month.september": "九月",
|
|
113
|
+
"fields.month.october": "十月",
|
|
114
|
+
"fields.month.november": "十一月",
|
|
115
|
+
"fields.month.december": "十二月",
|
|
116
|
+
"fields.weekday.sunday": "星期日",
|
|
117
|
+
"fields.weekday.monday": "星期一",
|
|
118
|
+
"fields.weekday.tuesday": "星期二",
|
|
119
|
+
"fields.weekday.wednesday": "星期三",
|
|
120
|
+
"fields.weekday.thursday": "星期四",
|
|
121
|
+
"fields.weekday.friday": "星期五",
|
|
122
|
+
"fields.weekday.saturday": "星期六",
|
|
123
|
+
"fields.weekdayShort.sunday": "日",
|
|
124
|
+
"fields.weekdayShort.monday": "一",
|
|
125
|
+
"fields.weekdayShort.tuesday": "二",
|
|
126
|
+
"fields.weekdayShort.wednesday": "三",
|
|
127
|
+
"fields.weekdayShort.thursday": "四",
|
|
128
|
+
"fields.weekdayShort.friday": "五",
|
|
129
|
+
"fields.weekdayShort.saturday": "六"
|
|
130
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"local.documentTooLarge": "文档超过 1 MiB 的大小限制",
|
|
3
|
+
"local.dataRequired": "请求体必须包含 data 对象",
|
|
4
|
+
"local.unknownDocument": "未知文档",
|
|
5
|
+
"local.readDocumentFailed": "无法读取文档",
|
|
6
|
+
"local.documentDeveloperOnly": "文档由网站开发者创建和删除",
|
|
7
|
+
"local.unknownDocumentTarget": "未知的文档类型或 slug",
|
|
8
|
+
"local.saveDocumentFailed": "无法保存文档",
|
|
9
|
+
"local.unknownCollectionSlug": "未知的集合或 slug",
|
|
10
|
+
"local.invalidArticle": "文章无效",
|
|
11
|
+
"local.postExists": "已存在使用此 slug 的文章。请重新加载集合后再次创建草稿。",
|
|
12
|
+
"local.postNotFound": "此文章不存在",
|
|
13
|
+
"local.invalidMenuSlug": "菜单 slug 无效",
|
|
14
|
+
"local.menuDeveloperOnly": "菜单由网站开发者声明。只能编辑已有菜单。",
|
|
15
|
+
"local.menuSlugMismatch": "菜单 slug 必须与请求中的 slug 一致",
|
|
16
|
+
"local.menuNotFound": "此菜单不存在",
|
|
17
|
+
"local.notFound": "未找到",
|
|
18
|
+
"local.unsupportedMedia": "媒体类型或文件名不受支持,或两者不匹配",
|
|
19
|
+
"local.mediaTooLarge": "媒体超过 {limit} MB",
|
|
20
|
+
"local.emptyMedia": "媒体请求体为空",
|
|
21
|
+
"local.readImageFailed": "无法读取图片请求体",
|
|
22
|
+
"local.emptyImage": "图片请求体为空",
|
|
23
|
+
"local.mediaBytesMismatch": "媒体类型与实际字节内容不匹配",
|
|
24
|
+
"local.saveImageFailed": "无法保存图片",
|
|
25
|
+
"local.saveMetadataFailed": "无法保存元数据",
|
|
26
|
+
"local.mediaUrlRequired": "必须提供媒体 URL",
|
|
27
|
+
"local.fileNotFound": "未找到文件",
|
|
28
|
+
"local.deleteFileFailed": "无法删除文件。请重试。",
|
|
29
|
+
"local.missingSlug": "缺少 slug",
|
|
30
|
+
"local.copyNotFound": "未找到 {slug} 的 copy 模块",
|
|
31
|
+
"local.copyValuesNotFound": "无法在 {slug}.ts 中找到 values 代码块",
|
|
32
|
+
"local.unknownDocumentType": "未知的文档类型 {type}",
|
|
33
|
+
"local.creatingDisabled": "此文档类型已禁用条目创建",
|
|
34
|
+
"local.invalidDocumentSlug": "文档 slug 无效",
|
|
35
|
+
"local.documentObjectRequired": "文档必须是对象",
|
|
36
|
+
"local.documentExists": "已存在使用此 slug 的文档",
|
|
37
|
+
"local.documentNotFound": "此文档不存在",
|
|
38
|
+
"local.writeDocumentFailed": "无法写入文档",
|
|
39
|
+
"local.invalidMetadataBody": "请求体无效",
|
|
40
|
+
"local.unknownMetadataField": "未知的元数据字段",
|
|
41
|
+
"local.unknownAsset": "未知资源",
|
|
42
|
+
"local.invalidDisplayName": "显示名称无效",
|
|
43
|
+
"local.metadataTitleString": "标题必须是字符串",
|
|
44
|
+
"local.metadataDescriptionString": "描述必须是字符串",
|
|
45
|
+
"local.metadataAltString": "替代文本必须是字符串",
|
|
46
|
+
"local.metadataAltImagesOnly": "替代文本仅适用于图片",
|
|
47
|
+
"local.mediaDirectoryUnavailable": "媒体目录不可用",
|
|
48
|
+
"local.menuStorageUnavailable": "无法访问菜单:存储的数据无效,或存储位置不安全或不可用"
|
|
49
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
{
|
|
2
|
+
"media.insertMedia": "插入媒体",
|
|
3
|
+
"media.image": "图片",
|
|
4
|
+
"media.video": "视频",
|
|
5
|
+
"media.insertImage": "插入图片",
|
|
6
|
+
"media.metadataSaveFailedStatus": "元数据保存失败({status})",
|
|
7
|
+
"media.metadataSaved": "元数据已保存。",
|
|
8
|
+
"media.metadataSaveFailed": "元数据保存失败",
|
|
9
|
+
"media.deleteFailed": "无法删除文件({status})。请重试。",
|
|
10
|
+
"media.fileDeleted": "文件已删除。",
|
|
11
|
+
"media.listingUnavailable": "无法获取媒体列表。请启动本地开发服务器或重新构建网站。",
|
|
12
|
+
"media.enterVideoUrl": "请输入以 https:// 或 / 开头的视频 URL",
|
|
13
|
+
"media.enterImageUrl": "请输入以 https:// 或 / 开头的图片 URL",
|
|
14
|
+
"media.chooseVideoUrl": "请选择 MP4、WebM 或 MOV 视频的 URL。",
|
|
15
|
+
"media.chooseImageUrl": "请选择图片 URL,而非文档或其他媒体文件的 URL。",
|
|
16
|
+
"media.searchFailed": "搜索失败",
|
|
17
|
+
"media.pasteVideoUrl": "请粘贴 {provider} 视频的 URL。",
|
|
18
|
+
"media.unsafeMediaUrl": "媒体 URL 不安全",
|
|
19
|
+
"media.uploadedMetadataFailed": "文件已上传,但元数据无法保存({status})。请重试以完成导入。",
|
|
20
|
+
"media.availableInLibrary": "媒体已可在仓库媒体库中使用。",
|
|
21
|
+
"media.photoImportFailed": "照片导入失败",
|
|
22
|
+
"media.chooseSupportedFile": "请选择支持的文件,大小不超过 {limit} MB,且文件名安全。",
|
|
23
|
+
"media.chooseSupportedVideo": "请选择支持的视频,大小不超过 {limit} MB,且文件名安全。",
|
|
24
|
+
"media.chooseSupportedImage": "请选择支持的图片,大小不超过 {limit} MB,且文件名安全。",
|
|
25
|
+
"media.heading": "媒体",
|
|
26
|
+
"media.upload": "上传",
|
|
27
|
+
"media.noImage": "无图片",
|
|
28
|
+
"media.choose": "选择…",
|
|
29
|
+
"media.removeImage": "移除图片",
|
|
30
|
+
"media.repositoryWritable": "仓库媒体:public/{folder}。确认上传后会立即写入文件;内容仍需点击“保存”。",
|
|
31
|
+
"media.repositorySnapshot": "仓库媒体:public/{folder}。此处为构建时的快照。上传和图库导入需要本地开发服务器;尚未接入 GitHub 上传。",
|
|
32
|
+
"media.view": "媒体视图",
|
|
33
|
+
"media.gridView": "网格视图",
|
|
34
|
+
"media.listView": "列表视图",
|
|
35
|
+
"media.type": "媒体类型",
|
|
36
|
+
"media.videoFormat": "视频格式",
|
|
37
|
+
"media.imageFormat": "图片格式",
|
|
38
|
+
"media.allItems": "所有媒体",
|
|
39
|
+
"media.allVideos": "所有视频",
|
|
40
|
+
"media.allImages": "所有图片",
|
|
41
|
+
"media.category.Images": "图片",
|
|
42
|
+
"media.category.Audio": "音频",
|
|
43
|
+
"media.category.Video": "视频",
|
|
44
|
+
"media.category.Documents": "文档",
|
|
45
|
+
"media.category.Spreadsheets": "电子表格",
|
|
46
|
+
"media.category.Archives": "压缩文件",
|
|
47
|
+
"media.category.Other": "其他",
|
|
48
|
+
"media.modifiedMonth": "修改月份",
|
|
49
|
+
"media.modifiedMonthHint": "文件系统中的修改月份(UTC),并非上传日期",
|
|
50
|
+
"media.allModifiedDates": "所有修改日期",
|
|
51
|
+
"media.refresh": "刷新",
|
|
52
|
+
"media.resetFilters": "重置筛选条件",
|
|
53
|
+
"media.searchMedia": "搜索媒体",
|
|
54
|
+
"media.searchMediaPlaceholder": "搜索媒体…",
|
|
55
|
+
"media.fileExtension": "文件",
|
|
56
|
+
"media.library": "媒体库",
|
|
57
|
+
"media.file": "文件",
|
|
58
|
+
"media.fileType": "类型",
|
|
59
|
+
"media.size": "大小",
|
|
60
|
+
"media.modifiedUtc": "修改时间(UTC)",
|
|
61
|
+
"media.loading": "正在加载媒体…",
|
|
62
|
+
"media.noMatches": "没有符合筛选条件的媒体。",
|
|
63
|
+
"media.emptyFolder": "此文件夹中暂无媒体。",
|
|
64
|
+
"media.editVideo": "编辑视频",
|
|
65
|
+
"media.addVideoLink": "添加视频链接",
|
|
66
|
+
"media.uploadMedia": "上传媒体",
|
|
67
|
+
"media.chooseVideo": "选择视频",
|
|
68
|
+
"media.chooseImage": "选择图片",
|
|
69
|
+
"media.editProviderVideo": "编辑 {provider} 视频",
|
|
70
|
+
"media.addProviderVideo": "添加 {provider} 视频",
|
|
71
|
+
"media.previewMedia": "预览媒体",
|
|
72
|
+
"media.close": "关闭",
|
|
73
|
+
"media.pdfPreview": "PDF 预览",
|
|
74
|
+
"media.textPreview": "文本预览",
|
|
75
|
+
"media.selectedImagePreview": "所选图片预览",
|
|
76
|
+
"media.displayName": "显示名称",
|
|
77
|
+
"media.mediaDisplayName": "媒体显示名称",
|
|
78
|
+
"media.decorativeAlt": "替代文本(装饰性图片请留空)",
|
|
79
|
+
"media.imageAlt": "图片替代文本",
|
|
80
|
+
"media.alt": "替代文本",
|
|
81
|
+
"media.mediaAlt": "媒体替代文本",
|
|
82
|
+
"media.title": "标题",
|
|
83
|
+
"media.imageTitle": "图片标题",
|
|
84
|
+
"media.mediaTitle": "媒体标题",
|
|
85
|
+
"media.description": "描述",
|
|
86
|
+
"media.imageDescription": "图片描述",
|
|
87
|
+
"media.mediaDescription": "媒体描述",
|
|
88
|
+
"media.author": "作者:{author}",
|
|
89
|
+
"media.localUser": "本地用户",
|
|
90
|
+
"media.videoUrl": "视频 URL",
|
|
91
|
+
"media.imageUrl": "图片 URL",
|
|
92
|
+
"media.captionOptional": "说明文字(可选)",
|
|
93
|
+
"media.descriptiveAlt": "替代文本(请描述图片;装饰性图片请留空)",
|
|
94
|
+
"media.videoCaption": "视频说明文字",
|
|
95
|
+
"media.muted": "静音",
|
|
96
|
+
"media.showControls": "显示播放控件",
|
|
97
|
+
"media.confirmUpload": "确认后会将此文件上传到仓库媒体文件夹。内容仍需点击“保存”。",
|
|
98
|
+
"media.confirmDownload": "确认后会将此文件下载到仓库媒体文件夹。内容仍需点击“保存”。",
|
|
99
|
+
"media.downloadFile": "下载文件",
|
|
100
|
+
"media.deleteFile": "删除文件",
|
|
101
|
+
"media.filePath": "媒体文件路径",
|
|
102
|
+
"media.cancel": "取消",
|
|
103
|
+
"media.saving": "正在保存…",
|
|
104
|
+
"media.save": "保存",
|
|
105
|
+
"media.back": "返回",
|
|
106
|
+
"media.done": "完成",
|
|
107
|
+
"media.uploadingVideo": "正在上传视频…",
|
|
108
|
+
"media.importingPhoto": "正在导入照片…",
|
|
109
|
+
"media.useVideo": "使用视频",
|
|
110
|
+
"media.uploadFile": "上传文件",
|
|
111
|
+
"media.importImage": "导入图片",
|
|
112
|
+
"media.videoSources": "视频来源",
|
|
113
|
+
"media.imageSources": "图片来源",
|
|
114
|
+
"media.source.library": "媒体库",
|
|
115
|
+
"media.source.upload": "上传",
|
|
116
|
+
"media.source.url": "URL",
|
|
117
|
+
"media.unsplashUploadsHint": "Unsplash API 照片必须使用源站链接,仅可插入内容中,不能上传到仓库。",
|
|
118
|
+
"media.providerLinkHint": "请粘贴 {provider} 链接。默认启用隐私增强模式。",
|
|
119
|
+
"media.accessibleTitle": "无障碍标题(可选)",
|
|
120
|
+
"media.privacyEnhanced": "隐私增强(播放前不使用 Cookie)",
|
|
121
|
+
"media.updateVideo": "更新视频",
|
|
122
|
+
"media.insert": "插入",
|
|
123
|
+
"media.localFileHint": "请选择本地文件,然后预览并确认。确认前不会上传任何文件。",
|
|
124
|
+
"media.uploadVideoLimit": "上传视频(MP4、WebM、MOV)· 最大 {limit} MB",
|
|
125
|
+
"media.uploadMediaLimit": "上传媒体(图片、音频、视频、文档、电子表格、压缩文件)· 最大 {limit} MB",
|
|
126
|
+
"media.uploadImageLimit": "上传图片(JPEG、PNG、WebP、GIF、AVIF)· 最大 {limit} MB",
|
|
127
|
+
"media.readOnlyUploads": "本地上传需要本地开发服务器。此媒体库为只读。",
|
|
128
|
+
"media.videoUrlPlaceholder": "https://… 或 /media/video.mp4",
|
|
129
|
+
"media.imageUrlPlaceholder": "https://… 或 /images/photo.jpg",
|
|
130
|
+
"media.useUrl": "使用此 URL",
|
|
131
|
+
"media.picsumHint": "来自 Lorem Picsum 的占位照片(按种子值获取,并非语义搜索)。",
|
|
132
|
+
"media.unsplashHint": "Unsplash 照片仍使用 Unsplash 源站链接;选择照片时会记录一次下载。",
|
|
133
|
+
"media.stockImportHint": "将所选照片导入媒体文件夹(仅限本地开发环境)。",
|
|
134
|
+
"media.searchPhotos": "搜索照片",
|
|
135
|
+
"media.searchPhotosPlaceholder": "搜索照片…",
|
|
136
|
+
"media.search": "搜索",
|
|
137
|
+
"media.noPhotos": "未找到照片。请尝试其他搜索词。",
|
|
138
|
+
"media.deleteTitle": "删除“{name}”?",
|
|
139
|
+
"media.deleteDescription": "此操作将永久删除文件及其元数据,且无法撤销。使用此文件的页面将出现媒体无法显示或链接失效的问题。",
|
|
140
|
+
"media.pexelsKeyPlaceholder": "例如 Ab3dE6fG9hJ2…",
|
|
141
|
+
"media.pixabayKeyPlaceholder": "例如 12345678-abcdef012345…",
|
|
142
|
+
"media.unsplashKeyPlaceholder": "例如 AbCdEf12_GhIjKl34…",
|
|
143
|
+
"media.providerStatus": "{provider} {status}",
|
|
144
|
+
"media.pixabayKeyRequired": "请在“设置 → 媒体”中添加 Pixabay API密钥",
|
|
145
|
+
"media.unsplashKeyRequired": "请在“设置”中添加 Unsplash API密钥",
|
|
146
|
+
"media.pexelsKeyRequired": "请在“设置 → 媒体”中添加 Pexels API密钥",
|
|
147
|
+
"media.unknownStockProvider": "未知的图库服务商",
|
|
148
|
+
"media.unexpectedStockUrl": "图库照片 URL 不符合预期",
|
|
149
|
+
"media.unsplashPhotoMissing": "缺少 Unsplash 照片或 API密钥",
|
|
150
|
+
"media.unsplashTrackingFailed": "Unsplash 下载跟踪失败({status})",
|
|
151
|
+
"media.unsafeImageUrl": "图片 URL 不安全",
|
|
152
|
+
"media.remoteRequiresHttps": "远程导入必须使用 HTTPS",
|
|
153
|
+
"media.unsplashHotlinkRequired": "Unsplash API 图片必须保留源站链接。请在内容图片选择器中使用 Unsplash。",
|
|
154
|
+
"media.imageDownloadFailed": "图片下载失败。来源必须允许浏览器下载(CORS);也可以改为上传图片文件。",
|
|
155
|
+
"media.photoDownloadFailed": "照片下载失败({status})",
|
|
156
|
+
"media.photoLimitExceeded": "照片超过 {limit} MB 的导入上限",
|
|
157
|
+
"media.chooseImageFormat": "请选择 JPEG、PNG 或 WebP 图片。",
|
|
158
|
+
"media.emptyDownload": "下载的图片为空",
|
|
159
|
+
"media.uploadFailed": "上传失败({status}):{body}",
|
|
160
|
+
"media.invalidUploadedUrl": "上传资源的 URL 无效",
|
|
161
|
+
"media.localImportRequired": "照片导入需要本地开发服务器",
|
|
162
|
+
"media.photoImportFailedStatus": "照片导入失败({status})",
|
|
163
|
+
"media.invalidImportedUrl": "导入照片的 URL 无效",
|
|
164
|
+
"media.providerVideo": "{provider} 视频",
|
|
165
|
+
"media.embedCaption": "{provider} · {title}"
|
|
166
|
+
}
|