@intlayer/docs 8.12.5-canary.0 → 9.0.0-canary.2
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/dist/cjs/generated/docs.entry.cjs +320 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +320 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +16 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/cli/doc-review.md +110 -4
- package/docs/ar/cli/index.md +1 -1
- package/docs/ar/cli/scan.md +1 -1
- package/docs/ar/configuration.md +36 -3
- package/docs/ar/dictionary/condition.md +167 -5
- package/docs/ar/dictionary/enumeration.md +540 -6
- package/docs/ar/dictionary/file.md +151 -1
- package/docs/ar/dictionary/gender.md +168 -7
- package/docs/ar/dictionary/nesting.md +173 -65
- package/docs/ar/dictionary/plurial.md +174 -5
- package/docs/ar/dictionary/translation.md +156 -2
- package/docs/ar/dynamic_dictionaries/collections.md +1 -1
- package/docs/ar/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/ar/dynamic_dictionaries/index.md +1 -1
- package/docs/ar/dynamic_dictionaries/variants.md +1 -1
- package/docs/ar/intlayer_with_vite+react.md +31 -31
- package/docs/ar/releases/v8.md +187 -1
- package/docs/ar/releases/v9.md +232 -0
- package/docs/bn/cli/index.md +1 -1
- package/docs/bn/cli/scan.md +1 -1
- package/docs/bn/configuration.md +36 -3
- package/docs/cs/cli/index.md +1 -1
- package/docs/cs/cli/scan.md +1 -1
- package/docs/cs/configuration.md +35 -2
- package/docs/de/cli/doc-review.md +110 -4
- package/docs/de/cli/index.md +1 -1
- package/docs/de/cli/scan.md +1 -1
- package/docs/de/configuration.md +35 -2
- package/docs/de/dictionary/condition.md +167 -5
- package/docs/de/dictionary/enumeration.md +777 -7
- package/docs/de/dictionary/file.md +151 -1
- package/docs/de/dictionary/gender.md +168 -7
- package/docs/de/dictionary/nesting.md +173 -65
- package/docs/de/dictionary/plurial.md +347 -7
- package/docs/de/dictionary/translation.md +156 -2
- package/docs/de/dynamic_dictionaries/collections.md +1 -1
- package/docs/de/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/de/dynamic_dictionaries/index.md +1 -1
- package/docs/de/dynamic_dictionaries/variants.md +1 -1
- package/docs/de/intlayer_with_vite+react.md +48 -48
- package/docs/de/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/de/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/de/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/de/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/de/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/de/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/de/releases/v8.md +197 -1
- package/docs/de/releases/v9.md +232 -0
- package/docs/en/CI_CD.md +7 -7
- package/docs/en/cli/ci.md +62 -8
- package/docs/en/cli/doc-review.md +110 -4
- package/docs/en/cli/index.md +1 -1
- package/docs/en/cli/scan.md +1 -1
- package/docs/en/compat/i18n-js.md +44 -0
- package/docs/en/compat/i18next.md +59 -0
- package/docs/en/compat/index.md +51 -0
- package/docs/en/compat/lingui.md +44 -0
- package/docs/en/compat/next-i18next.md +57 -0
- package/docs/en/compat/next-intl.md +59 -0
- package/docs/en/compat/next-translate.md +45 -0
- package/docs/en/compat/ngx-translate.md +45 -0
- package/docs/en/compat/nuxtjs-i18n.md +46 -0
- package/docs/en/compat/polyglot.md +45 -0
- package/docs/en/compat/react-i18next.md +58 -0
- package/docs/en/compat/react-intl.md +55 -0
- package/docs/en/compat/svelte-i18n.md +47 -0
- package/docs/en/compat/transloco.md +45 -0
- package/docs/en/compat/vue-i18n.md +58 -0
- package/docs/en/configuration.md +35 -2
- package/docs/en/dictionary/condition.md +163 -1
- package/docs/en/dictionary/enumeration.md +309 -7
- package/docs/en/dictionary/file.md +151 -1
- package/docs/en/dictionary/gender.md +162 -1
- package/docs/en/dictionary/nesting.md +173 -9
- package/docs/en/dictionary/plurial.md +155 -10
- package/docs/en/dictionary/translation.md +145 -52
- package/docs/en/dynamic_dictionaries/collections.md +1 -1
- package/docs/en/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/en/dynamic_dictionaries/index.md +1 -1
- package/docs/en/dynamic_dictionaries/variants.md +1 -1
- package/docs/en/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/en/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/en/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/en/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/en/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/en/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/en/releases/v8.md +187 -1
- package/docs/en/releases/v9.md +220 -0
- package/docs/en-GB/cli/doc-review.md +110 -4
- package/docs/en-GB/cli/index.md +1 -1
- package/docs/en-GB/cli/scan.md +1 -1
- package/docs/en-GB/configuration.md +35 -2
- package/docs/en-GB/dictionary/condition.md +364 -1
- package/docs/en-GB/dictionary/enumeration.md +577 -5
- package/docs/en-GB/dictionary/file.md +317 -1
- package/docs/en-GB/dictionary/gender.md +375 -2
- package/docs/en-GB/dictionary/nesting.md +368 -71
- package/docs/en-GB/dictionary/plurial.md +347 -7
- package/docs/en-GB/dictionary/translation.md +320 -32
- package/docs/en-GB/dynamic_dictionaries/collections.md +1 -1
- package/docs/en-GB/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/en-GB/dynamic_dictionaries/index.md +1 -1
- package/docs/en-GB/dynamic_dictionaries/variants.md +1 -1
- package/docs/en-GB/releases/v8.md +1 -1
- package/docs/en-GB/releases/v9.md +220 -0
- package/docs/es/cli/doc-review.md +110 -4
- package/docs/es/cli/index.md +1 -1
- package/docs/es/cli/scan.md +1 -1
- package/docs/es/configuration.md +36 -3
- package/docs/es/dictionary/condition.md +167 -5
- package/docs/es/dictionary/enumeration.md +537 -12
- package/docs/es/dictionary/file.md +151 -1
- package/docs/es/dictionary/gender.md +168 -7
- package/docs/es/dictionary/nesting.md +173 -65
- package/docs/es/dictionary/plurial.md +347 -7
- package/docs/es/dictionary/translation.md +156 -2
- package/docs/es/dynamic_dictionaries/collections.md +1 -1
- package/docs/es/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/es/dynamic_dictionaries/index.md +1 -1
- package/docs/es/dynamic_dictionaries/variants.md +1 -1
- package/docs/es/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/es/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/es/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/es/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/es/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/es/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/es/releases/v8.md +187 -1
- package/docs/es/releases/v9.md +228 -0
- package/docs/fr/cli/doc-review.md +110 -4
- package/docs/fr/cli/index.md +1 -1
- package/docs/fr/cli/scan.md +1 -1
- package/docs/fr/configuration.md +49 -16
- package/docs/fr/dictionary/condition.md +369 -6
- package/docs/fr/dictionary/enumeration.md +540 -6
- package/docs/fr/dictionary/file.md +151 -1
- package/docs/fr/dictionary/gender.md +168 -7
- package/docs/fr/dictionary/nesting.md +357 -86
- package/docs/fr/dictionary/plurial.md +174 -5
- package/docs/fr/dictionary/translation.md +156 -2
- package/docs/fr/dynamic_dictionaries/collections.md +1 -1
- package/docs/fr/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/fr/dynamic_dictionaries/index.md +1 -1
- package/docs/fr/dynamic_dictionaries/variants.md +1 -1
- package/docs/fr/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/fr/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/fr/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/fr/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/fr/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/fr/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/fr/releases/v8.md +187 -1
- package/docs/fr/releases/v9.md +220 -0
- package/docs/hi/cli/doc-review.md +110 -4
- package/docs/hi/cli/index.md +1 -1
- package/docs/hi/cli/scan.md +1 -1
- package/docs/hi/configuration.md +49 -16
- package/docs/hi/dictionary/condition.md +167 -5
- package/docs/hi/dictionary/enumeration.md +540 -6
- package/docs/hi/dictionary/file.md +151 -1
- package/docs/hi/dictionary/gender.md +168 -7
- package/docs/hi/dictionary/nesting.md +173 -65
- package/docs/hi/dictionary/plurial.md +174 -5
- package/docs/hi/dictionary/translation.md +155 -5
- package/docs/hi/dynamic_dictionaries/collections.md +1 -1
- package/docs/hi/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/hi/dynamic_dictionaries/index.md +1 -1
- package/docs/hi/dynamic_dictionaries/variants.md +1 -1
- package/docs/hi/releases/v8.md +188 -2
- package/docs/hi/releases/v9.md +232 -0
- package/docs/id/cli/doc-review.md +110 -4
- package/docs/id/cli/index.md +1 -1
- package/docs/id/cli/scan.md +1 -1
- package/docs/id/configuration.md +35 -2
- package/docs/id/dictionary/condition.md +167 -5
- package/docs/id/dictionary/enumeration.md +540 -6
- package/docs/id/dictionary/file.md +318 -2
- package/docs/id/dictionary/gender.md +381 -8
- package/docs/id/dictionary/nesting.md +357 -86
- package/docs/id/dictionary/plurial.md +174 -5
- package/docs/id/dictionary/translation.md +156 -2
- package/docs/id/dynamic_dictionaries/collections.md +1 -1
- package/docs/id/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/id/dynamic_dictionaries/index.md +1 -1
- package/docs/id/dynamic_dictionaries/variants.md +1 -1
- package/docs/id/releases/v8.md +191 -2
- package/docs/id/releases/v9.md +232 -0
- package/docs/it/cli/doc-review.md +110 -4
- package/docs/it/cli/index.md +1 -1
- package/docs/it/cli/scan.md +1 -1
- package/docs/it/configuration.md +49 -16
- package/docs/it/dictionary/condition.md +167 -5
- package/docs/it/dictionary/enumeration.md +540 -6
- package/docs/it/dictionary/file.md +318 -2
- package/docs/it/dictionary/gender.md +168 -7
- package/docs/it/dictionary/nesting.md +173 -65
- package/docs/it/dictionary/plurial.md +347 -7
- package/docs/it/dictionary/translation.md +156 -2
- package/docs/it/dynamic_dictionaries/collections.md +1 -1
- package/docs/it/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/it/dynamic_dictionaries/index.md +1 -1
- package/docs/it/dynamic_dictionaries/variants.md +1 -1
- package/docs/it/intlayer_with_vite+react.md +0 -48
- package/docs/it/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/it/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/it/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/it/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/it/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/it/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/it/releases/v8.md +200 -2
- package/docs/it/releases/v9.md +232 -0
- package/docs/ja/cli/doc-review.md +110 -4
- package/docs/ja/cli/index.md +1 -1
- package/docs/ja/cli/scan.md +1 -1
- package/docs/ja/configuration.md +50 -17
- package/docs/ja/dictionary/condition.md +167 -5
- package/docs/ja/dictionary/enumeration.md +540 -6
- package/docs/ja/dictionary/file.md +151 -1
- package/docs/ja/dictionary/gender.md +168 -7
- package/docs/ja/dictionary/nesting.md +173 -65
- package/docs/ja/dictionary/plurial.md +174 -5
- package/docs/ja/dictionary/translation.md +169 -8
- package/docs/ja/dynamic_dictionaries/collections.md +1 -1
- package/docs/ja/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/ja/dynamic_dictionaries/index.md +1 -1
- package/docs/ja/dynamic_dictionaries/variants.md +1 -1
- package/docs/ja/intlayer_with_vite+react.md +290 -0
- package/docs/ja/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/ja/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/ja/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/ja/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/ja/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/ja/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/ja/releases/v8.md +193 -4
- package/docs/ja/releases/v9.md +232 -0
- package/docs/ko/cli/doc-review.md +110 -4
- package/docs/ko/cli/index.md +1 -1
- package/docs/ko/cli/scan.md +1 -1
- package/docs/ko/configuration.md +49 -16
- package/docs/ko/dictionary/condition.md +167 -5
- package/docs/ko/dictionary/enumeration.md +540 -6
- package/docs/ko/dictionary/file.md +151 -1
- package/docs/ko/dictionary/gender.md +168 -7
- package/docs/ko/dictionary/nesting.md +173 -65
- package/docs/ko/dictionary/plurial.md +174 -5
- package/docs/ko/dictionary/translation.md +169 -8
- package/docs/ko/dynamic_dictionaries/collections.md +1 -1
- package/docs/ko/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/ko/dynamic_dictionaries/index.md +1 -1
- package/docs/ko/dynamic_dictionaries/variants.md +1 -1
- package/docs/ko/intlayer_with_vite+react.md +48 -490
- package/docs/ko/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/ko/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/ko/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/ko/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/ko/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/ko/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/ko/releases/v8.md +192 -1
- package/docs/ko/releases/v9.md +232 -0
- package/docs/nl/cli/index.md +1 -1
- package/docs/nl/cli/scan.md +1 -1
- package/docs/nl/configuration.md +36 -3
- package/docs/pl/cli/doc-review.md +110 -4
- package/docs/pl/cli/index.md +1 -1
- package/docs/pl/cli/scan.md +1 -1
- package/docs/pl/configuration.md +35 -2
- package/docs/pl/dictionary/condition.md +167 -5
- package/docs/pl/dictionary/enumeration.md +540 -6
- package/docs/pl/dictionary/file.md +318 -2
- package/docs/pl/dictionary/gender.md +168 -7
- package/docs/pl/dictionary/nesting.md +173 -65
- package/docs/pl/dictionary/plurial.md +174 -5
- package/docs/pl/dictionary/translation.md +156 -2
- package/docs/pl/dynamic_dictionaries/collections.md +1 -1
- package/docs/pl/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/pl/dynamic_dictionaries/index.md +1 -1
- package/docs/pl/dynamic_dictionaries/variants.md +1 -1
- package/docs/pl/releases/v8.md +188 -2
- package/docs/pl/releases/v9.md +232 -0
- package/docs/pt/cli/doc-review.md +110 -4
- package/docs/pt/cli/index.md +1 -1
- package/docs/pt/cli/scan.md +1 -1
- package/docs/pt/configuration.md +49 -16
- package/docs/pt/dictionary/condition.md +167 -5
- package/docs/pt/dictionary/enumeration.md +540 -6
- package/docs/pt/dictionary/file.md +151 -1
- package/docs/pt/dictionary/gender.md +168 -7
- package/docs/pt/dictionary/nesting.md +173 -65
- package/docs/pt/dictionary/plurial.md +347 -7
- package/docs/pt/dictionary/translation.md +156 -2
- package/docs/pt/dynamic_dictionaries/collections.md +1 -1
- package/docs/pt/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/pt/dynamic_dictionaries/index.md +1 -1
- package/docs/pt/dynamic_dictionaries/variants.md +1 -1
- package/docs/pt/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/pt/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/pt/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/pt/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/pt/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/pt/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/pt/releases/v8.md +187 -1
- package/docs/pt/releases/v9.md +232 -0
- package/docs/ru/cli/doc-review.md +110 -4
- package/docs/ru/cli/index.md +1 -1
- package/docs/ru/cli/scan.md +1 -1
- package/docs/ru/configuration.md +35 -2
- package/docs/ru/dictionary/condition.md +366 -39
- package/docs/ru/dictionary/enumeration.md +777 -7
- package/docs/ru/dictionary/file.md +318 -2
- package/docs/ru/dictionary/gender.md +168 -7
- package/docs/ru/dictionary/nesting.md +368 -71
- package/docs/ru/dictionary/plurial.md +347 -7
- package/docs/ru/dictionary/translation.md +321 -33
- package/docs/ru/dynamic_dictionaries/collections.md +1 -1
- package/docs/ru/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/ru/dynamic_dictionaries/index.md +1 -1
- package/docs/ru/dynamic_dictionaries/variants.md +1 -1
- package/docs/ru/intlayer_with_vite+react.md +48 -47
- package/docs/ru/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/ru/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/ru/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/ru/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/ru/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/ru/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/ru/releases/v8.md +194 -2
- package/docs/ru/releases/v9.md +232 -0
- package/docs/tr/cli/doc-review.md +110 -4
- package/docs/tr/cli/index.md +1 -1
- package/docs/tr/cli/scan.md +1 -1
- package/docs/tr/configuration.md +35 -2
- package/docs/tr/dictionary/condition.md +167 -5
- package/docs/tr/dictionary/enumeration.md +540 -6
- package/docs/tr/dictionary/file.md +151 -1
- package/docs/tr/dictionary/gender.md +168 -7
- package/docs/tr/dictionary/nesting.md +173 -65
- package/docs/tr/dictionary/plurial.md +174 -5
- package/docs/tr/dictionary/translation.md +156 -2
- package/docs/tr/dynamic_dictionaries/collections.md +1 -1
- package/docs/tr/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/tr/dynamic_dictionaries/index.md +1 -1
- package/docs/tr/dynamic_dictionaries/variants.md +1 -1
- package/docs/tr/migration_from_i18next_to_intlayer.md +1 -1
- package/docs/tr/migration_from_next-i18next_to_intlayer.md +1 -1
- package/docs/tr/migration_from_next-intl_to_intlayer.md +1 -1
- package/docs/tr/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
- package/docs/tr/migration_from_react-i18next_to_intlayer.md +1 -1
- package/docs/tr/migration_from_vue-i18n_to_intlayer.md +1 -1
- package/docs/tr/releases/v8.md +187 -1
- package/docs/tr/releases/v9.md +232 -0
- package/docs/uk/cli/doc-review.md +110 -4
- package/docs/uk/cli/index.md +1 -1
- package/docs/uk/cli/scan.md +1 -1
- package/docs/uk/configuration.md +35 -2
- package/docs/uk/dictionary/condition.md +167 -5
- package/docs/uk/dictionary/enumeration.md +540 -6
- package/docs/uk/dictionary/file.md +318 -2
- package/docs/uk/dictionary/gender.md +381 -8
- package/docs/uk/dictionary/nesting.md +173 -65
- package/docs/uk/dictionary/plurial.md +174 -5
- package/docs/uk/dictionary/translation.md +156 -2
- package/docs/uk/dynamic_dictionaries/collections.md +1 -1
- package/docs/uk/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/uk/dynamic_dictionaries/index.md +1 -1
- package/docs/uk/dynamic_dictionaries/variants.md +1 -1
- package/docs/uk/releases/v8.md +191 -3
- package/docs/uk/releases/v9.md +232 -0
- package/docs/ur/cli/index.md +1 -1
- package/docs/ur/cli/scan.md +1 -1
- package/docs/ur/configuration.md +36 -3
- package/docs/vi/cli/doc-review.md +110 -4
- package/docs/vi/cli/index.md +1 -1
- package/docs/vi/cli/scan.md +1 -1
- package/docs/vi/configuration.md +50 -17
- package/docs/vi/dictionary/condition.md +167 -5
- package/docs/vi/dictionary/enumeration.md +591 -14
- package/docs/vi/dictionary/file.md +318 -2
- package/docs/vi/dictionary/gender.md +168 -7
- package/docs/vi/dictionary/nesting.md +357 -86
- package/docs/vi/dictionary/plurial.md +174 -5
- package/docs/vi/dictionary/translation.md +156 -2
- package/docs/vi/dynamic_dictionaries/collections.md +1 -1
- package/docs/vi/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/vi/dynamic_dictionaries/index.md +1 -1
- package/docs/vi/dynamic_dictionaries/variants.md +1 -1
- package/docs/vi/releases/v8.md +190 -1
- package/docs/vi/releases/v9.md +232 -0
- package/docs/zh/cli/doc-review.md +110 -4
- package/docs/zh/cli/index.md +1 -1
- package/docs/zh/cli/scan.md +1 -1
- package/docs/zh/configuration.md +49 -16
- package/docs/zh/dictionary/condition.md +167 -5
- package/docs/zh/dictionary/enumeration.md +540 -6
- package/docs/zh/dictionary/file.md +151 -1
- package/docs/zh/dictionary/gender.md +168 -7
- package/docs/zh/dictionary/nesting.md +173 -65
- package/docs/zh/dictionary/plurial.md +174 -5
- package/docs/zh/dictionary/translation.md +169 -8
- package/docs/zh/dynamic_dictionaries/collections.md +1 -1
- package/docs/zh/dynamic_dictionaries/dynamic_content.md +1 -1
- package/docs/zh/dynamic_dictionaries/index.md +1 -1
- package/docs/zh/dynamic_dictionaries/variants.md +1 -1
- package/docs/zh/intlayer_with_vite+react.md +48 -288
- package/docs/zh/releases/v8.md +1 -1
- package/docs/zh/releases/v9.md +220 -0
- package/package.json +7 -7
- package/src/generated/docs.entry.ts +320 -0
- package/dist/esm/_virtual/_rolldown/runtime.mjs +0 -8
package/docs/de/releases/v8.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-22
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-06-14
|
|
4
4
|
title: Neues Intlayer v8 - Was ist neu?
|
|
5
5
|
description: Entdecken Sie die Neuerungen in Intlayer v8. Bedeutende Verbesserungen in der Developer Experience, der Inhaltsvalidierung und der Verwaltung von Dictionaries.
|
|
6
6
|
keywords:
|
|
@@ -409,6 +409,16 @@ Weitere Einzelheiten finden Sie in der [Dokumentation zu HTML-Inhalten](https://
|
|
|
409
409
|
|
|
410
410
|
---
|
|
411
411
|
|
|
412
|
+
## YAML- & Markdown-Inhaltsdateien (v8.10.0)
|
|
413
|
+
|
|
414
|
+
Sie können Inhalte jetzt direkt mit den Dateierweiterungen `.content.md` und `.content.yaml` deklarieren. Dies ist perfekt für Langform-Inhalte, Blogs, Dokumentationen und Datenschutzrichtlinien.
|
|
415
|
+
|
|
416
|
+
Diese Dateien sind vollständig über den Visual Editor bearbeitbar und bieten einen optimierten Workflow für nicht-technische Teammitglieder.
|
|
417
|
+
|
|
418
|
+
Weitere Details finden Sie in der [Dokumentation zu YAML-Inhaltsdateien](https://intlayer.org/doc/concept/content#yaml-content-file) und der [Dokumentation zu Markdown-Inhaltsdateien](https://intlayer.org/doc/concept/content/markdown).
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
412
422
|
## Benutzerdefinierte URL-Umschreibungen (Rewrites)
|
|
413
423
|
|
|
414
424
|
Intlayer v8 führt Unterstützung für **benutzerdefinierte URL-Umschreibungen** ein, mit denen Sie locale-spezifische Pfade definieren können, die von der Standardstruktur `/locale/path` abweichen. Dies ist eine leistungsstarke Funktion zur Verbesserung der lokalen SEO und bietet eine natürlichere Benutzererfahrung für nicht-englischsprachige Nutzer.
|
|
@@ -753,6 +763,68 @@ export default {
|
|
|
753
763
|
</Tab>
|
|
754
764
|
</Tabs>
|
|
755
765
|
|
|
766
|
+
## Unicode CLDR Pluralregeln (v8.8.0)
|
|
767
|
+
|
|
768
|
+
Ein neuer `plural` Node-Helper wurde basierend auf den Pluralregeln des Unicode CLDR Projekts eingeführt, um die Unterstützung für komplexe Sprachen zu verbessern.
|
|
769
|
+
|
|
770
|
+
```typescript fileName="src/openings.content.ts"
|
|
771
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
772
|
+
|
|
773
|
+
const openingsContent = {
|
|
774
|
+
key: "total_openings",
|
|
775
|
+
content: {
|
|
776
|
+
totalOpenings: t({
|
|
777
|
+
en: plural({
|
|
778
|
+
one: "{{count}} opening",
|
|
779
|
+
other: "{{count}} openings",
|
|
780
|
+
}),
|
|
781
|
+
fr: plural({
|
|
782
|
+
one: "{{count}} offre",
|
|
783
|
+
other: "{{count}} offres",
|
|
784
|
+
}),
|
|
785
|
+
de: plural({
|
|
786
|
+
// Added German translation for plural example
|
|
787
|
+
one: "{{count}} offene Stelle",
|
|
788
|
+
other: "{{count}} offene Stellen",
|
|
789
|
+
}),
|
|
790
|
+
}),
|
|
791
|
+
},
|
|
792
|
+
} satisfies Dictionary;
|
|
793
|
+
|
|
794
|
+
export default openingsContent;
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
Sie können den Zähler dann dynamisch in Ihrer Framework-Komponente übergeben:
|
|
798
|
+
|
|
799
|
+
```tsx
|
|
800
|
+
import type { FC } from "react";
|
|
801
|
+
import { useIntlayer } from "react-intlayer";
|
|
802
|
+
|
|
803
|
+
const OpeningsComponent: FC<{ count: number }> = ({ count }) => {
|
|
804
|
+
const { totalOpenings } = useIntlayer("total_openings");
|
|
805
|
+
|
|
806
|
+
return (
|
|
807
|
+
<div>
|
|
808
|
+
{/* In English: */}
|
|
809
|
+
{/* count=0 → "0 openings" (other) */}
|
|
810
|
+
{/* count=1 → "1 opening" (one) */}
|
|
811
|
+
{/* count=2 → "2 openings" (other) */}
|
|
812
|
+
{/* count=21 → "21 openings" (other) */}
|
|
813
|
+
{/* In German: */}
|
|
814
|
+
{/* count=0 → "0 offene Stellen" (other) */}
|
|
815
|
+
{/* count=1 → "1 offene Stelle" (one) */}
|
|
816
|
+
{/* count=2 → "2 offene Stellen" (other) */}
|
|
817
|
+
{/* count=21 → "21 offene Stellen" (other) */}
|
|
818
|
+
<p>{totalOpenings(count)}</p>
|
|
819
|
+
</div>
|
|
820
|
+
);
|
|
821
|
+
};
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
Weitere Informationen finden Sie in der [Dokumentation zur Pluralisierung](https://intlayer.org/doc/concept/content/plural).
|
|
825
|
+
|
|
826
|
+
---
|
|
827
|
+
|
|
756
828
|
## Inhalts-Schema-Validierung
|
|
757
829
|
|
|
758
830
|
Intlayer v8 führt die Schema-Validierung für Dictionaries ein. Sie können jetzt wiederverwendbare Validierungsschemata in Ihrer Konfiguration mit Zod definieren und auf Ihre Inhaltsdateien anwenden. Dies stellt sicher, dass Ihr Inhalt immer der erwarteten Struktur entspricht, und fängt Fehler bereits zur Build-Zeit ab.
|
|
@@ -798,6 +870,34 @@ Wenn der Inhalt nicht mit dem Schema übereinstimmt (z. B. der Titel zu kurz ist
|
|
|
798
870
|
|
|
799
871
|
---
|
|
800
872
|
|
|
873
|
+
## TypeScript: IntlayerNode Primitive Accessors
|
|
874
|
+
|
|
875
|
+
Der `IntlayerNode`-Typ wurde aktualisiert, um das direkte Aufrufen primitiver JavaScript-Methoden auf Inhaltsknoten zu ermöglichen. Dies macht es möglich, mit Ihren lokalisierten Inhalten direkt zu interagieren, als wären sie ein Standard-String-, Zahlen-, Boolean- oder Array-Primitiv.
|
|
876
|
+
|
|
877
|
+
Unterstützt in React, Preact, Solid, Svelte, Vue und Angular.
|
|
878
|
+
|
|
879
|
+
### String-Beispiel
|
|
880
|
+
|
|
881
|
+
```typescript
|
|
882
|
+
content.placeholder; // Gibt IntlayerNode<string> zurück
|
|
883
|
+
content.placeholder.value; // Gibt string zurück
|
|
884
|
+
content.placeholder.toString(); // Gibt string zurück
|
|
885
|
+
content.placeholder.toLowerCase(); // Gibt string zurück
|
|
886
|
+
String(content.placeholder); // Gibt string zurück
|
|
887
|
+
content.placeholder.toUpperCase(); // Gibt großgeschriebenen string zurück
|
|
888
|
+
content.placeholder.replace("a", "b"); // Gibt modifizierten string zurück
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
### Array-Beispiel
|
|
892
|
+
|
|
893
|
+
```typescript
|
|
894
|
+
content.myArrayOfString // Gibt IntlayerNode<Array<string>> zurück
|
|
895
|
+
content.myArrayOfString.find(...) // Gibt Element zurück
|
|
896
|
+
content.myArrayOfString.join(', ') // Gibt verbundenen string zurück
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
---
|
|
900
|
+
|
|
801
901
|
### Verbesserte automatische Inhaltserkennung
|
|
802
902
|
|
|
803
903
|
In v8 erkennt Intlayer intelligent Markdown-Syntax, HTML-Tags und Variablen-Insertions in Ihren Inhaltsstrings. Das bedeutet, dass Sie häufig auf Hilfsfunktionen wie `md()`, `html()` oder `insert()` verzichten können.
|
|
@@ -1003,6 +1103,17 @@ Die Intlayer VSCode-Extension erhält in v8 bedeutende Updates, um Ihren Interna
|
|
|
1003
1103
|
|
|
1004
1104
|
---
|
|
1005
1105
|
|
|
1106
|
+
## Tooling: C++ Watcher & OXC-basierter LSP (v8.12.0)
|
|
1107
|
+
|
|
1108
|
+
Intlayer v8.12.0 bringt wesentliche Verbesserungen für die Developer Experience:
|
|
1109
|
+
|
|
1110
|
+
- **Parcel Watcher**: Der Content Watcher wurde von `chokidar` zu `@parcel/watcher` migriert, wodurch natives C++ File Watching genutzt wird, um schnellere Updates und einen deutlich geringeren Speicherverbrauch zu ermöglichen.
|
|
1111
|
+
- **Neues Language Server Protocol (LSP)**: Ein brandneues LSP ist jetzt verfügbar. Basierend auf OXC-Parsing hilft es Ihrer IDE und Ihren AI-Agenten, `useIntlayer('my-key')`-Aufrufe nahtlos mit den entsprechenden `.content`-Dateien zu verknüpfen und umgekehrt.
|
|
1112
|
+
|
|
1113
|
+
Weitere Details finden Sie in der [LSP-Dokumentation](https://intlayer.org/doc/lsp).
|
|
1114
|
+
|
|
1115
|
+
---
|
|
1116
|
+
|
|
1006
1117
|
## Compiler-Optimierungen
|
|
1007
1118
|
|
|
1008
1119
|
Intlayer v8 enthält eine neue Caching-Schicht für den Markdown- und HTML-Compiler. Dies stellt sicher, dass identische Inhaltsstrings mit derselben Konfiguration nur einmal geparst werden, was den Overhead bei Re-Renderings oder bei der Verwendung desselben Inhalts an mehreren Stellen erheblich reduziert.
|
|
@@ -1058,6 +1169,48 @@ Intlayer v8 enthält eine neue Caching-Schicht für den Markdown- und HTML-Compi
|
|
|
1058
1169
|
|
|
1059
1170
|
---
|
|
1060
1171
|
|
|
1172
|
+
## Experimentelle Build-Optimierungen: Minify & Purge (v8.7.0)
|
|
1173
|
+
|
|
1174
|
+
Intlayer v8.7.0 führt neue experimentelle Build-Funktionen in Ihrer `intlayer.config.ts` ein, die darauf abzielen, Ihr Produktions-Bundle zu optimieren:
|
|
1175
|
+
|
|
1176
|
+
- **Dictionary Minification**: Minifiziert Dictionary-Dateien, um die Größe zu reduzieren.
|
|
1177
|
+
- **Unused Key Purging**: Scannt und entfernt ungenutzte Übersetzungsschlüssel aus Dictionaries und benennt aktive Schlüssel in kurze Zeichen um (z. B. `"products" -> "a"`, `"pricing" -> "b"`). Dies reduziert die Bundle-Größe um bis zu 5%.
|
|
1178
|
+
- **Disable TypeScript Checks**: Beschleunigt Builds, indem die TypeScript-Typüberprüfung während des Kompilierungsschritts deaktiviert wird.
|
|
1179
|
+
|
|
1180
|
+
```typescript fileName="intlayer.config.ts"
|
|
1181
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
1182
|
+
|
|
1183
|
+
const config: IntlayerConfig = {
|
|
1184
|
+
internationalization: {
|
|
1185
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
1186
|
+
defaultLocale: Locales.ENGLISH,
|
|
1187
|
+
},
|
|
1188
|
+
dictionary: {
|
|
1189
|
+
importMode: "dynamic",
|
|
1190
|
+
},
|
|
1191
|
+
build: {
|
|
1192
|
+
/**
|
|
1193
|
+
* Minifiziert die Dictionaries, um die Bundle-Größe zu reduzieren.
|
|
1194
|
+
*/
|
|
1195
|
+
minify: true,
|
|
1196
|
+
|
|
1197
|
+
/**
|
|
1198
|
+
* Entfernt ungenutzte Schlüssel in Dictionaries.
|
|
1199
|
+
*/
|
|
1200
|
+
purge: true,
|
|
1201
|
+
|
|
1202
|
+
/**
|
|
1203
|
+
* Gibt an, ob der Build TypeScript-Typen überprüfen soll.
|
|
1204
|
+
*/
|
|
1205
|
+
checkTypes: false,
|
|
1206
|
+
},
|
|
1207
|
+
};
|
|
1208
|
+
|
|
1209
|
+
export default config;
|
|
1210
|
+
```
|
|
1211
|
+
|
|
1212
|
+
---
|
|
1213
|
+
|
|
1061
1214
|
## Flexibilität: Einheitlicher Import-Modus
|
|
1062
1215
|
|
|
1063
1216
|
Die boolesche Eigenschaft `live` wurde zugunsten der umfassenderen Eigenschaft `importMode` als veraltet markiert. Dies ermöglicht eine explizite Definition, wie Dictionaries geladen werden sollen: statisch, dynamisch oder via Live-Synchronisierung.
|
|
@@ -1205,6 +1358,49 @@ Markdown- und HTML-Inhalte in Svelte werden nun automatisch in HTML geparst, wen
|
|
|
1205
1358
|
|
|
1206
1359
|
---
|
|
1207
1360
|
|
|
1361
|
+
## Angular-Unterstützung: Vite Bundler (v8.11.0)
|
|
1362
|
+
|
|
1363
|
+
Für Angular-Benutzer unterstützt Intlayer jetzt nativ den Vite Bundler durch ein neues benutzerdefiniertes esbuild-Plugin, was die Entwicklungs- und Build-Zeiten beschleunigt.
|
|
1364
|
+
|
|
1365
|
+
Details zur Konfiguration finden Sie in der [Angular Environment Dokumentation](https://intlayer.org/doc/environment/angular).
|
|
1366
|
+
|
|
1367
|
+
---
|
|
1368
|
+
|
|
1369
|
+
## Sitemap-Generierung (v8.6.0)
|
|
1370
|
+
|
|
1371
|
+
Intlayer generiert jetzt automatisch Sitemaps basierend auf Ihren Locales und dem Routing-Modus. Dies ist besonders nützlich für die SEO-Optimierung in Router-Architekturen wie TanStack Router:
|
|
1372
|
+
|
|
1373
|
+
```typescript fileName="src/routes/sitemap.xml.ts"
|
|
1374
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
1375
|
+
import { generateSitemap } from "intlayer";
|
|
1376
|
+
|
|
1377
|
+
const SITE_URL = (
|
|
1378
|
+
import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
|
|
1379
|
+
).replace(/\/$/, "");
|
|
1380
|
+
|
|
1381
|
+
export const Route = createFileRoute("/sitemap.xml")({
|
|
1382
|
+
server: {
|
|
1383
|
+
handlers: {
|
|
1384
|
+
GET: async () => {
|
|
1385
|
+
const sitemap = generateSitemap(
|
|
1386
|
+
[
|
|
1387
|
+
{ path: "/", changefreq: "daily", priority: 1.0 },
|
|
1388
|
+
{ path: "/about", changefreq: "monthly", priority: 0.8 },
|
|
1389
|
+
],
|
|
1390
|
+
{ siteUrl: SITE_URL }
|
|
1391
|
+
);
|
|
1392
|
+
|
|
1393
|
+
return new Response(sitemap, {
|
|
1394
|
+
headers: { "Content-Type": "application/xml" },
|
|
1395
|
+
});
|
|
1396
|
+
},
|
|
1397
|
+
},
|
|
1398
|
+
},
|
|
1399
|
+
});
|
|
1400
|
+
```
|
|
1401
|
+
|
|
1402
|
+
---
|
|
1403
|
+
|
|
1208
1404
|
## Migrationshinweise von v7
|
|
1209
1405
|
|
|
1210
1406
|
### Konfigurationsänderungen
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-06-14
|
|
3
|
+
updatedAt: 2026-06-14
|
|
4
|
+
title: Neues Intlayer v9 – Was ist neu?
|
|
5
|
+
description: Entdecken Sie die Neuerungen in Intlayer v9. Einführung von Drop-in-Kompatibilitätspaketen für beliebte i18n-Bibliotheken und Unterstützung für Collections, Variants und Dynamic Records.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- Compatibility
|
|
9
|
+
- Migration
|
|
10
|
+
- Collections
|
|
11
|
+
- Variants
|
|
12
|
+
- Dynamic Records
|
|
13
|
+
- i18next
|
|
14
|
+
- next-intl
|
|
15
|
+
- vue-i18n
|
|
16
|
+
slugs:
|
|
17
|
+
- doc
|
|
18
|
+
- releases
|
|
19
|
+
- v9
|
|
20
|
+
author: aymericzip
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Neues Intlayer v9 – Was ist neu?
|
|
24
|
+
|
|
25
|
+
Willkommen bei Intlayer v9! Dieses Major Release markiert einen riesigen Meilenstein bei der Vereinfachung des Migrationspfads zu Intlayer mit **Compat Adapter Packages** für wichtige i18n-Bibliotheken (`react-i18next`, `next-intl`, `vue-i18n`, etc.) und fügt Unterstützung für reichhaltige Inhaltsstrukturen hinzu: **Collections**, **Variants** und **Dynamic Records**.
|
|
26
|
+
|
|
27
|
+
## Inhaltsverzeichnis
|
|
28
|
+
|
|
29
|
+
<TOC levels={[2]} maxDepth={1} />
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Compat Adapter Packages
|
|
34
|
+
|
|
35
|
+
Die Migration von beliebten i18n-Bibliotheken zu Intlayer ist jetzt einfacher denn je. Wir haben fünf Kompatibilitätspakete erstellt, die die **exakt gleichen öffentlichen APIs** wie Standard-i18n-Bibliotheken bereitstellen, aber die gesamte Übersetzungsarbeit zur Laufzeit an Intlayer delegieren.
|
|
36
|
+
|
|
37
|
+
### Gleiche öffentliche API mit strenger Typisierung
|
|
38
|
+
|
|
39
|
+
Durch das Ersetzen von Imports erhalten Sie alle Vorteile von Intlayer (einschließlich Compile-Time-Typsicherheit gegenüber Ihren tatsächlichen Dictionaries) mit minimalen Codeänderungen:
|
|
40
|
+
|
|
41
|
+
- `@intlayer/i18next`
|
|
42
|
+
- `@intlayer/react-i18next`
|
|
43
|
+
- `@intlayer/next-intl`
|
|
44
|
+
- `@intlayer/next-i18next`
|
|
45
|
+
- `@intlayer/vue-i18n`
|
|
46
|
+
|
|
47
|
+
Ändern Sie zum Beispiel einfach:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { useTranslation } from "react-i18next";
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
zu:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { useTranslation } from "@intlayer/react-i18next";
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Ihre Keys werden nun **streng typisiert** gegenüber Ihren Intlayer-Dictionaries, was eine vollständige Dot-Path-Auto-Vervollständigung in Ihrer IDE bietet!
|
|
60
|
+
|
|
61
|
+
### Bundler Alias Plugins (Vite, Next.js, Turbopack)
|
|
62
|
+
|
|
63
|
+
Um die Migration ohne manuelles Umschreiben aller Import-Statements zu ermöglichen, enthält jedes Compat Adapter Package ein **benutzerdefiniertes Bundler-Plugin** (Vite oder Next.js) unter dem Subpfad `/plugin`.
|
|
64
|
+
|
|
65
|
+
Diese Plugins schreiben bestehende Imports (z.B. `react-i18next` oder `next-intl`) zur Build-Zeit automatisch in ihre `@intlayer/*`-Äquivalente um.
|
|
66
|
+
|
|
67
|
+
#### Next.js (Webpack / Turbopack) Beispiel
|
|
68
|
+
|
|
69
|
+
Anstelle von `withIntlayer` umschließen Sie Ihre Next.js-Konfiguration mit dem Kompatibilitäts-Plugin:
|
|
70
|
+
|
|
71
|
+
```ts fileName="next.config.ts"
|
|
72
|
+
import { createNextI18nPlugin } from "@intlayer/next-i18next/plugin";
|
|
73
|
+
import type { NextConfig } from "next";
|
|
74
|
+
|
|
75
|
+
const withIntlayer = createNextI18nPlugin();
|
|
76
|
+
const nextConfig: NextConfig = {};
|
|
77
|
+
|
|
78
|
+
export default withIntlayer(nextConfig);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### Vite (React, Vue, Solid, Svelte) Beispiel
|
|
82
|
+
|
|
83
|
+
```ts fileName="vite.config.ts"
|
|
84
|
+
import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
|
|
85
|
+
|
|
86
|
+
export default defineConfig({
|
|
87
|
+
plugins: [vueI18nVitePlugin()],
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Mutualized Runtime Resolver
|
|
94
|
+
|
|
95
|
+
Alle Kompatibilitätsadapter leiten die Übersetzungsauflösung nun über einen einzigen, hochoptimierten Runtime-Parser: `@intlayer/core/messageFormat`.
|
|
96
|
+
|
|
97
|
+
- **Interpolate Message**: Löst Standard `{{var}}` (Leerzeichen & Dot-Pfade), ICU-formatierte Argumente (`{v, number, percent}` etc.) und einfache `{var}`-Templates auf.
|
|
98
|
+
- **Message Node Resolver**: Löst verschachtelte Nodes auf: `insert()`, `plural()` (CLDR-Pluralregeln), `enu()` (Aufzählung), `gender()`, HTML-Tags, Arrays und aufrufbare Funktions-Nodes.
|
|
99
|
+
- **Tokenized Tag Parser**: Unterstützt Inline-XML/HTML-Tags und nummerierte Tags (z.B. `<1>children</1>`), um Rich-Text-Rendering out-of-the-box zu ermöglichen.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Feature Spec: Collections, Variants & Dynamic Records
|
|
104
|
+
|
|
105
|
+
Intlayer v9 geht über statische Schlüssel-Wert-Objekte hinaus und ermöglicht es Dictionaries, dynamische Layout-Strukturen zu deklarieren, die End-to-End vollständig typisiert sind.
|
|
106
|
+
|
|
107
|
+
### 1. Collections
|
|
108
|
+
|
|
109
|
+
Definieren Sie eine CMS-verwaltete Liste geordneter Elemente (z.B. FAQs, Produkte oder Bloglisten):
|
|
110
|
+
|
|
111
|
+
```ts fileName="faq.content.ts"
|
|
112
|
+
import { t, type Dictionary } from "intlayer";
|
|
113
|
+
|
|
114
|
+
export default {
|
|
115
|
+
key: "faq",
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
question: t({
|
|
119
|
+
de: "Was ist Intlayer?",
|
|
120
|
+
en: "What is Intlayer?",
|
|
121
|
+
fr: "Qu'est-ce qu'Intlayer ?",
|
|
122
|
+
}),
|
|
123
|
+
answer: t({
|
|
124
|
+
de: "Ein i18n-Toolkit.",
|
|
125
|
+
en: "An i18n toolkit.",
|
|
126
|
+
fr: "Une boîte à outils i18n.",
|
|
127
|
+
}),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
} satisfies Dictionary;
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Verwendung:
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
// Alle Elemente abrufen
|
|
137
|
+
const allFaqs = useIntlayer("faq"); // -> { question: string, answer: string }[]
|
|
138
|
+
|
|
139
|
+
// Einzelnes Element nach Index abrufen
|
|
140
|
+
const faq = useIntlayer("faq", { item: 1 }); // -> { question: string, answer: string }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 2. Variants
|
|
144
|
+
|
|
145
|
+
Liefern Sie A/B-Tests, saisonale Header, Feature Flags oder benutzerdefinierte Landing Pages:
|
|
146
|
+
|
|
147
|
+
```ts fileName="hero.content.ts"
|
|
148
|
+
import { t, type Dictionary } from "intlayer";
|
|
149
|
+
|
|
150
|
+
export default {
|
|
151
|
+
key: "hero-banner",
|
|
152
|
+
variant: "default",
|
|
153
|
+
content: {
|
|
154
|
+
control: t({ de: "Willkommen", en: "Welcome", fr: "Bienvenue" }),
|
|
155
|
+
black_friday: t({
|
|
156
|
+
de: "Jetzt einkaufen",
|
|
157
|
+
en: "Shop now",
|
|
158
|
+
fr: "Acheter maintenant",
|
|
159
|
+
}),
|
|
160
|
+
},
|
|
161
|
+
} satisfies Dictionary;
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
#### Verwendung:
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
const banner = useIntlayer("hero-banner", { variant: "black_friday" });
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 3. Dynamic Records
|
|
171
|
+
|
|
172
|
+
Definieren Sie Dictionaries, deren Einträge zur Laufzeit dynamisch über Query-IDs geladen werden:
|
|
173
|
+
|
|
174
|
+
```ts fileName="product.content.ts"
|
|
175
|
+
import { t, type Dictionary } from "intlayer";
|
|
176
|
+
|
|
177
|
+
export default {
|
|
178
|
+
key: "product-copy",
|
|
179
|
+
meta: {
|
|
180
|
+
id: "prod_123",
|
|
181
|
+
category: "books",
|
|
182
|
+
},
|
|
183
|
+
content: {
|
|
184
|
+
title: t({ de: "Clean Code", en: "Clean Code", fr: "Code Propre" }),
|
|
185
|
+
},
|
|
186
|
+
} satisfies Dictionary;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
#### Verwendung:
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
// Ruft nur das angeforderte Element dynamisch ab (erfordert Suspense)
|
|
193
|
+
const product = useIntlayer("product-copy", {
|
|
194
|
+
id: "prod_123",
|
|
195
|
+
category: "books",
|
|
196
|
+
});
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Dynamisches Laden & Optimierungen der Bundle-Größe
|
|
202
|
+
|
|
203
|
+
Um Bundles extrem klein zu halten, unterstützt Intlayer v9 dynamisches Lazy Loading.
|
|
204
|
+
|
|
205
|
+
Stellen Sie in Ihrer Konfiguration `importMode` auf `'dynamic'` oder `'fetch'` ein:
|
|
206
|
+
|
|
207
|
+
```ts fileName="intlayer.config.ts"
|
|
208
|
+
export default {
|
|
209
|
+
dictionary: {
|
|
210
|
+
importMode: "dynamic", // "static" | "dynamic" | "fetch"
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Zur Build-Zeit scannen `@intlayer/swc` und `@intlayer/babel` Ihre Dateien und ersetzen `useIntlayer` / `getIntlayer`-Aufrufe durch tree-shakeable Wrapper (`useDictionary` / `useDictionaryDynamic`). Nur der für das ausgewählte Collection-Element, die Variante oder das Locale erforderliche Inhalt wird geladen, wodurch verhindert wird, dass Ihr Produktions-Bundle ungenutzte Übersetzungen enthält.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Migrationshinweise von v8
|
|
220
|
+
|
|
221
|
+
Wenn Sie von v8 upgraden, beachten Sie, dass v9 keine Breaking Changes enthält. Hier sind jedoch die wichtigsten Änderungen:
|
|
222
|
+
|
|
223
|
+
- **Locales & Dialects**: Wenn Sie externe i18n-Abhängigkeiten verwenden, fügen Sie deren entsprechende Kompatibilitätsadapter-Plugins in Ihrer Konfiguration oder Ihrem Bundler-Setup hinzu, um Imports automatisch umzuschreiben.
|
|
224
|
+
- **Custom Selectors**: Beim Aufruf von `useIntlayer` ist der zweite Parameter nun für ein Options-Objekt reserviert, das `{ locale, item, variant, id }` enthält. Wenn Sie zuvor direkt einen Locale-String übergeben haben, können Sie dies weiterhin tun, aber die Verwendung des Options-Objekts wird für erweiterte Auswahlen empfohlen.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Nützliche Links
|
|
229
|
+
|
|
230
|
+
- [Leitfaden für Compat Adapter Packages](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/compat/index.md)
|
|
231
|
+
- [Dynamische Dictionaries – Collections, Variants & Dynamic Records](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dynamic_dictionaries/index.md)
|
|
232
|
+
- [Konfigurationsreferenz](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md)
|
package/docs/en/CI_CD.md
CHANGED
|
@@ -93,7 +93,7 @@ export default config;
|
|
|
93
93
|
|
|
94
94
|
```bash fileName=".husky/pre-push"
|
|
95
95
|
npx intlayer build # To ensure dictionaries are up to date
|
|
96
|
-
npx intlayer fill --unpushed --mode
|
|
96
|
+
npx intlayer fill --unpushed --mode complete # Only fill missing content, does not update existing ones
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
> For more information about Intlayer CLI commands and their usage, refer to the [CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
|
|
@@ -103,11 +103,11 @@ npx intlayer fill --unpushed --mode fill # Only fill missing content, does no
|
|
|
103
103
|
```bash fileName=".husky/pre-push"
|
|
104
104
|
# App 1
|
|
105
105
|
npx intlayer build --base-dir ./app1
|
|
106
|
-
npx intlayer fill --base-dir ./app1 --unpushed --mode
|
|
106
|
+
npx intlayer fill --base-dir ./app1 --unpushed --mode complete
|
|
107
107
|
|
|
108
108
|
# App 2
|
|
109
109
|
npx intlayer build --base-dir ./app2
|
|
110
|
-
npx intlayer fill --base-dir ./app2 --unpushed --mode
|
|
110
|
+
npx intlayer fill --base-dir ./app2 --unpushed --mode complete
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
## Using GitHub Actions
|
|
@@ -135,8 +135,8 @@ jobs:
|
|
|
135
135
|
runs-on: ubuntu-latest
|
|
136
136
|
env:
|
|
137
137
|
# OpenAI
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
AI_PROVIDER: openai
|
|
139
|
+
AI_MODEL: gpt-5-mini
|
|
140
140
|
AI_API_KEY: ${{ secrets.AI_API_KEY }}
|
|
141
141
|
|
|
142
142
|
steps:
|
|
@@ -167,10 +167,10 @@ jobs:
|
|
|
167
167
|
|
|
168
168
|
# Step 6: Use AI to automatically fill missing translations
|
|
169
169
|
- name: 🤖 Auto-fill missing translations
|
|
170
|
-
run: npx intlayer fill --git-diff --mode
|
|
170
|
+
run: npx intlayer fill --git-diff --mode complete --provider $AI_PROVIDER --model $AI_MODEL --api-key $AI_API_KEY
|
|
171
171
|
|
|
172
172
|
# Step 7: Check if there are changes and commit them
|
|
173
|
-
- name:
|
|
173
|
+
- name: 🔍 Check for changes
|
|
174
174
|
id: check-changes
|
|
175
175
|
run: |
|
|
176
176
|
if [ -n "$(git status --porcelain)" ]; then
|
package/docs/en/cli/ci.md
CHANGED
|
@@ -128,18 +128,72 @@ bun x intlayer ci fill --verbose --mode complete
|
|
|
128
128
|
|
|
129
129
|
### Use in CI/CD pipelines
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
Running `intlayer init` scaffolds two ready-to-use GitHub Actions workflows for you (see [Scaffolded GitHub Actions](#scaffolded-github-actions) below). The example here shows the equivalent setup using the `ci` command for a monorepo, where credentials are injected per project from `INTLAYER_PROJECT_CREDENTIALS`.
|
|
132
|
+
|
|
133
|
+
> **AI access**: The `fill` command needs AI access to generate translations. The credentials injected by `ci` from `INTLAYER_PROJECT_CREDENTIALS` (Intlayer CMS access keys) grant AI access through the Intlayer backend, so no separate AI provider key is required. If you prefer to use your own provider key instead, pass `--provider`, `--model`, and `--api-key` to `intlayer ci fill`. The `test` command does not require AI access.
|
|
134
|
+
|
|
135
|
+
```yaml fileName=".github/workflows/intlayer-ci.yml"
|
|
136
|
+
name: Intlayer CI
|
|
137
|
+
|
|
138
|
+
on:
|
|
139
|
+
pull_request:
|
|
140
|
+
branches:
|
|
141
|
+
- main
|
|
142
|
+
|
|
143
|
+
permissions:
|
|
144
|
+
contents: write
|
|
145
|
+
pull-requests: write
|
|
146
|
+
|
|
147
|
+
jobs:
|
|
148
|
+
intlayer:
|
|
149
|
+
runs-on: ubuntu-latest
|
|
150
|
+
env:
|
|
151
|
+
# CMS access keys per project. They also grant AI access for `fill`.
|
|
152
|
+
INTLAYER_PROJECT_CREDENTIALS: ${{ secrets.INTLAYER_PROJECT_CREDENTIALS }}
|
|
153
|
+
steps:
|
|
154
|
+
- name: ⬇️ Checkout repository
|
|
155
|
+
uses: actions/checkout@v4
|
|
156
|
+
with:
|
|
157
|
+
persist-credentials: true
|
|
158
|
+
fetch-depth: 0
|
|
159
|
+
|
|
160
|
+
- name: 🟢 Setup Node.js
|
|
161
|
+
uses: actions/setup-node@v4
|
|
162
|
+
with:
|
|
163
|
+
node-version: 20
|
|
164
|
+
|
|
165
|
+
- name: 📦 Install dependencies
|
|
166
|
+
run: npm ci
|
|
167
|
+
|
|
168
|
+
- name: 🤖 Fill missing translations
|
|
169
|
+
run: npx intlayer ci fill --git-diff --mode complete
|
|
170
|
+
|
|
171
|
+
- name: 🧪 Test for missing translations
|
|
172
|
+
run: npx intlayer ci test
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Scaffolded GitHub Actions
|
|
176
|
+
|
|
177
|
+
When you run `intlayer init`, Intlayer detects your package manager (npm, yarn, pnpm, or bun) and scaffolds two GitHub Actions workflows under `.github/workflows/`, with commands matching that package manager:
|
|
132
178
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
env:
|
|
136
|
-
INTLAYER_PROJECT_CREDENTIALS: ${{ secrets.INTLAYER_PROJECT_CREDENTIALS }}
|
|
179
|
+
- **`intlayer-fill.yml`** — On every pull request, builds the dictionaries and runs `intlayer fill --git-diff --mode complete` to generate missing translations for the changed dictionaries, then commits the result back to the PR branch.
|
|
180
|
+
- **`intlayer-test.yml`** — On every pull request, builds the dictionaries and runs `intlayer test`, failing the check when required locales are missing translations.
|
|
137
181
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
182
|
+
Existing workflow files are never overwritten. To skip scaffolding entirely, run:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
npx intlayer init --no-github-actions
|
|
141
186
|
```
|
|
142
187
|
|
|
188
|
+
### Providing AI access to the fill workflow
|
|
189
|
+
|
|
190
|
+
The scaffolded `intlayer-fill.yml` requires AI access. Two options are available (configured in the workflow's `env` block):
|
|
191
|
+
|
|
192
|
+
1. **Your own AI provider key** — Add an `AI_API_KEY` secret in your repository settings (Settings → Secrets and variables → Actions). The workflow forwards it via `--provider`, `--model`, and `--api-key`.
|
|
193
|
+
2. **Intlayer CMS access keys** — Add `INTLAYER_CLIENT_ID` and `INTLAYER_CLIENT_SECRET` secrets and wire them into your `intlayer.config` `editor` section. CMS access keys grant AI access through the Intlayer backend.
|
|
194
|
+
|
|
195
|
+
The `intlayer-test.yml` workflow does not require any AI access.
|
|
196
|
+
|
|
143
197
|
## Error Handling
|
|
144
198
|
|
|
145
199
|
- If `INTLAYER_PROJECT_CREDENTIALS` is not set, the command will exit with an error.
|