Skip to content

Commit 3929847

Browse files
committed
i18n(ru): translate 'recipes/modified-time.mdx'
1 parent c06f716 commit 3929847

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
---
2+
title: Добавьте время последнего изменения
3+
description: Создайте плагин remark, чтобы добавить время последнего изменения к своим Markdown и MDX.
4+
i18nReady: true
5+
type: recipe
6+
---
7+
import { Steps } from '@astrojs/starlight/components';
8+
import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro';
9+
10+
Узнайте как создать [плагин remark](https://github.com/remarkjs/remark), который добавляет время последнего изменения к frontmatter ваших Markdown и MDX файлов. Используйте это свойство для отображения времени последнего изменения на ваших страницах.
11+
12+
:::note[Использует историю Git]
13+
Этот рецепт вычисляет время на основе истории Git вашего репозитория и может быть неточным на некоторых платформах. Ваш хостинг может выполнять **shallow clones**, которые не получают полную историю Git.
14+
:::
15+
16+
## Рецепт
17+
18+
<Steps>
19+
1. Установите необходимые пакеты
20+
21+
Установите [`Day.js`](https://www.npmjs.com/package/dayjs) для модификации и форматирования времени:
22+
23+
<PackageManagerTabs>
24+
<Fragment slot="npm">
25+
```shell
26+
npm install dayjs
27+
```
28+
</Fragment>
29+
<Fragment slot="pnpm">
30+
```shell
31+
pnpm add dayjs
32+
```
33+
</Fragment>
34+
<Fragment slot="yarn">
35+
```shell
36+
yarn add dayjs
37+
```
38+
</Fragment>
39+
</PackageManagerTabs>
40+
41+
2. Создайте плагин Remark
42+
43+
Этот плагин использует `execSync` для запуска комманды Git, которая возвращает временную метку последнего коммита в формате ISO 8601. Далее временная метка добавляется к frontmatter файла.
44+
45+
```js title="remark-modified-time.mjs"
46+
import { execSync } from "child_process";
47+
48+
export function remarkModifiedTime() {
49+
return function (tree, file) {
50+
const filepath = file.history[0];
51+
const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`);
52+
file.data.astro.frontmatter.lastModified = result.toString();
53+
};
54+
}
55+
```
56+
<details>
57+
<summary>Исполтзование файловой системы вместо Git</summary>
58+
59+
Хотя использование Git является рекомендуемым способом получения времени последнего изменения, возможно использование времени последнего изменения из файловой системы.
60+
Этот плагин использует `statSync` для получения `mtime` (время изменения) файла в формате ISO 8601. Далее временная метка добавляется к frontmatter файла.
61+
62+
```js title="remark-modified-time.mjs"
63+
import { statSync } from "fs";
64+
65+
export function remarkModifiedTime() {
66+
return function (tree, file) {
67+
const filepath = file.history[0];
68+
const result = statSync(filepath);
69+
file.data.astro.frontmatter.lastModified = result.mtime.toISOString();
70+
};
71+
}
72+
```
73+
</details>
74+
75+
3. Добавьте плагин в свой конфиг
76+
77+
```js title="astro.config.mjs"
78+
import { defineConfig } from 'astro/config';
79+
import { remarkModifiedTime } from './remark-modified-time.mjs';
80+
81+
export default defineConfig({
82+
markdown: {
83+
remarkPlugins: [remarkModifiedTime],
84+
},
85+
});
86+
```
87+
88+
Сейчас все документы Markdown будут иметь свойство `lastModified` в своём frontmatter.
89+
90+
4. Отобразите времени последнего изменения
91+
92+
Если ваш контент находится в [коллекции контента](/ru/guides/content-collections/), получите `remarkPluginFrontmatter` из функции `render(entry)`. Далее, отобразите `lastModified` в вашем шаблоне там, где вы хотите.
93+
94+
```astro title="src/pages/posts/[slug].astro" {3-4,6,17,19-21,28}
95+
---
96+
import { getCollection, render } from 'astro:content';
97+
import dayjs from "dayjs";
98+
import utc from "dayjs/plugin/utc";
99+
100+
dayjs.extend(utc);
101+
102+
export async function getStaticPaths() {
103+
const blog = await getCollection('blog');
104+
return blog.map(entry => ({
105+
params: { slug: entry.id },
106+
props: { entry },
107+
}));
108+
}
109+
110+
const { entry } = Astro.props;
111+
const { Content, remarkPluginFrontmatter } = await render(entry);
112+
113+
const lastModified = dayjs(remarkPluginFrontmatter.lastModified)
114+
.utc()
115+
.format("HH:mm:ss DD MMMM YYYY UTC");
116+
---
117+
118+
<html>
119+
<head>...</head>
120+
<body>
121+
...
122+
<p>Last Modified: {lastModified}</p>
123+
...
124+
</body>
125+
</html>
126+
```
127+
128+
Если вы используете [макет Markdown](/ru/basics/layouts/#markdown-layouts), используйте свойство frontmatter `lastModified` из `Astro.props` в вашем шаблоне макета.
129+
130+
```astro title="src/layouts/BlogLayout.astro" {2-3,5,7-9,15}
131+
---
132+
import dayjs from "dayjs";
133+
import utc from "dayjs/plugin/utc";
134+
135+
dayjs.extend(utc);
136+
137+
const lastModified = dayjs()
138+
.utc(Astro.props.frontmatter.lastModified)
139+
.format("HH:mm:ss DD MMMM YYYY UTC");
140+
---
141+
142+
<html>
143+
<head>...</head>
144+
<body>
145+
<p>{lastModified}</p>
146+
<slot />
147+
</body>
148+
</html>
149+
```
150+
</Steps>

0 commit comments

Comments
 (0)