@intlayer/docs 8.6.0 → 8.6.10
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/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +60 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +60 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +3 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/cli/index.md +54 -42
- package/docs/ar/cli/init.md +32 -20
- package/docs/ar/cli/standalone.md +91 -0
- package/docs/ar/configuration.md +39 -7
- package/docs/ar/custom_domains.md +250 -0
- package/docs/ar/intlayer_with_tanstack+solid.md +14 -33
- package/docs/ar/intlayer_with_tanstack.md +25 -16
- package/docs/ar/intlayer_with_vanilla.md +506 -0
- package/docs/bn/cli/index.md +195 -0
- package/docs/bn/cli/init.md +96 -0
- package/docs/bn/cli/standalone.md +91 -0
- package/docs/bn/configuration.md +46 -14
- package/docs/bn/custom_domains.md +250 -0
- package/docs/bn/intlayer_with_vanilla.md +506 -0
- package/docs/cs/cli/index.md +195 -0
- package/docs/cs/cli/init.md +96 -0
- package/docs/cs/cli/standalone.md +91 -0
- package/docs/cs/configuration.md +46 -7
- package/docs/cs/custom_domains.md +250 -0
- package/docs/cs/intlayer_with_vanilla.md +506 -0
- package/docs/de/cli/index.md +53 -41
- package/docs/de/cli/standalone.md +91 -0
- package/docs/de/configuration.md +46 -7
- package/docs/de/custom_domains.md +250 -0
- package/docs/de/intlayer_with_tanstack+solid.md +15 -36
- package/docs/de/intlayer_with_tanstack.md +25 -16
- package/docs/de/intlayer_with_vanilla.md +506 -0
- package/docs/en/bundle_optimization.md +288 -23
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/init.md +13 -1
- package/docs/en/cli/standalone.md +91 -0
- package/docs/en/configuration.md +46 -7
- package/docs/en/custom_domains.md +245 -0
- package/docs/en/intlayer_with_tanstack+solid.md +15 -36
- package/docs/en/intlayer_with_tanstack.md +25 -16
- package/docs/en/intlayer_with_vanilla.md +506 -0
- package/docs/en-GB/cli/index.md +56 -44
- package/docs/en-GB/cli/init.md +28 -21
- package/docs/en-GB/cli/standalone.md +91 -0
- package/docs/en-GB/configuration.md +53 -14
- package/docs/en-GB/custom_domains.md +250 -0
- package/docs/en-GB/intlayer_with_tanstack+solid.md +15 -36
- package/docs/en-GB/intlayer_with_tanstack.md +25 -16
- package/docs/en-GB/intlayer_with_vanilla.md +506 -0
- package/docs/es/cli/index.md +65 -53
- package/docs/es/cli/init.md +33 -21
- package/docs/es/cli/standalone.md +91 -0
- package/docs/es/configuration.md +39 -1
- package/docs/es/custom_domains.md +250 -0
- package/docs/es/intlayer_with_tanstack+solid.md +15 -36
- package/docs/es/intlayer_with_tanstack.md +25 -16
- package/docs/es/intlayer_with_vanilla.md +506 -0
- package/docs/fr/cli/index.md +43 -31
- package/docs/fr/cli/init.md +37 -25
- package/docs/fr/cli/standalone.md +91 -0
- package/docs/fr/configuration.md +46 -7
- package/docs/fr/custom_domains.md +250 -0
- package/docs/fr/intlayer_with_tanstack+solid.md +15 -36
- package/docs/fr/intlayer_with_tanstack.md +25 -16
- package/docs/fr/intlayer_with_vanilla.md +506 -0
- package/docs/hi/cli/index.md +71 -59
- package/docs/hi/cli/init.md +37 -33
- package/docs/hi/cli/standalone.md +91 -0
- package/docs/hi/configuration.md +39 -7
- package/docs/hi/custom_domains.md +250 -0
- package/docs/hi/intlayer_with_tanstack+solid.md +14 -33
- package/docs/hi/intlayer_with_tanstack.md +25 -16
- package/docs/hi/intlayer_with_vanilla.md +506 -0
- package/docs/id/cli/index.md +59 -47
- package/docs/id/cli/init.md +32 -25
- package/docs/id/cli/standalone.md +91 -0
- package/docs/id/configuration.md +46 -7
- package/docs/id/custom_domains.md +250 -0
- package/docs/id/intlayer_with_tanstack+solid.md +14 -33
- package/docs/id/intlayer_with_tanstack.md +25 -16
- package/docs/id/intlayer_with_vanilla.md +506 -0
- package/docs/it/cli/index.md +58 -41
- package/docs/it/cli/init.md +37 -38
- package/docs/it/cli/standalone.md +91 -0
- package/docs/it/configuration.md +46 -7
- package/docs/it/custom_domains.md +250 -0
- package/docs/it/intlayer_with_tanstack+solid.md +15 -36
- package/docs/it/intlayer_with_tanstack.md +25 -16
- package/docs/it/intlayer_with_vanilla.md +506 -0
- package/docs/ja/cli/index.md +59 -47
- package/docs/ja/cli/init.md +36 -24
- package/docs/ja/cli/standalone.md +91 -0
- package/docs/ja/configuration.md +46 -7
- package/docs/ja/custom_domains.md +250 -0
- package/docs/ja/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ja/intlayer_with_tanstack.md +25 -16
- package/docs/ja/intlayer_with_vanilla.md +506 -0
- package/docs/ko/cli/index.md +58 -46
- package/docs/ko/cli/init.md +39 -35
- package/docs/ko/cli/standalone.md +91 -0
- package/docs/ko/configuration.md +47 -8
- package/docs/ko/custom_domains.md +250 -0
- package/docs/ko/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ko/intlayer_with_tanstack.md +25 -16
- package/docs/ko/intlayer_with_vanilla.md +506 -0
- package/docs/nl/cli/index.md +195 -0
- package/docs/nl/cli/init.md +96 -0
- package/docs/nl/cli/standalone.md +91 -0
- package/docs/nl/configuration.md +46 -7
- package/docs/nl/custom_domains.md +250 -0
- package/docs/nl/intlayer_with_vanilla.md +506 -0
- package/docs/pl/cli/index.md +56 -44
- package/docs/pl/cli/init.md +36 -32
- package/docs/pl/cli/standalone.md +91 -0
- package/docs/pl/configuration.md +46 -7
- package/docs/pl/custom_domains.md +250 -0
- package/docs/pl/intlayer_with_tanstack+solid.md +14 -33
- package/docs/pl/intlayer_with_tanstack.md +25 -16
- package/docs/pl/intlayer_with_vanilla.md +506 -0
- package/docs/pt/cli/index.md +64 -52
- package/docs/pt/cli/init.md +35 -31
- package/docs/pt/cli/standalone.md +91 -0
- package/docs/pt/configuration.md +46 -7
- package/docs/pt/custom_domains.md +250 -0
- package/docs/pt/intlayer_with_tanstack+solid.md +15 -36
- package/docs/pt/intlayer_with_tanstack.md +25 -16
- package/docs/pt/intlayer_with_vanilla.md +506 -0
- package/docs/ru/cli/index.md +54 -42
- package/docs/ru/cli/init.md +31 -27
- package/docs/ru/cli/standalone.md +91 -0
- package/docs/ru/configuration.md +46 -7
- package/docs/ru/custom_domains.md +250 -0
- package/docs/ru/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ru/intlayer_with_tanstack.md +25 -16
- package/docs/ru/intlayer_with_vanilla.md +506 -0
- package/docs/tr/cli/index.md +64 -52
- package/docs/tr/cli/init.md +37 -30
- package/docs/tr/cli/standalone.md +91 -0
- package/docs/tr/configuration.md +46 -7
- package/docs/tr/custom_domains.md +250 -0
- package/docs/tr/intlayer_with_tanstack+solid.md +14 -33
- package/docs/tr/intlayer_with_tanstack.md +25 -16
- package/docs/tr/intlayer_with_vanilla.md +506 -0
- package/docs/uk/cli/index.md +60 -55
- package/docs/uk/cli/init.md +32 -20
- package/docs/uk/cli/standalone.md +91 -0
- package/docs/uk/configuration.md +46 -7
- package/docs/uk/custom_domains.md +250 -0
- package/docs/uk/intlayer_with_tanstack+solid.md +14 -33
- package/docs/uk/intlayer_with_tanstack.md +25 -16
- package/docs/uk/intlayer_with_vanilla.md +506 -0
- package/docs/ur/cli/index.md +195 -0
- package/docs/ur/cli/init.md +96 -0
- package/docs/ur/cli/standalone.md +91 -0
- package/docs/ur/configuration.md +46 -7
- package/docs/ur/custom_domains.md +250 -0
- package/docs/ur/intlayer_with_vanilla.md +506 -0
- package/docs/vi/cli/index.md +72 -61
- package/docs/vi/cli/init.md +33 -21
- package/docs/vi/cli/standalone.md +91 -0
- package/docs/vi/configuration.md +46 -7
- package/docs/vi/custom_domains.md +250 -0
- package/docs/vi/intlayer_with_tanstack+solid.md +14 -33
- package/docs/vi/intlayer_with_tanstack.md +25 -16
- package/docs/vi/intlayer_with_vanilla.md +506 -0
- package/docs/zh/cli/index.md +56 -49
- package/docs/zh/cli/init.md +30 -18
- package/docs/zh/cli/standalone.md +91 -0
- package/docs/zh/configuration.md +46 -7
- package/docs/zh/custom_domains.md +250 -0
- package/docs/zh/intlayer_with_tanstack+solid.md +15 -36
- package/docs/zh/intlayer_with_tanstack.md +25 -16
- package/docs/zh/intlayer_with_vanilla.md +506 -0
- package/package.json +8 -8
- package/src/doc.ts +4 -1
- package/src/generated/docs.entry.ts +60 -0
- package/docs/ar/bundle_optimization.md +0 -185
- package/docs/de/bundle_optimization.md +0 -195
- package/docs/en-GB/bundle_optimization.md +0 -184
- package/docs/es/bundle_optimization.md +0 -194
- package/docs/fr/bundle_optimization.md +0 -184
- package/docs/hi/bundle_optimization.md +0 -185
- package/docs/id/bundle_optimization.md +0 -185
- package/docs/it/bundle_optimization.md +0 -185
- package/docs/ja/bundle_optimization.md +0 -185
- package/docs/ko/bundle_optimization.md +0 -185
- package/docs/pl/bundle_optimization.md +0 -185
- package/docs/pt/bundle_optimization.md +0 -184
- package/docs/ru/bundle_optimization.md +0 -185
- package/docs/tr/bundle_optimization.md +0 -184
- package/docs/uk/bundle_optimization.md +0 -186
- package/docs/vi/bundle_optimization.md +0 -185
- package/docs/zh/bundle_optimization.md +0 -185
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-03-31
|
|
3
|
+
updatedAt: 2026-03-31
|
|
4
|
+
title: i18n Vanilla JS - Como traduzir uma aplicação Vanilla JS em 2026
|
|
5
|
+
description: Descubra como tornar o seu site Vanilla JS multilíngue. Siga a documentação para internacionalizar (i18n) e traduzi-lo.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internacionalização
|
|
8
|
+
- Documentação
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Vanilla JS
|
|
11
|
+
- JavaScript
|
|
12
|
+
- TypeScript
|
|
13
|
+
- HTML
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- environment
|
|
17
|
+
- vanilla
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vanilla-template
|
|
19
|
+
history:
|
|
20
|
+
- version: 8.4.10
|
|
21
|
+
date: 2026-03-31
|
|
22
|
+
changes: "Início do histórico"
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Traduza o seu site Vanilla JS usando Intlayer | Internacionalização (i18n)
|
|
26
|
+
|
|
27
|
+
## Índice
|
|
28
|
+
|
|
29
|
+
<TOC/>
|
|
30
|
+
|
|
31
|
+
## O que é o Intlayer?
|
|
32
|
+
|
|
33
|
+
O **Intlayer** é uma biblioteca de internacionalização (i18n) inovadora e de código aberto, projetada para simplificar o suporte multilíngue em aplicações web modernas.
|
|
34
|
+
|
|
35
|
+
Com o Intlayer, você pode:
|
|
36
|
+
|
|
37
|
+
- **Gerir facilmente as traduções** utilizando dicionários declarativos ao nível dos componentes.
|
|
38
|
+
- **Localizar dinamicamente metadados**, rotas e conteúdo.
|
|
39
|
+
- **Garantir suporte TypeScript** com tipos autogerados, melhorando o preenchimento automático e a deteção de erros.
|
|
40
|
+
- **Beneficiar de funcionalidades avançadas**, como deteção e troca dinâmica de idioma.
|
|
41
|
+
|
|
42
|
+
Este guia demonstra como utilizar o Intlayer numa aplicação Vanilla JavaScript **sem utilizar um gestor de pacotes ou um bundler** (como Vite, Webpack, etc.).
|
|
43
|
+
|
|
44
|
+
Se a sua aplicação utiliza um bundler (como o Vite), recomendamos seguir o [Guia Vite + Vanilla JS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_with_vite+vanilla.md) em vez disso.
|
|
45
|
+
|
|
46
|
+
Utilizando o bundle standalone, pode importar o Intlayer diretamente nos seus ficheiros HTML através de um único ficheiro JavaScript, tornando-o perfeito para projetos legados ou sites estáticos simples.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Guia Passo a Passo para Configurar o Intlayer numa Aplicação Vanilla JS
|
|
51
|
+
|
|
52
|
+
### Passo 1: Instalar Dependências
|
|
53
|
+
|
|
54
|
+
Instale os pacotes necessários utilizando o npm:
|
|
55
|
+
|
|
56
|
+
```bash packageManager="npm"
|
|
57
|
+
# Gerar um bundle standalone do intlayer e vanilla-intlayer
|
|
58
|
+
# Este ficheiro será importado no seu ficheiro HTML
|
|
59
|
+
npx intlayer standalone --packages intlayer vanilla-intlayer --outfile intlayer.js
|
|
60
|
+
|
|
61
|
+
# Inicializar o intlayer com o ficheiro de configuração
|
|
62
|
+
npx intlayer init --no-gitignore
|
|
63
|
+
|
|
64
|
+
# Construir os dicionários
|
|
65
|
+
npx intlayer build
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```bash packageManager="pnpm"
|
|
69
|
+
# Gerar um bundle standalone do intlayer e vanilla-intlayer
|
|
70
|
+
# Este ficheiro será importado no seu ficheiro HTML
|
|
71
|
+
pnpm intlayer standalone --packages intlayer vanilla-intlayer --outfile intlayer.js
|
|
72
|
+
|
|
73
|
+
# Inicializar o intlayer com o ficheiro de configuração
|
|
74
|
+
pnpm intlayer init --no-gitignore
|
|
75
|
+
|
|
76
|
+
# Construir os dicionários
|
|
77
|
+
pnpm intlayer build
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```bash packageManager="yarn"
|
|
81
|
+
# Gerar um bundle standalone do intlayer e vanilla-intlayer
|
|
82
|
+
# Este ficheiro será importado no seu ficheiro HTML
|
|
83
|
+
yarn intlayer standalone --packages intlayer vanilla-intlayer --outfile intlayer.js
|
|
84
|
+
|
|
85
|
+
# Inicializar o ficheiro de configuração intlayer, TypeScript se configurado, variáveis de ambiente
|
|
86
|
+
yarn intlayer init --no-gitignore
|
|
87
|
+
|
|
88
|
+
# Construir os dicionários
|
|
89
|
+
yarn intlayer build
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```bash packageManager="bun"
|
|
93
|
+
# Gerar um bundle standalone do intlayer e vanilla-intlayer
|
|
94
|
+
# Este ficheiro será importado no seu ficheiro HTML
|
|
95
|
+
bun x intlayer standalone --packages intlayer vanilla-intlayer --outfile intlayer.js
|
|
96
|
+
|
|
97
|
+
# Inicializar o intlayer com o ficheiro de configuração
|
|
98
|
+
bun x intlayer init --no-gitignore
|
|
99
|
+
|
|
100
|
+
# Construir os dicionários
|
|
101
|
+
bun x intlayer build
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- **intlayer**
|
|
105
|
+
O pacote principal que fornece ferramentas de internacionalização para gestão de configuração, tradução, [declaração de conteúdo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/content_file.md), transpilação e [comandos CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/cli/index.md).
|
|
106
|
+
|
|
107
|
+
- **vanilla-intlayer**
|
|
108
|
+
O pacote que integra o Intlayer com aplicações puras JavaScript / TypeScript. Fornece um singleton pub/sub (`IntlayerClient`) e auxiliares baseados em callbacks (`useIntlayer`, `useLocale`, etc.) para que qualquer parte da sua aplicação possa reagir a mudanças de idioma sem depender de uma framework de UI.
|
|
109
|
+
|
|
110
|
+
> A exportação de empacotamento (bundling) do CLI `intlayer standalone` produz uma build otimizada através do tree-shaking de pacotes não utilizados, idiomas e lógica não essencial (como redirecionamentos ou prefixos) específica para a sua configuração.
|
|
111
|
+
|
|
112
|
+
### Passo 2: Configuração do seu projeto
|
|
113
|
+
|
|
114
|
+
Crie um ficheiro de configuração para configurar os idiomas da sua aplicação:
|
|
115
|
+
|
|
116
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
117
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
118
|
+
|
|
119
|
+
const config: IntlayerConfig = {
|
|
120
|
+
internationalization: {
|
|
121
|
+
locales: [
|
|
122
|
+
Locales.ENGLISH,
|
|
123
|
+
Locales.FRENCH,
|
|
124
|
+
Locales.SPANISH,
|
|
125
|
+
// Seus outros idiomas
|
|
126
|
+
],
|
|
127
|
+
defaultLocale: Locales.ENGLISH,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export default config;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
135
|
+
import { Locales } from "intlayer";
|
|
136
|
+
|
|
137
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
138
|
+
const config = {
|
|
139
|
+
internationalization: {
|
|
140
|
+
locales: [
|
|
141
|
+
Locales.ENGLISH,
|
|
142
|
+
Locales.FRENCH,
|
|
143
|
+
Locales.SPANISH,
|
|
144
|
+
// Seus outros idiomas
|
|
145
|
+
],
|
|
146
|
+
defaultLocale: Locales.ENGLISH,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export default config;
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
154
|
+
const { Locales } = require("intlayer");
|
|
155
|
+
|
|
156
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
157
|
+
const config = {
|
|
158
|
+
internationalization: {
|
|
159
|
+
locales: [
|
|
160
|
+
Locales.ENGLISH,
|
|
161
|
+
Locales.FRENCH,
|
|
162
|
+
Locales.SPANISH,
|
|
163
|
+
// Seus outros idiomas
|
|
164
|
+
],
|
|
165
|
+
defaultLocale: Locales.ENGLISH,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
module.exports = config;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
> Através deste ficheiro de configuração, pode configurar URLs localizados, redirecionamento de middleware, nomes de cookies, a localização e extensão das suas declarações de conteúdo, desativar logs do Intlayer na consola e muito mais. Para uma lista completa de parâmetros disponíveis, consulte a [documentação de configuração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/configuration.md).
|
|
173
|
+
|
|
174
|
+
### Passo 3: Importar o bundle no seu HTML
|
|
175
|
+
|
|
176
|
+
Depois de gerar o bundle `intlayer.js`, pode importá-lo no seu ficheiro HTML:
|
|
177
|
+
|
|
178
|
+
```html fileName="index.html"
|
|
179
|
+
<!DOCTYPE html>
|
|
180
|
+
<html lang="pt">
|
|
181
|
+
<head>
|
|
182
|
+
<meta charset="UTF-8" />
|
|
183
|
+
|
|
184
|
+
<!-- Importar o bundle -->
|
|
185
|
+
<script src="./intlayer.js" defer></script>
|
|
186
|
+
<!-- Importar o seu script principal -->
|
|
187
|
+
<script src="./src/main.js" defer></script>
|
|
188
|
+
</head>
|
|
189
|
+
<body>
|
|
190
|
+
<h1 id="title"></h1>
|
|
191
|
+
<p class="read-the-docs"></p>
|
|
192
|
+
</body>
|
|
193
|
+
</html>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
O bundle expõe o `Intlayer` e o `VanillaIntlayer` como objetos globais no `window`.
|
|
197
|
+
|
|
198
|
+
### Passo 4: Bootstrapper do Intlayer no seu ponto de entrada
|
|
199
|
+
|
|
200
|
+
No seu `src/main.js`, chame `installIntlayer()` **antes** de qualquer conteúdo ser renderizado, para que o singleton global de idioma esteja pronto.
|
|
201
|
+
|
|
202
|
+
```javascript fileName="src/main.js"
|
|
203
|
+
const { installIntlayer } = window.VanillaIntlayer;
|
|
204
|
+
|
|
205
|
+
// Deve ser chamado antes de renderizar qualquer conteúdo i18n.
|
|
206
|
+
installIntlayer();
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Se também pretender utilizar o renderizador de markdown, chame `installIntlayerMarkdown()`:
|
|
210
|
+
|
|
211
|
+
```javascript fileName="src/main.js"
|
|
212
|
+
const { installIntlayer, installIntlayerMarkdown } = window.VanillaIntlayer;
|
|
213
|
+
|
|
214
|
+
installIntlayer();
|
|
215
|
+
installIntlayerMarkdown();
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Passo 5: Declarar o Seu Conteúdo
|
|
219
|
+
|
|
220
|
+
Crie e gira as suas declarações de conteúdo para armazenar traduções:
|
|
221
|
+
|
|
222
|
+
```typescript fileName="src/app.content.ts" contentDeclarationFormat="typescript"
|
|
223
|
+
import { insert, t, type Dictionary } from "intlayer";
|
|
224
|
+
|
|
225
|
+
const appContent = {
|
|
226
|
+
key: "app",
|
|
227
|
+
content: {
|
|
228
|
+
title: "Vite + Vanilla",
|
|
229
|
+
|
|
230
|
+
viteLogoLabel: t({
|
|
231
|
+
en: "Vite Logo",
|
|
232
|
+
fr: "Logo Vite",
|
|
233
|
+
es: "Logo Vite",
|
|
234
|
+
}),
|
|
235
|
+
|
|
236
|
+
count: insert(
|
|
237
|
+
t({
|
|
238
|
+
en: "count is {{count}}",
|
|
239
|
+
fr: "le compte est {{count}}",
|
|
240
|
+
es: "el recuento es {{count}}",
|
|
241
|
+
})
|
|
242
|
+
),
|
|
243
|
+
|
|
244
|
+
readTheDocs: t({
|
|
245
|
+
en: "Click on the Vite logo to learn more",
|
|
246
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
247
|
+
es: "Haga clic no logotipo do Vite para saber mais",
|
|
248
|
+
}),
|
|
249
|
+
},
|
|
250
|
+
} satisfies Dictionary;
|
|
251
|
+
|
|
252
|
+
export default appContent;
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
|
|
256
|
+
import { insert, t } from "intlayer";
|
|
257
|
+
|
|
258
|
+
/** @type {import('intlayer').Dictionary} */
|
|
259
|
+
const appContent = {
|
|
260
|
+
key: "app",
|
|
261
|
+
content: {
|
|
262
|
+
title: "Vite + Vanilla",
|
|
263
|
+
|
|
264
|
+
viteLogoLabel: t({
|
|
265
|
+
en: "Vite Logo",
|
|
266
|
+
fr: "Logo Vite",
|
|
267
|
+
es: "Logo Vite",
|
|
268
|
+
}),
|
|
269
|
+
|
|
270
|
+
count: insert(
|
|
271
|
+
t({
|
|
272
|
+
en: "count is {{count}}",
|
|
273
|
+
fr: "le compte est {{count}}",
|
|
274
|
+
es: "el recuento es {{count}}",
|
|
275
|
+
})
|
|
276
|
+
),
|
|
277
|
+
|
|
278
|
+
readTheDocs: t({
|
|
279
|
+
en: "Click on the Vite logo to learn more",
|
|
280
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
281
|
+
es: "Haga clic no logotipo do Vite para saber mais",
|
|
282
|
+
}),
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
export default appContent;
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
|
|
290
|
+
const { insert, t } = require("intlayer");
|
|
291
|
+
|
|
292
|
+
/** @type {import('intlayer').Dictionary} */
|
|
293
|
+
const appContent = {
|
|
294
|
+
key: "app",
|
|
295
|
+
content: {
|
|
296
|
+
title: "Vite + Vanilla",
|
|
297
|
+
|
|
298
|
+
viteLogoLabel: t({
|
|
299
|
+
en: "Vite Logo",
|
|
300
|
+
fr: "Logo Vite",
|
|
301
|
+
es: "Logo Vite",
|
|
302
|
+
}),
|
|
303
|
+
|
|
304
|
+
count: insert(
|
|
305
|
+
t({
|
|
306
|
+
en: "count is {{count}}",
|
|
307
|
+
fr: "le compte est {{count}}",
|
|
308
|
+
es: "el recuento es {{count}}",
|
|
309
|
+
})
|
|
310
|
+
),
|
|
311
|
+
|
|
312
|
+
readTheDocs: t({
|
|
313
|
+
en: "Click on the Vite logo to learn more",
|
|
314
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
315
|
+
es: "Haga clic no logotipo do Vite para saber mais",
|
|
316
|
+
}),
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
module.exports = appContent;
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
324
|
+
{
|
|
325
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
326
|
+
"key": "app",
|
|
327
|
+
"content": {
|
|
328
|
+
"title": "Vite + Vanilla",
|
|
329
|
+
"viteLogoLabel": {
|
|
330
|
+
"nodeType": "translation",
|
|
331
|
+
"translation": {
|
|
332
|
+
"en": "Vite Logo",
|
|
333
|
+
"fr": "Logo Vite",
|
|
334
|
+
"es": "Logo Vite"
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"count": {
|
|
338
|
+
"nodeType": "insertion",
|
|
339
|
+
"insertion": {
|
|
340
|
+
"nodeType": "translation",
|
|
341
|
+
"translation": {
|
|
342
|
+
"en": "count is {{count}}",
|
|
343
|
+
"fr": "le compte est {{count}}",
|
|
344
|
+
"es": "el recuento es {{count}}"
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"readTheDocs": {
|
|
349
|
+
"nodeType": "translation",
|
|
350
|
+
"translation": {
|
|
351
|
+
"en": "Click on the Vite logo to learn more",
|
|
352
|
+
"fr": "Cliquez sur le logo Vite pour en savoir plus",
|
|
353
|
+
"es": "Haga clic no logotipo do Vite para obter mais informações"
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
> As suas declarações de conteúdo podem ser definidas em qualquer lugar na sua aplicação desde que estejam incluídas no diretório `contentDir` (por defeito, `./src`). E correspondam à extensão do ficheiro de declaração de conteúdo (por defeito, `.content.{json,ts,tsx,js,jsx,mjs,cjs}`).
|
|
361
|
+
>
|
|
362
|
+
> Para mais detalhes, consulte a [documentação de declaração de conteúdo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/content_file.md).
|
|
363
|
+
|
|
364
|
+
### Passo 6: Utilizar o Intlayer no seu JavaScript
|
|
365
|
+
|
|
366
|
+
O objeto `window.VanillaIntlayer` fornece auxiliares de API: `useIntlayer(key, locale?)` devolve o conteúdo traduzido para uma determinada chave.
|
|
367
|
+
|
|
368
|
+
```javascript fileName="src/main.js"
|
|
369
|
+
const { installIntlayer, useIntlayer } = window.VanillaIntlayer;
|
|
370
|
+
|
|
371
|
+
installIntlayer();
|
|
372
|
+
|
|
373
|
+
// Obter o conteúdo inicial para o idioma atual.
|
|
374
|
+
// Encadeie .onChange() para ser notificado sempre que o idioma mudar.
|
|
375
|
+
const content = useIntlayer("app").onChange((newContent) => {
|
|
376
|
+
// Re-renderizar ou atualizar apenas os nós DOM afetados
|
|
377
|
+
document.querySelector("h1").textContent = String(newContent.title);
|
|
378
|
+
document.querySelector(".read-the-docs").textContent = String(
|
|
379
|
+
newContent.readTheDocs
|
|
380
|
+
);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
// Renderização inicial
|
|
384
|
+
document.querySelector("h1").textContent = String(content.title);
|
|
385
|
+
document.querySelector(".read-the-docs").textContent = String(
|
|
386
|
+
content.readTheDocs
|
|
387
|
+
);
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
> Aceda aos valores finais como strings envolvendo-os em `String()`, que chama o método `toString()` do nó e devolve o texto traduzido.
|
|
391
|
+
>
|
|
392
|
+
> Quando precisar do valor para um atributo HTML nativo (ex: `alt`, `aria-label`), utilize `.value` diretamente:
|
|
393
|
+
>
|
|
394
|
+
> ```javascript
|
|
395
|
+
> img.alt = content.viteLogoLabel.value;
|
|
396
|
+
> ```
|
|
397
|
+
|
|
398
|
+
### (Opcional) Passo 7: Alterar o idioma do seu conteúdo
|
|
399
|
+
|
|
400
|
+
Para alterar o idioma do seu conteúdo, utilize a função `setLocale` exposta pelo `useLocale`.
|
|
401
|
+
|
|
402
|
+
```javascript fileName="src/locale-switcher.js"
|
|
403
|
+
const { getLocaleName } = window.Intlayer;
|
|
404
|
+
const { useLocale } = window.VanillaIntlayer;
|
|
405
|
+
|
|
406
|
+
export function setupLocaleSwitcher(container) {
|
|
407
|
+
const { locale, availableLocales, setLocale, subscribe } = useLocale();
|
|
408
|
+
|
|
409
|
+
const select = document.createElement("select");
|
|
410
|
+
select.setAttribute("aria-label", "Idioma");
|
|
411
|
+
|
|
412
|
+
const render = (currentLocale) => {
|
|
413
|
+
select.innerHTML = availableLocales
|
|
414
|
+
.map(
|
|
415
|
+
(loc) =>
|
|
416
|
+
`<option value="${loc}"${loc === currentLocale ? " selected" : ""}>
|
|
417
|
+
${getLocaleName(loc)}
|
|
418
|
+
</option>`
|
|
419
|
+
)
|
|
420
|
+
.join("");
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
render(locale);
|
|
424
|
+
container.appendChild(select);
|
|
425
|
+
|
|
426
|
+
select.addEventListener("change", () => setLocale(select.value));
|
|
427
|
+
|
|
428
|
+
// Manter o dropdown sincronizado quando o idioma mudar de outro local
|
|
429
|
+
return subscribe((newLocale) => render(newLocale));
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### (Opcional) Passo 8: Alternar os atributos HTML de Idioma e Direção
|
|
434
|
+
|
|
435
|
+
Atualize os atributos `lang` e `dir` da tag `<html>` para corresponderem ao idioma atual para acessibilidade e SEO.
|
|
436
|
+
|
|
437
|
+
```javascript fileName="src/main.js"
|
|
438
|
+
const { getHTMLTextDir } = window.Intlayer;
|
|
439
|
+
const { installIntlayer, useLocale } = window.VanillaIntlayer;
|
|
440
|
+
|
|
441
|
+
installIntlayer();
|
|
442
|
+
|
|
443
|
+
useLocale({
|
|
444
|
+
onLocaleChange: (locale) => {
|
|
445
|
+
document.documentElement.lang = locale;
|
|
446
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
447
|
+
},
|
|
448
|
+
});
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### (Opcional) Passo 9: Carregamento lento de dicionários por idioma
|
|
452
|
+
|
|
453
|
+
Se pretender carregar dicionários de forma lenta por idioma, pode utilizar `useDictionaryDynamic`. Isto é útil se não quiser incluir todas as traduções no ficheiro inicial `intlayer.js`.
|
|
454
|
+
|
|
455
|
+
```javascript fileName="src/app.js"
|
|
456
|
+
const { installIntlayer, useDictionaryDynamic } = window.VanillaIntlayer;
|
|
457
|
+
|
|
458
|
+
installIntlayer();
|
|
459
|
+
|
|
460
|
+
const unsubscribe = useDictionaryDynamic(
|
|
461
|
+
{
|
|
462
|
+
en: () => import("../.intlayer/dictionaries/en/app.mjs"),
|
|
463
|
+
fr: () => import("../.intlayer/dictionaries/fr/app.mjs"),
|
|
464
|
+
es: () => import("../.intlayer/dictionaries/es/app.mjs"),
|
|
465
|
+
},
|
|
466
|
+
"app"
|
|
467
|
+
).onChange((content) => {
|
|
468
|
+
document.querySelector("h1").textContent = String(content.title);
|
|
469
|
+
});
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
> Nota: o `useDictionaryDynamic` requer que os dicionários estejam disponíveis como ficheiros ESM separados. Esta abordagem é tipicamente utilizada se tiver um servidor web a servir os dicionários.
|
|
473
|
+
|
|
474
|
+
### Configurar TypeScript
|
|
475
|
+
|
|
476
|
+
Certifique-se de que a sua configuração TypeScript inclui os tipos autogerados.
|
|
477
|
+
|
|
478
|
+
```json5 fileName="tsconfig.json"
|
|
479
|
+
{
|
|
480
|
+
"compilerOptions": {
|
|
481
|
+
// ...
|
|
482
|
+
},
|
|
483
|
+
"include": ["src", ".intlayer/**/*.ts"],
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Extensão VS Code
|
|
488
|
+
|
|
489
|
+
Para melhorar a sua experiência de desenvolvimento com o Intlayer, pode instalar a **Extensão oficial do Intlayer para VS Code**.
|
|
490
|
+
|
|
491
|
+
[Instalar a partir do VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
492
|
+
|
|
493
|
+
Esta extensão fornece:
|
|
494
|
+
|
|
495
|
+
- **Preenchimento automático** para chaves de tradução.
|
|
496
|
+
- **Deteção de erros em tempo real** para traduções em falta.
|
|
497
|
+
- **Pré-visualizações inline** de conteúdo traduzido.
|
|
498
|
+
- **Ações rápidas** para criar e atualizar traduções facilmente.
|
|
499
|
+
|
|
500
|
+
Para mais detalhes sobre como utilizar a extensão, consulte a [documentação da extensão Intlayer para VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
### Ir Mais Longe
|
|
505
|
+
|
|
506
|
+
Para ir mais longe, pode implementar o [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_visual_editor.md) ou externalizar o seu conteúdo utilizando o [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md).
|