@intlayer/docs 8.12.2 → 8.12.4-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/cjs/blog.cjs.map +1 -1
  2. package/dist/cjs/common.cjs.map +1 -1
  3. package/dist/cjs/doc.cjs.map +1 -1
  4. package/dist/cjs/frequentQuestions.cjs.map +1 -1
  5. package/dist/cjs/generated/blog.entry.cjs +1 -0
  6. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  7. package/dist/cjs/generated/docs.entry.cjs +1 -0
  8. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  9. package/dist/cjs/generated/frequentQuestions.entry.cjs +1 -0
  10. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  11. package/dist/cjs/generated/legal.entry.cjs +1 -0
  12. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  13. package/dist/cjs/legal.cjs.map +1 -1
  14. package/dist/esm/blog.mjs.map +1 -1
  15. package/dist/esm/common.mjs.map +1 -1
  16. package/dist/esm/doc.mjs.map +1 -1
  17. package/dist/esm/frequentQuestions.mjs.map +1 -1
  18. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  19. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  20. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  21. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  22. package/dist/esm/legal.mjs.map +1 -1
  23. package/dist/types/blog.d.ts.map +1 -1
  24. package/dist/types/common.d.ts.map +1 -1
  25. package/dist/types/doc.d.ts.map +1 -1
  26. package/dist/types/frequentQuestions.d.ts.map +1 -1
  27. package/dist/types/legal.d.ts.map +1 -1
  28. package/docs/ar/bundle_optimization.md +250 -102
  29. package/docs/ar/configuration.md +10 -10
  30. package/docs/bn/bundle_optimization.md +252 -104
  31. package/docs/bn/configuration.md +10 -10
  32. package/docs/cs/bundle_optimization.md +253 -105
  33. package/docs/cs/configuration.md +10 -10
  34. package/docs/de/bundle_optimization.md +245 -97
  35. package/docs/de/configuration.md +10 -10
  36. package/docs/en/bundle_optimization.md +172 -49
  37. package/docs/en/configuration.md +10 -10
  38. package/docs/en-GB/bundle_optimization.md +230 -82
  39. package/docs/en-GB/configuration.md +10 -10
  40. package/docs/es/bundle_optimization.md +250 -102
  41. package/docs/es/configuration.md +10 -10
  42. package/docs/fr/bundle_optimization.md +223 -75
  43. package/docs/fr/configuration.md +10 -10
  44. package/docs/hi/bundle_optimization.md +253 -105
  45. package/docs/hi/configuration.md +10 -10
  46. package/docs/id/bundle_optimization.md +258 -110
  47. package/docs/id/configuration.md +10 -10
  48. package/docs/it/bundle_optimization.md +249 -103
  49. package/docs/it/configuration.md +10 -10
  50. package/docs/ja/bundle_optimization.md +245 -97
  51. package/docs/ja/configuration.md +10 -10
  52. package/docs/ko/bundle_optimization.md +253 -105
  53. package/docs/ko/configuration.md +10 -10
  54. package/docs/nl/bundle_optimization.md +249 -101
  55. package/docs/nl/configuration.md +10 -10
  56. package/docs/pl/bundle_optimization.md +258 -111
  57. package/docs/pl/configuration.md +10 -10
  58. package/docs/pt/bundle_optimization.md +256 -115
  59. package/docs/pt/configuration.md +10 -10
  60. package/docs/ru/bundle_optimization.md +253 -105
  61. package/docs/ru/configuration.md +10 -10
  62. package/docs/tr/bundle_optimization.md +255 -107
  63. package/docs/tr/configuration.md +10 -10
  64. package/docs/uk/bundle_optimization.md +250 -102
  65. package/docs/uk/configuration.md +10 -10
  66. package/docs/ur/bundle_optimization.md +257 -109
  67. package/docs/ur/configuration.md +10 -10
  68. package/docs/vi/bundle_optimization.md +259 -111
  69. package/docs/vi/configuration.md +10 -10
  70. package/docs/zh/bundle_optimization.md +260 -112
  71. package/docs/zh/configuration.md +10 -10
  72. package/docs/zh-TW/bundle_optimization.md +602 -0
  73. package/package.json +8 -8
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  createdAt: 2025-11-25
3
- updatedAt: 2026-04-08
4
- title: i18nバンドルサイズの最適化とパフォーマンス
5
- description: 国際化(i18n)コンテンツを最適化することで、アプリケーションのバンドルサイズを削減します。Intlayerを使用して辞書のツリーシェイキングや遅延読み込みを活用する方法を学びましょう。
3
+ updatedAt: 2026-06-07
4
+ title: i18nバンドルサイズとパフォーマンスの最適化
5
+ description: 国際化(i18n)コンテンツを最適化し、アプリケーションのバンドルサイズを削減します。Intlayerを使用して辞書のツリーシェイキングと遅延読み込みを活用する方法を学びます。
6
6
  keywords:
7
7
  - バンドル最適化
8
8
  - コンテンツ自動化
@@ -16,33 +16,36 @@ slugs:
16
16
  - concept
17
17
  - bundle-optimization
18
18
  history:
19
+ - version: 8.12.0
20
+ date: 2026-06-07
21
+ changes: "Babel/Webpack用の `intlayerPurgeBabelPlugin` と `intlayerMinifyBabelPlugin` を追加、プラグインのパイプラインを明確化"
19
22
  - version: 8.7.0
