core-maugli 1.2.19 → 1.2.21

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 CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "core-maugli",
3
3
  "description": "Astro & Tailwind CSS blog theme for Maugli.",
4
4
  "type": "module",
5
- "version": "1.2.19",
5
+ "version": "1.2.21",
6
6
  "license": "GPL-3.0-or-later OR Commercial",
7
7
  "repository": {
8
8
  "type": "git",
@@ -1,7 +1,9 @@
1
1
  ---
2
- import { getFilteredCollection } from '../utils/content-loader';
3
- import siteConfig from '../data/site-config.ts';
2
+ import type { CollectionEntry } from 'astro:content';
4
3
  import '../styles/global.css';
4
+ import { getFilteredCollection } from '../utils/content-loader';
5
+ import siteConfig from '../data/site-config';
6
+ import { getAbsoluteLocaleUrl, getRelativeLocaleUrl } from 'astro:i18n';
5
7
  // Определи тип выше:
6
8
  export type ImageMimeType = 'image/jpeg' | 'image/png' | 'image/webp';
7
9
 
@@ -86,6 +88,50 @@ let defaultAuthorName = defaultAuthor.data.name;
86
88
  <meta name="robots" content="index, follow" />
87
89
  <meta name="generator" content={Astro.generator} />
88
90
 
91
+ <!-- Critical CSS Inline for Performance -->
92
+ <style>
93
+ :root {
94
+ --brand-color-rgb: 12, 191, 17;
95
+ --brand-color: rgb(var(--brand-color-rgb));
96
+ --text-main: #111c2d;
97
+ --text-heading: #3b5174;
98
+ --text-muted: #6b7280;
99
+ --bg-main: #ffffff;
100
+ --bg-muted: rgba(237, 241, 247, 0.621);
101
+ --border-main: rgba(17, 28, 44, 0.13);
102
+ --font-sans: 'Inter Variable', sans-serif;
103
+ --font-serif: 'Geologica Variable', sans-serif;
104
+ }
105
+ html.dark {
106
+ --brand-color-rgb: 13, 211, 18;
107
+ --brand-color: rgb(var(--brand-color-rgb));
108
+ --text-main: #ffffff;
109
+ --text-heading: rgba(202, 252, 254, 0.7);
110
+ --text-muted: #9ca3af;
111
+ --bg-main: #0b131e;
112
+ --bg-muted: #131d2cde;
113
+ --border-main: rgba(51, 66, 66, 0.6);
114
+ }
115
+ body {
116
+ font-family: var(--font-sans);
117
+ color: var(--text-main);
118
+ background-color: var(--bg-main);
119
+ margin: 0;
120
+ line-height: 1.5;
121
+ }
122
+ * {
123
+ box-sizing: border-box;
124
+ }
125
+ </style>
126
+
127
+ <!-- Font Preloading for Performance -->
128
+ <link rel="preload" href="/_astro/inter-wght.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
129
+ <link rel="preload" href="/_astro/geologica-wght.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
130
+ <noscript>
131
+ <link rel="stylesheet" href="/_astro/inter-wght.css" />
132
+ <link rel="stylesheet" href="/_astro/geologica-wght.css" />
133
+ </noscript>
134
+
89
135
  <!-- SEO -->
90
136
  <meta name="description" content={seoDescription} />
91
137
  <meta name="keywords" content={seoKeywords} />
@@ -108,8 +154,8 @@ let defaultAuthorName = defaultAuthor.data.name;
108
154
  <meta property="og:description" content={seoDescription} />
109
155
  {resolvedImage?.src && <meta property="og:image" content={resolvedImage.src} />}
110
156
  {resolvedImage?.alt && <meta property="og:image:alt" content={resolvedImage.alt} />}
111
- {typeof resolvedImage?.width !== 'undefined' && <meta property="og:image:width" content={resolvedImage.width} />}
112
- {typeof resolvedImage?.height !== 'undefined' && <meta property="og:image:height" content={resolvedImage.height} />}
157
+ {typeof resolvedImage?.width !== 'undefined' && <meta property="og:image:width" content={resolvedImage.width.toString()} />}
158
+ {typeof resolvedImage?.height !== 'undefined' && <meta property="og:image:height" content={resolvedImage.height.toString()} />}
113
159
  {resolvedImage?.type && <meta property="og:image:type" content={resolvedImage.type} />}
114
160
 
115
161
  <!-- X/Twitter -->
@@ -43,25 +43,25 @@ function getResponsiveImages(imagePath: string) {
43
43
  // Проверяем существование адаптивных версий
44
44
  const __filename = fileURLToPath(import.meta.url);
45
45
  const projectRoot = path.resolve(path.dirname(__filename), '../..');
46
-
46
+
47
47
  const variants = [
48
48
  { suffix: '-400', width: '400w' },
49
49
  { suffix: '-800', width: '800w' },
50
50
  { suffix: '-1200', width: '1200w' }
51
51
  ];
52
-
52
+
53
53
  const srcsetItems = [];
54
-
54
+
55
55
  // Добавляем адаптивные версии, если они существуют
56
56
  for (const variant of variants) {
57
57
  const variantPath = `${basePath}${variant.suffix}${extension}`;
58
58
  const filePath = path.join(projectRoot, 'public', variantPath.replace(/^\//, ''));
59
-
59
+
60
60
  if (fs.existsSync(filePath)) {
61
61
  srcsetItems.push(`${variantPath} ${variant.width}`);
62
62
  }
63
63
  }
64
-
64
+
65
65
  // Всегда добавляем оригинальное изображение
66
66
  srcsetItems.push(`${imagePath} 1200w`);
67
67
 
@@ -109,7 +109,18 @@ const copyrightYears = yearStart === yearEnd ? `${yearStart}` : `${yearStart}–
109
109
  ]}
110
110
  >
111
111
  <div class="flex flex-row justify-between items-end w-full mt-2">
112
- <img src="/footerlabel.svg" alt="Maugli Label" style="height:32px;width:auto;" loading="lazy" decoding="async" />
112
+ <div class="flex flex-col items-start gap-1">
113
+ <img src="/footerlabel.svg" alt="Maugli Label" style="height:32px;width:auto;" loading="lazy" decoding="async" />
114
+ <a
115
+ href="https://www.npmjs.com/package/core-maugli"
116
+ target="_blank"
117
+ rel="noopener noreferrer"
118
+ class="footer-link text-xs opacity-60 hover:opacity-100"
119
+ style="color:var(--text-muted);font-family:var(--font-sans);"
120
+ >
121
+ npm package
122
+ </a>
123
+ </div>
113
124
  {
114
125
  Object.values(maugliConfig.links || {}).some(Boolean) && (
115
126
  <div class="flex flex-row items-center gap-2 ml-4">
@@ -28,25 +28,25 @@ function getResponsiveImages(imagePath: string) {
28
28
  // Проверяем существование адаптивных версий
29
29
  const __filename = fileURLToPath(import.meta.url);
30
30
  const projectRoot = path.resolve(path.dirname(__filename), '../..');
31
-
31
+
32
32
  const variants = [
33
33
  { suffix: '-400', width: '400w' },
34
34
  { suffix: '-800', width: '800w' },
35
35
  { suffix: '-1200', width: '1200w' }
36
36
  ];
37
-
37
+
38
38
  const srcsetItems = [];
39
-
39
+
40
40
  // Добавляем адаптивные версии, если они существуют
41
41
  for (const variant of variants) {
42
42
  const variantPath = `${basePath}${variant.suffix}${extension}`;
43
43
  const filePath = path.join(projectRoot, 'public', variantPath.replace(/^\//, ''));
44
-
44
+
45
45
  if (fs.existsSync(filePath)) {
46
46
  srcsetItems.push(`${variantPath} ${variant.width}`);
47
47
  }
48
48
  }
49
-
49
+
50
50
  // Всегда добавляем оригинальное изображение
51
51
  srcsetItems.push(`${imagePath} 1200w`);
52
52
 
@@ -1,4 +1,7 @@
1
1
  ---
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
2
5
  import { maugliConfig } from '../config/maugli.config';
3
6
  import { slugify } from '../utils/common-utils';
4
7
  import { getFilteredCollection } from '../utils/content-loader';
@@ -22,11 +25,22 @@ const { title, description, image, quote, isFeatured, lang } = rubric;
22
25
  const defaultImage = maugliConfig.defaultRubricImage;
23
26
 
24
27
  // Универсальный механизм локализации
25
- import de from '../i18n/de.json';
26
- import en from '../i18n/en.json';
27
- import es from '../i18n/es.json';
28
- import ru from '../i18n/ru.json';
29
- const dicts: Record<string, any> = { ru, en, es, de };
28
+ import { LANGUAGES } from '../i18n/languages';
29
+
30
+ // Создаем словарь из массива языков
31
+ const dicts: Record<string, any> = Object.fromEntries(LANGUAGES.map((lang) => [lang.code, lang.dict]));
32
+
33
+ // Создаем карту локалей
34
+ const localeMap: Record<string, string> = {
35
+ ru: 'ru-RU',
36
+ en: 'en-US',
37
+ es: 'es-ES',
38
+ de: 'de-DE',
39
+ fr: 'fr-FR',
40
+ pt: 'pt-BR',
41
+ ja: 'ja-JP',
42
+ zh: 'zh-CN'
43
+ };
30
44
  // Если появятся новые языки — просто добавить импорт и в объект выше
31
45
  const langKey =
32
46
  typeof lang === 'string' && dicts[lang]
@@ -35,7 +49,6 @@ const langKey =
35
49
  ? maugliConfig.defaultLang
36
50
  : 'en';
37
51
  const dict = dicts[langKey] || dicts['en'];
38
- const localeMap: Record<string, string> = { ru: 'ru-RU', en: 'en-US', es: 'es-ES', de: 'de-DE' };
39
52
  const locale = localeMap[langKey] || 'en-US';
40
53
 
41
54
  // Получаем slug рубрики из title через slugify
@@ -90,6 +103,43 @@ yesterday.setDate(now.getDate() - 1);
90
103
  const isYesterday = dateObj && dateObj.toDateString() === yesterday.toDateString();
91
104
  const isBrandDate = isToday || isYesterday;
92
105
 
106
+ // Функция для получения адаптивных изображений
107
+ function getResponsiveImages(imagePath: string) {
108
+ const basePath = imagePath.replace(/\.(webp|jpg|jpeg|png)$/i, '');
109
+ const extension = imagePath.match(/\.(webp|jpg|jpeg|png)$/i)?.[0] || '.webp';
110
+
111
+ // Проверяем существование адаптивных версий
112
+ const __filename = fileURLToPath(import.meta.url);
113
+ const projectRoot = path.resolve(path.dirname(__filename), '../..');
114
+
115
+ const variants = [
116
+ { suffix: '-400', width: '400w' },
117
+ { suffix: '-800', width: '800w' },
118
+ { suffix: '-1200', width: '1200w' }
119
+ ];
120
+
121
+ const srcsetItems = [];
122
+
123
+ // Добавляем адаптивные версии, если они существуют
124
+ for (const variant of variants) {
125
+ const variantPath = `${basePath}${variant.suffix}${extension}`;
126
+ const filePath = path.join(projectRoot, 'public', variantPath.replace(/^\//, ''));
127
+
128
+ if (fs.existsSync(filePath)) {
129
+ srcsetItems.push(`${variantPath} ${variant.width}`);
130
+ }
131
+ }
132
+
133
+ // Всегда добавляем оригинальное изображение
134
+ srcsetItems.push(`${imagePath} 1200w`);
135
+
136
+ return {
137
+ src: imagePath,
138
+ srcset: srcsetItems.join(', '),
139
+ sizes: '(max-width: 768px) 100vw, 105px'
140
+ };
141
+ }
142
+
93
143
  // Функция для получения пути к превью изображения
94
144
  function getPreviewImageSrc(imageSrc: string): string {
95
145
  if (!imageSrc) return maugliConfig.defaultRubricImage;
@@ -108,44 +158,28 @@ function getPreviewImageSrc(imageSrc: string): string {
108
158
  // Убеждаемся, что путь абсолютный (начинается с /)
109
159
  const absolutePreviewPath = previewPath.startsWith('/') ? previewPath : `/${previewPath}`;
110
160
 
111
- // Возвращаем путь к превью (браузер покажет оригинал, если превью не найдено)
112
- return absolutePreviewPath;
161
+ // Проверяем существование превью
162
+ const __filename = fileURLToPath(import.meta.url);
163
+ const projectRoot = path.resolve(path.dirname(__filename), '../..');
164
+ const previewFilePath = path.join(projectRoot, 'public', absolutePreviewPath.replace(/^\//, ''));
165
+
166
+ if (fs.existsSync(previewFilePath)) {
167
+ return absolutePreviewPath;
168
+ }
169
+
170
+ // Если превью не найдено, возвращаем оригинальное изображение
171
+ return imageSrc;
113
172
  }
114
173
 
115
174
  // Если указано своё изображение — показываем его превью, иначе дефолтное
116
175
  const previewImageSrc = getPreviewImageSrc(image?.src || maugliConfig.defaultRubricImage);
117
176
 
118
- // Список стоп-слов (предлоги, союзы, знаки)
119
- const stopWords = [
120
- 'и',
121
- 'в',
122
- 'на',
123
- 'с',
124
- 'по',
125
- 'от',
126
- 'до',
127
- 'за',
128
- 'над',
129
- 'под',
130
- 'о',
131
- 'об',
132
- 'у',
133
- 'для',
134
- 'к',
135
- 'ко',
136
- 'из',
137
- 'без',
138
- 'при',
139
- 'а',
140
- 'но',
141
- 'или',
142
- 'да',
143
- 'же',
144
- 'ли',
145
- 'бы',
146
- 'не',
147
- 'то',
148
- 'же',
177
+ // Генерируем адаптивные версии изображений
178
+ const rubricImage = getResponsiveImages(previewImageSrc);
179
+
180
+ // Получаем стоп-слова для текущего языка
181
+ const stopWords = dict.stopWords || [
182
+ // Fallback стоп-слова на английском, если в языковом файле их нет
149
183
  'the',
150
184
  'of',
151
185
  'to',
@@ -160,6 +194,7 @@ const stopWords = [
160
194
  'an',
161
195
  'or',
162
196
  'but',
197
+ 'and',
163
198
  '&'
164
199
  ];
165
200
 
@@ -195,7 +230,16 @@ if (import.meta.env.DEV) {
195
230
  >
196
231
  <!-- Левая часть: картинка и дата -->
197
232
  <div class="flex flex-col items-end gap-2 w-[105px] h-[147px] relative">
198
- <img src={previewImageSrc} alt={title} class="w-[105px] h-[107px] object-cover rounded-custom" loading="lazy" />
233
+ <img
234
+ src={rubricImage.src}
235
+ srcset={rubricImage.srcset}
236
+ sizes={rubricImage.sizes}
237
+ alt={title}
238
+ class="w-[105px] h-[107px] object-cover rounded-custom"
239
+ loading="lazy"
240
+ width="105"
241
+ height="107"
242
+ />
199
243
  {
200
244
  rubricInitials && (
201
245
  <span style="position:absolute;left:0;top:0;width:105px;height:107px;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:2;">
@@ -206,41 +250,40 @@ if (import.meta.env.DEV) {
206
250
  </span>
207
251
  )
208
252
  }
209
- <div class="flex flex-col items-end gap-1 w-[74px] h-[32px]">
210
- <span class={`flex items-center gap-1 text-[12px] text-right ${isBrandDate ? 'text-[var(--brand-color)]' : 'text-[var(--text-muted)]'}`}>
211
- <svg
212
- width="16"
213
- height="16"
214
- viewBox="0 0 24 24"
215
- fill="none"
216
- xmlns="http://www.w3.org/2000/svg"
217
- style="display:inline-block;vertical-align:middle;opacity:0.6; color: var(--text-muted);"
218
- >
219
- <path
220
- d="M17.7909 6.12232C14.9505 3.32362 10.5815 3.00989 7.39551 5.15377L7.38659 3.92302C7.38509 3.71587 7.21589 3.54914 7.00866 3.55079L6.25874 3.55664C6.05166 3.55822 5.88516 3.72734 5.88666 3.93434L5.90736 6.74122C5.91029 7.15357 6.24576 7.48537 6.65736 7.48537C6.65886 7.48537 6.66104 7.48537 6.66321 7.48537L9.47046 7.46467C9.67761 7.46317 9.84426 7.29389 9.84269 7.08674L9.83684 6.33667C9.83526 6.12959 9.66614 5.96309 9.45914 5.96459L8.98199 5.96804C11.4928 4.71464 14.6299 5.11372 16.7377 7.19017C18.7606 9.18427 19.3134 12.182 18.1639 14.7525C18.082 14.9355 18.1491 15.1487 18.3276 15.24L18.997 15.582C19.1866 15.6789 19.4265 15.6008 19.5145 15.4069C20.9445 12.2567 20.2743 8.57039 17.7909 6.12232ZM17.3434 16.5132C17.3419 16.5132 17.3397 16.5132 17.3375 16.5132L14.5303 16.5338C14.3231 16.5354 14.1565 16.7046 14.158 16.9117L14.1639 17.6618C14.1655 17.8688 14.3346 18.0353 14.5416 18.0339L15.0183 18.0304C12.5073 19.2835 9.37079 18.8841 7.26299 16.8083C5.24009 14.8142 4.68734 11.8164 5.83686 9.24599C5.91869 9.06299 5.85164 8.84977 5.67314 8.75849L5.00376 8.41649C4.81409 8.31959 4.57424 8.39767 4.48619 8.59154C3.05609 11.7417 3.72636 15.428 6.20969 17.8762C7.81439 19.4575 9.90771 20.2456 11.9995 20.2456C13.6101 20.2456 15.2191 19.7767 16.605 18.8438L16.6139 20.0754C16.6154 20.2825 16.7846 20.4493 16.9918 20.4477L17.7418 20.4418C17.9488 20.4402 18.1153 20.2711 18.1138 20.0641L18.0931 17.2573C18.0904 16.8449 17.755 16.5132 17.3434 16.5132Z"
221
- fill="currentColor"></path>
222
- </svg>
223
- {formattedDate}
224
- </span>
225
- </div>
253
+ <div class="flex flex-col items-end gap-1 w-[74px] h-[32px]">
254
+ <span class={`flex items-center gap-1 text-[12px] text-right ${isBrandDate ? 'text-[var(--brand-color)]' : 'text-[var(--text-muted)]'}`}>
255
+ <svg
256
+ width="16"
257
+ height="16"
258
+ viewBox="0 0 24 24"
259
+ fill="none"
260
+ xmlns="http://www.w3.org/2000/svg"
261
+ style="display:inline-block;vertical-align:middle;opacity:0.6; color: var(--text-muted);"
262
+ >
263
+ <path
264
+ d="M17.7909 6.12232C14.9505 3.32362 10.5815 3.00989 7.39551 5.15377L7.38659 3.92302C7.38509 3.71587 7.21589 3.54914 7.00866 3.55079L6.25874 3.55664C6.05166 3.55822 5.88516 3.72734 5.88666 3.93434L5.90736 6.74122C5.91029 7.15357 6.24576 7.48537 6.65736 7.48537C6.65886 7.48537 6.66104 7.48537 6.66321 7.48537L9.47046 7.46467C9.67761 7.46317 9.84426 7.29389 9.84269 7.08674L9.83684 6.33667C9.83526 6.12959 9.66614 5.96309 9.45914 5.96459L8.98199 5.96804C11.4928 4.71464 14.6299 5.11372 16.7377 7.19017C18.7606 9.18427 19.3134 12.182 18.1639 14.7525C18.082 14.9355 18.1491 15.1487 18.3276 15.24L18.997 15.582C19.1866 15.6789 19.4265 15.6008 19.5145 15.4069C20.9445 12.2567 20.2743 8.57039 17.7909 6.12232ZM17.3434 16.5132C17.3419 16.5132 17.3397 16.5132 17.3375 16.5132L14.5303 16.5338C14.3231 16.5354 14.1565 16.7046 14.158 16.9117L14.1639 17.6618C14.1655 17.8688 14.3346 18.0353 14.5416 18.0339L15.0183 18.0304C12.5073 19.2835 9.37079 18.8841 7.26299 16.8083C5.24009 14.8142 4.68734 11.8164 5.83686 9.24599C5.91869 9.06299 5.85164 8.84977 5.67314 8.75849L5.00376 8.41649C4.81409 8.31959 4.57424 8.39767 4.48619 8.59154C3.05609 11.7417 3.72636 15.428 6.20969 17.8762C7.81439 19.4575 9.90771 20.2456 11.9995 20.2456C13.6101 20.2456 15.2191 19.7767 16.605 18.8438L16.6139 20.0754C16.6154 20.2825 16.7846 20.4493 16.9918 20.4477L17.7418 20.4418C17.9488 20.4402 18.1153 20.2711 18.1138 20.0641L18.0931 17.2573C18.0904 16.8449 17.755 16.5132 17.3434 16.5132Z"
265
+ fill="currentColor"></path>
266
+ </svg>
267
+ {formattedDate}
268
+ </span>
226
269
  </div>
227
- <!-- Правая часть: контент -->
228
- <div class="flex flex-col justify-start items-start h-[147px] flex-1 min-w-0">
229
- <div class="flex flex-row items-start gap-2 w-full">
230
- <h3 class="font-serif font-[700] text-[22px] text-[var(--text-heading)] leading-[1] truncate">{title}</h3>
231
- <CountBadge count={postCount} />
232
- </div>
233
- <div class="mt-2 text-[14px] text-[var(--text-main)] leading-[1.3] line-clamp-6 opacity-80">
234
- {description}
235
- </div>
270
+ </div>
271
+ <!-- Правая часть: контент -->
272
+ <div class="flex flex-col justify-start items-start h-[147px] flex-1 min-w-0">
273
+ <div class="flex flex-row items-start gap-2 w-full">
274
+ <h3 class="font-serif font-[700] text-[22px] text-[var(--text-heading)] leading-[1] truncate">{title}</h3>
275
+ <CountBadge count={postCount} />
276
+ </div>
277
+ <div class="mt-2 text-[14px] text-[var(--text-main)] leading-[1.3] line-clamp-6 opacity-80">
278
+ {description}
236
279
  </div>
237
280
  </div>
238
281
  </article>
239
-
240
- <style>
241
- article:hover {
242
- box-shadow: var(--card-shadow);
243
- }
244
- /* Карточка всегда двухколоночная, контент сверху, текст description не прижат к низу */
245
- </style>
246
282
  </a>
283
+
284
+ <style>
285
+ article:hover {
286
+ box-shadow: var(--card-shadow);
287
+ }
288
+ /* Карточка всегда двухколоночная, контент сверху, текст description не прижат к низу */
289
+ </style>
package/src/i18n/de.json CHANGED
@@ -122,5 +122,9 @@
122
122
  "title": "Seite nicht gefunden",
123
123
  "description": "Entschuldigung, diese Seite existiert nicht oder wurde entfernt.",
124
124
  "button": "Zur Hauptseite"
125
- }
125
+ },
126
+
127
+ "stopWords": [
128
+ "der", "die", "das", "und", "in", "auf", "mit", "von", "zu", "für", "an", "bei", "nach", "vor", "über", "unter", "durch", "ohne", "gegen", "um", "aus", "bis", "seit", "während", "wegen", "trotz", "statt", "anstatt", "außer", "binnen", "dank", "entlang", "entsprechend", "gemäß", "laut", "samt", "zufolge", "zugunsten", "zulasten", "zuliebe", "zuwider", "ist", "sind", "war", "waren", "sein", "haben", "hat", "hatte", "hatten", "wird", "werden", "wurde", "wurden", "kann", "können", "konnte", "konnten", "soll", "sollen", "sollte", "sollten", "will", "wollen", "wollte", "wollten", "muss", "müssen", "musste", "mussten", "darf", "dürfen", "durfte", "durften", "mag", "mögen", "mochte", "mochten", "ein", "eine", "einer", "eines", "einem", "einen", "kein", "keine", "keiner", "keines", "keinem", "keinen", "dieser", "diese", "dieses", "diesem", "diesen", "jener", "jene", "jenes", "jenem", "jenen", "welcher", "welche", "welches", "welchem", "welchen", "alle", "alles", "allen", "aller", "manche", "mancher", "manches", "manchem", "manchen", "einige", "einiger", "einiges", "einigem", "einigen", "viele", "vieler", "vieles", "vielem", "vielen", "wenige", "weniger", "weniges", "wenigem", "wenigen", "andere", "anderer", "anderes", "anderem", "anderen", "nicht", "nichts", "nie", "niemals", "immer", "oft", "manchmal", "selten", "hier", "da", "dort", "wo", "wohin", "woher", "wann", "wie", "warum", "weshalb", "wieso", "was", "wer", "wen", "wem", "wessen", "sehr", "ziemlich", "ganz", "völlig", "etwas", "etwa", "fast", "bereits", "schon", "noch", "nur", "auch", "sogar", "zwar", "aber", "jedoch", "doch", "dennoch", "trotzdem", "sondern", "oder", "entweder", "weder", "sowohl", "als", "wie", "wenn", "falls", "obwohl", "obgleich", "während", "bevor", "nachdem", "seit", "bis", "damit", "dass", "ob", "weil", "da", "falls", "sofern", "solange", "sobald", "&"
129
+ ]
126
130
  }
package/src/i18n/en.json CHANGED
@@ -122,5 +122,9 @@
122
122
  "title": "Page not found",
123
123
  "description": "Sorry, this page does not exist or has been removed.",
124
124
  "button": "Go to main page"
125
- }
125
+ },
126
+
127
+ "stopWords": [
128
+ "the", "of", "to", "in", "on", "at", "by", "for", "with", "from", "as", "an", "or", "but", "and", "is", "are", "was", "were", "be", "been", "have", "has", "had", "do", "does", "did", "will", "would", "could", "should", "may", "might", "can", "must", "shall", "ought", "this", "that", "these", "those", "a", "about", "above", "after", "again", "against", "all", "any", "before", "below", "between", "both", "during", "each", "few", "if", "into", "more", "most", "no", "nor", "not", "only", "other", "out", "over", "same", "so", "some", "such", "than", "too", "very", "what", "when", "where", "which", "who", "why", "how", "up", "down", "off", "through", "until", "while", "&"
129
+ ]
126
130
  }
package/src/i18n/es.json CHANGED
@@ -122,5 +122,9 @@
122
122
  "title": "Página no encontrada",
123
123
  "description": "Lo sentimos, esta página no existe o ha sido eliminada.",
124
124
  "button": "A la página principal"
125
- }
125
+ },
126
+
127
+ "stopWords": [
128
+ "el", "la", "de", "que", "y", "a", "en", "un", "es", "se", "no", "te", "lo", "le", "da", "su", "por", "son", "con", "para", "al", "del", "los", "las", "una", "más", "como", "pero", "sus", "le", "ya", "o", "porque", "cuando", "muy", "sin", "sobre", "también", "me", "hasta", "hay", "donde", "quien", "desde", "todo", "nos", "durante", "todos", "uno", "les", "ni", "contra", "otros", "ese", "eso", "ante", "ellos", "e", "esto", "mí", "antes", "algunos", "qué", "unos", "yo", "otro", "otras", "otra", "él", "tanto", "esa", "estos", "mucho", "quienes", "nada", "muchos", "cual", "poco", "ella", "estar", "estas", "algunas", "algo", "nosotros", "mi", "mis", "tú", "te", "ti", "tu", "tus", "ellas", "nosotras", "vosotros", "vosotras", "os", "mío", "mía", "míos", "mías", "tuyo", "tuya", "tuyos", "tuyas", "suyo", "suya", "suyos", "suyas", "nuestro", "nuestra", "nuestros", "nuestras", "vuestro", "vuestra", "vuestros", "vuestras", "del", "al", "donde", "adonde", "por donde", "en donde", "a donde", "de donde", "hacia donde", "hasta donde", "desde donde", "para donde", "según", "entre", "hacia", "mediante", "durante", "salvo", "excepto", "menos", "incluso", "además", "aparte", "fuera", "dentro", "encima", "debajo", "delante", "detrás", "cerca", "lejos", "alrededor", "&"
129
+ ]
126
130
  }
package/src/i18n/fr.json CHANGED
@@ -26,8 +26,8 @@
26
26
  "pages": {
27
27
  "authors": {
28
28
  "title": "Auteurs",
29
- "description": "Rencontrez notre équipe d'experts écrivant pour {brand}",
30
- "goToAuthor": "Voir l'auteur",
29
+ "description": "Rencontrez notre équipe d'experts qui écrivent pour {brand}",
30
+ "goToAuthor": "Aller à l'auteur",
31
31
  "avatarAlt": "Avatar",
32
32
  "onPlatform": "sur"
33
33
  },
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "index": {
40
40
  "title": "<Blog>",
41
- "description": "Blog sur l'automatisation vue par l'IA",
41
+ "description": "Blog sur l'automatisation à travers les yeux de l'IA",
42
42
  "articles": "Articles",
43
43
  "minutes": "min"
44
44
  },
@@ -51,15 +51,15 @@
51
51
  "title": "Services"
52
52
  },
53
53
  "blog": {
54
- "moreByTag": "Plus sur ce sujet"
54
+ "moreByTag": "Plus sur le sujet"
55
55
  },
56
56
  "productsId": {
57
- "articlesByTag": "Articles sur ce sujet",
58
- "casesByTag": "Cas sur ce sujet"
57
+ "articlesByTag": "Articles sur le sujet",
58
+ "casesByTag": "Cas sur le sujet"
59
59
  }
60
60
  },
61
61
  "socials": {
62
- "email": "Email",
62
+ "email": "email",
63
63
  "linkedin": "LinkedIn",
64
64
  "twitter": "Twitter",
65
65
  "telegram": "Telegram",
@@ -91,8 +91,8 @@
91
91
  "faqLabel": "FAQ :"
92
92
  },
93
93
  "tableOfContents": {
94
- "title": "Contenu",
95
- "ariaLabel": "Contenu"
94
+ "title": "Sommaire",
95
+ "ariaLabel": "Sommaire"
96
96
  },
97
97
  "tagPill": {
98
98
  "ariaLabel": "Tag : {tag}"
@@ -108,19 +108,23 @@
108
108
  "tagAriaLabel": "Tag : {name} ({count})"
109
109
  },
110
110
  "themeToggle": {
111
- "ariaLabel": "Changer le thème"
111
+ "ariaLabel": "Changer le schéma de couleurs"
112
112
  },
113
113
  "pagination": {
114
114
  "goToPage": "Aller à la page {page} sur {lastPage}",
115
115
  "pageOf": "Page {currentPage} sur {lastPage}"
116
116
  },
117
117
  "subscribe": {
118
- "heading": "S'abonner aux mises à jour",
119
- "mutedText": "Recevez en premier les derniers articles et actualités !"
118
+ "heading": "Abonnez-vous aux mises à jour",
119
+ "mutedText": "Recevez les derniers articles et nouvelles en premier !"
120
120
  },
121
121
  "notFound": {
122
122
  "title": "Page non trouvée",
123
- "description": "Désolé, cette page nexiste pas ou a été supprimée.",
124
- "button": "Page daccueil"
125
- }
123
+ "description": "Désolé, cette page n'existe pas ou a été supprimée.",
124
+ "button": "Page d'accueil"
125
+ },
126
+
127
+ "stopWords": [
128
+ "le", "de", "et", "à", "un", "il", "être", "en", "avoir", "que", "pour", "dans", "ce", "son", "une", "sur", "avec", "ne", "se", "pas", "tout", "pouvoir", "par", "plus", "comme", "où", "quand", "qui", "quoi", "très", "bien", "beaucoup", "peu", "aussi", "encore", "toujours", "jamais", "ici", "là", "sans", "après", "avant", "depuis", "pendant", "malgré", "selon", "contre", "vers", "chez", "sous", "entre", "parmi", "au", "aux", "du", "des", "la", "les", "cette", "ces", "dont", "lequel", "laquelle", "lesquels", "lesquelles", "auquel", "auxquels", "auxquelles", "duquel", "desquels", "desquelles", "ceci", "cela", "ça", "celui", "celle", "ceux", "celles", "même", "autre", "tel", "chaque", "quelque", "plusieurs", "certain", "aucun", "nul", "assez", "mal", "trop", "moins", "autant", "tant", "si", "partout", "nulle", "part", "ailleurs", "dedans", "dehors", "dessus", "dessous", "devant", "derrière", "près", "loin", "maintenant", "hier", "demain", "bientôt", "tard", "tôt", "&"
129
+ ]
126
130
  }
package/src/i18n/ja.json CHANGED
@@ -122,5 +122,9 @@
122
122
  "title": "ページが見つかりません",
123
123
  "description": "申し訳ありません。このページは存在しないか削除されました。",
124
124
  "button": "メインページへ"
125
- }
125
+ },
126
+
127
+ "stopWords": [
128
+ "は", "の", "が", "を", "に", "で", "と", "から", "まで", "より", "へ", "や", "か", "も", "こそ", "でも", "しか", "だけ", "ばかり", "さえ", "すら", "など", "なら", "なり", "やら", "きり", "ぐらい", "くらい", "ほど", "だの", "とか", "し", "て", "で", "た", "だ", "である", "です", "ます", "だろう", "でしょう", "らしい", "そうだ", "ようだ", "みたいだ", "かもしれない", "にちがいない", "はずだ", "べきだ", "べきである", "のだ", "んだ", "ことだ", "ものだ", "わけだ", "つもりだ", "ところだ", "ばかりだ", "ということだ", "というものだ", "という", "といった", "とする", "とした", "として", "とすれば", "とすると", "とか", "やら", "なり", "だの", "とも", "でも", "にも", "でさえ", "にさえ", "でこそ", "にこそ", "こそ", "さえ", "すら", "ばかり", "だけ", "しか", "ほか", "以外", "だって", "って", "では", "じゃ", "なら", "ならば", "なれば", "たら", "れば", "ば", "と", "ても", "でも", "けれど", "けれども", "が", "しかし", "だが", "でも", "ところが", "それなのに", "それでも", "しかし", "でも", "ただし", "ただ", "もっとも", "もちろん", "なお", "ちなみに", "そして", "それから", "また", "さらに", "その上", "加えて", "つまり", "すなわち", "いわば", "要するに", "結局", "とにかく", "ともかく", "いずれにしても", "なんにしても", "どうせ", "せっかく", "わざわざ", "特に", "とくに", "特別に", "とりわけ", "なかでも", "中でも", "例えば", "たとえば", "いわゆる", "所謂", "いわば", "まさに", "正に", "実に", "本当に", "全く", "まったく", "非常に", "とても", "大変", "かなり", "相当", "結構", "ずいぶん", "だいぶ", "多少", "少し", "ちょっと", "やや", "わりと", "割と", "まあまあ", "そこそこ", "それなり", "&"
129
+ ]
126
130
  }
package/src/i18n/pt.json CHANGED
@@ -122,5 +122,9 @@
122
122
  "title": "Página não encontrada",
123
123
  "description": "Desculpe, esta página não existe ou foi removida.",
124
124
  "button": "Página principal"
125
- }
125
+ },
126
+
127
+ "stopWords": [
128
+ "o", "a", "de", "e", "do", "da", "em", "um", "para", "é", "com", "não", "uma", "os", "no", "se", "na", "por", "mais", "as", "dos", "como", "mas", "foi", "ao", "ele", "das", "tem", "à", "seu", "sua", "ou", "ser", "quando", "muito", "há", "nos", "já", "está", "eu", "também", "só", "pelo", "pela", "até", "isso", "ela", "entre", "era", "depois", "sem", "mesmo", "aos", "ter", "seus", "suas", "numa", "pelos", "pelas", "esse", "esses", "essa", "essas", "num", "onde", "bem", "te", "então", "foram", "teu", "tua", "teus", "tuas", "nosso", "nossa", "nossos", "nossas", "dele", "dela", "deles", "delas", "este", "esta", "estes", "estas", "aquele", "aquela", "aqueles", "aquelas", "isto", "isso", "aquilo", "todo", "toda", "todos", "todas", "outro", "outra", "outros", "outras", "qual", "quais", "quanto", "quanta", "quantos", "quantas", "algum", "alguma", "alguns", "algumas", "nenhum", "nenhuma", "nenhuns", "nenhumas", "muito", "muita", "muitos", "muitas", "pouco", "pouca", "poucos", "poucas", "tanto", "tanta", "tantos", "tantas", "primeiro", "primeira", "primeiros", "primeiras", "último", "última", "últimos", "últimas", "grande", "grandes", "pequeno", "pequena", "pequenos", "pequenas", "novo", "nova", "novos", "novas", "velho", "velha", "velhos", "velhas", "bom", "boa", "bons", "boas", "mau", "má", "maus", "más", "melhor", "melhores", "pior", "piores", "maior", "maiores", "menor", "menores", "aqui", "aí", "ali", "lá", "cá", "onde", "aonde", "donde", "quando", "enquanto", "como", "porque", "porquê", "para", "que", "conforme", "segundo", "consoante", "salvo", "exceto", "menos", "através", "desde", "durante", "antes", "depois", "contra", "sobre", "sob", "perante", "ante", "segundo", "conforme", "mediante", "durante", "excepto", "fora", "tirante", "afora", "além", "aquém", "dentro", "fora", "perto", "longe", "acima", "abaixo", "adiante", "atrás", "diante", "&"
129
+ ]
126
130
  }
package/src/i18n/ru.json CHANGED
@@ -119,5 +119,9 @@
119
119
  "title": "Страница не найдена",
120
120
  "description": "Упс, такой страницы не существует или она была удалена.",
121
121
  "button": "На главную"
122
- }
122
+ },
123
+
124
+ "stopWords": [
125
+ "и", "в", "на", "с", "по", "от", "до", "за", "над", "под", "о", "об", "у", "для", "к", "ко", "из", "без", "при", "а", "но", "или", "да", "же", "ли", "бы", "не", "то", "через", "между", "среди", "около", "возле", "после", "перед", "против", "вместо", "кроме", "несмотря", "благодаря", "согласно", "вопреки", "навстречу", "вслед", "ради", "что", "как", "когда", "где", "почему", "зачем", "куда", "откуда", "если", "хотя", "чтобы", "пока", "пусть", "будто", "словно", "точно", "едва", "лишь", "только", "именно", "уже", "ещё", "вот", "вон", "тут", "там", "здесь", "сюда", "туда", "сейчас", "тогда", "всегда", "никогда", "иногда", "часто", "редко", "очень", "весьма", "довольно", "почти", "совсем", "вполне", "крайне", "слишком", "чуть", "едва", "&"
126
+ ]
123
127
  }
package/src/i18n/zh.json CHANGED
@@ -122,5 +122,9 @@
122
122
  "title": "未找到页面",
123
123
  "description": "抱歉,此页面不存在或已被删除。",
124
124
  "button": "返回首页"
125
- }
125
+ },
126
+
127
+ "stopWords": [
128
+ "的", "了", "在", "是", "我", "有", "和", "就", "不", "人", "都", "一", "一个", "上", "也", "很", "到", "说", "要", "去", "你", "会", "着", "没有", "看", "好", "自己", "这", "那", "里", "来", "他", "时候", "过", "出", "多", "么", "于", "她", "手", "可", "家", "学", "只", "以", "主", "会", "样", "年", "想", "生", "同", "老", "中", "十", "从", "面", "听", "女", "儿", "头", "明", "实", "之", "进", "着", "等", "部", "度", "家", "电", "力", "里", "如", "水", "化", "高", "自", "二", "理", "起", "小", "物", "现", "实", "加", "量", "都", "两", "体", "制", "机", "当", "使", "点", "从", "业", "本", "去", "把", "性", "好", "应", "开", "它", "合", "还", "因", "由", "其", "些", "然", "前", "外", "天", "政", "四", "日", "那", "社", "义", "事", "平", "形", "相", "全", "表", "间", "样", "与", "关", "各", "重", "新", "线", "内", "数", "正", "心", "反", "你", "明", "看", "原", "又", "么", "利", "比", "或", "但", "质", "气", "第", "向", "道", "命", "此", "变", "条", "只", "没", "结", "解", "问", "意", "建", "月", "公", "无", "系", "军", "很", "情", "者", "最", "立", "代", "想", "已", "通", "并", "提", "直", "题", "党", "程", "展", "五", "果", "料", "象", "员", "革", "位", "入", "常", "文", "总", "次", "品", "式", "活", "设", "及", "管", "特", "件", "长", "求", "老", "头", "基", "资", "边", "流", "路", "级", "少", "图", "山", "统", "接", "知", "较", "将", "组", "见", "计", "别", "她", "手", "角", "期", "根", "论", "运", "农", "指", "&"
129
+ ]
126
130
  }