@intlayer/docs 7.5.12 → 7.5.14

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 (229) hide show
  1. package/blog/ar/per-component_vs_centralized_i18n.md +248 -0
  2. package/blog/de/per-component_vs_centralized_i18n.md +248 -0
  3. package/blog/en/_per-component_vs_centralized_i18n.md +252 -0
  4. package/blog/en/per-component_vs_centralized_i18n.md +248 -0
  5. package/blog/en-GB/per-component_vs_centralized_i18n.md +247 -0
  6. package/blog/es/per-component_vs_centralized_i18n.md +245 -0
  7. package/blog/fr/per-component_vs_centralized_i18n.md +245 -0
  8. package/blog/hi/per-component_vs_centralized_i18n.md +249 -0
  9. package/blog/id/per-component_vs_centralized_i18n.md +248 -0
  10. package/blog/it/per-component_vs_centralized_i18n.md +247 -0
  11. package/blog/ja/per-component_vs_centralized_i18n.md +247 -0
  12. package/blog/ko/per-component_vs_centralized_i18n.md +246 -0
  13. package/blog/pl/per-component_vs_centralized_i18n.md +247 -0
  14. package/blog/pt/per-component_vs_centralized_i18n.md +246 -0
  15. package/blog/ru/per-component_vs_centralized_i18n.md +251 -0
  16. package/blog/tr/per-component_vs_centralized_i18n.md +244 -0
  17. package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
  18. package/blog/uk/i18n_using_next-i18next.md +1086 -0
  19. package/blog/uk/i18n_using_next-intl.md +760 -0
  20. package/blog/uk/index.md +69 -0
  21. package/blog/uk/internationalization_and_SEO.md +273 -0
  22. package/blog/uk/intlayer_with_i18next.md +211 -0
  23. package/blog/uk/intlayer_with_next-i18next.md +202 -0
  24. package/blog/uk/intlayer_with_next-intl.md +203 -0
  25. package/blog/uk/intlayer_with_react-i18next.md +200 -0
  26. package/blog/uk/intlayer_with_react-intl.md +202 -0
  27. package/blog/uk/intlayer_with_vue-i18n.md +206 -0
  28. package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
  29. package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
  30. package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
  31. package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
  32. package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
  33. package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
  34. package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
  35. package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
  36. package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
  37. package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
  38. package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
  39. package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
  40. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
  41. package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
  42. package/blog/uk/per-component_vs_centralized_i18n.md +248 -0
  43. package/blog/uk/rag_powered_documentation_assistant.md +288 -0
  44. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  45. package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
  46. package/blog/uk/what_is_internationalization.md +167 -0
  47. package/blog/vi/per-component_vs_centralized_i18n.md +246 -0
  48. package/blog/zh/per-component_vs_centralized_i18n.md +248 -0
  49. package/dist/cjs/common.cjs.map +1 -1
  50. package/dist/cjs/generated/blog.entry.cjs +20 -0
  51. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  56. package/dist/esm/common.mjs.map +1 -1
  57. package/dist/esm/generated/blog.entry.mjs +20 -0
  58. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  59. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  60. package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
  61. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  62. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  63. package/dist/types/generated/blog.entry.d.ts +1 -0
  64. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  65. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  66. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  67. package/docs/ar/configuration.md +6 -1
  68. package/docs/ar/dictionary/content_file.md +6 -1
  69. package/docs/de/configuration.md +6 -1
  70. package/docs/de/dictionary/content_file.md +6 -1
  71. package/docs/en/configuration.md +6 -1
  72. package/docs/en/dictionary/content_file.md +6 -1
  73. package/docs/en-GB/configuration.md +6 -1
  74. package/docs/en-GB/dictionary/content_file.md +3 -1
  75. package/docs/es/configuration.md +6 -1
  76. package/docs/es/dictionary/content_file.md +6 -1
  77. package/docs/fr/configuration.md +6 -1
  78. package/docs/fr/dictionary/content_file.md +3 -1
  79. package/docs/hi/configuration.md +6 -1
  80. package/docs/hi/dictionary/content_file.md +3 -1
  81. package/docs/id/configuration.md +6 -1
  82. package/docs/id/dictionary/content_file.md +3 -1
  83. package/docs/it/configuration.md +6 -1
  84. package/docs/it/dictionary/content_file.md +3 -1
  85. package/docs/ja/configuration.md +6 -1
  86. package/docs/ja/dictionary/content_file.md +3 -1
  87. package/docs/ko/configuration.md +6 -1
  88. package/docs/ko/dictionary/content_file.md +3 -1
  89. package/docs/pl/configuration.md +3 -1
  90. package/docs/pl/dictionary/content_file.md +3 -1
  91. package/docs/pt/configuration.md +6 -1
  92. package/docs/pt/dictionary/content_file.md +3 -1
  93. package/docs/ru/configuration.md +6 -1
  94. package/docs/ru/dictionary/content_file.md +6 -1
  95. package/docs/tr/configuration.md +6 -1
  96. package/docs/tr/dictionary/content_file.md +3 -1
  97. package/docs/uk/CI_CD.md +198 -0
  98. package/docs/uk/autoFill.md +307 -0
  99. package/docs/uk/bundle_optimization.md +185 -0
  100. package/docs/uk/cli/build.md +64 -0
  101. package/docs/uk/cli/ci.md +137 -0
  102. package/docs/uk/cli/configuration.md +63 -0
  103. package/docs/uk/cli/debug.md +46 -0
  104. package/docs/uk/cli/doc-review.md +43 -0
  105. package/docs/uk/cli/doc-translate.md +132 -0
  106. package/docs/uk/cli/editor.md +28 -0
  107. package/docs/uk/cli/fill.md +130 -0
  108. package/docs/uk/cli/index.md +190 -0
  109. package/docs/uk/cli/init.md +84 -0
  110. package/docs/uk/cli/list.md +90 -0
  111. package/docs/uk/cli/list_projects.md +128 -0
  112. package/docs/uk/cli/live.md +41 -0
  113. package/docs/uk/cli/login.md +157 -0
  114. package/docs/uk/cli/pull.md +78 -0
  115. package/docs/uk/cli/push.md +98 -0
  116. package/docs/uk/cli/sdk.md +71 -0
  117. package/docs/uk/cli/test.md +76 -0
  118. package/docs/uk/cli/transform.md +65 -0
  119. package/docs/uk/cli/version.md +24 -0
  120. package/docs/uk/cli/watch.md +37 -0
  121. package/docs/uk/configuration.md +742 -0
  122. package/docs/uk/dictionary/condition.md +237 -0
  123. package/docs/uk/dictionary/content_file.md +1134 -0
  124. package/docs/uk/dictionary/enumeration.md +245 -0
  125. package/docs/uk/dictionary/file.md +232 -0
  126. package/docs/uk/dictionary/function_fetching.md +212 -0
  127. package/docs/uk/dictionary/gender.md +273 -0
  128. package/docs/uk/dictionary/insertion.md +187 -0
  129. package/docs/uk/dictionary/markdown.md +383 -0
  130. package/docs/uk/dictionary/nesting.md +273 -0
  131. package/docs/uk/dictionary/translation.md +332 -0
  132. package/docs/uk/formatters.md +595 -0
  133. package/docs/uk/how_works_intlayer.md +256 -0
  134. package/docs/uk/index.md +175 -0
  135. package/docs/uk/interest_of_intlayer.md +297 -0
  136. package/docs/uk/intlayer_CMS.md +569 -0
  137. package/docs/uk/intlayer_visual_editor.md +292 -0
  138. package/docs/uk/intlayer_with_angular.md +710 -0
  139. package/docs/uk/intlayer_with_astro.md +256 -0
  140. package/docs/uk/intlayer_with_create_react_app.md +1258 -0
  141. package/docs/uk/intlayer_with_express.md +429 -0
  142. package/docs/uk/intlayer_with_fastify.md +446 -0
  143. package/docs/uk/intlayer_with_lynx+react.md +548 -0
  144. package/docs/uk/intlayer_with_nestjs.md +283 -0
  145. package/docs/uk/intlayer_with_next-i18next.md +640 -0
  146. package/docs/uk/intlayer_with_next-intl.md +456 -0
  147. package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
  148. package/docs/uk/intlayer_with_nuxt.md +711 -0
  149. package/docs/uk/intlayer_with_react_router_v7.md +600 -0
  150. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
  151. package/docs/uk/intlayer_with_svelte_kit.md +579 -0
  152. package/docs/uk/intlayer_with_tanstack.md +818 -0
  153. package/docs/uk/intlayer_with_vite+preact.md +1748 -0
  154. package/docs/uk/intlayer_with_vite+react.md +1449 -0
  155. package/docs/uk/intlayer_with_vite+solid.md +302 -0
  156. package/docs/uk/intlayer_with_vite+svelte.md +520 -0
  157. package/docs/uk/intlayer_with_vite+vue.md +1113 -0
  158. package/docs/uk/introduction.md +222 -0
  159. package/docs/uk/locale_mapper.md +242 -0
  160. package/docs/uk/mcp_server.md +211 -0
  161. package/docs/uk/packages/express-intlayer/t.md +465 -0
  162. package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
  163. package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
  164. package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
  165. package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
  166. package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
  167. package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
  168. package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
  169. package/docs/uk/packages/intlayer/getPrefix.md +213 -0
  170. package/docs/uk/packages/intlayer/getTranslation.md +190 -0
  171. package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
  172. package/docs/uk/packages/next-intlayer/t.md +365 -0
  173. package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
  174. package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
  175. package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
  176. package/docs/uk/packages/react-intlayer/t.md +311 -0
  177. package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
  178. package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
  179. package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
  180. package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
  181. package/docs/uk/per_locale_file.md +345 -0
  182. package/docs/uk/plugins/sync-json.md +398 -0
  183. package/docs/uk/readme.md +265 -0
  184. package/docs/uk/releases/v6.md +305 -0
  185. package/docs/uk/releases/v7.md +624 -0
  186. package/docs/uk/roadmap.md +346 -0
  187. package/docs/uk/testing.md +204 -0
  188. package/docs/vi/configuration.md +6 -1
  189. package/docs/vi/dictionary/content_file.md +6 -1
  190. package/docs/zh/configuration.md +6 -1
  191. package/docs/zh/dictionary/content_file.md +6 -1
  192. package/frequent_questions/ar/error-vite-env-only.md +77 -0
  193. package/frequent_questions/de/error-vite-env-only.md +77 -0
  194. package/frequent_questions/en/error-vite-env-only.md +77 -0
  195. package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
  196. package/frequent_questions/es/error-vite-env-only.md +76 -0
  197. package/frequent_questions/fr/error-vite-env-only.md +77 -0
  198. package/frequent_questions/hi/error-vite-env-only.md +77 -0
  199. package/frequent_questions/id/error-vite-env-only.md +77 -0
  200. package/frequent_questions/it/error-vite-env-only.md +77 -0
  201. package/frequent_questions/ja/error-vite-env-only.md +77 -0
  202. package/frequent_questions/ko/error-vite-env-only.md +77 -0
  203. package/frequent_questions/pl/error-vite-env-only.md +77 -0
  204. package/frequent_questions/pt/error-vite-env-only.md +77 -0
  205. package/frequent_questions/ru/error-vite-env-only.md +77 -0
  206. package/frequent_questions/tr/error-vite-env-only.md +77 -0
  207. package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
  208. package/frequent_questions/uk/array_as_content_declaration.md +72 -0
  209. package/frequent_questions/uk/build_dictionaries.md +58 -0
  210. package/frequent_questions/uk/build_error_CI_CD.md +74 -0
  211. package/frequent_questions/uk/bun_set_up.md +53 -0
  212. package/frequent_questions/uk/customized_locale_list.md +64 -0
  213. package/frequent_questions/uk/domain_routing.md +113 -0
  214. package/frequent_questions/uk/error-vite-env-only.md +77 -0
  215. package/frequent_questions/uk/esbuild_error.md +29 -0
  216. package/frequent_questions/uk/get_locale_cookie.md +142 -0
  217. package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
  218. package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
  219. package/frequent_questions/uk/package_version_error.md +181 -0
  220. package/frequent_questions/uk/static_rendering.md +44 -0
  221. package/frequent_questions/uk/translated_path_url.md +55 -0
  222. package/frequent_questions/uk/unknown_command.md +97 -0
  223. package/frequent_questions/vi/error-vite-env-only.md +77 -0
  224. package/frequent_questions/zh/error-vite-env-only.md +77 -0
  225. package/legal/uk/privacy_notice.md +83 -0
  226. package/legal/uk/terms_of_service.md +55 -0
  227. package/package.json +9 -9
  228. package/src/generated/blog.entry.ts +20 -0
  229. package/src/generated/frequentQuestions.entry.ts +20 -0
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` e Intlayer – falso positivo errore `node:fs` negato
5
+ description: Perché vite-env-only segnala un import `node:fs` negato con Intlayer + React-Router + Vite e cosa fare.
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - import denied
13
+ - alias
14
+ - client bundle
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # vite-env-only nega `node:fs` con Intlayer
21
+
22
+ Se hai usato il plugin **vite-env-only** (come suggerito nelle vecchie indicazioni di React-Router v7) e vedi:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …anche se non c’è **`node:fs` nel tuo bundle client**, questo è un **falso positivo**.
35
+
36
+ ## Cosa lo causa
37
+
38
+ `vite-env-only` esegue un controllo basato su Babel **all'inizio della risoluzione del grafo di Vite**, _prima_ di:
39
+
40
+ - aliasing (inclusi i mapping browser vs node di Intlayer),
41
+ - dead-code elimination,
42
+ - risoluzione SSR vs client,
43
+ - moduli virtuali come quelli di React-Router.
44
+
45
+ I pacchetti Intlayer contengono codice che può funzionare sia su Node sia sul browser. In una fase _intermedia_, un modulo built-in di Node come `node:fs` può apparire nel grafo **prima** che Vite lo rimuova dal build client. `vite-env-only` lo rileva e genera un errore immediato, anche se il bundle finale non lo contiene.
46
+
47
+ ## React-Router e le convenzioni sui moduli lato server
48
+
49
+ Nella documentazione di React-Router sulle **convenzioni per i moduli lato server**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), il team **suggerisce esplicitamente di usare `vite-env-only`** per evitare che import specifici del server trapelino nel bundle client.
51
+
52
+ Tuttavia, quelle convenzioni si basano su aliasing di Vite, conditional exports e tree-shaking per rimuovere il codice server-only. Sebbene aliasing e conditional exports siano già applicati, alcune utilità basate su Node sono ancora presenti in pacchetti come `@intlayer/core` in quella fase (anche se non vengono mai importate nel client). Poiché il tree-shaking non è ancora stato eseguito, quelle funzioni vengono comunque analizzate da Babel, e `vite-env-only` rileva i loro import `node:` e segnala un falso positivo — anche se vengono correttamente eliminati dal bundle client finale.
53
+
54
+ ## Come risolvere / aggirare
55
+
56
+ ### Consigliato: Rimuovere `vite-env-only`
57
+
58
+ Rimuovi semplicemente il plugin. In molti casi non ti serve — Vite gestisce già le importazioni client vs server tramite la propria risoluzione.
59
+
60
+ Questo risolve il falso errore su `node:fs` senza modifiche a Intlayer.
61
+
62
+ ### Verificare il build finale invece
63
+
64
+ Se vuoi comunque assicurarti che non ci siano built-in di Node nel client, falla **dopo la build**, per esempio:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ Se non ci sono risultati, i tuoi bundle client sono puliti.
72
+
73
+ ## Riepilogo
74
+
75
+ - `vite-env-only` può generare un errore su `node:fs` perché esegue il controllo troppo presto.
76
+ - Le convenzioni sui server modules di Vite + Intlayer + React-Router normalmente rimuovono correttamente i riferimenti server-only.
77
+ - Rimuovere il plugin o verificare l'_output finale_ è generalmente la soluzione migliore.
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` & Intlayer – 偽陽性の `node:fs` インポート拒否エラー
5
+ description: Intlayer + React-Router + Vite 環境で vite-env-only が `node:fs` のインポートを拒否すると報告する理由と、その対処法。
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - インポート拒否
13
+ - エイリアス
14
+ - クライアントバンドル
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # Intlayer 環境で `vite-env-only` が `node:fs` を拒否する
21
+
22
+ 古い React-Router v7 の提案で言及されているような **vite-env-only** プラグインを使用していて、以下のようなエラーが表示される場合:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …クライアントバンドルに**`node:fs` は含まれていない**にもかかわらず、これは**false positive(誤検出)**です。
35
+
36
+ ## 原因
37
+
38
+ `vite-env-only` は Vite のグラフ解決で **早い段階** に Babel ベースのチェックを実行し、以下の処理の _前_ に行われます:
39
+
40
+ - エイリアス解決(Intlayer の browser と node のマッピングを含む)、
41
+ - デッドコード削除、
42
+ - SSR とクライアントの解決、
43
+ - React-Router のような仮想モジュール。
44
+
45
+ Intlayer のパッケージには Node とブラウザの両方で動作するコードが含まれています。中間段階では、`node:fs` のような Node 組み込みが、Vite がクライアントビルドから取り除く**前に**グラフに現れることがあります。`vite-env-only` はそれを検出して即座にエラーにしますが、最終的なバンドルには含まれていません。
46
+
47
+ ## React-Router とサーバーモジュール
48
+
49
+ React-Router のドキュメントにある **server module conventions(サーバーモジュールの慣例)**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules)、チームはクライアントバンドルにサーバー専用のインポートが漏れ出すのを防ぐために、**明示的に `vite-env-only` の使用を推奨しています\*\*。
51
+
52
+ しかし、これらの規約はサーバー専用コードを除去するために Vite のエイリアス、条件付きエクスポート、そしてツリーシェイキングに依存しています。エイリアスと条件付きエクスポートは既に適用されているものの、`@intlayer/core` のようなパッケージにはその段階でまだ一部の Node ベースのユーティリティが存在します(クライアントでは実際にはインポートされません)。ツリーシェイキングがまだ実行されていないため、それらの関数は Babel によって解析され続け、`vite-env-only` がそれらの `node:` インポートを検出して誤検出(false positive)を引き起こします — 最終的なクライアントバンドルからは正しく削除されているにもかかわらず。
53
+
54
+ ## 修正方法 / 回避策
55
+
56
+ ### 推奨: `vite-env-only` を削除する
57
+
58
+ 単純にそのプラグインを削除してください。多くの場合不要です — Vite は独自の解決でクライアントとサーバーのインポートを既に処理します。
59
+
60
+ これにより Intlayer を変更することなく `node:fs` による誤検出が解消します。
61
+
62
+ ### 代わりに最終ビルドを検証する
63
+
64
+ それでもクライアントに Node の組み込みがないことを確認したい場合は、**ビルド後に**行ってください。例:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ 結果が何も返らなければ、クライアントバンドルはクリーンです。
72
+
73
+ ## まとめ
74
+
75
+ - `vite-env-only` はチェックが早すぎるため `node:fs` でエラーになることがある。
76
+ - Vite + Intlayer + React-Router の server modules の慣習は通常、サーバー専用の参照を正しく除去する。
77
+ - プラグインを削除するか、_最終出力_ を検証することが通常は最良の解決策です。
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` & Intlayer – 오탐지된 `node:fs` 거부 오류
5
+ description: Intlayer + React-Router + Vite 환경에서 vite-env-only가 `node:fs` import를 거부한다고 보고하는 이유와 해결 방법.
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - import denied
13
+ - alias
14
+ - client bundle
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # Intlayer에서 vite-env-only가 `node:fs`를 거부함
21
+
22
+ 이전 React-Router v7 권장사항에서 언급된 것처럼 **vite-env-only** 플러그인을 사용하고 있고 다음과 같은 메시지가 표시된다면:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …실제 클라이언트 번들에 **`node:fs`가 없음에도**, 이는 **오탐지(false positive)** 입니다.
35
+
36
+ ## 원인
37
+
38
+ `vite-env-only`는 Babel 기반 검사를 **Vite 그래프 해석 초기에** 실행하며, _다음보다 먼저_:
39
+
40
+ - aliasing (Intlayer의 browser vs node 매핑을 포함),
41
+ - dead-code 제거,
42
+ - SSR vs 클라이언트 해석,
43
+ - React-Router와 같은 가상 모듈.
44
+
45
+ Intlayer 패키지는 Node와 브라우저 양쪽에서 동작할 수 있는 코드를 포함합니다. 어떤 _중간_ 단계에서, `node:fs`와 같은 Node 내장 모듈이 **Vite가 클라이언트 빌드에서 제거하기 전에** 그래프에 나타날 수 있습니다. `vite-env-only`는 이를 감지하고 즉시 오류를 발생시키며, 최종 번들에는 실제로 포함되어 있지 않습니다.
46
+
47
+ ## React-Router와 서버 모듈
48
+
49
+ React-Router 문서의 **server module conventions**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), 팀은 클라이언트 번들로 서버 전용 import가 유출되는 것을 방지하기 위해 **명시적으로 `vite-env-only` 사용을 권장합니다**.
51
+
52
+ 하지만 이러한 규칙들은 서버 전용 코드를 제거하기 위해 Vite의 aliasing, conditional exports, 그리고 tree-shaking에 의존합니다. aliasing과 conditional exports는 이미 적용되더라도, 해당 단계에서는 `@intlayer/core` 같은 패키지에 Node 기반 유틸리티가 여전히 존재할 수 있습니다(클라이언트에서 실제로는 가져오지 않더라도). 아직 tree-shaking이 실행되지 않았기 때문에 이러한 함수들은 여전히 Babel에 의해 파싱되고, `vite-env-only`가 그들의 `node:` import를 감지하여 오탐을 발생시킵니다 — 최종 클라이언트 번들에서는 올바르게 제거되었음에도 불구하고.
53
+
54
+ ## 수정 / 우회 방법
55
+
56
+ ### 권장: `vite-env-only` 제거
57
+
58
+ 플러그인을 단순히 제거하세요. 대부분의 경우 필요하지 않습니다 — Vite는 자체 모듈 해석으로 클라이언트와 서버 임포트를 이미 처리합니다.
59
+
60
+ 이렇게 하면 Intlayer를 변경하지 않고도 잘못된 `node:fs` 차단이 해결됩니다.
61
+
62
+ ### 대신 최종 빌드를 검증하세요
63
+
64
+ 클라이언트에 Node 내장 모듈이 포함되지 않았는지 여전히 확인하려면, **빌드 후**에 검사하세요. 예:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ 결과가 없으면 클라이언트 번들은 깨끗합니다.
72
+
73
+ ## 요약
74
+
75
+ - `vite-env-only`는 너무 일찍 검사하기 때문에 `node:fs`에서 에러를 발생시킬 수 있습니다.
76
+ - Vite + Intlayer + React-Router의 서버 모듈 규약은 일반적으로 서버 전용 참조를 올바르게 제거합니다.
77
+ - 플러그인을 제거하거나 *최종 출력*을 검증하는 것이 일반적으로 최선의 해결책입니다.
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` i Intlayer – fałszywy pozytyw: odmowa importu `node:fs`
5
+ description: Dlaczego vite-env-only zgłasza odmowę importu `node:fs` przy Intlayer + React-Router + Vite i co z tym zrobić.
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - import denied
13
+ - alias
14
+ - client bundle
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # vite-env-only odrzuca `node:fs` w Intlayer
21
+
22
+ Jeśli używasz wtyczki **vite-env-only** (jak wspomniano w starszych sugestiach React-Router v7) i widzisz:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …mimo że **w twoim pakiecie klienckim nie ma `node:fs`**, jest to **fałszywy alarm**.
35
+
36
+ ## Co to powoduje
37
+
38
+ `vite-env-only` wykonuje sprawdzenie oparte na Babel **wcześnie w fazie rozwiązywania grafu Vite**, _zanim_:
39
+
40
+ - aliasowanie (w tym mapowania Intlayer dla przeglądarki vs node),
41
+ - eliminacja martwego kodu,
42
+ - rozwiązywanie SSR vs klienta,
43
+ - moduły wirtualne, takie jak te z React-Routera.
44
+
45
+ Pakiety Intlayer zawierają kod, który może działać zarówno na Node, jak i w przeglądarce. Na etapie _pośrednim_ w grafie może pojawić się wbudowany moduł Node, taki jak `node:fs`, **zanim** Vite usunie go z kompilacji dla klienta. `vite-env-only` to wykrywa i natychmiast zgłasza błąd, mimo że finalny bundle go nie zawiera.
46
+
47
+ ## React-Router i moduły serwerowe
48
+
49
+ W dokumentacji React-Router dotyczącej **konwencji modułów serwerowych**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), zespół **wyraźnie sugeruje użycie `vite-env-only`**, aby zapobiec przedostawaniu się importów tylko dla serwera do bundle'a klienta.
51
+
52
+ Jednakże te konwencje opierają się na aliasingu Vite, conditional exports oraz tree-shaking, aby usunąć kod tylko dla serwera. Chociaż aliasing i conditional exports są już stosowane, niektóre narzędzia oparte na Node nadal występują w pakietach takich jak `@intlayer/core` na tym etapie (nawet jeśli nigdy nie są importowane po stronie klienta). Ponieważ tree-shaking jeszcze się nie uruchomił, te funkcje są nadal parsowane przez Babel, a `vite-env-only` wykrywa ich importy `node:` i zgłasza false positive — mimo że są poprawnie usuwane z ostatecznego bundle'a klienta.
53
+
54
+ ## Jak naprawić / obejść
55
+
56
+ ### Zalecane: Usuń `vite-env-only`
57
+
58
+ Po prostu usuń wtyczkę. W wielu przypadkach nie jest ona potrzebna — Vite sam obsługuje rozróżnienie importów dla klienta i serwera poprzez własne rozwiązywanie.
59
+
60
+ To naprawia fałszywy błąd dotyczący `node:fs` bez konieczności wprowadzania zmian w Intlayer.
61
+
62
+ ### Zamiast tego zweryfikuj końcowy build
63
+
64
+ Jeśli nadal chcesz upewnić się, że żadne wbudowane moduły Node nie trafiają do klienta, sprawdź to **po buildzie**, np.:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ Jeśli brak wyników, twoje client bundles są czyste.
72
+
73
+ ## Podsumowanie
74
+
75
+ - `vite-env-only` może zgłaszać błąd dotyczący `node:fs`, ponieważ sprawdza zbyt wcześnie.
76
+ - Vite + Intlayer + konwencje modułów serwerowych React-Routera zwykle poprawnie usuwają odwołania przeznaczone wyłącznie dla serwera.
77
+ - Usunięcie wtyczki lub weryfikacja _końcowego wyniku_ zwykle jest najlepszym rozwiązaniem.
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` e Intlayer – falso positivo: erro `node:fs` negado
5
+ description: Por que o vite-env-only reporta uma importação `node:fs` negada com Intlayer + React-Router + Vite e o que fazer.
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - import denied
13
+ - alias
14
+ - client bundle
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # vite-env-only nega `node:fs` com Intlayer
21
+
22
+ Se você usou o plugin **vite-env-only** (conforme mencionado em sugestões antigas do React-Router v7) e vir:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …mesmo que não haja **`node:fs` no bundle do cliente**, isto é um **falso positivo**.
35
+
36
+ ## O que causa
37
+
38
+ `vite-env-only` executa uma verificação baseada em Babel **cedo na resolução do grafo do Vite**, _antes de_:
39
+
40
+ - aliasing (incluindo os mapeamentos browser vs node do Intlayer),
41
+ - eliminação de código morto,
42
+ - resolução SSR vs client,
43
+ - módulos virtuais como os do React-Router.
44
+
45
+ Os pacotes do Intlayer contêm código que pode funcionar tanto no Node como no browser. Numa fase _intermédia_, um builtin do Node como `node:fs` pode aparecer no grafo **antes** do Vite o remover do build do cliente. O `vite-env-only` vê isso e gera um erro imediatamente, mesmo que o bundle final não o contenha.
46
+
47
+ ## React-Router e Módulos de Servidor
48
+
49
+ Na documentação do React-Router sobre as **convenções de módulos de servidor**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), a equipe **sugere explicitamente usar `vite-env-only`** para evitar que importações exclusivas do servidor vazem para o bundle do cliente.
51
+
52
+ Porém, essas convenções dependem do aliasing do Vite, das conditional exports e do tree-shaking para remover o código exclusivo do servidor. Embora o aliasing e as conditional exports já estejam aplicados, alguns utilitários baseados em Node ainda estão presentes em pacotes como `@intlayer/core` nessa fase (mesmo que nunca sejam importados pelo cliente). Como o tree-shaking ainda não foi executado, essas funções ainda são analisadas pelo Babel, e o `vite-env-only` detecta suas importações `node:` e gera um falso positivo — mesmo que elas sejam corretamente purgadas do bundle final do cliente.
53
+
54
+ ## Como corrigir / contornar
55
+
56
+ ### Recomendado: Remover `vite-env-only`
57
+
58
+ Simplesmente remova o plugin. Em muitos casos você não precisa dele — o Vite já lida com importações cliente vs servidor através da sua própria resolução.
59
+
60
+ Isto corrige o erro falso de `node:fs` sem alterações no Intlayer.
61
+
62
+ ### Validar o build final em vez disso
63
+
64
+ Se ainda quiser garantir que não há built-ins do Node no cliente, faça isso **após o build**, por exemplo:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ Se não houver resultados, os bundles do cliente estão limpos.
72
+
73
+ ## Resumo
74
+
75
+ - `vite-env-only` pode gerar erro sobre `node:fs` porque verifica cedo demais.
76
+ - O Vite + Intlayer + as convenções de server modules do React-Router normalmente removem corretamente as referências server-only.
77
+ - Remover o plugin ou verificar o _final output_ normalmente é a melhor solução.
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` & Intlayer – ложноположительная ошибка отказа `node:fs`
5
+ description: Почему vite-env-only сообщает об отклонённом импорте `node:fs` с Intlayer + React-Router + Vite и что с этим делать.
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - отклонённый импорт
13
+ - алиас
14
+ - клиентский бандл
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # vite-env-only отклоняет `node:fs` в Intlayer
21
+
22
+ Если вы использовали плагин **vite-env-only** (как указано в старых рекомендациях React-Router v7) и видите:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …даже несмотря на то, что в вашем клиентском бандле **нет `node:fs`**, это является **ложным срабатыванием**.
35
+
36
+ ## Почему это происходит
37
+
38
+ `vite-env-only` выполняет проверку на основе Babel **рано в процессе разрешения графа Vite**, _до_:
39
+
40
+ - алиасинга (включая маппинги Intlayer для browser vs node),
41
+ - удаления неиспользуемого кода (dead-code elimination),
42
+ - разрешения различий между SSR и клиентской сборкой,
43
+ - виртуальных модулей, например у React-Router’а.
44
+
45
+ Пакеты Intlayer содержат код, который может работать как в Node, так и в браузере. На _промежуточном_ этапе встроенный модуль Node, такой как `node:fs`, может появиться в графе **до того**, как Vite удалит его из клиентской сборки. `vite-env-only` видит это и сразу же генерирует ошибку, даже если в итоговом бандле этого нет.
46
+
47
+ ## React-Router и серверные модули
48
+
49
+ В документации React-Router о **sоrver module conventions**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), команда **явно предлагает использовать `vite-env-only`**, чтобы предотвратить утечку импортов, предназначенных только для сервера, в клиентский бандл.
51
+
52
+ Однако эти соглашения опираются на алиасы Vite, условные экспорты и tree-shaking для удаления серверного кода. Хотя алиасы и условные экспорты уже применяются, некоторые утилиты на базе Node всё ещё присутствуют в пакетах, таких как `@intlayer/core`, на этом этапе (даже если они никогда не импортируются в клиенте). Поскольку tree-shaking ещё не выполнился, эти функции всё ещё разбираются Babel, и `vite-env-only` обнаруживает их `node:` импорты и вызывает ложное срабатывание — несмотря на то, что они корректно удаляются из финального клиентского бандла.
53
+
54
+ ## Как исправить / обойти
55
+
56
+ ### Рекомендуется: удалить `vite-env-only`
57
+
58
+ Просто удалите плагин. Во многих случаях он не нужен — Vite уже сам решает, какие импорты относятся к клиенту, а какие к серверу.
59
+
60
+ Это устраняет ложную ошибку `node:fs` без изменений в Intlayer.
61
+
62
+ ### Проверяйте итоговую сборку вместо этого
63
+
64
+ Если вы всё же хотите убедиться, что в клиентской части нет встроенных модулей Node, делайте это **после сборки**, например:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ Если результатов нет, ваши клиентские бандлы чисты.
72
+
73
+ ## Резюме
74
+
75
+ - `vite-env-only` может выдавать ошибку на `node:fs`, потому что проверяет слишком рано.
76
+ - Vite + Intlayer + соглашения серверных модулей React-Router обычно корректно удаляют ссылки на код, предназначенный только для сервера.
77
+ - Удаление плагина или проверка итоговой сборки обычно является наилучшим решением.
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: "`vite-env-only` & Intlayer – yanlış pozitif `node:fs` reddedildi hatası"
5
+ description: "vite-env-only'nin Intlayer + React-Router + Vite ile `node:fs` importunu neden reddettiğini ve yapılması gerekenleri."
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - import reddedildi
13
+ - alias
14
+ - client bundle
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # vite-env-only Intlayer ile `node:fs`'i reddediyor
21
+
22
+ Eğer **vite-env-only** eklentisini kullandıysanız (eski React-Router v7 önerilerinde belirtildiği gibi) ve şu hatayı görüyorsanız:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …istemci paketinizde **`node:fs` olmasa bile**, bu bir **yanlış pozitif**.
35
+
36
+ ## Buna ne sebep oluyor
37
+
38
+ `vite-env-only`, Vite grafik çözümlemesinin **erken aşamasında** Babel tabanlı bir kontrol çalıştırır, _şundan önce_:
39
+
40
+ - aliasing (Intlayer’ın tarayıcı vs node eşlemeleri dahil),
41
+ - kullanılmayan kodun kaldırılması (dead-code elimination),
42
+ - SSR ile istemci çözümlemesi,
43
+ - React-Router gibi sanal modüller.
44
+
45
+ Intlayer paketleri hem Node hem tarayıcı üzerinde çalışabilecek kod içerir. Bir _ara_ aşamada, `node:fs` gibi bir Node yerleşiği grafikte Vite bunun istemci derlemesinden kaldırmasından **önce** görünebilir. `vite-env-only` bunu görür ve nihai paket bunu içermese bile hemen hata verir.
46
+
47
+ ## React-Router ve Sunucu Modülleri
48
+
49
+ React-Router dokümantasyonunda **sunucu modülü konvansiyonları** ile ilgili olarak
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), ekip, sunucuya özel importların istemci paketine sızmasını önlemek için **açıkça `vite-env-only` kullanmayı önerir**.
51
+
52
+ Ancak bu konvansiyonlar, sunucuya özel kodu kaldırmak için Vite’in aliasing’ine, conditional exports'ına ve tree-shaking’ine dayanır. Alias’lama ve conditional exports zaten uygulanmış olsa da, bazı Node tabanlı yardımcılar bu aşamada `@intlayer/core` gibi paketlerde hâlâ mevcut olabilir (istemcide hiç import edilmemiş olsalar bile). Çünkü tree-shaking henüz çalışmadığından, bu fonksiyonlar hâlâ Babel tarafından parse edilir ve `vite-env-only` onların `node:` importlarını tespit edip yanlış pozitif bir hata verir — oysa bunlar nihai istemci paketinden doğru şekilde temizlenir.
53
+
54
+ ## Nasıl düzeltilecek / geçici çözümler
55
+
56
+ ### Önerilen: `vite-env-only`'ı kaldırın
57
+
58
+ Eklentiyi basitçe kaldırın. Birçok durumda buna gerek yok — Vite kendi çözümlemesiyle istemci ve sunucu importlarını zaten yönetir.
59
+
60
+ Bu, Intlayer'da değişiklik yapmadan yanlış `node:fs` reddini düzeltir.
61
+
62
+ ### Bunun yerine son yapıyı doğrulayın
63
+
64
+ İstemci paketlerinde Node yerleşiklerinin bulunmadığından hâlâ emin olmak istiyorsanız, bunu **build sonrası** yapın, örn:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ Eğer sonuç yoksa, istemci bundle'larınız temizdir.
72
+
73
+ ## Özet
74
+
75
+ - `vite-env-only` çok erken kontrol ettiği için `node:fs` üzerinde hata verebilir.
76
+ - Vite + Intlayer + React-Router'ın server modules konvansiyonları genellikle yalnızca sunucuya ait referansları doğru şekilde kaldırır.
77
+ - Eklentiyi kaldırmak veya _nihai çıktıyı_ doğrulamak genellikle en iyi çözümdür.
@@ -0,0 +1,104 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Чи можна використовувати Intlayer з Next.js без `[locale]` у шляху сторінки?
5
+ description: Дізнайтеся, як використовувати Intlayer з Next.js без `[locale]` у шляху сторінки.
6
+ keywords:
7
+ - locale
8
+ - path
9
+ - intlayer
10
+ - next.js
11
+ - vite
12
+ - framework
13
+ - middleware
14
+ - configuration
15
+ - prefixDefault
16
+ - noPrefix
17
+ slugs:
18
+ - frequent-questions
19
+ - next-no-locale-path
20
+ ---
21
+
22
+ # Чи можна використовувати Intlayer з Next.js без `[locale]` у шляху сторінки?
23
+
24
+ Так — можна використовувати Intlayer з Next.js без `[locale]` у шляху сторінки. Однак цього не рекомендується робити, оскільки розділення сторінок по локалях дозволяє підвищити видимість за більшою кількістю ключових слів у пошукових системах. Крім того, це може вплинути на ваш SSR.
25
+
26
+ Якщо ви хочете це зробити, дотримуйтеся тих самих кроків, що описані в керівництві [Intlayer with Next.js](https://intlayer.org/doc/environment/nextjs),
27
+
28
+ - без `src/middleware.ts`
29
+ - без `generateStaticParams`
30
+
31
+ ```tsx fileName="src/app/layout.tsx"
32
+ import type { FC, PropsWithChildren } from "react";
33
+
34
+ const LocaleLayout: FC<PropsWithChildren> = ({ children }) => (
35
+ <html lang={undefined} dir={undefined}>
36
+ <body className={inter.className}>{children}</body>
37
+ </html>
38
+ );
39
+
40
+ export default LocaleLayout;
41
+ ```
42
+
43
+ ```tsx fileName="src/app/page.tsx"
44
+ import type { FC } from "react";
45
+ import { ClientComponentExample } from "@components/ClientComponentExample";
46
+ import { ServerComponentExample } from "@components/ServerComponentExample";
47
+ import { PageContent } from "@components/pageContent";
48
+ import { type NextPageIntlayer, IntlayerClientProvider } from "next-intlayer";
49
+ import { IntlayerServerProvider } from "next-intlayer/server";
50
+
51
+ const Page: FC = () => {
52
+ return (
53
+ <IntlayerServerProvider>
54
+ <PageContent />
55
+ <ServerComponentExample />
56
+
57
+ <IntlayerClientProvider>
58
+ <ClientComponentExample />
59
+ </IntlayerClientProvider>
60
+ </IntlayerServerProvider>
61
+ );
62
+ };
63
+
64
+ export default Page;
65
+ ```
66
+
67
+ ```tsx fileName="src/component/pageContent.ts"
68
+ "use client";
69
+
70
+ import { type FC } from "react";
71
+ import { useIntlayer } from "next-intlayer";
72
+ import { useHTMLLanguage } from "@hooks/htmlTextDir";
73
+
74
+ const PageContent: FC = () => {
75
+ useHTMLLanguage();
76
+ const content = useIntlayer("page");
77
+
78
+ return (
79
+ <>
80
+ <p>{content.getStarted.main}</p>
81
+ <code>{content.getStarted.pageLink}</code>
82
+ </>
83
+ );
84
+ };
85
+ ```
86
+
87
+ ```tsx fileName="src/hooks/htmlTextDir.ts"
88
+ "use client";
89
+
90
+ import { useEffect } from "react";
91
+ import { getHTMLTextDir } from "intlayer";
92
+ import { useLocale } from "next-intlayer";
93
+
94
+ export const useHTMLLanguage = () => {
95
+ const { locale } = useLocale();
96
+
97
+ useEffect(() => {
98
+ if (!document) return;
99
+
100
+ document.documentElement.lang = locale;
101
+ document.documentElement.dir = getHTMLTextDir(locale);
102
+ }, [locale]);
103
+ };
104
+ ```