@intlayer/docs 9.3.1 → 9.3.3
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/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/de/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/en/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/en-GB/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/es/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/fr/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/hi/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/id/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/it/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/ja/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/ko/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/pl/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/pt/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/ru/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/tr/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/uk/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/vi/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/zh/nextjs-multilingual-seo-comparison.md +10 -10
- package/dist/cjs/generated/docs.entry.cjs +20 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +20 -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/bundle_optimization.md +1 -1
- package/docs/ar/configuration.md +32 -9
- package/docs/ar/dictionary/content_file.md +0 -22
- package/docs/ar/dictionary/function_fetching.md +23 -0
- package/docs/ar/eslint.md +336 -0
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/bn/configuration.md +34 -9
- package/docs/bn/eslint.md +336 -0
- package/docs/cs/bundle_optimization.md +1 -1
- package/docs/cs/configuration.md +33 -9
- package/docs/cs/eslint.md +336 -0
- package/docs/de/bundle_optimization.md +1 -1
- package/docs/de/configuration.md +34 -9
- package/docs/de/dictionary/content_file.md +0 -22
- package/docs/de/dictionary/function_fetching.md +23 -0
- package/docs/de/eslint.md +336 -0
- package/docs/en/bundle_optimization.md +1 -1
- package/docs/en/configuration.md +34 -9
- package/docs/en/dictionary/content_file.md +0 -22
- package/docs/en/dictionary/function_fetching.md +23 -0
- package/docs/en/eslint.md +336 -0
- package/docs/en/packages/intlayer/getLocalizedPath.md +70 -19
- package/docs/en-GB/configuration.md +33 -9
- package/docs/en-GB/dictionary/content_file.md +0 -22
- package/docs/en-GB/dictionary/function_fetching.md +23 -0
- package/docs/en-GB/eslint.md +336 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +32 -35
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/es/bundle_optimization.md +1 -1
- package/docs/es/configuration.md +35 -9
- package/docs/es/dictionary/content_file.md +0 -22
- package/docs/es/dictionary/function_fetching.md +23 -0
- package/docs/es/eslint.md +336 -0
- package/docs/fr/bundle_optimization.md +1 -1
- package/docs/fr/configuration.md +35 -9
- package/docs/fr/dictionary/content_file.md +0 -22
- package/docs/fr/dictionary/function_fetching.md +23 -0
- package/docs/fr/eslint.md +336 -0
- package/docs/hi/configuration.md +35 -9
- package/docs/hi/dictionary/content_file.md +0 -22
- package/docs/hi/dictionary/function_fetching.md +23 -0
- package/docs/hi/eslint.md +336 -0
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/hi/intlayer_with_vite+svelte.md +2 -2
- package/docs/id/configuration.md +35 -9
- package/docs/id/dictionary/content_file.md +0 -22
- package/docs/id/dictionary/function_fetching.md +23 -0
- package/docs/id/eslint.md +336 -0
- package/docs/it/bundle_optimization.md +1 -1
- package/docs/it/configuration.md +35 -9
- package/docs/it/dictionary/content_file.md +0 -22
- package/docs/it/dictionary/function_fetching.md +23 -0
- package/docs/it/eslint.md +336 -0
- package/docs/ja/configuration.md +30 -9
- package/docs/ja/dictionary/content_file.md +0 -22
- package/docs/ja/dictionary/function_fetching.md +23 -0
- package/docs/ja/eslint.md +336 -0
- package/docs/ja/intlayer_with_react_router_v7.md +1 -146
- package/docs/ja/intlayer_with_vite+react.md +5 -1
- package/docs/ko/configuration.md +31 -9
- package/docs/ko/dictionary/content_file.md +0 -22
- package/docs/ko/dictionary/function_fetching.md +23 -0
- package/docs/ko/eslint.md +336 -0
- package/docs/ko/intlayer_with_lynx+react.md +4 -0
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/ko/intlayer_with_storybook.md +5 -5
- package/docs/nl/configuration.md +33 -9
- package/docs/nl/eslint.md +336 -0
- package/docs/pl/bundle_optimization.md +1 -1
- package/docs/pl/configuration.md +34 -9
- package/docs/pl/dictionary/content_file.md +0 -22
- package/docs/pl/dictionary/function_fetching.md +23 -0
- package/docs/pl/eslint.md +336 -0
- package/docs/pl/intlayer_with_astro.md +1 -114
- package/docs/pl/migration_from_i18next_to_intlayer.md +4 -0
- package/docs/pl/migration_from_next-i18next_to_intlayer.md +8 -4
- package/docs/pl/migration_from_next-intl_to_intlayer.md +11 -5
- package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +8 -4
- package/docs/pl/migration_from_react-i18next_to_intlayer.md +8 -4
- package/docs/pl/migration_from_vue-i18n_to_intlayer.md +4 -0
- package/docs/pt/bundle_optimization.md +1 -1
- package/docs/pt/configuration.md +34 -9
- package/docs/pt/dictionary/content_file.md +0 -22
- package/docs/pt/dictionary/function_fetching.md +23 -0
- package/docs/pt/eslint.md +336 -0
- package/docs/pt/intlayer_with_astro.md +1 -114
- package/docs/ru/bundle_optimization.md +1 -1
- package/docs/ru/configuration.md +34 -9
- package/docs/ru/dictionary/content_file.md +0 -22
- package/docs/ru/dictionary/function_fetching.md +23 -0
- package/docs/ru/eslint.md +336 -0
- package/docs/tr/bundle_optimization.md +1 -1
- package/docs/tr/configuration.md +33 -9
- package/docs/tr/dictionary/content_file.md +0 -22
- package/docs/tr/dictionary/function_fetching.md +23 -0
- package/docs/tr/eslint.md +336 -0
- package/docs/uk/configuration.md +35 -9
- package/docs/uk/dictionary/content_file.md +0 -22
- package/docs/uk/dictionary/function_fetching.md +23 -0
- package/docs/uk/eslint.md +336 -0
- package/docs/uk/packages/angular-intlayer/exports.md +2 -2
- package/docs/ur/configuration.md +35 -9
- package/docs/ur/eslint.md +336 -0
- package/docs/vi/bundle_optimization.md +1 -1
- package/docs/vi/configuration.md +33 -9
- package/docs/vi/dictionary/content_file.md +0 -22
- package/docs/vi/dictionary/function_fetching.md +23 -0
- package/docs/vi/eslint.md +336 -0
- package/docs/zh/bundle_optimization.md +1 -1
- package/docs/zh/configuration.md +29 -9
- package/docs/zh/dictionary/content_file.md +0 -22
- package/docs/zh/dictionary/function_fetching.md +23 -0
- package/docs/zh/eslint.md +336 -0
- package/docs/zh/intlayer_with_create_react_app.md +4 -0
- package/docs/zh/intlayer_with_lynx+react.md +4 -0
- package/docs/zh/intlayer_with_nextjs_14.md +0 -2
- package/docs/zh/intlayer_with_nextjs_15.md +0 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +0 -2
- package/docs/zh/intlayer_with_nuxt.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +4 -0
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +4 -0
- package/docs/zh/intlayer_with_solid_start.md +1 -1
- package/docs/zh/intlayer_with_vite+vue.md +0 -2
- package/docs/zh-TW/bundle_optimization.md +1 -1
- package/docs/zh-TW/eslint.md +336 -0
- package/package.json +7 -7
- package/src/generated/docs.entry.ts +20 -0
|
@@ -87,6 +87,29 @@ JSON dosyasından içerik getirmenin bir yolu yok, bunun yerine .ts veya .js dos
|
|
|
87
87
|
|
|
88
88
|
Bu durumda, `fakeFetch` fonksiyonu sunucu yanıt süresini simüle etmek için bir gecikme taklit eder. Intlayer asenkron fonksiyonu çalıştırır ve sonucu `text` anahtarı için içerik olarak kullanır.
|
|
89
89
|
|
|
90
|
+
## Uzak İçeriği Getirme
|
|
91
|
+
|
|
92
|
+
Bir içerik alanına doğrudan bir promise de atayabilirsiniz. Intlayer, sözlükleri oluştururken bunu bekler ve çözümlenen değeri gömer:
|
|
93
|
+
|
|
94
|
+
```typescript fileName="**/*.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
95
|
+
import type { Dictionary } from "intlayer";
|
|
96
|
+
|
|
97
|
+
const remoteContent = {
|
|
98
|
+
key: "remote_content",
|
|
99
|
+
content: {
|
|
100
|
+
externalContent: fetch("https://example.com").then((res) => res.json()),
|
|
101
|
+
},
|
|
102
|
+
} satisfies Dictionary;
|
|
103
|
+
|
|
104
|
+
export default remoteContent;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```plaintext fileName="**/*.content.json" contentDeclarationFormat="json"
|
|
108
|
+
JSON dosyasından içerik getirmenin bir yolu yok, bunun yerine .ts veya .js dosyası kullanın
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
> İstek derleme zamanında çalışır, bu nedenle getirilen veri sözlüğe gömülmüş bir anlık görüntüdür. Yenilemek için sözlüklerinizi yeniden oluşturun.
|
|
112
|
+
|
|
90
113
|
## React Bileşenlerinde Fonksiyon Tabanlı İçeriği Kullanma
|
|
91
114
|
|
|
92
115
|
Bir React bileşeninde fonksiyon tabanlı içeriği kullanmak için, `react-intlayer`'dan `useIntlayer`'ı içe aktarmanız ve içeriği almak için içerik ID'si ile çağırmanız gerekir. İşte bir örnek:
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-08-12
|
|
3
|
+
updatedAt: 2026-08-13
|
|
4
|
+
title: ESLint Eklentisi | Intlayer için Lint Kuralları
|
|
5
|
+
description: eslint-plugin-intlayer ile sabit kodlanmış metinleri, Intlayer derleyicisinin optimize edemediği dinamik çağrıları ve kullanılmayan sözlük içeriğini yakalayın. React, Vue, Svelte, Angular ve Astro genelinde ESLint ve oxlint ile çalışır.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- ESLint
|
|
9
|
+
- oxlint
|
|
10
|
+
- Linting
|
|
11
|
+
- i18n
|
|
12
|
+
- Uluslararasılaştırma
|
|
13
|
+
- no-raw-text
|
|
14
|
+
- Sabit kodlanmış metinler
|
|
15
|
+
- Kullanılmayan çeviriler
|
|
16
|
+
- Ölü içerik
|
|
17
|
+
- React
|
|
18
|
+
- Vue
|
|
19
|
+
- Svelte
|
|
20
|
+
- Angular
|
|
21
|
+
slugs:
|
|
22
|
+
- doc
|
|
23
|
+
- eslint
|
|
24
|
+
history:
|
|
25
|
+
- version: 9.3.1
|
|
26
|
+
date: 2026-08-12
|
|
27
|
+
changes: "Başlangıç geçmişi"
|
|
28
|
+
author: aymericzip
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# ESLint x OXLint Eklentisi
|
|
32
|
+
|
|
33
|
+
`eslint-plugin-intlayer`, TypeScript'in yakalayamadığı i18n hatalarını tespit eder:
|
|
34
|
+
|
|
35
|
+
1. Bir sözlüğe hiç eklenmemiş **sabit kodlanmış metinler (hardcoded text)**.
|
|
36
|
+
2. Tip kontrolünden geçen ve çalışan ancak Intlayer derleyicisinin optimize edemediği **dinamik çağrılar**.
|
|
37
|
+
3. **Ölü içerik (Dead content)** — projedeki hiçbir yerin okumadığı sözlükler ve alanlar (isteğe bağlı).
|
|
38
|
+
|
|
39
|
+
Bilinmeyen sözlük anahtarları, bilinmeyen alan yolları ve eksik yerel ayarlar zaten derleme hataları olduğundan, eklenti bunları tekrar bildirmez.
|
|
40
|
+
|
|
41
|
+
## Kurulum
|
|
42
|
+
|
|
43
|
+
```bash packageManager="npm"
|
|
44
|
+
npm install --save-dev eslint-plugin-intlayer
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```bash packageManager="pnpm"
|
|
48
|
+
pnpm add --save-dev eslint-plugin-intlayer
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```bash packageManager="yarn"
|
|
52
|
+
yarn add --dev eslint-plugin-intlayer
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
ESLint 9 veya üzerini gerektirir (flat config). ESLint 10 desteklenir.
|
|
56
|
+
|
|
57
|
+
## Kullanım
|
|
58
|
+
|
|
59
|
+
Eklenti hem ESLint hem de [oxlint](https://oxc.rs) üzerinde aynı kurallar ve aynı seçeneklerle çalışır.
|
|
60
|
+
|
|
61
|
+
<Tabs defaultTab="eslint">
|
|
62
|
+
<Tab label="ESLint" value="eslint">
|
|
63
|
+
|
|
64
|
+
```javascript fileName="eslint.config.mjs"
|
|
65
|
+
import intlayer from "eslint-plugin-intlayer";
|
|
66
|
+
|
|
67
|
+
export default [...intlayer.configs.recommended];
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Veya bir yapılandırmayı yayın ve önem düzeylerini kendiniz belirleyin:
|
|
71
|
+
|
|
72
|
+
```javascript fileName="eslint.config.mjs"
|
|
73
|
+
import intlayer from "eslint-plugin-intlayer";
|
|
74
|
+
|
|
75
|
+
export default [
|
|
76
|
+
...intlayer.configs.recommended,
|
|
77
|
+
{
|
|
78
|
+
rules: {
|
|
79
|
+
"intlayer/no-raw-text": "warn",
|
|
80
|
+
"intlayer/static-dictionary-key": "error",
|
|
81
|
+
"intlayer/no-dynamic-field-access": "error",
|
|
82
|
+
"intlayer/enforce-adapter-import": "warn",
|
|
83
|
+
"intlayer/no-unused-content": "warn",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
</Tab>
|
|
90
|
+
<Tab label="oxlint" value="oxlint">
|
|
91
|
+
|
|
92
|
+
```json fileName=".oxlintrc.json"
|
|
93
|
+
{
|
|
94
|
+
"jsPlugins": ["eslint-plugin-intlayer"],
|
|
95
|
+
"rules": {
|
|
96
|
+
"intlayer/no-raw-text": "warn",
|
|
97
|
+
"intlayer/static-dictionary-key": "error",
|
|
98
|
+
"intlayer/no-dynamic-field-access": "error",
|
|
99
|
+
"intlayer/enforce-adapter-import": "warn"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
İki uyarı: oxlint'in JS eklenti desteği henüz alfa aşamasındadır ve oxlint özel ayrıştırıcıları (custom parsers) desteklemez — bu nedenle `.vue`, `.svelte`, `.astro` ve Angular şablonları orada denetlenmez. JS/TS/JSX dosyalarınız için oxlint'i çalıştırın ve geri kalanı için ESLint'i kullanın.
|
|
105
|
+
|
|
106
|
+
`no-unused-content` yukarıda kasıtlı olarak hariç tutulmuştur: kural bağlamından çalışma dizinine ve denetlenen dosya yoluna ihtiyaç duyar; alfa JS eklenti köprüsü bunu garanti etmez. ESLint altında çalıştırın.
|
|
107
|
+
|
|
108
|
+
</Tab>
|
|
109
|
+
</Tabs>
|
|
110
|
+
|
|
111
|
+
### Yapılandırmalar (Configs)
|
|
112
|
+
|
|
113
|
+
| Yapılandırma | `no-raw-text` | `static-dictionary-key` | `no-dynamic-field-access` | `enforce-adapter-import` | `no-unused-content` |
|
|
114
|
+
| --------------- | -------------------------- | ----------------------- | ------------------------- | ------------------------ | ------------------- |
|
|
115
|
+
| `recommended` | warn | error | error | off | off |
|
|
116
|
+
| `strict` | error (+ JSX dışı dizeler) | error | error | error | off |
|
|
117
|
+
| `contract-only` | off | error | error | off | off |
|
|
118
|
+
|
|
119
|
+
`recommended`, `no-raw-text` kuralını kasıtlı olarak `warn` seviyesinde tutar: bunu mevcut bir kod tabanına yöneltmek tüm çevrilmemiş dizeleri aynı anda ortaya çıkarır ve bu durum derlemenizi ilk günden bozmamalıdır.
|
|
120
|
+
|
|
121
|
+
`enforce-adapter-import` varsayılan olarak kapalıdır — istiyorsanız açıkça etkinleştirin.
|
|
122
|
+
|
|
123
|
+
`no-unused-content`, `strict` dahil tüm yapılandırmalarda kapalıdır. Intlayer yapılandırmanızı okuyan ve kaynak dosyalarınızı diskten tarayan tek kuraldır; bu nedenle açılması, bir ön ayarın sizin yerinize yapmasından ziyade bilinçli bir seçim olmalıdır.
|
|
124
|
+
|
|
125
|
+
## Kurallar
|
|
126
|
+
|
|
127
|
+
### `no-raw-text`
|
|
128
|
+
|
|
129
|
+
Bir sözlükte bildirilmemiş kullanıcıya yönelik metinleri bildirir. `intlayer extract` ile aynı algılamayı kullanır; bu nedenle marka adları, CSS sınıfları ve teknik tanımlayıcılar yoksayılır.
|
|
130
|
+
|
|
131
|
+
```jsx
|
|
132
|
+
// ✗ Bildirildi
|
|
133
|
+
<h1>Welcome to our documentation</h1>
|
|
134
|
+
<input placeholder="Enter your email address" />
|
|
135
|
+
|
|
136
|
+
// ✓ Sorunsuz
|
|
137
|
+
const { title } = useIntlayer("home");
|
|
138
|
+
<h1>{title}</h1>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
İçerik bildirim dosyaları (`*.content.ts`, …) atlanır.
|
|
142
|
+
|
|
143
|
+
Tüm bir dosyayı tek seferde düzeltmek için `npx intlayer extract` komutunu çalıştırın ve derleyicinin dizeleri sizin için bir sözlüğe taşımasına izin verin.
|
|
144
|
+
|
|
145
|
+
**Seçenekler**
|
|
146
|
+
|
|
147
|
+
```javascript fileName="eslint.config.mjs"
|
|
148
|
+
{
|
|
149
|
+
"intlayer/no-raw-text": [
|
|
150
|
+
"warn",
|
|
151
|
+
{
|
|
152
|
+
// Değeri kullanıcıya yönelik metin olan öznitelikler.
|
|
153
|
+
// Varsayılan: title, placeholder, alt, aria-label, label
|
|
154
|
+
attributes: ["title", "placeholder", "alt", "aria-label", "label"],
|
|
155
|
+
|
|
156
|
+
// İçeriği asla kullanıcıya yönelik metin olmayan öğeler.
|
|
157
|
+
// Varsayılan: code, pre, script, style
|
|
158
|
+
ignoreElements: ["code", "pre", "script", "style"],
|
|
159
|
+
|
|
160
|
+
// Asla bildirilmeyecek metinler için düzenli ifadeler.
|
|
161
|
+
ignorePatterns: ["^Powered by"],
|
|
162
|
+
|
|
163
|
+
// Biçimlendirme dışındaki dize sabitlerini de bildirin. Varsayılan: false
|
|
164
|
+
includeStringLiterals: false,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### `static-dictionary-key`
|
|
171
|
+
|
|
172
|
+
Sözlük anahtarının bir dize sabiti olmasını gerektirir.
|
|
173
|
+
|
|
174
|
+
Derleyici, bir sözlüğü yalnızca çağrı noktasında anahtarı doğrudan okuyabildiğinde önceden yükleyebilir. Hesaplanmış bir anahtarla optimizasyonu sessizce atlar ve bunun yerine her sözlüğü paketler.
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// ✗ Bildirildi
|
|
178
|
+
useIntlayer(dictionaryKey);
|
|
179
|
+
useIntlayer(`home-${suffix}`);
|
|
180
|
+
getTranslations({ namespace: page });
|
|
181
|
+
|
|
182
|
+
// ✗ Değişken hala bir dize sabiti değildir
|
|
183
|
+
const key = "home";
|
|
184
|
+
useIntlayer(key);
|
|
185
|
+
|
|
186
|
+
// ✓ Sorunsuz
|
|
187
|
+
useIntlayer("home");
|
|
188
|
+
getTranslations({ namespace: "home" });
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Bu durum `useIntlayer`, `getIntlayer` ve tüm uyumluluk bağdaştırıcıları (`useTranslation`, `useTranslations`, `formatMessage`, `<FormattedMessage id>`, `<Trans i18nKey>`, …) için geçerlidir.
|
|
192
|
+
|
|
193
|
+
### `no-dynamic-field-access`
|
|
194
|
+
|
|
195
|
+
Bir sözlükten okuduğunuz alanın statik olarak bilinmesini gerektirir.
|
|
196
|
+
|
|
197
|
+
Derleyici, kullanıldığını görmediği alanları kaldırır. Hesaplanmış bir erişim onun için görünmezdir, bu nedenle okuma işlemi çalışma zamanında `undefined` döndürebilir.
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// ✗ Bildirildi
|
|
201
|
+
const content = useIntlayer("home");
|
|
202
|
+
content[fieldName];
|
|
203
|
+
|
|
204
|
+
const t = useTranslations("home");
|
|
205
|
+
t(messageKey);
|
|
206
|
+
|
|
207
|
+
// ✓ Sorunsuz
|
|
208
|
+
content.title;
|
|
209
|
+
content["title"];
|
|
210
|
+
content.items[0];
|
|
211
|
+
t("hero.title");
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### `enforce-adapter-import`
|
|
215
|
+
|
|
216
|
+
Orijinal paket yerine `@intlayer/*` uyumluluk bağdaştırıcısını tercih eder. Orijinal paket yalnızca paketleyici takma adı yapılandırıldığında Intlayer'a çözümlenir; bağdaştırıcı her zaman çözümlenir. `--fix` ile otomatik düzeltilebilir.
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// ✗ Bildirildi
|
|
220
|
+
import { useTranslation } from "react-i18next";
|
|
221
|
+
import { getTranslations } from "next-intl/server";
|
|
222
|
+
|
|
223
|
+
// ✓ Sorunsuz
|
|
224
|
+
import { useTranslation } from "@intlayer/react-i18next";
|
|
225
|
+
import { getTranslations } from "@intlayer/next-intl/server";
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### `no-unused-content`
|
|
229
|
+
|
|
230
|
+
**Varsayılan olarak kapalıdır.** Projenizdeki hiçbir yerin okumadığı içeriği ve birden fazla yerde bildirilen sözlük anahtarlarını bildirir.
|
|
231
|
+
|
|
232
|
+
```typescript fileName="src/home.content.ts"
|
|
233
|
+
export default {
|
|
234
|
+
key: "home", // ✗ Projede hiçbir çağıran "home" istemediğinde bildirilir
|
|
235
|
+
content: {
|
|
236
|
+
title: t({ tr: "Başlık", en: "Title" }),
|
|
237
|
+
|
|
238
|
+
// ✗ `hero` alanını hiçbir şey okumadığında bildirilir
|
|
239
|
+
hero: {
|
|
240
|
+
subtitle: t({ tr: "Alt Başlık", en: "Subtitle" }),
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Diğer kuralların aksine, bu kural yalnızca önündeki dosyadan karar veremez — bir alan yalnızca tüm projeye göre kullanılmamış sayılır. Bir lint çalıştırmasının ilk içerik bildiriminde Intlayer yapılandırmanızı yükler, bu yapılandırmanın bildirdiği kaynak dosyaları (`build.traversePattern`, `compiler.transformPattern`) tarar ve `@intlayer/lsp` ile VS Code uzantısındaki "kullanılmayan" üstü çizili metni destekleyen aynı kullanım çözümleyicisini çalıştırır. Sonuç `cacheTtl` milisaniye boyunca önbelleğe alınır, böylece tarama dosya başına değil çalıştırma başına bir kez gerçekleşir.
|
|
247
|
+
|
|
248
|
+
**Seçenekler**
|
|
249
|
+
|
|
250
|
+
```javascript fileName="eslint.config.mjs"
|
|
251
|
+
{
|
|
252
|
+
"intlayer/no-unused-content": [
|
|
253
|
+
"warn",
|
|
254
|
+
{
|
|
255
|
+
// Hiçbir şeyin başvurmadığı sözlük anahtarlarını bildirin. Varsayılan: true
|
|
256
|
+
reportUnusedDictionaries: true,
|
|
257
|
+
|
|
258
|
+
// Hiçbir şeyin okumadığı içerik alanlarını bildirin. Varsayılan: true
|
|
259
|
+
reportUnusedFields: true,
|
|
260
|
+
|
|
261
|
+
// Birden fazla yerde bildirilen anahtarları bildirin. Varsayılan: true
|
|
262
|
+
reportDuplicateKeys: true,
|
|
263
|
+
|
|
264
|
+
// Asla bildirilmeyecek alan yolları için düzenli ifadeler.
|
|
265
|
+
ignoreFields: ["^meta"],
|
|
266
|
+
|
|
267
|
+
// Taramanın başlayacağı proje kökü. Varsayılan: ESLint çalışma dizini
|
|
268
|
+
baseDir: process.cwd(),
|
|
269
|
+
|
|
270
|
+
// Bir proje taramasının yeniden kullanılma süresi (ms). Varsayılan: 30000
|
|
271
|
+
cacheTtl: 30000,
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Uzun süre çalışan bir düzenleyici sunucusundan lint işlemi yaparken ve düzenlemelerinizin daha erken yansımasını istediğinizde `cacheTtl` değerini düşürün; tek bir lint çalıştırması bir monorepodaki birkaç Intlayer projesini kapsadığında `baseDir` değerini ayarlayın.
|
|
278
|
+
|
|
279
|
+
> **Sessiz kalmaya meyillidir.** Buradaki yanlış bir pozitif sonuç bir çeviriyi silebilir; bu nedenle sözlük analizin izleyemeyeceği bir şekilde kullanıldığında hiçbir şey bildirilmez: içerik nesnesinin bir bütün olarak aktarılması, ondan bağlanan bir çevirici işlevi (`const t = useTranslations("home")`), doğrudan içe aktarma yoluyla ulaşılan bir bildirim (`useDictionary(myDictionary)`), başka bir sözlükten bir `nest()` veya bir yayma (spread) operatörü ile kapsamlı olmaktan çıkarılan bir alan listesi. Tek dosyalı bileşenler (`.vue`, `.svelte`, `.astro`), komut dosyası blokları burada ayrıştırılmadığı için bahsettikleri sözlüklerin her alanını kullanıyor sayılır.
|
|
280
|
+
|
|
281
|
+
`reportDuplicateKeys`, derlemenin `.intlayer/` altına yazdığı birleştirilmemiş sözlükleri okur, bu nedenle proje en az bir kez derlenene kadar sessiz kalır. Bir anahtarı paylaşan iki bildirim birleştirilir ve bu meşru bir kalıptır — bu raporlama mekanizması, her iki tarafta tanımlanan bir alanın sessizce iki değerden yalnızca birini koruması nedeniyle mevcuttur.
|
|
282
|
+
|
|
283
|
+
Çözümleyici, ESM olarak dağıtılan `@intlayer/lsp` paketinden yüklenir. Bu nedenle kural, bir ES modülünü `require()` edebilen bir Node sürümüne ihtiyaç duyar — Node 20.19+ veya 22.12+. Daha eski sürümlerde lint çalıştırmasını başarısız kılmak yerine hiçbir şey bildirmez.
|
|
284
|
+
|
|
285
|
+
## Çerçeveler (Frameworks)
|
|
286
|
+
|
|
287
|
+
Her kural, Vue, Svelte ve Angular şablonları dahil olmak üzere tüm Intlayer entegrasyonlarında çalışır. ESLint'e yalnızca her dosya türünü hangi ayrıştırıcının okuyacağını belirtmeniz gerekir.
|
|
288
|
+
|
|
289
|
+
| Çerçeve | Dosyalar | Ayrıştırıcı (Parser) |
|
|
290
|
+
| ------------------------- | ----------------- | --------------------------------- |
|
|
291
|
+
| React, Preact, Solid, Lit | `.jsx` `.tsx` | `typescript-eslint` |
|
|
292
|
+
| Next.js | `.jsx` `.tsx` | `typescript-eslint` |
|
|
293
|
+
| Vue, Nuxt | `.vue` | `vue-eslint-parser` |
|
|
294
|
+
| Svelte, SvelteKit | `.svelte` | `svelte-eslint-parser` |
|
|
295
|
+
| Angular | `.ts` | `typescript-eslint` |
|
|
296
|
+
| Angular Şablonları | `.component.html` | `@angular-eslint/template-parser` |
|
|
297
|
+
| Astro | `.astro` | `astro-eslint-parser` |
|
|
298
|
+
|
|
299
|
+
```javascript fileName="eslint.config.mjs"
|
|
300
|
+
import intlayer from "eslint-plugin-intlayer";
|
|
301
|
+
import tseslint from "typescript-eslint";
|
|
302
|
+
import vueParser from "vue-eslint-parser";
|
|
303
|
+
import svelteParser from "svelte-eslint-parser";
|
|
304
|
+
import angularTemplateParser from "@angular-eslint/template-parser";
|
|
305
|
+
|
|
306
|
+
export default [
|
|
307
|
+
...intlayer.configs.recommended,
|
|
308
|
+
|
|
309
|
+
{
|
|
310
|
+
files: ["**/*.{ts,tsx,jsx}"],
|
|
311
|
+
languageOptions: { parser: tseslint.parser },
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
files: ["**/*.vue"],
|
|
315
|
+
languageOptions: {
|
|
316
|
+
parser: vueParser,
|
|
317
|
+
parserOptions: { parser: tseslint.parser },
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
files: ["**/*.svelte"],
|
|
322
|
+
languageOptions: {
|
|
323
|
+
parser: svelteParser,
|
|
324
|
+
parserOptions: { parser: tseslint.parser },
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
files: ["**/*.component.html"],
|
|
329
|
+
languageOptions: { parser: angularTemplateParser },
|
|
330
|
+
},
|
|
331
|
+
];
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Yalnızca projenizin ihtiyaç duyduğu ayrıştırıcıları yükleyin.
|
|
335
|
+
|
|
336
|
+
> **Bilinen sınırlama.** Vue ve Angular şablonlarında `{{ content[key] }}` gibi bir ifade `no-dynamic-field-access` tarafından kontrol edilmez. Script bloğunda yazılan dinamik okumalar normal şekilde yakalanır.
|
package/docs/uk/configuration.md
CHANGED
|
@@ -478,6 +478,30 @@ const config: IntlayerConfig = {
|
|
|
478
478
|
*/
|
|
479
479
|
purge: true,
|
|
480
480
|
|
|
481
|
+
/**
|
|
482
|
+
* Групувати чанки словників за локаллю відповідно до межі розділення коду, яка
|
|
483
|
+
* їх використовує, щоб ліниво завантажена сторінка отримувала свій вміст одним
|
|
484
|
+
* запитом.
|
|
485
|
+
* За замовчуванням: true
|
|
486
|
+
*
|
|
487
|
+
* Примітка:
|
|
488
|
+
* - Застосовується лише до словників з `importMode: 'dynamic'`.
|
|
489
|
+
*/
|
|
490
|
+
chunkGrouping: true,
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Завантажувати словник разом із чанком, який його використовує, замість
|
|
494
|
+
* отримання після рендерингу цього чанка. Читання рендеряться синхронно
|
|
495
|
+
* замість призупинення, тому під час навігації більше не блимає стан
|
|
496
|
+
* завантаження.
|
|
497
|
+
* За замовчуванням: true
|
|
498
|
+
*
|
|
499
|
+
* Примітка:
|
|
500
|
+
* - Очікується лише визначена локаль, тому сторінка завантажує тільки ту мову,
|
|
501
|
+
* яку відображає.
|
|
502
|
+
*/
|
|
503
|
+
dictionariesPreload: true,
|
|
504
|
+
|
|
481
505
|
/**
|
|
482
506
|
* Формат виводу для згенерованих файлів словників.
|
|
483
507
|
* За замовчуванням: ['cjs', 'esm']
|
|
@@ -1054,15 +1078,17 @@ Intlayer підтримує широкий спектр провайдерів A
|
|
|
1054
1078
|
|
|
1055
1079
|
> Під час оптимізації Intlayer замінює виклики словників для оптимізації поділу коду (chunking), щоб підсумковий пакет імпортував лише ті словники, які фактично використовуються.
|
|
1056
1080
|
|
|
1057
|
-
| Поле
|
|
1058
|
-
|
|
|
1059
|
-
| `mode`
|
|
1060
|
-
| `optimize`
|
|
1061
|
-
| `minify`
|
|
1062
|
-
| `purge`
|
|
1063
|
-
| `checkTypes`
|
|
1064
|
-
| `
|
|
1065
|
-
| `
|
|
1081
|
+
| Поле | Опис | Тип | За замовчуванням | Приклад | Примітки |
|
|
1082
|
+
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1083
|
+
| `mode` | Керує режимом збірки. | `'auto'` | <br/> `'manual'` | `'auto'` | `'manual'` | • `'auto'`: Збірка запускається автоматично під час збірки додатка.<br/>• `'manual'`: Виконується лише через явну команду збірки.<br/>• Може використовуватися для запобігання збірці словників (наприклад, щоб уникнути запуску в середовищі Node.js). |
|
|
1084
|
+
| `optimize` | Керує виконанням оптимізації збірки. | `boolean` | `undefined` | `process.env.NODE_ENV === 'production'` | • Якщо не визначено, оптимізація запускається під час збірки фреймворку (Vite/Next.js).<br/>• `true` форсує оптимізацію навіть у режимі розробки.<br/>• `false` вимикає її.<br/>• Якщо ввімкнено, замінює виклики словників для оптимізації chunking.<br/>• Потрібні плагіни `@intlayer/babel` та `@intlayer/swc`. |
|
|
1085
|
+
| `minify` | Мініфікувати словники для зменшення розміру бандла. | `boolean` | `false` | | • Чи слід мініфікувати пакет.<br/>• За замовчуванням: `true` у виробничому середовищі.<br/>• Цей параметр буде ігноруватися, якщо `optimize` вимкнено.<br/>• Цей параметр буде ігноруватися, якщо `editor.enabled` має значення true. |
|
|
1086
|
+
| `purge` | Видалити невикористані ключі в словниках. | `boolean` | `false` | | • Чи слід очищати пакет.<br/>• За замовчуванням: `true` у виробничому середовищі.<br/>• Цей параметр буде ігноруватися, якщо `optimize` вимкнено. |
|
|
1087
|
+
| `checkTypes` | Вказує, чи має збірка перевіряти типи TypeScript та записувати помилки. | `boolean` | `false` | | Може сповільнити процес збірки. |
|
|
1088
|
+
| `chunkGrouping` | Визначає, чи слід групувати чанки словників за локаллю відповідно до межі розділення коду, яка їх використовує. | `boolean` | `true` | | • Без групування сторінка, зібрана з багатьох компонентів, надсилає по одному запиту на кожен словник.<br/>• Словники, досяжні з кількох меж, переносяться до спільного чанка, тому жодна сторінка не містить вміст іншої.<br/>• Застосовується лише до словників з `importMode: 'dynamic'`.<br/>• Застосовується лише до клієнтської збірки і лише під час бандлінгу (не в режимі розробки). |
|
|
1089
|
+
| `dictionariesPreload` | Визначає, чи має словник завантажуватися разом із чанком, який його використовує, замість отримання після рендерингу цього чанка. | `boolean` | `true` | | • Згенерована точка входу очікує локаль перегляду на верхньому рівні, тому ліниво завантажений маршрут не вважається завантаженим, доки його вміст не готовий.<br/>• Читання рендеряться синхронно замість призупинення, тому під час навігації більше не блимає стан завантаження.<br/>• Очікується лише визначена локаль, тому сторінка завантажує тільки ту мову, яку відображає.<br/>• Застосовується лише до словників з `importMode: 'dynamic'` у клієнтській збірці.<br/>• Потребує бандлера з підтримкою top-level await (Vite, esbuild). |
|
|
1090
|
+
| `outputFormat` | Керує форматом виводу словників. | `('esm' | 'cjs')[]` | `['esm', 'cjs']` | `['cjs']` | |
|
|
1091
|
+
| `traversePattern` | Шаблон для файлів, які слід сканувати під час оптимізації. | `string[]` | `['**/*.{tsx,ts,js,mjs,cjs,jsx,vue,svelte,svte}', '!**/node_modules/**', '!**/dist/**', '!**/.intlayer/**', '!**/*.config.*', '!**/*.test.*', '!**/*.spec.*', '!**/*.stories.*']` | `['src/**/*.{ts,tsx}', '../ui-library/**/*.{ts,tsx}', '!**/node_modules/**']` | • Покращує продуктивність збірки, обмежуючи оптимізацію відповідними файлами.<br/>• Ігнорується, якщо `optimize` вимкнено.<br/>• Використовує glob-патерни. |
|
|
1066
1092
|
|
|
1067
1093
|
---
|
|
1068
1094
|
|
|
@@ -542,28 +542,6 @@ export default aboutPageMetaContent;
|
|
|
542
542
|
|
|
543
543
|
> Див. [Варіанти](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dynamic_dictionaries/variants.md) для отримання додаткової інформації.
|
|
544
544
|
|
|
545
|
-
#### `meta` (`Record<string, string | number | boolean>`)
|
|
546
|
-
|
|
547
|
-
Використовується разом із Динамічними Записами, це поле дозволяє оголошувати записи, керовані CMS, або довільні дані, отримані під час виконання за непрозорим ID. Ідентичність словника визначається довільним набором пар ключ-значення, оголошених у цьому полі `meta`.
|
|
548
|
-
|
|
549
|
-
**Приклад:**
|
|
550
|
-
|
|
551
|
-
```typescript
|
|
552
|
-
{
|
|
553
|
-
key: "product-copy",
|
|
554
|
-
meta: {
|
|
555
|
-
id: "prod_abc",
|
|
556
|
-
userId: "user_123"
|
|
557
|
-
},
|
|
558
|
-
content: {
|
|
559
|
-
name: "Widget Pro",
|
|
560
|
-
description: "The best widget."
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
> Див. [Динамічні Записи](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dynamic_dictionaries/dynamic_content.md) для отримання додаткової інформації.
|
|
566
|
-
|
|
567
545
|
### Властивості CMS
|
|
568
546
|
|
|
569
547
|
##### `version` (string)
|
|
@@ -87,6 +87,29 @@ export default asyncFunctionContent;
|
|
|
87
87
|
|
|
88
88
|
У цьому випадку функція `fakeFetch` імітує затримку, щоб симулювати час відповіді сервера. Intlayer виконує асинхронну функцію і використовує результат як вміст для ключа `text`.
|
|
89
89
|
|
|
90
|
+
## Отримання віддаленого вмісту
|
|
91
|
+
|
|
92
|
+
Ви також можете призначити проміс безпосередньо полю вмісту. Intlayer дочекається його під час збирання словників і вставить отримане значення:
|
|
93
|
+
|
|
94
|
+
```typescript fileName="**/*.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
95
|
+
import type { Dictionary } from "intlayer";
|
|
96
|
+
|
|
97
|
+
const remoteContent = {
|
|
98
|
+
key: "remote_content",
|
|
99
|
+
content: {
|
|
100
|
+
externalContent: fetch("https://example.com").then((res) => res.json()),
|
|
101
|
+
},
|
|
102
|
+
} satisfies Dictionary;
|
|
103
|
+
|
|
104
|
+
export default remoteContent;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```plaintext fileName="**/*.content.json" contentDeclarationFormat="json"
|
|
108
|
+
Неможливо отримати вміст із JSON-файлу, використовуйте натомість .ts або .js файл
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
> Запит виконується під час збирання, тому отримані дані — це знімок, вбудований у словник. Перезберіть словники, щоб оновити його.
|
|
112
|
+
|
|
90
113
|
## Використання контенту на основі функцій у React-компонентах
|
|
91
114
|
|
|
92
115
|
Щоб використовувати контент на основі функцій у React-компоненті, потрібно імпортувати `useIntlayer` з `react-intlayer` і викликати його з ідентифікатором контенту, щоб отримати вміст. Ось приклад:
|