@intlayer/docs 7.0.3 → 7.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_i18next.md +68 -106
- package/blog/ar/intlayer_with_next-i18next.md +84 -288
- package/blog/ar/intlayer_with_next-intl.md +58 -337
- package/blog/ar/intlayer_with_react-i18next.md +68 -290
- package/blog/ar/intlayer_with_react-intl.md +63 -266
- package/blog/de/intlayer_with_i18next.md +77 -97
- package/blog/de/intlayer_with_next-i18next.md +69 -296
- package/blog/de/intlayer_with_next-intl.md +59 -340
- package/blog/de/intlayer_with_react-i18next.md +68 -290
- package/blog/de/intlayer_with_react-intl.md +62 -264
- package/blog/en/intlayer_with_i18next.md +67 -103
- package/blog/en/intlayer_with_next-i18next.md +69 -294
- package/blog/en/intlayer_with_next-intl.md +48 -300
- package/blog/en/intlayer_with_react-i18next.md +61 -289
- package/blog/en/intlayer_with_react-intl.md +61 -284
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/en-GB/intlayer_with_i18next.md +67 -103
- package/blog/en-GB/intlayer_with_next-i18next.md +71 -292
- package/blog/en-GB/intlayer_with_next-intl.md +58 -337
- package/blog/en-GB/intlayer_with_react-i18next.md +67 -289
- package/blog/en-GB/intlayer_with_react-intl.md +61 -264
- package/blog/es/intlayer_with_i18next.md +67 -103
- package/blog/es/intlayer_with_next-i18next.md +71 -296
- package/blog/es/intlayer_with_next-intl.md +57 -338
- package/blog/es/intlayer_with_react-i18next.md +68 -290
- package/blog/es/intlayer_with_react-intl.md +62 -265
- package/blog/fr/intlayer_with_i18next.md +66 -104
- package/blog/fr/intlayer_with_next-i18next.md +82 -285
- package/blog/fr/intlayer_with_next-intl.md +57 -338
- package/blog/fr/intlayer_with_react-i18next.md +67 -289
- package/blog/fr/intlayer_with_react-intl.md +61 -264
- package/blog/hi/intlayer_with_i18next.md +68 -104
- package/blog/hi/intlayer_with_next-i18next.md +74 -299
- package/blog/hi/intlayer_with_next-intl.md +57 -239
- package/blog/hi/intlayer_with_react-i18next.md +69 -291
- package/blog/hi/intlayer_with_react-intl.md +65 -268
- package/blog/id/intlayer_with_i18next.md +126 -0
- package/blog/id/intlayer_with_next-i18next.md +142 -0
- package/blog/id/intlayer_with_next-intl.md +113 -0
- package/blog/id/intlayer_with_react-i18next.md +124 -0
- package/blog/id/intlayer_with_react-intl.md +122 -0
- package/blog/it/intlayer_with_i18next.md +67 -103
- package/blog/it/intlayer_with_next-i18next.md +71 -296
- package/blog/it/intlayer_with_next-intl.md +57 -338
- package/blog/it/intlayer_with_react-i18next.md +68 -290
- package/blog/it/intlayer_with_react-intl.md +62 -265
- package/blog/ja/intlayer_with_i18next.md +68 -103
- package/blog/ja/intlayer_with_next-i18next.md +85 -283
- package/blog/ja/intlayer_with_next-intl.md +58 -336
- package/blog/ja/intlayer_with_react-i18next.md +68 -290
- package/blog/ja/intlayer_with_react-intl.md +62 -264
- package/blog/ko/intlayer_with_i18next.md +80 -96
- package/blog/ko/intlayer_with_next-i18next.md +85 -287
- package/blog/ko/intlayer_with_next-intl.md +68 -327
- package/blog/ko/intlayer_with_react-i18next.md +68 -290
- package/blog/ko/intlayer_with_react-intl.md +64 -266
- package/blog/pl/intlayer_with_i18next.md +126 -0
- package/blog/pl/intlayer_with_next-i18next.md +142 -0
- package/blog/pl/intlayer_with_next-intl.md +111 -0
- package/blog/pl/intlayer_with_react-i18next.md +124 -0
- package/blog/pl/intlayer_with_react-intl.md +122 -0
- package/blog/pt/intlayer_with_i18next.md +67 -103
- package/blog/pt/intlayer_with_next-i18next.md +72 -293
- package/blog/pt/intlayer_with_next-intl.md +57 -256
- package/blog/pt/intlayer_with_react-i18next.md +104 -78
- package/blog/pt/intlayer_with_react-intl.md +62 -266
- package/blog/ru/intlayer_with_i18next.md +66 -104
- package/blog/ru/intlayer_with_next-i18next.md +71 -296
- package/blog/ru/intlayer_with_next-intl.md +58 -337
- package/blog/ru/intlayer_with_react-i18next.md +68 -290
- package/blog/ru/intlayer_with_react-intl.md +62 -265
- package/blog/tr/intlayer_with_i18next.md +71 -107
- package/blog/tr/intlayer_with_next-i18next.md +72 -297
- package/blog/tr/intlayer_with_next-intl.md +58 -339
- package/blog/tr/intlayer_with_react-i18next.md +69 -291
- package/blog/tr/intlayer_with_react-intl.md +63 -285
- package/blog/vi/intlayer_with_i18next.md +126 -0
- package/blog/vi/intlayer_with_next-i18next.md +142 -0
- package/blog/vi/intlayer_with_next-intl.md +111 -0
- package/blog/vi/intlayer_with_react-i18next.md +124 -0
- package/blog/vi/intlayer_with_react-intl.md +122 -0
- package/blog/zh/intlayer_with_i18next.md +67 -102
- package/blog/zh/intlayer_with_next-i18next.md +72 -296
- package/blog/zh/intlayer_with_next-intl.md +58 -336
- package/blog/zh/intlayer_with_react-i18next.md +68 -290
- package/blog/zh/intlayer_with_react-intl.md +63 -106
- package/dist/cjs/generated/blog.entry.cjs +13 -1
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +13 -1
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +13 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +13 -1
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +13 -2
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +13 -2
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +13 -2
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +13 -2
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/plugins/sync-json.md +244 -0
- package/docs/de/plugins/sync-json.md +244 -0
- package/docs/de/releases/v7.md +1 -18
- package/docs/en/CI_CD.md +1 -1
- package/docs/en/configuration.md +1 -1
- package/docs/en/formatters.md +1 -1
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/intlayer_CMS.md +1 -1
- package/docs/en/intlayer_cli.md +26 -1
- package/docs/en/intlayer_with_nextjs_14.md +3 -1
- package/docs/en/intlayer_with_nextjs_15.md +3 -1
- package/docs/en/intlayer_with_nextjs_16.md +3 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_nuxt.md +1 -1
- package/docs/en/intlayer_with_react_native+expo.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +1 -1
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/intlayer_with_vite+preact.md +1 -1
- package/docs/en/intlayer_with_vite+react.md +1 -1
- package/docs/en/intlayer_with_vite+solid.md +1 -1
- package/docs/en/intlayer_with_vite+svelte.md +1 -1
- package/docs/en/intlayer_with_vite+vue.md +1 -1
- package/docs/en/plugins/sync-json.md +1 -1
- package/docs/en/roadmap.md +1 -1
- package/docs/en-GB/plugins/sync-json.md +244 -0
- package/docs/es/plugins/sync-json.md +244 -0
- package/docs/es/releases/v7.md +1 -18
- package/docs/fr/intlayer_with_nextjs_16.md +2 -51
- package/docs/fr/plugins/sync-json.md +244 -0
- package/docs/fr/releases/v7.md +1 -18
- package/docs/hi/intlayer_with_nextjs_16.md +3 -2
- package/docs/hi/plugins/sync-json.md +244 -0
- package/docs/id/plugins/sync-json.md +244 -0
- package/docs/id/releases/v7.md +1 -18
- package/docs/it/plugins/sync-json.md +244 -0
- package/docs/it/releases/v7.md +1 -18
- package/docs/ja/intlayer_with_nextjs_16.md +44 -205
- package/docs/ja/plugins/sync-json.md +244 -0
- package/docs/ja/releases/v7.md +1 -18
- package/docs/ko/plugins/sync-json.md +244 -0
- package/docs/ko/releases/v7.md +1 -18
- package/docs/pl/plugins/sync-json.md +244 -0
- package/docs/pt/intlayer_with_nextjs_16.md +1 -52
- package/docs/pt/plugins/sync-json.md +244 -0
- package/docs/ru/plugins/sync-json.md +244 -0
- package/docs/tr/plugins/sync-json.md +245 -0
- package/docs/vi/plugins/sync-json.md +244 -0
- package/docs/zh/plugins/sync-json.md +244 -0
- package/package.json +14 -14
- package/src/generated/blog.entry.ts +26 -3
- package/src/generated/docs.entry.ts +26 -3
- package/src/generated/frequentQuestions.entry.ts +26 -3
- package/src/generated/legal.entry.ts +26 -3
|
@@ -205,7 +205,7 @@ const RootLayout: FC<PropsWithChildren> = ({ children }) => (
|
|
|
205
205
|
export default RootLayout;
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
-
```jsx {3} fileName="src/app/layout.
|
|
208
|
+
```jsx {3} fileName="src/app/layout.mjs" codeFormat="esm"
|
|
209
209
|
import "./globals.css";
|
|
210
210
|
|
|
211
211
|
const RootLayout = ({ children }) => (
|
|
@@ -216,7 +216,7 @@ const RootLayout = ({ children }) => (
|
|
|
216
216
|
export default RootLayout;
|
|
217
217
|
```
|
|
218
218
|
|
|
219
|
-
```jsx {1,8} fileName="src/app/layout.
|
|
219
|
+
```jsx {1,8} fileName="src/app/layout.cjs" codeFormat="commonjs"
|
|
220
220
|
require("./globals.css");
|
|
221
221
|
|
|
222
222
|
const RootLayout = ({ children }) => (
|
|
@@ -226,26 +226,11 @@ const RootLayout = ({ children }) => (
|
|
|
226
226
|
|
|
227
227
|
module.exports = {
|
|
228
228
|
default: RootLayout,
|
|
229
|
-
generateStaticParams,
|
|
230
229
|
};
|
|
231
230
|
```
|
|
232
231
|
|
|
233
232
|
> `RootLayout` コンポーネントを空のままにしておくことで、`<html>` タグに [`lang`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/lang) および [`dir`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/dir) 属性を設定できます。
|
|
234
233
|
|
|
235
|
-
動的ルーティングを実装するには、`[locale]` ディレクトリに新しいレイアウトを追加してロケールのパスを提供します。
|
|
236
|
-
|
|
237
|
-
````tsx fileName="src/app/[locale]/layout.tsx" codeFormat="typescript"
|
|
238
|
-
import type { NextLayoutIntlayer } from "next-intlayer";
|
|
239
|
-
import { Inter } from "next/font/google";
|
|
240
|
-
import { getHTMLTextDir } from "intlayer";
|
|
241
|
-
|
|
242
|
-
const inter = Inter({ subsets: ["latin"] });
|
|
243
|
-
|
|
244
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
245
|
-
const { locale } = await params;
|
|
246
|
-
return (
|
|
247
|
-
> `RootLayout`コンポーネントを空のままにしておくことで、`<html>`タグに[`lang`](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/lang)および[`dir`](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/dir)属性を設定できます。
|
|
248
|
-
|
|
249
234
|
動的ルーティングを実装するには、`[locale]`ディレクトリに新しいレイアウトを追加してロケールのパスを指定します:
|
|
250
235
|
|
|
251
236
|
```tsx fileName="src/app/[locale]/layout.tsx" codeFormat="typescript"
|
|
@@ -265,14 +250,15 @@ const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
|
265
250
|
};
|
|
266
251
|
|
|
267
252
|
export default LocaleLayout;
|
|
268
|
-
|
|
253
|
+
```
|
|
269
254
|
|
|
270
|
-
```jsx fileName="src/app/[locale]/layout.
|
|
255
|
+
```jsx fileName="src/app/[locale]/layout.mjs" codeFormat="esm"
|
|
256
|
+
import { Inter } from "next/font/google";
|
|
271
257
|
import { getHTMLTextDir } from "intlayer";
|
|
272
258
|
|
|
273
259
|
const inter = Inter({ subsets: ["latin"] });
|
|
274
260
|
|
|
275
|
-
const LocaleLayout = async ({ children, params
|
|
261
|
+
const LocaleLayout = async ({ children, params }) => {
|
|
276
262
|
const { locale } = await params;
|
|
277
263
|
return (
|
|
278
264
|
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
@@ -284,13 +270,13 @@ const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
|
284
270
|
export default LocaleLayout;
|
|
285
271
|
```
|
|
286
272
|
|
|
287
|
-
```jsx fileName="src/app/[locale]/layout.
|
|
273
|
+
```jsx fileName="src/app/[locale]/layout.cjs" codeFormat="commonjs"
|
|
288
274
|
const { Inter } = require("next/font/google");
|
|
289
275
|
const { getHTMLTextDir } = require("intlayer");
|
|
290
276
|
|
|
291
277
|
const inter = Inter({ subsets: ["latin"] });
|
|
292
278
|
|
|
293
|
-
const LocaleLayout = async ({ children, params
|
|
279
|
+
const LocaleLayout = async ({ children, params }) => {
|
|
294
280
|
const { locale } = await params;
|
|
295
281
|
return (
|
|
296
282
|
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
@@ -304,35 +290,8 @@ module.exports = LocaleLayout;
|
|
|
304
290
|
|
|
305
291
|
> `[locale]`パスセグメントはロケールを定義するために使用されます。例:`/en-US/about`は`en-US`を指し、`/fr/about`は`fr`を指します。
|
|
306
292
|
|
|
307
|
-
const inter = Inter({ subsets: ["latin"] });
|
|
308
|
-
|
|
309
|
-
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
310
|
-
const { locale } = await params;
|
|
311
|
-
return (
|
|
312
|
-
|
|
313
|
-
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
314
|
-
<body className={inter.className}>{children}</body>
|
|
315
|
-
</html>
|
|
316
|
-
);
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
module.exports = LocaleLayout;
|
|
320
|
-
|
|
321
|
-
````
|
|
322
|
-
|
|
323
293
|
> `[locale]` パスセグメントはロケールを定義するために使用されます。例:`/en-US/about` は `en-US` を指し、`/fr/about` は `fr` を指します。
|
|
324
294
|
|
|
325
|
-
> この段階で、`Error: Missing <html> and <body> tags in the root layout.` というエラーが発生します。これは、`/app/page.tsx` ファイルがもはや使用されておらず、削除可能であるため予期されるものです。代わりに、`[locale]` パスセグメントが `/app/[locale]/page.tsx` ページを有効にします。その結果、ブラウザ上で `/en`、`/fr`、`/es` のようなパスでページにアクセスできるようになります。デフォルトのロケールをルートページとして設定するには、ステップ7の `proxy` 設定を参照してください。
|
|
326
|
-
|
|
327
|
-
次に、アプリケーションのレイアウトで `generateStaticParams` 関数を実装します。
|
|
328
|
-
|
|
329
|
-
```tsx {1} fileName="src/app/[locale]/layout.tsx" codeFormat="typescript"
|
|
330
|
-
export { generateStaticParams } from "next-intlayer"; // 挿入する行
|
|
331
|
-
|
|
332
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
333
|
-
/*... 残りのコード */
|
|
334
|
-
};
|
|
335
|
-
|
|
336
295
|
> この段階で、`Error: Missing <html> and <body> tags in the root layout.` というエラーが発生します。これは予期されたもので、`/app/page.tsx` ファイルはもはや使用されておらず、削除して問題ありません。代わりに、`[locale]` パスセグメントが `/app/[locale]/page.tsx` ページを有効にします。その結果、ブラウザでは `/en`、`/fr`、`/es` のようなパスでページにアクセスできるようになります。デフォルトのロケールをルートページとして設定するには、ステップ7の `proxy` 設定を参照してください。
|
|
337
296
|
|
|
338
297
|
次に、アプリケーションのレイアウト内で `generateStaticParams` 関数を実装します。
|
|
@@ -345,22 +304,22 @@ const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
|
345
304
|
};
|
|
346
305
|
|
|
347
306
|
export default LocaleLayout;
|
|
348
|
-
|
|
307
|
+
```
|
|
349
308
|
|
|
350
|
-
```jsx {1} fileName="src/app/[locale]/layout.
|
|
309
|
+
```jsx {1} fileName="src/app/[locale]/layout.mjs" codeFormat="esm"
|
|
351
310
|
export { generateStaticParams } from "next-intlayer"; // 挿入する行
|
|
352
311
|
|
|
353
|
-
const LocaleLayout = async ({ children, params
|
|
312
|
+
const LocaleLayout = async ({ children, params }) => {
|
|
354
313
|
/*... 残りのコード */
|
|
355
314
|
};
|
|
356
315
|
|
|
357
|
-
|
|
316
|
+
export default LocaleLayout;
|
|
358
317
|
```
|
|
359
318
|
|
|
360
|
-
```jsx {1,7} fileName="src/app/[locale]/layout.
|
|
319
|
+
```jsx {1,7} fileName="src/app/[locale]/layout.cjs" codeFormat="commonjs"
|
|
361
320
|
const { generateStaticParams } = require("next-intlayer"); // 挿入する行
|
|
362
321
|
|
|
363
|
-
const LocaleLayout = async ({ children, params
|
|
322
|
+
const LocaleLayout = async ({ children, params }) => {
|
|
364
323
|
/*... 残りのコード */
|
|
365
324
|
};
|
|
366
325
|
|
|
@@ -378,23 +337,6 @@ module.exports = { default: LocaleLayout, generateStaticParams };
|
|
|
378
337
|
```tsx fileName="src/app/[locale]/page.content.ts" contentDeclarationFormat="typescript"
|
|
379
338
|
import { t, type Dictionary } from "intlayer";
|
|
380
339
|
|
|
381
|
-
const pageContent = {
|
|
382
|
-
key: "page",
|
|
383
|
-
content: {
|
|
384
|
-
getStarted: {
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
> `generateStaticParams` は、すべてのロケールに必要なページを事前にビルドすることを保証し、実行時の計算を減らしてユーザー体験を向上させます。詳細については、[Next.js の generateStaticParams に関するドキュメント](https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic-rendering#generate-static-params)を参照してください。
|
|
388
|
-
|
|
389
|
-
> Intlayer は `export const dynamic = 'force-static';` と連携して、すべてのロケールのページが事前にビルドされるようにします。
|
|
390
|
-
|
|
391
|
-
### ステップ5: コンテンツを宣言する
|
|
392
|
-
|
|
393
|
-
翻訳を格納するためのコンテンツ宣言を作成および管理します:
|
|
394
|
-
|
|
395
|
-
```tsx fileName="src/app/[locale]/page.content.ts" contentDeclarationFormat="typescript"
|
|
396
|
-
import { t, type Dictionary } from "intlayer";
|
|
397
|
-
|
|
398
340
|
const pageContent = {
|
|
399
341
|
key: "page",
|
|
400
342
|
content: {
|
|
@@ -470,25 +412,6 @@ module.exports = pageContent;
|
|
|
470
412
|
"pageLink": "src/app/page.tsx"
|
|
471
413
|
}
|
|
472
414
|
}
|
|
473
|
-
const { t } = require("intlayer");
|
|
474
|
-
|
|
475
|
-
/** @type {import('intlayer').Dictionary} */
|
|
476
|
-
const pageContent = {
|
|
477
|
-
key: "page",
|
|
478
|
-
content: {
|
|
479
|
-
getStarted: {
|
|
480
|
-
main: t({
|
|
481
|
-
en: "Get started by editing",
|
|
482
|
-
fr: "Commencez par éditer",
|
|
483
|
-
es: "Comience por editar",
|
|
484
|
-
ja: "編集を始めてください",
|
|
485
|
-
}),
|
|
486
|
-
pageLink: "src/app/page.tsx",
|
|
487
|
-
},
|
|
488
|
-
},
|
|
489
|
-
};
|
|
490
|
-
|
|
491
|
-
module.exports = pageContent;
|
|
492
415
|
```
|
|
493
416
|
|
|
494
417
|
```json fileName="src/app/[locale]/page.content.json" contentDeclarationFormat="json"
|
|
@@ -554,7 +477,7 @@ const Page: NextPageIntlayer = async ({ params }) => {
|
|
|
554
477
|
export default Page;
|
|
555
478
|
```
|
|
556
479
|
|
|
557
|
-
```jsx fileName="src/app/[locale]/page.
|
|
480
|
+
```jsx fileName="src/app/[locale]/page.mjs" codeFormat="esm"
|
|
558
481
|
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
559
482
|
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
560
483
|
import { IntlayerClientProvider } from "next-intlayer";
|
|
@@ -589,11 +512,15 @@ const Page = async ({ params }) => {
|
|
|
589
512
|
export default Page;
|
|
590
513
|
```
|
|
591
514
|
|
|
592
|
-
```jsx fileName="src/app/[locale]/page.
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
515
|
+
```jsx fileName="src/app/[locale]/page.cjs" codeFormat="commonjs"
|
|
516
|
+
const {
|
|
517
|
+
ClientComponentExample,
|
|
518
|
+
} = require("@components/ClientComponentExample");
|
|
519
|
+
const {
|
|
520
|
+
ServerComponentExample,
|
|
521
|
+
} = require("@components/ServerComponentExample");
|
|
522
|
+
const { IntlayerClientProvider } = require("next-intlayer");
|
|
523
|
+
const { IntlayerServerProvider, useIntlayer } = require("next-intlayer/server");
|
|
597
524
|
|
|
598
525
|
const PageContent = () => {
|
|
599
526
|
const content = useIntlayer("page");
|
|
@@ -620,6 +547,8 @@ const Page = async ({ params }) => {
|
|
|
620
547
|
</IntlayerServerProvider>
|
|
621
548
|
);
|
|
622
549
|
};
|
|
550
|
+
|
|
551
|
+
module.exports = Page;
|
|
623
552
|
```
|
|
624
553
|
|
|
625
554
|
- **`IntlayerClientProvider`** はクライアントサイドのコンポーネントにロケールを提供するために使用されます。レイアウトを含む任意の親コンポーネントに配置できます。ただし、Next.jsはページ間でレイアウトコードを共有するため、レイアウトに配置することが推奨されます。レイアウトで `IntlayerClientProvider` を使用することで、各ページごとに再初期化する必要がなくなり、パフォーマンスが向上し、アプリケーション全体で一貫したローカリゼーションコンテキストを維持できます。
|
|
@@ -627,21 +556,6 @@ const Page = async ({ params }) => {
|
|
|
627
556
|
|
|
628
557
|
> レイアウトとページは共通のサーバーコンテキストを共有できません。なぜなら、サーバーコンテキストシステムはリクエストごとのデータストア([Reactのcache](https://react.dev/reference/react/cache) メカニズム)に基づいており、アプリケーションの異なるセグメントごとに「コンテキスト」が再作成されるためです。プロバイダーを共有レイアウトに配置すると、この分離が破られ、サーバーコンポーネントに正しくサーバーコンテキストの値が伝播されなくなります。
|
|
629
558
|
|
|
630
|
-
> レイアウトとページは共通のサーバーコンテキストを共有できません。なぜなら、サーバーコンテキストシステムはリクエストごとのデータストア([Reactのキャッシュ](https://react.dev/reference/react/cache)メカニズム)に基づいているため、アプリケーションの異なるセグメントごとに各「コンテキスト」が再作成されるからです。プロバイダーを共有レイアウトに配置すると、この分離が破られ、サーバーコンポーネントへのサーバーコンテキスト値の正しい伝播が妨げられます。
|
|
631
|
-
|
|
632
|
-
````tsx {4,7} fileName="src/components/ClientComponentExample.tsx" codeFormat="typescript"
|
|
633
|
-
"use client";
|
|
634
|
-
|
|
635
|
-
import type { FC } from "react";
|
|
636
|
-
import { useIntlayer } from "next-intlayer";
|
|
637
|
-
|
|
638
|
-
export const ClientComponentExample: FC = () => {
|
|
639
|
-
const content = useIntlayer("client-component-example"); // 関連するコンテンツ宣言を作成
|
|
640
|
-
|
|
641
|
-
return (
|
|
642
|
-
<div>
|
|
643
|
-
> レイアウトとページは共通のサーバーコンテキストを共有できません。なぜなら、サーバーコンテキストシステムはリクエストごとのデータストア([Reactのcache](https://react.dev/reference/react/cache)メカニズム)に基づいており、アプリケーションの異なるセグメントごとに各「コンテキスト」が再作成されるためです。プロバイダーを共有レイアウトに配置すると、この分離が破壊され、サーバーコンポーネントへのサーバーコンテキスト値の正しい伝播が妨げられます。
|
|
644
|
-
|
|
645
559
|
```tsx {4,7} fileName="src/components/ClientComponentExample.tsx" codeFormat="typescript"
|
|
646
560
|
"use client";
|
|
647
561
|
|
|
@@ -658,9 +572,9 @@ export const ClientComponentExample: FC = () => {
|
|
|
658
572
|
</div>
|
|
659
573
|
);
|
|
660
574
|
};
|
|
661
|
-
|
|
575
|
+
```
|
|
662
576
|
|
|
663
|
-
```jsx {3,6} fileName="src/components/ClientComponentExample.
|
|
577
|
+
```jsx {3,6} fileName="src/components/ClientComponentExample.mjs" codeFormat="esm"
|
|
664
578
|
"use client";
|
|
665
579
|
|
|
666
580
|
import { useIntlayer } from "next-intlayer";
|
|
@@ -677,7 +591,7 @@ const ClientComponentExample = () => {
|
|
|
677
591
|
};
|
|
678
592
|
```
|
|
679
593
|
|
|
680
|
-
```jsx {3,6} fileName="src/components/ClientComponentExample.
|
|
594
|
+
```jsx {3,6} fileName="src/components/ClientComponentExample.cjs" codeFormat="commonjs"
|
|
681
595
|
"use client";
|
|
682
596
|
|
|
683
597
|
const { useIntlayer } = require("next-intlayer");
|
|
@@ -692,6 +606,8 @@ const ClientComponentExample = () => {
|
|
|
692
606
|
</div>
|
|
693
607
|
);
|
|
694
608
|
};
|
|
609
|
+
|
|
610
|
+
module.exports = ClientComponentExample;
|
|
695
611
|
```
|
|
696
612
|
|
|
697
613
|
```tsx {2} fileName="src/components/ServerComponentExample.tsx" codeFormat="typescript"
|
|
@@ -710,27 +626,12 @@ export const ServerComponentExample: FC = () => {
|
|
|
710
626
|
};
|
|
711
627
|
```
|
|
712
628
|
|
|
713
|
-
```jsx {1} fileName="src/components/ServerComponentExample.
|
|
629
|
+
```jsx {1} fileName="src/components/ServerComponentExample.mjs" codeFormat="esm"
|
|
714
630
|
import { useIntlayer } from "next-intlayer/server";
|
|
715
631
|
|
|
716
632
|
const ServerComponentExample = () => {
|
|
717
633
|
const content = useIntlayer("server-component-example"); // 関連するコンテンツ宣言を作成
|
|
718
634
|
|
|
719
|
-
return (
|
|
720
|
-
<h2>{content.title}</h2>
|
|
721
|
-
<p>{content.content}</p>
|
|
722
|
-
</div>
|
|
723
|
-
);
|
|
724
|
-
};
|
|
725
|
-
```
|
|
726
|
-
|
|
727
|
-
```tsx {2} fileName="src/components/ServerComponentExample.tsx" codeFormat="typescript"
|
|
728
|
-
import type { FC } from "react";
|
|
729
|
-
import { useIntlayer } from "next-intlayer/server";
|
|
730
|
-
|
|
731
|
-
export const ServerComponentExample: FC = () => {
|
|
732
|
-
const content = useIntlayer("server-component-example"); // 関連コンテンツ宣言を作成
|
|
733
|
-
|
|
734
635
|
return (
|
|
735
636
|
<div>
|
|
736
637
|
<h2>{content.title}</h2>
|
|
@@ -738,24 +639,11 @@ export const ServerComponentExample: FC = () => {
|
|
|
738
639
|
</div>
|
|
739
640
|
);
|
|
740
641
|
};
|
|
741
|
-
```
|
|
742
642
|
|
|
743
|
-
|
|
744
|
-
import { useIntlayer } from "next-intlayer/server";
|
|
745
|
-
|
|
746
|
-
const ServerComponentExample = () => {
|
|
747
|
-
const content = useIntlayer("server-component-example"); // 関連コンテンツ宣言を作成
|
|
748
|
-
|
|
749
|
-
return (
|
|
750
|
-
<div>
|
|
751
|
-
<h2>{content.title}</h2>
|
|
752
|
-
<p>{content.content}</p>
|
|
753
|
-
</div>
|
|
754
|
-
);
|
|
755
|
-
};
|
|
643
|
+
export default ServerComponentExample;
|
|
756
644
|
```
|
|
757
645
|
|
|
758
|
-
```jsx {1} fileName="src/components/ServerComponentExample.
|
|
646
|
+
```jsx {1} fileName="src/components/ServerComponentExample.cjs" codeFormat="commonjs"
|
|
759
647
|
const { useIntlayer } = require("next-intlayer/server");
|
|
760
648
|
|
|
761
649
|
const ServerComponentExample = () => {
|
|
@@ -768,6 +656,8 @@ const ServerComponentExample = () => {
|
|
|
768
656
|
</div>
|
|
769
657
|
);
|
|
770
658
|
};
|
|
659
|
+
|
|
660
|
+
module.exports = ServerComponentExample;
|
|
771
661
|
```
|
|
772
662
|
|
|
773
663
|
> コンテンツを `alt`、`title`、`href`、`aria-label` などの `string` 属性で使用したい場合は、関数の値を呼び出す必要があります。例えば:
|
|
@@ -896,36 +786,6 @@ const metadataContent = {
|
|
|
896
786
|
},
|
|
897
787
|
};
|
|
898
788
|
|
|
899
|
-
module.exports = metadataContent;
|
|
900
|
-
fr: "Généré par create next app",
|
|
901
|
-
es: "Generado por create next app",
|
|
902
|
-
}),
|
|
903
|
-
},
|
|
904
|
-
};
|
|
905
|
-
|
|
906
|
-
export default metadataContent;
|
|
907
|
-
```
|
|
908
|
-
|
|
909
|
-
```javascript fileName="src/app/[locale]/metadata.content.cjs" contentDeclarationFormat="commonjs"
|
|
910
|
-
const { t } = require("intlayer");
|
|
911
|
-
|
|
912
|
-
/** @type {import('intlayer').Dictionary<import('next').Metadata>} */
|
|
913
|
-
const metadataContent = {
|
|
914
|
-
key: "page-metadata",
|
|
915
|
-
content: {
|
|
916
|
-
title: t({
|
|
917
|
-
en: "Create Next App",
|
|
918
|
-
fr: "Créer une application Next.js",
|
|
919
|
-
es: "Crear una aplicación Next.js",
|
|
920
|
-
}),
|
|
921
|
-
description: t({
|
|
922
|
-
en: "Generated by create next app",
|
|
923
|
-
fr: "Généré par create next app",
|
|
924
|
-
es: "Generado por create next app",
|
|
925
|
-
}),
|
|
926
|
-
},
|
|
927
|
-
};
|
|
928
|
-
|
|
929
789
|
module.exports = metadataContent;
|
|
930
790
|
```
|
|
931
791
|
|
|
@@ -1089,26 +949,6 @@ module.exports = { generateMetadata };
|
|
|
1089
949
|
|
|
1090
950
|
代わりに、`getTranslation` 関数を使用してメタデータを宣言することもできます。ただし、メタデータの翻訳を自動化し、コンテンツを外部化するためには、コンテンツ宣言ファイルを使用することが推奨されます。
|
|
1091
951
|
|
|
1092
|
-
````typescript fileName="src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx" codeFormat="typescript"
|
|
1093
|
-
import {
|
|
1094
|
-
type IConfigLocales,
|
|
1095
|
-
getTranslation,
|
|
1096
|
-
getMultilingualUrls,
|
|
1097
|
-
} from "intlayer";
|
|
1098
|
-
import type { Metadata } from "next";
|
|
1099
|
-
import type { LocalPromiseParams } from "next-intlayer";
|
|
1100
|
-
|
|
1101
|
-
export const generateMetadata = async ({
|
|
1102
|
-
params,
|
|
1103
|
-
}: LocalPromiseParams): Promise<Metadata> => {
|
|
1104
|
-
const { locale } = await params;
|
|
1105
|
-
const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale);
|
|
1106
|
-
|
|
1107
|
-
return {
|
|
1108
|
-
title: t<string>({
|
|
1109
|
-
en: "My title",
|
|
1110
|
-
代わりに、`getTranslation` 関数を使用してメタデータを宣言することもできます。ただし、メタデータの翻訳を自動化し、コンテンツを外部化するためには、コンテンツ宣言ファイルを使用することを推奨します。
|
|
1111
|
-
|
|
1112
952
|
```typescript fileName="src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx" codeFormat="typescript"
|
|
1113
953
|
import {
|
|
1114
954
|
type IConfigLocales,
|
|
@@ -1139,7 +979,7 @@ export const generateMetadata = async ({
|
|
|
1139
979
|
};
|
|
1140
980
|
|
|
1141
981
|
// ... 残りのコード
|
|
1142
|
-
|
|
982
|
+
```
|
|
1143
983
|
|
|
1144
984
|
```javascript fileName="src/app/[locale]/layout.mjs or src/app/[locale]/page.mjs" codeFormat="esm"
|
|
1145
985
|
import { getTranslation, getMultilingualUrls } from "intlayer";
|
|
@@ -1226,7 +1066,7 @@ const sitemap = (): MetadataRoute.Sitemap => [
|
|
|
1226
1066
|
export default sitemap;
|
|
1227
1067
|
```
|
|
1228
1068
|
|
|
1229
|
-
```jsx fileName="src/app/sitemap.
|
|
1069
|
+
```jsx fileName="src/app/sitemap.mjs" codeFormat="esm"
|
|
1230
1070
|
import { getMultilingualUrls } from "intlayer";
|
|
1231
1071
|
|
|
1232
1072
|
const sitemap = () => [
|
|
@@ -1253,7 +1093,7 @@ const sitemap = () => [
|
|
|
1253
1093
|
export default sitemap;
|
|
1254
1094
|
```
|
|
1255
1095
|
|
|
1256
|
-
```jsx fileName="src/app/sitemap.
|
|
1096
|
+
```jsx fileName="src/app/sitemap.cjs" codeFormat="commonjs"
|
|
1257
1097
|
const { getMultilingualUrls } = require("intlayer");
|
|
1258
1098
|
|
|
1259
1099
|
const sitemap = () => [
|
|
@@ -1301,7 +1141,7 @@ const robots = (): MetadataRoute.Robots => ({
|
|
|
1301
1141
|
export default robots;
|
|
1302
1142
|
```
|
|
1303
1143
|
|
|
1304
|
-
```jsx fileName="src/app/robots.
|
|
1144
|
+
```jsx fileName="src/app/robots.mjs" codeFormat="esm"
|
|
1305
1145
|
import { getMultilingualUrls } from "intlayer";
|
|
1306
1146
|
|
|
1307
1147
|
const getAllMultilingualUrls = (urls) =>
|
|
@@ -1320,7 +1160,7 @@ const robots = () => ({
|
|
|
1320
1160
|
export default robots;
|
|
1321
1161
|
```
|
|
1322
1162
|
|
|
1323
|
-
```jsx fileName="src/app/robots.
|
|
1163
|
+
```jsx fileName="src/app/robots.cjs" codeFormat="commonjs"
|
|
1324
1164
|
const { getMultilingualUrls } = require("intlayer");
|
|
1325
1165
|
|
|
1326
1166
|
// すべての多言語URLを取得する関数
|
|
@@ -1399,7 +1239,7 @@ export const LocaleSwitcher: FC = () => {
|
|
|
1399
1239
|
};
|
|
1400
1240
|
```
|
|
1401
1241
|
|
|
1402
|
-
```jsx fileName="src/components/LocaleSwitcher.
|
|
1242
|
+
```jsx fileName="src/components/LocaleSwitcher.mjs" codeFormat="esm"
|
|
1403
1243
|
"use client";
|
|
1404
1244
|
|
|
1405
1245
|
import {
|
|
@@ -1451,7 +1291,7 @@ export const LocaleSwitcher = () => {
|
|
|
1451
1291
|
};
|
|
1452
1292
|
```
|
|
1453
1293
|
|
|
1454
|
-
```jsx fileName="src/components/LocaleSwitcher.
|
|
1294
|
+
```jsx fileName="src/components/LocaleSwitcher.cjs" codeFormat="commonjs"
|
|
1455
1295
|
"use client";
|
|
1456
1296
|
|
|
1457
1297
|
const {
|
|
@@ -1463,7 +1303,7 @@ const {
|
|
|
1463
1303
|
const { useLocale } = require("next-intlayer");
|
|
1464
1304
|
const Link = require("next/link");
|
|
1465
1305
|
|
|
1466
|
-
|
|
1306
|
+
const LocaleSwitcher = () => {
|
|
1467
1307
|
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1468
1308
|
useLocale();
|
|
1469
1309
|
|
|
@@ -1661,7 +1501,6 @@ const Link = ({ href, children, ...props }) => {
|
|
|
1661
1501
|
|
|
1662
1502
|
#### 動作の仕組み
|
|
1663
1503
|
|
|
1664
|
-
- **外部リンクの検出**:
|
|
1665
1504
|
- **外部リンクの検出**:
|
|
1666
1505
|
ヘルパー関数 `checkIsExternalLink` は、URLが外部リンクかどうかを判定します。外部リンクはローカライズの必要がないため、そのまま変更されません。
|
|
1667
1506
|
|