@intlayer/docs 7.5.11 → 7.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_i18next.md +0 -2
- package/blog/ar/intlayer_with_next-i18next.md +0 -2
- package/blog/ar/intlayer_with_react-i18next.md +0 -2
- package/blog/de/intlayer_with_i18next.md +0 -45
- package/blog/de/intlayer_with_next-i18next.md +0 -46
- package/blog/de/intlayer_with_react-i18next.md +0 -2
- package/blog/en/intlayer_with_i18next.md +0 -46
- package/blog/en/intlayer_with_next-i18next.md +0 -48
- package/blog/en/intlayer_with_next-intl.md +0 -44
- package/blog/en/intlayer_with_react-i18next.md +0 -44
- package/blog/en/intlayer_with_react-intl.md +0 -42
- package/blog/en/intlayer_with_vue-i18n.md +0 -44
- package/blog/en-GB/intlayer_with_i18next.md +0 -45
- package/blog/en-GB/intlayer_with_next-i18next.md +0 -47
- package/blog/en-GB/intlayer_with_next-intl.md +0 -42
- package/blog/en-GB/intlayer_with_react-i18next.md +0 -43
- package/blog/en-GB/intlayer_with_react-intl.md +0 -42
- package/blog/en-GB/intlayer_with_vue-i18n.md +0 -46
- package/blog/es/intlayer_with_i18next.md +0 -45
- package/blog/es/intlayer_with_next-i18next.md +0 -47
- package/blog/es/intlayer_with_next-intl.md +0 -42
- package/blog/es/intlayer_with_react-i18next.md +0 -43
- package/blog/es/intlayer_with_react-intl.md +0 -42
- package/blog/es/intlayer_with_vue-i18n.md +0 -46
- package/blog/fr/intlayer_with_i18next.md +0 -45
- package/blog/fr/intlayer_with_next-i18next.md +0 -47
- package/blog/fr/intlayer_with_next-intl.md +0 -42
- package/blog/fr/intlayer_with_react-i18next.md +0 -43
- package/blog/fr/intlayer_with_react-intl.md +0 -42
- package/blog/fr/intlayer_with_vue-i18n.md +0 -46
- package/blog/hi/intlayer_with_i18next.md +0 -2
- package/blog/hi/intlayer_with_next-i18next.md +0 -2
- package/blog/hi/intlayer_with_react-i18next.md +0 -2
- package/blog/id/intlayer_with_i18next.md +0 -2
- package/blog/id/intlayer_with_next-i18next.md +0 -2
- package/blog/id/intlayer_with_react-i18next.md +0 -2
- package/blog/it/intlayer_with_i18next.md +0 -2
- package/blog/it/intlayer_with_next-i18next.md +0 -2
- package/blog/it/intlayer_with_react-i18next.md +0 -2
- package/blog/ja/intlayer_with_i18next.md +0 -45
- package/blog/ja/intlayer_with_next-i18next.md +0 -46
- package/blog/ja/intlayer_with_next-intl.md +0 -42
- package/blog/ja/intlayer_with_react-i18next.md +0 -42
- package/blog/ja/intlayer_with_react-intl.md +0 -42
- package/blog/ja/intlayer_with_vue-i18n.md +0 -46
- package/blog/ko/intlayer_with_i18next.md +0 -2
- package/blog/ko/intlayer_with_next-i18next.md +0 -2
- package/blog/ko/intlayer_with_react-i18next.md +0 -1
- package/blog/pl/intlayer_with_i18next.md +0 -45
- package/blog/pl/intlayer_with_next-i18next.md +0 -46
- package/blog/pl/intlayer_with_next-intl.md +0 -42
- package/blog/pl/intlayer_with_react-i18next.md +0 -43
- package/blog/pl/intlayer_with_react-intl.md +0 -42
- package/blog/pl/intlayer_with_vue-i18n.md +0 -46
- package/blog/pt/intlayer_with_i18next.md +0 -2
- package/blog/pt/intlayer_with_next-i18next.md +0 -2
- package/blog/pt/intlayer_with_react-i18next.md +0 -2
- package/blog/ru/intlayer_with_i18next.md +0 -45
- package/blog/ru/intlayer_with_next-i18next.md +0 -47
- package/blog/ru/intlayer_with_next-intl.md +0 -42
- package/blog/ru/intlayer_with_react-i18next.md +0 -43
- package/blog/ru/intlayer_with_react-intl.md +0 -42
- package/blog/ru/intlayer_with_vue-i18n.md +0 -46
- package/blog/tr/intlayer_with_i18next.md +0 -2
- package/blog/tr/intlayer_with_next-i18next.md +0 -1
- package/blog/tr/intlayer_with_react-i18next.md +0 -2
- package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
- package/blog/uk/i18n_using_next-i18next.md +1086 -0
- package/blog/uk/i18n_using_next-intl.md +760 -0
- package/blog/uk/index.md +69 -0
- package/blog/uk/internationalization_and_SEO.md +273 -0
- package/blog/uk/intlayer_with_i18next.md +211 -0
- package/blog/uk/intlayer_with_next-i18next.md +202 -0
- package/blog/uk/intlayer_with_next-intl.md +203 -0
- package/blog/uk/intlayer_with_react-i18next.md +200 -0
- package/blog/uk/intlayer_with_react-intl.md +202 -0
- package/blog/uk/intlayer_with_vue-i18n.md +206 -0
- package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
- package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
- package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
- package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
- package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
- package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
- package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
- package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
- package/blog/uk/rag_powered_documentation_assistant.md +288 -0
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
- package/blog/uk/what_is_internationalization.md +167 -0
- package/blog/vi/intlayer_with_i18next.md +0 -2
- package/blog/vi/intlayer_with_next-i18next.md +0 -2
- package/blog/vi/intlayer_with_react-i18next.md +0 -2
- package/blog/zh/intlayer_with_i18next.md +0 -2
- package/blog/zh/intlayer_with_next-i18next.md +0 -2
- package/blog/zh/intlayer_with_react-i18next.md +0 -2
- package/blog/zh/intlayer_with_vue-i18n.md +0 -46
- package/dist/cjs/generated/blog.entry.cjs +58 -29
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +218 -99
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +50 -15
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +4 -2
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +58 -29
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +218 -99
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +50 -15
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +4 -2
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/configuration.md +6 -1
- package/docs/ar/dictionary/content_file.md +6 -1
- package/docs/ar/intlayer_with_next-i18next.md +0 -1
- package/docs/ar/intlayer_with_nextjs_14.md +28 -0
- package/docs/ar/intlayer_with_nextjs_15.md +28 -0
- package/docs/ar/intlayer_with_nextjs_16.md +28 -0
- package/docs/ar/intlayer_with_nextjs_no_locale_path.md +1159 -0
- package/docs/ar/plugins/sync-json.md +6 -2
- package/docs/de/configuration.md +6 -1
- package/docs/de/dictionary/content_file.md +6 -1
- package/docs/de/intlayer_with_next-i18next.md +0 -1
- package/docs/de/intlayer_with_nextjs_14.md +28 -0
- package/docs/de/intlayer_with_nextjs_15.md +28 -0
- package/docs/de/intlayer_with_nextjs_16.md +28 -0
- package/docs/de/intlayer_with_nextjs_no_locale_path.md +1152 -0
- package/docs/de/plugins/sync-json.md +6 -2
- package/docs/en/configuration.md +6 -1
- package/docs/en/dictionary/content_file.md +6 -1
- package/docs/en/intlayer_with_next-i18next.md +0 -1
- package/docs/en/intlayer_with_nextjs_14.md +28 -0
- package/docs/en/intlayer_with_nextjs_15.md +28 -0
- package/docs/en/intlayer_with_nextjs_16.md +31 -1
- package/docs/en/intlayer_with_nextjs_no_locale_path.md +1132 -0
- package/docs/en/plugins/sync-json.md +6 -2
- package/docs/en-GB/configuration.md +6 -1
- package/docs/en-GB/dictionary/content_file.md +3 -1
- package/docs/en-GB/intlayer_with_next-i18next.md +0 -1
- package/docs/en-GB/intlayer_with_nextjs_14.md +28 -0
- package/docs/en-GB/intlayer_with_nextjs_15.md +28 -0
- package/docs/en-GB/intlayer_with_nextjs_16.md +28 -0
- package/docs/en-GB/intlayer_with_nextjs_no_locale_path.md +1154 -0
- package/docs/en-GB/plugins/sync-json.md +6 -2
- package/docs/es/configuration.md +6 -1
- package/docs/es/dictionary/content_file.md +6 -1
- package/docs/es/intlayer_with_next-i18next.md +0 -1
- package/docs/es/intlayer_with_nextjs_14.md +28 -0
- package/docs/es/intlayer_with_nextjs_15.md +28 -0
- package/docs/es/intlayer_with_nextjs_16.md +28 -0
- package/docs/es/intlayer_with_nextjs_no_locale_path.md +1143 -0
- package/docs/es/plugins/sync-json.md +6 -2
- package/docs/fr/configuration.md +6 -1
- package/docs/fr/dictionary/content_file.md +3 -1
- package/docs/fr/intlayer_with_next-i18next.md +0 -1
- package/docs/fr/intlayer_with_nextjs_14.md +28 -0
- package/docs/fr/intlayer_with_nextjs_15.md +28 -0
- package/docs/fr/intlayer_with_nextjs_16.md +28 -0
- package/docs/fr/intlayer_with_nextjs_no_locale_path.md +1174 -0
- package/docs/fr/plugins/sync-json.md +9 -5
- package/docs/hi/configuration.md +6 -1
- package/docs/hi/dictionary/content_file.md +3 -1
- package/docs/hi/intlayer_with_next-i18next.md +0 -1
- package/docs/hi/intlayer_with_nextjs_14.md +28 -0
- package/docs/hi/intlayer_with_nextjs_15.md +28 -0
- package/docs/hi/intlayer_with_nextjs_16.md +28 -0
- package/docs/hi/intlayer_with_nextjs_no_locale_path.md +1151 -0
- package/docs/hi/plugins/sync-json.md +6 -2
- package/docs/id/configuration.md +6 -1
- package/docs/id/dictionary/content_file.md +3 -1
- package/docs/id/intlayer_with_next-i18next.md +0 -1
- package/docs/id/intlayer_with_nextjs_14.md +28 -0
- package/docs/id/intlayer_with_nextjs_15.md +28 -0
- package/docs/id/intlayer_with_nextjs_16.md +28 -0
- package/docs/id/intlayer_with_nextjs_no_locale_path.md +1154 -0
- package/docs/id/plugins/sync-json.md +6 -2
- package/docs/it/configuration.md +6 -1
- package/docs/it/dictionary/content_file.md +3 -1
- package/docs/it/intlayer_with_next-i18next.md +0 -1
- package/docs/it/intlayer_with_nextjs_14.md +28 -0
- package/docs/it/intlayer_with_nextjs_15.md +28 -0
- package/docs/it/intlayer_with_nextjs_16.md +28 -0
- package/docs/it/intlayer_with_nextjs_no_locale_path.md +1148 -0
- package/docs/it/plugins/sync-json.md +6 -2
- package/docs/ja/configuration.md +6 -1
- package/docs/ja/dictionary/content_file.md +3 -1
- package/docs/ja/intlayer_with_next-i18next.md +0 -1
- package/docs/ja/intlayer_with_nextjs_14.md +28 -0
- package/docs/ja/intlayer_with_nextjs_15.md +28 -0
- package/docs/ja/intlayer_with_nextjs_16.md +28 -0
- package/docs/ja/intlayer_with_nextjs_no_locale_path.md +1222 -0
- package/docs/ja/plugins/sync-json.md +6 -2
- package/docs/ko/configuration.md +6 -1
- package/docs/ko/dictionary/content_file.md +3 -1
- package/docs/ko/intlayer_with_next-i18next.md +0 -1
- package/docs/ko/intlayer_with_nextjs_14.md +28 -0
- package/docs/ko/intlayer_with_nextjs_15.md +28 -0
- package/docs/ko/intlayer_with_nextjs_16.md +28 -0
- package/docs/ko/intlayer_with_nextjs_no_locale_path.md +1205 -0
- package/docs/ko/plugins/sync-json.md +6 -2
- package/docs/pl/configuration.md +3 -1
- package/docs/pl/dictionary/content_file.md +3 -1
- package/docs/pl/intlayer_with_next-i18next.md +0 -1
- package/docs/pl/intlayer_with_nextjs_14.md +28 -0
- package/docs/pl/intlayer_with_nextjs_15.md +28 -0
- package/docs/pl/intlayer_with_nextjs_16.md +28 -0
- package/docs/pl/intlayer_with_nextjs_no_locale_path.md +1149 -0
- package/docs/pl/plugins/sync-json.md +6 -2
- package/docs/pt/configuration.md +6 -1
- package/docs/pt/dictionary/content_file.md +3 -1
- package/docs/pt/intlayer_with_next-i18next.md +0 -1
- package/docs/pt/intlayer_with_nextjs_14.md +28 -0
- package/docs/pt/intlayer_with_nextjs_15.md +28 -0
- package/docs/pt/intlayer_with_nextjs_16.md +28 -0
- package/docs/pt/intlayer_with_nextjs_no_locale_path.md +1152 -0
- package/docs/pt/plugins/sync-json.md +6 -2
- package/docs/ru/configuration.md +6 -1
- package/docs/ru/dictionary/content_file.md +6 -1
- package/docs/ru/intlayer_with_next-i18next.md +0 -1
- package/docs/ru/intlayer_with_nextjs_14.md +28 -0
- package/docs/ru/intlayer_with_nextjs_15.md +28 -0
- package/docs/ru/intlayer_with_nextjs_16.md +28 -0
- package/docs/ru/intlayer_with_nextjs_no_locale_path.md +1204 -0
- package/docs/ru/plugins/sync-json.md +6 -2
- package/docs/tr/configuration.md +6 -1
- package/docs/tr/dictionary/content_file.md +3 -1
- package/docs/tr/intlayer_with_next-i18next.md +0 -1
- package/docs/tr/intlayer_with_nextjs_14.md +28 -0
- package/docs/tr/intlayer_with_nextjs_15.md +28 -0
- package/docs/tr/intlayer_with_nextjs_16.md +28 -0
- package/docs/tr/intlayer_with_nextjs_no_locale_path.md +1159 -0
- package/docs/tr/plugins/sync-json.md +6 -2
- package/docs/uk/CI_CD.md +198 -0
- package/docs/uk/autoFill.md +307 -0
- package/docs/uk/bundle_optimization.md +185 -0
- package/docs/uk/cli/build.md +64 -0
- package/docs/uk/cli/ci.md +137 -0
- package/docs/uk/cli/configuration.md +63 -0
- package/docs/uk/cli/debug.md +46 -0
- package/docs/uk/cli/doc-review.md +43 -0
- package/docs/uk/cli/doc-translate.md +132 -0
- package/docs/uk/cli/editor.md +28 -0
- package/docs/uk/cli/fill.md +130 -0
- package/docs/uk/cli/index.md +190 -0
- package/docs/uk/cli/init.md +84 -0
- package/docs/uk/cli/list.md +90 -0
- package/docs/uk/cli/list_projects.md +128 -0
- package/docs/uk/cli/live.md +41 -0
- package/docs/uk/cli/login.md +157 -0
- package/docs/uk/cli/pull.md +78 -0
- package/docs/uk/cli/push.md +98 -0
- package/docs/uk/cli/sdk.md +71 -0
- package/docs/uk/cli/test.md +76 -0
- package/docs/uk/cli/transform.md +65 -0
- package/docs/uk/cli/version.md +24 -0
- package/docs/uk/cli/watch.md +37 -0
- package/docs/uk/compiler.md +133 -0
- package/docs/uk/component_i18n.md +194 -0
- package/docs/uk/configuration.md +742 -0
- package/docs/uk/dictionary/condition.md +237 -0
- package/docs/uk/dictionary/content_file.md +1134 -0
- package/docs/uk/dictionary/enumeration.md +245 -0
- package/docs/uk/dictionary/file.md +232 -0
- package/docs/uk/dictionary/function_fetching.md +212 -0
- package/docs/uk/dictionary/gender.md +273 -0
- package/docs/uk/dictionary/insertion.md +187 -0
- package/docs/uk/dictionary/markdown.md +383 -0
- package/docs/uk/dictionary/nesting.md +273 -0
- package/docs/uk/dictionary/translation.md +332 -0
- package/docs/uk/formatters.md +595 -0
- package/docs/uk/how_works_intlayer.md +256 -0
- package/docs/uk/index.md +175 -0
- package/docs/uk/interest_of_intlayer.md +297 -0
- package/docs/uk/intlayer_CMS.md +569 -0
- package/docs/uk/intlayer_visual_editor.md +292 -0
- package/docs/uk/intlayer_with_angular.md +710 -0
- package/docs/uk/intlayer_with_astro.md +256 -0
- package/docs/uk/intlayer_with_create_react_app.md +1258 -0
- package/docs/uk/intlayer_with_express.md +429 -0
- package/docs/uk/intlayer_with_fastify.md +446 -0
- package/docs/uk/intlayer_with_lynx+react.md +548 -0
- package/docs/uk/intlayer_with_nestjs.md +283 -0
- package/docs/uk/intlayer_with_next-i18next.md +640 -0
- package/docs/uk/intlayer_with_next-intl.md +456 -0
- package/docs/uk/intlayer_with_nextjs_14.md +1646 -0
- package/docs/uk/intlayer_with_nextjs_15.md +1910 -0
- package/docs/uk/intlayer_with_nextjs_16.md +1763 -0
- package/docs/uk/intlayer_with_nextjs_no_locale_path.md +1159 -0
- package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
- package/docs/uk/intlayer_with_nuxt.md +711 -0
- package/docs/uk/intlayer_with_react_native+expo.md +715 -0
- package/docs/uk/intlayer_with_react_router_v7.md +600 -0
- package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
- package/docs/uk/intlayer_with_svelte_kit.md +579 -0
- package/docs/uk/intlayer_with_tanstack.md +818 -0
- package/docs/uk/intlayer_with_vite+preact.md +1748 -0
- package/docs/uk/intlayer_with_vite+react.md +1449 -0
- package/docs/uk/intlayer_with_vite+solid.md +302 -0
- package/docs/uk/intlayer_with_vite+svelte.md +520 -0
- package/docs/uk/intlayer_with_vite+vue.md +1113 -0
- package/docs/uk/introduction.md +222 -0
- package/docs/uk/locale_mapper.md +242 -0
- package/docs/uk/mcp_server.md +211 -0
- package/docs/uk/packages/express-intlayer/t.md +465 -0
- package/docs/uk/packages/intlayer/getConfiguration.md +145 -0
- package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
- package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
- package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
- package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
- package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/uk/packages/intlayer/getPrefix.md +213 -0
- package/docs/uk/packages/intlayer/getTranslation.md +190 -0
- package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
- package/docs/uk/packages/next-intlayer/t.md +365 -0
- package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
- package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
- package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
- package/docs/uk/packages/react-intlayer/t.md +311 -0
- package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
- package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
- package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
- package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
- package/docs/uk/per_locale_file.md +345 -0
- package/docs/uk/plugins/sync-json.md +398 -0
- package/docs/uk/readme.md +265 -0
- package/docs/uk/releases/v6.md +305 -0
- package/docs/uk/releases/v7.md +624 -0
- package/docs/uk/roadmap.md +346 -0
- package/docs/uk/testing.md +204 -0
- package/docs/uk/vs_code_extension.md +133 -0
- package/docs/vi/configuration.md +6 -1
- package/docs/vi/dictionary/content_file.md +6 -1
- package/docs/vi/intlayer_with_next-i18next.md +0 -1
- package/docs/vi/intlayer_with_nextjs_14.md +28 -0
- package/docs/vi/intlayer_with_nextjs_15.md +28 -0
- package/docs/vi/intlayer_with_nextjs_16.md +28 -0
- package/docs/vi/intlayer_with_nextjs_no_locale_path.md +1151 -0
- package/docs/vi/plugins/sync-json.md +6 -2
- package/docs/zh/configuration.md +6 -1
- package/docs/zh/dictionary/content_file.md +6 -1
- package/docs/zh/intlayer_with_next-i18next.md +0 -1
- package/docs/zh/intlayer_with_nextjs_14.md +28 -0
- package/docs/zh/intlayer_with_nextjs_15.md +28 -0
- package/docs/zh/intlayer_with_nextjs_16.md +28 -0
- package/docs/zh/intlayer_with_nextjs_no_locale_path.md +1206 -0
- package/docs/zh/plugins/sync-json.md +9 -5
- package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/ar/error-vite-env-only.md +77 -0
- package/frequent_questions/de/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/de/error-vite-env-only.md +77 -0
- package/frequent_questions/en/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/en/error-vite-env-only.md +77 -0
- package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
- package/frequent_questions/es/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/es/error-vite-env-only.md +76 -0
- package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/fr/error-vite-env-only.md +77 -0
- package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/hi/error-vite-env-only.md +77 -0
- package/frequent_questions/id/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/id/error-vite-env-only.md +77 -0
- package/frequent_questions/it/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/it/error-vite-env-only.md +77 -0
- package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/ja/error-vite-env-only.md +77 -0
- package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/ko/error-vite-env-only.md +77 -0
- package/frequent_questions/pl/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/pl/error-vite-env-only.md +77 -0
- package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/pt/error-vite-env-only.md +77 -0
- package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/ru/error-vite-env-only.md +77 -0
- package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/tr/error-vite-env-only.md +77 -0
- package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/uk/array_as_content_declaration.md +72 -0
- package/frequent_questions/uk/build_dictionaries.md +58 -0
- package/frequent_questions/uk/build_error_CI_CD.md +74 -0
- package/frequent_questions/uk/bun_set_up.md +53 -0
- package/frequent_questions/uk/customized_locale_list.md +64 -0
- package/frequent_questions/uk/domain_routing.md +113 -0
- package/frequent_questions/uk/error-vite-env-only.md +77 -0
- package/frequent_questions/uk/esbuild_error.md +29 -0
- package/frequent_questions/uk/get_locale_cookie.md +142 -0
- package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
- package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
- package/frequent_questions/uk/package_version_error.md +181 -0
- package/frequent_questions/uk/static_rendering.md +44 -0
- package/frequent_questions/uk/translated_path_url.md +55 -0
- package/frequent_questions/uk/unknown_command.md +97 -0
- package/frequent_questions/vi/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/vi/error-vite-env-only.md +77 -0
- package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -1
- package/frequent_questions/zh/error-vite-env-only.md +77 -0
- package/legal/uk/privacy_notice.md +83 -0
- package/legal/uk/terms_of_service.md +55 -0
- package/package.json +6 -6
- package/src/generated/blog.entry.ts +29 -0
- package/src/generated/docs.entry.ts +119 -0
- package/src/generated/frequentQuestions.entry.ts +35 -0
- package/src/generated/legal.entry.ts +2 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-01-16
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Найкращі інструменти інтернаціоналізації (i18n) для Angular
|
|
5
|
+
description: Дізнайтеся про провідні рішення для i18n в Angular, щоб вирішувати проблеми з перекладом, покращувати SEO та забезпечувати безшовний глобальний досвід користувачів.
|
|
6
|
+
keywords:
|
|
7
|
+
- Angular
|
|
8
|
+
- i18n
|
|
9
|
+
- багатомовність
|
|
10
|
+
- SEO
|
|
11
|
+
- Інтернаціоналізація
|
|
12
|
+
- Блог
|
|
13
|
+
- JavaScript
|
|
14
|
+
slugs:
|
|
15
|
+
- blog
|
|
16
|
+
- i18n-technologies
|
|
17
|
+
- frameworks
|
|
18
|
+
- angular
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Дослідження i18n-рішень для перекладу вашого сайту на Angular
|
|
22
|
+
|
|
23
|
+
У сучасному взаємопов'язаному світі пропонування вашого вебсайту кількома мовами може значно розширити охоплення та покращити користувацький досвід. Для розробників, які працюють з Angular, впровадження інтернаціоналізації (i18n) має вирішальне значення для ефективного керування перекладами, збереження структури додатка, SEO та продуктивності. У цій статті ми розглянемо різні підходи до i18n — від вбудованих рішень Angular до популярних сторонніх бібліотек — щоб допомогти вам визначити найкращий варіант для вашого проєкту.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
## Що таке інтернаціоналізація (i18n)?
|
|
30
|
+
|
|
31
|
+
Інтернаціоналізація, часто позначувана як i18n, — це процес проєктування та підготовки вашого застосунку для підтримки кількох мов і культурних контекстів. В Angular це передбачає налаштування застосунку таким чином, щоб текст, дати, числа і навіть макети інтерфейсу безшовно адаптувалися до різних локалей. Ретельна підготовка гарантує, що подальша інтеграція перекладів залишатиметься організованою й ефективною.
|
|
32
|
+
|
|
33
|
+
Дізнайтесь більше про основи i18n у нашій статті: [Що таке інтернаціоналізація (i18n)? Визначення та виклики](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/what_is_internationalization.md).
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Виклики перекладу для Angular-застосунків
|
|
38
|
+
|
|
39
|
+
Переклад Angular-застосунку створює низку викликів:
|
|
40
|
+
|
|
41
|
+
- **Компонентно-орієнтована структура**: модульний підхід Angular (з components, modules та services) означає, що рядки перекладу можуть бути розкидані по codebase, тож критично важливо централізувати їх і ефективно ними керувати.
|
|
42
|
+
- **Динамічний контент**: обробка контенту в реальному часі (наприклад, дані з REST API, контент, створений користувачами) потребує ретельного підходу, щоб гарантувати, що нові рядки також перекладаються.
|
|
43
|
+
- **Питання SEO**: якщо ви використовуєте Angular Universal для server-side rendering, потрібно налаштувати локалізовані URL-адреси, meta-теги та sitemaps, щоб зробити ваші багатомовні сторінки дружніми до пошукових систем.
|
|
44
|
+
- **Маршрутизація та стан**: забезпечення збереження правильної мови під час навігації між маршрутами вимагає управління станом і, можливо, кастомних route guards або interceptors.
|
|
45
|
+
- **Масштабованість та обслуговування**: Файли перекладів можуть швидко зростати, і підтримувати їх організованими, версійованими та синхронізованими зі змінами вашого застосунку може бути постійним завданням.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Провідні i18n-рішення для Angular
|
|
50
|
+
|
|
51
|
+
Angular надає вбудований фреймворк i18n, а також існує кілька сторонніх бібліотек, що спрощують налаштування багатомовності. Нижче — деякі з найпопулярніших рішень.
|
|
52
|
+
|
|
53
|
+
### 1. Вбудований i18n Angular
|
|
54
|
+
|
|
55
|
+
**Огляд**
|
|
56
|
+
Angular постачається з **вбудованою системою i18n**, яка включає інструменти для вилучення рядків перекладу, опрацювання форм множини та інтерполяції повідомлень, а також інтеграції перекладів під час компіляції. Це офіційне рішення підходить для менших проєктів або тих, що можуть тісно узгодитися з рекомендованою структурою Angular.
|
|
57
|
+
|
|
58
|
+
**Ключові можливості**
|
|
59
|
+
|
|
60
|
+
- **Рідна інтеграція**: Не потрібна додаткова бібліотека; працює із коробки з проектами Angular.
|
|
61
|
+
- **Переклади на етапі компіляції**: Angular CLI витягує текст для перекладів, і ви збираєте окремі бандли для кожної мови. Такий підхід може призвести до кращої продуктивності під час виконання, оскільки переклади компілюються в код.
|
|
62
|
+
- **Легке опрацювання множини та роду**: Вбудовані можливості для складної обробки форм множини та інтерполяції повідомлень.
|
|
63
|
+
- **AOT та production-збірки**: Повністю сумісна з Ahead-of-Time (AOT) компіляцією Angular, що забезпечує оптимізовані production-бандли.
|
|
64
|
+
|
|
65
|
+
**Зауваги**
|
|
66
|
+
|
|
67
|
+
- **Кілька збірок**: Кожна мова вимагає власної збірки, що може призвести до ускладнення сценаріїв розгортання.
|
|
68
|
+
- **Динамічний вміст**: Обробка вмісту в реальному часі або керованого користувачем може вимагати власної логіки, оскільки вбудоване рішення Angular орієнтоване на переклади, що виконуються під час компіляції.
|
|
69
|
+
- **Обмежена гнучкість під час виконання**: Перемикання мов на льоту (без перезавантаження додатка) може бути складним, бо переклади вбудовуються під час збірки.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
### 2. ngx-translate
|
|
74
|
+
|
|
75
|
+
Вебсайт: [https://github.com/ngx-translate/core](https://github.com/ngx-translate/core)
|
|
76
|
+
|
|
77
|
+
**Огляд**
|
|
78
|
+
**ngx-translate** — одна з найвідоміших сторонніх бібліотек i18n в екосистемі Angular. Вона дозволяє переклад під час виконання, даючи змогу завантажувати мовні файли за потреби та динамічно змінювати локаль без повторної збірки усього застосунку.
|
|
79
|
+
|
|
80
|
+
**Ключові особливості**
|
|
81
|
+
|
|
82
|
+
- **Динамічні переклади (Runtime Translations)**: Ідеально підходить для динамічної зміни мови та сценаріїв, де ви не хочете мати кілька production-збірок.
|
|
83
|
+
- **JSON-файли перекладів (JSON Translation Files)**: Зберігайте переклади в простих JSON-файлах, що спрощує їхню структуру та підтримку.
|
|
84
|
+
- **Асинхронне завантаження (Async Loading)**: Ледаче завантаження перекладів дозволяє зменшити початковий розмір бандла.
|
|
85
|
+
- **Підтримка кількох мов (Multiple Language Support)**: Миттєва зміна локалі та можливість відстежувати зміни мови в компонентах.
|
|
86
|
+
|
|
87
|
+
**Зауваження**
|
|
88
|
+
|
|
89
|
+
- **State & Complexity**: Управління великою кількістю файлів перекладів може стати складним у великих застосунках.
|
|
90
|
+
- **SEO & SSR**: Якщо потрібен server-side rendering з Angular Universal, ngx-translate вимагає додаткової налаштування, щоб переконатися, що коректні переклади доставляються краулерам і браузерам при першому завантаженні.
|
|
91
|
+
- **Продуктивність**: Хоча гнучкість у режимі runtime забезпечує зручність, обробка великої кількості перекладів на великих сторінках може впливати на продуктивність, тому рекомендуються стратегії кешування.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### 3. Transloco
|
|
96
|
+
|
|
97
|
+
Вебсайт: [https://ngneat.github.io/transloco/](https://ngneat.github.io/transloco/)
|
|
98
|
+
|
|
99
|
+
**Огляд**
|
|
100
|
+
**Transloco** — сучасна, створена спільнотою бібліотека i18n для Angular, що робить акцент на масштабованій архітектурі та зручності для розробника. Вона пропонує плагінну архітектуру для безшовної інтеграції з існуючою Angular-кодовою базою.
|
|
101
|
+
|
|
102
|
+
**Ключові можливості**
|
|
103
|
+
|
|
104
|
+
- **Інтеграція з управлінням станом**: З коробки сумісна з бібліотеками управління станом, такими як NgRx та Akita.
|
|
105
|
+
- **Відкладене завантаження (Lazy Loading)**: Розбивайте переклади на окремі чанки та завантажуйте їх лише за потреби.
|
|
106
|
+
- **Розвинена екосистема плагінів**: Обробляє все — від інтеграції SSR до автоматичного витягання повідомлень.
|
|
107
|
+
- **Runtime або build-time**: Надає гнучкість для різних робочих процесів перекладу, чи ви віддаєте перевагу runtime-перемиканню або попередньо збудованій локалізації.
|
|
108
|
+
|
|
109
|
+
**Питання для розгляду**
|
|
110
|
+
|
|
111
|
+
- **Крива навчання**: Хоча документація детальна, підхід на основі плагінів може вимагати додаткових кроків для просунутих сценаріїв (наприклад, SSR, маршрути з декількома мовами).
|
|
112
|
+
- **Розмір спільноти**: Transloco має активну спільноту, але вона все ще зростає порівняно з вбудованим рішенням Angular або ngx-translate.
|
|
113
|
+
- **Структура папок**: Підтримувати організованість перекладів може бути складно в дуже великих додатках. Важливо мати добре продуману структуру папок та конвенції іменування.
|
|
114
|
+
|
|
115
|
+
### Висновки
|
|
116
|
+
|
|
117
|
+
При виборі підходу до i18n для вашого Angular-додатка:
|
|
118
|
+
|
|
119
|
+
- **Оцініть вимоги проєкту**: Врахуйте такі фактори, як динамічне перемикання мов, швидкість розробки та потреби інтеграції зі сторонніми сервісами.
|
|
120
|
+
- **Перевірте SSR & SEO**: Якщо ви використовуєте Angular Universal для серверного рендерингу, переконайтеся, що обране рішення плавно інтегрується з локалізованими метаданими та обробкою маршрутів.
|
|
121
|
+
- **Продуктивність та стратегія збірки**: Оцініть, чи потрібні вам кілька результатів збірки (для кожної мови), або ви віддаєте перевагу одному бандлу з перекладами під час виконання.
|
|
122
|
+
- **Супроводжуваність та масштабування**: Для великих додатків переконайтеся, що бібліотека підтримує чисту структуру файлів, типізовані ключі (якщо потрібно) та простий процес оновлення.
|
|
123
|
+
- **Досвід розробника**: Автодоповнення TypeScript, екосистема плагінів та CLI-інструменти значно зменшують тертя при оновленні або додаванні нових перекладів.
|
|
124
|
+
|
|
125
|
+
Усі розглянуті бібліотеки можуть забезпечити надійний багатомовний Angular-додаток, кожна має свої сильні сторони. Найкращий вибір залежить від ваших унікальних потреб щодо **performance**, **workflow**, **developer experience** та **business goals**.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-01-16
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Найкращі інструменти інтернаціоналізації (i18n) для Flutter
|
|
5
|
+
description: Дізнайтеся про провідні рішення i18n для Flutter, які допоможуть вирішити проблеми з перекладом, покращити SEO і забезпечити безперебійний глобальний веб-досвід.
|
|
6
|
+
keywords:
|
|
7
|
+
- Flutter
|
|
8
|
+
- i18n
|
|
9
|
+
- багатомовний
|
|
10
|
+
- SEO
|
|
11
|
+
- Інтернаціоналізація
|
|
12
|
+
- Блог
|
|
13
|
+
- JavaScript
|
|
14
|
+
- Flutter
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- i18n-technologies
|
|
18
|
+
- frameworks
|
|
19
|
+
- flutter
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Огляд рішень i18n для перекладу вашого Flutter-додатку
|
|
23
|
+
|
|
24
|
+
У світі, що стає все більш зв'язаним, пропонування вашого Flutter-додатка кількома мовами може розширити його охоплення та покращити зручність використання для користувачів, які не розмовляють англійською. Реалізація інтернаціоналізації (i18n) у Flutter гарантує правильну локалізацію тексту, дат та іншої інформації, чутливої до культурного контексту. У цій статті ми розглянемо різні підходи до i18n у Flutter — від офіційних фреймворків до бібліотек, створених спільнотою, щоб ви могли обрати найкраще рішення для свого проєкту.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
## Що таке інтернаціоналізація (i18n)?
|
|
31
|
+
|
|
32
|
+
Інтернаціоналізація, загально відома як i18n, — це процес проєктування застосунку таким чином, щоб він міг легко підтримувати кілька мов та культурних форматів. У Flutter це передбачає налаштування застосунку для керування локалізованими рядками, форматами дат/часу та форматами чисел без зайвих зусиль. Готуючи ваш Flutter-застосунок до i18n, ви створюєте надійну основу для інтеграції перекладів і обробки регіональних відмінностей з мінімальним тертям.
|
|
33
|
+
|
|
34
|
+
Якщо ви новачок у цій темі, перегляньте нашу статтю: [What is Internationalization (i18n)? Definition and Challenges](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/what_is_internationalization.md).
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Виклики перекладу для Flutter-застосунків
|
|
39
|
+
|
|
40
|
+
Реактивна та орієнтована на віджети архітектура Flutter створює низку унікальних проблем для i18n:
|
|
41
|
+
|
|
42
|
+
- **Інтерфейс на основі віджетів**: Текстові рядки можуть бути розкидані по різних віджетах, тому потрібен систематичний спосіб централізувати переклади, зберігаючи реактивність UI.
|
|
43
|
+
- **Динамічний контент**: Переклади для даних у реальному часі або отриманих (наприклад, з REST API або Firebase) можуть ускладнити налаштування.
|
|
44
|
+
- **Управління станом**: Підтримка правильної локалі під час навігації додатком і переходів стану може вимагати рішень, таких як `Provider`, `Riverpod` або `Bloc`.
|
|
45
|
+
- **Material vs. Cupertino**: Flutter пропонує кросплатформенні UI-віджети для Android (Material) та iOS (Cupertino), тому забезпечення узгодженого i18n для обох може додати складнощів.
|
|
46
|
+
- **Розгортання та оновлення**: Підтримка кількох мов може означати більші бандли додатку або завантаження мовних ресурсів за запитом, що вимагає стратегії, яка збалансовує продуктивність та досвід користувача.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Провідні i18n-рішення для Flutter
|
|
51
|
+
|
|
52
|
+
Flutter надає офіційну підтримку локалізації, а спільнота розробила додаткові бібліотеки, які спрощують управління кількома локалями. Нижче наведено деякі поширені підходи.
|
|
53
|
+
|
|
54
|
+
### 1. Офіційна i18n у Flutter (intl + ARB файли)
|
|
55
|
+
|
|
56
|
+
**Огляд**
|
|
57
|
+
Flutter постачається з офіційною підтримкою локалізації через пакет [`intl`](https://pub.dev/packages/intl) та інтеграцію з бібліотекою `flutter_localizations`. Цей підхід зазвичай використовує **ARB (Application Resource Bundle)** файли для збереження та керування вашими перекладами.
|
|
58
|
+
|
|
59
|
+
**Ключові особливості**
|
|
60
|
+
|
|
61
|
+
- **Офіційний та інтегрований**: Немає потреби в зовнішніх бібліотеках — `MaterialApp` і `CupertinoApp` можуть безпосередньо посилатися на ваші локалізації.
|
|
62
|
+
- **Пакет intl**: Надає форматування дат і чисел, множинні форми (plurals), обробку гендеру та інші можливості на основі ICU.
|
|
63
|
+
- **Перевірки під час компіляції**: Генерація коду з ARB-файлів допомагає виявляти відсутні переклади під час компіляції.
|
|
64
|
+
- **Міцна підтримка спільноти**: Підтримується Google і має велику кількість документації та прикладів.
|
|
65
|
+
|
|
66
|
+
**Міркування**
|
|
67
|
+
|
|
68
|
+
- **Ручне налаштування**: Вам доведеться сконфігурувати ARB-файли, налаштувати `MaterialApp` або `CupertinoApp` з `localizationsDelegates` і керувати кількома `.arb` файлами для кожної мови.
|
|
69
|
+
- **Hot Reload/Restart**: Зміна мови під час виконання зазвичай вимагає повного перезапуску додатка, щоб застосувати нову локаль.
|
|
70
|
+
- **Масштабованість**: Для більших додатків кількість ARB-файлів може зрости, що вимагає дисциплінованої структури папок.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
### 2. Easy Localization
|
|
75
|
+
|
|
76
|
+
Repository: [https://pub.dev/packages/easy_localization](https://pub.dev/packages/easy_localization)
|
|
77
|
+
|
|
78
|
+
**Огляд**
|
|
79
|
+
**Easy Localization** — це бібліотека, керована спільнотою, розроблена для спрощення задач локалізації у Flutter. Вона зосереджена на більш динамічному підході до завантаження та переключення мов, часто з мінімальною кількістю шаблонного коду.
|
|
80
|
+
|
|
81
|
+
**Ключові особливості**
|
|
82
|
+
|
|
83
|
+
- **Спрощене налаштування**: Ви можете обгорнути ваш кореневий віджет у `EasyLocalization`, щоб без зусиль керувати підтримуваними локалями та перекладами.
|
|
84
|
+
- **Перемикання мови в режимі виконання**: Змінюйте мову додатку на льоту без ручного перезапуску, покращуючи досвід користувача.
|
|
85
|
+
- **JSON/YAML/CSV**: Зберігайте переклади в різних форматах файлів для гнучкості.
|
|
86
|
+
- **Pluralization & Context**: Базові можливості для керування формами множини та контекстно-залежними перекладами.
|
|
87
|
+
|
|
88
|
+
**Зауваження**
|
|
89
|
+
|
|
90
|
+
- **Менше детального контролю**: Хоча простіше, у вас може бути менше тонко налаштованого контролю над оптимізаціями під час збірки порівняно з офіційним підходом ARB.
|
|
91
|
+
- **Продуктивність**: Завантаження кількох великих файлів перекладів під час виконання може вплинути на час старту для великих додатків.
|
|
92
|
+
- **Спільнота та оновлення**: Активно керується спільнотою, що може бути перевагою для підтримки, але також означає, що API або підхід можуть змінюватися з часом.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### 3. Flutter_i18n
|
|
97
|
+
|
|
98
|
+
Repository: [https://pub.dev/packages/flutter_i18n](https://pub.dev/packages/flutter_i18n)
|
|
99
|
+
|
|
100
|
+
**Огляд**
|
|
101
|
+
**Flutter_i18n** пропонує підхід, схожий на Easy Localization, з акцентом на зберіганні перекладів і логіки поза вашим основним кодом віджетів. Підтримує як синхронне, так і асинхронне завантаження файлів локалізації.
|
|
102
|
+
|
|
103
|
+
**Ключові можливості**
|
|
104
|
+
|
|
105
|
+
- **Декілька форматів файлів**: Використовуйте JSON або YAML для зберігання перекладів.
|
|
106
|
+
- **Підтримка Hot Reload**: Ви можете динамічно перемикати мови та миттєво бачити зміни в режимі розробки.
|
|
107
|
+
- **i18n Widgets & Hooks**: Надає спеціалізовані віджети, такі як `I18nText`, для спрощеного використання в UI, а також hooks для рішень на основі стану.
|
|
108
|
+
- **Локалізація на рівні маршрутів**: Прив'язуйте конкретні локалі до певних маршрутів або модулів, що зручно для великих додатків.
|
|
109
|
+
|
|
110
|
+
**Міркування**
|
|
111
|
+
|
|
112
|
+
- **Ручне керування мовами**: Потрібно ретельно управляти змінами локалі, щоб уникнути умов гонки або застарілих даних.
|
|
113
|
+
- **Наклад інтеграції**: Хоча гнучка, налаштування розширених можливостей (наприклад, вкладені переклади або fallback локалі) може вимагати додаткової конфігурації.
|
|
114
|
+
- **Зрілість спільноти**: Досить зріла з постійними оновленнями, але менш офіційна порівняно з базовим Flutter-рішенням.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### Підсумкові думки
|
|
119
|
+
|
|
120
|
+
При оцінці підходу до i18n для Flutter:
|
|
121
|
+
|
|
122
|
+
1. **Визначте свій робочий процес**: Вирішіть, чи віддаєте перевагу перекладам на етапі компіляції (через ARB + `intl`) для кращої типобезпеки та продуктивності, або перекладам під час виконання (через Easy Localization, Flutter_i18n) для більшої гнучкості.
|
|
123
|
+
2. **Перемикання мови**: Якщо критично важливе миттєве перемикання мови без перезапуску додатка, розгляньте бібліотеку, що працює під час виконання.
|
|
124
|
+
3. **Масштабованість і організація**: У міру зростання вашого Flutter-додатка плануйте, як ви організовуватимете, називатимете та версуватимете файли перекладів. Це особливо актуально при роботі з великою кількістю локалей.
|
|
125
|
+
4. **Продуктивність проти гнучкості**: Кожен підхід має свої компроміси. Попередньо скомпільовані рішення зазвичай забезпечують менші накладні витрати під час виконання, тоді як переклади "на льоту" забезпечують більш плавний досвід користувача.
|
|
126
|
+
5. **Спільнота та екосистема**: Офіційні рішення, такі як ARB + `intl`, зазвичай забезпечують довгострокову стабільність. Сторонні бібліотеки пропонують додаткову зручність і функції під час виконання, але можуть вимагати більшої уважності щодо оновлень і підтримки.
|
|
127
|
+
|
|
128
|
+
Усі ці рішення можуть допомогти створити багатомовний Flutter-додаток. Остаточний вибір залежить від ваших **вимог до продуктивності**, **робочого процесу розробника**, **цілей користувацького досвіду** та **довгострокової підтримуваності**. Уважно обравши стратегію, яка відповідає пріоритетам проєкту, ви забезпечите, що ваш Flutter-додаток зможе радувати користувачів по всьому світу.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-01-16
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Найкращі інструменти для інтернаціоналізації (i18n) у React Native
|
|
5
|
+
description: Відкрийте для себе провідні рішення i18n для React Native, щоб вирішувати проблеми перекладу, підвищувати SEO та забезпечувати бездоганний глобальний досвід у світі.
|
|
6
|
+
keywords:
|
|
7
|
+
- React Native
|
|
8
|
+
- i18n
|
|
9
|
+
- багатомовний
|
|
10
|
+
- SEO
|
|
11
|
+
- інтернаціоналізація
|
|
12
|
+
- Blog
|
|
13
|
+
- JavaScript
|
|
14
|
+
slugs:
|
|
15
|
+
- blog
|
|
16
|
+
- i18n-technologies
|
|
17
|
+
- frameworks
|
|
18
|
+
- react-native
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Дослідження рішень i18n для перекладу вашого додатку React Native
|
|
22
|
+
|
|
23
|
+
У світі, що стає дедалі глобальнішим, надання вашого додатку на React Native кількома мовами може суттєво підвищити доступність і задоволеність користувачів. Інтернаціоналізація (i18n) є центральною для ефективного керування перекладами — вона дозволяє відображати текст, специфічний для мови, формати дати й часу, валюту та інше без ускладнення вашої codebase. У цій статті ми розглянемо різні підходи до i18n — від спеціалізованих бібліотек до більш загальних рішень — і допоможемо знайти той, що найкраще підходить для вашого проєкту на React Native.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
## Що таке інтернаціоналізація (i18n)?
|
|
30
|
+
|
|
31
|
+
Інтернаціоналізація, або i18n, полягає в організації застосунку таким чином, щоб він легко адаптувався до різних мов, регіональних форматів і культурних норм. У React Native i18n охоплює роботу з рядками для кнопок і підписів, а також форматування дат, часу, валют та інших даних відповідно до локалі користувача. Правильно підготовлені застосунки на React Native дозволяють безшовно додавати додаткові мови та поведінку, специфічну для локалі, пізніше без масштабних рефакторингів.
|
|
32
|
+
|
|
33
|
+
Для детальнішого ознайомлення з концепціями інтернаціоналізації див. нашу статтю:
|
|
34
|
+
[Що таке інтернаціоналізація (i18n)? Визначення та виклики](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/what_is_internationalization.md).
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Виклики перекладу для додатків React Native
|
|
39
|
+
|
|
40
|
+
Робота з перекладами в React Native має свої особливі вимоги:
|
|
41
|
+
|
|
42
|
+
- **Компонентна архітектура**
|
|
43
|
+
Як і в React для вебу, модульний дизайн React Native може розподіляти текст по численних компонентах. Важливо централізувати ці переклади надійним способом.
|
|
44
|
+
|
|
45
|
+
- **Офлайн- та віддалені дані**
|
|
46
|
+
Хоча деякі рядки можна вбудувати в додаток, інший контент (наприклад, стрічки новин, дані про продукти) може завантажуватися віддалено. Обробка перекладів для даних, що надходять асинхронно, може бути складнішою на мобільних пристроях.
|
|
47
|
+
|
|
48
|
+
- **Особливості, специфічні для платформи**
|
|
49
|
+
iOS та Android мають власні налаштування локалі та особливості форматування. Щоб забезпечити послідовне відображення дат, валют і чисел на обох платформах, потрібне ретельне тестування.
|
|
50
|
+
|
|
51
|
+
- **Управління станом і навігацією**
|
|
52
|
+
Підтримка вибраної користувачем мови між екранами, deep links або таб-навігацією означає інтеграцію i18n у ваш Redux, Context API або інше рішення для управління станом.
|
|
53
|
+
|
|
54
|
+
- **Оновлення додатка та Over-the-Air (OTA)**
|
|
55
|
+
Якщо ви використовуєте CodePush або інший механізм OTA-оновлень, потрібно продумати, як оновлення перекладів або додавання нових мов буде доставлятися без необхідності повного релізу в магазині додатків.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Провідні рішення i18n для React Native
|
|
60
|
+
|
|
61
|
+
Нижче наведено кілька популярних підходів до керування багатомовним контентом у React Native. Кожен із них має на меті спростити ваш робочий процес перекладу різними способами.
|
|
62
|
+
|
|
63
|
+
### 1. Intlayer
|
|
64
|
+
|
|
65
|
+
> Website: [https://intlayer.org/](https://intlayer.org/)
|
|
66
|
+
|
|
67
|
+
**Огляд**
|
|
68
|
+
**Intlayer** — інноваційна бібліотека з відкритим кодом для інтернаціоналізації, створена для спрощення підтримки кількох мов у сучасних JavaScript-додатках, включаючи React Native. Вона пропонує декларативний підхід до перекладу, що дозволяє визначати словники безпосередньо поруч із компонентами.
|
|
69
|
+
|
|
70
|
+
**Ключові можливості**
|
|
71
|
+
|
|
72
|
+
- **Оголошення перекладів**
|
|
73
|
+
Зберігайте переклади в одному файлі або на рівні компонента, що робить простим пошук та редагування тексту.
|
|
74
|
+
|
|
75
|
+
- **TypeScript та автодоповнення**
|
|
76
|
+
Автоматично генерує визначення типів для ключів перекладів, забезпечуючи зручне для розробника автодоповнення та надійну перевірку помилок.
|
|
77
|
+
|
|
78
|
+
- **Легкий та гнучкий**
|
|
79
|
+
Працює ефективно в середовищах React Native без зайвих накладних витрат. Легко інтегрується та зберігає ефективність на мобільних пристроях.
|
|
80
|
+
|
|
81
|
+
- **Платформозалежні особливості**
|
|
82
|
+
За потреби ви можете адаптувати або розділити рядки, специфічні для платформи, для iOS та Android.
|
|
83
|
+
|
|
84
|
+
- **Асинхронне завантаження**
|
|
85
|
+
Динамічно завантажуйте словники перекладів, що може бути корисно для великих додатків або поступового розгортання мовних пакетів.
|
|
86
|
+
|
|
87
|
+
**Зауваги**
|
|
88
|
+
|
|
89
|
+
- **Спільнота та екосистема**
|
|
90
|
+
Ще відносно нове рішення, тому ви можете знайти менше прикладів від спільноти або готових плагінів у порівнянні з давно усталеними бібліотеками.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### 2. React-i18next
|
|
95
|
+
|
|
96
|
+
> Вебсайт: [https://react.i18next.com/](https://react.i18next.com/)
|
|
97
|
+
|
|
98
|
+
**Огляд**
|
|
99
|
+
**React-i18next** базується на відомому фреймворку **i18next**, пропонуючи гнучку плагінну архітектуру та потужний набір функцій. Він також широко використовується в React Native додатках завдяки добре задокументованому процесу налаштування.
|
|
100
|
+
|
|
101
|
+
**Ключові можливості**
|
|
102
|
+
|
|
103
|
+
- **Плавна інтеграція з React Native**
|
|
104
|
+
Надає хуки (`useTranslation`), компоненти вищого порядку (HOCs) та інші засоби для безшовної інтеграції i18n у ваші компоненти.
|
|
105
|
+
|
|
106
|
+
- **Асинхронне завантаження**
|
|
107
|
+
Завантажує переклади за потреби — корисно для великих додатків або при поступовому додаванні мовних пакетів.
|
|
108
|
+
|
|
109
|
+
- **Розширені можливості перекладу**
|
|
110
|
+
Підтримує вкладені переклади, інтерполяцію, множинні форми (pluralization) та заміну змінних з коробки.
|
|
111
|
+
|
|
112
|
+
- **TypeScript та автодоповнення**
|
|
113
|
+
React-i18next підтримує типізовані ключі перекладів, хоча початкове налаштування може бути більш ручним у порівнянні з рішеннями, що автоматично генерують типи.
|
|
114
|
+
|
|
115
|
+
- **Незалежність від платформи**
|
|
116
|
+
i18next не прив'язаний конкретно до вебу чи мобільних платформ, тож ту саму бібліотеку можна використовувати в різних типах проєктів (наприклад, якщо ви ділите код між вебом і нативом).
|
|
117
|
+
|
|
118
|
+
**Зауваги**
|
|
119
|
+
|
|
120
|
+
- **Складність конфігурації**
|
|
121
|
+
Налаштування i18n з розширеними можливостями (форми множини, fallback-локалі тощо) може вимагати ретельної конфігурації.
|
|
122
|
+
|
|
123
|
+
- **Продуктивність**
|
|
124
|
+
Хоча React-i18next загалом працює ефективно, варто звертати увагу на те, як ви організовуєте та завантажуєте ресурси перекладів, щоб уникнути надмірного навантаження на мобільних пристроях.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
### 3. React Intl (від FormatJS)
|
|
129
|
+
|
|
130
|
+
> Вебсайт: [https://formatjs.io/docs/react-intl/](https://formatjs.io/docs/react-intl/)
|
|
131
|
+
|
|
132
|
+
**Огляд**
|
|
133
|
+
**React Intl**, частина екосистеми **FormatJS**, створений навколо стандартизації форматування повідомлень для різних локалей. Він робить акцент на робочому процесі витягування повідомлень і особливо сильний у правильному форматуванні дат, чисел та часу для широкого кола локалей.
|
|
134
|
+
|
|
135
|
+
**Ключові особливості**
|
|
136
|
+
|
|
137
|
+
- **Компоненти, орієнтовані на форматування**
|
|
138
|
+
`<FormattedMessage>`, `<FormattedDate>`, `<FormattedTime>` та інші спрощують завдання форматування на iOS та Android.
|
|
139
|
+
|
|
140
|
+
- **Легковаговий та розширюваний**
|
|
141
|
+
Ви можете імпортувати лише ті частини FormatJS, які потрібні, зберігаючи загальний бандл компактним — це критично для мобільних платформ.
|
|
142
|
+
|
|
143
|
+
- **Поліфіли для непідтримуваних локалей**
|
|
144
|
+
Забезпечує послідовне форматування дат/чисел на старіших версіях Android або iOS.
|
|
145
|
+
|
|
146
|
+
- **Сумісність з TypeScript**
|
|
147
|
+
Інтегрується з TypeScript, хоча може знадобитися додатковий інструментарій для отримання повністю типізованих ID повідомлень.
|
|
148
|
+
|
|
149
|
+
**Зауваження**
|
|
150
|
+
|
|
151
|
+
- **Витяг повідомлень**
|
|
152
|
+
Вимагає workflow для екстракції повідомлень, що може ускладнити ваш build-процес. Однак це потужне рішення для великих команд, які керують великою кількістю перекладів.
|
|
153
|
+
|
|
154
|
+
- **Розмір додатка та розгортання**
|
|
155
|
+
Якщо ви покладаєтеся на кілька polyfills або великі файли перекладів, слідкуйте за загальним розміром додатка — особливо важливо для мобільних середовищ.
|
|
156
|
+
|
|
157
|
+
- **Приклади від спільноти**
|
|
158
|
+
Хоча бібліотека широко використовується, специфічних прикладів для React Native може бути менше, ніж для React у вебі. Ймовірно, вам доведеться адаптувати існуючу документацію та патерни для нативного середовища.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### 4. LinguiJS
|
|
163
|
+
|
|
164
|
+
> Вебсайт: [https://lingui.js.org/](https://lingui.js.org/)
|
|
165
|
+
|
|
166
|
+
**Огляд**
|
|
167
|
+
**LinguiJS** пропонує сучасний, зручний для розробника підхід до i18n для JavaScript та React (включно з React Native). Завдяки екстракції та компіляції повідомлень на базі CLI, він орієнтований на мінімізацію навантаження під час виконання.
|
|
168
|
+
|
|
169
|
+
**Ключові особливості**
|
|
170
|
+
|
|
171
|
+
- **Автоматичне витягування повідомлень**
|
|
172
|
+
Сканає ваш код на наявність рядків перекладу, зменшуючи ризик пропущених або невикористаних повідомлень.
|
|
173
|
+
|
|
174
|
+
- **Мінімальне навантаження під час виконання**
|
|
175
|
+
Скомпільовані переклади забезпечують високу продуктивність додатка та добре оптимізовані для мобільних пристроїв.
|
|
176
|
+
|
|
177
|
+
- **TypeScript та автодоповнення**
|
|
178
|
+
За належної конфігурації ви отримаєте типізовані ID перекладів, що робить робочі процеси розробників безпечнішими та інтуїтивнішими.
|
|
179
|
+
|
|
180
|
+
- **Інтеграція з React Native**
|
|
181
|
+
Простий у встановленні та підключенні в середовищі React Native; за потреби також можна обробляти переклади, специфічні для платформи.
|
|
182
|
+
|
|
183
|
+
**Зауваги**
|
|
184
|
+
|
|
185
|
+
- **Початкове налаштування CLI**
|
|
186
|
+
Потрібні додаткові кроки для налаштування конвеєра вилучення та компіляції для проєктів React Native.
|
|
187
|
+
|
|
188
|
+
- **Спільнота та плагіни**
|
|
189
|
+
Екосистема бібліотеки менша, ніж у i18next, але швидко зростає, а базові CLI-інструменти надійні.
|
|
190
|
+
|
|
191
|
+
- **Організація коду**
|
|
192
|
+
Визначення способу розбиття каталогів повідомлень (за екраном, функцією або мовою) є важливим для збереження ясності у великих додатках.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Висновки
|
|
197
|
+
|
|
198
|
+
Підбираючи i18n-рішення для вашого застосунку на React Native:
|
|
199
|
+
|
|
200
|
+
1. **Оцініть свої вимоги**
|
|
201
|
+
- Скільки мов потрібно зараз та в майбутньому?
|
|
202
|
+
- Чи потрібне вам завантаження за запитом (on-demand loading) для великих додатків?
|
|
203
|
+
|
|
204
|
+
2. **Ураховуйте відмінності між платформами**
|
|
205
|
+
- Переконайтеся, що будь-яка бібліотека підтримує варіації локалі iOS і Android, особливо нюанси форматування дат, чисел і валют.
|
|
206
|
+
- Розгляньте можливість офлайн‑використання: деякі переклади можуть потребувати включення в пакет додатка, тоді як інші можна завантажувати віддалено.
|
|
207
|
+
|
|
208
|
+
3. **Оберіть структуру для масштабованості**
|
|
209
|
+
- Якщо ви плануєте великий або довготривалий проєкт, надійний процес екстракції або typed keys (типізовані ключі) допоможуть тримати переклади добре організованими.
|
|
210
|
+
|
|
211
|
+
4. **Продуктивність і розмір бандла**
|
|
212
|
+
- Обмеження мобільного трафіку означають, що слід уважно стежити за розміром файлів перекладів і будь-яких polyfills.
|
|
213
|
+
|
|
214
|
+
5. **Developer Experience (DX)**
|
|
215
|
+
- Шукайте бібліотеки, які відповідають навичкам вашої команди: деякі рішення більш багатослівні, але простіші в освоєнні, тоді як інші пропонують більше автоматизації за рахунок складнішого налаштування.
|
|
216
|
+
|
|
217
|
+
Кожне рішення — Intlayer, React-i18next, React Intl і LinguiJS — довело свою ефективність у середовищі React Native, хоча й з дещо різними пріоритетами. Оцінка roadmap вашого проєкту, переваг розробників і потреб локалізації допоможе знайти оптимальне рішення для створення по-справжньому глобального додатку на React Native.
|