@intlayer/docs 8.10.0-canary.1 → 8.10.1

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.
Files changed (43) hide show
  1. package/docs/ar/dictionary/markdown.md +349 -19
  2. package/docs/ar/interest_of_intlayer.md +1 -1
  3. package/docs/bn/interest_of_intlayer.md +1 -1
  4. package/docs/cs/interest_of_intlayer.md +1 -1
  5. package/docs/de/dictionary/markdown.md +349 -19
  6. package/docs/de/interest_of_intlayer.md +1 -1
  7. package/docs/en/dictionary/markdown.md +338 -20
  8. package/docs/en/interest_of_intlayer.md +1 -1
  9. package/docs/en-GB/dictionary/markdown.md +349 -19
  10. package/docs/en-GB/interest_of_intlayer.md +1 -1
  11. package/docs/es/dictionary/markdown.md +349 -19
  12. package/docs/es/interest_of_intlayer.md +1 -1
  13. package/docs/fr/dictionary/markdown.md +349 -19
  14. package/docs/fr/interest_of_intlayer.md +1 -1
  15. package/docs/hi/dictionary/markdown.md +349 -19
  16. package/docs/hi/interest_of_intlayer.md +1 -1
  17. package/docs/id/dictionary/markdown.md +349 -19
  18. package/docs/id/interest_of_intlayer.md +1 -1
  19. package/docs/it/dictionary/markdown.md +349 -19
  20. package/docs/it/interest_of_intlayer.md +1 -1
  21. package/docs/ja/interest_of_intlayer.md +1 -1
  22. package/docs/ko/dictionary/markdown.md +349 -19
  23. package/docs/ko/interest_of_intlayer.md +1 -1
  24. package/docs/nl/interest_of_intlayer.md +1 -1
  25. package/docs/pl/dictionary/markdown.md +349 -19
  26. package/docs/pl/interest_of_intlayer.md +1 -1
  27. package/docs/pt/benchmark/solid.md +1 -1
  28. package/docs/pt/benchmark/svelte.md +1 -1
  29. package/docs/pt/dictionary/markdown.md +349 -19
  30. package/docs/pt/interest_of_intlayer.md +1 -1
  31. package/docs/ru/dictionary/markdown.md +458 -16
  32. package/docs/ru/interest_of_intlayer.md +1 -1
  33. package/docs/tr/dictionary/markdown.md +349 -19
  34. package/docs/tr/interest_of_intlayer.md +1 -1
  35. package/docs/uk/dictionary/markdown.md +349 -19
  36. package/docs/uk/interest_of_intlayer.md +1 -1
  37. package/docs/ur/interest_of_intlayer.md +1 -1
  38. package/docs/vi/dictionary/markdown.md +349 -19
  39. package/docs/vi/interest_of_intlayer.md +1 -1
  40. package/docs/zh/dictionary/markdown.md +349 -19
  41. package/docs/zh/interest_of_intlayer.md +1 -1
  42. package/docs/zh-TW/interest_of_intlayer.md +1 -1
  43. package/package.json +7 -7
@@ -96,35 +96,35 @@ Intlayer поддерживает форматированный текстов
96
96
  ```
97
97
 
98
98
  </Tab>
99
- <Tab label="Автоматическое обнаружение" value="automatic-detection">
100
- Если строка содержит общие признаки Markdown (такие как заголовки, списки, ссылки и т. д.), Intlayer автоматически преобразует ее.
99
+ <Tab label="Внешние файлы" value="external-files">
100
+ Импортируйте файлы `.md` напрямую, используя функцию `file`.
101
101
 
102
102
  ```typescript fileName="markdownDictionary.content.ts"
103
+ import { md, file, t } from "intlayer";
104
+
103
105
  export default {
104
106
  key: "app",
105
- contentAutoTransformation: true, // Включить автоматическое обнаружение Markdown контента — можно установить глобально в intlayer.config.ts
106
107
  content: {
107
- myMarkdownContent: "## My title \n\nLorem Ipsum",
108
+ content: t({
109
+ ru: md(file("./myMarkdown.ru.md")),
110
+ en: md(file("./myMarkdown.en.md")),
111
+ fr: md(file("./myMarkdown.fr.md")),
112
+ }),
108
113
  },
109
114
  };
