@jjlmoya/utils-developer 1.29.1 → 1.31.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/package.json +70 -70
- package/src/category/seo.astro +1 -1
- package/src/components/PreviewNavSidebar.astro +1 -1
- package/src/components/PreviewToolbar.astro +1 -1
- package/src/data.ts +1 -1
- package/src/env.d.ts +1 -1
- package/src/layouts/PreviewLayout.astro +1 -1
- package/src/pages/[locale]/[slug].astro +162 -162
- package/src/pages/index.astro +1 -1
- package/src/tests/entry_contract.test.ts +8 -2
- package/src/tests/faq_count.test.ts +1 -1
- package/src/tests/i18n_coverage.test.ts +2 -6
- package/src/tests/inverted_punctuation.test.ts +113 -113
- package/src/tests/mocks/astro_mock.js +1 -1
- package/src/tests/no_h1_in_components.test.ts +1 -1
- package/src/tests/promote_this_website_i18n.test.ts +33 -0
- package/src/tests/slug_language_code_format.test.ts +25 -25
- package/src/tests/slug_uniqueness.test.ts +86 -86
- package/src/tests/tool_validation.test.ts +15 -15
- package/src/tool/aspectRatio/i18n/de.ts +164 -164
- package/src/tool/aspectRatio/i18n/ja.ts +1 -1
- package/src/tool/aspectRatio/i18n/ko.ts +1 -1
- package/src/tool/aspectRatio/i18n/pl.ts +164 -164
- package/src/tool/aspectRatio/i18n/ru.ts +164 -164
- package/src/tool/aspectRatio/i18n/zh.ts +165 -165
- package/src/tool/aspectRatio/seo.astro +15 -15
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +144 -144
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +143 -143
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +144 -144
- package/src/tool/calculadoraTiempoDatos/seo.astro +15 -15
- package/src/tool/colorConverter/i18n/de.ts +120 -120
- package/src/tool/colorConverter/i18n/ja.ts +1 -1
- package/src/tool/colorConverter/i18n/ko.ts +1 -1
- package/src/tool/colorConverter/i18n/ru.ts +120 -120
- package/src/tool/colorConverter/i18n/zh.ts +1 -1
- package/src/tool/colorConverter/seo.astro +15 -15
- package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +124 -124
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +124 -124
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +125 -125
- package/src/tool/conversorExcelCsvHtml/seo.astro +15 -15
- package/src/tool/cronGenerator/i18n/ja.ts +1 -1
- package/src/tool/cronGenerator/i18n/ko.ts +1 -1
- package/src/tool/cronGenerator/i18n/zh.ts +183 -183
- package/src/tool/cronGenerator/seo.astro +15 -15
- package/src/tool/cssSpecificityCalculator/i18n/ja.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/ko.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/zh.ts +1 -1
- package/src/tool/cssSpecificityCalculator/seo.astro +15 -15
- package/src/tool/cssToInlineConverter/i18n/ja.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/ko.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/zh.ts +1 -1
- package/src/tool/cssToInlineConverter/seo.astro +15 -15
- package/src/tool/duplicateCssRemover/i18n/ja.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/ko.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/zh.ts +1 -1
- package/src/tool/duplicateCssRemover/seo.astro +15 -15
- package/src/tool/generadorSecurityTxt/i18n/ja.ts +1 -1
- package/src/tool/generadorSecurityTxt/i18n/ko.ts +1 -1
- package/src/tool/generadorSecurityTxt/i18n/zh.ts +1 -1
- package/src/tool/generadorSecurityTxt/seo.astro +15 -15
- package/src/tool/hashGenerator/i18n/ja.ts +1 -1
- package/src/tool/hashGenerator/i18n/ko.ts +1 -1
- package/src/tool/hashGenerator/seo.astro +15 -15
- package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +1 -1
- package/src/tool/inspectorCertificadosSsl/seo.astro +15 -15
- package/src/tool/jsonFormatter/seo.astro +15 -15
- package/src/tool/jwtDecoder/i18n/es.ts +248 -248
- package/src/tool/jwtDecoder/i18n/fr.ts +248 -248
- package/src/tool/jwtDecoder/i18n/tr.ts +248 -248
- package/src/tool/keycode/seo.astro +15 -15
- package/src/tool/llmCostCalculator/i18n/fr.ts +149 -149
- package/src/tool/llmCostCalculator/i18n/ja.ts +1 -1
- package/src/tool/llmCostCalculator/i18n/ko.ts +1 -1
- package/src/tool/llmCostCalculator/seo.astro +15 -15
- package/src/tool/mobileMockupGenerator/i18n/ja.ts +1 -1
- package/src/tool/mobileMockupGenerator/i18n/ko.ts +1 -1
- package/src/tool/mobileMockupGenerator/i18n/zh.ts +1 -1
- package/src/tool/mobileMockupGenerator/seo.astro +15 -15
- package/src/tool/musicalTypography/i18n/ja.ts +1 -1
- package/src/tool/musicalTypography/i18n/ko.ts +1 -1
- package/src/tool/musicalTypography/i18n/zh.ts +1 -1
- package/src/tool/musicalTypography/seo.astro +15 -15
- package/src/tool/placeholderGenerator/i18n/ja.ts +1 -1
- package/src/tool/placeholderGenerator/i18n/ko.ts +1 -1
- package/src/tool/placeholderGenerator/i18n/zh.ts +1 -1
- package/src/tool/placeholderGenerator/seo.astro +15 -15
- package/src/tool/promoteThisWebsite/entry.ts +13 -0
- package/src/tool/promoteThisWebsite/i18n/de.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/fr.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/id.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/it.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ja.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ko.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/nl.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/pl.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/pt.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/ru.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/sv.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/tr.ts +95 -0
- package/src/tool/promoteThisWebsite/i18n/zh.ts +95 -0
- package/src/tool/promptLibrary/i18n/ja.ts +1 -1
- package/src/tool/promptLibrary/i18n/ko.ts +1 -1
- package/src/tool/promptLibrary/i18n/zh.ts +1 -1
- package/src/tool/promptLibrary/seo.astro +15 -15
- package/src/tool/readabilityCalculator/i18n/ja.ts +1 -1
- package/src/tool/readabilityCalculator/i18n/ko.ts +1 -1
- package/src/tool/readabilityCalculator/i18n/zh.ts +1 -1
- package/src/tool/readabilityCalculator/seo.astro +15 -15
- package/src/tool/serpPixelSimulator/entry.ts +30 -30
- package/src/tool/serpPixelSimulator/i18n/en.ts +211 -211
- package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -214
- package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -214
- package/src/tool/serpPixelSimulator/logic.ts +18 -18
- package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +195 -195
- package/src/tool/svgSanitizer/i18n/ja.ts +1 -1
- package/src/tool/svgSanitizer/i18n/ko.ts +1 -1
- package/src/tool/svgSanitizer/seo.astro +15 -15
- package/src/tool/svgToCss/i18n/ja.ts +1 -1
- package/src/tool/svgToCss/i18n/ko.ts +1 -1
- package/src/tool/svgToCss/seo.astro +15 -15
- package/src/tool/urlCleaner/i18n/ja.ts +1 -1
- package/src/tool/urlCleaner/i18n/ko.ts +1 -1
- package/src/tool/urlCleaner/i18n/zh.ts +1 -1
- package/src/tool/urlCleaner/seo.astro +15 -15
- package/src/tool/urlEncoderDecoder/i18n/es.ts +146 -146
- package/src/tool/urlEncoderDecoder/i18n/ko.ts +1 -1
- package/src/tool/urlEncoderDecoder/seo.astro +15 -15
- package/src/tool/utmGenerator/i18n/ja.ts +1 -1
- package/src/tool/utmGenerator/i18n/ko.ts +1 -1
- package/src/tool/utmGenerator/i18n/zh.ts +1 -1
- package/src/tool/utmGenerator/seo.astro +15 -15
- package/src/types.ts +1 -1
|
@@ -1,184 +1,184 @@
|
|
|
1
1
|
import { bibliography } from '../bibliography';
|
|
2
|
-
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
3
|
-
import type { ToolLocaleContent } from '../../../types';
|
|
4
|
-
import type { CronGeneratorUI } from '../ui';
|
|
5
|
-
|
|
6
|
-
const slug = 'cron';
|
|
7
|
-
const title = '在线 Cron 表达式生成器:翻译与可视化';
|
|
8
|
-
const description =
|
|
9
|
-
'免费的 Linux Cron 表达式生成工具。将 * * * * * 翻译成人类语言,并实时显示接下来的 5 次执行时间。';
|
|
10
|
-
|
|
11
|
-
const faqData = [
|
|
12
|
-
{
|
|
13
|
-
question: '什么是 Cron 表达式?',
|
|
14
|
-
answer:
|
|
15
|
-
'它是一个文本字符串,代表类 Unix 系统(Linux、macOS)上自动任务的执行计划。它由 5 个字段组成,分别定义分钟、小时、日期、月份和星期。',
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
question: '它是否兼容所有系统?',
|
|
19
|
-
answer:
|
|
20
|
-
'是的,生成的表达式遵循 POSIX 标准,兼容 Linux Crontab、macOS cron 以及 AWS CloudWatch 或 GitHub Actions 等云服务。',
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
question: 'Cron 中的星号 (*) 是什么意思?',
|
|
24
|
-
answer:
|
|
25
|
-
'星号是一个通配符,表示"所有"。例如,分钟字段中的 * 表示任务将在定义范围内的每分钟运行。',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
question: '如何检查即将进行的执行?',
|
|
29
|
-
answer:
|
|
30
|
-
'该工具包含一个实时查看器,可根据当前表达式准确显示任务下次运行的 5 个日期和时间。',
|
|
31
|
-
},
|
|
32
|
-
];
|
|
33
|
-
|
|
34
|
-
const howToData = [
|
|
35
|
-
{
|
|
36
|
-
name: '选择时间间隔',
|
|
37
|
-
text: '使用快速预设(每分钟、每小时、每日等)选择您希望任务运行的频率。',
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
name: '配置高级细节',
|
|
41
|
-
text: '切换到"高级"选项卡,手动定义具体的分钟、小时或特定的星期。',
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: '验证翻译和日期',
|
|
45
|
-
text: '阅读人类语言描述并检查接下来的 5 次执行,以确认计划是否正确。',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: '复制表达式',
|
|
49
|
-
text: '复制生成的字符串并将其直接粘贴到您的 crontab 文件或服务器配置中。',
|
|
50
|
-
},
|
|
51
|
-
];
|
|
52
|
-
|
|
53
|
-
const faqSchema: WithContext<FAQPage> = {
|
|
54
|
-
'@context': 'https://schema.org',
|
|
55
|
-
'@type': 'FAQPage',
|
|
56
|
-
mainEntity: faqData.map((item) => ({
|
|
57
|
-
'@type': 'Question',
|
|
58
|
-
name: item.question,
|
|
59
|
-
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
60
|
-
})),
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const howToSchema: WithContext<HowToThing> = {
|
|
64
|
-
'@context': 'https://schema.org',
|
|
65
|
-
'@type': 'HowTo',
|
|
66
|
-
name: title,
|
|
67
|
-
description,
|
|
68
|
-
step: howToData.map((step, i) => ({
|
|
69
|
-
'@type': 'HowToStep',
|
|
70
|
-
position: i + 1,
|
|
71
|
-
name: step.name,
|
|
72
|
-
text: step.text,
|
|
73
|
-
})),
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const appSchema: WithContext<SoftwareApplication> = {
|
|
77
|
-
'@context': 'https://schema.org',
|
|
78
|
-
'@type': 'SoftwareApplication',
|
|
79
|
-
name: title,
|
|
80
|
-
description,
|
|
81
|
-
applicationCategory: 'UtilityApplication',
|
|
82
|
-
operatingSystem: 'All',
|
|
83
|
-
offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
|
|
84
|
-
inLanguage: 'zh',
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const ui: CronGeneratorUI = {
|
|
88
|
-
labelMinute: '分钟',
|
|
89
|
-
labelHour: '小时',
|
|
90
|
-
labelDom: '日期 (月)',
|
|
91
|
-
labelMonth: '月份',
|
|
92
|
-
labelDow: '星期 (周)',
|
|
93
|
-
tabQuick: '快速',
|
|
94
|
-
tabAdvanced: '高级',
|
|
95
|
-
fieldMinute: '分钟 (0-59)',
|
|
96
|
-
fieldHour: '小时 (0-23)',
|
|
97
|
-
fieldDom: '一个月中的第几天 (1-31)',
|
|
98
|
-
fieldMonth: '月份 (1-12)',
|
|
99
|
-
fieldDow: '一星期中的第几天 (0-6)',
|
|
100
|
-
hintMinute: '例如:*, */5, 0,30',
|
|
101
|
-
hintDow: '0 = 星期日, 6 = 星期六',
|
|
102
|
-
labelNextRuns: '下次执行计划',
|
|
103
|
-
btnCopy: '复制表达式',
|
|
104
|
-
btnCopied: '已复制!',
|
|
105
|
-
msgNoRuns: '在合理范围内未发现即将进行的执行。',
|
|
106
|
-
msgError: '计算日期时出错。',
|
|
107
|
-
presetEveryMinute: '每分钟',
|
|
108
|
-
presetEveryHour: '每小时',
|
|
109
|
-
presetDaily: '每日',
|
|
110
|
-
presetWeekly: '每周',
|
|
111
|
-
presetMonthly: '每月',
|
|
112
|
-
presetYearly: '每年',
|
|
113
|
-
descEveryMinute: '每分钟运行一次',
|
|
114
|
-
descEveryHour: '每小时开始时运行',
|
|
115
|
-
descEveryDay: '每天午夜运行',
|
|
116
|
-
descPrefix: '运行时间:',
|
|
117
|
-
descEveryMin: '每分钟',
|
|
118
|
-
descEveryHourOnDot: '每整点',
|
|
119
|
-
descAtMinute: '每小时的第 {m} 分钟',
|
|
120
|
-
descAtTime: '{h}:{m}',
|
|
121
|
-
descOnDay: ' 每月的第 {d} 天',
|
|
122
|
-
descInMonth: ' 第 {mon} 个月',
|
|
123
|
-
descIfDow: ' 如果是星期 {d} (0=周日, 6=周六)',
|
|
124
|
-
descDays: '星期日,星期一,星期二,星期三,星期四,星期五,星期六',
|
|
125
|
-
descInvalid: '无效的表达式',
|
|
126
|
-
timeNow: '现在',
|
|
127
|
-
timeMin: '分',
|
|
128
|
-
timeHour: '小时',
|
|
129
|
-
timeDays: '天',
|
|
130
|
-
locale: 'zh-CN',
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
export const content: ToolLocaleContent<CronGeneratorUI> = {
|
|
134
|
-
slug,
|
|
135
|
-
title,
|
|
136
|
-
description,
|
|
137
|
-
ui,
|
|
138
|
-
faqTitle: '常见问题',
|
|
139
|
-
faq: faqData,
|
|
140
|
-
bibliographyTitle: '参考资料与文档',
|
|
141
|
-
bibliography,
|
|
142
|
-
howTo: howToData,
|
|
143
|
-
schemas: [faqSchema, howToSchema, appSchema],
|
|
144
|
-
seo: [
|
|
145
|
-
{
|
|
146
|
-
type: 'title',
|
|
147
|
-
text: 'Cron 在现代自动化中的重要性',
|
|
148
|
-
level: 2,
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
type: 'paragraph',
|
|
152
|
-
html: '虽然我们生活在<em>无服务器</em>架构和云工作流的时代,但 <strong>Crontab</strong> 系统仍然是全球技术基础设施的支柱。从小型博客到庞大的银行基础设施,任务调度是保持数字世界运行的重要机制。',
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
type: 'title',
|
|
156
|
-
text: 'Cron 表达式的剖析',
|
|
157
|
-
level: 3,
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
type: 'list',
|
|
161
|
-
items: [
|
|
162
|
-
'<strong>字段 1 - 分钟 (0-59):</strong> 任务在一小时内的什么时候开始。',
|
|
163
|
-
'<strong>字段 2 - 小时 (0-23):</strong> 需要使用 24 小时制格式。',
|
|
164
|
-
'<strong>字段 3 - 一个月中的第几天 (1-31):</strong> 特定的日历日期。',
|
|
165
|
-
'<strong>字段 4 - 月份 (1-12):</strong> 从一月到十二月。',
|
|
166
|
-
'<strong>字段 5 - 一星期中的第几天 (0-6):</strong> 0 通常表示星期日。',
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
type: 'title',
|
|
171
|
-
text: '特殊操作符与常见错误',
|
|
172
|
-
level: 3,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
type: 'tip',
|
|
176
|
-
html: '使用斜杠 <code>/</code> 来定义步进:在分钟字段中 <code>*/5</code> 表示每 5 分钟运行一次。逗号 <code>,</code> 用于创建列表 (<code>1,3,5</code>),连字符 <code>-</code> 用于定义范围 (<code>1-5</code>)。',
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
type: 'paragraph',
|
|
180
|
-
html: '90% 的服务器运行在 <strong>UTC</strong> 时间。如果您按照当地时区计划在凌晨 02:00 运行任务,它可能会在意外的时间执行。此外,Cron 无法直接访问您的 <code>$PATH</code> 变量 - 请始终使用绝对路径,例如 <code>/usr/local/bin/node</code>。',
|
|
181
|
-
},
|
|
182
|
-
],
|
|
183
|
-
};
|
|
184
|
-
|
|
2
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
4
|
+
import type { CronGeneratorUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const slug = 'cron';
|
|
7
|
+
const title = '在线 Cron 表达式生成器:翻译与可视化';
|
|
8
|
+
const description =
|
|
9
|
+
'免费的 Linux Cron 表达式生成工具。将 * * * * * 翻译成人类语言,并实时显示接下来的 5 次执行时间。';
|
|
10
|
+
|
|
11
|
+
const faqData = [
|
|
12
|
+
{
|
|
13
|
+
question: '什么是 Cron 表达式?',
|
|
14
|
+
answer:
|
|
15
|
+
'它是一个文本字符串,代表类 Unix 系统(Linux、macOS)上自动任务的执行计划。它由 5 个字段组成,分别定义分钟、小时、日期、月份和星期。',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: '它是否兼容所有系统?',
|
|
19
|
+
answer:
|
|
20
|
+
'是的,生成的表达式遵循 POSIX 标准,兼容 Linux Crontab、macOS cron 以及 AWS CloudWatch 或 GitHub Actions 等云服务。',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Cron 中的星号 (*) 是什么意思?',
|
|
24
|
+
answer:
|
|
25
|
+
'星号是一个通配符,表示"所有"。例如,分钟字段中的 * 表示任务将在定义范围内的每分钟运行。',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: '如何检查即将进行的执行?',
|
|
29
|
+
answer:
|
|
30
|
+
'该工具包含一个实时查看器,可根据当前表达式准确显示任务下次运行的 5 个日期和时间。',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const howToData = [
|
|
35
|
+
{
|
|
36
|
+
name: '选择时间间隔',
|
|
37
|
+
text: '使用快速预设(每分钟、每小时、每日等)选择您希望任务运行的频率。',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: '配置高级细节',
|
|
41
|
+
text: '切换到"高级"选项卡,手动定义具体的分钟、小时或特定的星期。',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: '验证翻译和日期',
|
|
45
|
+
text: '阅读人类语言描述并检查接下来的 5 次执行,以确认计划是否正确。',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: '复制表达式',
|
|
49
|
+
text: '复制生成的字符串并将其直接粘贴到您的 crontab 文件或服务器配置中。',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'FAQPage',
|
|
56
|
+
mainEntity: faqData.map((item) => ({
|
|
57
|
+
'@type': 'Question',
|
|
58
|
+
name: item.question,
|
|
59
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
60
|
+
})),
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
64
|
+
'@context': 'https://schema.org',
|
|
65
|
+
'@type': 'HowTo',
|
|
66
|
+
name: title,
|
|
67
|
+
description,
|
|
68
|
+
step: howToData.map((step, i) => ({
|
|
69
|
+
'@type': 'HowToStep',
|
|
70
|
+
position: i + 1,
|
|
71
|
+
name: step.name,
|
|
72
|
+
text: step.text,
|
|
73
|
+
})),
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
77
|
+
'@context': 'https://schema.org',
|
|
78
|
+
'@type': 'SoftwareApplication',
|
|
79
|
+
name: title,
|
|
80
|
+
description,
|
|
81
|
+
applicationCategory: 'UtilityApplication',
|
|
82
|
+
operatingSystem: 'All',
|
|
83
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
|
|
84
|
+
inLanguage: 'zh',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const ui: CronGeneratorUI = {
|
|
88
|
+
labelMinute: '分钟',
|
|
89
|
+
labelHour: '小时',
|
|
90
|
+
labelDom: '日期 (月)',
|
|
91
|
+
labelMonth: '月份',
|
|
92
|
+
labelDow: '星期 (周)',
|
|
93
|
+
tabQuick: '快速',
|
|
94
|
+
tabAdvanced: '高级',
|
|
95
|
+
fieldMinute: '分钟 (0-59)',
|
|
96
|
+
fieldHour: '小时 (0-23)',
|
|
97
|
+
fieldDom: '一个月中的第几天 (1-31)',
|
|
98
|
+
fieldMonth: '月份 (1-12)',
|
|
99
|
+
fieldDow: '一星期中的第几天 (0-6)',
|
|
100
|
+
hintMinute: '例如:*, */5, 0,30',
|
|
101
|
+
hintDow: '0 = 星期日, 6 = 星期六',
|
|
102
|
+
labelNextRuns: '下次执行计划',
|
|
103
|
+
btnCopy: '复制表达式',
|
|
104
|
+
btnCopied: '已复制!',
|
|
105
|
+
msgNoRuns: '在合理范围内未发现即将进行的执行。',
|
|
106
|
+
msgError: '计算日期时出错。',
|
|
107
|
+
presetEveryMinute: '每分钟',
|
|
108
|
+
presetEveryHour: '每小时',
|
|
109
|
+
presetDaily: '每日',
|
|
110
|
+
presetWeekly: '每周',
|
|
111
|
+
presetMonthly: '每月',
|
|
112
|
+
presetYearly: '每年',
|
|
113
|
+
descEveryMinute: '每分钟运行一次',
|
|
114
|
+
descEveryHour: '每小时开始时运行',
|
|
115
|
+
descEveryDay: '每天午夜运行',
|
|
116
|
+
descPrefix: '运行时间:',
|
|
117
|
+
descEveryMin: '每分钟',
|
|
118
|
+
descEveryHourOnDot: '每整点',
|
|
119
|
+
descAtMinute: '每小时的第 {m} 分钟',
|
|
120
|
+
descAtTime: '{h}:{m}',
|
|
121
|
+
descOnDay: ' 每月的第 {d} 天',
|
|
122
|
+
descInMonth: ' 第 {mon} 个月',
|
|
123
|
+
descIfDow: ' 如果是星期 {d} (0=周日, 6=周六)',
|
|
124
|
+
descDays: '星期日,星期一,星期二,星期三,星期四,星期五,星期六',
|
|
125
|
+
descInvalid: '无效的表达式',
|
|
126
|
+
timeNow: '现在',
|
|
127
|
+
timeMin: '分',
|
|
128
|
+
timeHour: '小时',
|
|
129
|
+
timeDays: '天',
|
|
130
|
+
locale: 'zh-CN',
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export const content: ToolLocaleContent<CronGeneratorUI> = {
|
|
134
|
+
slug,
|
|
135
|
+
title,
|
|
136
|
+
description,
|
|
137
|
+
ui,
|
|
138
|
+
faqTitle: '常见问题',
|
|
139
|
+
faq: faqData,
|
|
140
|
+
bibliographyTitle: '参考资料与文档',
|
|
141
|
+
bibliography,
|
|
142
|
+
howTo: howToData,
|
|
143
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
144
|
+
seo: [
|
|
145
|
+
{
|
|
146
|
+
type: 'title',
|
|
147
|
+
text: 'Cron 在现代自动化中的重要性',
|
|
148
|
+
level: 2,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'paragraph',
|
|
152
|
+
html: '虽然我们生活在<em>无服务器</em>架构和云工作流的时代,但 <strong>Crontab</strong> 系统仍然是全球技术基础设施的支柱。从小型博客到庞大的银行基础设施,任务调度是保持数字世界运行的重要机制。',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'Cron 表达式的剖析',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'list',
|
|
161
|
+
items: [
|
|
162
|
+
'<strong>字段 1 - 分钟 (0-59):</strong> 任务在一小时内的什么时候开始。',
|
|
163
|
+
'<strong>字段 2 - 小时 (0-23):</strong> 需要使用 24 小时制格式。',
|
|
164
|
+
'<strong>字段 3 - 一个月中的第几天 (1-31):</strong> 特定的日历日期。',
|
|
165
|
+
'<strong>字段 4 - 月份 (1-12):</strong> 从一月到十二月。',
|
|
166
|
+
'<strong>字段 5 - 一星期中的第几天 (0-6):</strong> 0 通常表示星期日。',
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'title',
|
|
171
|
+
text: '特殊操作符与常见错误',
|
|
172
|
+
level: 3,
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: 'tip',
|
|
176
|
+
html: '使用斜杠 <code>/</code> 来定义步进:在分钟字段中 <code>*/5</code> 表示每 5 分钟运行一次。逗号 <code>,</code> 用于创建列表 (<code>1,3,5</code>),连字符 <code>-</code> 用于定义范围 (<code>1-5</code>)。',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
type: 'paragraph',
|
|
180
|
+
html: '90% 的服务器运行在 <strong>UTC</strong> 时间。如果您按照当地时区计划在凌晨 02:00 运行任务,它可能会在意外的时间执行。此外,Cron 无法直接访问您的 <code>$PATH</code> 变量 - 请始终使用绝对路径,例如 <code>/usr/local/bin/node</code>。',
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { cronGenerator } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await cronGenerator.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { cronGenerator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await cronGenerator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { cssSpecificityCalculator } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await cssSpecificityCalculator.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { cssSpecificityCalculator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await cssSpecificityCalculator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { cssToInlineConverter } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await cssToInlineConverter.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { cssToInlineConverter } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await cssToInlineConverter.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { duplicateCssRemover } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await duplicateCssRemover.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { duplicateCssRemover } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await duplicateCssRemover.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import { generadorSecurityTxt } from './index';
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const content = await generadorSecurityTxt.i18n[locale]?.();
|
|
12
|
-
if (!content) return null;
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { generadorSecurityTxt } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await generadorSecurityTxt.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|