@intlayer/docs 7.3.10 → 7.3.12
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/generated/docs.entry.cjs +19 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +19 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_with_nuxt.md +305 -421
- package/docs/ar/intlayer_with_react_router_v7.md +33 -4
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +516 -0
- package/docs/ar/intlayer_with_tanstack.md +2 -12
- package/docs/ar/intlayer_with_vite+vue.md +1 -0
- package/docs/de/intlayer_with_nuxt.md +296 -394
- package/docs/de/intlayer_with_react_router_v7.md +33 -4
- package/docs/de/intlayer_with_react_router_v7_fs_routes.md +573 -0
- package/docs/de/intlayer_with_tanstack.md +1 -0
- package/docs/de/intlayer_with_vite+vue.md +1 -0
- package/docs/en/intlayer_with_nuxt.md +242 -321
- package/docs/en/intlayer_with_react_router_v7.md +24 -0
- package/docs/en/intlayer_with_react_router_v7_fs_routes.md +570 -0
- package/docs/en/intlayer_with_tanstack.md +2 -12
- package/docs/en/intlayer_with_vite+vue.md +49 -48
- package/docs/en-GB/intlayer_with_nuxt.md +262 -358
- package/docs/en-GB/intlayer_with_react_router_v7.md +33 -4
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +513 -0
- package/docs/en-GB/intlayer_with_tanstack.md +2 -12
- package/docs/en-GB/intlayer_with_vite+vue.md +1 -0
- package/docs/es/intlayer_with_nuxt.md +284 -375
- package/docs/es/intlayer_with_react_router_v7.md +33 -4
- package/docs/es/intlayer_with_react_router_v7_fs_routes.md +575 -0
- package/docs/es/intlayer_with_tanstack.md +1 -0
- package/docs/es/intlayer_with_vite+vue.md +1 -2
- package/docs/fr/intlayer_with_nuxt.md +288 -387
- package/docs/fr/intlayer_with_react_router_v7.md +34 -5
- package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/fr/intlayer_with_tanstack.md +1 -0
- package/docs/fr/intlayer_with_vite+vue.md +1 -0
- package/docs/hi/intlayer_with_nuxt.md +318 -434
- package/docs/hi/intlayer_with_react_router_v7.md +33 -4
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +518 -0
- package/docs/hi/intlayer_with_tanstack.md +2 -12
- package/docs/hi/intlayer_with_vite+vue.md +1 -0
- package/docs/id/intlayer_with_nuxt.md +275 -376
- package/docs/id/intlayer_with_react_router_v7.md +29 -4
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +521 -0
- package/docs/id/intlayer_with_tanstack.md +2 -12
- package/docs/id/intlayer_with_vite+vue.md +1 -0
- package/docs/it/intlayer_with_nuxt.md +312 -408
- package/docs/it/intlayer_with_react_router_v7.md +33 -4
- package/docs/it/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/it/intlayer_with_tanstack.md +1 -0
- package/docs/ja/intlayer_with_nuxt.md +319 -414
- package/docs/ja/intlayer_with_react_router_v7.md +33 -4
- package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/ja/intlayer_with_tanstack.md +2 -12
- package/docs/ja/intlayer_with_vite+vue.md +1 -0
- package/docs/ko/intlayer_with_nuxt.md +307 -406
- package/docs/ko/intlayer_with_react_router_v7.md +33 -4
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +515 -0
- package/docs/ko/intlayer_with_tanstack.md +2 -12
- package/docs/ko/intlayer_with_vite+vue.md +1 -0
- package/docs/pl/intlayer_with_nuxt.md +282 -457
- package/docs/pl/intlayer_with_react_router_v7.md +32 -5
- package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +615 -0
- package/docs/pl/intlayer_with_tanstack.md +2 -12
- package/docs/pl/intlayer_with_vite+vue.md +1 -0
- package/docs/pt/intlayer_with_nuxt.md +288 -403
- package/docs/pt/intlayer_with_react_router_v7.md +28 -0
- package/docs/pt/intlayer_with_tanstack.md +1 -0
- package/docs/ru/intlayer_with_nuxt.md +300 -410
- package/docs/ru/intlayer_with_react_router_v7.md +33 -4
- package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/ru/intlayer_with_tanstack.md +1 -0
- package/docs/ru/intlayer_with_vite+vue.md +1 -0
- package/docs/tr/intlayer_with_nuxt.md +327 -392
- package/docs/tr/intlayer_with_react_router_v7.md +33 -4
- package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +572 -0
- package/docs/tr/intlayer_with_tanstack.md +2 -12
- package/docs/tr/intlayer_with_vite+vue.md +1 -0
- package/docs/vi/intlayer_with_nuxt.md +282 -399
- package/docs/vi/intlayer_with_react_router_v7.md +29 -4
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +523 -0
- package/docs/vi/intlayer_with_tanstack.md +2 -12
- package/docs/vi/intlayer_with_vite+vue.md +1 -0
- package/docs/zh/intlayer_with_nuxt.md +311 -444
- package/docs/zh/intlayer_with_react_router_v7.md +33 -4
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +516 -0
- package/docs/zh/intlayer_with_tanstack.md +2 -12
- package/docs/zh/intlayer_with_vite+vue.md +1 -0
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +19 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-06-18
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Cara
|
|
3
|
+
updatedAt: 2025-12-07
|
|
4
|
+
title: Cara Menerjemahkan Aplikasi Nuxt dan Vue Anda – Panduan i18n 2025
|
|
5
5
|
description: Temukan cara membuat situs web Nuxt dan Vue Anda menjadi multibahasa. Ikuti dokumentasi untuk melakukan internasionalisasi (i18n) dan menerjemahkannya.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internasionalisasi
|
|
@@ -14,8 +14,12 @@ slugs:
|
|
|
14
14
|
- doc
|
|
15
15
|
- environment
|
|
16
16
|
- nuxt-and-vue
|
|
17
|
-
applicationTemplate: https://github.com/aymericzip/intlayer-nuxt-template
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-nuxt-4-template
|
|
18
|
+
youtubeVideo: https://www.youtube.com/watch?v=IE3XWkZ6a5U
|
|
18
19
|
history:
|
|
20
|
+
- version: 7.3.11
|
|
21
|
+
date: 2025-12-07
|
|
22
|
+
changes: Memperbarui LocaleSwitcher, SEO, metadata
|
|
19
23
|
- version: 5.5.10
|
|
20
24
|
date: 2025-06-29
|
|
21
25
|
changes: Inisialisasi riwayat
|
|
@@ -23,38 +27,57 @@ history:
|
|
|
23
27
|
|
|
24
28
|
# Terjemahkan situs web Nuxt dan Vue Anda menggunakan Intlayer | Internasionalisasi (i18n)
|
|
25
29
|
|
|
26
|
-
Lihat [Application Template](https://github.com/aymericzip/intlayer-nuxt-template) di GitHub.
|
|
27
|
-
|
|
28
30
|
## Daftar Isi
|
|
29
31
|
|
|
30
32
|
<TOC/>
|
|
31
33
|
|
|
32
34
|
## Apa itu Intlayer?
|
|
33
35
|
|
|
34
|
-
**Intlayer** adalah pustaka internasionalisasi (i18n)
|
|
36
|
+
**Intlayer** adalah pustaka internasionalisasi (i18n) sumber terbuka yang inovatif, dirancang untuk menyederhanakan dukungan multibahasa dalam aplikasi web modern.
|
|
35
37
|
|
|
36
38
|
Dengan Intlayer, Anda dapat:
|
|
37
39
|
|
|
38
40
|
- **Mengelola terjemahan dengan mudah** menggunakan kamus deklaratif di tingkat komponen.
|
|
39
41
|
- **Melokalkan metadata**, rute, dan konten secara dinamis.
|
|
40
|
-
- **
|
|
41
|
-
- **Memanfaatkan fitur canggih**, seperti deteksi dan
|
|
42
|
+
- **Menjamin dukungan TypeScript** dengan tipe yang dihasilkan secara otomatis, meningkatkan autocompletion dan deteksi kesalahan.
|
|
43
|
+
- **Memanfaatkan fitur canggih**, seperti deteksi dan pengalihan locale secara dinamis.
|
|
42
44
|
|
|
43
45
|
---
|
|
44
46
|
|
|
45
|
-
## Panduan Langkah demi Langkah untuk Mengatur Intlayer
|
|
47
|
+
## Panduan Langkah demi Langkah untuk Mengatur Intlayer di Aplikasi Nuxt
|
|
46
48
|
|
|
47
49
|
<iframe
|
|
48
|
-
src="https://stackblitz.com/github/aymericzip/intlayer-nuxt-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
50
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-nuxt-4-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
49
51
|
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
50
52
|
title="Demo CodeSandbox - Cara Menginternasionalisasi aplikasi Anda menggunakan Intlayer"
|
|
51
53
|
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
52
54
|
loading="lazy"
|
|
53
55
|
/>
|
|
54
56
|
|
|
55
|
-
### Langkah 1:
|
|
57
|
+
### Langkah 1: Pasang Dependensi
|
|
58
|
+
|
|
59
|
+
<Tab defaultTab="video">
|
|
60
|
+
<TabItem label="Video" value="video">
|
|
61
|
+
|
|
62
|
+
<iframe title="Cara menerjemahkan aplikasi Nuxt dan Vue Anda menggunakan Intlayer? Temukan Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/IE3XWkZ6a5U?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
56
63
|
|
|
57
|
-
|
|
64
|
+
</TabItem>
|
|
65
|
+
<TabItem label="Kode" value="code">
|
|
66
|
+
|
|
67
|
+
<iframe
|
|
68
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-nuxt-4-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
69
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
70
|
+
title="Demo CodeSandbox - Cara Menginternasionalisasi aplikasi Anda menggunakan Intlayer"
|
|
71
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
72
|
+
loading="lazy"
|
|
73
|
+
/>
|
|
74
|
+
|
|
75
|
+
</TabItem>
|
|
76
|
+
</Tab>
|
|
77
|
+
|
|
78
|
+
Lihat [Template Aplikasi](https://github.com/aymericzip/intlayer-nuxt-4-template) di GitHub.
|
|
79
|
+
|
|
80
|
+
Pasang paket yang diperlukan menggunakan npm:
|
|
58
81
|
|
|
59
82
|
```bash packageManager="npm"
|
|
60
83
|
npm install intlayer vue-intlayer
|
|
@@ -73,12 +96,10 @@ yarn add --save-dev nuxt-intlayer
|
|
|
73
96
|
|
|
74
97
|
- **intlayer**
|
|
75
98
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
Paket inti yang menyediakan alat internasionalisasi untuk manajemen konfigurasi, terjemahan, [deklarasi konten](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dictionary/content_file.md), transpile, dan [perintah CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_cli.md).
|
|
99
|
+
Paket inti yang menyediakan alat internasionalisasi untuk manajemen konfigurasi, terjemahan, [deklarasi konten](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dictionary/content_file.md), transpile, dan [perintah CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/cli/index.md).
|
|
79
100
|
|
|
80
101
|
- **vue-intlayer**
|
|
81
|
-
Paket yang mengintegrasikan Intlayer dengan aplikasi Vue. Ini
|
|
102
|
+
Paket yang mengintegrasikan Intlayer dengan aplikasi Vue. Ini adalah composables untuk komponen Vue.
|
|
82
103
|
|
|
83
104
|
- **nuxt-intlayer**
|
|
84
105
|
Modul Nuxt yang mengintegrasikan Intlayer dengan aplikasi Nuxt. Modul ini menyediakan pengaturan otomatis, middleware untuk deteksi locale, manajemen cookie, dan pengalihan URL.
|
|
@@ -100,9 +121,6 @@ const config: IntlayerConfig = {
|
|
|
100
121
|
],
|
|
101
122
|
defaultLocale: Locales.ENGLISH,
|
|
102
123
|
},
|
|
103
|
-
content: {
|
|
104
|
-
contentDir: ["."], // Karena secara default Intlayer akan memantau file deklarasi konten dari direktori `./src`
|
|
105
|
-
},
|
|
106
124
|
};
|
|
107
125
|
|
|
108
126
|
export default config;
|
|
@@ -111,6 +129,7 @@ export default config;
|
|
|
111
129
|
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
112
130
|
import { Locales } from "intlayer";
|
|
113
131
|
|
|
132
|
+
javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
114
133
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
115
134
|
const config = {
|
|
116
135
|
internationalization: {
|
|
@@ -122,9 +141,6 @@ const config = {
|
|
|
122
141
|
],
|
|
123
142
|
defaultLocale: Locales.ENGLISH,
|
|
124
143
|
},
|
|
125
|
-
content: {
|
|
126
|
-
contentDir: ["."],
|
|
127
|
-
},
|
|
128
144
|
};
|
|
129
145
|
|
|
130
146
|
export default config;
|
|
@@ -144,9 +160,6 @@ const config = {
|
|
|
144
160
|
],
|
|
145
161
|
defaultLocale: Locales.ENGLISH,
|
|
146
162
|
},
|
|
147
|
-
content: {
|
|
148
|
-
contentDir: ["."],
|
|
149
|
-
},
|
|
150
163
|
};
|
|
151
164
|
|
|
152
165
|
module.exports = config;
|
|
@@ -173,213 +186,40 @@ export default defineNuxtConfig({
|
|
|
173
186
|
|
|
174
187
|
Buat dan kelola deklarasi konten Anda untuk menyimpan terjemahan:
|
|
175
188
|
|
|
176
|
-
```tsx fileName="
|
|
177
|
-
import {
|
|
189
|
+
```tsx fileName="content/home-page.content.ts" contentDeclarationFormat="typescript"
|
|
190
|
+
import { type Dictionary, t } from "intlayer";
|
|
178
191
|
|
|
179
|
-
const
|
|
180
|
-
key: "
|
|
192
|
+
const content = {
|
|
193
|
+
key: "home-page",
|
|
181
194
|
content: {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
187
|
-
}),
|
|
188
|
-
checkOut: t({ en: "Check out ", fr: "Vérifiez ", es: "Compruebe " }),
|
|
189
|
-
nuxtIntlayer: t({
|
|
190
|
-
en: "Dokumentasi Nuxt Intlayer",
|
|
191
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
192
|
-
es: "Documentación de Nuxt Intlayer",
|
|
193
|
-
}),
|
|
194
|
-
learnMore: t({
|
|
195
|
-
en: "Pelajari lebih lanjut tentang Nuxt di ",
|
|
196
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
197
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
195
|
+
title: t({
|
|
196
|
+
en: "Hello world",
|
|
197
|
+
fr: "Bonjour le monde",
|
|
198
|
+
es: "Hola mundo",
|
|
198
199
|
}),
|
|
199
|
-
|
|
200
|
-
en: "
|
|
201
|
-
fr: "
|
|
202
|
-
es: "
|
|
200
|
+
metaTitle: t({
|
|
201
|
+
en: "Welcome | My Application",
|
|
202
|
+
fr: "Bienvenue | Mon Application",
|
|
203
|
+
es: "Bienvenido | Mi Aplicación",
|
|
203
204
|
}),
|
|
204
|
-
|
|
205
|
-
en: "
|
|
206
|
-
fr: "
|
|
207
|
-
es: "
|
|
208
|
-
id: "Klik logo Nuxt untuk mempelajari lebih lanjut",
|
|
205
|
+
metaDescription: t({
|
|
206
|
+
en: "Discover your multilingual Nuxt app homepage powered by Intlayer.",
|
|
207
|
+
fr: "Découvrez la page d'accueil multilingue de votre application Nuxt propulsée par Intlayer.",
|
|
208
|
+
es: "Descubre la página de inicio multilingüe de tu aplicación Nuxt impulsada por Intlayer.",
|
|
209
209
|
}),
|
|
210
210
|
},
|
|
211
211
|
} satisfies Dictionary;
|
|
212
212
|
|
|
213
|
-
export default
|
|
213
|
+
export default content;
|
|
214
214
|
```
|
|
215
215
|
|
|
216
|
-
|
|
217
|
-
import { t } from "intlayer";
|
|
218
|
-
|
|
219
|
-
/** @type {import('intlayer').Dictionary} */
|
|
220
|
-
const helloWorldContent = {
|
|
221
|
-
key: "helloworld",
|
|
222
|
-
content: {
|
|
223
|
-
count: t({
|
|
224
|
-
en: "count is ",
|
|
225
|
-
fr: "le compte est ",
|
|
226
|
-
es: "el recuento es ",
|
|
227
|
-
id: "jumlah adalah ",
|
|
228
|
-
}),
|
|
229
|
-
edit: t({
|
|
230
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
231
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
232
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
233
|
-
id: "Edit <code>components/HelloWorld.vue</code> dan simpan untuk menguji HMR",
|
|
234
|
-
}),
|
|
235
|
-
checkOut: t({
|
|
236
|
-
en: "Check out ",
|
|
237
|
-
fr: "Vérifiez ",
|
|
238
|
-
es: "Compruebe ",
|
|
239
|
-
id: "Periksa ",
|
|
240
|
-
}),
|
|
241
|
-
nuxtIntlayer: t({
|
|
242
|
-
en: "Nuxt Intlayer documentation",
|
|
243
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
244
|
-
es: "Documentación de Nuxt Intlayer",
|
|
245
|
-
id: "Dokumentasi Nuxt Intlayer",
|
|
246
|
-
}),
|
|
247
|
-
learnMore: t({
|
|
248
|
-
en: "Learn more about Nuxt in the ",
|
|
249
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
250
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
251
|
-
id: "Pelajari lebih lanjut tentang Nuxt di ",
|
|
252
|
-
}),
|
|
253
|
-
nuxtDocs: t({
|
|
254
|
-
en: "Nuxt Documentation",
|
|
255
|
-
fr: "Documentation Nuxt",
|
|
256
|
-
es: "Documentación de Nuxt",
|
|
257
|
-
id: "Dokumentasi Nuxt",
|
|
258
|
-
}),
|
|
259
|
-
readTheDocs: t({
|
|
260
|
-
en: "Click on the Nuxt logo to learn more",
|
|
261
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
262
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
263
|
-
id: "Klik logo Nuxt untuk mempelajari lebih lanjut",
|
|
264
|
-
}),
|
|
265
|
-
},
|
|
266
|
-
};
|
|
216
|
+
> Deklarasi konten Anda dapat didefinisikan di mana saja dalam aplikasi Anda selama termasuk dalam direktori `contentDir` (secara default, `./src`). Dan sesuai dengan ekstensi file deklarasi konten (secara default, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
267
217
|
|
|
268
|
-
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
```javascript fileName="components/helloWorld.content.cjs" contentDeclarationFormat="commonjs"
|
|
272
|
-
const { t } = require("intlayer");
|
|
273
|
-
|
|
274
|
-
/** @type {import('intlayer').Dictionary} */
|
|
275
|
-
const helloWorldContent = {
|
|
276
|
-
key: "helloworld",
|
|
277
|
-
content: {
|
|
278
|
-
count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es ", id: "jumlah adalah " }),
|
|
279
|
-
edit: t({
|
|
280
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
281
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
282
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
283
|
-
id: "Edit <code>components/HelloWorld.vue</code> dan simpan untuk menguji HMR",
|
|
284
|
-
}),
|
|
285
|
-
checkOut: t({ en: "Check out ", fr: "Vérifiez ", es: "Compruebe ", id: "Periksa " }),
|
|
286
|
-
nuxtIntlayer: t({
|
|
287
|
-
en: "Nuxt Intlayer documentation",
|
|
288
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
289
|
-
es: "Documentación de Nuxt Intlayer",
|
|
290
|
-
id: "Dokumentasi Nuxt Intlayer",
|
|
291
|
-
}),
|
|
292
|
-
es: "Dokumentasi Nuxt Intlayer",
|
|
293
|
-
}),
|
|
294
|
-
learnMore: t({
|
|
295
|
-
en: "Pelajari lebih lanjut tentang Nuxt di ",
|
|
296
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
297
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
298
|
-
}),
|
|
299
|
-
nuxtDocs: t({
|
|
300
|
-
en: "Dokumentasi Nuxt",
|
|
301
|
-
fr: "Documentation Nuxt",
|
|
302
|
-
es: "Documentación de Nuxt",
|
|
303
|
-
}),
|
|
304
|
-
readTheDocs: t({
|
|
305
|
-
en: "Klik logo Nuxt untuk mempelajari lebih lanjut",
|
|
306
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
307
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
308
|
-
}),
|
|
309
|
-
},
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
module.exports = helloWorldContent;
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
```json fileName="components/helloWorld.content.json" contentDeclarationFormat="json"
|
|
316
|
-
{
|
|
317
|
-
"$schema": "https://intlayer.org/schema.json",
|
|
318
|
-
"key": "helloworld",
|
|
319
|
-
"content": {
|
|
320
|
-
"count": {
|
|
321
|
-
"nodeType": "translation",
|
|
322
|
-
"translation": {
|
|
323
|
-
"en": "count is ",
|
|
324
|
-
"fr": "le compte est ",
|
|
325
|
-
"es": "el recuento es ",
|
|
326
|
-
"id": "jumlahnya adalah "
|
|
327
|
-
}
|
|
328
|
-
},
|
|
329
|
-
"edit": {
|
|
330
|
-
"nodeType": "translation",
|
|
331
|
-
"translation": {
|
|
332
|
-
"en": "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
333
|
-
"fr": "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
334
|
-
"es": "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
335
|
-
"id": "Edit <code>components/HelloWorld.vue</code> dan simpan untuk menguji HMR"
|
|
336
|
-
}
|
|
337
|
-
},
|
|
338
|
-
"checkOut": {
|
|
339
|
-
"nodeType": "translation",
|
|
340
|
-
"translation": {
|
|
341
|
-
"en": "Check out ",
|
|
342
|
-
"fr": "Vérifiez ",
|
|
343
|
-
"es": "Compruebe ",
|
|
344
|
-
"id": "Periksa "
|
|
345
|
-
}
|
|
346
|
-
},
|
|
347
|
-
"nuxtIntlayer": {
|
|
348
|
-
"nodeType": "translation",
|
|
349
|
-
"translation": {
|
|
350
|
-
"id": "Dokumentasi Nuxt Intlayer"
|
|
351
|
-
}
|
|
352
|
-
},
|
|
353
|
-
"learnMore": {
|
|
354
|
-
"nodeType": "translation",
|
|
355
|
-
"translation": {
|
|
356
|
-
"id": "Pelajari lebih lanjut tentang Nuxt di "
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
"nuxtDocs": {
|
|
360
|
-
"nodeType": "translation",
|
|
361
|
-
"translation": {
|
|
362
|
-
"id": "Dokumentasi Nuxt"
|
|
363
|
-
}
|
|
364
|
-
},
|
|
365
|
-
"readTheDocs": {
|
|
366
|
-
"nodeType": "translation",
|
|
367
|
-
"translation": {
|
|
368
|
-
"id": "Klik pada logo Nuxt untuk mempelajari lebih lanjut",
|
|
369
|
-
"id": "Klik pada logo Nuxt untuk mempelajari lebih lanjut"
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
> Deklarasi konten Anda dapat didefinisikan di mana saja dalam aplikasi Anda selama mereka termasuk dalam direktori `contentDir` (secara default, `./src`). Dan sesuai dengan ekstensi file deklarasi konten (secara default, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
377
|
-
|
|
378
|
-
> Untuk detail lebih lanjut, lihat [dokumentasi deklarasi konten](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dictionary/content_file.md).
|
|
218
|
+
> Untuk informasi lebih lanjut, lihat [dokumentasi deklarasi konten](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dictionary/content_file.md).
|
|
379
219
|
|
|
380
220
|
### Langkah 5: Gunakan Intlayer dalam Kode Anda
|
|
381
221
|
|
|
382
|
-
Akses kamus konten Anda di seluruh aplikasi Nuxt
|
|
222
|
+
Akses kamus konten Anda di seluruh aplikasi Nuxt menggunakan composable `useIntlayer`:
|
|
383
223
|
|
|
384
224
|
```vue fileName="components/HelloWorld.vue"
|
|
385
225
|
<script setup lang="ts">
|
|
@@ -432,7 +272,7 @@ const countRef = ref(0);
|
|
|
432
272
|
|
|
433
273
|
Intlayer menawarkan berbagai API untuk mengakses konten Anda:
|
|
434
274
|
|
|
435
|
-
- **Sintaks berbasis komponen** (direkomendasikan):
|
|
275
|
+
- **Sintaks berbasis komponen** (direkomendasikan):
|
|
436
276
|
Gunakan sintaks `<myContent />`, atau `<Component :is="myContent" />` untuk merender konten sebagai Node Intlayer. Ini terintegrasi dengan mulus dengan [Visual Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_visual_editor.md) dan [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md).
|
|
437
277
|
|
|
438
278
|
- **Sintaks berbasis string**:
|
|
@@ -444,70 +284,60 @@ Intlayer menawarkan berbagai API untuk mengakses konten Anda:
|
|
|
444
284
|
- **Sintaks destrukturisasi**:
|
|
445
285
|
Composable `useIntlayer` mengembalikan sebuah Proxy dengan konten. Proxy ini dapat didestrukturisasi untuk mengakses konten sambil menjaga reaktivitas.
|
|
446
286
|
- Gunakan `const content = useIntlayer("myContent");` dan `{{ content.myContent }}` / `<content.myContent />`.
|
|
447
|
-
- Atau gunakan `const { myContent } = useIntlayer("myContent");` dan `{{ myContent}}` / `<myContent/>` untuk
|
|
287
|
+
- Atau gunakan `const { myContent } = useIntlayer("myContent");` dan `{{ myContent}}` / `<myContent/>` untuk mendestruktur konten.
|
|
448
288
|
|
|
449
289
|
### (Opsional) Langkah 6: Ubah bahasa konten Anda
|
|
450
290
|
|
|
451
|
-
Untuk mengubah bahasa konten Anda, Anda dapat menggunakan fungsi `setLocale` yang disediakan oleh composable `useLocale`. Fungsi ini memungkinkan Anda mengatur locale aplikasi dan memperbarui konten sesuai dengan
|
|
291
|
+
Untuk mengubah bahasa konten Anda, Anda dapat menggunakan fungsi `setLocale` yang disediakan oleh composable `useLocale`. Fungsi ini memungkinkan Anda untuk mengatur locale aplikasi dan memperbarui konten sesuai dengan itu.
|
|
452
292
|
|
|
453
|
-
Buat
|
|
293
|
+
Buat komponen untuk beralih antar bahasa menggunakan `NuxtLink`. **Menggunakan tautan daripada tombol untuk pergantian locale adalah praktik terbaik untuk SEO dan keterlihatan halaman**, karena memungkinkan mesin pencari untuk merayapi dan mengindeks semua versi terlokalisasi dari halaman Anda:
|
|
454
294
|
|
|
455
295
|
```vue fileName="components/LocaleSwitcher.vue"
|
|
456
|
-
<template>
|
|
457
|
-
<div class="locale-switcher">
|
|
458
|
-
<select v-model="selectedLocale" @change="changeLocale">
|
|
459
|
-
<option v-for="loc in availableLocales" :key="loc" :value="loc">
|
|
460
|
-
{{ getLocaleName(loc) }}
|
|
461
|
-
</option>
|
|
462
|
-
</select>
|
|
463
|
-
</div>
|
|
464
|
-
</template>
|
|
465
|
-
|
|
466
296
|
<script setup lang="ts">
|
|
467
|
-
import {
|
|
468
|
-
import { getLocaleName } from "intlayer";
|
|
297
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
469
298
|
import { useLocale } from "vue-intlayer";
|
|
470
299
|
|
|
471
|
-
//
|
|
300
|
+
// Nuxt secara otomatis mengimpor useRoute
|
|
301
|
+
const route = useRoute();
|
|
472
302
|
const { locale, availableLocales, setLocale } = useLocale();
|
|
473
|
-
|
|
474
|
-
// Melacak locale yang dipilih dengan ref
|
|
475
|
-
const selectedLocale = ref(locale.value);
|
|
476
|
-
|
|
477
|
-
// Memperbarui locale saat pilihan berubah
|
|
478
|
-
const changeLocale = () => setLocale(selectedLocale.value);
|
|
479
|
-
|
|
480
|
-
// Menjaga selectedLocale tetap sinkron dengan locale global
|
|
481
|
-
watch(
|
|
482
|
-
() => locale.value,
|
|
483
|
-
(newLocale) => {
|
|
484
|
-
selectedLocale.value = newLocale;
|
|
485
|
-
}
|
|
486
|
-
);
|
|
487
303
|
</script>
|
|
304
|
+
|
|
305
|
+
<template>
|
|
306
|
+
<nav class="locale-switcher">
|
|
307
|
+
<NuxtLink
|
|
308
|
+
v-for="localeEl in availableLocales"
|
|
309
|
+
:key="localeEl"
|
|
310
|
+
:to="getLocalizedUrl(route.fullPath, localeEl)"
|
|
311
|
+
class="locale-link"
|
|
312
|
+
:class="{ 'active-locale': localeEl === locale }"
|
|
313
|
+
@click="setLocale(localeEl)"
|
|
314
|
+
>
|
|
315
|
+
{{ getLocaleName(localeEl) }}
|
|
316
|
+
</NuxtLink>
|
|
317
|
+
</nav>
|
|
488
318
|
</template>
|
|
319
|
+
```
|
|
489
320
|
|
|
490
|
-
|
|
491
|
-
.locale-switcher {
|
|
492
|
-
margin: 1rem 0;
|
|
493
|
-
}
|
|
321
|
+
> Menggunakan `NuxtLink` dengan atribut `href` yang tepat (melalui `getLocalizedUrl`) memastikan bahwa mesin pencari dapat menemukan semua varian bahasa dari halaman Anda. Ini lebih disukai dibandingkan dengan pengalihan locale hanya menggunakan JavaScript, yang mungkin tidak diikuti oleh perayap mesin pencari.
|
|
494
322
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
323
|
+
Kemudian, atur `app.vue` Anda untuk menggunakan layout:
|
|
324
|
+
|
|
325
|
+
```vue fileName="app.vue"
|
|
326
|
+
<template>
|
|
327
|
+
<NuxtLayout>
|
|
328
|
+
<NuxtPage />
|
|
329
|
+
</NuxtLayout>
|
|
330
|
+
</template>
|
|
501
331
|
```
|
|
502
332
|
|
|
503
|
-
|
|
333
|
+
### (Opsional) Langkah 6b: Buat Layout dengan Navigasi
|
|
504
334
|
|
|
505
|
-
|
|
335
|
+
Layout Nuxt memungkinkan Anda mendefinisikan struktur umum untuk halaman Anda. Buat layout default yang mencakup locale switcher dan navigasi:
|
|
336
|
+
|
|
337
|
+
```vue fileName="layouts/default.vue"
|
|
506
338
|
<script setup lang="ts">
|
|
507
|
-
import
|
|
339
|
+
import Links from "~/components/Links.vue";
|
|
508
340
|
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
509
|
-
|
|
510
|
-
const content = useIntlayer("app"); // Buat file deklarasi intlayer terkait
|
|
511
341
|
</script>
|
|
512
342
|
|
|
513
343
|
<template>
|
|
@@ -516,13 +346,18 @@ const content = useIntlayer("app"); // Buat file deklarasi intlayer terkait
|
|
|
516
346
|
<LocaleSwitcher />
|
|
517
347
|
</header>
|
|
518
348
|
<main>
|
|
519
|
-
<
|
|
349
|
+
<slot />
|
|
520
350
|
</main>
|
|
351
|
+
|
|
352
|
+
<Links href="/">Beranda</Links>
|
|
353
|
+
<Links href="/about">Tentang</Links>
|
|
521
354
|
</div>
|
|
522
355
|
</template>
|
|
523
356
|
```
|
|
524
357
|
|
|
525
|
-
|
|
358
|
+
Komponen `Links` (ditunjukkan di bawah) memastikan bahwa tautan navigasi internal secara otomatis dilokalkan.
|
|
359
|
+
|
|
360
|
+
### (Opsional) Langkah 7: Tambahkan Routing yang Dilokalkan ke aplikasi Anda
|
|
526
361
|
|
|
527
362
|
Nuxt secara otomatis menangani routing yang dilokalkan saat menggunakan modul `nuxt-intlayer`. Ini membuat rute untuk setiap bahasa secara otomatis berdasarkan struktur direktori halaman Anda.
|
|
528
363
|
|
|
@@ -536,217 +371,283 @@ pages/
|
|
|
536
371
|
└── index.vue → /contact, /fr/contact, /es/contact
|
|
537
372
|
```
|
|
538
373
|
|
|
539
|
-
Untuk membuat halaman yang dilokalkan, cukup buat file Vue Anda di direktori `pages
|
|
374
|
+
Untuk membuat halaman yang dilokalkan, cukup buat file Vue Anda di direktori `pages/`. Berikut adalah dua contoh halaman:
|
|
375
|
+
|
|
376
|
+
**Halaman Beranda (`pages/index.vue`):**
|
|
377
|
+
|
|
378
|
+
```vue fileName="pages/index.vue"
|
|
379
|
+
<script setup lang="ts">
|
|
380
|
+
import { useIntlayer } from "vue-intlayer";
|
|
381
|
+
|
|
382
|
+
const content = useIntlayer("home-page");
|
|
383
|
+
|
|
384
|
+
useHead({
|
|
385
|
+
title: content.metaTitle.value,
|
|
386
|
+
meta: [
|
|
387
|
+
{
|
|
388
|
+
name: "description",
|
|
389
|
+
content: content.metaDescription.value,
|
|
390
|
+
},
|
|
391
|
+
],
|
|
392
|
+
});
|
|
393
|
+
</script>
|
|
394
|
+
|
|
395
|
+
<template>
|
|
396
|
+
<h1><content.title /></h1>
|
|
397
|
+
</template>
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Halaman Tentang (`pages/about.vue`):**
|
|
540
401
|
|
|
541
402
|
```vue fileName="pages/about.vue"
|
|
542
403
|
<script setup lang="ts">
|
|
543
404
|
import { useIntlayer } from "vue-intlayer";
|
|
544
405
|
|
|
545
|
-
const content = useIntlayer("about");
|
|
406
|
+
const content = useIntlayer("about-page");
|
|
407
|
+
|
|
408
|
+
useHead({
|
|
409
|
+
title: content.metaTitle.raw, // Gunakan .raw untuk akses string primitif
|
|
410
|
+
meta: [
|
|
411
|
+
{
|
|
412
|
+
name: "description",
|
|
413
|
+
content: content.metaDescription.raw, // Gunakan .raw untuk akses string primitif
|
|
414
|
+
},
|
|
415
|
+
],
|
|
416
|
+
});
|
|
546
417
|
</script>
|
|
547
418
|
|
|
548
419
|
<template>
|
|
549
|
-
<
|
|
550
|
-
<h1>{{ content.title }}</h1>
|
|
551
|
-
<p>{{ content.description }}</p>
|
|
552
|
-
</div>
|
|
420
|
+
<h1><content.title /></h1>
|
|
553
421
|
</template>
|
|
554
422
|
```
|
|
555
423
|
|
|
424
|
+
> Catatan: `useHead` diimpor secara otomatis di Nuxt. Anda dapat mengakses nilai konten menggunakan `.value` (reaktif) atau `.raw` (string primitif) sesuai kebutuhan Anda.
|
|
425
|
+
|
|
556
426
|
Modul `nuxt-intlayer` secara otomatis akan:
|
|
557
427
|
|
|
558
428
|
- Mendeteksi locale yang dipilih pengguna
|
|
559
429
|
- Menangani pergantian locale melalui URL
|
|
560
430
|
- Mengatur atribut `<html lang="">` yang sesuai
|
|
561
431
|
- Mengelola cookie locale
|
|
562
|
-
- Mengarahkan pengguna ke URL yang
|
|
432
|
+
- Mengarahkan pengguna ke URL lokal yang sesuai
|
|
563
433
|
|
|
564
|
-
### (Opsional) Langkah 8: Membuat Komponen
|
|
434
|
+
### (Opsional) Langkah 8: Membuat Komponen Link yang Dilokalkan
|
|
565
435
|
|
|
566
|
-
Untuk memastikan navigasi aplikasi Anda menghormati locale saat ini, Anda dapat membuat komponen `
|
|
567
|
-
|
|
568
|
-
```vue fileName="components/LocalizedLink.vue"
|
|
569
|
-
<template>
|
|
570
|
-
<NuxtLink :to="localizedHref" v-bind="$attrs">
|
|
571
|
-
<slot />
|
|
572
|
-
</NuxtLink>
|
|
573
|
-
</template>
|
|
436
|
+
Untuk memastikan navigasi aplikasi Anda menghormati locale saat ini, Anda dapat membuat komponen `Links` kustom. Komponen ini secara otomatis menambahkan prefix bahasa saat ini pada URL internal, yang sangat penting untuk **SEO dan keterlihatan halaman**.
|
|
574
437
|
|
|
438
|
+
```vue fileName="components/Links.vue"
|
|
575
439
|
<script setup lang="ts">
|
|
576
|
-
import { computed } from "vue";
|
|
577
440
|
import { getLocalizedUrl } from "intlayer";
|
|
578
441
|
import { useLocale } from "vue-intlayer";
|
|
579
442
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
443
|
+
interface Props {
|
|
444
|
+
href: string;
|
|
445
|
+
locale?: string;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
const props = defineProps<Props>();
|
|
449
|
+
|
|
450
|
+
const { locale: currentLocale } = useLocale();
|
|
586
451
|
|
|
587
|
-
|
|
452
|
+
// Hitung path akhir
|
|
453
|
+
const finalPath = computed(() => {
|
|
454
|
+
// 1. Periksa apakah link bersifat eksternal
|
|
455
|
+
const isExternal = /^https?:\/\//.test(props.href || "");
|
|
588
456
|
|
|
589
|
-
//
|
|
590
|
-
|
|
457
|
+
// 2. Jika eksternal, kembalikan apa adanya (NuxtLink menangani pembuatan tag <a>)
|
|
458
|
+
if (isExternal) return props.href;
|
|
591
459
|
|
|
592
|
-
//
|
|
593
|
-
const
|
|
594
|
-
|
|
595
|
-
);
|
|
460
|
+
// 3. Jika internal, lokalize URL-nya
|
|
461
|
+
const targetLocale = props.locale || currentLocale.value;
|
|
462
|
+
return getLocalizedUrl(props.href, targetLocale);
|
|
463
|
+
});
|
|
596
464
|
</script>
|
|
465
|
+
|
|
466
|
+
<template>
|
|
467
|
+
<NuxtLink :to="finalPath" v-bind="$attrs">
|
|
468
|
+
<slot />
|
|
469
|
+
</NuxtLink>
|
|
470
|
+
</template>
|
|
597
471
|
```
|
|
598
472
|
|
|
599
473
|
Kemudian gunakan komponen ini di seluruh aplikasi Anda:
|
|
600
474
|
|
|
601
|
-
```vue fileName="
|
|
475
|
+
```vue fileName="layouts/default.vue"
|
|
476
|
+
<script setup lang="ts">
|
|
477
|
+
import Links from "~/components/Links.vue";
|
|
478
|
+
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
479
|
+
</script>
|
|
480
|
+
|
|
602
481
|
<template>
|
|
603
482
|
<div>
|
|
604
|
-
<
|
|
605
|
-
|
|
606
|
-
</
|
|
607
|
-
<
|
|
608
|
-
|
|
609
|
-
</
|
|
483
|
+
<header>
|
|
484
|
+
<LocaleSwitcher />
|
|
485
|
+
</header>
|
|
486
|
+
<main>
|
|
487
|
+
<slot />
|
|
488
|
+
</main>
|
|
489
|
+
|
|
490
|
+
<Links href="/">Beranda</Links>
|
|
491
|
+
<Links href="/about">Tentang</Links>
|
|
610
492
|
</div>
|
|
611
493
|
</template>
|
|
612
|
-
|
|
613
|
-
<script setup lang="ts">
|
|
614
|
-
import { useIntlayer } from "vue-intlayer";
|
|
615
|
-
import LocalizedLink from "~/components/LocalizedLink.vue";
|
|
616
|
-
|
|
617
|
-
const content = useIntlayer("home");
|
|
618
|
-
</script>
|
|
619
494
|
```
|
|
620
495
|
|
|
496
|
+
> Dengan menggunakan `NuxtLink` dengan path yang dilokalkan, Anda memastikan bahwa:
|
|
497
|
+
>
|
|
498
|
+
> - Mesin pencari dapat merayapi dan mengindeks semua versi bahasa dari halaman Anda
|
|
499
|
+
> - Pengguna dapat membagikan URL yang dilokalkan secara langsung
|
|
500
|
+
> - Riwayat browser berfungsi dengan benar dengan URL yang diawali locale
|
|
501
|
+
|
|
621
502
|
### (Opsional) Langkah 9: Menangani Metadata dan SEO
|
|
622
503
|
|
|
623
|
-
Nuxt menyediakan kemampuan SEO yang sangat baik. Anda dapat menggunakan Intlayer untuk menangani metadata yang
|
|
504
|
+
Nuxt menyediakan kemampuan SEO yang sangat baik melalui composable `useHead` (diimpor otomatis). Anda dapat menggunakan Intlayer untuk menangani metadata yang dilokalkan menggunakan accessor `.raw` atau `.value` untuk mendapatkan nilai string primitif:
|
|
624
505
|
|
|
625
506
|
```vue fileName="pages/about.vue"
|
|
626
507
|
<script setup lang="ts">
|
|
627
|
-
import {
|
|
628
|
-
import { getIntlayer } from "intlayer";
|
|
629
|
-
import { useLocale } from "vue-intlayer";
|
|
508
|
+
import { useIntlayer } from "vue-intlayer";
|
|
630
509
|
|
|
631
|
-
|
|
632
|
-
const content =
|
|
510
|
+
// useHead diimpor otomatis di Nuxt
|
|
511
|
+
const content = useIntlayer("about-page");
|
|
633
512
|
|
|
634
|
-
|
|
635
|
-
title: content.
|
|
636
|
-
|
|
513
|
+
useHead({
|
|
514
|
+
title: content.metaTitle.raw, // Gunakan .raw untuk akses string primitif
|
|
515
|
+
meta: [
|
|
516
|
+
{
|
|
517
|
+
name: "description",
|
|
518
|
+
content: content.metaDescription.raw, // Gunakan .raw untuk akses string primitif
|
|
519
|
+
},
|
|
520
|
+
],
|
|
637
521
|
});
|
|
638
522
|
</script>
|
|
639
523
|
|
|
640
524
|
<template>
|
|
641
|
-
<
|
|
642
|
-
<h1>{{ content.pageTitle }}</h1>
|
|
643
|
-
<p>{{ content.pageContent }}</p>
|
|
644
|
-
</div>
|
|
525
|
+
<h1><content.title /></h1>
|
|
645
526
|
</template>
|
|
646
527
|
```
|
|
647
528
|
|
|
529
|
+
> Sebagai alternatif, Anda dapat menggunakan fungsi `import { getIntlayer } from "intlayer"` untuk mendapatkan konten tanpa reaktivitas Vue.
|
|
530
|
+
|
|
531
|
+
> **Mengakses nilai konten:**
|
|
532
|
+
>
|
|
533
|
+
> - Gunakan `.raw` untuk mendapatkan nilai string primitif (non-reaktif)
|
|
534
|
+
> - Gunakan `.value` untuk mendapatkan nilai reaktif
|
|
535
|
+
> - Gunakan sintaks komponen `<content.key />` untuk dukungan Visual Editor
|
|
536
|
+
|
|
648
537
|
Buat deklarasi konten yang sesuai:
|
|
649
538
|
|
|
650
|
-
```ts fileName="pages/about-
|
|
539
|
+
```ts fileName="pages/about-page.content.ts" contentDeclarationFormat="typescript"
|
|
651
540
|
import { t, type Dictionary } from "intlayer";
|
|
652
|
-
import type { useSeoMeta } from "nuxt/app";
|
|
653
541
|
|
|
654
|
-
const
|
|
655
|
-
key: "about-
|
|
542
|
+
const aboutPageContent = {
|
|
543
|
+
key: "about-page",
|
|
656
544
|
content: {
|
|
657
|
-
|
|
658
|
-
en: "
|
|
545
|
+
metaTitle: t({
|
|
546
|
+
en: "Tentang Kami - Perusahaan Saya",
|
|
659
547
|
fr: "À Propos - Ma Société",
|
|
660
548
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
661
|
-
id: "Tentang Kami - Perusahaan Saya",
|
|
662
549
|
}),
|
|
663
|
-
|
|
664
|
-
en: "
|
|
550
|
+
metaDescription: t({
|
|
551
|
+
en: "Pelajari lebih lanjut tentang perusahaan kami dan misi kami",
|
|
665
552
|
fr: "En savoir plus sur notre société et notre mission",
|
|
666
553
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
667
|
-
|
|
554
|
+
}),
|
|
555
|
+
title: t({
|
|
556
|
+
en: "Tentang Kami",
|
|
557
|
+
fr: "À Propos",
|
|
558
|
+
es: "Acerca de Nosotros",
|
|
668
559
|
}),
|
|
669
560
|
},
|
|
670
|
-
} satisfies Dictionary
|
|
561
|
+
} satisfies Dictionary;
|
|
671
562
|
|
|
672
|
-
export default
|
|
563
|
+
export default aboutPageContent;
|
|
673
564
|
```
|
|
674
565
|
|
|
675
|
-
```
|
|
566
|
+
```javascript fileName="pages/about-page.content.mjs" contentDeclarationFormat="esm"
|
|
676
567
|
import { t } from "intlayer";
|
|
677
568
|
|
|
678
569
|
/** @type {import('intlayer').Dictionary} */
|
|
679
|
-
const
|
|
680
|
-
key: "about-
|
|
570
|
+
const aboutPageContent = {
|
|
571
|
+
key: "about-page",
|
|
681
572
|
content: {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
zh: "关于我们 - 我的公司",
|
|
685
|
-
en: "About Us - My Company",
|
|
573
|
+
metaTitle: t({
|
|
574
|
+
en: "Tentang Kami - Perusahaan Saya",
|
|
686
575
|
fr: "À Propos - Ma Société",
|
|
687
576
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
688
577
|
}),
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
692
|
-
en: "Learn more about our company and our mission",
|
|
578
|
+
metaDescription: t({
|
|
579
|
+
en: "Pelajari lebih lanjut tentang perusahaan kami dan misi kami",
|
|
693
580
|
fr: "En savoir plus sur notre société et notre mission",
|
|
694
581
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
695
582
|
}),
|
|
583
|
+
title: t({
|
|
584
|
+
en: "Tentang Kami",
|
|
585
|
+
fr: "À Propos",
|
|
586
|
+
es: "Acerca de Nosotros",
|
|
587
|
+
}),
|
|
696
588
|
},
|
|
697
589
|
};
|
|
698
590
|
|
|
699
|
-
export default
|
|
591
|
+
export default aboutPageContent;
|
|
700
592
|
```
|
|
701
593
|
|
|
702
|
-
```
|
|
594
|
+
```javascript fileName="pages/about-page.content.cjs" contentDeclarationFormat="commonjs"
|
|
703
595
|
const { t } = require("intlayer");
|
|
704
596
|
|
|
705
597
|
/** @type {import('intlayer').Dictionary} */
|
|
706
|
-
const
|
|
707
|
-
key: "about-
|
|
598
|
+
const aboutPageContent = {
|
|
599
|
+
key: "about-page",
|
|
708
600
|
content: {
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
zh: "关于我们 - 我的公司",
|
|
712
|
-
en: "About Us - My Company",
|
|
601
|
+
metaTitle: t({
|
|
602
|
+
en: "Tentang Kami - Perusahaan Saya",
|
|
713
603
|
fr: "À Propos - Ma Société",
|
|
714
604
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
715
605
|
}),
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
en: "Learn more about our company and our mission",
|
|
606
|
+
metaDescription: t({
|
|
607
|
+
en: "Pelajari lebih lanjut tentang perusahaan kami dan misi kami",
|
|
719
608
|
fr: "En savoir plus sur notre société et notre mission",
|
|
720
609
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
721
|
-
|
|
610
|
+
}),
|
|
611
|
+
title: t({
|
|
612
|
+
en: "Tentang Kami",
|
|
613
|
+
fr: "À Propos",
|
|
614
|
+
es: "Acerca de Nosotros",
|
|
722
615
|
}),
|
|
723
616
|
},
|
|
724
617
|
};
|
|
725
618
|
|
|
726
|
-
module.exports =
|
|
619
|
+
module.exports = aboutPageContent;
|
|
727
620
|
```
|
|
728
621
|
|
|
729
|
-
```json fileName="pages/about-
|
|
622
|
+
```json fileName="pages/about-page.content.json" contentDeclarationFormat="json"
|
|
730
623
|
{
|
|
731
|
-
"
|
|
624
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
625
|
+
"key": "about-page",
|
|
732
626
|
"content": {
|
|
733
|
-
"
|
|
627
|
+
"metaTitle": {
|
|
734
628
|
"nodeType": "translation",
|
|
735
|
-
"
|
|
736
|
-
"
|
|
737
|
-
"en": "About Us - My Company",
|
|
629
|
+
"translation": {
|
|
630
|
+
"en": "Tentang Kami - Perusahaan Saya",
|
|
738
631
|
"fr": "À Propos - Ma Société",
|
|
739
|
-
"es": "Acerca de Nosotros - Mi Empresa"
|
|
740
|
-
"id": "Tentang Kami - Perusahaan Saya"
|
|
632
|
+
"es": "Acerca de Nosotros - Mi Empresa"
|
|
741
633
|
}
|
|
742
634
|
},
|
|
743
|
-
"
|
|
635
|
+
"metaDescription": {
|
|
744
636
|
"nodeType": "translation",
|
|
745
|
-
"
|
|
746
|
-
"zh": "了解更多关于我们公司和我们的使命",
|
|
637
|
+
"translation": {
|
|
747
638
|
"en": "Learn more about our company and our mission",
|
|
748
639
|
"fr": "En savoir plus sur notre société et notre mission",
|
|
749
|
-
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
640
|
+
"es": "Conozca más sobre nuestra empresa y nuestra misión",
|
|
641
|
+
"id": "Pelajari lebih lanjut tentang perusahaan kami dan misi kami"
|
|
642
|
+
}
|
|
643
|
+
},
|
|
644
|
+
"title": {
|
|
645
|
+
"nodeType": "translation",
|
|
646
|
+
"translation": {
|
|
647
|
+
"en": "About Us",
|
|
648
|
+
"fr": "À Propos",
|
|
649
|
+
"es": "Acerca de Nosotros",
|
|
650
|
+
"id": "Tentang Kami"
|
|
750
651
|
}
|
|
751
652
|
}
|
|
752
653
|
}
|
|
@@ -759,7 +660,7 @@ Intlayer menggunakan module augmentation untuk mendapatkan manfaat dari TypeScri
|
|
|
759
660
|
|
|
760
661
|

|
|
761
662
|
|
|
762
|
-

|
|
763
664
|
|
|
764
665
|
Pastikan konfigurasi TypeScript Anda menyertakan tipe yang dihasilkan secara otomatis.
|
|
765
666
|
|
|
@@ -775,7 +676,7 @@ Pastikan konfigurasi TypeScript Anda menyertakan tipe yang dihasilkan secara oto
|
|
|
775
676
|
|
|
776
677
|
### Konfigurasi Git
|
|
777
678
|
|
|
778
|
-
Disarankan untuk mengabaikan file yang dihasilkan oleh Intlayer. Ini memungkinkan Anda
|
|
679
|
+
Disarankan untuk mengabaikan file yang dihasilkan oleh Intlayer. Ini memungkinkan Anda menghindari meng-commit file tersebut ke repositori Git Anda.
|
|
779
680
|
|
|
780
681
|
Untuk melakukannya, Anda dapat menambahkan instruksi berikut ke file `.gitignore` Anda:
|
|
781
682
|
|
|
@@ -793,7 +694,7 @@ Untuk meningkatkan pengalaman pengembangan Anda dengan Intlayer, Anda dapat meng
|
|
|
793
694
|
Ekstensi ini menyediakan:
|
|
794
695
|
|
|
795
696
|
- **Autocompletion** untuk kunci terjemahan.
|
|
796
|
-
- **Deteksi kesalahan
|
|
697
|
+
- **Deteksi kesalahan waktu nyata** untuk terjemahan yang hilang.
|
|
797
698
|
- **Pratinjau inline** dari konten yang diterjemahkan.
|
|
798
699
|
- **Aksi cepat** untuk dengan mudah membuat dan memperbarui terjemahan.
|
|
799
700
|
|
|
@@ -804,5 +705,3 @@ Untuk detail lebih lanjut tentang cara menggunakan ekstensi ini, lihat [dokument
|
|
|
804
705
|
### Melangkah Lebih Jauh
|
|
805
706
|
|
|
806
707
|
Untuk melangkah lebih jauh, Anda dapat mengimplementasikan [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_visual_editor.md) atau mengeksternalisasi konten Anda menggunakan [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md).
|
|
807
|
-
|
|
808
|
-
---
|