110
115
  ```
111
116
 
112
117
  </Tab>
113
118
 
114
- <Tab label="Внешние файлы" value="external-files">
115
- Импортируйте файлы `.md` напрямую, используя функцию `file`.
119
+ <Tab label="Автоматическое обнаружение" value="automatic-detection">
120
+ Если строка содержит общие признаки Markdown (такие как заголовки, списки, ссылки и т. д.), Intlayer автоматически преобразует ее.
116
121
 
117
122
  ```typescript fileName="markdownDictionary.content.ts"
118
- import { md, file, t } from "intlayer";
119
-
120
123
  export default {
121
124
  key: "app",
125
+ contentAutoTransformation: true, // Включить автоматическое обнаружение Markdown контента — можно установить глобально в intlayer.config.ts
122
126
  content: {
123
- content: t({
124
- ru: md(file("./myMarkdown.ru.md")),
125
- en: md(file("./myMarkdown.en.md")),
126
- fr: md(file("./myMarkdown.fr.md")),
127
- }),
127
+ myMarkdownContent: "## My title \n\nLorem Ipsum",
128
128
  },
129
129
  };
130
130
  ```
@@ -132,8 +132,6 @@ Intlayer поддерживает форматированный текстов
132
132
  </Tab>
133
133
  </Tabs>
134
134
 
135
- ---
136
-
137
135
  ## Рендеринг Markdown
138
136
 
139
137
  Intlayer предоставляет два независимых способа рендеринга Markdown:
@@ -149,7 +147,7 @@ Intlayer предоставляет два независимых способа
149
147
  ### 1. Автоматический рендеринг (через `useIntlayer`)
150
148
 
151
149
  <Tabs group="framework">
152
- <Tab label="React / Next.js" value="react">
150
+ <Tab label="React" value="react">
153
151
  Markdown-узлы могут быть отрисованы напрямую как JSX.
154
152
 
155
153
  ```tsx fileName="App.tsx"
@@ -176,6 +174,57 @@ Intlayer предоставляет два независимых способа
176
174
 
177
175
  > Если `MarkdownProvider` отсутствует, intlayer будет отрисовывать markdown, используя стандартный парсер Markdown в JSX.
178
176
 
177
+ Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
178
+
179
+ ```tsx
180
+ {myMarkdownContent.use({
181
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
182
+ })}
183
+ ```
184
+
185
+ Вы можете получить Markdown в виде строки:
186
+
187
+ ```tsx
188
+ {myMarkdownContent.value}
189
+ {String(myMarkdownContent)}
190
+ {myMarkdownContent.toString()}
191
+ ```
192
+
193
+ И вы можете получить доступ к метаданным вашего markdown, например:
194
+
195
+ ```tsx
196
+ {myMarkdownContent.metadata}
197
+ {myMarkdownContent.metadata.title}
198
+ ```
199
+
200
+ </Tab>
201
+ <Tab label="Next.js" value="nextjs">
202
+ Markdown-узлы могут быть отрисованы напрямую как JSX.
203
+
204
+ ```tsx fileName="App.tsx"
205
+ import { useIntlayer } from "next-intlayer";
206
+ import { MarkdownProvider } from "next-intlayer/markdown";
207
+
208
+ const AppContent = () => {
209
+ const { myMarkdownContent } = useIntlayer("app");
210
+
211
+ return <div>{myMarkdownContent}</div>;
212
+ };
213
+
214
+ const App = () => (
215
+ <MarkdownProvider
216
+ components={{
217
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
218
+ MyButton: (props) => <button {...props} />, // MDX-компонент
219
+ }}
220
+ >
221
+ <AppContent />
222
+ </MarkdownProvider>
223
+ );
224
+ ```
225
+
226
+ > Если `MarkdownProvider` отсутствует, intlayer будет отрисовывать markdown, используя стандартный парсер Markdown в JSX.
227
+
179
228
  Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
180
229
 
181
230
  ```tsx
@@ -232,3 +281,396 @@ Intlayer предоставляет два независимых способа
232
281
  Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
233
282
 
234
283
  ```vue