20
23
  date: 2026-04-08
21
- changes: "ビルド構成に `minify` と `purge` オプションを追加"
24
+ changes: "ビルド設定に `minify` と `purge` オプションを追加"
22
25
  ---
23
26
 
24
- # i18nバンドルサイズの最適化とパフォーマンス
27
+ # i18nバンドルサイズとパフォーマンスの最適化
25
28
 
26
- JSONファイルに依存する従来のi18nソリューションで最も一般的な課題の1つは、コンテンツサイズの管理です。開発者が手動でコンテンツを名前空間に分離しない場合、ユーザーは特定のページを表示するためだけに、全ページおよび全言語の翻訳をダウンロードすることになりかねません。
29
+ JSONファイルに依存する従来のi18nソリューションで最も一般的な課題の1つは、コンテンツサイズの管理です。開発者が手動でコンテンツを名前空間に分割しない場合、ユーザーは1つのページを表示するためだけに、すべてのページ、さらにすべての言語の翻訳をダウンロードすることになることがよくあります。
27
30
 
28
- 例えば、10ページが10言語に翻訳されたアプリケーションでは、ユーザーが必要なのは**1ページ**(現在の言語の現在のページ)だけであるにもかかわらず、100ページ分のコンテンツをダウンロードすることになる可能性があります。これは帯域幅の無駄遣いと読み込み時間の低下につながります。
31
+ たとえば、10言語に翻訳された10ページのアプリケーションの場合、ユーザーは**1つ**(現在の言語での現在のページ)しか必要としないにもかかわらず、100ページ分のコンテンツをダウンロードすることになります。これは、帯域幅の無駄遣いと読み込み時間の遅延につながります。
29
32
 
30
- **Intlayerは、ビルド時の最適化を通じてこの問題を解決します。** コードを分析してコンポーネントごとに実際に使用されている辞書を検出し、必要なコンテンツのみをバンドルに再注入します。
33
+ **Intlayerは、ビルド時の最適化によってこの問題を解決します。** コードを分析して各コンポーネントで実際に使用されている辞書を検出し、必要なコンテンツのみをバンドルに再注入します。
31
34
 
32
35
  ## 目次
33
36
 
34
37
  <TOC />
35
38
 
36
- ## バンドルのスキャン
39
+ ## バンドルの分析
37
40
 
38
- バンドルを分析することは、「重い」JSONファイルやコード分割の機会を特定するための第一歩です。これらのツールは、アプリケーションのコンパイル済みコードの視覚的なツリーマップを生成し、どのライブラリが最もスペースを消費しているかを正確に把握できるようにします。
41
+ バンドルを分析することは、「重い」JSONファイルやコード分割の機会を特定するための第一歩です。これらのツールは、アプリケーションのコンパイル済みコードの視覚的なツリーマップを生成し、どのライブラリが最もスペースを消費しているかを正確に確認できるようにします。
39
42
 
40
43
  <Tabs>
41
44
  <Tab value="vite">
42
45
 
43
46
  ### Vite / Rollup
44
47
 
45
- Viteは内部でRollupを使用しています。`rollup-plugin-visualizer`プラグインは、グラフ内のすべてのモジュールのサイズを示すインタラクティブなHTMLファイルを生成します。
48
+ Viteは内部でRollupを使用しています。`rollup-plugin-visualizer`を使用すると、グラフ内のすべてのモジュールのサイズを示すインタラクティブなHTMLファイルが生成されます。
46
49
 
47
50
  ```bash
48
51
  npm install -D rollup-plugin-visualizer
@@ -129,9 +132,9 @@ ANALYZE=true npm run build
129
132
  </Tab>
130
133
  <Tab value="Webpack (CRA / Angular / etc)">
131
134
 
132
- ### 標準Webpack
135
+ ### 標準の Webpack
133
136
 
134
- Create React App (ejected)、Angular、またはカスタムのWebpack設定の場合は、業界標準の `webpack-bundle-analyzer` を使用してください。
137
+ Create React App (ejected)、Angular、またはカスタムのWebpackセットアップの場合は、業界標準の `webpack-bundle-analyzer` を使用します。
135
138
 
136
139
  ```bash packageManager='npm'
137
140
  npm install -D webpack-bundle-analyzer
@@ -149,7 +152,7 @@ pnpm add -D webpack-bundle-analyzer
149
152
  bun add -d webpack-bundle-analyzer
