@intlayer/docs 9.4.2 → 9.4.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/date_time_number_formatting_locales.md +216 -0
- package/blog/ar/detecting_missing_translations.md +202 -0
- package/blog/ar/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/ar/i18n_meaning.md +0 -2
- package/blog/ar/i18n_testing_strategies.md +179 -0
- package/blog/ar/intlayer_with_i18next.md +3 -3
- package/blog/ar/intlayer_with_next-i18next.md +3 -3
- package/blog/ar/intlayer_with_next-intl.md +3 -3
- package/blog/ar/intlayer_with_react-i18next.md +3 -3
- package/blog/ar/intlayer_with_react-intl.md +3 -3
- package/blog/ar/intlayer_with_vue-i18n.md +3 -3
- package/blog/ar/is_i18next_outdated.md +315 -0
- package/blog/ar/is_next-intl_outdated.md +363 -0
- package/blog/ar/is_vue-i18n_outdated.md +338 -0
- package/blog/ar/list_i18n_technologies/build-tools/vite.md +177 -0
- package/blog/ar/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/ar/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/ar/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/ar/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/ar/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/ar/what_is_internationalization.md +0 -2
- package/blog/de/date_time_number_formatting_locales.md +216 -0
- package/blog/de/detecting_missing_translations.md +202 -0
- package/blog/de/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/de/i18n_meaning.md +0 -2
- package/blog/de/i18n_testing_strategies.md +179 -0
- package/blog/de/intlayer_with_i18next.md +3 -3
- package/blog/de/intlayer_with_next-i18next.md +3 -3
- package/blog/de/intlayer_with_next-intl.md +3 -3
- package/blog/de/intlayer_with_react-i18next.md +3 -3
- package/blog/de/intlayer_with_react-intl.md +3 -3
- package/blog/de/intlayer_with_vue-i18n.md +3 -3
- package/blog/de/is_i18next_outdated.md +315 -0
- package/blog/de/is_next-intl_outdated.md +363 -0
- package/blog/de/is_vue-i18n_outdated.md +338 -0
- package/blog/de/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/de/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/de/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/de/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/de/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/de/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/de/what_is_internationalization.md +0 -2
- package/blog/en/date_time_number_formatting_locales.md +216 -0
- package/blog/en/detecting_missing_translations.md +202 -0
- package/blog/en/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/en/i18n_meaning.md +0 -2
- package/blog/en/i18n_testing_strategies.md +179 -0
- package/blog/en/icu_message_format.md +288 -0
- package/blog/en/intlayer_with_i18next.md +3 -3
- package/blog/en/intlayer_with_next-i18next.md +3 -3
- package/blog/en/intlayer_with_next-intl.md +3 -3
- package/blog/en/intlayer_with_react-i18next.md +3 -3
- package/blog/en/intlayer_with_react-intl.md +3 -3
- package/blog/en/intlayer_with_vue-i18n.md +3 -3
- package/blog/en/is_i18next_outdated.md +315 -0
- package/blog/en/is_next-intl_outdated.md +363 -0
- package/blog/en/is_vue-i18n_outdated.md +338 -0
- package/blog/en/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/en/list_i18n_technologies/frameworks/angular.md +184 -108
- package/blog/en/list_i18n_technologies/frameworks/astro.md +268 -0
- package/blog/en/list_i18n_technologies/frameworks/nextjs.md +196 -0
- package/blog/en/list_i18n_technologies/frameworks/nuxt.md +255 -0
- package/blog/en/list_i18n_technologies/frameworks/react-native.md +133 -154
- package/blog/en/list_i18n_technologies/frameworks/react-router.md +331 -0
- package/blog/en/list_i18n_technologies/frameworks/react.md +176 -96
- package/blog/en/list_i18n_technologies/frameworks/solid.md +268 -0
- package/blog/en/list_i18n_technologies/frameworks/svelte.md +156 -88
- package/blog/en/list_i18n_technologies/frameworks/sveltekit.md +235 -0
- package/blog/en/list_i18n_technologies/frameworks/tanstack-start.md +280 -0
- package/blog/en/list_i18n_technologies/frameworks/vue.md +167 -95
- package/blog/en/what_is_internationalization.md +0 -2
- package/blog/en-GB/date_time_number_formatting_locales.md +216 -0
- package/blog/en-GB/detecting_missing_translations.md +202 -0
- package/blog/en-GB/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/en-GB/i18n_meaning.md +0 -2
- package/blog/en-GB/i18n_testing_strategies.md +179 -0
- package/blog/en-GB/intlayer_with_i18next.md +3 -3
- package/blog/en-GB/intlayer_with_next-i18next.md +3 -3
- package/blog/en-GB/intlayer_with_next-intl.md +3 -3
- package/blog/en-GB/intlayer_with_react-i18next.md +3 -3
- package/blog/en-GB/intlayer_with_react-intl.md +3 -3
- package/blog/en-GB/intlayer_with_vue-i18n.md +3 -3
- package/blog/en-GB/is_i18next_outdated.md +315 -0
- package/blog/en-GB/is_next-intl_outdated.md +363 -0
- package/blog/en-GB/is_vue-i18n_outdated.md +338 -0
- package/blog/en-GB/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/en-GB/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/en-GB/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/en-GB/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/en-GB/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/en-GB/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/en-GB/what_is_internationalization.md +0 -2
- package/blog/es/date_time_number_formatting_locales.md +216 -0
- package/blog/es/detecting_missing_translations.md +202 -0
- package/blog/es/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/es/i18n_meaning.md +0 -2
- package/blog/es/i18n_testing_strategies.md +179 -0
- package/blog/es/intlayer_with_i18next.md +3 -3
- package/blog/es/intlayer_with_next-i18next.md +3 -3
- package/blog/es/intlayer_with_next-intl.md +3 -3
- package/blog/es/intlayer_with_react-i18next.md +3 -3
- package/blog/es/intlayer_with_react-intl.md +3 -3
- package/blog/es/intlayer_with_vue-i18n.md +3 -3
- package/blog/es/is_i18next_outdated.md +315 -0
- package/blog/es/is_next-intl_outdated.md +363 -0
- package/blog/es/is_vue-i18n_outdated.md +338 -0
- package/blog/es/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/es/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/es/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/es/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/es/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/es/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/es/what_is_internationalization.md +0 -2
- package/blog/fr/date_time_number_formatting_locales.md +216 -0
- package/blog/fr/detecting_missing_translations.md +202 -0
- package/blog/fr/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/fr/i18n_meaning.md +0 -2
- package/blog/fr/i18n_testing_strategies.md +179 -0
- package/blog/fr/intlayer_with_i18next.md +3 -3
- package/blog/fr/intlayer_with_next-i18next.md +3 -3
- package/blog/fr/intlayer_with_next-intl.md +3 -3
- package/blog/fr/intlayer_with_react-i18next.md +3 -3
- package/blog/fr/intlayer_with_react-intl.md +3 -3
- package/blog/fr/intlayer_with_vue-i18n.md +3 -3
- package/blog/fr/is_i18next_outdated.md +315 -0
- package/blog/fr/is_next-intl_outdated.md +363 -0
- package/blog/fr/is_vue-i18n_outdated.md +338 -0
- package/blog/fr/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/fr/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/fr/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/fr/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/fr/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/fr/what_is_internationalization.md +0 -2
- package/blog/hi/date_time_number_formatting_locales.md +216 -0
- package/blog/hi/detecting_missing_translations.md +202 -0
- package/blog/hi/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/hi/i18n_meaning.md +0 -2
- package/blog/hi/i18n_testing_strategies.md +179 -0
- package/blog/hi/intlayer_with_i18next.md +3 -3
- package/blog/hi/intlayer_with_next-i18next.md +3 -3
- package/blog/hi/intlayer_with_next-intl.md +3 -3
- package/blog/hi/intlayer_with_react-i18next.md +3 -3
- package/blog/hi/intlayer_with_react-intl.md +3 -3
- package/blog/hi/intlayer_with_vue-i18n.md +3 -3
- package/blog/hi/is_i18next_outdated.md +317 -0
- package/blog/hi/is_next-intl_outdated.md +363 -0
- package/blog/hi/is_vue-i18n_outdated.md +338 -0
- package/blog/hi/list_i18n_technologies/build-tools/vite.md +177 -0
- package/blog/hi/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/hi/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/hi/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/hi/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/hi/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/hi/what_is_internationalization.md +0 -2
- package/blog/id/date_time_number_formatting_locales.md +216 -0
- package/blog/id/detecting_missing_translations.md +202 -0
- package/blog/id/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/id/i18n_meaning.md +0 -2
- package/blog/id/i18n_testing_strategies.md +179 -0
- package/blog/id/intlayer_with_i18next.md +3 -3
- package/blog/id/intlayer_with_next-i18next.md +3 -3
- package/blog/id/intlayer_with_next-intl.md +3 -3
- package/blog/id/intlayer_with_react-i18next.md +3 -3
- package/blog/id/intlayer_with_react-intl.md +3 -3
- package/blog/id/intlayer_with_vue-i18n.md +3 -3
- package/blog/id/is_i18next_outdated.md +317 -0
- package/blog/id/is_next-intl_outdated.md +363 -0
- package/blog/id/is_vue-i18n_outdated.md +338 -0
- package/blog/id/list_i18n_technologies/build-tools/vite.md +177 -0
- package/blog/id/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/id/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/id/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/id/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/id/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/id/what_is_internationalization.md +0 -2
- package/blog/it/date_time_number_formatting_locales.md +216 -0
- package/blog/it/detecting_missing_translations.md +202 -0
- package/blog/it/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/it/i18n_meaning.md +0 -2
- package/blog/it/i18n_testing_strategies.md +179 -0
- package/blog/it/intlayer_with_i18next.md +3 -3
- package/blog/it/intlayer_with_next-i18next.md +3 -3
- package/blog/it/intlayer_with_next-intl.md +3 -3
- package/blog/it/intlayer_with_react-i18next.md +3 -3
- package/blog/it/intlayer_with_react-intl.md +3 -3
- package/blog/it/intlayer_with_vue-i18n.md +3 -3
- package/blog/it/is_i18next_outdated.md +315 -0
- package/blog/it/is_next-intl_outdated.md +363 -0
- package/blog/it/is_vue-i18n_outdated.md +338 -0
- package/blog/it/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/it/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/it/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/it/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/it/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/it/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/it/what_is_internationalization.md +0 -2
- package/blog/ja/date_time_number_formatting_locales.md +216 -0
- package/blog/ja/detecting_missing_translations.md +202 -0
- package/blog/ja/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/ja/i18n_meaning.md +0 -2
- package/blog/ja/i18n_testing_strategies.md +179 -0
- package/blog/ja/intlayer_with_i18next.md +3 -3
- package/blog/ja/intlayer_with_next-i18next.md +3 -3
- package/blog/ja/intlayer_with_next-intl.md +3 -3
- package/blog/ja/intlayer_with_react-i18next.md +3 -3
- package/blog/ja/intlayer_with_react-intl.md +3 -3
- package/blog/ja/intlayer_with_vue-i18n.md +3 -3
- package/blog/ja/is_i18next_outdated.md +315 -0
- package/blog/ja/is_next-intl_outdated.md +363 -0
- package/blog/ja/is_vue-i18n_outdated.md +338 -0
- package/blog/ja/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/ja/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/ja/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/ja/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/ja/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/ja/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/ja/what_is_internationalization.md +0 -2
- package/blog/ko/date_time_number_formatting_locales.md +216 -0
- package/blog/ko/detecting_missing_translations.md +202 -0
- package/blog/ko/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/ko/i18n_meaning.md +0 -2
- package/blog/ko/i18n_testing_strategies.md +179 -0
- package/blog/ko/intlayer_with_i18next.md +3 -3
- package/blog/ko/intlayer_with_next-i18next.md +3 -3
- package/blog/ko/intlayer_with_next-intl.md +3 -3
- package/blog/ko/intlayer_with_react-i18next.md +3 -3
- package/blog/ko/intlayer_with_react-intl.md +3 -3
- package/blog/ko/intlayer_with_vue-i18n.md +3 -3
- package/blog/ko/is_i18next_outdated.md +317 -0
- package/blog/ko/is_next-intl_outdated.md +363 -0
- package/blog/ko/is_vue-i18n_outdated.md +338 -0
- package/blog/ko/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/ko/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/ko/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/ko/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/ko/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/ko/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/ko/what_is_internationalization.md +0 -2
- package/blog/pl/date_time_number_formatting_locales.md +216 -0
- package/blog/pl/detecting_missing_translations.md +202 -0
- package/blog/pl/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/pl/i18n_meaning.md +0 -2
- package/blog/pl/i18n_testing_strategies.md +179 -0
- package/blog/pl/intlayer_with_i18next.md +3 -3
- package/blog/pl/intlayer_with_next-i18next.md +3 -3
- package/blog/pl/intlayer_with_next-intl.md +3 -3
- package/blog/pl/intlayer_with_react-i18next.md +3 -3
- package/blog/pl/intlayer_with_react-intl.md +3 -3
- package/blog/pl/intlayer_with_vue-i18n.md +3 -3
- package/blog/pl/is_i18next_outdated.md +315 -0
- package/blog/pl/is_next-intl_outdated.md +363 -0
- package/blog/pl/is_vue-i18n_outdated.md +338 -0
- package/blog/pl/list_i18n_technologies/build-tools/vite.md +177 -0
- package/blog/pl/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/pl/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/pl/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/pl/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/pl/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/pl/what_is_internationalization.md +0 -2
- package/blog/pt/date_time_number_formatting_locales.md +216 -0
- package/blog/pt/detecting_missing_translations.md +202 -0
- package/blog/pt/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/pt/i18n_meaning.md +0 -2
- package/blog/pt/i18n_testing_strategies.md +179 -0
- package/blog/pt/intlayer_with_i18next.md +3 -3
- package/blog/pt/intlayer_with_next-i18next.md +3 -3
- package/blog/pt/intlayer_with_next-intl.md +3 -3
- package/blog/pt/intlayer_with_react-i18next.md +3 -3
- package/blog/pt/intlayer_with_react-intl.md +3 -3
- package/blog/pt/intlayer_with_vue-i18n.md +3 -3
- package/blog/pt/is_i18next_outdated.md +315 -0
- package/blog/pt/is_next-intl_outdated.md +363 -0
- package/blog/pt/is_vue-i18n_outdated.md +338 -0
- package/blog/pt/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/pt/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/pt/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/pt/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/pt/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/pt/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/pt/what_is_internationalization.md +0 -2
- package/blog/ru/date_time_number_formatting_locales.md +216 -0
- package/blog/ru/detecting_missing_translations.md +202 -0
- package/blog/ru/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/ru/i18n_meaning.md +0 -2
- package/blog/ru/i18n_testing_strategies.md +179 -0
- package/blog/ru/intlayer_with_i18next.md +3 -3
- package/blog/ru/intlayer_with_next-i18next.md +3 -3
- package/blog/ru/intlayer_with_next-intl.md +3 -3
- package/blog/ru/intlayer_with_react-i18next.md +3 -3
- package/blog/ru/intlayer_with_react-intl.md +3 -3
- package/blog/ru/intlayer_with_vue-i18n.md +3 -3
- package/blog/ru/is_i18next_outdated.md +315 -0
- package/blog/ru/is_next-intl_outdated.md +363 -0
- package/blog/ru/is_vue-i18n_outdated.md +338 -0
- package/blog/ru/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/ru/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/ru/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/ru/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/ru/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/ru/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/ru/what_is_internationalization.md +0 -2
- package/blog/tr/date_time_number_formatting_locales.md +216 -0
- package/blog/tr/detecting_missing_translations.md +202 -0
- package/blog/tr/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/tr/i18n_meaning.md +0 -2
- package/blog/tr/i18n_testing_strategies.md +179 -0
- package/blog/tr/intlayer_with_i18next.md +3 -3
- package/blog/tr/intlayer_with_next-i18next.md +3 -3
- package/blog/tr/intlayer_with_next-intl.md +3 -3
- package/blog/tr/intlayer_with_react-i18next.md +3 -3
- package/blog/tr/intlayer_with_react-intl.md +3 -3
- package/blog/tr/intlayer_with_vue-i18n.md +3 -3
- package/blog/tr/is_i18next_outdated.md +315 -0
- package/blog/tr/is_next-intl_outdated.md +363 -0
- package/blog/tr/is_vue-i18n_outdated.md +338 -0
- package/blog/tr/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/tr/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/tr/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/tr/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/tr/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/tr/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/tr/what_is_internationalization.md +0 -2
- package/blog/uk/date_time_number_formatting_locales.md +216 -0
- package/blog/uk/detecting_missing_translations.md +202 -0
- package/blog/uk/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/uk/i18n_meaning.md +0 -2
- package/blog/uk/i18n_testing_strategies.md +179 -0
- package/blog/uk/intlayer_with_i18next.md +3 -3
- package/blog/uk/intlayer_with_next-i18next.md +3 -3
- package/blog/uk/intlayer_with_next-intl.md +3 -3
- package/blog/uk/intlayer_with_react-i18next.md +3 -3
- package/blog/uk/intlayer_with_react-intl.md +3 -3
- package/blog/uk/intlayer_with_vue-i18n.md +3 -3
- package/blog/uk/is_i18next_outdated.md +315 -0
- package/blog/uk/is_next-intl_outdated.md +363 -0
- package/blog/uk/is_vue-i18n_outdated.md +338 -0
- package/blog/uk/list_i18n_technologies/build-tools/vite.md +177 -0
- package/blog/uk/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/uk/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/uk/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/uk/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/uk/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/uk/what_is_internationalization.md +0 -2
- package/blog/vi/date_time_number_formatting_locales.md +216 -0
- package/blog/vi/detecting_missing_translations.md +202 -0
- package/blog/vi/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/vi/i18n_meaning.md +0 -2
- package/blog/vi/i18n_testing_strategies.md +179 -0
- package/blog/vi/intlayer_with_i18next.md +3 -3
- package/blog/vi/intlayer_with_next-i18next.md +3 -3
- package/blog/vi/intlayer_with_next-intl.md +3 -3
- package/blog/vi/intlayer_with_react-i18next.md +3 -3
- package/blog/vi/intlayer_with_react-intl.md +3 -3
- package/blog/vi/intlayer_with_vue-i18n.md +3 -3
- package/blog/vi/is_i18next_outdated.md +317 -0
- package/blog/vi/is_next-intl_outdated.md +363 -0
- package/blog/vi/is_vue-i18n_outdated.md +338 -0
- package/blog/vi/list_i18n_technologies/build-tools/vite.md +177 -0
- package/blog/vi/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/vi/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/vi/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/vi/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/vi/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/vi/what_is_internationalization.md +0 -2
- package/blog/zh/date_time_number_formatting_locales.md +216 -0
- package/blog/zh/detecting_missing_translations.md +202 -0
- package/blog/zh/i18n_in_ci_cd_pipelines.md +247 -0
- package/blog/zh/i18n_meaning.md +0 -2
- package/blog/zh/i18n_testing_strategies.md +179 -0
- package/blog/zh/intlayer_with_i18next.md +3 -3
- package/blog/zh/intlayer_with_next-i18next.md +3 -3
- package/blog/zh/intlayer_with_next-intl.md +3 -3
- package/blog/zh/intlayer_with_react-i18next.md +3 -3
- package/blog/zh/intlayer_with_react-intl.md +3 -3
- package/blog/zh/intlayer_with_vue-i18n.md +3 -3
- package/blog/zh/is_i18next_outdated.md +317 -0
- package/blog/zh/is_next-intl_outdated.md +363 -0
- package/blog/zh/is_vue-i18n_outdated.md +338 -0
- package/blog/zh/list_i18n_technologies/build-tools/vite.md +179 -0
- package/blog/zh/list_i18n_technologies/frameworks/angular.md +0 -2
- package/blog/zh/list_i18n_technologies/frameworks/react-native.md +0 -2
- package/blog/zh/list_i18n_technologies/frameworks/react.md +0 -2
- package/blog/zh/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/zh/list_i18n_technologies/frameworks/vue.md +0 -2
- package/blog/zh/what_is_internationalization.md +0 -2
- package/dist/cjs/generated/blog.entry.cjs +320 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +320 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/authors.d.ts +5 -5
- package/dist/types/authors.d.ts.map +1 -1
- package/dist/types/blog.d.ts +10 -11
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts +12 -13
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts +10 -11
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts +10 -11
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +17 -2
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -2
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts +1 -2
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/dist/types/legal.d.ts +10 -11
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +186 -186
- package/docs/ar/intlayer_with_adonisjs.md +3 -3
- package/docs/ar/intlayer_with_analog.md +3 -3
- package/docs/ar/intlayer_with_angular_19.md +3 -3
- package/docs/ar/intlayer_with_angular_21.md +3 -3
- package/docs/ar/intlayer_with_astro.md +3 -3
- package/docs/ar/intlayer_with_astro_lit.md +3 -3
- package/docs/ar/intlayer_with_astro_preact.md +3 -3
- package/docs/ar/intlayer_with_astro_react.md +3 -3
- package/docs/ar/intlayer_with_astro_solid.md +3 -3
- package/docs/ar/intlayer_with_astro_svelte.md +3 -3
- package/docs/ar/intlayer_with_astro_vanilla.md +3 -3
- package/docs/ar/intlayer_with_astro_vue.md +3 -3
- package/docs/ar/intlayer_with_create_react_app.md +3 -3
- package/docs/ar/intlayer_with_elysia.md +4 -4
- package/docs/ar/intlayer_with_express.md +3 -3
- package/docs/ar/intlayer_with_fastify.md +4 -4
- package/docs/ar/intlayer_with_hono.md +3 -3
- package/docs/ar/intlayer_with_lynx+react.md +3 -3
- package/docs/ar/intlayer_with_nestjs.md +3 -3
- package/docs/ar/intlayer_with_next-i18next.md +3 -3
- package/docs/ar/intlayer_with_nextjs_14.md +3 -3
- package/docs/ar/intlayer_with_nextjs_15.md +3 -3
- package/docs/ar/intlayer_with_nextjs_16.md +3 -3
- package/docs/ar/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/ar/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/ar/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/ar/intlayer_with_nuxt.md +3 -3
- package/docs/ar/intlayer_with_react_native+expo.md +3 -3
- package/docs/ar/intlayer_with_react_router_v7.md +3 -3
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +3 -3
- package/docs/ar/intlayer_with_solid_start.md +3 -3
- package/docs/ar/intlayer_with_svelte_kit.md +3 -3
- package/docs/ar/intlayer_with_tanstack+solid.md +3 -3
- package/docs/ar/intlayer_with_tanstack.md +3 -3
- package/docs/ar/intlayer_with_vite+lit.md +3 -3
- package/docs/ar/intlayer_with_vite+preact.md +3 -3
- package/docs/ar/intlayer_with_vite+react.md +3 -3
- package/docs/ar/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/ar/intlayer_with_vite+solid.md +3 -3
- package/docs/ar/intlayer_with_vite+svelte.md +4 -12
- package/docs/ar/intlayer_with_vite+vanilla.md +3 -3
- package/docs/ar/intlayer_with_vite+vue.md +3 -3
- package/docs/ar/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/ar/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/ar/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/ar/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/ar/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/ar/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/bn/bundle_optimization.md +186 -186
- package/docs/bn/intlayer_with_angular_21.md +3 -3
- package/docs/bn/intlayer_with_fastify.md +4 -4
- package/docs/bn/intlayer_with_hono.md +3 -3
- package/docs/bn/intlayer_with_vite+lit.md +3 -3
- package/docs/bn/intlayer_with_vite+vanilla.md +3 -3
- package/docs/cs/bundle_optimization.md +186 -186
- package/docs/cs/intlayer_with_angular_21.md +3 -3
- package/docs/cs/intlayer_with_fastify.md +4 -4
- package/docs/cs/intlayer_with_hono.md +3 -3
- package/docs/cs/intlayer_with_vite+lit.md +3 -3
- package/docs/cs/intlayer_with_vite+vanilla.md +3 -3
- package/docs/de/bundle_optimization.md +186 -186
- package/docs/de/intlayer_with_adonisjs.md +3 -3
- package/docs/de/intlayer_with_analog.md +3 -3
- package/docs/de/intlayer_with_angular_19.md +3 -3
- package/docs/de/intlayer_with_angular_21.md +3 -3
- package/docs/de/intlayer_with_astro.md +3 -3
- package/docs/de/intlayer_with_astro_lit.md +3 -3
- package/docs/de/intlayer_with_astro_preact.md +3 -3
- package/docs/de/intlayer_with_astro_react.md +3 -3
- package/docs/de/intlayer_with_astro_solid.md +3 -3
- package/docs/de/intlayer_with_astro_svelte.md +3 -3
- package/docs/de/intlayer_with_astro_vanilla.md +3 -3
- package/docs/de/intlayer_with_astro_vue.md +3 -3
- package/docs/de/intlayer_with_create_react_app.md +3 -3
- package/docs/de/intlayer_with_elysia.md +4 -4
- package/docs/de/intlayer_with_express.md +3 -3
- package/docs/de/intlayer_with_fastify.md +4 -4
- package/docs/de/intlayer_with_hono.md +3 -3
- package/docs/de/intlayer_with_lynx+react.md +3 -3
- package/docs/de/intlayer_with_nestjs.md +3 -3
- package/docs/de/intlayer_with_next-i18next.md +3 -3
- package/docs/de/intlayer_with_nextjs_14.md +3 -3
- package/docs/de/intlayer_with_nextjs_15.md +3 -3
- package/docs/de/intlayer_with_nextjs_16.md +3 -3
- package/docs/de/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/de/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/de/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/de/intlayer_with_nuxt.md +3 -3
- package/docs/de/intlayer_with_react_native+expo.md +3 -3
- package/docs/de/intlayer_with_react_router_v7.md +3 -3
- package/docs/de/intlayer_with_solid_start.md +3 -3
- package/docs/de/intlayer_with_svelte_kit.md +3 -3
- package/docs/de/intlayer_with_tanstack+solid.md +3 -3
- package/docs/de/intlayer_with_tanstack.md +3 -3
- package/docs/de/intlayer_with_vite+lit.md +3 -3
- package/docs/de/intlayer_with_vite+preact.md +3 -3
- package/docs/de/intlayer_with_vite+react.md +3 -3
- package/docs/de/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/de/intlayer_with_vite+solid.md +3 -3
- package/docs/de/intlayer_with_vite+svelte.md +4 -12
- package/docs/de/intlayer_with_vite+vanilla.md +3 -3
- package/docs/de/intlayer_with_vite+vue.md +3 -3
- package/docs/de/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/de/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/de/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/de/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/de/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/de/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/en/bundle_optimization.md +186 -186
- package/docs/en/intlayer_with_adonisjs.md +3 -3
- package/docs/en/intlayer_with_analog.md +3 -3
- package/docs/en/intlayer_with_angular_19.md +3 -3
- package/docs/en/intlayer_with_angular_21.md +3 -3
- package/docs/en/intlayer_with_astro.md +3 -3
- package/docs/en/intlayer_with_astro_lit.md +3 -3
- package/docs/en/intlayer_with_astro_preact.md +3 -3
- package/docs/en/intlayer_with_astro_react.md +3 -3
- package/docs/en/intlayer_with_astro_solid.md +3 -3
- package/docs/en/intlayer_with_astro_svelte.md +3 -3
- package/docs/en/intlayer_with_astro_vanilla.md +3 -3
- package/docs/en/intlayer_with_astro_vue.md +3 -3
- package/docs/en/intlayer_with_create_react_app.md +3 -3
- package/docs/en/intlayer_with_elysia.md +4 -4
- package/docs/en/intlayer_with_express.md +3 -3
- package/docs/en/intlayer_with_fastify.md +4 -4
- package/docs/en/intlayer_with_hono.md +3 -3
- package/docs/en/intlayer_with_lynx+react.md +3 -3
- package/docs/en/intlayer_with_nestjs.md +3 -3
- package/docs/en/intlayer_with_next-i18next.md +3 -3
- package/docs/en/intlayer_with_nextjs_14.md +3 -3
- package/docs/en/intlayer_with_nextjs_15.md +3 -3
- package/docs/en/intlayer_with_nextjs_16.md +3 -3
- package/docs/en/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/en/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/en/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/en/intlayer_with_nuxt.md +3 -3
- package/docs/en/intlayer_with_react_native+expo.md +3 -3
- package/docs/en/intlayer_with_react_router_v7.md +3 -3
- package/docs/en/intlayer_with_solid_start.md +3 -3
- package/docs/en/intlayer_with_svelte_kit.md +3 -3
- package/docs/en/intlayer_with_tanstack+solid.md +3 -3
- package/docs/en/intlayer_with_tanstack.md +3 -3
- package/docs/en/intlayer_with_vite+lit.md +3 -3
- package/docs/en/intlayer_with_vite+preact.md +3 -3
- package/docs/en/intlayer_with_vite+react.md +3 -3
- package/docs/en/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/en/intlayer_with_vite+solid.md +3 -3
- package/docs/en/intlayer_with_vite+svelte.md +4 -12
- package/docs/en/intlayer_with_vite+vanilla.md +3 -3
- package/docs/en/intlayer_with_vite+vue.md +3 -3
- package/docs/en/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/en/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/en/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/en/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/en/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/en/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/en-GB/bundle_optimization.md +186 -186
- package/docs/en-GB/intlayer_with_adonisjs.md +3 -3
- package/docs/en-GB/intlayer_with_analog.md +3 -3
- package/docs/en-GB/intlayer_with_angular_19.md +3 -3
- package/docs/en-GB/intlayer_with_angular_21.md +3 -3
- package/docs/en-GB/intlayer_with_astro.md +3 -3
- package/docs/en-GB/intlayer_with_astro_lit.md +3 -3
- package/docs/en-GB/intlayer_with_astro_preact.md +3 -3
- package/docs/en-GB/intlayer_with_astro_react.md +3 -3
- package/docs/en-GB/intlayer_with_astro_solid.md +3 -3
- package/docs/en-GB/intlayer_with_astro_svelte.md +3 -3
- package/docs/en-GB/intlayer_with_astro_vanilla.md +3 -3
- package/docs/en-GB/intlayer_with_astro_vue.md +3 -3
- package/docs/en-GB/intlayer_with_create_react_app.md +3 -3
- package/docs/en-GB/intlayer_with_elysia.md +4 -4
- package/docs/en-GB/intlayer_with_express.md +3 -3
- package/docs/en-GB/intlayer_with_fastify.md +4 -4
- package/docs/en-GB/intlayer_with_hono.md +3 -3
- package/docs/en-GB/intlayer_with_lynx+react.md +3 -3
- package/docs/en-GB/intlayer_with_nestjs.md +3 -3
- package/docs/en-GB/intlayer_with_next-i18next.md +3 -3
- package/docs/en-GB/intlayer_with_nextjs_14.md +3 -3
- package/docs/en-GB/intlayer_with_nextjs_15.md +3 -3
- package/docs/en-GB/intlayer_with_nextjs_16.md +3 -3
- package/docs/en-GB/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/en-GB/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/en-GB/intlayer_with_nuxt.md +3 -3
- package/docs/en-GB/intlayer_with_react_native+expo.md +3 -3
- package/docs/en-GB/intlayer_with_react_router_v7.md +3 -3
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +3 -3
- package/docs/en-GB/intlayer_with_solid_start.md +3 -3
- package/docs/en-GB/intlayer_with_svelte_kit.md +3 -3
- package/docs/en-GB/intlayer_with_tanstack+solid.md +3 -3
- package/docs/en-GB/intlayer_with_tanstack.md +3 -3
- package/docs/en-GB/intlayer_with_vite+lit.md +3 -3
- package/docs/en-GB/intlayer_with_vite+preact.md +3 -3
- package/docs/en-GB/intlayer_with_vite+react.md +3 -3
- package/docs/en-GB/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/en-GB/intlayer_with_vite+solid.md +3 -3
- package/docs/en-GB/intlayer_with_vite+svelte.md +4 -12
- package/docs/en-GB/intlayer_with_vite+vanilla.md +3 -3
- package/docs/en-GB/intlayer_with_vite+vue.md +3 -3
- package/docs/en-GB/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/en-GB/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/en-GB/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/en-GB/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/en-GB/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/en-GB/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/es/bundle_optimization.md +186 -186
- package/docs/es/intlayer_with_adonisjs.md +3 -3
- package/docs/es/intlayer_with_analog.md +3 -3
- package/docs/es/intlayer_with_angular_19.md +3 -3
- package/docs/es/intlayer_with_angular_21.md +3 -3
- package/docs/es/intlayer_with_astro.md +3 -3
- package/docs/es/intlayer_with_astro_lit.md +3 -3
- package/docs/es/intlayer_with_astro_preact.md +3 -3
- package/docs/es/intlayer_with_astro_react.md +3 -3
- package/docs/es/intlayer_with_astro_solid.md +3 -3
- package/docs/es/intlayer_with_astro_svelte.md +3 -3
- package/docs/es/intlayer_with_astro_vanilla.md +3 -3
- package/docs/es/intlayer_with_astro_vue.md +3 -3
- package/docs/es/intlayer_with_create_react_app.md +3 -3
- package/docs/es/intlayer_with_elysia.md +4 -4
- package/docs/es/intlayer_with_express.md +3 -3
- package/docs/es/intlayer_with_fastify.md +4 -4
- package/docs/es/intlayer_with_hono.md +3 -3
- package/docs/es/intlayer_with_lynx+react.md +3 -3
- package/docs/es/intlayer_with_nestjs.md +3 -3
- package/docs/es/intlayer_with_next-i18next.md +3 -3
- package/docs/es/intlayer_with_nextjs_14.md +3 -3
- package/docs/es/intlayer_with_nextjs_15.md +3 -3
- package/docs/es/intlayer_with_nextjs_16.md +3 -3
- package/docs/es/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/es/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/es/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/es/intlayer_with_nuxt.md +3 -3
- package/docs/es/intlayer_with_react_native+expo.md +3 -3
- package/docs/es/intlayer_with_react_router_v7.md +3 -3
- package/docs/es/intlayer_with_solid_start.md +3 -3
- package/docs/es/intlayer_with_svelte_kit.md +3 -3
- package/docs/es/intlayer_with_tanstack+solid.md +3 -3
- package/docs/es/intlayer_with_tanstack.md +3 -3
- package/docs/es/intlayer_with_vite+lit.md +3 -3
- package/docs/es/intlayer_with_vite+preact.md +3 -3
- package/docs/es/intlayer_with_vite+react.md +3 -3
- package/docs/es/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/es/intlayer_with_vite+solid.md +3 -3
- package/docs/es/intlayer_with_vite+svelte.md +4 -12
- package/docs/es/intlayer_with_vite+vanilla.md +3 -3
- package/docs/es/intlayer_with_vite+vue.md +3 -3
- package/docs/es/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/es/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/es/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/es/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/es/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/es/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/fr/bundle_optimization.md +186 -186
- package/docs/fr/intlayer_with_adonisjs.md +3 -3
- package/docs/fr/intlayer_with_analog.md +3 -3
- package/docs/fr/intlayer_with_angular_19.md +3 -3
- package/docs/fr/intlayer_with_angular_21.md +3 -3
- package/docs/fr/intlayer_with_astro.md +3 -3
- package/docs/fr/intlayer_with_astro_lit.md +3 -3
- package/docs/fr/intlayer_with_astro_preact.md +3 -3
- package/docs/fr/intlayer_with_astro_react.md +3 -3
- package/docs/fr/intlayer_with_astro_solid.md +3 -3
- package/docs/fr/intlayer_with_astro_svelte.md +3 -3
- package/docs/fr/intlayer_with_astro_vanilla.md +3 -3
- package/docs/fr/intlayer_with_astro_vue.md +3 -3
- package/docs/fr/intlayer_with_create_react_app.md +3 -3
- package/docs/fr/intlayer_with_elysia.md +4 -4
- package/docs/fr/intlayer_with_express.md +3 -3
- package/docs/fr/intlayer_with_fastify.md +4 -4
- package/docs/fr/intlayer_with_hono.md +3 -3
- package/docs/fr/intlayer_with_lynx+react.md +3 -3
- package/docs/fr/intlayer_with_nestjs.md +3 -3
- package/docs/fr/intlayer_with_next-i18next.md +3 -3
- package/docs/fr/intlayer_with_nextjs_14.md +3 -3
- package/docs/fr/intlayer_with_nextjs_15.md +3 -3
- package/docs/fr/intlayer_with_nextjs_16.md +3 -3
- package/docs/fr/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/fr/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/fr/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/fr/intlayer_with_nuxt.md +3 -3
- package/docs/fr/intlayer_with_react_native+expo.md +3 -3
- package/docs/fr/intlayer_with_react_router_v7.md +3 -3
- package/docs/fr/intlayer_with_solid_start.md +3 -3
- package/docs/fr/intlayer_with_svelte_kit.md +3 -3
- package/docs/fr/intlayer_with_tanstack+solid.md +3 -3
- package/docs/fr/intlayer_with_tanstack.md +3 -3
- package/docs/fr/intlayer_with_vite+lit.md +3 -3
- package/docs/fr/intlayer_with_vite+preact.md +3 -3
- package/docs/fr/intlayer_with_vite+react.md +3 -3
- package/docs/fr/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/fr/intlayer_with_vite+solid.md +3 -3
- package/docs/fr/intlayer_with_vite+svelte.md +4 -12
- package/docs/fr/intlayer_with_vite+vanilla.md +3 -3
- package/docs/fr/intlayer_with_vite+vue.md +3 -3
- package/docs/fr/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/fr/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/fr/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/fr/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/fr/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/fr/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/hi/bundle_optimization.md +186 -186
- package/docs/hi/intlayer_with_adonisjs.md +3 -3
- package/docs/hi/intlayer_with_analog.md +3 -3
- package/docs/hi/intlayer_with_angular_19.md +3 -3
- package/docs/hi/intlayer_with_angular_21.md +3 -3
- package/docs/hi/intlayer_with_astro.md +3 -3
- package/docs/hi/intlayer_with_astro_lit.md +3 -3
- package/docs/hi/intlayer_with_astro_preact.md +3 -3
- package/docs/hi/intlayer_with_astro_react.md +3 -3
- package/docs/hi/intlayer_with_astro_solid.md +3 -3
- package/docs/hi/intlayer_with_astro_svelte.md +3 -3
- package/docs/hi/intlayer_with_astro_vanilla.md +3 -3
- package/docs/hi/intlayer_with_astro_vue.md +3 -3
- package/docs/hi/intlayer_with_create_react_app.md +3 -3
- package/docs/hi/intlayer_with_elysia.md +4 -4
- package/docs/hi/intlayer_with_express.md +3 -3
- package/docs/hi/intlayer_with_fastify.md +4 -4
- package/docs/hi/intlayer_with_hono.md +3 -3
- package/docs/hi/intlayer_with_lynx+react.md +3 -3
- package/docs/hi/intlayer_with_nestjs.md +3 -3
- package/docs/hi/intlayer_with_next-i18next.md +3 -3
- package/docs/hi/intlayer_with_nextjs_14.md +3 -3
- package/docs/hi/intlayer_with_nextjs_15.md +3 -3
- package/docs/hi/intlayer_with_nextjs_16.md +3 -3
- package/docs/hi/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/hi/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/hi/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/hi/intlayer_with_nuxt.md +3 -3
- package/docs/hi/intlayer_with_react_native+expo.md +3 -3
- package/docs/hi/intlayer_with_react_router_v7.md +3 -3
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +3 -3
- package/docs/hi/intlayer_with_solid_start.md +3 -3
- package/docs/hi/intlayer_with_svelte_kit.md +3 -3
- package/docs/hi/intlayer_with_tanstack+solid.md +3 -3
- package/docs/hi/intlayer_with_tanstack.md +3 -3
- package/docs/hi/intlayer_with_vite+lit.md +3 -3
- package/docs/hi/intlayer_with_vite+preact.md +3 -3
- package/docs/hi/intlayer_with_vite+react.md +3 -3
- package/docs/hi/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/hi/intlayer_with_vite+solid.md +3 -3
- package/docs/hi/intlayer_with_vite+svelte.md +4 -12
- package/docs/hi/intlayer_with_vite+vanilla.md +3 -3
- package/docs/hi/intlayer_with_vite+vue.md +3 -3
- package/docs/hi/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/hi/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/hi/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/hi/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/hi/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/hi/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/hi/packages/intlayer/index.md +3 -3
- package/docs/id/bundle_optimization.md +186 -186
- package/docs/id/intlayer_with_adonisjs.md +3 -3
- package/docs/id/intlayer_with_analog.md +3 -3
- package/docs/id/intlayer_with_angular_19.md +3 -3
- package/docs/id/intlayer_with_angular_21.md +3 -3
- package/docs/id/intlayer_with_astro.md +3 -3
- package/docs/id/intlayer_with_astro_lit.md +3 -3
- package/docs/id/intlayer_with_astro_preact.md +3 -3
- package/docs/id/intlayer_with_astro_react.md +3 -3
- package/docs/id/intlayer_with_astro_solid.md +3 -3
- package/docs/id/intlayer_with_astro_svelte.md +3 -3
- package/docs/id/intlayer_with_astro_vanilla.md +3 -3
- package/docs/id/intlayer_with_astro_vue.md +3 -3
- package/docs/id/intlayer_with_create_react_app.md +3 -3
- package/docs/id/intlayer_with_elysia.md +4 -4
- package/docs/id/intlayer_with_express.md +3 -3
- package/docs/id/intlayer_with_fastify.md +4 -4
- package/docs/id/intlayer_with_hono.md +3 -3
- package/docs/id/intlayer_with_lynx+react.md +3 -3
- package/docs/id/intlayer_with_nestjs.md +3 -3
- package/docs/id/intlayer_with_next-i18next.md +3 -3
- package/docs/id/intlayer_with_nextjs_14.md +3 -3
- package/docs/id/intlayer_with_nextjs_15.md +3 -3
- package/docs/id/intlayer_with_nextjs_16.md +3 -3
- package/docs/id/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/id/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/id/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/id/intlayer_with_nuxt.md +3 -3
- package/docs/id/intlayer_with_react_native+expo.md +3 -3
- package/docs/id/intlayer_with_react_router_v7.md +3 -3
- package/docs/id/intlayer_with_solid_start.md +3 -3
- package/docs/id/intlayer_with_svelte_kit.md +3 -3
- package/docs/id/intlayer_with_tanstack+solid.md +3 -3
- package/docs/id/intlayer_with_tanstack.md +3 -3
- package/docs/id/intlayer_with_vite+lit.md +3 -3
- package/docs/id/intlayer_with_vite+preact.md +3 -3
- package/docs/id/intlayer_with_vite+react.md +3 -3
- package/docs/id/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/id/intlayer_with_vite+solid.md +3 -3
- package/docs/id/intlayer_with_vite+svelte.md +4 -12
- package/docs/id/intlayer_with_vite+vanilla.md +3 -3
- package/docs/id/intlayer_with_vite+vue.md +3 -3
- package/docs/id/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/id/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/id/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/id/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/id/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/id/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/it/bundle_optimization.md +186 -186
- package/docs/it/intlayer_with_adonisjs.md +3 -3
- package/docs/it/intlayer_with_analog.md +3 -3
- package/docs/it/intlayer_with_angular_19.md +3 -3
- package/docs/it/intlayer_with_angular_21.md +3 -3
- package/docs/it/intlayer_with_astro.md +3 -3
- package/docs/it/intlayer_with_astro_lit.md +3 -3
- package/docs/it/intlayer_with_astro_preact.md +3 -3
- package/docs/it/intlayer_with_astro_react.md +3 -3
- package/docs/it/intlayer_with_astro_solid.md +3 -3
- package/docs/it/intlayer_with_astro_svelte.md +3 -3
- package/docs/it/intlayer_with_astro_vanilla.md +3 -3
- package/docs/it/intlayer_with_astro_vue.md +3 -3
- package/docs/it/intlayer_with_create_react_app.md +3 -3
- package/docs/it/intlayer_with_elysia.md +4 -4
- package/docs/it/intlayer_with_express.md +3 -3
- package/docs/it/intlayer_with_fastify.md +4 -4
- package/docs/it/intlayer_with_hono.md +3 -3
- package/docs/it/intlayer_with_lynx+react.md +3 -3
- package/docs/it/intlayer_with_nestjs.md +3 -3
- package/docs/it/intlayer_with_next-i18next.md +3 -3
- package/docs/it/intlayer_with_nextjs_14.md +3 -3
- package/docs/it/intlayer_with_nextjs_15.md +3 -3
- package/docs/it/intlayer_with_nextjs_16.md +3 -3
- package/docs/it/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/it/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/it/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/it/intlayer_with_nuxt.md +3 -3
- package/docs/it/intlayer_with_react_native+expo.md +3 -3
- package/docs/it/intlayer_with_react_router_v7.md +3 -3
- package/docs/it/intlayer_with_solid_start.md +3 -3
- package/docs/it/intlayer_with_svelte_kit.md +3 -3
- package/docs/it/intlayer_with_tanstack+solid.md +3 -3
- package/docs/it/intlayer_with_tanstack.md +3 -3
- package/docs/it/intlayer_with_vite+lit.md +3 -3
- package/docs/it/intlayer_with_vite+preact.md +3 -3
- package/docs/it/intlayer_with_vite+react.md +3 -3
- package/docs/it/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/it/intlayer_with_vite+solid.md +3 -3
- package/docs/it/intlayer_with_vite+svelte.md +4 -12
- package/docs/it/intlayer_with_vite+vanilla.md +3 -3
- package/docs/it/intlayer_with_vite+vue.md +3 -3
- package/docs/it/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/it/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/it/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/it/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/it/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/it/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/ja/bundle_optimization.md +186 -186
- package/docs/ja/intlayer_with_adonisjs.md +3 -3
- package/docs/ja/intlayer_with_analog.md +3 -3
- package/docs/ja/intlayer_with_angular_19.md +3 -3
- package/docs/ja/intlayer_with_angular_21.md +3 -3
- package/docs/ja/intlayer_with_astro.md +3 -3
- package/docs/ja/intlayer_with_astro_lit.md +3 -3
- package/docs/ja/intlayer_with_astro_preact.md +3 -3
- package/docs/ja/intlayer_with_astro_react.md +3 -3
- package/docs/ja/intlayer_with_astro_solid.md +3 -3
- package/docs/ja/intlayer_with_astro_svelte.md +3 -3
- package/docs/ja/intlayer_with_astro_vanilla.md +3 -3
- package/docs/ja/intlayer_with_astro_vue.md +3 -3
- package/docs/ja/intlayer_with_create_react_app.md +3 -3
- package/docs/ja/intlayer_with_elysia.md +4 -4
- package/docs/ja/intlayer_with_express.md +3 -3
- package/docs/ja/intlayer_with_fastify.md +4 -4
- package/docs/ja/intlayer_with_hono.md +3 -3
- package/docs/ja/intlayer_with_lynx+react.md +3 -3
- package/docs/ja/intlayer_with_nestjs.md +3 -3
- package/docs/ja/intlayer_with_next-i18next.md +3 -3
- package/docs/ja/intlayer_with_nextjs_14.md +3 -3
- package/docs/ja/intlayer_with_nextjs_15.md +3 -3
- package/docs/ja/intlayer_with_nextjs_16.md +3 -3
- package/docs/ja/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/ja/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/ja/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/ja/intlayer_with_nuxt.md +3 -3
- package/docs/ja/intlayer_with_react_native+expo.md +3 -3
- package/docs/ja/intlayer_with_react_router_v7.md +3 -3
- package/docs/ja/intlayer_with_solid_start.md +3 -3
- package/docs/ja/intlayer_with_svelte_kit.md +3 -3
- package/docs/ja/intlayer_with_tanstack+solid.md +3 -3
- package/docs/ja/intlayer_with_tanstack.md +3 -3
- package/docs/ja/intlayer_with_vite+lit.md +3 -3
- package/docs/ja/intlayer_with_vite+preact.md +3 -3
- package/docs/ja/intlayer_with_vite+react.md +3 -3
- package/docs/ja/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/ja/intlayer_with_vite+solid.md +3 -3
- package/docs/ja/intlayer_with_vite+svelte.md +4 -12
- package/docs/ja/intlayer_with_vite+vanilla.md +3 -3
- package/docs/ja/intlayer_with_vite+vue.md +3 -3
- package/docs/ja/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/ja/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/ja/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/ja/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/ja/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/ja/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/ko/bundle_optimization.md +186 -186
- package/docs/ko/intlayer_with_adonisjs.md +3 -3
- package/docs/ko/intlayer_with_analog.md +3 -3
- package/docs/ko/intlayer_with_angular_19.md +3 -3
- package/docs/ko/intlayer_with_angular_21.md +3 -3
- package/docs/ko/intlayer_with_astro.md +3 -3
- package/docs/ko/intlayer_with_astro_lit.md +3 -3
- package/docs/ko/intlayer_with_astro_preact.md +3 -3
- package/docs/ko/intlayer_with_astro_react.md +3 -3
- package/docs/ko/intlayer_with_astro_solid.md +3 -3
- package/docs/ko/intlayer_with_astro_svelte.md +3 -3
- package/docs/ko/intlayer_with_astro_vanilla.md +3 -3
- package/docs/ko/intlayer_with_astro_vue.md +3 -3
- package/docs/ko/intlayer_with_create_react_app.md +3 -3
- package/docs/ko/intlayer_with_elysia.md +4 -4
- package/docs/ko/intlayer_with_express.md +3 -3
- package/docs/ko/intlayer_with_fastify.md +4 -4
- package/docs/ko/intlayer_with_hono.md +3 -3
- package/docs/ko/intlayer_with_lynx+react.md +3 -3
- package/docs/ko/intlayer_with_nestjs.md +3 -3
- package/docs/ko/intlayer_with_next-i18next.md +3 -3
- package/docs/ko/intlayer_with_nextjs_14.md +3 -3
- package/docs/ko/intlayer_with_nextjs_15.md +3 -3
- package/docs/ko/intlayer_with_nextjs_16.md +3 -3
- package/docs/ko/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/ko/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/ko/intlayer_with_nuxt.md +3 -3
- package/docs/ko/intlayer_with_react_native+expo.md +3 -3
- package/docs/ko/intlayer_with_react_router_v7.md +3 -3
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +3 -3
- package/docs/ko/intlayer_with_solid_start.md +3 -3
- package/docs/ko/intlayer_with_svelte_kit.md +3 -3
- package/docs/ko/intlayer_with_tanstack+solid.md +3 -3
- package/docs/ko/intlayer_with_tanstack.md +3 -3
- package/docs/ko/intlayer_with_vite+lit.md +3 -3
- package/docs/ko/intlayer_with_vite+preact.md +3 -3
- package/docs/ko/intlayer_with_vite+react.md +3 -3
- package/docs/ko/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/ko/intlayer_with_vite+solid.md +3 -3
- package/docs/ko/intlayer_with_vite+svelte.md +4 -12
- package/docs/ko/intlayer_with_vite+vanilla.md +3 -3
- package/docs/ko/intlayer_with_vite+vue.md +3 -3
- package/docs/ko/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/ko/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/ko/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/ko/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/ko/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/ko/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/nl/bundle_optimization.md +186 -186
- package/docs/nl/intlayer_with_angular_21.md +3 -3
- package/docs/nl/intlayer_with_fastify.md +4 -4
- package/docs/nl/intlayer_with_hono.md +3 -3
- package/docs/nl/intlayer_with_vite+lit.md +3 -3
- package/docs/nl/intlayer_with_vite+vanilla.md +3 -3
- package/docs/pl/bundle_optimization.md +186 -186
- package/docs/pl/intlayer_with_adonisjs.md +3 -3
- package/docs/pl/intlayer_with_analog.md +3 -3
- package/docs/pl/intlayer_with_angular_19.md +3 -3
- package/docs/pl/intlayer_with_angular_21.md +3 -3
- package/docs/pl/intlayer_with_astro.md +3 -3
- package/docs/pl/intlayer_with_astro_lit.md +3 -3
- package/docs/pl/intlayer_with_astro_preact.md +3 -3
- package/docs/pl/intlayer_with_astro_react.md +3 -3
- package/docs/pl/intlayer_with_astro_solid.md +3 -3
- package/docs/pl/intlayer_with_astro_svelte.md +3 -3
- package/docs/pl/intlayer_with_astro_vanilla.md +3 -3
- package/docs/pl/intlayer_with_astro_vue.md +3 -3
- package/docs/pl/intlayer_with_create_react_app.md +3 -3
- package/docs/pl/intlayer_with_elysia.md +4 -4
- package/docs/pl/intlayer_with_express.md +3 -3
- package/docs/pl/intlayer_with_fastify.md +4 -4
- package/docs/pl/intlayer_with_hono.md +3 -3
- package/docs/pl/intlayer_with_lynx+react.md +3 -3
- package/docs/pl/intlayer_with_nestjs.md +3 -3
- package/docs/pl/intlayer_with_next-i18next.md +3 -3
- package/docs/pl/intlayer_with_nextjs_14.md +3 -3
- package/docs/pl/intlayer_with_nextjs_15.md +3 -3
- package/docs/pl/intlayer_with_nextjs_16.md +3 -3
- package/docs/pl/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/pl/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/pl/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/pl/intlayer_with_nuxt.md +3 -3
- package/docs/pl/intlayer_with_react_native+expo.md +3 -3
- package/docs/pl/intlayer_with_react_router_v7.md +3 -3
- package/docs/pl/intlayer_with_solid_start.md +3 -3
- package/docs/pl/intlayer_with_svelte_kit.md +3 -3
- package/docs/pl/intlayer_with_tanstack+solid.md +3 -3
- package/docs/pl/intlayer_with_tanstack.md +3 -3
- package/docs/pl/intlayer_with_vite+lit.md +3 -3
- package/docs/pl/intlayer_with_vite+preact.md +3 -3
- package/docs/pl/intlayer_with_vite+react.md +3 -3
- package/docs/pl/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/pl/intlayer_with_vite+solid.md +3 -3
- package/docs/pl/intlayer_with_vite+svelte.md +4 -12
- package/docs/pl/intlayer_with_vite+vanilla.md +3 -3
- package/docs/pl/intlayer_with_vite+vue.md +3 -3
- package/docs/pl/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/pl/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/pl/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/pl/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/pl/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/pt/bundle_optimization.md +186 -186
- package/docs/pt/intlayer_with_adonisjs.md +3 -3
- package/docs/pt/intlayer_with_analog.md +3 -3
- package/docs/pt/intlayer_with_angular_19.md +3 -3
- package/docs/pt/intlayer_with_angular_21.md +3 -3
- package/docs/pt/intlayer_with_astro.md +3 -3
- package/docs/pt/intlayer_with_astro_lit.md +3 -3
- package/docs/pt/intlayer_with_astro_preact.md +3 -3
- package/docs/pt/intlayer_with_astro_react.md +3 -3
- package/docs/pt/intlayer_with_astro_solid.md +3 -3
- package/docs/pt/intlayer_with_astro_svelte.md +3 -3
- package/docs/pt/intlayer_with_astro_vanilla.md +3 -3
- package/docs/pt/intlayer_with_astro_vue.md +3 -3
- package/docs/pt/intlayer_with_create_react_app.md +3 -3
- package/docs/pt/intlayer_with_elysia.md +4 -4
- package/docs/pt/intlayer_with_express.md +3 -3
- package/docs/pt/intlayer_with_fastify.md +4 -4
- package/docs/pt/intlayer_with_hono.md +3 -3
- package/docs/pt/intlayer_with_lynx+react.md +3 -3
- package/docs/pt/intlayer_with_nestjs.md +3 -3
- package/docs/pt/intlayer_with_next-i18next.md +3 -3
- package/docs/pt/intlayer_with_nextjs_14.md +3 -3
- package/docs/pt/intlayer_with_nextjs_15.md +3 -3
- package/docs/pt/intlayer_with_nextjs_16.md +3 -3
- package/docs/pt/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/pt/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/pt/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/pt/intlayer_with_nuxt.md +3 -3
- package/docs/pt/intlayer_with_react_native+expo.md +3 -3
- package/docs/pt/intlayer_with_react_router_v7.md +3 -3
- package/docs/pt/intlayer_with_solid_start.md +3 -3
- package/docs/pt/intlayer_with_svelte_kit.md +3 -3
- package/docs/pt/intlayer_with_tanstack+solid.md +3 -3
- package/docs/pt/intlayer_with_tanstack.md +3 -3
- package/docs/pt/intlayer_with_vite+lit.md +3 -3
- package/docs/pt/intlayer_with_vite+preact.md +3 -3
- package/docs/pt/intlayer_with_vite+react.md +3 -3
- package/docs/pt/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/pt/intlayer_with_vite+solid.md +3 -3
- package/docs/pt/intlayer_with_vite+svelte.md +4 -12
- package/docs/pt/intlayer_with_vite+vanilla.md +3 -3
- package/docs/pt/intlayer_with_vite+vue.md +3 -3
- package/docs/pt/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/pt/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/pt/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/pt/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/pt/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/pt/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/ru/bundle_optimization.md +186 -186
- package/docs/ru/intlayer_with_adonisjs.md +3 -3
- package/docs/ru/intlayer_with_analog.md +3 -3
- package/docs/ru/intlayer_with_angular_19.md +3 -3
- package/docs/ru/intlayer_with_angular_21.md +3 -3
- package/docs/ru/intlayer_with_astro.md +3 -3
- package/docs/ru/intlayer_with_astro_lit.md +3 -3
- package/docs/ru/intlayer_with_astro_preact.md +3 -3
- package/docs/ru/intlayer_with_astro_react.md +3 -3
- package/docs/ru/intlayer_with_astro_solid.md +3 -3
- package/docs/ru/intlayer_with_astro_svelte.md +3 -3
- package/docs/ru/intlayer_with_astro_vanilla.md +3 -3
- package/docs/ru/intlayer_with_astro_vue.md +3 -3
- package/docs/ru/intlayer_with_create_react_app.md +3 -3
- package/docs/ru/intlayer_with_elysia.md +4 -4
- package/docs/ru/intlayer_with_express.md +3 -3
- package/docs/ru/intlayer_with_fastify.md +4 -4
- package/docs/ru/intlayer_with_hono.md +3 -3
- package/docs/ru/intlayer_with_lynx+react.md +3 -3
- package/docs/ru/intlayer_with_nestjs.md +3 -3
- package/docs/ru/intlayer_with_next-i18next.md +3 -3
- package/docs/ru/intlayer_with_nextjs_14.md +3 -3
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_16.md +3 -3
- package/docs/ru/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/ru/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/ru/intlayer_with_nuxt.md +3 -3
- package/docs/ru/intlayer_with_react_native+expo.md +3 -3
- package/docs/ru/intlayer_with_react_router_v7.md +3 -3
- package/docs/ru/intlayer_with_solid_start.md +3 -3
- package/docs/ru/intlayer_with_svelte_kit.md +3 -3
- package/docs/ru/intlayer_with_tanstack+solid.md +3 -3
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+lit.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+react_compiler.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +3 -3
- package/docs/ru/intlayer_with_vite+svelte.md +4 -12
- package/docs/ru/intlayer_with_vite+vanilla.md +3 -3
- package/docs/ru/intlayer_with_vite+vue.md +3 -3
- package/docs/ru/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/ru/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/ru/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/ru/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/ru/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/ru/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/tr/bundle_optimization.md +186 -186
- package/docs/tr/intlayer_with_adonisjs.md +3 -3
- package/docs/tr/intlayer_with_analog.md +3 -3
- package/docs/tr/intlayer_with_angular_19.md +3 -3
- package/docs/tr/intlayer_with_angular_21.md +3 -3
- package/docs/tr/intlayer_with_astro.md +3 -3
- package/docs/tr/intlayer_with_astro_lit.md +3 -3
- package/docs/tr/intlayer_with_astro_preact.md +3 -3
- package/docs/tr/intlayer_with_astro_react.md +3 -3
- package/docs/tr/intlayer_with_astro_solid.md +3 -3
- package/docs/tr/intlayer_with_astro_svelte.md +3 -3
- package/docs/tr/intlayer_with_astro_vanilla.md +3 -3
- package/docs/tr/intlayer_with_astro_vue.md +3 -3
- package/docs/tr/intlayer_with_create_react_app.md +3 -3
- package/docs/tr/intlayer_with_elysia.md +4 -4
- package/docs/tr/intlayer_with_express.md +3 -3
- package/docs/tr/intlayer_with_fastify.md +4 -4
- package/docs/tr/intlayer_with_hono.md +3 -3
- package/docs/tr/intlayer_with_lynx+react.md +3 -3
- package/docs/tr/intlayer_with_nestjs.md +3 -3
- package/docs/tr/intlayer_with_next-i18next.md +3 -3
- package/docs/tr/intlayer_with_nextjs_14.md +3 -3
- package/docs/tr/intlayer_with_nextjs_15.md +3 -3
- package/docs/tr/intlayer_with_nextjs_16.md +3 -3
- package/docs/tr/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/tr/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/tr/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/tr/intlayer_with_nuxt.md +3 -3
- package/docs/tr/intlayer_with_react_native+expo.md +3 -3
- package/docs/tr/intlayer_with_react_router_v7.md +3 -3
- package/docs/tr/intlayer_with_solid_start.md +3 -3
- package/docs/tr/intlayer_with_svelte_kit.md +3 -3
- package/docs/tr/intlayer_with_tanstack+solid.md +3 -3
- package/docs/tr/intlayer_with_tanstack.md +3 -3
- package/docs/tr/intlayer_with_vite+lit.md +3 -3
- package/docs/tr/intlayer_with_vite+preact.md +3 -3
- package/docs/tr/intlayer_with_vite+react.md +3 -3
- package/docs/tr/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/tr/intlayer_with_vite+solid.md +3 -3
- package/docs/tr/intlayer_with_vite+svelte.md +4 -12
- package/docs/tr/intlayer_with_vite+vanilla.md +3 -3
- package/docs/tr/intlayer_with_vite+vue.md +3 -3
- package/docs/tr/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/tr/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/tr/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/tr/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/tr/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/tr/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/uk/bundle_optimization.md +186 -186
- package/docs/uk/intlayer_with_adonisjs.md +3 -3
- package/docs/uk/intlayer_with_analog.md +3 -3
- package/docs/uk/intlayer_with_angular_19.md +3 -3
- package/docs/uk/intlayer_with_angular_21.md +3 -3
- package/docs/uk/intlayer_with_astro.md +3 -3
- package/docs/uk/intlayer_with_astro_lit.md +3 -3
- package/docs/uk/intlayer_with_astro_preact.md +3 -3
- package/docs/uk/intlayer_with_astro_react.md +3 -3
- package/docs/uk/intlayer_with_astro_solid.md +3 -3
- package/docs/uk/intlayer_with_astro_svelte.md +3 -3
- package/docs/uk/intlayer_with_astro_vanilla.md +3 -3
- package/docs/uk/intlayer_with_astro_vue.md +3 -3
- package/docs/uk/intlayer_with_create_react_app.md +3 -3
- package/docs/uk/intlayer_with_elysia.md +4 -4
- package/docs/uk/intlayer_with_express.md +3 -3
- package/docs/uk/intlayer_with_fastify.md +4 -4
- package/docs/uk/intlayer_with_hono.md +3 -3
- package/docs/uk/intlayer_with_lynx+react.md +3 -3
- package/docs/uk/intlayer_with_nestjs.md +3 -3
- package/docs/uk/intlayer_with_next-i18next.md +3 -3
- package/docs/uk/intlayer_with_nextjs_14.md +3 -3
- package/docs/uk/intlayer_with_nextjs_15.md +3 -3
- package/docs/uk/intlayer_with_nextjs_16.md +3 -3
- package/docs/uk/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/uk/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/uk/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/uk/intlayer_with_nuxt.md +3 -3
- package/docs/uk/intlayer_with_react_native+expo.md +3 -3
- package/docs/uk/intlayer_with_react_router_v7.md +3 -3
- package/docs/uk/intlayer_with_solid_start.md +3 -3
- package/docs/uk/intlayer_with_svelte_kit.md +3 -3
- package/docs/uk/intlayer_with_tanstack+solid.md +3 -3
- package/docs/uk/intlayer_with_tanstack.md +3 -3
- package/docs/uk/intlayer_with_vite+lit.md +3 -3
- package/docs/uk/intlayer_with_vite+preact.md +3 -3
- package/docs/uk/intlayer_with_vite+react.md +3 -3
- package/docs/uk/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/uk/intlayer_with_vite+solid.md +3 -3
- package/docs/uk/intlayer_with_vite+svelte.md +4 -12
- package/docs/uk/intlayer_with_vite+vanilla.md +3 -3
- package/docs/uk/intlayer_with_vite+vue.md +3 -3
- package/docs/uk/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/uk/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/uk/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/uk/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/uk/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/uk/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/ur/bundle_optimization.md +186 -186
- package/docs/ur/intlayer_with_angular_21.md +3 -3
- package/docs/ur/intlayer_with_fastify.md +4 -4
- package/docs/ur/intlayer_with_hono.md +3 -3
- package/docs/ur/intlayer_with_vite+lit.md +3 -3
- package/docs/ur/intlayer_with_vite+vanilla.md +3 -3
- package/docs/vi/bundle_optimization.md +186 -186
- package/docs/vi/intlayer_with_adonisjs.md +3 -3
- package/docs/vi/intlayer_with_analog.md +3 -3
- package/docs/vi/intlayer_with_angular_19.md +3 -3
- package/docs/vi/intlayer_with_angular_21.md +3 -3
- package/docs/vi/intlayer_with_astro.md +3 -3
- package/docs/vi/intlayer_with_astro_lit.md +3 -3
- package/docs/vi/intlayer_with_astro_preact.md +3 -3
- package/docs/vi/intlayer_with_astro_react.md +3 -3
- package/docs/vi/intlayer_with_astro_solid.md +3 -3
- package/docs/vi/intlayer_with_astro_svelte.md +3 -3
- package/docs/vi/intlayer_with_astro_vanilla.md +3 -3
- package/docs/vi/intlayer_with_astro_vue.md +3 -3
- package/docs/vi/intlayer_with_create_react_app.md +3 -3
- package/docs/vi/intlayer_with_elysia.md +4 -4
- package/docs/vi/intlayer_with_express.md +3 -3
- package/docs/vi/intlayer_with_fastify.md +4 -4
- package/docs/vi/intlayer_with_hono.md +3 -3
- package/docs/vi/intlayer_with_lynx+react.md +3 -3
- package/docs/vi/intlayer_with_nestjs.md +3 -3
- package/docs/vi/intlayer_with_next-i18next.md +3 -3
- package/docs/vi/intlayer_with_nextjs_14.md +3 -3
- package/docs/vi/intlayer_with_nextjs_15.md +3 -3
- package/docs/vi/intlayer_with_nextjs_16.md +3 -3
- package/docs/vi/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/vi/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/vi/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/vi/intlayer_with_nuxt.md +3 -3
- package/docs/vi/intlayer_with_react_native+expo.md +3 -3
- package/docs/vi/intlayer_with_react_router_v7.md +3 -3
- package/docs/vi/intlayer_with_solid_start.md +3 -3
- package/docs/vi/intlayer_with_svelte_kit.md +3 -3
- package/docs/vi/intlayer_with_tanstack+solid.md +3 -3
- package/docs/vi/intlayer_with_tanstack.md +3 -3
- package/docs/vi/intlayer_with_vite+lit.md +3 -3
- package/docs/vi/intlayer_with_vite+preact.md +3 -3
- package/docs/vi/intlayer_with_vite+react.md +3 -3
- package/docs/vi/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/vi/intlayer_with_vite+solid.md +3 -3
- package/docs/vi/intlayer_with_vite+svelte.md +4 -12
- package/docs/vi/intlayer_with_vite+vanilla.md +3 -3
- package/docs/vi/intlayer_with_vite+vue.md +3 -3
- package/docs/vi/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/vi/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/vi/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/vi/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/vi/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/vi/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/zh/bundle_optimization.md +186 -186
- package/docs/zh/intlayer_with_adonisjs.md +3 -3
- package/docs/zh/intlayer_with_analog.md +3 -3
- package/docs/zh/intlayer_with_angular_19.md +3 -3
- package/docs/zh/intlayer_with_angular_21.md +3 -3
- package/docs/zh/intlayer_with_astro.md +3 -3
- package/docs/zh/intlayer_with_astro_lit.md +3 -3
- package/docs/zh/intlayer_with_astro_preact.md +3 -3
- package/docs/zh/intlayer_with_astro_react.md +3 -3
- package/docs/zh/intlayer_with_astro_solid.md +3 -3
- package/docs/zh/intlayer_with_astro_svelte.md +3 -3
- package/docs/zh/intlayer_with_astro_vanilla.md +3 -3
- package/docs/zh/intlayer_with_astro_vue.md +3 -3
- package/docs/zh/intlayer_with_create_react_app.md +3 -3
- package/docs/zh/intlayer_with_elysia.md +4 -4
- package/docs/zh/intlayer_with_express.md +3 -3
- package/docs/zh/intlayer_with_fastify.md +4 -4
- package/docs/zh/intlayer_with_hono.md +3 -3
- package/docs/zh/intlayer_with_lynx+react.md +3 -3
- package/docs/zh/intlayer_with_nestjs.md +3 -3
- package/docs/zh/intlayer_with_next-i18next.md +3 -3
- package/docs/zh/intlayer_with_nextjs_14.md +3 -3
- package/docs/zh/intlayer_with_nextjs_15.md +3 -3
- package/docs/zh/intlayer_with_nextjs_16.md +3 -3
- package/docs/zh/intlayer_with_nextjs_compiler.md +3 -3
- package/docs/zh/intlayer_with_nextjs_no_locale_path.md +3 -3
- package/docs/zh/intlayer_with_nextjs_page_router.md +3 -3
- package/docs/zh/intlayer_with_nuxt.md +3 -3
- package/docs/zh/intlayer_with_react_native+expo.md +3 -3
- package/docs/zh/intlayer_with_react_router_v7.md +3 -3
- package/docs/zh/intlayer_with_solid_start.md +3 -3
- package/docs/zh/intlayer_with_svelte_kit.md +3 -3
- package/docs/zh/intlayer_with_tanstack+solid.md +3 -3
- package/docs/zh/intlayer_with_tanstack.md +3 -3
- package/docs/zh/intlayer_with_vite+lit.md +3 -3
- package/docs/zh/intlayer_with_vite+preact.md +3 -3
- package/docs/zh/intlayer_with_vite+react.md +3 -3
- package/docs/zh/intlayer_with_vite+react_compiler.md +3 -3
- package/docs/zh/intlayer_with_vite+solid.md +3 -3
- package/docs/zh/intlayer_with_vite+svelte.md +4 -12
- package/docs/zh/intlayer_with_vite+vanilla.md +3 -3
- package/docs/zh/intlayer_with_vite+vue.md +3 -3
- package/docs/zh/migration_from_i18next_to_intlayer.md +3 -3
- package/docs/zh/migration_from_next-i18next_to_intlayer.md +3 -3
- package/docs/zh/migration_from_next-intl_to_intlayer.md +3 -3
- package/docs/zh/migration_from_nuxtjs_i18n_to_intlayer.md +3 -3
- package/docs/zh/migration_from_react-i18next_to_intlayer.md +3 -3
- package/docs/zh/migration_from_vue-i18n_to_intlayer.md +3 -3
- package/docs/zh-TW/bundle_optimization.md +186 -186
- package/docs/zh-TW/intlayer_with_angular_21.md +3 -3
- package/package.json +8 -8
- package/src/generated/blog.entry.ts +329 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-16
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
3
|
+
updatedAt: 2026-09-02
|
|
4
|
+
title: React i18n - how the provider model works and what it costs
|
|
5
|
+
description: React has no built-in i18n. How the context-provider model works, why t("a.b") has no types, how plurals and lazy loading behave, and how the libraries differ.
|
|
6
6
|
keywords:
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
7
|
+
- react i18n
|
|
8
|
+
- react internationalization
|
|
9
|
+
- react-i18next
|
|
10
|
+
- react-intl
|
|
11
|
+
- Lingui
|
|
12
|
+
- useTranslation
|
|
13
|
+
- Intlayer
|
|
14
14
|
slugs:
|
|
15
15
|
- blog
|
|
16
16
|
- i18n-technologies
|
|
@@ -19,138 +19,218 @@ slugs:
|
|
|
19
19
|
author: aymericzip
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
#
|
|
22
|
+
# React i18n: the provider model, and what it costs you
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
React has no i18n primitive. There is no `useTranslation` in `react`, no message format, no locale negotiation, so every React app picks a library on day one and lives with that decision for years. This post covers the model all of them share, the four places it costs you something, and how `react-i18next`, `react-intl`, Lingui and Intlayer differ once you get past the hello world.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
## Table of Contents
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
<TOC/>
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## The starting point
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Before any library, the code looks like this and it is wrong in a way that only shows up later:
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
35
|
+
export const CartSummary = ({ count }: { count: number }) => (
|
|
36
|
+
<section>
|
|
37
|
+
<h2>Your cart</h2>
|
|
38
|
+
<p>{count} items</p>
|
|
39
|
+
</section>
|
|
40
|
+
);
|
|
41
|
+
```
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
Two hardcoded strings, one broken plural (`1 items`), and a number that will need grouping separators in `de-DE`. Multiply by three hundred components and you have the actual problem: not translating strings, but keeping three hundred components and N locale files in sync for two years.
|
|
37
44
|
|
|
38
|
-
|
|
45
|
+
If the vocabulary is new, start with [what internationalization actually covers](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/what_is_internationalization.md).
|
|
39
46
|
|
|
40
|
-
|
|
47
|
+
## Every React i18n library is the same shape
|
|
41
48
|
|
|
42
|
-
|
|
43
|
-
- **Dynamic Content:** Managing translations for content that updates in real time or is fetched from APIs can add an extra layer of complexity.
|
|
44
|
-
- **SEO Considerations:** For server-side rendered React apps (using frameworks like Next.js), ensuring that translations contribute positively to SEO involves managing localized URLs, metadata, and sitemaps.
|
|
45
|
-
- **State and Context Management:** Ensuring that the correct language is maintained across routes and components requires thoughtful state management.
|
|
46
|
-
- **Development Overhead:** Maintaining translation files, ensuring context accuracy, and keeping your application scalable are ongoing considerations.
|
|
49
|
+
Whatever you pick, you get the same three pieces:
|
|
47
50
|
|
|
48
|
-
|
|
51
|
+
1. A **store** holding the active locale and the loaded messages.
|
|
52
|
+
2. A **provider** putting that store into React context.
|
|
53
|
+
3. A **hook** reading from context inside components.
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
```tsx fileName="src/main.tsx"
|
|
56
|
+
<I18nProvider locale={locale} messages={messages}>
|
|
57
|
+
<App />
|
|
58
|
+
</I18nProvider>
|
|
59
|
+
```
|
|
51
60
|
|
|
52
|
-
|
|
61
|
+
That is the whole model. It has one structural consequence worth understanding before you compare APIs: **whatever you hand the provider travels into the client bundle**. `messages` is a plain JS object serialized into your JS chunks (or into the SSR payload, then hydrated). A component that renders one heading pulls in the context, and the context holds every message that was loaded, for every page.
|
|
53
62
|
|
|
54
|
-
|
|
63
|
+
This is why "i18n made my bundle big" reports are almost never about the library. They are about the catalog. The [TanStack Start benchmark](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/tanstack.md) measures the two separately for exactly this reason: library code in an empty component, and content per route.
|
|
55
64
|
|
|
56
|
-
|
|
65
|
+
## Key-based versus component-based
|
|
57
66
|
|
|
58
|
-
|
|
59
|
-
**Intlayer** is an innovative, open-source internationalization (i18n) library designed to simplify multilingual support in modern React (and other) web applications. It offers a declarative approach, letting you define translation dictionaries directly within your components.
|
|
67
|
+
Two ways to reference a string. This is the real fork in the road, more than any API detail.
|
|
60
68
|
|
|
61
|
-
**Key
|
|
69
|
+
**Key-based** (`react-i18next`, `react-intl`, `next-intl`): the component holds an identifier, the text lives in a catalog.
|
|
62
70
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- **Seamless Integration**: Compatible with major bundlers and frameworks like Create React App, Next.js, and Vite, making setup straightforward.
|
|
68
|
-
- **Asynchronous Loading**: Dynamically load translation dictionaries, reducing initial bundle size and improving performance.
|
|
71
|
+
```tsx
|
|
72
|
+
const { t } = useTranslation("cart");
|
|
73
|
+
return <h2>{t("summary.title")}</h2>;
|
|
74
|
+
```
|
|
69
75
|
|
|
70
|
-
**
|
|
76
|
+
**Component-based** (Lingui's `<Trans>`, Intlayer's nodes): the source text or a typed node lives at the call site, extraction happens at build time.
|
|
71
77
|
|
|
72
|
-
|
|
78
|
+
```tsx
|
|
79
|
+
return <Trans>Your cart</Trans>;
|
|
80
|
+
```
|
|
73
81
|
|
|
74
|
-
|
|
82
|
+
Key-based wins when translators work in a TMS and never see your code. Component-based wins on review, because a diff shows the actual copy, and on dead-code detection, because deleting the component deletes the string.
|
|
75
83
|
|
|
76
|
-
|
|
84
|
+
## Why `t("some.key")` gives you nothing
|
|
77
85
|
|
|
78
|
-
|
|
86
|
+
`t` is typed `(key: string) => string`. That is the default in every key-based library, and it means:
|
|
79
87
|
|
|
80
|
-
|
|
81
|
-
|
|
88
|
+
- A typo compiles. You find it at runtime, in the locale nobody tests.
|
|
89
|
+
- Renaming a nesting level in `en.json` breaks the other ten locales silently.
|
|
90
|
+
- Deleting a component leaves its keys in every catalog forever. Nothing warns you.
|
|
82
91
|
|
|
83
|
-
|
|
92
|
+
You can fix this. `react-i18next` supports declaration merging on `CustomTypeOptions` so `t` is narrowed to the keys of your resources; `react-intl` gets there through `formatjs` extraction plus a generated union. Both work, and both are extra wiring that has to survive lazily loaded namespaces, where the type describes messages that may not be loaded yet.
|
|
84
93
|
|
|
85
|
-
|
|
86
|
-
- **Asynchronous Loading**: Dynamically load translation resources, reducing initial bundle size and improving performance.
|
|
87
|
-
- **Rich Translation Capabilities**: Supports nested translations, plurals, interpolation, and more.
|
|
88
|
-
- **TypeScript & Autocompletion**: With additional configuration, you can enjoy typed translation keys, though setup can be more manual.
|
|
89
|
-
- **Localized Metadata & URLs**: Can be integrated with Next.js for localized routes, sitemaps, and robots.txt, improving SEO.
|
|
90
|
-
- **Server Components & SSR**: With Next.js or other SSR setups, you can serve fully localized content from the server.
|
|
94
|
+
The honest summary: type safety on keys is achievable everywhere, it is on by default almost nowhere.
|
|
91
95
|
|
|
92
|
-
|
|
96
|
+
## Plurals and interpolation
|
|
93
97
|
|
|
94
|
-
|
|
95
|
-
- **Plugin Ecosystem**: A broad ecosystem of plugins and middlewares is available, which also means you’ll need to sift through various packages to find the right tools.
|
|
96
|
-
- **Server Components**: Requires additional setup to ensure server components pick up the correct locales, especially if using frameworks other than Next.js.
|
|
98
|
+
Three incompatible formats, one problem.
|
|
97
99
|
|
|
98
|
-
|
|
100
|
+
| Library | Plural syntax | Note |
|
|
101
|
+
| :-------------- | :--------------------------------------------------- | :------------------------------------------------- |
|
|
102
|
+
| `react-i18next` | Suffix keys: `item_one`, `item_other` | i18next's own format, driven by `Intl.PluralRules` |
|
|
103
|
+
| `react-intl` | ICU: `{count, plural, one {# item} other {# items}}` | Standard, portable to most TMS platforms |
|
|
104
|
+
| Lingui | ICU via macros, compiled | Same format, compiled to a compact runtime |
|
|
105
|
+
| Intlayer | `plural({ one, other })` helper | CLDR categories, not ICU strings |
|
|
99
106
|
|
|
100
|
-
|
|
107
|
+
ICU is the interchange format your translation vendor most likely speaks. If you are already receiving ICU strings, that constrains the choice more than bundle size does. There is a longer write-up on [ICU MessageFormat and where it helps](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/icu_message_format.md).
|
|
101
108
|
|
|
102
|
-
|
|
109
|
+
Interpolation has a second trap: putting a `<Link>` inside a translated sentence. Every library has an answer (`<Trans>` in i18next and Lingui, rich text tags in `react-intl`), and all of them are more awkward than the plain string case. Budget for it.
|
|
103
110
|
|
|
104
|
-
|
|
105
|
-
**React Intl**, part of the **FormatJS** suite, focuses on standardizing message formatting, date/number/time localization, and relative time messages. It uses a message extraction workflow to handle your translations efficiently.
|
|
111
|
+
## Lazy loading per route
|
|
106
112
|
|
|
107
|
-
|
|
113
|
+
The mechanism is the same everywhere: split catalogs into namespaces, load the namespace a route needs, use `React.lazy` or your router's loader to fetch it.
|
|
108
114
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
- **TypeScript & Autocompletion**: Can be combined with TypeScript but may need extra tooling for autocompletion of message IDs.
|
|
113
|
-
- **Polyfills for Unsupported Browsers**: Ensures consistent behavior across legacy environments.
|
|
115
|
+
```tsx
|
|
116
|
+
const { t } = useTranslation("checkout"); // loads locales/en/checkout.json
|
|
117
|
+
```
|
|
114
118
|
|
|
115
|
-
|
|
119
|
+
Two things go wrong in practice. First, a namespace once loaded stays in the store, so navigating through five routes leaves you with five catalogs in memory and in the hydration payload. Second, nothing enforces the mapping. A shared `<Button>` reaching for `t("common:cta")` quietly makes `common` a dependency of every route.
|
|
116
120
|
|
|
117
|
-
|
|
118
|
-
- **Splitting Translations**: Core library doesn’t provide built-in support for splitting translations into multiple files requires additional setup or plugins.
|
|
119
|
-
- **Maintainability**: The straightforward approach to formatting can be beneficial, but message extraction and organizational overhead can grow quickly.
|
|
121
|
+
The result shows in the benchmark as **leakage**: content from other locales or other routes riding along in a page's bundle. It is a discipline problem, not a library bug, and discipline erodes across teams.
|
|
120
122
|
|
|
121
|
-
|
|
123
|
+
## If you later move to a framework
|
|
122
124
|
|
|
123
|
-
|
|
125
|
+
Plain React means everything is a Client Component, so this does not bite yet. It bites the day you move to Next.js App Router or another RSC-based framework: React context does not cross the server/client boundary, so a hook-based `t()` forces `"use client"` on any component that renders text.
|
|
124
126
|
|
|
125
|
-
|
|
127
|
+
The workarounds are a server-side async `getTranslations()` alongside the client hook, which is two APIs for one job. Worth knowing before you standardize on a pattern across a large codebase. The [Next.js i18n post](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/list_i18n_technologies/frameworks/nextjs.md) covers that boundary; for routing-specific setups see the [React Router](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/list_i18n_technologies/frameworks/react-router.md), [TanStack Start](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/list_i18n_technologies/frameworks/tanstack-start.md) and [React Native](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/list_i18n_technologies/frameworks/react-native.md) posts.
|
|
126
128
|
|
|
127
|
-
|
|
128
|
-
**LinguiJS** offers a modern, developer-friendly approach for managing i18n in JavaScript and React. It focuses on reducing configuration while empowering you with a robust CLI and message extraction workflow.
|
|
129
|
+
## The four realistic options
|
|
129
130
|
|
|
130
|
-
|
|
131
|
+
Library sizes below are from the TanStack Start benchmark, measured after bundling, tree-shaking and minification, on a 10-page / 10-locale app. They cover provider plus hook in an empty component, not your content.
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
136
|
-
|
|
133
|
+
| Library | Model | Types on keys | Library size |
|
|
134
|
+
| :--------------------- | :----------------------------------- | :----------------------------- | :------------------------------------ |
|
|
135
|
+
| `react-i18next@17.0.2` | Key-based, runtime catalogs | Opt-in via `CustomTypeOptions` | ~17.3 kB, about 3.5× `react-intlayer` |
|
|
136
|
+
| `react-intl@10.1.1` | Key-based, ICU-native | Opt-in via extraction | ~14.4 kB, about 3× `react-intlayer` |
|
|
137
|
+
| `@lingui/core@5.3.0` | Macros compiled at build time | Good, from the compiler | Compiled catalogs, small runtime |
|
|
138
|
+
| `react-intlayer` | Per-component declarations, compiled | Generated, on by default | Baseline in the benchmark |
|
|
137
139
|
|
|
138
|
-
|
|
140
|
+
**`react-i18next` is the right answer for most teams.** It has the largest plugin ecosystem, backends for every TMS, detectors, and a decade of Stack Overflow answers. If you have no specific constraint, picking it is not a mistake. The costs are real but boring: heaviest of the four, its own plural format, and the type wiring is yours to maintain.
|
|
139
141
|
|
|
140
|
-
-
|
|
141
|
-
- **Community & Plugins**: The ecosystem is growing but still smaller compared to i18next or FormatJS.
|
|
142
|
-
- **Server Components**: May need more explicit configuration to ensure that server components receive the correct locale data.
|
|
142
|
+
**`react-intl`** is the one to pick if ICU compliance matters and your translators live in a platform that speaks it. The DX is verbose: `const intl = useIntl()` then `intl.formatMessage({ id })` for every string.
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
**Lingui** trades runtime for a compiler. `lingui extract` / `lingui compile` is an extra build step and the macro syntax has several forms (`t()`, tagged templates, `i18n.t()`, `<Trans>`) that are easy to mix up, but the bundle result is good.
|
|
145
|
+
|
|
146
|
+
For a feature-by-feature table, there is a dedicated [react-i18next vs react-intl vs Intlayer comparison](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/react-i18next_vs_react-intl_vs_intlayer.md).
|
|
147
|
+
|
|
148
|
+
## Intlayer: content declared next to the component
|
|
149
|
+
|
|
150
|
+
Intlayer moves the catalog. Instead of `locales/en.json`, each component gets a `.content.ts` file beside it, and a build plugin compiles those declarations into per-component dictionaries.
|
|
151
|
+
|
|
152
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
153
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
154
|
+
|
|
155
|
+
const cartSummaryContent = {
|
|
156
|
+
key: "cart-summary",
|
|
157
|
+
content: {
|
|
158
|
+
title: t({ en: "Your cart", fr: "Votre panier", es: "Tu carrito" }),
|
|
159
|
+
items: t({
|
|
160
|
+
en: plural({ one: "{{count}} item", other: "{{count}} items" }),
|
|
161
|
+
fr: plural({ one: "{{count}} article", other: "{{count}} articles" }),
|
|
162
|
+
es: plural({ one: "{{count}} artículo", other: "{{count}} artículos" }),
|
|
163
|
+
}),
|
|
164
|
+
},
|
|
165
|
+
} satisfies Dictionary;
|
|
166
|
+
|
|
167
|
+
export default cartSummaryContent;
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
171
|
+
import type { FC } from "react";
|
|
172
|
+
import { useIntlayer } from "react-intlayer";
|
|
173
|
+
|
|
174
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
175
|
+
const { title, items } = useIntlayer("cart-summary");
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<section>
|
|
179
|
+
<h2>{title}</h2>
|
|
180
|
+
<p>{items(count)}</p>
|
|
181
|
+
</section>
|
|
182
|
+
);
|
|
183
|
+
};
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
`useIntlayer` returns typed nodes, so `title` autocompletes and a typo fails `tsc`, with no declaration merging to set up. Locale switching goes through `useLocale()`, which returns `locale`, `availableLocales` and `setLocale`.
|
|
187
|
+
|
|
188
|
+
The scoping falls out of the file layout: because the dictionary key is declared in one file and read in one component, the compiler ships only what a route renders, and deleting the folder deletes the strings.
|
|
189
|
+
|
|
190
|
+
<Tabs defaultTab="code">
|
|
191
|
+
<Tab label="Code" value="code">
|
|
192
|
+
|
|
193
|
+
<iframe
|
|
194
|
+
src="https://ide.intlayer.org/aymericzip/intlayer-vite-react-template?file=intlayer.config.ts"
|
|
195
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
196
|
+
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
197
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
198
|
+
loading="lazy"
|
|
199
|
+
/>
|
|
200
|
+
|
|
201
|
+
</Tab>
|
|
202
|
+
<Tab label="Demo" value="demo">
|
|
203
|
+
|
|
204
|
+
<iframe
|
|
205
|
+
src="https://intlayer-vite-react-template.vercel.app"
|
|
206
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
207
|
+
title="Demo - intlayer-vite-react-template"
|
|
208
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
209
|
+
loading="lazy"
|
|
210
|
+
/>
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
</Tabs>
|
|
214
|
+
|
|
215
|
+
**What it costs you.** A bundler plugin is mandatory: no `vite-intlayer` or equivalent, no dictionaries, so there is no way to use it in a no-build setup. The ecosystem is far smaller than i18next's, which means fewer TMS backends and fewer answers when you get stuck. ICU message format support is still partial, so if your vendor delivers ICU strings today that is a genuine blocker. And handing a translator one big JSON file requires tooling, since the content is spread across the codebase by design.
|
|
216
|
+
|
|
217
|
+
On an existing `react-i18next` codebase, the [`@intlayer/react-i18next` compat adapter](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/react-i18next.md) aliases `react-i18next` imports at the bundler level so `useTranslation`, `<Trans>` and suffix plurals keep working, and the [step-by-step migration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/migration_from_react-i18next_to_intlayer.md) covers moving off the adapter afterwards. There are equivalents for [`react-intl`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/react-intl.md) and [Lingui](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/lingui.md).
|
|
145
218
|
|
|
146
|
-
|
|
219
|
+
## Common mistakes
|
|
147
220
|
|
|
148
|
-
|
|
221
|
+
- **Loading every locale into the provider.** The most common cause of a heavy bundle. Load the active locale, fetch the rest on switch.
|
|
222
|
+
- **Letting shared components own namespaces.** A `common` namespace referenced by a `<Button>` becomes a dependency of every route.
|
|
223
|
+
- **Switching locale with a `<button>`.** Crawlers do not click. Render locale switchers as `<a>` pointing at the localized URL.
|
|
224
|
+
- **Skipping the type wiring "for now".** It is much cheaper to set up at 20 keys than at 2000.
|
|
225
|
+
- **Treating catalogs as append-only.** Nothing detects dead keys in a key-based setup. Schedule a sweep, or pick a model where content is scoped to a component.
|
|
226
|
+
- **Formatting dates and numbers by hand.** `Intl.DateTimeFormat` and `Intl.NumberFormat` are in every runtime you target. Every library above wraps them; none of them need a helper you wrote.
|
|
149
227
|
|
|
150
|
-
|
|
151
|
-
- **Check Server Compatibility**: If you rely on SSR or server components (especially in Next.js), ensure your chosen library supports it seamlessly.
|
|
152
|
-
- **TypeScript & Autocompletion**: If TypeScript is a priority, select a library that easily integrates with typed keys and provides robust developer tooling.
|
|
153
|
-
- **Maintainability & Scalability**: Larger projects often need a clear, maintainable structure for translations, so factor in your long-term roadmap.
|
|
154
|
-
- **SEO & Metadata**: If SEO is crucial, confirm that your chosen solution supports localized metadata, routes, and sitemaps/robots for each language.
|
|
228
|
+
## Going further
|
|
155
229
|
|
|
156
|
-
|
|
230
|
+
- [i18n library benchmark: bundle size, leakage and locale-switch timings](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/index.md)
|
|
231
|
+
- [Set up i18n in a Vite + React app](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_vite+react.md)
|
|
232
|
+
- [Drop-in `react-i18next` compat adapter](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/react-i18next.md) and the [full migration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/migration_from_react-i18next_to_intlayer.md)
|
|
233
|
+
- [react-i18next vs react-intl vs Intlayer, feature by feature](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/react-i18next_vs_react-intl_vs_intlayer.md)
|
|
234
|
+
- [Per-component vs centralized i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/per-component_vs_centralized_i18n.md)
|
|
235
|
+
- [Compiler-based vs declarative i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/compiler_vs_declarative_i18n.md)
|
|
236
|
+
- [How bundle optimization works at build time](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/bundle_optimization.md)
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-02
|
|
3
|
+
updatedAt: 2026-09-02
|
|
4
|
+
title: "Solid i18n: why translations freeze on locale change"
|
|
5
|
+
description: Why Solid components capture translations as constants, how @solid-primitives/i18n works, lazy catalogs, SolidStart locale routing, and what Intlayer changes.
|
|
6
|
+
keywords:
|
|
7
|
+
- solidjs i18n
|
|
8
|
+
- solid start i18n
|
|
9
|
+
- solid internationalization
|
|
10
|
+
- solid-primitives i18n
|
|
11
|
+
- solid-i18next
|
|
12
|
+
- fine-grained reactivity
|
|
13
|
+
- locale routing
|
|
14
|
+
- Intlayer
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- i18n-technologies
|
|
18
|
+
- frameworks
|
|
19
|
+
- solid
|
|
20
|
+
author: aymericzip
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Solid i18n: the translation that never updates
|
|
24
|
+
|
|
25
|
+
Solid's reactivity model changes what an i18n library has to do, and it changes the bugs you get. The most common one is a page that switches language everywhere except in the three components where someone stored a translation in a `const`. This post explains why that happens, then covers the real options: `@solid-primitives/i18n`, lazy catalogs, SolidStart locale routing, and Intlayer.
|
|
26
|
+
|
|
27
|
+
## Table of Contents
|
|
28
|
+
|
|
29
|
+
<TOC/>
|
|
30
|
+
|
|
31
|
+
## The bug you will hit first
|
|
32
|
+
|
|
33
|
+
Here is a component that looks correct and is not.
|
|
34
|
+
|
|
35
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
36
|
+
import { useI18n } from "~/i18n";
|
|
37
|
+
|
|
38
|
+
export const CartSummary = () => {
|
|
39
|
+
const t = useI18n();
|
|
40
|
+
|
|
41
|
+
const total = t("cart.total"); // evaluated once, during setup
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<section>
|
|
45
|
+
<h2>{total}</h2>
|
|
46
|
+
<p>{t("cart.items", { count: 3 })}</p>
|
|
47
|
+
</section>
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Switch the locale and the `<p>` updates. The `<h2>` does not. It stays in whatever language was active the first time the component ran, and it will stay there until the component is destroyed and recreated.
|
|
53
|
+
|
|
54
|
+
In React this code works, because a locale change re-renders the component and re-evaluates every line of its body. In Solid nothing re-runs, so the difference between the two lines is real and permanent.
|
|
55
|
+
|
|
56
|
+
## Why: components run once
|
|
57
|
+
|
|
58
|
+
A Solid component is a factory, not a render function. It executes exactly once, returns DOM nodes, and is never called again. What updates afterwards is not the component, it is the individual reactive computations Solid's compiler created inside the JSX.
|
|
59
|
+
|
|
60
|
+
`{t("cart.items", { count: 3 })}` inside JSX compiles to a getter that Solid wraps in an effect. Reading the locale signal inside it subscribes that one text node. `const total = t("cart.total")` runs in the setup body, outside any tracking scope, so it subscribes to nothing and produces a plain string.
|
|
61
|
+
|
|
62
|
+
This is the same rule that forbids destructuring props in Solid. Applied to i18n, it means every translated value must stay behind a function call that is executed inside a tracked scope.
|
|
63
|
+
|
|
64
|
+
The fix is to keep the read lazy:
|
|
65
|
+
|
|
66
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
67
|
+
import { createMemo } from "solid-js";
|
|
68
|
+
import { useI18n } from "~/i18n";
|
|
69
|
+
|
|
70
|
+
export const CartSummary = () => {
|
|
71
|
+
const t = useI18n();
|
|
72
|
+
|
|
73
|
+
const total = createMemo(() => t("cart.total")); // an accessor, not a string
|
|
74
|
+
|
|
75
|
+
return <h2>{total()}</h2>;
|
|
76
|
+
};
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Two consequences worth internalizing:
|
|
80
|
+
|
|
81
|
+
- A translation you pass to a non-JSX API (a `document.title` assignment, a chart config, an `aria-label` computed in setup) is a snapshot. It needs its own effect or memo.
|
|
82
|
+
- A translation stored in a store, a module-level variable or a closure created at setup is a snapshot too. Locale changes will not reach it.
|
|
83
|
+
|
|
84
|
+
## `@solid-primitives/i18n` is the community default
|
|
85
|
+
|
|
86
|
+
The Solid ecosystem is small, and this is the option most projects land on. It is not a framework, it is a set of primitives: you own the dictionaries, the locale signal, and the loading strategy.
|
|
87
|
+
|
|
88
|
+
```ts fileName="src/i18n/index.ts"
|
|
89
|
+
import * as i18n from "@solid-primitives/i18n";
|
|
90
|
+
import { createSignal } from "solid-js";
|
|
91
|
+
|
|
92
|
+
const en = {
|
|
93
|
+
cart: { total: "Total", items: "{{ count }} items" },
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export type RawDictionary = typeof en;
|
|
97
|
+
export type Dictionary = i18n.Flatten<RawDictionary>;
|
|
98
|
+
|
|
99
|
+
const [locale, setLocale] = createSignal<"en" | "fr">("en");
|
|
100
|
+
|
|
101
|
+
const dictionary = () => i18n.flatten(en);
|
|
102
|
+
const t = i18n.translator(dictionary, i18n.resolveTemplate);
|
|
103
|
+
|
|
104
|
+
t("cart.items", { count: 3 }); // "3 items"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`flatten` turns the nested object into `"cart.total"` style keys, and `translator` takes an _accessor_, not a value. That signature is the whole design: because the dictionary arrives as a function, `t` reads it inside your tracking scope, and the resulting text is reactive as long as you call `t` in a reactive position.
|
|
108
|
+
|
|
109
|
+
Types are derived from the English dictionary, so a typo in a key is a compile error without any extra codegen. That is a genuine advantage over `t("a.b.c")` in most other libraries.
|
|
110
|
+
|
|
111
|
+
What it does not give you: no namespace scoping, no route-aware splitting, no cookie handling, no locale routing, no formatters. On a 10 page app that is fine. On a 40 page app you are writing that layer yourself.
|
|
112
|
+
|
|
113
|
+
## Lazy loading catalogs
|
|
114
|
+
|
|
115
|
+
Because `translator` accepts an accessor that may return `undefined`, a resource plugs straight in.
|
|
116
|
+
|
|
117
|
+
```ts fileName="src/i18n/index.ts"
|
|
118
|
+
import * as i18n from "@solid-primitives/i18n";
|
|
119
|
+
import { createResource, createSignal } from "solid-js";
|
|
120
|
+
|
|
121
|
+
const fetchDictionary = async (locale: string): Promise<Dictionary> => {
|
|
122
|
+
const module = await import(`./locales/${locale}.ts`);
|
|
123
|
+
return i18n.flatten(module.dictionary);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const [locale, setLocale] = createSignal("en");
|
|
127
|
+
const [dictionary] = createResource(locale, fetchDictionary);
|
|
128
|
+
|
|
129
|
+
export const t = i18n.translator(dictionary, i18n.resolveTemplate);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
During the fetch, `t` returns `undefined` and your UI renders empty strings unless you wrap it in a `<Suspense>` or supply a fallback. That transient blank is the price of the split, and it is easy to miss in development where the import resolves instantly.
|
|
133
|
+
|
|
134
|
+
This splits by locale, not by page. Every route still pays for every other route's copy. Getting per-page splitting out of a flat dictionary means maintaining one file per page per locale by hand.
|
|
135
|
+
|
|
136
|
+
## SolidStart: the locale has to be resolved on the server
|
|
137
|
+
|
|
138
|
+
Client-side locale detection does not work for SSR. If the server renders in English and the client then reads a cookie and switches to French, you get a hydration mismatch and a visible flash.
|
|
139
|
+
|
|
140
|
+
The reliable source of truth is the URL, because the server and the client both see it. SolidStart's file router supports an optional dynamic segment, and `[[locale]]` compiles to `:locale?`:
|
|
141
|
+
|
|
142
|
+
```plaintext
|
|
143
|
+
src/routes/
|
|
144
|
+
[[locale]].tsx layout that validates the segment
|
|
145
|
+
[[locale]]/
|
|
146
|
+
index.tsx / /fr /es
|
|
147
|
+
about.tsx /about /fr/about /es/about
|
|
148
|
+
[...404].tsx
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The catch is that `@solidjs/router` expands `:locale?` into two patterns and tries them by specificity. Without a match filter, `/unknown` matches the locale segment and silently renders your home page with `locale="unknown"` instead of a 404. Constrain it in the layout's `route` export:
|
|
152
|
+
|
|
153
|
+
```tsx fileName="src/routes/[[locale]].tsx"
|
|
154
|
+
import type { RouteSectionProps } from "@solidjs/router";
|
|
155
|
+
import { locales } from "intlayer";
|
|
156
|
+
|
|
157
|
+
export const route = {
|
|
158
|
+
matchFilters: { locale: locales },
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export default function LocaleLayout(props: RouteSectionProps) {
|
|
162
|
+
return <>{props.children}</>;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Two more server-side pieces are yours to write with any library: setting `<html lang>` and `dir` in `entry-server.tsx`, which sits outside the `Router`, and emitting `canonical` plus `hreflang` links. At the time of writing, `@solidjs/meta` tags are applied on the client after hydration and are not in the server-rendered `<head>` in SolidStart v2, so anything a crawler must see without JavaScript belongs in `entry-server.tsx`. The [hreflang guide](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/internationalization_and_SEO.md) covers what those tags need to say.
|
|
167
|
+
|
|
168
|
+
## The options
|
|
169
|
+
|
|
170
|
+
| Library | Model | Types on keys | Notes |
|
|
171
|
+
| :----------------------- | :------------------------------------------------- | :---------------------------------- | :------------------------------------------------------------- |
|
|
172
|
+
| `@solid-primitives/i18n` | Flat dictionary you own | Inferred from the source dictionary | Very small, no scoping, no routing, no formatters |
|
|
173
|
+
| `solid-i18next` | i18next catalogs and namespaces | Manual declaration | Mature plugin ecosystem, heaviest of the set |
|
|
174
|
+
| `@inlang/paraglide-js` | Generated message functions | Generated | Compiled messages, but a regeneration step before every commit |
|
|
175
|
+
| Intlayer | One `.content.ts` per component, compiled at build | Generated, on by default | Requires a build plugin, smaller ecosystem |
|
|
176
|
+
|
|
177
|
+
The [Solid i18n benchmark](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md) measures these on a 10 page, 10 locale app. `solid-i18next@17.0.2` weighs about **14.6 kB** after bundling and minification, roughly **4.7x `solid-intlayer`**. Paraglide's advertised tree-shaking did not take effect in that implementation, and it reads the locale from storage on each node rather than from a signal, which adds work on every render.
|
|
178
|
+
|
|
179
|
+
## Intlayer: content next to the component
|
|
180
|
+
|
|
181
|
+
Intlayer's design choice is that content lives in a file beside the component, and a build plugin compiles those declarations into per-component dictionaries.
|
|
182
|
+
|
|
183
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
184
|
+
import { type Dictionary, plural, t } from "intlayer";
|
|
185
|
+
|
|
186
|
+
const cartSummaryContent = {
|
|
187
|
+
key: "cart-summary",
|
|
188
|
+
content: {
|
|
189
|
+
total: t({ en: "Total", fr: "Total", es: "Total" }),
|
|
190
|
+
items: plural({
|
|
191
|
+
one: t({ en: "{{count}} item", fr: "{{count}} article" }),
|
|
192
|
+
other: t({ en: "{{count}} items", fr: "{{count}} articles" }),
|
|
193
|
+
}),
|
|
194
|
+
},
|
|
195
|
+
} satisfies Dictionary;
|
|
196
|
+
|
|
197
|
+
export default cartSummaryContent;
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
201
|
+
import { useIntlayer } from "solid-intlayer";
|
|
202
|
+
import { createSignal } from "solid-js";
|
|
203
|
+
|
|
204
|
+
export const CartSummary = () => {
|
|
205
|
+
const [count, setCount] = createSignal(3);
|
|
206
|
+
const content = useIntlayer("cart-summary");
|
|
207
|
+
|
|
208
|
+
return (
|
|
209
|
+
<section>
|
|
210
|
+
<h2>{content.total}</h2>
|
|
211
|
+
<p>{content.items(count())}</p>
|
|
212
|
+
</section>
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
`useIntlayer` returns reactive nodes backed by a signal, so a locale change updates only the DOM nodes that read them, with no component re-run. The same Solid rule still applies: `{content.total}` in JSX is tracked, `const title = content.total.value` in the setup body is a frozen string. Use `.value` for string attributes, and wrap it in a memo if it has to react.
|
|
218
|
+
|
|
219
|
+
<Tabs defaultTab="code">
|
|
220
|
+
<Tab label="Code" value="code">
|
|
221
|
+
|
|
222
|
+
<iframe
|
|
223
|
+
src="https://ide.intlayer.org/aymericzip/intlayer-solid-start-template?file=intlayer.config.ts"
|
|
224
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
225
|
+
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
226
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
227
|
+
loading="lazy"
|
|
228
|
+
/>
|
|
229
|
+
|
|
230
|
+
</Tab>
|
|
231
|
+
<Tab label="Demo" value="demo">
|
|
232
|
+
|
|
233
|
+
<iframe
|
|
234
|
+
src="https://intlayer-solid-start-template.vercel.app"
|
|
235
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
236
|
+
title="Demo - intlayer-solid-start-template"
|
|
237
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
238
|
+
loading="lazy"
|
|
239
|
+
/>
|
|
240
|
+
|
|
241
|
+
</Tab>
|
|
242
|
+
</Tabs>
|
|
243
|
+
|
|
244
|
+
Setup is `npx intlayer init`, then the `intlayer()` plugin in `vite.config.ts`. On SolidStart the plugin also registers a Nitro handler that reads the locale from the URL prefix, then the cookie, then `Accept-Language`, and redirects accordingly.
|
|
245
|
+
|
|
246
|
+
**What it costs you.** A build step is mandatory: no plugin, no dictionaries. The ecosystem is much smaller than i18next's, and smaller than most alternatives listed above, so expect fewer Stack Overflow answers. There is one SolidStart-specific trap: every file under `src/routes` with a default export becomes a route, so page-level `.content.ts` files must live outside that directory. Component content can stay co-located.
|
|
247
|
+
|
|
248
|
+
If you are on `solid-i18next` today, the [`@intlayer/i18next` compat adapter](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/i18next.md) aliases i18next imports at the bundler level so existing calls keep working while Intlayer serves the content, and the [migration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/migration_from_i18next_to_intlayer.md) covers moving off it afterwards.
|
|
249
|
+
|
|
250
|
+
## Common mistakes
|
|
251
|
+
|
|
252
|
+
- **Storing a translation in a `const` at setup.** The one bug this whole post is about. If it is not called inside JSX, an effect or a memo, it will never update.
|
|
253
|
+
- **Passing `t` to a helper that calls it once.** A formatting utility that takes the string instead of the accessor freezes it just as effectively.
|
|
254
|
+
- **Detecting the locale on the client in SolidStart.** The server already rendered. Read it from the URL so both sides agree.
|
|
255
|
+
- **Omitting `matchFilters` on `[[locale]]`.** `/unknown` renders your home page with a garbage locale instead of returning 404, and search engines index the duplicate.
|
|
256
|
+
- **Switching locale with a `<button>`.** Crawlers do not click. Render the switcher as real anchors pointing at each localized URL.
|
|
257
|
+
- **Assuming a per-component model is free.** You gain scoping and generated types, you lose the ability to hand a translator one JSON file without tooling.
|
|
258
|
+
|
|
259
|
+
## Going further
|
|
260
|
+
|
|
261
|
+
- [Solid i18n benchmark: bundle size, leakage and locale-switch timings](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md)
|
|
262
|
+
- [Set up i18n in a SolidStart app, step by step](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_solid_start.md)
|
|
263
|
+
- [Set up i18n in a Vite + Solid app](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_vite+solid.md)
|
|
264
|
+
- [Drop-in i18next compat adapter](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/i18next.md) and the [i18next migration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/migration_from_i18next_to_intlayer.md)
|
|
265
|
+
- [Per-component vs centralized i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/per-component_vs_centralized_i18n.md)
|
|
266
|
+
- [The same problem in Svelte, where runes change the rules](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/list_i18n_technologies/frameworks/svelte.md)
|
|
267
|
+
- [TanStack Start i18n: locale routing, SSR and the type tax](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/list_i18n_technologies/frameworks/tanstack-start.md)
|
|
268
|
+
- [How bundle optimization works at build time](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/bundle_optimization.md)
|