@intlayer/docs 7.0.4-canary.0 → 7.0.4
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/blog/ar/intlayer_with_i18next.md +68 -106
- package/blog/ar/intlayer_with_next-i18next.md +84 -288
- package/blog/ar/intlayer_with_next-intl.md +58 -337
- package/blog/ar/intlayer_with_react-i18next.md +68 -290
- package/blog/ar/intlayer_with_react-intl.md +63 -266
- package/blog/de/intlayer_with_i18next.md +77 -97
- package/blog/de/intlayer_with_next-i18next.md +69 -296
- package/blog/de/intlayer_with_next-intl.md +59 -340
- package/blog/de/intlayer_with_react-i18next.md +68 -290
- package/blog/de/intlayer_with_react-intl.md +62 -264
- package/blog/en/intlayer_with_i18next.md +36 -1638
- package/blog/en/intlayer_with_next-i18next.md +22 -847
- package/blog/en/intlayer_with_next-intl.md +32 -1053
- package/blog/en/intlayer_with_react-i18next.md +38 -764
- package/blog/en/intlayer_with_react-intl.md +42 -1018
- package/blog/en-GB/intlayer_with_i18next.md +67 -103
- package/blog/en-GB/intlayer_with_next-i18next.md +71 -292
- package/blog/en-GB/intlayer_with_next-intl.md +58 -337
- package/blog/en-GB/intlayer_with_react-i18next.md +67 -289
- package/blog/en-GB/intlayer_with_react-intl.md +61 -264
- package/blog/es/intlayer_with_i18next.md +67 -103
- package/blog/es/intlayer_with_next-i18next.md +71 -296
- package/blog/es/intlayer_with_next-intl.md +57 -338
- package/blog/es/intlayer_with_react-i18next.md +68 -290
- package/blog/es/intlayer_with_react-intl.md +62 -265
- package/blog/fr/intlayer_with_i18next.md +66 -104
- package/blog/fr/intlayer_with_next-i18next.md +82 -285
- package/blog/fr/intlayer_with_next-intl.md +57 -338
- package/blog/fr/intlayer_with_react-i18next.md +67 -289
- package/blog/fr/intlayer_with_react-intl.md +61 -264
- package/blog/hi/intlayer_with_i18next.md +68 -104
- package/blog/hi/intlayer_with_next-i18next.md +74 -299
- package/blog/hi/intlayer_with_next-intl.md +57 -239
- package/blog/hi/intlayer_with_react-i18next.md +69 -291
- package/blog/hi/intlayer_with_react-intl.md +65 -268
- package/blog/id/intlayer_with_i18next.md +126 -0
- package/blog/id/intlayer_with_next-i18next.md +142 -0
- package/blog/id/intlayer_with_next-intl.md +113 -0
- package/blog/id/intlayer_with_react-i18next.md +124 -0
- package/blog/id/intlayer_with_react-intl.md +122 -0
- package/blog/it/intlayer_with_i18next.md +67 -103
- package/blog/it/intlayer_with_next-i18next.md +71 -296
- package/blog/it/intlayer_with_next-intl.md +57 -338
- package/blog/it/intlayer_with_react-i18next.md +68 -290
- package/blog/it/intlayer_with_react-intl.md +62 -265
- package/blog/ja/intlayer_with_i18next.md +68 -103
- package/blog/ja/intlayer_with_next-i18next.md +85 -283
- package/blog/ja/intlayer_with_next-intl.md +58 -336
- package/blog/ja/intlayer_with_react-i18next.md +68 -290
- package/blog/ja/intlayer_with_react-intl.md +62 -264
- package/blog/ko/intlayer_with_i18next.md +80 -96
- package/blog/ko/intlayer_with_next-i18next.md +85 -287
- package/blog/ko/intlayer_with_next-intl.md +68 -327
- package/blog/ko/intlayer_with_react-i18next.md +68 -290
- package/blog/ko/intlayer_with_react-intl.md +64 -266
- package/blog/pl/intlayer_with_i18next.md +126 -0
- package/blog/pl/intlayer_with_next-i18next.md +142 -0
- package/blog/pl/intlayer_with_next-intl.md +111 -0
- package/blog/pl/intlayer_with_react-i18next.md +124 -0
- package/blog/pl/intlayer_with_react-intl.md +122 -0
- package/blog/pt/intlayer_with_i18next.md +67 -103
- package/blog/pt/intlayer_with_next-i18next.md +72 -293
- package/blog/pt/intlayer_with_next-intl.md +57 -256
- package/blog/pt/intlayer_with_react-i18next.md +104 -78
- package/blog/pt/intlayer_with_react-intl.md +62 -266
- package/blog/ru/intlayer_with_i18next.md +66 -104
- package/blog/ru/intlayer_with_next-i18next.md +71 -296
- package/blog/ru/intlayer_with_next-intl.md +58 -337
- package/blog/ru/intlayer_with_react-i18next.md +68 -290
- package/blog/ru/intlayer_with_react-intl.md +62 -265
- package/blog/tr/intlayer_with_i18next.md +71 -107
- package/blog/tr/intlayer_with_next-i18next.md +72 -297
- package/blog/tr/intlayer_with_next-intl.md +58 -339
- package/blog/tr/intlayer_with_react-i18next.md +69 -291
- package/blog/tr/intlayer_with_react-intl.md +63 -285
- package/blog/vi/intlayer_with_i18next.md +126 -0
- package/blog/vi/intlayer_with_next-i18next.md +142 -0
- package/blog/vi/intlayer_with_next-intl.md +111 -0
- package/blog/vi/intlayer_with_react-i18next.md +124 -0
- package/blog/vi/intlayer_with_react-intl.md +122 -0
- package/blog/zh/intlayer_with_i18next.md +67 -102
- package/blog/zh/intlayer_with_next-i18next.md +72 -296
- package/blog/zh/intlayer_with_next-intl.md +58 -336
- package/blog/zh/intlayer_with_react-i18next.md +68 -290
- package/blog/zh/intlayer_with_react-intl.md +63 -106
- package/docs/ar/plugins/sync-json.md +244 -0
- package/docs/de/plugins/sync-json.md +244 -0
- package/docs/en/intlayer_cli.md +25 -0
- package/docs/en/intlayer_with_nextjs_14.md +2 -0
- package/docs/en/intlayer_with_nextjs_15.md +2 -0
- package/docs/en/intlayer_with_nextjs_16.md +2 -0
- package/docs/en/plugins/sync-json.md +1 -1
- package/docs/en-GB/plugins/sync-json.md +244 -0
- package/docs/es/plugins/sync-json.md +244 -0
- package/docs/fr/plugins/sync-json.md +244 -0
- package/docs/hi/plugins/sync-json.md +244 -0
- package/docs/id/plugins/sync-json.md +244 -0
- package/docs/it/plugins/sync-json.md +244 -0
- package/docs/ja/plugins/sync-json.md +244 -0
- package/docs/ko/plugins/sync-json.md +244 -0
- package/docs/pl/plugins/sync-json.md +244 -0
- package/docs/pt/plugins/sync-json.md +244 -0
- package/docs/ru/plugins/sync-json.md +244 -0
- package/docs/tr/plugins/sync-json.md +245 -0
- package/docs/vi/plugins/sync-json.md +244 -0
- package/docs/zh/plugins/sync-json.md +244 -0
- package/package.json +14 -14
|
@@ -1,345 +1,123 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Intlayer
|
|
5
|
-
description: React
|
|
2
|
+
createdAt: 2025-01-02
|
|
3
|
+
updatedAt: 2025-10-29
|
|
4
|
+
title: Intlayer kullanarak react-intl JSON çevirilerinizi nasıl otomatikleştirirsiniz
|
|
5
|
+
description: React uygulamalarında gelişmiş uluslararasılaştırma için Intlayer ve react-intl ile JSON çevirilerinizi otomatikleştirin.
|
|
6
6
|
keywords:
|
|
7
7
|
- react-intl
|
|
8
8
|
- Intlayer
|
|
9
|
-
-
|
|
9
|
+
- Uluslararasılaştırma
|
|
10
10
|
- Blog
|
|
11
|
-
-
|
|
11
|
+
- i18n
|
|
12
12
|
- JavaScript
|
|
13
13
|
- React
|
|
14
|
+
- FormatJS
|
|
14
15
|
slugs:
|
|
15
16
|
- blog
|
|
16
17
|
- intlayer-with-react-intl
|
|
18
|
+
history:
|
|
19
|
+
- version: 7.0.0
|
|
20
|
+
date: 2025-10-29
|
|
21
|
+
changes: syncJSON eklentisine geçiş
|
|
17
22
|
---
|
|
18
23
|
|
|
19
|
-
#
|
|
24
|
+
# Intlayer kullanarak react-intl JSON çevirilerinizi nasıl otomatikleştirirsiniz
|
|
20
25
|
|
|
21
|
-
|
|
26
|
+
## Intlayer nedir?
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
**Intlayer**, geleneksel i18n çözümlerinin eksikliklerini gidermek için tasarlanmış yenilikçi, açık kaynaklı bir uluslararasılaştırma kütüphanesidir. React uygulamalarında içerik yönetimi için modern bir yaklaşım sunar.
|
|
24
29
|
|
|
25
|
-
-
|
|
26
|
-
- **react-intl**, yerelleştirilmiş dizeleri görüntülemek için React bileşenleri ve hook'lar ( `<FormattedMessage>` ve `useIntl()` gibi) sağlar.
|
|
30
|
+
react-intl ile somut bir karşılaştırma için [react-i18next vs. react-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/react-i18next_vs_react-intl_vs_intlayer.md) blog yazımıza bakabilirsiniz.
|
|
27
31
|
|
|
28
|
-
Intlayer'ı
|
|
32
|
+
## Neden Intlayer'ı react-intl ile Birleştirmelisiniz?
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
Intlayer mükemmel bir bağımsız i18n çözümü sunarken (bakınız [React entegrasyon rehberimiz](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_vite+react.md)), react-intl ile birkaç nedenle birleştirmek isteyebilirsiniz:
|
|
31
35
|
|
|
32
|
-
|
|
36
|
+
1. **Mevcut kod tabanı**: Yerleşik bir react-intl uygulamanız var ve Intlayer'ın geliştirilmiş geliştirici deneyimine kademeli olarak geçmek istiyorsunuz.
|
|
37
|
+
2. **Eski gereksinimler**: Projeniz mevcut react-intl eklentileri veya iş akışları ile uyumluluk gerektiriyor.
|
|
38
|
+
3. **Ekip aşinalığı**: Ekibiniz react-intl ile rahat ancak daha iyi içerik yönetimi istiyor.
|
|
33
39
|
|
|
34
|
-
|
|
35
|
-
Intlayer içerik beyan dosyaları React bileşenlerinizin yanında yaşayabilir, bileşenler taşındığında veya kaldırıldığında "yetim" çevirileri önler. Örneğin:
|
|
40
|
+
**Bunun için, Intlayer react-intl için bir adaptör olarak uygulanabilir; böylece JSON çevirilerinizi CLI veya CI/CD boru hatlarında otomatikleştirebilir, çevirilerinizi test edebilir ve daha fazlasını yapabilirsiniz.**
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
.
|
|
39
|
-
└── src
|
|
40
|
-
└── components
|
|
41
|
-
└── MyComponent
|
|
42
|
-
├── index.content.ts # Intlayer içerik beyan
|
|
43
|
-
└── index.tsx # React bileşeni
|
|
44
|
-
```
|
|
42
|
+
Bu rehber, Intlayer'ın üstün içerik beyan sistemi avantajlarından yararlanırken react-intl ile uyumluluğu nasıl koruyacağınızı gösterir.
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
Her içerik beyan dosyası bir bileşen tarafından ihtiyaç duyulan tüm çevirileri toplar. Bu, özellikle TypeScript projelerinde yardımcı olur: eksik çeviriler **derleme zamanında** yakalanabilir.
|
|
44
|
+
## İçindekiler
|
|
48
45
|
|
|
49
|
-
|
|
50
|
-
Çeviri eklediğinizde veya güncellediğinizde, Intlayer mesaj JSON dosyalarını yeniden oluşturur. Bunları react-intl’in `<IntlProvider>`'ına geçebilirsiniz.
|
|
46
|
+
<TOC/>
|
|
51
47
|
|
|
52
|
-
|
|
48
|
+
## Intlayer'ı react-intl ile Kurmak İçin Adım Adım Rehber
|
|
53
49
|
|
|
54
|
-
|
|
50
|
+
### Adım 1: Bağımlılıkları Yükleyin
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
Gerekli paketleri yükleyin:
|
|
57
53
|
|
|
58
|
-
```bash
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
```bash packageManager="npm"
|
|
55
|
+
npm install intlayer @intlayer/sync-json-plugin
|
|
56
|
+
```
|
|
61
57
|
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
```bash packageManager="pnpm"
|
|
59
|
+
pnpm add intlayer @intlayer/sync-json-plugin
|
|
60
|
+
```
|
|
64
61
|
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
```bash packageManager="yarn"
|
|
63
|
+
yarn add intlayer @intlayer/sync-json-plugin
|
|
67
64
|
```
|
|
68
65
|
|
|
69
|
-
|
|
66
|
+
**Paket açıklamaları:**
|
|
70
67
|
|
|
71
|
-
- **intlayer**:
|
|
72
|
-
-
|
|
68
|
+
- **intlayer**: Uluslararasılaştırma yönetimi, içerik beyanı ve oluşturma için temel kütüphane
|
|
69
|
+
- **@intlayer/sync-json-plugin**: Intlayer içerik beyanlarını react-intl uyumlu JSON formatına aktarmak için eklenti
|
|
73
70
|
|
|
74
|
-
|
|
71
|
+
### Adım 2: JSON'u sarmak için Intlayer eklentisini uygulayın
|
|
75
72
|
|
|
76
|
-
|
|
73
|
+
Desteklenen yerel ayarları tanımlamak için bir Intlayer yapılandırma dosyası oluşturun:
|
|
77
74
|
|
|
78
|
-
|
|
75
|
+
**Eğer react-intl için JSON sözlüklerini de dışa aktarmak istiyorsanız**, `syncJSON` eklentisini ekleyin:
|
|
79
76
|
|
|
80
|
-
```typescript
|
|
77
|
+
```typescript fileName="intlayer.config.ts"
|
|
81
78
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
79
|
+
import { syncJSON } from "@intlayer/sync-json-plugin";
|
|
82
80
|
|
|
83
81
|
const config: IntlayerConfig = {
|
|
84
82
|
internationalization: {
|
|
85
|
-
// İstediğiniz kadar yerel ekleyin
|
|
86
83
|
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
87
84
|
defaultLocale: Locales.ENGLISH,
|
|
88
85
|
},
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
reactIntlMessagesDir: "./react-intl/messages",
|
|
95
|
-
},
|
|
86
|
+
plugins: [
|
|
87
|
+
syncJSON({
|
|
88
|
+
source: ({ key, locale }) => `./intl/messages/${locale}/${key}.json`,
|
|
89
|
+
}),
|
|
90
|
+
],
|
|
96
91
|
};
|
|
97
92
|
|
|
98
93
|
export default config;
|
|
99
94
|
```
|
|
100
95
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Intlayer Sözlüklerinizi Oluşturma
|
|
106
|
-
|
|
107
|
-
Intlayer kod tabanınızı (varsayılan olarak `./src` altında) `*.content.{ts,tsx,js,jsx,mjs,mjx,cjs,cjx,json}` ile eşleşen dosyalar için tarar.
|
|
108
|
-
**TypeScript** örneği burada:
|
|
109
|
-
|
|
110
|
-
```typescript title="src/components/MyComponent/index.content.ts"
|
|
111
|
-
import { t, type Dictionary } from "intlayer";
|
|
112
|
-
|
|
113
|
-
const content = {
|
|
114
|
-
// "key" react-intl JSON dosyanızda üst düzey mesaj anahtarı olur
|
|
115
|
-
key: "my-component",
|
|
116
|
-
|
|
117
|
-
content: {
|
|
118
|
-
// t() çağrısının her biri çevrilebilir bir alan beyan eder
|
|
119
|
-
helloWorld: t({
|
|
120
|
-
en: "Hello World",
|
|
121
|
-
es: "Hola Mundo",
|
|
122
|
-
fr: "Bonjour le monde",
|
|
123
|
-
}),
|
|
124
|
-
description: t({
|
|
125
|
-
en: "This is a description",
|
|
126
|
-
fr: "Ceci est une description",
|
|
127
|
-
es: "Esta es una descripción",
|
|
128
|
-
}),
|
|
129
|
-
},
|
|
130
|
-
} satisfies Dictionary;
|
|
131
|
-
|
|
132
|
-
export default content;
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
JSON veya farklı JS türlerini tercih ederseniz (`.cjs`, `.mjs`), yapı büyük ölçüde aynıdır, bkz. [Intlayer içerik beyan dokümantasyonu](https://intlayer.org/en/doc/concept/content).
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## react-intl Mesajlarını Oluşturma
|
|
140
|
-
|
|
141
|
-
**react-intl** için gerçek mesaj JSON dosyalarını oluşturmak için şunu çalıştırın:
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
# npm ile
|
|
145
|
-
npx intlayer dictionaries build
|
|
146
|
-
|
|
147
|
-
# yarn ile
|
|
148
|
-
yarn intlayer build
|
|
149
|
-
|
|
150
|
-
# pnpm ile
|
|
151
|
-
pnpm intlayer build
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
Bu, tüm `*.content.*` dosyalarını tarar, derler ve sonuçları **`intlayer.config.ts`**'inizde belirtilen dizine yazar, bu örnekte `./react-intl/messages`.
|
|
155
|
-
Tipik bir çıktı şöyle görünebilir:
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
.
|
|
159
|
-
└── react-intl
|
|
160
|
-
└── messages
|
|
161
|
-
├── en.json
|
|
162
|
-
├── fr.json
|
|
163
|
-
└── es.json
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
Her dosya, beyanlarınızın her **`content.key`**'ine karşılık gelen **üst düzey anahtarlara** sahip bir JSON nesnesidir. **Alt anahtarlar** ( `helloWorld` gibi) o içerik öğesi içinde beyan edilen çevirileri yansıtır.
|
|
167
|
-
|
|
168
|
-
Örneğin, **en.json** şöyle görünebilir:
|
|
169
|
-
|
|
170
|
-
```json fileName="react-intl/messages/en/my-component.json"
|
|
171
|
-
{
|
|
172
|
-
"helloWorld": "Hello World",
|
|
173
|
-
"description": "This is a description"
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## React Uygulamanızda react-intl'i Başlatma
|
|
180
|
-
|
|
181
|
-
### 1. Oluşturulan Mesajları Yükleyin
|
|
182
|
-
|
|
183
|
-
Uygulamanızın kök bileşenini yapılandırdığınız yerde (örneğin, `src/main.tsx` veya `src/index.tsx`), şunları yapmanız gerekir:
|
|
184
|
-
|
|
185
|
-
1. **İçe aktarın** oluşturulan mesaj dosyalarını (statik olarak veya dinamik olarak).
|
|
186
|
-
2. **Sağlayın** bunları `react-intl`'den `<IntlProvider>`'a.
|
|
187
|
-
|
|
188
|
-
Basit bir yaklaşım onları **statik olarak** içe aktarmaktır:
|
|
189
|
-
|
|
190
|
-
```typescript title="src/index.tsx"
|
|
191
|
-
import React from "react";
|
|
192
|
-
import ReactDOM from "react-dom/client";
|
|
193
|
-
import { IntlProvider } from "react-intl";
|
|
194
|
-
import App from "./App";
|
|
195
|
-
|
|
196
|
-
// Yapı çıktısından JSON dosyalarını içe aktarın.
|
|
197
|
-
// Alternatif olarak, kullanıcının seçtiği yerele göre dinamik olarak içe aktarabilirsiniz.
|
|
198
|
-
import en from "../react-intl/messages/en.json";
|
|
199
|
-
import fr from "../react-intl/messages/fr.json";
|
|
200
|
-
import es from "../react-intl/messages/es.json";
|
|
96
|
+
`syncJSON` eklentisi JSON'u otomatik olarak saracaktır. İçerik mimarisini değiştirmeden JSON dosyalarını okuyup yazar.
|
|
201
97
|
|
|
98
|
+
Eğer bu JSON'un intlayer içerik beyan dosyaları (`.content` dosyaları) ile birlikte var olmasını istiyorsanız, Intlayer şu şekilde ilerleyecektir:
|
|
202
99
|
|
|
100
|
+
1. Hem JSON hem de içerik beyan dosyalarını yükleyip bunları bir intlayer sözlüğüne dönüştürür.
|
|
203
101
|
|
|
204
|
-
|
|
205
|
-
const messages = import.meta.glob("../react-intl/messages/**/*.json", {
|
|
206
|
-
eager: true,
|
|
207
|
-
});
|
|
102
|
+
2. JSON ile içerik beyan dosyaları arasında çakışma varsa, Intlayer tüm sözlükleri birleştirme işlemini gerçekleştirecektir. Bu, eklentilerin önceliğine ve içerik beyan dosyasının önceliğine bağlıdır (tüm öncelikler yapılandırılabilir).
|
|
208
103
|
|
|
209
|
-
|
|
210
|
-
const messagesRecord: Record<string, Record<string, any>> = {};
|
|
104
|
+
JSON'u çevirmek için CLI kullanılarak veya CMS aracılığıyla değişiklik yapılırsa, Intlayer JSON dosyasını yeni çevirilerle güncelleyecektir.
|
|
211
105
|
|
|
212
|
-
|
|
213
|
-
// Dosya yolundan yerel ve ad alanını çıkarın
|
|
214
|
-
const [, locale, namespace] = path.match(/messages\/(\w+)\/(.+?)\.json$/) ?? [];
|
|
215
|
-
if (locale && namespace) {
|
|
216
|
-
messagesRecord[locale] = messagesRecord[locale] ?? {};
|
|
217
|
-
messagesRecord[locale][namespace] = module.default; // JSON içeriğini atayın
|
|
218
|
-
}
|
|
219
|
-
});
|
|
106
|
+
`syncJSON` eklentisi hakkında daha fazla ayrıntı için lütfen [syncJSON eklenti dokümantasyonuna](https://github.com/aymericzip/intlayer/blob/main/docs/docs/tr/plugins/sync-json.md) bakınız.
|
|
220
107
|
|
|
221
|
-
|
|
222
|
-
const mergeMessages = (locale: string) =>
|
|
223
|
-
Object.values(messagesRecord[locale] ?? {}).reduce(
|
|
224
|
-
(acc, namespaceMessages) => ({ ...acc, ...namespaceMessages }),
|
|
225
|
-
{}
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
// Kullanıcının dilini algılamak için bir mekanizmanız varsa, burada ayarlayın.
|
|
229
|
-
// Basitlik için İngilizce'yi seçelim.
|
|
230
|
-
const locale = "en";
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
|
|
234
|
-
<React.StrictMode>
|
|
235
|
-
<IntlProvider locale={locale} messages={mergeMessages(locale)}>
|
|
236
|
-
<App />
|
|
237
|
-
</IntlProvider>
|
|
238
|
-
</React.StrictMode>
|
|
239
|
-
);
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
> **İpucu**: Gerçek projeler için şunları yapabilirsiniz:
|
|
243
|
-
|
|
244
|
-
> - JSON mesajlarını çalışma zamanında dinamik olarak yükleyin.
|
|
245
|
-
> - Ortama dayalı, tarayıcıya dayalı veya kullanıcı hesabına dayalı yerel algılama kullanın.
|
|
246
|
-
|
|
247
|
-
### 2. `<FormattedMessage>` veya `useIntl()` Kullanın
|
|
248
|
-
|
|
249
|
-
Mesajlarınız `<IntlProvider>`'a yüklendikten sonra, herhangi bir alt bileşen react-intl'i yerelleştirilmiş dizelere erişmek için kullanabilir. İki ana yaklaşım vardır:
|
|
250
|
-
|
|
251
|
-
- **`<FormattedMessage>`** bileşeni
|
|
252
|
-
- **`useIntl()`** hook'u
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## React Bileşenlerinde Çevirileri Kullanma
|
|
257
|
-
|
|
258
|
-
### Yaklaşım A: `<FormattedMessage>`
|
|
259
|
-
|
|
260
|
-
Hızlı satır içi kullanım için:
|
|
261
|
-
|
|
262
|
-
```tsx title="src/components/MyComponent/index.tsx"
|
|
263
|
-
import React from "react";
|
|
264
|
-
import { FormattedMessage } from "react-intl";
|
|
265
|
-
|
|
266
|
-
export default function MyComponent() {
|
|
267
|
-
return (
|
|
268
|
-
<div>
|
|
269
|
-
<h1>
|
|
270
|
-
{/* “my-component.helloWorld” en.json, fr.json vb.'den anahtara başvurur */}
|
|
271
|
-
<FormattedMessage id="my-component.helloWorld" />
|
|
272
|
-
</h1>
|
|
273
|
-
|
|
274
|
-
<p>
|
|
275
|
-
<FormattedMessage id="my-component.description" />
|
|
276
|
-
</p>
|
|
277
|
-
</div>
|
|
278
|
-
);
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
> `<FormattedMessage>`'teki **`id`** prop'u **üst düzey anahtar** (`my-component`) artı herhangi bir alt anahtar (`helloWorld`) ile eşleşmelidir.
|
|
283
|
-
|
|
284
|
-
### Yaklaşım B: `useIntl()`
|
|
285
|
-
|
|
286
|
-
Daha dinamik kullanım için:
|
|
287
|
-
|
|
288
|
-
```tsx title="src/components/MyComponent/index.tsx"
|
|
289
|
-
import React from "react";
|
|
290
|
-
import { useIntl } from "react-intl";
|
|
291
|
-
|
|
292
|
-
export default function MyComponent() {
|
|
293
|
-
const intl = useIntl();
|
|
294
|
-
|
|
295
|
-
return (
|
|
296
|
-
<div>
|
|
297
|
-
<h1>{intl.formatMessage({ id: "my-component.helloWorld" })}</h1>
|
|
298
|
-
<p>{intl.formatMessage({ id: "my-component.description" })}</p>
|
|
299
|
-
</div>
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
Her iki yaklaşım da geçerlidir, uygulamanıza uygun olanı seçin.
|
|
305
|
-
|
|
306
|
-
---
|
|
307
|
-
|
|
308
|
-
## Yeni Çeviriler Güncelleme veya Ekleme
|
|
309
|
-
|
|
310
|
-
1. Herhangi bir `*.content.*` dosyasında içeriği **ekleyin veya değiştirin**.
|
|
311
|
-
2. `./react-intl/messages` altında JSON dosyalarını yeniden oluşturmak için `intlayer build` komutunu yeniden çalıştırın.
|
|
312
|
-
3. React (ve react-intl) güncellemeleri bir sonraki yeniden oluşturma veya yeniden yükleme sırasında alacak.
|
|
313
|
-
|
|
314
|
-
---
|
|
315
|
-
|
|
316
|
-
## TypeScript Entegrasyonu (İsteğe Bağlı)
|
|
317
|
-
|
|
318
|
-
TypeScript kullanıyorsanız, Intlayer çevirileriniz için **tip tanımlarını oluşturabilir**.
|
|
108
|
+
## Git Yapılandırması
|
|
319
109
|
|
|
320
|
-
|
|
110
|
+
Otomatik oluşturulan Intlayer dosyalarını görmezden gelmeniz önerilir:
|
|
321
111
|
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
// ...
|
|
326
|
-
},
|
|
327
|
-
"include": ["src", "types"],
|
|
328
|
-
}
|
|
112
|
+
```plaintext fileName=".gitignore"
|
|
113
|
+
# Intlayer tarafından oluşturulan dosyaları görmezden gel
|
|
114
|
+
.intlayer
|
|
329
115
|
```
|
|
330
116
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
## Git Yapılandırması
|
|
117
|
+
Bu dosyalar, derleme süreciniz sırasında yeniden oluşturulabilir ve sürüm kontrolüne eklenmeleri gerekmez.
|
|
336
118
|
|
|
337
|
-
|
|
119
|
+
### VS Code Eklentisi
|
|
338
120
|
|
|
339
|
-
|
|
340
|
-
# Intlayer yapı eserlerini yoksay
|
|
341
|
-
.intlayer
|
|
342
|
-
react-intl
|
|
343
|
-
```
|
|
121
|
+
Geliştirici deneyimini iyileştirmek için resmi **Intlayer VS Code Eklentisi**ni yükleyin:
|
|
344
122
|
|
|
345
|
-
|
|
123
|
+
[VS Code Market'ten Yükleyin](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-12-24
|
|
3
|
+
updatedAt: 2025-10-29
|
|
4
|
+
title: Cách tự động hóa bản dịch JSON i18next của bạn bằng Intlayer
|
|
5
|
+
description: Tự động hóa bản dịch JSON của bạn với Intlayer và i18next để nâng cao quốc tế hóa trong các ứng dụng JavaScript.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- i18next
|
|
9
|
+
- Quốc tế hóa
|
|
10
|
+
- i18n
|
|
11
|
+
- Địa phương hóa
|
|
12
|
+
- Dịch thuật
|
|
13
|
+
- React
|
|
14
|
+
- Next.js
|
|
15
|
+
- JavaScript
|
|
16
|
+
- TypeScript
|
|
17
|
+
- Di cư
|
|
18
|
+
- Tích hợp
|
|
19
|
+
slugs:
|
|
20
|
+
- blog
|
|
21
|
+
- intlayer-with-i18next
|
|
22
|
+
history:
|
|
23
|
+
- version: 7.0.0
|
|
24
|
+
date: 2025-10-29
|
|
25
|
+
changes: Thay đổi sang plugin syncJSON
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Cách tự động hóa bản dịch JSON i18next của bạn bằng Intlayer
|
|
29
|
+
|
|
30
|
+
## Intlayer là gì?
|
|
31
|
+
|
|
32
|
+
**Intlayer** là một thư viện quốc tế hóa mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một cách tiếp cận hiện đại cho quản lý nội dung trong các ứng dụng JavaScript.
|
|
33
|
+
|
|
34
|
+
Xem so sánh cụ thể với i18next trong bài viết blog của chúng tôi [next-i18next vs. next-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md).
|
|
35
|
+
|
|
36
|
+
## Tại sao kết hợp Intlayer với i18next?
|
|
37
|
+
|
|
38
|
+
Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp với Next.js của chúng tôi [Next.js integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_nextjs_16.md)), bạn có thể muốn kết hợp nó với i18next vì một số lý do:
|
|
39
|
+
|
|
40
|
+
1. **Mã nguồn hiện có**: Bạn đã có một triển khai i18next ổn định và muốn dần dần chuyển sang trải nghiệm phát triển được cải thiện của Intlayer.
|
|
41
|
+
2. **Yêu cầu kế thừa**: Dự án của bạn cần tương thích với các plugin hoặc quy trình làm việc i18next hiện có.
|
|
42
|
+
3. **Đội ngũ quen thuộc**: Đội ngũ của bạn quen thuộc với i18next nhưng muốn quản lý nội dung tốt hơn.
|
|
43
|
+
|
|
44
|
+
**Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho i18next để giúp tự động hóa việc dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử bản dịch, và nhiều hơn nữa.**
|
|
45
|
+
|
|
46
|
+
Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn duy trì khả năng tương thích với i18next.
|
|
47
|
+
|
|
48
|
+
## Mục lục
|
|
49
|
+
|
|
50
|
+
<TOC/>
|
|
51
|
+
|
|
52
|
+
## Hướng dẫn từng bước để thiết lập Intlayer với i18next
|
|
53
|
+
|
|
54
|
+
### Bước 1: Cài đặt các phụ thuộc
|
|
55
|
+
|
|
56
|
+
Cài đặt các gói cần thiết:
|
|
57
|
+
|
|
58
|
+
```bash packageManager="npm"
|
|
59
|
+
npm install intlayer @intlayer/sync-json-plugin
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```bash packageManager="pnpm"
|
|
63
|
+
pnpm add intlayer @intlayer/sync-json-plugin
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```bash packageManager="yarn"
|
|
67
|
+
yarn add intlayer @intlayer/sync-json-plugin
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Mô tả các gói:**
|
|
71
|
+
|
|
72
|
+
- **intlayer**: Thư viện lõi để quản lý quốc tế hóa, khai báo nội dung và xây dựng
|
|
73
|
+
- **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung của Intlayer sang định dạng JSON tương thích với i18next
|
|
74
|
+
|
|
75
|
+
### Bước 2: Triển khai plugin Intlayer để bao bọc JSON
|
|
76
|
+
|
|
77
|
+
Tạo một tệp cấu hình Intlayer để định nghĩa các locale được hỗ trợ:
|
|
78
|
+
|
|
79
|
+
**Nếu bạn cũng muốn xuất các từ điển JSON cho i18next**, hãy thêm plugin `syncJSON`:
|
|
80
|
+
|
|
81
|
+
```typescript fileName="intlayer.config.ts"
|
|
82
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
83
|
+
import { syncJSON } from "@intlayer/sync-json-plugin";
|
|
84
|
+
|
|
85
|
+
const config: IntlayerConfig = {
|
|
86
|
+
internationalization: {
|
|
87
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
88
|
+
defaultLocale: Locales.ENGLISH,
|
|
89
|
+
},
|
|
90
|
+
plugins: [
|
|
91
|
+
syncJSON({
|
|
92
|
+
source: ({ key, locale }) => `./intl/messages/${locale}/${key}.json`,
|
|
93
|
+
}),
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export default config;
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi cấu trúc nội dung.
|
|
101
|
+
|
|
102
|
+
Nếu bạn muốn cho phép JSON tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
|
|
103
|
+
|
|
104
|
+
1. tải cả tệp JSON và tệp khai báo nội dung và chuyển đổi chúng thành một từ điển intlayer.
|
|
105
|
+
2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào độ ưu tiên của các plugin, và của tệp khai báo nội dung (tất cả đều có thể cấu hình).
|
|
106
|
+
|
|
107
|
+
Nếu có thay đổi được thực hiện bằng cách sử dụng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
|
|
108
|
+
|
|
109
|
+
## Cấu hình Git
|
|
110
|
+
|
|
111
|
+
Khuyến nghị bỏ qua các tệp Intlayer được tạo tự động:
|
|
112
|
+
|
|
113
|
+
```plaintext fileName=".gitignore"
|
|
114
|
+
# Bỏ qua các tệp do Intlayer tạo ra
|
|
115
|
+
.intlayer
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Các tệp này có thể được tạo lại trong quá trình xây dựng của bạn và không cần phải cam kết vào hệ thống quản lý phiên bản.
|
|
119
|
+
|
|
120
|
+
### Tiện ích mở rộng VS Code
|
|
121
|
+
|
|
122
|
+
Để cải thiện trải nghiệm phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer chính thức cho VS Code**:
|
|
123
|
+
|
|
124
|
+
[Cài đặt từ VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
125
|
+
|
|
126
|
+
[Install from the VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|