150
153
  ```
151
154
 
152
- ```typescript fileName="webpack.config.ts
155
+ ```typescript fileName="webpack.config.ts"
153
156
  import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";
154
157
 
155
158
  export default {
@@ -168,27 +171,64 @@ export default {
168
171
 
169
172
  ## 仕組み
170
173
 
171
- Intlayerは**コンポーネント単位のアプローチ**を採用しています。グローバルなJSONファイルとは異なり、コンテンツはコンポーネントの隣または内部で定義されます。ビルドプロセス中、Intlayerは以下を行います:
174
+ Intlayerは**コンポーネントごとのアプローチ**を使用します。グローバルなJSONファイルとは異なり、コンテンツはコンポーネントの横、またはコンポーネント内に定義されます。ビルドプロセス中に、Intlayerは以下を実行します。
172
175
 
173
- 1. コードを**分析**して `useIntlayer` の呼び出しを見つけます。
174
- 2. 対応する辞書コンテンツを**構築**します。
175
- 3. 設定に基づいて `useIntlayer` の呼び出しを最適化されたコードに**置き換え**ます。
176
+ 1. **分析**: コードを分析して、`useIntlayer` の呼び出しを見つけます。
177
+ 2. **構築**: 対応する辞書コンテンツを構築します。
178
+ 3. **置換**: 設定に基づいて、`useIntlayer` の呼び出しを最適化されたコードに置き換えます。
176
179
 
177
- これにより、以下が保証されます:
180
+ これにより、以下が保証されます。
178
181
 
179
- - コンポーネントがインポートされていない場合、そのコンテンツはバンドルに含まれません(デッドコード削除)。
180
- - コンポーネントが遅延読み込み(lazy loading)される場合、そのコンテンツも遅延読み込みされます。
182
+ - コンポーネントがインポートされていない場合、そのコンテンツはバンドルに含まれません(デッドコードの削除)。
183
+ - コンポーネントが遅延読み込みされる場合、そのコンテンツも遅延読み込みされます。
181
184
 
182
- ## プラットフォーム別のセットアップ
185
+ ## プラグインリファレンス
186
+
187
+ Intlayerのビルド最適化は、それぞれ単一の責任を持つ複数の個別のプラグインに分割されています。それぞれが何を行うかを理解することで、設定時の混乱を防ぐことができます。
188
+
189
+ ### Babel プラグイン (`@intlayer/babel`)
190
+
191
+ これらは、Webpackベースのセットアップ(Babelを使用したNext.js、CRA、カスタムWebpackなど)の `babel.config.js` で直接使用されます。
192
+
193
+ | プラグイン | 役割 |
194
+ | :---------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------- |
195
+ | `intlayerExtractBabelPlugin` | `.content.ts` ファイルをスキャンし、コンパイルされた辞書を `.intlayer/` に書き込みます |
196
+ | `intlayerOptimizeBabelPlugin` | `useIntlayer('key')` を `useDictionary(hash)` に書き換え、一致する辞書の `import` を注入します |
197
+ | `intlayerPurgeBabelPlugin` | すべてのソースファイルをスキャンし、コンパイルされた `.intlayer/**/*.json` から**未使用のフィールド**を削除します |
198
+ | `intlayerMinifyBabelPlugin` | JSONファイルとソースコードの両方で、**コンテンツフィールドキーを短いアルファベットのエイリアス**(例:`title` → `a`)に**名前変更**します |
199
+
200
+ > **プラグインの順序は重要です。** `babel.config.js` では、purgeとminifyのプラグインは、optimizeのプラグインの**前**に記述する必要があります。最適化パスは `useIntlayer('key')` を不透明な `useDictionary(hash)` 呼び出しに置き換えるため、purgeパスとminifyパスが使用されているフィールドを識別するために必要な辞書キー情報が消去されてしまいます。
201
+
202
+ 各Babelプラグインには、設定読み込み時に `intlayer.config.ts` を1回読み込み、事前解決された値を返す対応するオプションヘルパーがあります。
203
+
204
+ | オプションヘルパー | 一緒に使用するプラグイン |
205
+ | :--------------------------- | :---------------------------- |
206
+ | `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
207
+ | `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
208
+ | `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
209
+ | `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
210
+
211
+ ### Vite プラグイン (`vite-intlayer`)
212
+
213
+ Viteユーザーは**これらを直接設定することはありません**。これらは、`vite.config.ts` で `withIntlayer()` を呼び出したときに自動的に設定されます。`intlayer.config.ts` の `build.purge` および `build.minify` フラグは、追加のプラグイン登録なしに対応する動作を切り替えます。
214
+
215
+ | 内部の Vite プラグイン | 同等の動作 |
216
+ | :--------------------- | :-------------------------------------------------------------------------------------- |
217
+ | Usage analyzer | `intlayerPurgeBabelPlugin` の分析パスと同じ |
218
+ | Dictionary prune | `intlayerPurgeBabelPlugin` のJSON書き込みパスと同じ |
219
+ | Dictionary minify | `intlayerMinifyBabelPlugin` のJSON書き込みパスと同じ |
220
+ | Babel transform | `intlayerMinifyBabelPlugin` のソースコード名変更 + `intlayerOptimizeBabelPlugin` と同じ |
221
+
222
+ ## プラットフォーム別の設定
183
223
 
184
224
  <Tabs>
185
225
  <Tab value="nextjs">
186
226
 
187
227
  ### Next.js
188
228
 
189
- Next.jsはビルドにSWCを使用するため、変換を処理するために `@intlayer/swc` プラグインが必要です。
229
+ Next.jsはビルドにSWCを使用するため、最適化(インポートの書き換え)パスには `@intlayer/swc` プラグインが必要です。
190
230
 
191
- > SWCプラグインはNext.jsにおいてまだ実験段階であるため、このプラグインはデフォルトではインストールされません。将来的に変更される可能性があります。
231
+ > SWCプラグインはNext.jsではまだ実験的であるため、このプラグインはデフォルトではインストールされません。将来的に変更される可能性があります。
192
232
 
193
233
  ```bash packageManager="npm"
194
234
  npm install -D @intlayer/swc
