@intlayer/docs 8.9.4 → 8.9.6-canary.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/docs/ar/benchmark/index.md +0 -3
- package/docs/ar/benchmark/nextjs.md +15 -6
- package/docs/ar/benchmark/solid.md +155 -0
- package/docs/ar/benchmark/svelte.md +148 -0
- package/docs/ar/benchmark/tanstack.md +12 -3
- package/docs/ar/benchmark/vue.md +160 -0
- package/docs/ar/configuration.md +16 -12
- package/docs/ar/dictionary/content_file.md +51 -1
- package/docs/ar/plugins/sync-po.md +0 -21
- package/docs/bn/configuration.md +16 -12
- package/docs/cs/configuration.md +16 -12
- package/docs/de/benchmark/index.md +0 -3
- package/docs/de/benchmark/nextjs.md +15 -6
- package/docs/de/benchmark/solid.md +155 -0
- package/docs/de/benchmark/svelte.md +148 -0
- package/docs/de/benchmark/tanstack.md +12 -3
- package/docs/de/benchmark/vue.md +160 -0
- package/docs/de/configuration.md +16 -12
- package/docs/de/dictionary/content_file.md +52 -2
- package/docs/de/plugins/sync-po.md +0 -22
- package/docs/en/benchmark/nextjs.md +11 -2
- package/docs/en/benchmark/solid.md +22 -4
- package/docs/en/benchmark/svelte.md +17 -5
- package/docs/en/benchmark/tanstack.md +18 -3
- package/docs/en/benchmark/vue.md +17 -11
- package/docs/en/configuration.md +16 -13
- package/docs/en/dictionary/content_file.md +51 -1
- package/docs/en/plugins/sync-po.md +0 -21
- package/docs/en-GB/benchmark/index.md +0 -3
- package/docs/en-GB/benchmark/nextjs.md +15 -6
- package/docs/en-GB/benchmark/solid.md +155 -0
- package/docs/en-GB/benchmark/svelte.md +148 -0
- package/docs/en-GB/benchmark/tanstack.md +12 -3
- package/docs/en-GB/benchmark/vue.md +160 -0
- package/docs/en-GB/configuration.md +15 -11
- package/docs/en-GB/dictionary/content_file.md +51 -1
- package/docs/en-GB/plugins/sync-po.md +0 -21
- package/docs/es/benchmark/index.md +0 -3
- package/docs/es/benchmark/nextjs.md +15 -6
- package/docs/es/benchmark/solid.md +155 -0
- package/docs/es/benchmark/svelte.md +148 -0
- package/docs/es/benchmark/tanstack.md +12 -3
- package/docs/es/benchmark/vue.md +160 -0
- package/docs/es/configuration.md +16 -12
- package/docs/es/dictionary/content_file.md +51 -1
- package/docs/es/plugins/sync-po.md +0 -21
- package/docs/fr/benchmark/index.md +0 -3
- package/docs/fr/benchmark/nextjs.md +15 -6
- package/docs/fr/benchmark/solid.md +155 -0
- package/docs/fr/benchmark/svelte.md +148 -0
- package/docs/fr/benchmark/tanstack.md +12 -3
- package/docs/fr/benchmark/vue.md +160 -0
- package/docs/fr/configuration.md +16 -12
- package/docs/fr/dictionary/content_file.md +51 -1
- package/docs/fr/plugins/sync-po.md +0 -21
- package/docs/hi/benchmark/nextjs.md +15 -6
- package/docs/hi/benchmark/solid.md +155 -0
- package/docs/hi/benchmark/svelte.md +148 -0
- package/docs/hi/benchmark/tanstack.md +12 -3
- package/docs/hi/benchmark/vue.md +160 -0
- package/docs/hi/configuration.md +16 -12
- package/docs/hi/dictionary/content_file.md +51 -1
- package/docs/hi/plugins/sync-po.md +0 -21
- package/docs/id/benchmark/index.md +0 -3
- package/docs/id/benchmark/nextjs.md +15 -6
- package/docs/id/benchmark/solid.md +155 -0
- package/docs/id/benchmark/svelte.md +148 -0
- package/docs/id/benchmark/tanstack.md +12 -3
- package/docs/id/benchmark/vue.md +160 -0
- package/docs/id/configuration.md +16 -12
- package/docs/id/dictionary/content_file.md +51 -1
- package/docs/id/plugins/sync-po.md +0 -21
- package/docs/it/benchmark/index.md +1 -4
- package/docs/it/benchmark/nextjs.md +15 -6
- package/docs/it/benchmark/solid.md +155 -0
- package/docs/it/benchmark/svelte.md +148 -0
- package/docs/it/benchmark/tanstack.md +12 -3
- package/docs/it/benchmark/vue.md +160 -0
- package/docs/it/configuration.md +16 -12
- package/docs/it/dictionary/content_file.md +51 -1
- package/docs/it/plugins/sync-po.md +0 -21
- package/docs/ja/benchmark/index.md +5 -5
- package/docs/ja/benchmark/nextjs.md +15 -6
- package/docs/ja/benchmark/solid.md +155 -0
- package/docs/ja/benchmark/svelte.md +148 -0
- package/docs/ja/benchmark/tanstack.md +12 -3
- package/docs/ja/benchmark/vue.md +160 -0
- package/docs/ja/configuration.md +16 -12
- package/docs/ja/dictionary/content_file.md +50 -2
- package/docs/ja/intlayer_with_nextjs_no_locale_path.md +4 -3
- package/docs/ja/plugins/sync-po.md +0 -21
- package/docs/ko/benchmark/nextjs.md +15 -6
- package/docs/ko/benchmark/solid.md +155 -0
- package/docs/ko/benchmark/svelte.md +148 -0
- package/docs/ko/benchmark/tanstack.md +12 -3
- package/docs/ko/benchmark/vue.md +160 -0
- package/docs/ko/configuration.md +16 -12
- package/docs/ko/dictionary/content_file.md +51 -1
- package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -2
- package/docs/ko/plugins/sync-po.md +0 -21
- package/docs/nl/configuration.md +16 -12
- package/docs/pl/benchmark/index.md +0 -3
- package/docs/pl/benchmark/nextjs.md +15 -6
- package/docs/pl/benchmark/solid.md +155 -0
- package/docs/pl/benchmark/svelte.md +148 -0
- package/docs/pl/benchmark/tanstack.md +12 -3
- package/docs/pl/benchmark/vue.md +160 -0
- package/docs/pl/configuration.md +16 -12
- package/docs/pl/dictionary/content_file.md +51 -1
- package/docs/pl/plugins/sync-po.md +0 -21
- package/docs/pt/benchmark/index.md +0 -3
- package/docs/pt/benchmark/nextjs.md +16 -7
- package/docs/pt/benchmark/solid.md +155 -0
- package/docs/pt/benchmark/svelte.md +148 -0
- package/docs/pt/benchmark/tanstack.md +13 -4
- package/docs/pt/benchmark/vue.md +160 -0
- package/docs/pt/configuration.md +16 -12
- package/docs/pt/dictionary/content_file.md +51 -1
- package/docs/pt/plugins/sync-po.md +0 -21
- package/docs/ru/benchmark/nextjs.md +15 -6
- package/docs/ru/benchmark/solid.md +155 -0
- package/docs/ru/benchmark/svelte.md +148 -0
- package/docs/ru/benchmark/tanstack.md +12 -3
- package/docs/ru/benchmark/vue.md +160 -0
- package/docs/ru/configuration.md +16 -12
- package/docs/ru/dictionary/content_file.md +52 -2
- package/docs/ru/plugins/sync-po.md +0 -21
- package/docs/tr/benchmark/index.md +0 -3
- package/docs/tr/benchmark/nextjs.md +15 -6
- package/docs/tr/benchmark/solid.md +155 -0
- package/docs/tr/benchmark/svelte.md +148 -0
- package/docs/tr/benchmark/tanstack.md +12 -3
- package/docs/tr/benchmark/vue.md +160 -0
- package/docs/tr/configuration.md +16 -12
- package/docs/tr/dictionary/content_file.md +51 -1
- package/docs/tr/plugins/sync-po.md +0 -21
- package/docs/uk/benchmark/nextjs.md +15 -6
- package/docs/uk/benchmark/solid.md +155 -0
- package/docs/uk/benchmark/svelte.md +148 -0
- package/docs/uk/benchmark/tanstack.md +12 -3
- package/docs/uk/benchmark/vue.md +160 -0
- package/docs/uk/configuration.md +16 -12
- package/docs/uk/dictionary/content_file.md +51 -1
- package/docs/uk/plugins/sync-po.md +0 -21
- package/docs/ur/configuration.md +16 -12
- package/docs/vi/benchmark/index.md +0 -3
- package/docs/vi/benchmark/nextjs.md +15 -6
- package/docs/vi/benchmark/solid.md +155 -0
- package/docs/vi/benchmark/svelte.md +148 -0
- package/docs/vi/benchmark/tanstack.md +12 -3
- package/docs/vi/benchmark/vue.md +160 -0
- package/docs/vi/configuration.md +16 -12
- package/docs/vi/dictionary/content_file.md +51 -1
- package/docs/vi/intlayer_with_nextjs_15.md +10 -57
- package/docs/vi/plugins/sync-po.md +0 -21
- package/docs/zh/benchmark/nextjs.md +15 -6
- package/docs/zh/benchmark/solid.md +155 -0
- package/docs/zh/benchmark/svelte.md +148 -0
- package/docs/zh/benchmark/tanstack.md +12 -3
- package/docs/zh/benchmark/vue.md +160 -0
- package/docs/zh/configuration.md +16 -12
- package/docs/zh/dictionary/content_file.md +51 -3
- package/docs/zh/plugins/sync-po.md +0 -21
- package/frequent_questions/ar/intlayerNode.md +3 -3
- package/frequent_questions/de/intlayerNode.md +3 -3
- package/frequent_questions/en/intlayerNode.md +3 -3
- package/frequent_questions/en-GB/intlayerNode.md +3 -3
- package/frequent_questions/es/intlayerNode.md +3 -3
- package/frequent_questions/fr/intlayerNode.md +3 -3
- package/frequent_questions/hi/intlayerNode.md +3 -3
- package/frequent_questions/id/intlayerNode.md +3 -3
- package/frequent_questions/it/intlayerNode.md +3 -3
- package/frequent_questions/ja/intlayerNode.md +3 -3
- package/frequent_questions/ko/intlayerNode.md +3 -3
- package/frequent_questions/pl/intlayerNode.md +3 -3
- package/frequent_questions/pt/intlayerNode.md +3 -3
- package/frequent_questions/ru/intlayerNode.md +3 -3
- package/frequent_questions/tr/intlayerNode.md +3 -3
- package/frequent_questions/uk/intlayerNode.md +3 -3
- package/frequent_questions/vi/intlayerNode.md +3 -3
- package/frequent_questions/zh/intlayerNode.md +3 -3
- package/package.json +8 -8
package/docs/pt/configuration.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-13
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-05-12
|
|
4
4
|
title: Configuração (Configuration)
|
|
5
5
|
description: Saiba como configurar o Intlayer para a sua aplicação. Entenda as várias configurações e opções disponíveis para personalizar o Intlayer conforme as suas necessidades.
|
|
6
6
|
keywords:
|
|
@@ -14,6 +14,9 @@ slugs:
|
|
|
14
14
|
- concept
|
|
15
15
|
- configuration
|
|
16
16
|
history:
|
|
17
|
+
- version: 8.9.4
|
|
18
|
+
date: 2026-05-12
|
|
19
|
+
changes: "Adicionar suporte para o provedor LM Studio"
|
|
17
20
|
- version: 8.7.0
|
|
18
21
|
date: 2026-04-08
|
|
19
22
|
changes: "Adicionadas as opções `prune` e `minify` à configuração de build"
|
|
@@ -350,7 +353,7 @@ const config: IntlayerConfig = {
|
|
|
350
353
|
ai: {
|
|
351
354
|
/**
|
|
352
355
|
* Provedor de IA a utilizar.
|
|
353
|
-
* Opções: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai'
|
|
356
|
+
* Opções: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
|
|
354
357
|
* Padrão: 'openai'
|
|
355
358
|
*/
|
|
356
359
|
provider: "openai",
|
|
@@ -919,16 +922,17 @@ O Intlayer suporta múltiplos provedores de IA para máxima flexibilidade. Os pr
|
|
|
919
922
|
- **Groq**
|
|
920
923
|
- **Amazon Bedrock**
|
|
921
924
|
- **Together.ai**
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
|
925
|
-
|
|
|
926
|
-
| `
|
|
927
|
-
| `
|
|
928
|
-
| `
|
|
929
|
-
| `
|
|
930
|
-
| `
|
|
931
|
-
| `
|
|
925
|
+
- **LM Studio**
|
|
926
|
+
|
|
927
|
+
| Campo | Descrição | Tipo | Padrão | Exemplo | Nota |
|
|
928
|
+
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
929
|
+
| `provider` | O provedor a utilizar para as funcionalidades de IA do Intlayer. | `'openai'` | <br/> `'anthropic'` | <br/> `'mistral'` | <br/> `'deepseek'` | <br/> `'gemini'` | <br/> `'ollama'` | <br/> `'openrouter'` | <br/> `'alibaba'` | <br/> `'fireworks'` | <br/> `'groq'` | <br/> `'huggingface'` | <br/> `'bedrock'` | <br/> `'googleaistudio'` | <br/> `'googlevertex'` | <br/> `'togetherai'` | <br/> `'lmstudio'` | `undefined` | `'anthropic'` | Diferentes provedores requerem diferentes chaves de API e têm preços diferentes. |
|
|
930
|
+
| `model` | O modelo a utilizar para as funcionalidades de IA. | `string` | Nenhum | `'gpt-4o-2024-11-20'` | O modelo específico varia de acordo com o provedor. |
|
|
931
|
+
| `temperature` | Controla a aleatoriedade das respostas da IA. | `number` | Nenhum | `0.1` | Temperatura mais alta = mais criativo e menos previsível. |
|
|
932
|
+
| `apiKey` | A sua chave de API para o provedor selecionado. | `string` | Nenhum | `process.env.OPENAI_API_KEY` | Para ser mantido secreto; armazenar em variáveis de ambiente. |
|
|
933
|
+
| `applicationContext` | Contexto adicional sobre a sua aplicação para ajudar a IA a gerar traduções mais precisas (domínio, público-alvo, tom, terminologia). | `string` | Nenhum | `'O meu contexto de aplicação'` | Pode ser usado para adicionar regras (ex: `"Não deves transformar os URLs"`). |
|
|
934
|
+
| `baseURL` | O URL base para a API de IA. | `string` | Nenhum | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Pode apontar para um endpoint de API de IA local ou personalizado. |
|
|
935
|
+
| `dataSerialization` | Formato de serialização de dados para as funcionalidades de IA. | `'json'` | <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: padrão, fiável; consome mais tokens.<br/>• `'toon'`: menos tokens, menos consistente.<br/>• Parâmetros adicionais são passados para o modelo como contexto (esforço de raciocínio, etc.). |
|
|
932
936
|
|
|
933
937
|
---
|
|
934
938
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-02-07
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-05-12
|
|
4
4
|
title: Arquivo de Conteúdo
|
|
5
5
|
description: Aprenda como personalizar as extensões para seus arquivos de declaração de conteúdo. Siga esta documentação para implementar condições de forma eficiente em seu projeto.
|
|
6
6
|
keywords:
|
|
@@ -12,6 +12,9 @@ slugs:
|
|
|
12
12
|
- concept
|
|
13
13
|
- content
|
|
14
14
|
history:
|
|
15
|
+
- version: 8.9.0
|
|
16
|
+
date: 2026-05-12
|
|
17
|
+
changes: "Adicionar tipo de nó de conteúdo `plural`"
|
|
15
18
|
- version: 8.0.0
|
|
16
19
|
date: 2026-01-28
|
|
17
20
|
changes: "Adicionar tipo de nó de conteúdo `html`"
|
|
@@ -63,6 +66,7 @@ import { type ReactNode } from "react";
|
|
|
63
66
|
import {
|
|
64
67
|
t,
|
|
65
68
|
enu,
|
|
69
|
+
plural,
|
|
66
70
|
cond,
|
|
67
71
|
nest,
|
|
68
72
|
md,
|
|
@@ -82,6 +86,7 @@ interface Content {
|
|
|
82
86
|
};
|
|
83
87
|
multilingualContent: string;
|
|
84
88
|
quantityContent: string;
|
|
89
|
+
pluralContent: string;
|
|
85
90
|
conditionalContent: string;
|
|
86
91
|
markdownContent: never;
|
|
87
92
|
htmlContent: never;
|
|
@@ -118,6 +123,10 @@ export default {
|
|
|
118
123
|
">5": "Alguns carros",
|
|
119
124
|
">19": "Muitos carros",
|
|
120
125
|
}),
|
|
126
|
+
pluralContent: plural({
|
|
127
|
+
one: "One car",
|
|
128
|
+
other: "{{count}} cars",
|
|
129
|
+
}),
|
|
121
130
|
conditionalContent: cond({
|
|
122
131
|
true: "Validação está ativada",
|
|
123
132
|
false: "Validação está desativada",
|
|
@@ -172,6 +181,13 @@ export default {
|
|
|
172
181
|
">5": "Alguns carros",
|
|
173
182
|
">19": "Muitos carros",
|
|
174
183
|
},
|
|
184
|
+
"pluralContent": {
|
|
185
|
+
"nodeType": "plural",
|
|
186
|
+
"plural": {
|
|
187
|
+
"one": "One car",
|
|
188
|
+
"other": "{{count}} cars",
|
|
189
|
+
},
|
|
190
|
+
},
|
|
175
191
|
},
|
|
176
192
|
"conditionalContent": {
|
|
177
193
|
"nodeType": "condition",
|
|
@@ -219,6 +235,7 @@ Nós de conteúdo são os blocos de construção do conteúdo do dicionário. El
|
|
|
219
235
|
- **Valores primitivos**: strings, números, booleanos, null, undefined
|
|
220
236
|
- **Nós tipados**: Tipos especiais de conteúdo como traduções, condições, markdown, etc.
|
|
221
237
|
- **Funções**: Conteúdo dinâmico que pode ser avaliado em tempo de execução [veja Busca por Função](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/function_fetching.md)
|
|
238
|
+
- **Conteúdo Plural**: Veja Conteúdo Plural [Veja Conteúdo Plural](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/plural.md)
|
|
222
239
|
- **Conteúdo aninhado**: Referências a outros dicionários
|
|
223
240
|
|
|
224
241
|
#### Tipos de Conteúdo
|
|
@@ -544,6 +561,8 @@ multilingualContent: t({
|
|
|
544
561
|
});
|
|
545
562
|
```
|
|
546
563
|
|
|
564
|
+
> Veja [Conteúdo de Tradução (`t`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/translation.md) para mais informações.
|
|
565
|
+
|
|
547
566
|
### Conteúdo Condicional (`cond`)
|
|
548
567
|
|
|
549
568
|
Conteúdo que muda com base em condições booleanas:
|
|
@@ -557,6 +576,8 @@ conditionalContent: cond({
|
|
|
557
576
|
});
|
|
558
577
|
```
|
|
559
578
|
|
|
579
|
+
> Veja [Conteúdo Condicional (`cond`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/condition.md) para mais informações.
|
|
580
|
+
|
|
560
581
|
### Conteúdo de Enumeração (`enu`)
|
|
561
582
|
|
|
562
583
|
Conteúdo que varia com base em valores enumerados:
|
|
@@ -571,6 +592,23 @@ statusContent: enu({
|
|
|
571
592
|
});
|
|
572
593
|
```
|
|
573
594
|
|
|
595
|
+
> Veja [Conteúdo de Enumeração (`enu`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/enumeration.md) para mais informações.
|
|
596
|
+
|
|
597
|
+
### Conteúdo Plural (`plural`)
|
|
598
|
+
|
|
599
|
+
Conteúdo que varia com base nas regras de plural:
|
|
600
|
+
|
|
601
|
+
```typescript
|
|
602
|
+
import { plural } from "intlayer";
|
|
603
|
+
|
|
604
|
+
pluralContent: plural({
|
|
605
|
+
one: "One car",
|
|
606
|
+
other: "{{count}} cars",
|
|
607
|
+
});
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
> Veja [Conteúdo Plural Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/plural.md) para mais informações.
|
|
611
|
+
|
|
574
612
|
### Conteúdo de Inserção (`insert`)
|
|
575
613
|
|
|
576
614
|
Conteúdo que pode ser inserido em outros conteúdos:
|
|
@@ -581,6 +619,8 @@ import { insert } from "intlayer";
|
|
|
581
619
|
insertionContent: insert("Este texto pode ser inserido em qualquer lugar");
|
|
582
620
|
```
|
|
583
621
|
|
|
622
|
+
> Veja [Conteúdo de Inserção (`insert`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/insertion.md) para mais informações.
|
|
623
|
+
|
|
584
624
|
### Conteúdo Aninhado (`nest`)
|
|
585
625
|
|
|
586
626
|
Referências a outros dicionários:
|
|
@@ -591,6 +631,8 @@ import { nest } from "intlayer";
|
|
|
591
631
|
nestedContent: nest("about-page");
|
|
592
632
|
```
|
|
593
633
|
|
|
634
|
+
> Veja [Conteúdo Aninhado (`nest`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/nesting.md) para mais informações.
|
|
635
|
+
|
|
594
636
|
### Conteúdo Markdown (`md`)
|
|
595
637
|
|
|
596
638
|
Conteúdo de texto rico em formato Markdown:
|
|
@@ -603,6 +645,8 @@ markdownContent: md(
|
|
|
603
645
|
);
|
|
604
646
|
```
|
|
605
647
|
|
|
648
|
+
> Veja [Conteúdo Markdown (`md`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/markdown.md) para mais informações.
|
|
649
|
+
|
|
606
650
|
### Conteúdo HTML (`html`)
|
|
607
651
|
|
|
608
652
|
Conteúdo HTML rico que pode usar tags padrão ou componentes personalizados:
|
|
@@ -620,6 +664,8 @@ localizedHtmlContent: t({
|
|
|
620
664
|
});
|
|
621
665
|
```
|
|
622
666
|
|
|
667
|
+
> Veja [Conteúdo HTML (`html`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/html.md) para mais informações.
|
|
668
|
+
|
|
623
669
|
### Conteúdo por Gênero (`gender`)
|
|
624
670
|
|
|
625
671
|
Conteúdo que varia com base no gênero:
|
|
@@ -634,6 +680,8 @@ genderContent: gender({
|
|
|
634
680
|
});
|
|
635
681
|
```
|
|
636
682
|
|
|
683
|
+
> Veja [Conteúdo por Gênero (`gender`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/gender.md) para mais informações.
|
|
684
|
+
|
|
637
685
|
### Conteúdo de Arquivo (`file`)
|
|
638
686
|
|
|
639
687
|
Referências a arquivos externos:
|
|
@@ -644,6 +692,8 @@ import { file } from "intlayer";
|
|
|
644
692
|
fileContent: file("./path/to/content.txt");
|
|
645
693
|
```
|
|
646
694
|
|
|
695
|
+
> Veja [Conteúdo de Arquivo (`file`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/file.md) para mais informações.
|
|
696
|
+
|
|
647
697
|
## Criando Arquivos de Conteúdo
|
|
648
698
|
|
|
649
699
|
### Estrutura Básica de Arquivo de Conteúdo
|
|
@@ -160,30 +160,9 @@ syncPO({
|
|
|
160
160
|
source: ({ key, locale }) => string, // obrigatório
|
|
161
161
|
location?: string, // rótulo opcional, padrão: "sync-po::path/to/source"
|
|
162
162
|
priority?: number, // prioridade opcional para resolução de conflitos, padrão: 0
|
|
163
|
-
format?: 'icu' | 'i18next' | 'vue-i18n', // opcional, necessário apenas quando seus valores msgstr usam uma sintaxe de interpolação específica
|
|
164
163
|
});
|
|
165
164
|
```
|
|
166
165
|
|
|
167
|
-
#### `format` ('icu' | 'i18next' | 'vue-i18n')
|
|
168
|
-
|
|
169
|
-
Arquivos PO são sempre arquivos Gettext Portable Object — isso é fixo. Esta opção descreve apenas a **sintaxe de interpolação** usada dentro dos valores `msgstr`, para que o Intlayer possa convertê-los em seu próprio formato no momento da análise (via `formatDictionary`) e de volta ao gravar a saída.
|
|
170
|
-
|
|
171
|
-
- `undefined` _(padrão)_: os valores `msgstr` são tratados como strings simples — sem transformação. Use isso para a maioria dos arquivos PO.
|
|
172
|
-
- `'icu'`: os valores `msgstr` usam a sintaxe de mensagem ICU (ex: `{count, plural, one {# item} other {# items}}`).
|
|
173
|
-
- `'i18next'`: os valores `msgstr` usam a sintaxe de interpolação i18next (ex: `{{variable}}`).
|
|
174
|
-
- `'vue-i18n'`: os valores `msgstr` usam a sintaxe Vue I18n.
|
|
175
|
-
|
|
176
|
-
> A transformação é aplicada pelo `formatDictionary` do `@intlayer/chokidar` no carregamento e revertida com `formatDictionaryOutput` na gravação. Para regras complexas como plurais ICU, a fidelidade de ida e volta não é garantida.
|
|
177
|
-
|
|
178
|
-
**Exemplo — arquivos PO contêm interpolação no estilo i18next:**
|
|
179
|
-
|
|
180
|
-
```ts
|
|
181
|
-
syncPO({
|
|
182
|
-
source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
|
|
183
|
-
format: "i18next",
|
|
184
|
-
}),
|
|
185
|
-
```
|
|
186
|
-
|
|
187
166
|
### Múltiplas fontes PO e prioridade
|
|
188
167
|
|
|
189
168
|
Você pode adicionar vários plugins `syncPO` para sincronizar diferentes fontes PO. Isso é útil quando você tem várias fontes de tradução ou estruturas PO diferentes em seu projeto.
|
|
@@ -61,6 +61,13 @@ history:
|
|
|
61
61
|
|
|
62
62
|
Intlayer пытается оптимизировать все эти аспекты.
|
|
63
63
|
|
|
64
|
+
## TL;DR
|
|
65
|
+
|
|
66
|
+
- **Intlayer** и **next-translate**: Лучшие варианты для производительности Next.js, предлагающие минимальный размер и лучшую поддержку статического рендеринга.
|
|
67
|
+
- **next-intl**: Самый модный вариант, но тяжелый и сложный в оптимизации для больших приложений.
|
|
68
|
+
- **next-i18next**: Популярный и богатый плагинами, но имеет значительный вес бандла (~3× Intlayer).
|
|
69
|
+
- **Избегайте**: **gt-next** и **lingo.dev** из-за серьезных проблем с производительностью, привязки к вендору и багов, ломающих сборку.
|
|
70
|
+
|
|
64
71
|
## Проверьте свое приложение
|
|
65
72
|
|
|
66
73
|
Чтобы выявить эти проблемы, я создал бесплатный сканер, который вы можете попробовать [здесь](https://intlayer.org/i18n-seo-scanner).
|
|
@@ -99,14 +106,14 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
99
106
|
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
100
107
|
|
|
101
108
|
- `Base App` (Без библиотеки i18n)
|
|
102
|
-
- `next-intlayer` (v8.7.
|
|
109
|
+
- `next-intlayer` (v8.7.12)
|
|
103
110
|
- `next-i18next` (v16.0.5)
|
|
104
111
|
- `next-intl` (v4.9.1)
|
|
105
112
|
- `@lingui/core` (v5.3.0)
|
|
106
113
|
- `next-translate` (v3.1.2)
|
|
107
114
|
- `next-international` (v1.3.1)
|
|
108
115
|
- `@inlang/paraglide-js` (v2.15.1)
|
|
109
|
-
-
|
|
116
|
+
- `@tolgee/react` (v7.0.0)
|
|
110
117
|
- `@lingo.dev/compiler` (v0.4.0)
|
|
111
118
|
- `wuchale` (v0.22.11)
|
|
112
119
|
- `gt-next` (v6.16.5)
|
|
@@ -161,10 +168,10 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
161
168
|
|
|
162
169
|
**(General Translation)** (`gt-next@6.16.5`):
|
|
163
170
|
|
|
164
|
-
- Для приложения весом 110 КБ `gt-
|
|
171
|
+
- Для приложения весом 110 КБ `gt-next` добавляет более 440 КБ сверху.
|
|
165
172
|
- `Quota Exceeded, please upgrade your plan` (Квота превышена, пожалуйста, обновите тарифный план) при самой первой сборке с General Translation.
|
|
166
173
|
- Переводы не отображаются; я получаю ошибку `Error: <T> used on the client-side outside of <GTProvider>`, что кажется багом библиотеки.
|
|
167
|
-
- При внедрении **gt-
|
|
174
|
+
- При внедрении **gt-next** я также столкнулся с [проблемой](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) в библиотеке: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, которая приводила к поломке приложения. После сообщения об этой проблеме сопровождающий исправил ее в течение 24 часов.
|
|
168
175
|
- Библиотека блокирует статический рендеринг страниц Next.js.
|
|
169
176
|
|
|
170
177
|
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.0`):
|
|
@@ -186,9 +193,11 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
186
193
|
Лично мне не нравится необходимость перегенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов слияния в PR. Инструмент также кажется более ориентированным на Vite, чем на Next.js.
|
|
187
194
|
Наконец, по сравнению с другими решениями, Paraglide не использует хранилище (например, React context) для получения текущей локали для рендеринга контента. Для каждого обрабатываемого узла он запрашивает локаль из localStorage / куки и т.д. Это приводит к выполнению ненужной логики, которая влияет на реактивность компонентов.
|
|
188
195
|
|
|
196
|
+
> Примечание по paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате показатель 'размер библиотеки' в отчете о бенчмарке практически равен 0. Генерация кода — это хорошо, так как используемая функция будет включать только необходимую логику (все префиксы против отсутствия префиксов, куки против хранилища и т.д.). В сравнении с этим, Intlayer выполняет фильтрацию с помощью внедрения переменных окружения в сборку, чтобы заставить сборщик исключить контент в зависимости от логики. Благодаря этому paraglide и intlayer оказываются в 6-10 раз легче, чем i18next или next-intl.
|
|
197
|
+
|
|
189
198
|
### 3 — Приемлемые решения
|
|
190
199
|
|
|
191
|
-
**(Tolgee)** (
|
|
200
|
+
**(Tolgee)** (`@tolgee/react@7.0.0`):
|
|
192
201
|
|
|
193
202
|
`Tolgee` решает многие из упомянутых ранее проблем. Мне показалось, что его сложнее внедрить, чем аналогичные инструменты. Он не обеспечивает типобезопасность, что также затрудняет отлов отсутствующих ключей на этапе компиляции. Мне пришлось обернуть функции Tolgee своими собственными, чтобы добавить обнаружение отсутствующих ключей.
|
|
194
203
|
|
|
@@ -216,7 +225,7 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
216
225
|
|
|
217
226
|
`next-translate` — моя основная рекомендация, если вам нравится API в стиле `t()`. Он элегантен благодаря `next-translate-plugin`, загружая пространства имен через `getStaticProps` с помощью загрузчика Webpack / Turbopack. Это также самый легкий вариант (~2.5 КБ). Что касается пространств имен, их определение для каждой страницы или маршрута в конфиге хорошо продумано и проще в обслуживании, чем основные альтернативы, такие как **next-intl** или **next-i18next**. В версии `3.1.2` я заметил, что статический рендеринг не работал; Next.js откатывался к динамическому рендерингу.
|
|
218
227
|
|
|
219
|
-
**(Intlayer)** (`next-intlayer@8.7.
|
|
228
|
+
**(Intlayer)** (`next-intlayer@8.7.12`):
|
|
220
229
|
|
|
221
230
|
Я не буду лично судить о `next-intlayer` ради объективности, так как это мое собственное решение.
|
|
222
231
|
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-20
|
|
3
|
+
updatedAt: 2026-04-21
|
|
4
|
+
title: Лучшее i18n решение для Solid в 2026 году - Отчет о бенчмарке
|
|
5
|
+
description: Сравните библиотеки интернационализации (i18n) для Solid, такие как solid-primitives, solid-i18next и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
|
|
6
|
+
keywords:
|
|
7
|
+
- benchmark
|
|
8
|
+
- i18n
|
|
9
|
+
- intl
|
|
10
|
+
- solid
|
|
11
|
+
- производительность
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- benchmark
|
|
16
|
+
- solid
|
|
17
|
+
author: Aymeric PINEAU
|
|
18
|
+
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-solid-template
|
|
19
|
+
history:
|
|
20
|
+
- version: 8.7.12
|
|
21
|
+
date: 2026-01-06
|
|
22
|
+
changes: "Инициализация бенчмарка"
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Библиотеки i18n для Solid — Отчет о бенчмарке 2026
|
|
26
|
+
|
|
27
|
+
Эта страница представляет собой отчет о бенчмарке i18n-решений для Solid.
|
|
28
|
+
|
|
29
|
+
## Содержание
|
|
30
|
+
|
|
31
|
+
<Toc/>
|
|
32
|
+
|
|
33
|
+
## Интерактивный бенчмарк
|
|
34
|
+
|
|
35
|
+
<I18nBenchmark framework="vite-solid" vertical/>
|
|
36
|
+
|
|
37
|
+
## Ссылка на результаты:
|
|
38
|
+
|
|
39
|
+
<iframe
|
|
40
|
+
src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_solid.md"
|
|
41
|
+
width="100%"
|
|
42
|
+
height="600px"
|
|
43
|
+
style="border:none;">
|
|
44
|
+
</iframe>
|
|
45
|
+
|
|
46
|
+
> https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_solid.md
|
|
47
|
+
|
|
48
|
+
Полный репозиторий бенчмарка можно найти [здесь](https://github.com/intlayer-org/benchmark-i18n/tree/main).
|
|
49
|
+
|
|
50
|
+
## Введение
|
|
51
|
+
|
|
52
|
+
Решения для интернационализации являются одними из самых тяжелых зависимостей в Solid-приложении. Основной риск заключается в передаче ненужного контента: переводов для других страниц и других локалей в бандле одного маршрута.
|
|
53
|
+
|
|
54
|
+
По мере роста вашего приложения эта проблема может быстро привести к раздуванию JavaScript, отправляемого клиенту, и замедлению навигации.
|
|
55
|
+
|
|
56
|
+
На практике в наименее оптимизированных реализациях интернационализированная страница может оказаться в несколько раз тяжелее версии без i18n.
|
|
57
|
+
|
|
58
|
+
Другой аспект — это опыт разработчика: то, как вы объявляете контент, типы, организацию пространств имен, динамическую загрузку и реактивность при смене локали.
|
|
59
|
+
|
|
60
|
+
## TL;DR
|
|
61
|
+
|
|
62
|
+
- **Intlayer**: Рекомендуемый выбор для профессиональных Solid-приложений, требующих расширенных функций и оптимизации (v8.7.12).
|
|
63
|
+
- **@solid-primitives/i18n**: Отличная легкая альтернатива для простых проектов, хотя ей не хватает расширенных функций, таких как ленивая загрузка.
|
|
64
|
+
- **solid-i18next**: Стандартный, но тяжелый вариант (~4.7 раза больше Intlayer) с теми же недостатками, что и React i18next.
|
|
65
|
+
- **Paraglide**: Инновационный подход, но сложный DX и проблемы с tree-shaking в некоторых конфигурациях.
|
|
66
|
+
|
|
67
|
+
## Проверьте свое приложение
|
|
68
|
+
|
|
69
|
+
Чтобы быстро выявить проблемы с утечкой i18n, я настроил бесплатный сканер, доступный [здесь](https://intlayer.org/i18n-seo-scanner).
|
|
70
|
+
|
|
71
|
+
<iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
|
|
72
|
+
|
|
73
|
+
## Проблема
|
|
74
|
+
|
|
75
|
+
Два рычага необходимы для ограничения стоимости мультиязычного приложения:
|
|
76
|
+
|
|
77
|
+
- Разделение контента по страницам / пространствам имен, чтобы не загружать целые словари, когда они вам не нужны.
|
|
78
|
+
- Динамическая загрузка нужной локали только тогда, когда она требуется.
|
|
79
|
+
|
|
80
|
+
Понимание технических ограничений этих подходов:
|
|
81
|
+
|
|
82
|
+
**Динамическая загрузка**
|
|
83
|
+
|
|
84
|
+
Без динамической загрузки большинство решений хранят сообщения в памяти с первого рендеринга, что создает значительные накладные расходы для приложений с множеством маршрутов и локалей.
|
|
85
|
+
|
|
86
|
+
При использовании динамической загрузки вы идете на компромисс: меньше начального JS, но иногда дополнительный запрос при переключении языка.
|
|
87
|
+
|
|
88
|
+
**Разделение контента**
|
|
89
|
+
|
|
90
|
+
Синтаксис, построенный вокруг `t('a.b.c')`, очень удобен, но часто способствует хранению больших JSON-объектов во время выполнения. Эта модель затрудняет tree-shaking, если библиотека не предлагает реальную стратегию разделения контента для каждой страницы.
|
|
91
|
+
|
|
92
|
+
## Методология
|
|
93
|
+
|
|
94
|
+
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
95
|
+
|
|
96
|
+
- `Base App` (Без библиотеки i18n)
|
|
97
|
+
- `solid-intlayer` (v8.7.12)
|
|
98
|
+
- `@solid-primitives/i18n` (v2.2.1)
|
|
99
|
+
- `solid-i18next` (v17.0.2)
|
|
100
|
+
- `@inlang/paraglide-js` (v2.17.0)
|
|
101
|
+
|
|
102
|
+
Фреймворк — `Solid` с мультиязычным приложением из **10 страниц** и **10 языков**.
|
|
103
|
+
|
|
104
|
+
Мы сравнили **четыре стратегии загрузки**:
|
|
105
|
+
|
|
106
|
+
| Стратегия | Без пространств имен (глобальная) | С пространствами имен (локальная/scoped) |
|
|
107
|
+
| :------------------------ | :---------------------------------------------- | :------------------------------------------------------------------------------- |
|
|
108
|
+
| **Статическая загрузка** | **Static**: Все в памяти при запуске. | **Scoped static**: Разделено по пространствам имен; все загружается при запуске. |
|
|
109
|
+
| **Динамическая загрузка** | **Dynamic**: Загрузка по требованию для локали. | **Scoped dynamic**: Гранулярная загрузка по пространствам имен и локалям. |
|
|
110
|
+
|
|
111
|
+
## Резюме стратегий
|
|
112
|
+
|
|
113
|
+
- **Статическая (Static)**: Простота; отсутствие задержек сети после начальной загрузки. Минус: большой размер бандла.
|
|
114
|
+
- **Динамическая (Dynamic)**: Уменьшает начальный вес (ленивая загрузка). Идеально при наличии множества локалей.
|
|
115
|
+
- **Локальная статическая (Scoped static)**: Позволяет организовать код (логическое разделение) без сложных дополнительных сетевых запросов.
|
|
116
|
+
- **Локальная динамическая (Scoped dynamic)**: Лучший подход для _разделения кода_ и производительности. Минимизирует использование памяти, загружая только то, что нужно для текущего представления и активной локали.
|
|
117
|
+
|
|
118
|
+
## Результаты в деталях
|
|
119
|
+
|
|
120
|
+
### 1 — Решения, которых следует избегать
|
|
121
|
+
|
|
122
|
+
> В экосистеме Solid нет однозначных решений, которых следует избегать.
|
|
123
|
+
|
|
124
|
+
### 2 — Приемлемые решения
|
|
125
|
+
|
|
126
|
+
**(solid-i18next)** (`solid-i18next@17.0.2`):
|
|
127
|
+
|
|
128
|
+
`solid-i18next`, вероятно, является самым популярным вариантом, так как был одним из первых решений для нужд i18n в JavaScript-приложениях. У него также есть широкий набор плагинов от сообщества для конкретных задач.
|
|
129
|
+
|
|
130
|
+
Пакет тяжелый (~14.6 КБ, что примерно в 4.7 раза больше `solid-intlayer`).
|
|
131
|
+
|
|
132
|
+
Тем не менее, у него те же основные недостатки, что и у стеков, построенных на `t('a.b.c')`: оптимизация возможна, но отнимает очень много времени, а большие проекты рискуют столкнуться с плохими практиками (пространства имен + динамическая загрузка + типы).
|
|
133
|
+
|
|
134
|
+
**(@solid-primitives/i18n)** (`@solid-primitives/i18n@2.2.1`):
|
|
135
|
+
|
|
136
|
+
Solid primitive чрезвычайно легкий и эффективный. Я рекомендую это решение для небольших проектов, но ему может быстро перестать хватать функций для профессиональных решений, включая управление куки, перенаправление прокси, форматировщики и т. д.
|
|
137
|
+
В нем также отсутствует ленивая загрузка и разделение пространств имен для оптимизации размера страницы.
|
|
138
|
+
|
|
139
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.17.0`):
|
|
140
|
+
|
|
141
|
+
`Paraglide` предлагает инновационный, хорошо продуманный подход. Тем не менее, в этом бенчмарке рекламируемый ими tree-shaking не сработал для моей реализации. Процесс работы и DX также сложнее, чем у других вариантов.
|
|
142
|
+
Лично мне не нравится необходимость регенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов при слиянии в PR.
|
|
143
|
+
Наконец, по сравнению с другими решениями, Paraglide не использует стор (например, Solid signal) для получения текущей локали для рендеринга. Для каждого обработанного узла он запрашивает локаль из localStorage / куки и т.д. Это приводит к выполнению ненужной логики, что влияет на реактивность компонентов.
|
|
144
|
+
|
|
145
|
+
### 3 — Рекомендации
|
|
146
|
+
|
|
147
|
+
**(Intlayer)** (`solid-intlayer@8.7.12`):
|
|
148
|
+
|
|
149
|
+
Я не буду лично оценивать `solid-intlayer` ради объективности, так как это мое собственное решение.
|
|
150
|
+
|
|
151
|
+
### Личное примечание
|
|
152
|
+
|
|
153
|
+
Это примечание является личным и не влияет на результаты бенчмарка. Тем не менее, в мире i18n часто можно встретить консенсус вокруг паттерна типа `const t = useTranslation('xx')` + `<>{t('xx.xx')}</>` для переведенного контента.
|
|
154
|
+
|
|
155
|
+
В Solid-приложениях внедрение функции в качестве `JSX.Element` является, на мой взгляд, антипаттерном. Это также добавляет лишнюю сложность и накладные расходы на выполнение JavaScript (даже если это почти незаметно).
|