284
+ <component :is="myMarkdownContent.use({
285
+ h1: (props) => h('h1', { style: { color: 'red' } }, props.children),
286
+ })" />
287
+ ```
288
+
289
+ Вы можете получить Markdown в виде строки:
290
+
291
+ ```vue
292
+ {{ myMarkdownContent.value }}
293
+ {{ String(myMarkdownContent) }}
294
+ {{ myMarkdownContent.toString() }}
295
+ ```
296
+
297
+ И вы можете получить доступ к метаданным вашего markdown, например:
298
+
299
+ ```vue
300
+ <component :is="myMarkdownContent.metadata" />
301
+ <component :is="myMarkdownContent.metadata.title" />
302
+ ```
303
+
304
+ </Tab>
305
+ <Tab label="Svelte" value="svelte">
306
+ Svelte по умолчанию рендерит Markdown как HTML-строку. Используйте `{@html}` для его рендеринга.
307
+
308
+ ```svelte fileName="App.svelte"
309
+ <script lang="ts">
310
+ import { useIntlayer } from "svelte-intlayer";
311
+ import { MarkdownProvider } from "svelte-intlayer/markdown";
312
+ import MyHeading from "./MyHeading.svelte";
313
+
314
+ const content = useIntlayer("app");
315
+ </script>
316
+
317
+ <MarkdownProvider components={{ h1: MyHeading }}>
318
+ {@html $content.myMarkdownContent}
319
+ </MarkdownProvider>
320
+ ```
321
+
322
+ > Если `MarkdownProvider` отсутствует, Intlayer будет рендерить markdown с использованием компилятора по умолчанию.
323
+
324
+ Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
325
+
326
+ ```svelte
327
+ {@html $content.myMarkdownContent.use({ ... })}
328
+ ```
329
+
330
+ Вы можете получить Markdown в виде строки:
331
+
332
+ ```svelte
333
+ {$content.myMarkdownContent.value}
334
+ {String($content.myMarkdownContent)}
335
+ {$content.myMarkdownContent.toString()}
336
+ ```
337
+
338
+ И вы можете получить доступ к метаданным вашего markdown, например:
339
+
340
+ ```svelte
341
+ {$content.myMarkdownContent.metadata}
342
+ {$content.myMarkdownContent.metadata.title}
343
+ ```
344
+
345
+ </Tab>
346
+ <Tab label="Preact" value="preact">
347
+ Preact поддерживает узлы Markdown непосредственно в JSX.
348
+
349
+ ```tsx fileName="App.tsx"
350
+ import { useIntlayer } from "preact-intlayer";
351
+ import { MarkdownProvider } from "preact-intlayer/markdown";
352
+
353
+ const AppContent = () => {
354
+ const { myMarkdownContent } = useIntlayer("app");
355
+ return <div>{myMarkdownContent}</div>;
356
+ };
357
+
358
+ const App = () => (
359
+ <MarkdownProvider
360
+ components={{
361
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
362
+ MyButton: (props) => <button {...props} />, // Компонент MDX
363
+ }}
364
+ >
365
+ <AppContent />
366
+ </MarkdownProvider>
367
+ );
368
+ ```
369
+
370
+ > Если `MarkdownProvider` отсутствует, intlayer будет отрисовывать markdown, используя стандартный парсер Markdown в JSX.
371
+
372
+ Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
373
+
374
+ ```tsx
375
+ {myMarkdownContent.use({
376
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
377
+ })}
378
+ ```
379
+
380
+ Вы можете получить Markdown в виде строки:
381
+
382
+ ```tsx
383
+ {myMarkdownContent.value}
384
+ {String(myMarkdownContent)}
385
+ {myMarkdownContent.toString()}
386
+ ```
387
+
388
+ И вы можете получить доступ к метаданным вашего markdown, например:
389
+
390
+ ```tsx
391
+ {myMarkdownContent.metadata}
392
+ {myMarkdownContent.metadata.title}
393
+ ```
394
+
395
+ </Tab>
396
+ <Tab label="Solid" value="solid">
397
+ Solid поддерживает узлы Markdown непосредственно в JSX.
398
+
399
+ ```tsx fileName="App.tsx"
400
+ import { useIntlayer } from "solid-intlayer";
401
+ import { MarkdownProvider } from "solid-intlayer/markdown";
402
+
403
+ const AppContent = () => {
404
+ const { myMarkdownContent } = useIntlayer("app");
405
+ return <div>{myMarkdownContent}</div>;
406
+ };
407
+
408
+ const App = () => (
409
+ <MarkdownProvider
410
+ components={{
411
+ h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
412
+ MyButton: (props) => <button {...props} />, // Компонент MDX
413
+ }}
414
+ >
415
+ <AppContent />
416
+ </MarkdownProvider>
417
+ );
418
+ ```
419
+
420
+ > Если `MarkdownProvider` отсутствует, intlayer будет отрисовывать markdown, используя стандартный парсер Markdown в JSX.
421
+
422
+ Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
423
+
424
+ ```tsx
425
+ {myMarkdownContent.use({
426
+ h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
427
+ })}
428
+ ```
429
+
430
+ Вы можете получить Markdown в виде строки:
431
+
432
+ ```tsx
433
+ {myMarkdownContent.value}
434
+ {String(myMarkdownContent)}
435
+ {myMarkdownContent.toString()}
436
+ ```
437
+
438
+ И вы можете получить доступ к метаданным вашего markdown, например:
439
+
440
+ ```tsx
441
+ {myMarkdownContent.metadata}
442
+ {myMarkdownContent.metadata.title}
443
+ ```
444
+
445
+ </Tab>
446
+ <Tab label="Angular" value="angular">
447
+ Angular использует директиву `[innerHTML]` для рендеринга контента Markdown.
448
+
449
+ ```typescript fileName="app.component.ts"
450
+ import { Component } from "@angular/core";
451
+ import { useIntlayer } from "angular-intlayer";
452
+
453
+ @Component({
454
+ selector: "app-root",
455
+ template: `<div [innerHTML]="content().myMarkdownContent"></div>`,
456
+ })
457
+ export class AppComponent {
458
+ content = useIntlayer("app");
459
+ }
460
+ ```
461
+
462
+ > Если провайдер IntlayerMarkdown не настроен, Intlayer будет выполнять рендеринг с использованием компилятора по умолчанию.
463
+
464
+ Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:
465
+
466
+ ```typescript
467
+ content().myMarkdownContent.use({
468
+ h1: { class: "text-3xl font-bold" },
469
+ })
470
+ ```
471
+
472
+ Вы можете получить Markdown в виде строки:
473
+
474
+ ```typescript
475
+ content().myMarkdownContent.value
476
+ String(content().myMarkdownContent)
477
+ content().myMarkdownContent.toString()
478
+ ```
479
+
480
+ И вы можете получить доступ к метаданным вашего markdown, например:
481
+
482
+ ```typescript
483
+ content().myMarkdownContent.metadata
484
+ content().myMarkdownContent.metadata.title
485
+ ```
486
+
487
+ </Tab>
488
+ </Tabs>
489
+
490
+ ## Suspense
491
+
492
+ Рендерер Markdown в Intlayer загружается динамически. Несмотря на оптимизацию, базовый фрагмент парсера составляет около 55 КБ. Его синхронная загрузка задерживает первоначальный рендеринг страницы и ухудшает First Contentful Paint (FCP).
493
+
494
+ Чтобы предотвратить блокировку пользовательского интерфейса, Intlayer интегрируется с API React Suspense. Он загружает парсер в фоновом режиме и выдает Promise во время загрузки.
495
+
496
+ Оберните любой компонент, рендерящий Intlayer Markdown, в границу `<Suspense>`. Это отобразит локализованное резервное состояние во время загрузки фрагмента, позволяя остальной части вашего DOM рендериться немедленно.
497
+
498
+ Предупреждение: Если вы не предоставите границу `<Suspense>`, React приостановит работу на корневом уровне или заблокирует рендеринг всего дерева компонентов до тех пор, пока фрагмент размером 55 КБ не будет полностью загружен.
499
+
500
+ <Tabs>
501
+ <Tab label="Next.js" value="nextjs">
502
+
503
+ В маршрутизаторе Next.js App Router вы можете использовать либо React `Suspense` для клиентских компонентов, либо файл `loading.tsx` для серверных компонентов.
504
+
505
+ **Клиентский компонент:**
506
+
507
+ ```tsx fileName="components/MyComponent.tsx"
508
+ "use client";
509
+ import { useIntlayer } from "next-intlayer";
510
+ import { Suspense } from "react";
511
+
512
+ const MyComponent = () => {
513
+ const markdownContent = useIntlayer("my-markdown");
514
+
515
+ return (
516
+ <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
517
+ );
518
+ };
519
+ ```
520
+
521
+ **Серверный компонент с `loading.tsx`:**
522
+
523
+ ```tsx fileName="app/loading.tsx"
524
+ export default function Loading() {
525
+ return <div>Loading...</div>;
526
+ }
527
+ ```
528
+
529
+ ```tsx fileName="app/page.tsx"
530
+ import { useIntlayer } from "next-intlayer/server";
531
+
532
+ const MyPage = () => {
533
+ const markdownContent = useIntlayer("my-markdown");
534
+ return <div>{markdownContent}</div>;
535
+ };
536
+
537
+ export default MyPage;
538
+ ```
539
+
540
+ </Tab>
541
+
542
+ <Tab label="React" value="react">
543
+
544
+ ```tsx
545
+ import { useIntlayer } from "react-intlayer";
546
+ import { Suspense } from "react";
547
+
548
+ const MyComponent = () => {
549
+ const markdownContent = useIntlayer("my-markdown");
550
+
551
+ return (
552
+ <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
553
+ );
554
+ };
555
+ ```
556
+
557
+ </Tab>
558
+
559
+ <Tab label="Vue" value="vue">
560
+
561
+ В Vue есть встроенный компонент `<Suspense>`. Оберните компонент, рендерящий содержимое Markdown, в границу `<Suspense>`.
562
+
563
+ ```vue fileName="MyComponent.vue"
564
+ <script setup>
565
+ import { useIntlayer } from "vue-intlayer";
566
+
567
+ const { markdownContent } = useIntlayer("my-markdown");
568
+ </script>
569
+
570
+ <template>
571
+ <Suspense>
572
+ <component :is="markdownContent" />
573
+ <template #fallback>
574
+ <div>Loading...</div>
575
+ </template>
576
+ </Suspense>
577
+ </template>
578
+ ```
579
+
580
+ </Tab>
581
+ <Tab label="Svelte" value="svelte">
582
+
583
+ Svelte не имеет эквивалента API Suspense. Используйте блок `{#await}` для обработки асинхронного рендеринга содержимого Markdown.
584
+
585
+ ```svelte fileName="MyComponent.svelte"
586
+ <script lang="ts">
587
+ import { useIntlayer } from "svelte-intlayer";
588
+
589
+ const content = useIntlayer("my-markdown");
590
+ </script>
591
+
592
+ {#await $content.markdownContent}
593
+ <div>Loading...</div>
594
+ {:then rendered}
595
+ {@html rendered}
596
+ {/await}
597
+ ```
598
+
599
+ </Tab>
600
+ <Tab label="Preact" value="preact">
601
+
602
+ Preact поддерживает API React Suspense через `preact/compat`.
603
+
604
+ ```tsx fileName="MyComponent.tsx"
605
+ import { useIntlayer } from "preact-intlayer";
606
+ import { Suspense } from "preact/compat";
607
+
608
+ const MyComponent = () => {
609
+ const markdownContent = useIntlayer("my-markdown");
610
+
611
+ return (
612
+ <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
613
+ );
614
+ };
615
+ ```
616
+
617
+ </Tab>
618
+ <Tab label="Solid" value="solid">
619
+
620
+ В Solid есть собственный компонент `<Suspense>` из `solid-js`.
621
+
622
+ ```tsx fileName="MyComponent.tsx"
623
+ import { useIntlayer } from "solid-intlayer";
624
+ import { Suspense } from "solid-js";
625
+
626
+ const MyComponent = () => {
627
+ const { markdownContent } = useIntlayer("my-markdown");
628
+
629
+ return (
630
+ <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
631
+ );
632
+ };
633
+ ```
634
+
635
+ </Tab>
636
+ <Tab label="Angular" value="angular">
637
+
638
+ Angular не имеет API Suspense. Используйте отложенные представления (`@defer`) для обработки лениво загружаемого содержимого Markdown (требуется Angular 17+).
639
+
640
+ ```typescript fileName="my.component.ts"
641
+ import { Component } from "@angular/core";
642
+ import { useIntlayer } from "angular-intlayer";
643
+
644
+ @Component({
645
+ selector: "app-my",
646
+ template: `
647
+ @defer {
648
+ <div [innerHTML]="content().markdownContent"></div>
649
+ } @loading {
650
+ <div>Loading...</div>
651
+ }
652
+ `,
653
+ })
654
+ export class MyComponent {
655
+ content = useIntlayer("my-markdown");
656
+ }
657
+ ```
658
+
659
+ </Tab>
660
+ </Tabs>
661
+
662
+ ---
663
+
664
+ ## Справочник по опциям
665
+
666
+ Эти параметры могут быть переданы в `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` и `renderMarkdown`.
667
+
668
+ | Option | Type | Default | Описание |
669
+ | :-------------------- | :---------- | :------ | :----------------------------------------------------------------------------------------- |
670
+ | `forceBlock` | `boolean` | `false` | Принудительно оборачивает вывод в блочный элемент (например, `<div>`). |
671
+ | `forceInline` | `boolean` | `false` | Принудительно оборачивает вывод во встроенный элемент (например, `<span>`). |
672
+ | `tagfilter` | `boolean` | `true` | Включает фильтр тегов GitHub для повышения безопасности путем удаления опасных тегов HTML. |
673
+ | `preserveFrontmatter` | `boolean` | `false` | Если `true`, начальный мета-блок (frontmatter) в строке Markdown не будет удален. |
674
+ | `components` | `Overrides` | `{}` | Карта HTML-тегов в пользовательские компоненты (например, `{ h1: MyHeading }`). |
675
+ | `wrapper` | `Component` | `null` | Пользовательский компонент для обертывания отрендеренного Markdown. |
676
+ | `renderMarkdown` | `Function` | `null` | Пользовательская функция рендеринга для полной замены компилятора Markdown по умолчанию. |
@@ -224,7 +224,7 @@ export const ComponentExample = () => {
224
224
 
225
225
  Звезды на GitHub - это сильный индикатор популярности проекта, доверия сообщества и долгосрочной актуальности. Хотя они не являются прямым показателем технического качества, они отражают, сколько разработчиков считают проект полезным, следят за его прогрессом и, вероятно, будут его использовать. Для оценки ценности проекта звезды помогают сравнивать популярность альтернатив и дают представление о росте экосистемы.
226
226
 
227
- [![Star History Chart](https://api.star-history.com/chart?repos=formatjs/formatjs%2Ci18next/react-i18next%2Ci18next/i18next%2Ci18next/next-i18next%2Clingui/js-lingui%2Camannn/next-intl%2Cintlify/vue-i18n%2Caymericzip/intlayer%2Copral/inlang&type=date&legend=top-left)](https://www.star-history.com/#formatjs/formatjs&i18next/react-i18next&i18next/i18next&i18next/next-i18next&lingui/js-lingui&amannn/next-intl&intlify/vue-i18n&opral/paraglide-js&aymericzip/intlayer)
227
+ [![Star History Chart](https://api.star-history.com/chart?repos=aymericzip/intlayer%2Cformatjs/formatjs%2Ci18next/react-i18next%2Ci18next/i18next%2Ci18next/next-i18next%2Clingui/js-lingui%2Camannn/next-intl%2Cintlify/vue-i18n%2Ccodingcommons/typesafe-i18n%2Copral/paraglide-js&type=date&legend=top-left)](https://www.star-history.com/#aymericzip/intlayer&formatjs/formatjs&i18next/react-i18next&i18next/i18next&i18next/next-i18next&lingui/js-lingui&amannn/next-intl&intlify/vue-i18n&codingcommons/typesafe-i18n&opral/paraglide-js)
228
228
 
229
229
  ---
230
230