@intlayer/docs 5.7.8 → 5.8.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.
- package/blog/ar/intlayer_with_next-i18next.md +5 -6
- package/blog/ar/intlayer_with_next-intl.md +3 -4
- package/blog/ar/intlayer_with_react-i18next.md +1 -1
- package/blog/ar/intlayer_with_react-intl.md +1 -1
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +5 -6
- package/blog/de/intlayer_with_react-intl.md +1 -1
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +5 -6
- package/blog/en/intlayer_with_next-intl.md +3 -4
- package/blog/en/intlayer_with_react-i18next.md +1 -1
- package/blog/en/intlayer_with_react-intl.md +1 -1
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +5 -6
- package/blog/en-GB/intlayer_with_next-intl.md +3 -4
- package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
- package/blog/en-GB/intlayer_with_react-intl.md +1 -1
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +5 -6
- package/blog/es/intlayer_with_next-intl.md +3 -4
- package/blog/es/intlayer_with_react-i18next.md +1 -1
- package/blog/es/intlayer_with_react-intl.md +1 -1
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +5 -6
- package/blog/fr/intlayer_with_next-intl.md +3 -4
- package/blog/fr/intlayer_with_react-i18next.md +1 -1
- package/blog/fr/intlayer_with_react-intl.md +1 -1
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +5 -6
- package/blog/hi/intlayer_with_next-intl.md +3 -4
- package/blog/hi/intlayer_with_react-i18next.md +1 -1
- package/blog/hi/intlayer_with_react-intl.md +1 -1
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +5 -6
- package/blog/it/intlayer_with_next-intl.md +3 -4
- package/blog/it/intlayer_with_react-i18next.md +1 -1
- package/blog/it/intlayer_with_react-intl.md +1 -1
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +5 -6
- package/blog/ja/intlayer_with_next-intl.md +3 -4
- package/blog/ja/intlayer_with_react-intl.md +1 -1
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +5 -6
- package/blog/ko/intlayer_with_next-intl.md +3 -4
- package/blog/ko/intlayer_with_react-intl.md +1 -1
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +5 -6
- package/blog/pt/intlayer_with_next-intl.md +3 -4
- package/blog/pt/intlayer_with_react-intl.md +1 -1
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +5 -6
- package/blog/ru/intlayer_with_next-intl.md +3 -4
- package/blog/ru/intlayer_with_react-i18next.md +1 -1
- package/blog/ru/intlayer_with_react-intl.md +1 -1
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +5 -6
- package/blog/zh/intlayer_with_next-intl.md +3 -4
- package/blog/zh/intlayer_with_react-i18next.md +1 -1
- package/blog/zh/intlayer_with_react-intl.md +1 -1
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +41 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +41 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +625 -0
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +159 -49
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +7 -7
- package/docs/ar/packages/intlayer/index.md +3 -3
- package/docs/ar/packages/next-intlayer/index.md +3 -3
- package/docs/de/formatters.md +649 -0
- package/docs/de/interest_of_intlayer.md +161 -47
- package/docs/de/introduction.md +5 -5
- package/docs/de/packages/intlayer/index.md +3 -3
- package/docs/de/packages/next-intlayer/index.md +3 -3
- package/docs/de/packages/react-intlayer/index.md +3 -3
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +618 -0
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +170 -46
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +7 -7
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +5 -5
- package/docs/en/packages/next-intlayer/index.md +5 -5
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +5 -5
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +625 -0
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +157 -53
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/en-GB/packages/intlayer/index.md +3 -3
- package/docs/en-GB/packages/next-intlayer/index.md +3 -3
- package/docs/en-GB/packages/react-intlayer/index.md +3 -3
- package/docs/es/formatters.md +649 -0
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +156 -47
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +5 -5
- package/docs/es/packages/intlayer/index.md +3 -3
- package/docs/es/packages/next-intlayer/index.md +3 -3
- package/docs/fr/formatters.md +649 -0
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +157 -46
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +5 -5
- package/docs/fr/packages/intlayer/index.md +3 -3
- package/docs/fr/packages/next-intlayer/index.md +3 -3
- package/docs/fr/packages/react-intlayer/index.md +3 -3
- package/docs/hi/formatters.md +630 -0
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +155 -42
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +5 -5
- package/docs/hi/packages/intlayer/index.md +3 -3
- package/docs/hi/packages/next-intlayer/index.md +3 -3
- package/docs/hi/packages/react-intlayer/index.md +3 -3
- package/docs/it/formatters.md +647 -0
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +157 -46
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +5 -5
- package/docs/it/packages/intlayer/index.md +3 -3
- package/docs/it/packages/next-intlayer/index.md +3 -3
- package/docs/it/packages/react-intlayer/index.md +3 -3
- package/docs/ja/formatters.md +649 -0
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +154 -48
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +5 -5
- package/docs/ja/packages/intlayer/index.md +3 -3
- package/docs/ja/packages/next-intlayer/index.md +3 -3
- package/docs/ja/packages/react-intlayer/index.md +3 -3
- package/docs/ko/formatters.md +649 -0
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +157 -48
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +5 -5
- package/docs/ko/packages/intlayer/index.md +3 -3
- package/docs/ko/packages/next-intlayer/index.md +3 -3
- package/docs/ko/packages/react-intlayer/index.md +3 -3
- package/docs/pt/formatters.md +625 -0
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/interest_of_intlayer.md +162 -47
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +5 -5
- package/docs/pt/packages/intlayer/index.md +3 -3
- package/docs/pt/packages/next-intlayer/index.md +3 -3
- package/docs/pt/packages/react-intlayer/index.md +3 -3
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +649 -0
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +165 -50
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +8 -8
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +6 -6
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +7 -7
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +7 -7
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +647 -0
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +155 -48
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +5 -5
- package/docs/zh/packages/intlayer/index.md +3 -3
- package/docs/zh/packages/next-intlayer/index.md +3 -3
- package/docs/zh/packages/react-intlayer/index.md +3 -3
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +11 -11
- package/src/generated/blog.entry.ts +41 -0
- package/src/generated/docs.entry.ts +41 -0
|
@@ -23,7 +23,6 @@ next-intl と Intlayer は、Next.js アプリケーション向けに設計さ
|
|
|
23
23
|
それぞれは、3 つの主要な概念を共有しています。
|
|
24
24
|
|
|
25
25
|
1. **コンテンツ宣言**: アプリケーションの翻訳可能なコンテンツを定義するためのメソッド。
|
|
26
|
-
|
|
27
26
|
- Intlayer では `content declaration file` と呼ばれ、構造化データをエクスポートする JSON、JS、または TS ファイルです。詳細は [Intlayer documentation](https://intlayer.org/fr/doc/concept/content) を参照してください。
|
|
28
27
|
- next-intl では `messages` または `locale messages` と呼ばれ、通常は JSON ファイルにあります。詳細は [next-intl documentation](https://github.com/amannn/next-intl) を参照してください。
|
|
29
28
|
|
|
@@ -170,8 +169,8 @@ const content = {
|
|
|
170
169
|
content: {
|
|
171
170
|
helloWorld: t({
|
|
172
171
|
en: "Hello World",
|
|
173
|
-
fr: "Bonjour le monde",
|
|
174
172
|
es: "Hola Mundo",
|
|
173
|
+
fr: "Bonjour le monde",
|
|
175
174
|
}),
|
|
176
175
|
},
|
|
177
176
|
} satisfies Dictionary;
|
|
@@ -188,8 +187,8 @@ const content = {
|
|
|
188
187
|
content: {
|
|
189
188
|
helloWorld: t({
|
|
190
189
|
en: "Hello World",
|
|
191
|
-
fr: "Bonjour le monde",
|
|
192
190
|
es: "Hola Mundo",
|
|
191
|
+
fr: "Bonjour le monde",
|
|
193
192
|
}),
|
|
194
193
|
},
|
|
195
194
|
};
|
|
@@ -205,8 +204,8 @@ module.exports = {
|
|
|
205
204
|
content: {
|
|
206
205
|
helloWorld: t({
|
|
207
206
|
en: "Hello World",
|
|
208
|
-
fr: "Bonjour le monde",
|
|
209
207
|
es: "Hola Mundo",
|
|
208
|
+
fr: "Bonjour le monde",
|
|
210
209
|
}),
|
|
211
210
|
},
|
|
212
211
|
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
4
|
title: next-i18next vs next-intl vs Intlayer
|
|
5
|
-
description: Next.js
|
|
5
|
+
description: Next.jsアプリの国際化(i18n)におけるnext-i18next、next-intl、Intlayerの比較
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- next-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- 国際化
|
|
11
|
-
-
|
|
11
|
+
- ブログ
|
|
12
12
|
- Next.js
|
|
13
13
|
- JavaScript
|
|
14
14
|
- React
|
|
@@ -17,269 +17,146 @@ slugs:
|
|
|
17
17
|
- next-i18next-vs-next-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# next-i18next VS next-intl VS
|
|
20
|
+
# next-i18next VS next-intl VS intlayer | Next.jsの国際化(i18n)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
本ガイドでは、**Next.js**で広く使われている3つのi18nオプション、**next-intl**、**next-i18next**、および**Intlayer**を比較します。
|
|
23
|
+
対象は**Next.js 13+のApp Router**(**React Server Components**対応)で、以下の点を評価します:
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
1. **アーキテクチャとコンテンツの構成**
|
|
26
|
+
2. **TypeScriptと安全性**
|
|
27
|
+
3. **翻訳欠落の取り扱い**
|
|
28
|
+
4. **ルーティングとミドルウェア**
|
|
29
|
+
5. **パフォーマンスと読み込み挙動**
|
|
30
|
+
6. **開発者体験(DX)、ツールとメンテナンス**
|
|
31
|
+
7. **SEOと大規模プロジェクトのスケーラビリティ**
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
2. **TypeScript サポート**
|
|
28
|
-
3. **欠損翻訳の管理**
|
|
29
|
-
4. **サーバーコンポーネントのサポート**
|
|
30
|
-
5. **Next.js のための強化されたルーティングとミドルウェア**
|
|
31
|
-
6. **セットアップの簡易性**
|
|
32
|
-
|
|
33
|
-
このガイドは、特に **Next.js 13+**、**App Router** および **Server Components** に対する強力な選択肢である理由を示す **Intlayer** の **詳細な解説** も提供します。
|
|
33
|
+
> **要約**: いずれのツールもNext.jsアプリのローカライズが可能です。もし**コンポーネント単位のコンテンツ管理**、**厳格なTypeScript型**、**ビルド時の欠落キー検出**、**ツリーシェイク可能な辞書**、そして**一流のApp RouterとSEOヘルパー**を求めるなら、**Intlayer**が最も包括的でモダンな選択肢です。
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
### 1. next-intl
|
|
37
|
+
## 高レベルのポジショニング
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
- **next-intl** - 軽量でシンプルなメッセージフォーマットを提供し、Next.jsとの親和性が高いです。カタログは中央集権的に管理されることが多く、開発者体験はシンプルですが、安全性や大規模なメンテナンスは主にユーザーの責任となります。
|
|
40
|
+
- **next-i18next** - Next.js向けにラップされたi18next。成熟したエコシステムとプラグイン(例:ICU)による機能を備えていますが、設定が冗長になりがちで、プロジェクトが大きくなるにつれてカタログは中央集権化しやすいです。
|
|
41
|
+
- **Intlayer** - Next.js向けのコンポーネント中心のコンテンツモデル、**厳格なTS型付け**、**ビルド時チェック**、**ツリーシェイク**、**組み込みのミドルウェアとSEOヘルパー**、オプションの**ビジュアルエディター/CMS**、および**AI支援翻訳**を提供します。
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
- **TypeScript サポート**: 基本的な TypeScript 統合。一部の型定義は存在しますが、翻訳ファイルから TypeScript 定義を自動生成することに重きを置いてはいません。
|
|
45
|
-
- **欠損翻訳**: 基本的なフォールバックメカニズム。デフォルトでは、キーまたはデフォルトのロケール文字列にフォールバックします。高度な欠損翻訳チェックのための堅牢なツールはありません。
|
|
46
|
-
- **サーバーコンポーネントのサポート**: 一般的には Next.js 13+ で機能しますが、パターンは深いサーバーサイドの使用にはあまり特化していません (例: 複雑な動的ルーティングを伴うサーバーコンポーネント)。
|
|
47
|
-
- **ルーティングとミドルウェア**: ミドルウェアのサポートは可能ですが限られています。通常はロケール検出のために Next.js `Middleware` に依存するか、ロケールパスを再書き込みするための手動設定が必要です。
|
|
48
|
-
- **セットアップの簡易性**: 非常に直感的です。最小限のボイラープレートが必要です。
|
|
43
|
+
---
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
## 機能の比較(Next.jsに特化)
|
|
46
|
+
|
|
47
|
+
| 機能 | `next-intlayer` (Intlayer) | `next-intl` | `next-i18next` |
|
|
48
|
+
| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
49
|
+
| **コンポーネント近くの翻訳** | ✅ はい、各コンポーネントにコンテンツが配置されています | ❌ いいえ | ❌ いいえ |
|
|
50
|
+
| **TypeScript統合** | ✅ 高度、厳密な型が自動生成されます | ✅ 良好 | ⚠️ 基本的 |
|
|
51
|
+
| **翻訳漏れ検出** | ✅ TypeScriptのエラー強調表示およびビルド時のエラー/警告 | ⚠️ 実行時フォールバック | ⚠️ 実行時フォールバック |
|
|
52
|
+
| **リッチコンテンツ(JSX/Markdown/コンポーネント)** | ✅ 直接サポート | ❌ リッチノード向けに設計されていません | ⚠️ 制限あり |
|
|
53
|
+
| **AI搭載翻訳** | ✅ はい、複数のAIプロバイダーをサポート。独自のAPIキーを使用可能。アプリケーションとコンテンツの範囲のコンテキストを考慮します。 | ❌ いいえ | ❌ いいえ |
|
|
54
|
+
| **ビジュアルエディター** | ✅ はい、ローカルのビジュアルエディター+オプションのCMS;コードベースのコンテンツを外部化可能;埋め込み可能 | ❌ いいえ / 外部のローカリゼーションプラットフォーム経由で利用可能 | ❌ いいえ / 外部のローカリゼーションプラットフォーム経由で利用可能 |
|
|
55
|
+
| **ローカライズされたルーティング** | ✅ はい、ローカライズされたパスを標準でサポート(Next.js & Viteで動作) | ✅ 組み込み、App Routerは`[locale]`セグメントをサポート | ✅ 組み込み |
|
|
56
|
+
| **動的ルート生成** | ✅ はい | ✅ はい | ✅ はい |
|
|
57
|
+
| **複数形処理** | ✅ 列挙ベースのパターン | ✅ 良好 | ✅ 良好 |
|
|
58
|
+
| **フォーマット(日時、数値、通貨)** | ✅ 最適化されたフォーマッター(内部でIntlを使用) | ✅ 良好(Intlヘルパー) | ✅ 良好(Intlヘルパー) |
|
|
59
|
+
| **コンテンツフォーマット** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml 作業中) | ✅ .json, .js, .ts | ⚠️ .json |
|
|
60
|
+
| **ICUサポート** | ⚠️ 作業中 | ✅ あり | ⚠️ プラグイン経由(`i18next-icu`) |
|
|
61
|
+
| **SEOヘルパー(hreflang、サイトマップ)** | ✅ 組み込みツール:サイトマップ、robots.txt、メタデータのヘルパー | ✅ 良好 | ✅ 良好 |
|
|
62
|
+
| **エコシステム / コミュニティ** | ⚠️ 小規模だが急速に成長し、反応が良い | ✅ 中規模、Next.jsに特化 | ✅ 中規模、Next.jsに特化 |
|
|
63
|
+
| **サーバーサイドレンダリング&サーバーコンポーネント** | ✅ はい、SSR / Reactサーバーコンポーネント向けに最適化されています | ⚠️ ページレベルでサポートされていますが、子のサーバーコンポーネントに対してt関数をコンポーネントツリーに渡す必要があります | ⚠️ ページレベルでサポートされていますが、子のサーバーコンポーネントに対してt関数をコンポーネントツリーに渡す必要があります |
|
|
64
|
+
| **ツリーシェイキング(使用されるコンテンツのみ読み込み)** | ✅ はい、Babel/SWCプラグインを使用してビルド時にコンポーネント単位で実施されます | ⚠️ 部分的に対応 | ⚠️ 部分的に対応 |
|
|
65
|
+
| **遅延読み込み** | ✅ はい、ロケールごと / 辞書ごと | ✅ はい(ルートごと / ロケールごと)、名前空間管理が必要 | ✅ はい(ルートごと / ロケールごと)、名前空間管理が必要 |
|
|
66
|
+
| **未使用コンテンツの削除** | ✅ はい、ビルド時に辞書ごと | ❌ いいえ、名前空間管理で手動管理可能 | ❌ いいえ、名前空間管理で手動管理可能 |
|
|
67
|
+
| **大規模プロジェクトの管理** | ✅ モジュール化を推奨し、デザインシステムに適している | ✅ セットアップによるモジュール化 | ✅ セットアップによるモジュール化 |
|
|
51
68
|
|
|
52
69
|
---
|
|
53
70
|
|
|
54
|
-
|
|
71
|
+
## 詳細比較
|
|
55
72
|
|
|
56
|
-
|
|
73
|
+
### 1) アーキテクチャとスケーラビリティ
|
|
57
74
|
|
|
58
|
-
-
|
|
59
|
-
- **
|
|
60
|
-
- **欠損翻訳**: i18next は補間/フォールバックを提供します。ただし、欠損翻訳の検出には通常追加の設定やサードパーティプラグインが必要です。
|
|
61
|
-
- **サーバーコンポーネントのサポート**: Next.js 13 に関する基本的な使用法は文書化されていますが、高度な使用法 (例: サーバーコンポーネントとの深い統合、動的ルート生成) は手間がかかる場合があります。
|
|
62
|
-
- **ルーティングとミドルウェア**: Next.js `Middleware` とロケールのサブパスの再書き換えに大きく依存しています。より複雑なセットアップでは、i18next の高度な構成を掘り下げる必要があるかもしれません。
|
|
63
|
-
- **セットアップの簡易性**: i18next に慣れた人には馴染みのあるアプローチです。ただし、高度な i18n 機能が必要な場合 (ネームスペース、複数のフォールバックロケールなど)、ボイラープレートが増加する可能性があります。
|
|
75
|
+
- **next-intl / next-i18next**: ロケールごとの**集中型カタログ**(i18nextでは**ネームスペース**も)をデフォルトとする。初期段階では問題なく機能するが、結合度が高まりキーの変更が頻繁になるにつれて、大きな共有領域となることが多い。
|
|
76
|
+
- **Intlayer**: コードと共に配置された **コンポーネント単位**(または機能単位)の辞書を推奨します。これにより認知負荷が軽減され、UIパーツの複製や移行が容易になり、チーム間の競合も減少します。未使用のコンテンツも自然に見つけやすく、削除しやすくなります。
|
|
64
77
|
|
|
65
|
-
|
|
78
|
+
**重要な理由:** 大規模なコードベースやデザインシステムのセットアップでは、**モジュール化されたコンテンツ**の方がモノリシックなカタログよりもスケールしやすいです。
|
|
66
79
|
|
|
67
80
|
---
|
|
68
81
|
|
|
69
|
-
###
|
|
70
|
-
|
|
71
|
-
**主な焦点**: Next.js **App Router** (12, 13, 14, 15) のために特別に設計された、サーバーコンポーネントと **Turbopack** に内蔵サポートを提供する最新のオープンソース i18n ライブラリ。
|
|
82
|
+
### 2) TypeScript と安全性
|
|
72
83
|
|
|
73
|
-
|
|
84
|
+
- **next-intl**: 安定した TypeScript サポートがありますが、**キーはデフォルトで厳密に型付けされていません**。安全性のパターンは手動で維持する必要があります。
|
|
85
|
+
- **next-i18next**: フックの基本的な型定義がありますが、**厳密なキーの型付けには追加のツールや設定が必要です**。
|
|
86
|
+
- **Intlayer**: コンテンツから**厳密な型を生成**します。**IDEの自動補完**や**コンパイル時のエラー**により、デプロイ前にタイプミスやキーの欠落を検出します。
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
**なぜ重要か:** 強い型付けにより、失敗を**右(ランタイム)**ではなく**左(CI/ビルド時)**にシフトさせます。
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
- これにより、大規模なコードベースでコードがより **モジュール化され、保守性が向上**します。
|
|
79
|
-
|
|
80
|
-
2. **TypeScript サポート**
|
|
81
|
-
|
|
82
|
-
- **自動生成型定義**: コンテンツを定義する瞬間に、Intlayer はオートコンプリートを支え、翻訳エラーをキャッチする型を生成します。
|
|
83
|
-
- 欠 missing Keys やランタイムエラーを最小限に抑え、IDE での **オートコンプリート** を提供します。
|
|
84
|
-
|
|
85
|
-
3. **欠損翻訳の管理**
|
|
90
|
+
---
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
- これにより、言語全体で欠損テキストを誤って出荷することがないようにします。
|
|
92
|
+
### 3) 翻訳欠落の取り扱い
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
- **next-intl / next-i18next**: **ランタイムのフォールバック**に依存(例:キーやデフォルトロケールを表示)。ビルドは失敗しません。
|
|
95
|
+
- **Intlayer**: **ビルド時検出**により、ロケールやキーの欠落に対して**警告/エラー**を出します。
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
- サーバーコンテキストを **孤立させるための特殊なプロバイダー** (`IntlayerServerProvider`, `IntlayerClientProvider`) を提供します (Next.js 13+ を扱う際に重要)。
|
|
97
|
+
**なぜ重要か:** ビルド時にギャップを検出することで、本番環境での「謎の文字列」発生を防ぎ、厳格なリリースゲートに適合します。
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
---
|
|
96
100
|
|
|
97
|
-
|
|
98
|
-
- 最小限の設定でローカライズされたパス (例: `/en-US/about` と `/fr/about`) を動的に処理します。
|
|
99
|
-
- 代替言語リンクを生成するためのヘルパー メソッド `getMultilingualUrls` を提供します (SEO に最適)。
|
|
101
|
+
### 4) ルーティング、ミドルウェア、URL戦略
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- すべての環境変数とコンテンツの監視を **注入** するラッパープラグイン `withIntlayer(nextConfig)`。
|
|
104
|
-
- **大規模なフォールバック構成は不要**, システムは最小限の摩擦で「自動的に機能する」ように構築されています。
|
|
103
|
+
- 3つとも、App Router上の**Next.jsのローカライズルーティング**に対応しています。
|
|
104
|
+
- **Intlayer** はさらに進んで、**i18n ミドルウェア**(ヘッダーやクッキーによるロケール検出)や、ローカライズされた URL や `<link rel="alternate" hreflang="…">` タグを生成するための **ヘルパー** を提供します。
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**重要な理由:** カスタムの接着層が減り、**一貫した UX** と **クリーンな SEO** をロケール間で実現します。
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| **機能** | **next-intl** | **next-i18next** | **Intlayer** |
|
|
113
|
-
| ------------------------------------ | ------------------------------------- | ------------------------------------------------ | ------------------------------------------- |
|
|
114
|
-
| **コンポーネント近くに翻訳を保つ** | 部分的 – 通常は一つのロケールフォルダ | デフォルトではない – 多くの場合 `public/locales` | **はい – 推奨され、簡単** |
|
|
115
|
-
| **TypeScript 自動生成** | 基本的な TS 定義 | 基本的な TS サポート | **はい – 高度なアウトオブボックス** |
|
|
116
|
-
| **欠損翻訳の検出** | 主にフォールバック文字列 | 主にフォールバック文字列 | **はい – ビルド時チェック** |
|
|
117
|
-
| **サーバーコンポーネントのサポート** | 機能するが専門的ではない | サポートされているが冗長になりがち | **特殊なプロバイダーと完全なサポート** |
|
|
118
|
-
| **ルーティングとミドルウェア** | 手動で Next ミドルウェアと統合 | 再書き換え構成を介して提供 | **専用の i18n ミドルウェア + 高度なフック** |
|
|
119
|
-
| **セットアップの複雑性** | シンプル、最小限の構成 | 従来型で、進んだ使用には冗長な場合がある | **一つの構成ファイル & プラグイン** |
|
|
120
|
-
|
|
121
|
-
---
|
|
110
|
+
### 5) サーバーコンポーネント(RSC)との整合性
|
|
122
111
|
|
|
123
|
-
|
|
112
|
+
- **すべて**が Next.js 13+ をサポートしています。
|
|
113
|
+
- **Intlayer** は一貫した API と RSC 向けに設計されたプロバイダーで、**サーバー/クライアントの境界** をスムーズにし、フォーマッターや t 関数をコンポーネントツリー間で渡す必要をなくします。
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
**重要な理由:** より明確なメンタルモデルと、ハイブリッドツリーにおけるエッジケースの減少を実現します。
|
|
126
116
|
|
|
127
|
-
|
|
117
|
+
---
|
|
128
118
|
|
|
129
|
-
|
|
119
|
+
### 6) パフォーマンスと読み込み挙動
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
- **next-intl / next-i18next**: **namespaces**や**ルートレベルの分割**による部分的な制御が可能ですが、管理が甘いと未使用の文字列がバンドルされるリスクがあります。
|
|
122
|
+
- **Intlayer**: ビルド時に**ツリーシェイク**を行い、辞書やロケールごとに**遅延ロード**します。未使用のコンテンツは配信されません。
|
|
132
123
|
|
|
133
|
-
|
|
124
|
+
**なぜ重要か:** 特に多言語サイトで、バンドルサイズが小さくなり、起動が速くなります。
|
|
134
125
|
|
|
135
|
-
|
|
126
|
+
---
|
|
136
127
|
|
|
137
|
-
|
|
128
|
+
### 7) DX(開発者体験)、ツール、メンテナンス
|
|
138
129
|
|
|
139
|
-
|
|
130
|
+
- **next-intl / next-i18next**: 通常、翻訳や編集ワークフローのために外部プラットフォームと連携します。
|
|
131
|
+
- **Intlayer**: **無料のビジュアルエディター**と**オプションのCMS**(Git対応または外部化)を提供します。さらに、コンテンツ作成用の**VSCode拡張機能**や、独自のプロバイダーキーを使った**AI支援翻訳**も備えています。
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
- 標準の `intlayerMiddleware` は深いカスタム再書き込みを必要としません。
|
|
133
|
+
**なぜ重要か:** 運用コストを削減し、開発者とコンテンツ作成者間のフィードバックループを短縮します。
|
|
143
134
|
|
|
144
|
-
|
|
135
|
+
---
|
|
145
136
|
|
|
146
|
-
|
|
147
|
-
- **Server** および **Client** コンポーネントへの明確かつ直感的な使用が可能です。
|
|
137
|
+
## どのツールを選ぶべきか?
|
|
148
138
|
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
- **next-intl** を選ぶのは、**最小限の**ソリューションを求めていて、集中管理されたカタログに慣れており、アプリが**小規模から中規模**の場合です。
|
|
140
|
+
- **next-i18next** を選ぶのは、**i18nextのプラグインエコシステム**(例:プラグインによる高度なICUルール)が必要で、チームがすでにi18nextを知っており、柔軟性のために**より多くの設定**を受け入れられる場合です。
|
|
141
|
+
- **Intlayer** を選ぶのは、**コンポーネント単位のコンテンツ管理**、**厳格なTypeScript**、**ビルド時の保証**、**ツリーシェイキング**、および**ルーティング/SEO/エディタツールが標準搭載**されていることを重視し、特に**Next.js App Router**や**大規模でモジュール化されたコードベース**に適している場合です。
|
|
151
142
|
|
|
152
143
|
---
|
|
153
144
|
|
|
154
|
-
##
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
1. **インストールと構成**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
npm install intlayer next-intlayer
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
// intlayer.config.ts
|
|
169
|
-
import { Locales, type IntlayerConfig } from "intlayer";
|
|
170
|
-
|
|
171
|
-
const config: IntlayerConfig = {
|
|
172
|
-
internationalization: {
|
|
173
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
174
|
-
defaultLocale: Locales.ENGLISH,
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
export default config;
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
2. **プラグインの使用**
|
|
181
|
-
|
|
182
|
-
```ts
|
|
183
|
-
// next.config.mjs
|
|
184
|
-
import { withIntlayer } from "next-intlayer/server";
|
|
185
|
-
|
|
186
|
-
/** @type {import('next').NextConfig} */
|
|
187
|
-
const nextConfig = {};
|
|
188
|
-
|
|
189
|
-
export default withIntlayer(nextConfig);
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
3. **ミドルウェアの追加**
|
|
193
|
-
|
|
194
|
-
```ts
|
|
195
|
-
// src/middleware.ts
|
|
196
|
-
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
197
|
-
|
|
198
|
-
export const config = {
|
|
199
|
-
matcher:
|
|
200
|
-
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
201
|
-
};
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
4. **ローカライズされたレイアウトの作成**
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
// src/app/[locale]/layout.tsx
|
|
208
|
-
import { getHTMLTextDir } from "intlayer";
|
|
209
|
-
import { NextLayoutIntlayer } from "next-intlayer";
|
|
210
|
-
|
|
211
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
212
|
-
const { locale } = params;
|
|
213
|
-
return (
|
|
214
|
-
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
215
|
-
<body>{children}</body>
|
|
216
|
-
</html>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export { generateStaticParams } from "next-intlayer";
|
|
221
|
-
export default LocaleLayout;
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
5. **コンテンツの宣言と使用**
|
|
225
|
-
|
|
226
|
-
```tsx
|
|
227
|
-
// src/app/[locale]/page.content.ts
|
|
228
|
-
import { t } from "intlayer";
|
|
229
|
-
|
|
230
|
-
export default {
|
|
231
|
-
key: "page",
|
|
232
|
-
content: {
|
|
233
|
-
getStarted: {
|
|
234
|
-
main: t({
|
|
235
|
-
en: "Get started by editing",
|
|
236
|
-
fr: "Commencez par éditer",
|
|
237
|
-
es: "Comience por editar",
|
|
238
|
-
}),
|
|
239
|
-
pageLink: "src/app/page.tsx",
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
```tsx
|
|
246
|
-
// src/app/[locale]/page.tsx
|
|
247
|
-
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
248
|
-
import { IntlayerClientProvider, useIntlayer } from "next-intlayer";
|
|
249
|
-
|
|
250
|
-
const PageContent = () => {
|
|
251
|
-
const { content } = useIntlayer("page");
|
|
252
|
-
return (
|
|
253
|
-
<>
|
|
254
|
-
<p>{content.getStarted.main}</p>
|
|
255
|
-
<code>{content.getStarted.pageLink}</code>
|
|
256
|
-
</>
|
|
257
|
-
);
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
export default function Page({ params }) {
|
|
261
|
-
return (
|
|
262
|
-
<IntlayerServerProvider locale={params.locale}>
|
|
263
|
-
<IntlayerClientProvider locale={params.locale}>
|
|
264
|
-
<PageContent />
|
|
265
|
-
</IntlayerClientProvider>
|
|
266
|
-
</IntlayerServerProvider>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
</details>
|
|
145
|
+
## 実践的な移行ノート(next-intl / next-i18next → Intlayer)
|
|
146
|
+
|
|
147
|
+
- **機能ごとに開始**:ルートやコンポーネントを一度に一つずつ**ローカル辞書**に移行します。
|
|
148
|
+
- **旧カタログを並行して維持**:移行中の橋渡しとして使用し、一斉移行は避けます。
|
|
149
|
+
- **厳密なチェックを有効化**:ビルド時の検出で早期にギャップを明らかにします。
|
|
150
|
+
- **ミドルウェアとヘルパーを採用**:サイト全体でロケール検出とSEOタグを標準化します。
|
|
151
|
+
- **バンドルサイズを測定**:未使用のコンテンツが削除されるため、**バンドルサイズの削減**が期待できます。
|
|
272
152
|
|
|
273
153
|
---
|
|
274
154
|
|
|
275
155
|
## 結論
|
|
276
156
|
|
|
277
|
-
|
|
157
|
+
3つのライブラリはすべてコアなローカリゼーションに成功しています。違いは、**モダンな Next.js で堅牢でスケーラブルなセットアップを実現するためにどれだけの作業が必要か**です:
|
|
278
158
|
|
|
279
|
-
-
|
|
280
|
-
-
|
|
281
|
-
- **強力な TypeScript** 自動生成による安全なコード
|
|
282
|
-
- **欠損翻訳をビルド時に処理**
|
|
283
|
-
- **高度なルーティングとミドルウェアによる**単純化された、単一の構成アプローチを提供
|
|
159
|
+
- **Intlayer**では、**モジュラーコンテンツ**、**厳格なTS**、**ビルド時の安全性**、**ツリーシェイクされたバンドル**、そして**一流のApp Router + SEOツール**が**デフォルト**であり、手間ではありません。
|
|
160
|
+
- チームが多言語対応のコンポーネント駆動型アプリにおいて**保守性と速度**を重視するなら、Intlayerは今日最も**完全な**体験を提供します。
|
|
284
161
|
|
|
285
|
-
|
|
162
|
+
詳細は[『なぜIntlayerか?』ドキュメント](https://intlayer.org/doc/why)を参照してください。
|