@@ -206,21 +246,63 @@ pnpm add -D @intlayer/swc
206
246
  bun add -d @intlayer/swc
207
247
  ```
208
248
 
209
- インストールされると、Intlayerは自動的にプラグインを検出して使用します。
249
+ インストールされると、Intlayerはプラグインを自動的に検出して使用します。
250
+
251
+ **purgeおよびminify**パス(フィールドの削除とフィールドの名前変更)については、一緒に `@intlayer/babel` をインストールし、Babelプラグインを追加します。Next.jsは変換にSWCを使用しますが、プラグイン設定のために `babel.config.js` を評価するため、BabelプラグインはSWCの前の事前パスとして実行されます。
252
+
253
+ ```bash packageManager="npm"
254
+ npm install -D @intlayer/babel
255
+ ```
256
+
257
+ ```javascript fileName="babel.config.js"
258
+ const {
259
+ intlayerPurgeBabelPlugin,
260
+ intlayerMinifyBabelPlugin,
261
+ getPurgePluginOptions,
262
+ getMinifyPluginOptions,
263
+ } = require("@intlayer/babel");
264
+
265
+ module.exports = {
266
+ presets: ["next/babel"],
267
+ plugins: [
268
+ // Purge: .intlayer/**/*.json から未使用のコンテンツフィールドを削除します
269
+ [intlayerPurgeBabelPlugin, getPurgePluginOptions()],
270
+ // Minify: JSON + ソースコード内のコンテンツフィールドキーの名前を変更します
271
+ [intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
272
+ // 注意: @intlayer/swc が useIntlayer → useDictionary の書き換えを処理するため、
273
+ // intlayerOptimizeBabelPluginはここでは不要です。
274
+ ],
275
+ };
276
+ ```
210
277
 
211
278
  </Tab>
212
279
  <Tab value="vite">
213
280
 
214
281
  ### Vite
215
282
 
216
- Viteは `vite-intlayer` の依存関係として含まれている `@intlayer/babel` プラグインを使用します。最適化はデフォルトで有効になっています。他に行うことはありません。
283
+ Viteは `@intlayer/babel` プラグインを使用し、これは `vite-intlayer` の依存関係として含まれています。インポートの書き換え、パージ、ミニファイの完全な最適化パイプラインはデフォルトで有効になっており、追加のプラグイン登録は必要ありません。
284
+
285
+ `intlayer.config.ts` で対応するフラグを設定して、パージとミニファイを有効にします。
286
+
287
+ ```typescript fileName="intlayer.config.ts"
288
+ import type { IntlayerConfig } from "intlayer";
289
+
290
+ const config: IntlayerConfig = {
291
+ build: {
292
+ purge: true, // バンドルされたJSONから未使用のコンテンツフィールドを削除
293
+ minify: true, // コンテンツフィールドキーを短いエイリアスに変更
294
+ },
295
+ };
296
+
297
+ export default config;
298
+ ```
217
299
 
218
300
  </Tab>
219
301
  <Tab value="webpack">
220
302
 
221
- ### Webpack
303
+ ### Webpack (および Babel を使用した Next.js)
222
304
 
223
- WebpackでIntlayerを使用したバンドル最適化を有効にするには、適切なBabel (`@intlayer/babel`) または SWC (`@intlayer/swc`) プラグインをインストールして構成する必要があります。
305
+ `@intlayer/babel` をインストールします。
224
306
 
225
307
  ```bash packageManager="npm"
226
308
  npm install -D @intlayer/babel
@@ -238,21 +320,44 @@ pnpm add -D @intlayer/babel
238
320
  bun add -d @intlayer/babel
239
321
  ```
240
322
 
241
- ```typescript fileName="babel.config.js"
323
+ 正しい順序で4つすべてのプラグインを `babel.config.js` に追加します。
324
+
325
+ ```javascript fileName="babel.config.js"
242
326
  const {
243
- getOptimizePluginOptions,
327
+ intlayerExtractBabelPlugin,
328
+ intlayerPurgeBabelPlugin,
329
+ intlayerMinifyBabelPlugin,
244
330
  intlayerOptimizeBabelPlugin,
331
+ getExtractPluginOptions,
332
+ getPurgePluginOptions,
333
+ getMinifyPluginOptions,
334
+ getOptimizePluginOptions,
245
335
  } = require("@intlayer/babel");
246
336
 
247
337
  module.exports = {
248
- plugins: [[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()]],
338
+ plugins: [
339
+ // Extract: .content.ts ファイルをコンパイル → .intlayer/**/*.json
340
+ [intlayerExtractBabelPlugin, getExtractPluginOptions()],
341
+
342
+ // Purge: .intlayer/**/*.json から未使用のフィールドを削除
343
+ // (intlayer.config.ts の build.purge フラグを読み取ります)
344
+ [intlayerPurgeBabelPlugin, getPurgePluginOptions()],
345
+
346
+ // Minify: JSON + ソースコード内のフィールドキーの名前を変更
347
+ // (intlayer.config.ts の build.minify フラグを読み取ります)
348
+ [intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
349
+
350
+ // Optimize: useIntlayer('key') → useDictionary(hash) に書き換え
351
+ // 辞書キーを消去するため、最後に配置する必要があります。
352
+ [intlayerOptimizeBabelPlugin, getOptimizePluginOptions()],
353
+ ],
249
354
  };
250
355
  ```
251
356
 
252
357
  </Tab>
253
358
  </Tabs>
254
359
 
255
- ## 構成
360
+ ## 設定
256
361
 
257
362
  `intlayer.config.ts` の `build` プロパティを介して、Intlayerがバンドルを最適化する方法を制御できます。
258
363
 
@@ -261,50 +366,55 @@ import { Locales, type IntlayerConfig } from "intlayer";
261
366
 
262
367
  const config: IntlayerConfig = {
263
368
  internationalization: {
264
- locales: [Locales.ENGLISH, Locales.FRENCH],
369
+ locales: [Locales.ENGLISH, Locales.JAPANESE],
265
370
  defaultLocale: Locales.ENGLISH,
266
371
  },
267
372
  dictionary: {
268
373
  importMode: "dynamic",
269
374
  },
270
375
  build: {
271
- /**
272
- * バンドルサイズを削減するために辞書を縮小(minify)します。
273
- */
274
- minify: true;
275
-
276
- /**
277
- * 辞書内の未使用のキーを削除(purge)します。
278
- */
279
- purge: true;
280
-
281
- /**
282
- * ビルド時にTypeScriptの型チェックを行うかどうかを指定します。
283
- */
284
- checkTypes: false;
376
+ // ビルド時にuseIntlayer()の呼び出しを直接の辞書インポートに置き換えます。
377
+ // undefined = auto (本番環境で有効), true = 常に有効, false = 常に無効。
378
+ optimize: undefined,
379
+
380
+ // コンパイルされた辞書内のコンテンツフィールドキーを短いアルファベットのエイリアスに
381
+ // 名前変更します(例:title → a)。JSONサイズを縮小します。optimizeが必要です。
382
+ minify: true,
383
+
384
+ // ソースコードでアクセスされないコンテンツフィールドを削除します。
385
+ // optimizeが必要です。
386
+ purge: true,
285
387
  },
286
388
  };
287
389
 
288
390
  export default config;
289
391
  ```
290
392
 
291
- > ほとんどの場合、`optimize` オプションはデフォルトのままにすることをお勧めします。
393
+ > ほとんどの場合、`optimize` にはデフォルト値(`undefined`)を保持することをお勧めします。
292
394
 
293
- > 構成の詳細はドキュメントを参照してください: [構成](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)
395
+ > すべてのオプションについては、設定リファレンスを参照してください:[設定](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)
294
396
 
295
397
  ### ビルドオプション
296
398
 
297
- `build` 構成オブジェクトでは、以下のオプションが利用可能です:
399
+ | プロパティ | 型 | デフォルト | 説明 |
400
+ | :------------- | :--------------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
401
+ | **`optimize`** | `boolean \| undefined` | `undefined` | インポートの書き換えパスを有効にします。`undefined` = 本番ビルドでのみアクティブになります。`false` の場合、purgeとminifyも無効になります。 |
402
+ | **`minify`** | `boolean` | `false` | コンパイルされたJSONファイル内のコンテンツフィールドキーを短いアルファベットのエイリアスに名前変更します。ソースコード内の対応するプロパティアクセスも書き換えます。`optimize` が `false` の場合は効果がありません。 |
403
+ | **`purge`** | `boolean` | `false` | コンパイルされたJSONファイルから、ソースコードで静的にアクセスされないコンテンツフィールドを削除します。`optimize` が `false` の場合は効果がありません。 |
404
+
405
+ ### 最小化(Minification - フィールドキーの名前変更)
298
406
 
299
- | プロパティ | 型 | デフォルト | 説明 |
300
- | :------------- | :-------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
301
- | **`optimize`** | `boolean` | `undefined` | ビルド最適化を有効にするかどうかを制御します。`true` の場合、Intlayerは辞書の呼び出しを最適化された注入に置き換えます。`false` の場合、最適化は無効になります。本番環境では `true` に設定するのが理想的です。 |
302
- | **`minify`** | `boolean` | `false` | バンドルサイズを削減するために辞書を縮小するかどうか。 |
303
- | **`purge`** | `boolean` | `false` | 辞書内の未使用のキーを削除するかどうか。 |
407
+ `build.minify` はJavaScriptバンドルを最小化**しません**。それはバンドラーが処理します。代わりに、ユーザー定義の各コンテンツフィールドキーを短いアルファベットのエイリアスに置き換えることで、コンパイルされた辞書のJSONファイルを縮小します。
304
408
 
305
- ### ミニフィケーション(縮小化)
409
+ ```
410
+ // 最小化前
411
+ { "title": "こんにちは", "subtitle": "世界" }
412
+
413
+ // 最小化後
414
+ { "a": "こんにちは", "b": "世界" }
415
+ ```
306
416
 
307
- 辞書をミニファイすることで、不要な空白やコメントを削除し、JSONコンテンツのサイズを削減します。これは大きな辞書の場合に特に有効です。
417
+ ソースコード内のすべてのプロパティアクセスにも同じ名前の変更が適用されるため、コンパイルされた出力では `content.title` が `content.a` になります。実行時の動作は同じです。
308
418
 
309
419
  ```typescript fileName="intlayer.config.ts"
310
420
  import type { IntlayerConfig } from "intlayer";
@@ -318,11 +428,13 @@ const config: IntlayerConfig = {
318
428
  export default config;
319
429
  ```
320
430
 
321
- > 注意: `optimize` が無効な場合、またはビジュアルエディタが有効な場合(エディタが編集のために完全なコンテンツを必要とするため)、ミニフィケーションは無視されます。
431
+ > `optimize` が `false` の場合、または `editor.enabled` が `true` の場合(ビジュアルエディタでは編集を可能にするために元のフィールド名が必要なため)、最小化はスキップされます。
322
432
 
323
- ### パージング(未使用キーの削除)
433
+ > `importMode: 'fetch'` 経由で読み込まれた辞書の場合も最小化はスキップされます。これは、そのJSONが元のフィールド名を使用してリモートAPIから提供されるためであり、クライアント側のキーの名前を変更するとサーバー/クライアントの規約が壊れるためです。
324
434
 
325
- パージングにより、コード内で実際に使用されているキーのみが最終的な辞書バンドルに含まれるようになります。アプリケーションのすべての部分で使用されていないキーが多数含まれる大きな辞書がある場合、これによりバンドルサイズを大幅に削減できます。
435
+ ### パージ(Purging - 未使用フィールドの削除)
436
+
437
+ `build.purge` は、ソースコード内で実際にアクセスされているコンテンツフィールドを分析し、コンパイルされたJSONファイルから他のすべてのフィールドを削除します。
326
438
 
327
439
  ```typescript fileName="intlayer.config.ts"
328
440
  import type { IntlayerConfig } from "intlayer";
@@ -336,27 +448,43 @@ const config: IntlayerConfig = {
336
448
  export default config;
337
449
  ```
338
450
 
339
- > 注意: `optimize` が無効な場合、パージングは無視されます。
451
+ **例:** 5つのフィールドがあり、そのうち2つだけが使用されている辞書:
452
+
453
+ ```
454
+ // パージ前
455
+ { "title": "…", "subtitle": "…", "cta": "…", "footer": "…", "badge": "…" }
456
+
457
+ // パージ後(ソース内でアクセスされるのはtitleとsubtitleのみ)
458
+ { "title": "…", "subtitle": "…" }
459
+ ```
460
+
461
+ > `optimize` が `false` の場合、または `editor.enabled` が `true` の場合、パージはスキップされます。
462
+
463
+ > ソースファイルが解析できない場合、または `useIntlayer` の結果が変数に割り当てられ、静的アナライザーが追跡できない方法(例:オブジェクトへのスプレッド、分割代入せずにプロップとして渡すなど)で渡された場合も、パージは保守的にスキップされます。このような場合は、完全な辞書が保持されます。
340
464
 
341
465
  ### インポートモード
342
466
 
343
- 複数のページとロケールを含む大規模なアプリケーションでは、JSONファイルがバンドルサイズの大部分を占める可能性があります。Intlayerでは、辞書の読み込み方法を制御できます。
467
+ 複数のページとロケールを含む大規模なアプリケーションの場合、JSONはバンドルサイズの大部分を占める可能性があります。Intlayerでは、`importMode` オプションを使用して辞書の読み込み方法を制御できます。
344
468
 
345
- インポートモードは、`intlayer.config.ts` ファイルでグローバルにデフォルト設定を定義できます。
469
+ ### グローバル定義
470
+
471
+ インポートモードは、`intlayer.config.ts` ファイルでグローバルに定義できます。
346
472
 
347
473
  ```typescript fileName="intlayer.config.ts"
348
474
  import type { IntlayerConfig } from "intlayer";
349
475
 
350
476
  const config: IntlayerConfig = {
351
- build: {
352
- minify: true,
477
+ dictionary: {
478
+ importMode: "dynamic", // デフォルトは 'static'
353
479
  },
354
480
  };
355
481
 
356
482
  export default config;
357
483
  ```
358
484
 
359
- また、`.content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5}}` ファイル内の各辞書に対しても定義できます。
485
+ ### 辞書ごとの定義
486
+
487
+ 個々の辞書のインポートモードを、その `.content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}` ファイルで上書きすることができます。
360
488
 
361
489
  ```ts
362
490
  import { type Dictionary, t } from "intlayer";
@@ -374,33 +502,33 @@ export default appContent;
374
502
 
375
503
  | プロパティ | 型 | デフォルト | 説明 |
376
504
  | :--------------- | :--------------------------------- | :--------- | :-------------------------------------------------------------------------------------------------------------- |
377
- | **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` | **非推奨**: 代わりに `dictionary.importMode` を使用してください。辞書の読み込み方法を決定します(詳細は後述)。 |
505
+ | **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` | **非推奨**: 代わりに `dictionary.importMode` を使用してください。辞書の読み込み方法を決定します(以下を参照)。 |
378
506
 
379
- `importMode` 設定は、辞書コンテンツがどのようにコンポーネントに注入されるかを規定します。
380
- `intlayer.config.ts` ファイルの `dictionary` オブジェクトの下でグローバルに定義することも、特定の辞書の `.content.ts` ファイルで上書きすることもできます。
507
+ `importMode` 設定は、辞書のコンテンツをコンポーネントに注入する方法を決定します。これを `intlayer.config.ts` の `dictionary` オブジェクトでグローバルに定義するか、辞書ごとの `.content.ts` ファイルで上書きすることができます。
381
508
 
382
509
  ### 1. 静的モード (`default`)
383
510
 
384
511
  静的モードでは、Intlayerは `useIntlayer` を `useDictionary` に置き換え、辞書をJavaScriptバンドルに直接注入します。
385
512
 
386
- - **メリット:** 即時レンダリング(同期)、ハイドレーション中に追加のネットワークリクエストが発生しない。
387
- - **デメリット:** バンドルに、その特定のコンポーネントで使用可能な**すべての**言語の翻訳が含まれる。
513
+ - **メリット:** 即時レンダリング(同期)、ハイドレーション時の追加のネットワークリクエストなし。
514
+ - **デメリット:** バンドルには、その特定のコンポーネントで利用可能な**すべて**の言語の翻訳が含まれます。
388
515
  - **最適なケース:** シングルページアプリケーション(SPA)。
389
516
 
390
- **変換後のコード例:**
517
+ **変換されたコードの例:**
391
518
 
392
519
  ```tsx
393
- // 元のコード
520
+ // あなたのコード
394
521
  const content = useIntlayer("my-key");
395
522
 
396
- // 最適化されたコード(静的)
523
+ // 変換後の最適化されたコードの図解(Static)
524
+ // これは図解のみを目的としており、最適化の理由により実際のコードは異なります
397
525
  const content = useDictionary({
398
526
  key: "my-key",
399
527
  content: {
400
528
  nodeType: "translation",
401
529
  translation: {
402
530
  en: "My title",
403
- fr: "Mon titre",
531
+ ja: "私のタイトル",
404
532
  },
405
533
  },
406
534
  });
@@ -408,47 +536,67 @@ const content = useDictionary({
408
536
 
409
537
  ### 2. 動的モード
410
538
 
411
- 動的モードでは、Intlayerは `useIntlayer` を `useDictionaryAsync` に置き換えます。これは `import()`(Suspenseのような仕組み)を使用して、現在のロケールのJSONを具体的に遅延読み込みします。
539
+ 動的モードでは、Intlayerは `useIntlayer` を `useDictionaryAsync` に置き換えます。これにより、`import()`(Suspenseのようなメカニズム)を使用して、現在のロケールのJSONを特別に遅延読み込みします。
412
540
 
413
- - **メリット:** **ロケールレベルのツリーシェイキング。** 英語版を表示しているユーザーは英語版の辞書のみをダウンロードし、フランス語版が読み込まれることはありません。
414
- - **デメリット:** ハイドレーション中にコンポーネントごとにネットワークリクエスト(アセットの取得)が発生する。
415
- - **最適なケース:** バンドルサイズが非常に重要で、多くの言語、大きなテキストブロック、記事などをサポートする場合。
541
+ - **メリット:** **ロケールレベルでのツリーシェイキング。** 英語バージョンを表示しているユーザーは、英語の辞書**のみ**をダウンロードします。日本語の辞書は読み込まれません。
542
+ - **デメリット:** ハイドレーション中にコンポーネントごとにネットワークリクエスト(アセットの取得)をトリガーします。
543
+ - **最適なケース:** バンドルサイズが重要な大規模なテキストブロック、記事、または多くの言語をサポートするアプリケーション。
416
544
 
417
- **変換後のコード例:**
545
+ **変換されたコードの例:**
418
546
 
419
547
  ```tsx
420
- // 元のコード
548
+ // あなたのコード
421
549
  const content = useIntlayer("my-key");
422
550
 
423
- // 最適化されたコード(動的)
551
+ // 変換後の最適化されたコードの図解(Dynamic)
552
+ // これは図解のみを目的としており、最適化の理由により実際のコードは異なります
424
553
  const content = useDictionaryAsync({
425
554
  en: () =>
426
555
  import(".intlayer/dynamic_dictionary/my-key/en.json").then(
427
556
  (mod) => mod.default
428
557
  ),
429
- fr: () =>
430
- import(".intlayer/dynamic_dictionary/my-key/fr.json").then(
558
+ ja: () =>
559
+ import(".intlayer/dynamic_dictionary/my-key/ja.json").then(
431
560
  (mod) => mod.default
432
561
  ),
433
562
  });
434
563
  ```
435
564
 
436
- > `importMode: 'dynamic'` を使用する場合、1ページに `useIntlayer` を使用するコンポーネントが100個あると、ブラウザは100回の個別のフェッチを試みます。このリクエストの「ウォーターフォール」を避けるために、アトムコンポーネントごとに1つではなく、ページセクションごとに1つの辞書といったように、コンテンツをより少ない `.content` ファイルにグループ化してください。
565
+ > `importMode: 'dynamic'` を使用する場合、1つのページに `useIntlayer` を使用するコンポーネントが100個あると、ブラウザは100回の個別のフェッチを試みます。このリクエストの「ウォーターフォール」を避けるために、アトムコンポーネントごとに1つではなく、より少ない数の `.content` ファイル(例:ページのセクションごとに1つの辞書)にコンテンツをグループ化してください。同じキーを使用する複数の `.content` ファイルを使用することもできます。Intlayerはそれらを1つの辞書に統合します。
566
+
567
+ ### 3. Fetchモード
568
+
569
+ 動的モードと同様に動作しますが、最初に Intlayer Live Sync API から辞書を取得しようとします。API呼び出しが失敗した場合、またはコンテンツがライブ更新の対象としてマークされていない場合は、動的インポートにフォールバックします。
437
570
 
438
- ### 3. フェッチモード
571
+ **変換されたコードの例:**
439
572
 
440
- 動的モードと同様に動作しますが、まずIntlayer Live Sync APIから辞書の取得を試みます。API呼び出しが失敗するか、コンテンツがライブアップデート対象でない場合は、動的インポートにフォールバックします。
573
+ ```tsx
574
+ // あなたのコード
575
+ const content = useIntlayer("my-key");
576
+
577
+ // 最適化されたコードの図解(Fetch)
578
+ const content = useDictionaryAsync({
579
+ en: () =>
580
+ fetch("https://intlayer.my-domain.com/dictionary/my-key/en").then((res) =>
581
+ res.json()
582
+ ),
583
+ ja: () =>
584
+ fetch("https://intlayer.my-domain.com/dictionary/my-key/ja").then((res) =>
585
+ res.json()
586
+ ),
587
+ });
588
+ ```
441
589
 
442
- > 詳細はCMSドキュメントを参照してください: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md)
590
+ > 詳細については、CMSのドキュメントを参照してください:[CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md)
443
591
 
444
- > フェッチモードでは、パージとミニフィケーションは使用できません。
592
+ > fetchモードでは、JSONが元のフィールド名を使用してリモートAPIから提供されるため、purgeとminifyは適用されません。
445
593
 
446
- ## まとめ: 静的 vs 動的
594
+ ## 要約: 静的 vs 動的
447
595
 
448
- | 特徴 | 静的モード | 動的モード |
449
- | :------------------------- | :----------------------------------- | :------------------------------------ |
450
- | **JSバンドルサイズ** | 最大(コンポーネントの全言語を含む) | 最小(コードのみ、コンテンツなし) |
451
- | **初期読み込み** | 即時(バンドル内にコンテンツあり) | わずかな遅延(JSONをフェッチ) |
452
- | **ネットワークリクエスト** | 0 回(追加リクエストなし) | 辞書ごとに 1|
453
- | **ツリーシェイキング** | コンポーネントレベル | コンポーネントレベル + ロケールレベル |
454
- | **最適なユースケース** | UIコンポーネント、小規模アプリ | テキストが多いページ、多言語対応 |
596
+ | 機能 | 静的モード | 動的モード |
597
+ | :------------------------- | :--------------------------------------------- | :------------------------------------ |
598
+ | **JSバンドルサイズ** | より大きい(コンポーネントの全言語が含まれる) | 最小(コードのみ、コンテンツなし) |
599
+ | **初期読み込み** | 即時(コンテンツはバンドル内) | わずかな遅延(JSONを取得) |
600
+ | **ネットワークリクエスト** | 追加のリクエストなし | 辞書キーごとに1つのリクエスト |
601
+ | **ツリーシェイキング** | コンポーネントレベル | コンポーネントレベル + ロケールレベル |
602
+ | **最適なユースケース** | UIコンポーネント、小規模アプリ | テキストが多いページ、多言語 |
@@ -679,16 +679,16 @@ routing: {
679
679
 
680
680
  Cookie 保存を使用する場合、追加のアトリビュートを設定できます。
681
681
 
682
- | フィールド | 説明 | 型 |
683
- | ---------- | ------------------------------------------------------------------------------ | ----------------------------------------------------- |
684
- | `name` | Cookie の名前。デフォルト: `'INTLAYER_LOCALE'` | `string` |
685
- | `domain` | Cookie のドメイン。デフォルト: `undefined` | `string` |
686
- | `path` | Cookie のパス。デフォルト: `undefined` | `string` |
687
- | `secure` | HTTPS を必須にします。デフォルト: `undefined` | `boolean` |
688
- | `httpOnly` | HTTP-only フラグ。デフォルト: `undefined` | `boolean` |
689
- | `sameSite` | SameSite ポリシー。 | `'strict'` &#124; <br/> `'lax'` &#124; <br/> `'none'` |
690
- | `expires` | 有効期限または日数。デフォルト: `undefined` | `Date` &#124; <br/> `number` |
691
- | `maxAge` | 作成からの秒単位の有効期間。`expires`より優先されます。デフォルト: `undefined` | `number` |
682
+ | フィールド | 説明 | 型 |
683
+ | ---------- | ------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- |
684
+ | `name` | Cookie の名前。デフォルト: `'INTLAYER_LOCALE'` | `string` |
685
+ | `domain` | Cookie のドメイン。デフォルト: `undefined` | `string` |
686
+ | `path` | Cookie のパス。デフォルト: `undefined` | `string` |
687
+ | `secure` | HTTPS を必須にします。デフォルト: `undefined` | `boolean` |
688
+ | `httpOnly` | HTTP-only フラグ。デフォルト: `undefined` | `boolean` |
689
+ | `sameSite` | SameSite ポリシー。 | `'strict'` &#124; <br/> `'lax'` &#124; <br/> `'none'` |
690
+ | `expires` | 数値は作成からの日数を示し、日付(またはISO日付文字列)は絶対的な有効期限を示します。デフォルト: `undefined` | `Date` &#124; <br/> `number` &#124; <br/> `string` |
691
+ | `maxAge` | 作成からの秒単位の有効期間。`expires`より優先されます。デフォルト: `undefined` | `number` |
692
692
 
693
693
  #### 保存属性 (Storage Attributes)
694
694