@nodaro/shared 1.4.1
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/LICENSE +202 -0
- package/README.md +32 -0
- package/dist/index.cjs +12506 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12269 -0
- package/dist/index.d.ts +12269 -0
- package/dist/index.js +11831 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
- package/src/__tests__/ai-avatar-pricing.test.ts +321 -0
- package/src/__tests__/apply-video-negative-prompt.test.ts +76 -0
- package/src/__tests__/attach-columns.test.ts +28 -0
- package/src/__tests__/audio-crossfade-curves.test.ts +33 -0
- package/src/__tests__/build-model-menu.test.ts +58 -0
- package/src/__tests__/character-aspect-defaults.test.ts +142 -0
- package/src/__tests__/character-mention-slug.test.ts +199 -0
- package/src/__tests__/character-reference-photo-kinds.test.ts +32 -0
- package/src/__tests__/character-usage-mode.test.ts +147 -0
- package/src/__tests__/character-variant-assets.test.ts +142 -0
- package/src/__tests__/character-voice.test.ts +130 -0
- package/src/__tests__/cinematic-avatar-pricing.test.ts +119 -0
- package/src/__tests__/combine-transitions.test.ts +137 -0
- package/src/__tests__/component-types.test.ts +87 -0
- package/src/__tests__/condition-variables.test.ts +98 -0
- package/src/__tests__/credit-identifiers.test.ts +811 -0
- package/src/__tests__/default-video-provider.test.ts +63 -0
- package/src/__tests__/entity-image-handle.test.ts +43 -0
- package/src/__tests__/entity-variants.test.ts +33 -0
- package/src/__tests__/fal-lip-sync-sets.test.ts +31 -0
- package/src/__tests__/featured-entities.test.ts +33 -0
- package/src/__tests__/film-pricing.test.ts +64 -0
- package/src/__tests__/filter-condition.test.ts +285 -0
- package/src/__tests__/freecut-protocol.test.ts +35 -0
- package/src/__tests__/generate-text-items.test.ts +19 -0
- package/src/__tests__/generated-results.test.ts +50 -0
- package/src/__tests__/graph-utils.test.ts +618 -0
- package/src/__tests__/group-aggregation.test.ts +83 -0
- package/src/__tests__/i18n-locale-completeness.test.ts +156 -0
- package/src/__tests__/image-critic-node.test.ts +86 -0
- package/src/__tests__/image-mask-mode.test.ts +16 -0
- package/src/__tests__/image-ref-limit.test.ts +78 -0
- package/src/__tests__/inpaint-region.test.ts +24 -0
- package/src/__tests__/input-field-map-parity.test.ts +30 -0
- package/src/__tests__/json-evaluator.test.ts +289 -0
- package/src/__tests__/json-path.test.ts +64 -0
- package/src/__tests__/lip-sync-pricing.test.ts +142 -0
- package/src/__tests__/list-merge.test.ts +96 -0
- package/src/__tests__/list-sort.test.ts +134 -0
- package/src/__tests__/llm-models.test.ts +445 -0
- package/src/__tests__/location-mention-slug.test.ts +246 -0
- package/src/__tests__/locations-coverage-critic-schema.test.ts +92 -0
- package/src/__tests__/loop-delimiter.test.ts +39 -0
- package/src/__tests__/lottie-slots.test.ts +245 -0
- package/src/__tests__/model-catalog-flux2-resolutions.test.ts +21 -0
- package/src/__tests__/model-constants-location.test.ts +20 -0
- package/src/__tests__/model-constants.test.ts +122 -0
- package/src/__tests__/model-tree.test.ts +86 -0
- package/src/__tests__/no-internal-imports.test.ts +25 -0
- package/src/__tests__/node-default-mappings.test.ts +175 -0
- package/src/__tests__/node-mappable-fields.test.ts +7 -0
- package/src/__tests__/node-preset-export.test.ts +46 -0
- package/src/__tests__/node-preset-extract.test.ts +166 -0
- package/src/__tests__/node-refs-canonical.test.ts +54 -0
- package/src/__tests__/node-refs-combine.test.ts +54 -0
- package/src/__tests__/node-refs.test.ts +187 -0
- package/src/__tests__/node-runtime-keys.test.ts +99 -0
- package/src/__tests__/object-aspect-defaults.test.ts +59 -0
- package/src/__tests__/parameter-node-value.test.ts +137 -0
- package/src/__tests__/pinterest-url.test.ts +35 -0
- package/src/__tests__/pipeline-chat.test.ts +110 -0
- package/src/__tests__/pipeline-validation.test.ts +98 -0
- package/src/__tests__/presentation-utils.test.ts +1137 -0
- package/src/__tests__/producer-types.test.ts +47 -0
- package/src/__tests__/prompt-length-limits.test.ts +156 -0
- package/src/__tests__/provider-directive-defaults.test.ts +46 -0
- package/src/__tests__/reduce-strategy-registry.test.ts +43 -0
- package/src/__tests__/reference-board-templates.test.ts +33 -0
- package/src/__tests__/reference-roles.test.ts +36 -0
- package/src/__tests__/resolve-field-mappings.test.ts +110 -0
- package/src/__tests__/resolve-pipeline-model.test.ts +76 -0
- package/src/__tests__/scene-node-types.test.ts +80 -0
- package/src/__tests__/scraper-actors.test.ts +67 -0
- package/src/__tests__/seedance-2-catalog.test.ts +18 -0
- package/src/__tests__/seedance-2-credit-id.test.ts +23 -0
- package/src/__tests__/seedance-aspects.test.ts +52 -0
- package/src/__tests__/selector.test.ts +1151 -0
- package/src/__tests__/settled-with-limit.test.ts +214 -0
- package/src/__tests__/social-media-specs.test.ts +129 -0
- package/src/__tests__/sub-workflow-validation.test.ts +88 -0
- package/src/__tests__/switchx-pricing.test.ts +28 -0
- package/src/__tests__/to-connected-references.test.ts +153 -0
- package/src/__tests__/utilities.test.ts +541 -0
- package/src/__tests__/video-analysis-pricing.test.ts +58 -0
- package/src/__tests__/video-analysis.test.ts +63 -0
- package/src/__tests__/video-audio-capability.test.ts +204 -0
- package/src/__tests__/video-gen-providers.test.ts +28 -0
- package/src/__tests__/video-mode-aliases.test.ts +150 -0
- package/src/__tests__/video-ref-limits.test.ts +72 -0
- package/src/__tests__/video-utils.test.ts +303 -0
- package/src/__tests__/voice-changer-models.test.ts +33 -0
- package/src/__tests__/workflow-export-strip.test.ts +46 -0
- package/src/ai-avatar-pricing.ts +213 -0
- package/src/ancestor-refs.ts +48 -0
- package/src/animals.ts +231 -0
- package/src/audio-crossfade-curves.ts +73 -0
- package/src/audio-fx-presets.ts +64 -0
- package/src/avatar-payload-validators.ts +214 -0
- package/src/caption-styles.ts +31 -0
- package/src/character-aspect-defaults.ts +102 -0
- package/src/character-facets.ts +37 -0
- package/src/character-mention-slug.ts +166 -0
- package/src/character-usage-mode.ts +109 -0
- package/src/character-variant-assets.ts +121 -0
- package/src/character-voice.ts +151 -0
- package/src/cinematic-avatar-pricing.ts +111 -0
- package/src/clone-utils.ts +46 -0
- package/src/combine-transitions.ts +482 -0
- package/src/community.ts +112 -0
- package/src/component-types.ts +127 -0
- package/src/condition-variables.ts +65 -0
- package/src/credit-estimators/index.ts +15 -0
- package/src/credit-estimators/video-utils.ts +165 -0
- package/src/credit-identifiers.ts +304 -0
- package/src/entity-approval-types.ts +31 -0
- package/src/entity-aspect-defaults.ts +82 -0
- package/src/entity-asset-types.ts +296 -0
- package/src/entity-image-handle.ts +36 -0
- package/src/extra-refs.ts +139 -0
- package/src/featured-entities.ts +136 -0
- package/src/film-pricing.ts +117 -0
- package/src/filter-condition.ts +250 -0
- package/src/flux2-pricing.ts +18 -0
- package/src/freecut-protocol.ts +52 -0
- package/src/furniture.ts +167 -0
- package/src/generate-text-items.ts +15 -0
- package/src/generated-results.ts +63 -0
- package/src/group-aggregation.ts +75 -0
- package/src/hint-graph-types.ts +18 -0
- package/src/i18n/action-fx.ar.ts +89 -0
- package/src/i18n/action-fx.de.ts +89 -0
- package/src/i18n/action-fx.es.ts +89 -0
- package/src/i18n/action-fx.fr.ts +89 -0
- package/src/i18n/action-fx.he.ts +89 -0
- package/src/i18n/action-fx.hi.ts +89 -0
- package/src/i18n/action-fx.ja.ts +89 -0
- package/src/i18n/action-fx.ko.ts +89 -0
- package/src/i18n/action-fx.pt-BR.ts +89 -0
- package/src/i18n/action-fx.ru.ts +89 -0
- package/src/i18n/action-fx.zh-CN.ts +89 -0
- package/src/i18n/aesthetic.ar.ts +170 -0
- package/src/i18n/aesthetic.de.ts +48 -0
- package/src/i18n/aesthetic.es.ts +169 -0
- package/src/i18n/aesthetic.fr.ts +52 -0
- package/src/i18n/aesthetic.he.ts +169 -0
- package/src/i18n/aesthetic.hi.ts +55 -0
- package/src/i18n/aesthetic.ja.ts +165 -0
- package/src/i18n/aesthetic.ko.ts +169 -0
- package/src/i18n/aesthetic.pt-BR.ts +148 -0
- package/src/i18n/aesthetic.ru.ts +155 -0
- package/src/i18n/aesthetic.zh-CN.ts +172 -0
- package/src/i18n/animals.ar.ts +145 -0
- package/src/i18n/animals.de.ts +144 -0
- package/src/i18n/animals.es.ts +158 -0
- package/src/i18n/animals.fr.ts +144 -0
- package/src/i18n/animals.he.ts +155 -0
- package/src/i18n/animals.hi.ts +157 -0
- package/src/i18n/animals.ja.ts +159 -0
- package/src/i18n/animals.ko.ts +159 -0
- package/src/i18n/animals.pt-BR.ts +157 -0
- package/src/i18n/animals.ru.ts +155 -0
- package/src/i18n/animals.zh-CN.ts +155 -0
- package/src/i18n/atmosphere.ar.ts +49 -0
- package/src/i18n/atmosphere.de.ts +47 -0
- package/src/i18n/atmosphere.es.ts +50 -0
- package/src/i18n/atmosphere.fr.ts +47 -0
- package/src/i18n/atmosphere.he.ts +47 -0
- package/src/i18n/atmosphere.hi.ts +49 -0
- package/src/i18n/atmosphere.ja.ts +49 -0
- package/src/i18n/atmosphere.ko.ts +49 -0
- package/src/i18n/atmosphere.pt-BR.ts +49 -0
- package/src/i18n/atmosphere.ru.ts +47 -0
- package/src/i18n/atmosphere.zh-CN.ts +152 -0
- package/src/i18n/backdrop.ar.ts +53 -0
- package/src/i18n/backdrop.de.ts +46 -0
- package/src/i18n/backdrop.es.ts +54 -0
- package/src/i18n/backdrop.fr.ts +52 -0
- package/src/i18n/backdrop.he.ts +51 -0
- package/src/i18n/backdrop.hi.ts +59 -0
- package/src/i18n/backdrop.ja.ts +61 -0
- package/src/i18n/backdrop.ko.ts +59 -0
- package/src/i18n/backdrop.pt-BR.ts +59 -0
- package/src/i18n/backdrop.ru.ts +57 -0
- package/src/i18n/backdrop.zh-CN.ts +57 -0
- package/src/i18n/camera-format.ar.ts +40 -0
- package/src/i18n/camera-format.de.ts +37 -0
- package/src/i18n/camera-format.es.ts +41 -0
- package/src/i18n/camera-format.fr.ts +37 -0
- package/src/i18n/camera-format.he.ts +37 -0
- package/src/i18n/camera-format.hi.ts +42 -0
- package/src/i18n/camera-format.ja.ts +37 -0
- package/src/i18n/camera-format.ko.ts +37 -0
- package/src/i18n/camera-format.pt-BR.ts +46 -0
- package/src/i18n/camera-format.ru.ts +42 -0
- package/src/i18n/camera-format.zh-CN.ts +42 -0
- package/src/i18n/camera-motions.ar.ts +86 -0
- package/src/i18n/camera-motions.de.ts +74 -0
- package/src/i18n/camera-motions.es.ts +86 -0
- package/src/i18n/camera-motions.fr.ts +86 -0
- package/src/i18n/camera-motions.he.ts +86 -0
- package/src/i18n/camera-motions.hi.ts +99 -0
- package/src/i18n/camera-motions.ja.ts +99 -0
- package/src/i18n/camera-motions.ko.ts +99 -0
- package/src/i18n/camera-motions.pt-BR.ts +99 -0
- package/src/i18n/camera-motions.ru.ts +99 -0
- package/src/i18n/camera-motions.zh-CN.ts +99 -0
- package/src/i18n/character-fx.ar.ts +72 -0
- package/src/i18n/character-fx.de.ts +72 -0
- package/src/i18n/character-fx.es.ts +72 -0
- package/src/i18n/character-fx.fr.ts +72 -0
- package/src/i18n/character-fx.he.ts +72 -0
- package/src/i18n/character-fx.hi.ts +72 -0
- package/src/i18n/character-fx.ja.ts +72 -0
- package/src/i18n/character-fx.ko.ts +72 -0
- package/src/i18n/character-fx.pt-BR.ts +72 -0
- package/src/i18n/character-fx.ru.ts +72 -0
- package/src/i18n/character-fx.zh-CN.ts +72 -0
- package/src/i18n/color-look.ar.ts +50 -0
- package/src/i18n/color-look.de.ts +47 -0
- package/src/i18n/color-look.es.ts +50 -0
- package/src/i18n/color-look.fr.ts +50 -0
- package/src/i18n/color-look.he.ts +49 -0
- package/src/i18n/color-look.hi.ts +52 -0
- package/src/i18n/color-look.ja.ts +54 -0
- package/src/i18n/color-look.ko.ts +54 -0
- package/src/i18n/color-look.pt-BR.ts +54 -0
- package/src/i18n/color-look.ru.ts +52 -0
- package/src/i18n/color-look.zh-CN.ts +53 -0
- package/src/i18n/composition-effects.ar.ts +26 -0
- package/src/i18n/composition-effects.de.ts +25 -0
- package/src/i18n/composition-effects.es.ts +27 -0
- package/src/i18n/composition-effects.fr.ts +25 -0
- package/src/i18n/composition-effects.he.ts +25 -0
- package/src/i18n/composition-effects.hi.ts +27 -0
- package/src/i18n/composition-effects.ja.ts +27 -0
- package/src/i18n/composition-effects.ko.ts +27 -0
- package/src/i18n/composition-effects.pt-BR.ts +25 -0
- package/src/i18n/composition-effects.ru.ts +82 -0
- package/src/i18n/composition-effects.zh-CN.ts +25 -0
- package/src/i18n/era.ar.ts +37 -0
- package/src/i18n/era.de.ts +34 -0
- package/src/i18n/era.es.ts +37 -0
- package/src/i18n/era.fr.ts +37 -0
- package/src/i18n/era.he.ts +36 -0
- package/src/i18n/era.hi.ts +39 -0
- package/src/i18n/era.ja.ts +41 -0
- package/src/i18n/era.ko.ts +39 -0
- package/src/i18n/era.pt-BR.ts +41 -0
- package/src/i18n/era.ru.ts +121 -0
- package/src/i18n/era.zh-CN.ts +39 -0
- package/src/i18n/exposure-settings.ar.ts +28 -0
- package/src/i18n/exposure-settings.de.ts +26 -0
- package/src/i18n/exposure-settings.es.ts +28 -0
- package/src/i18n/exposure-settings.fr.ts +29 -0
- package/src/i18n/exposure-settings.he.ts +28 -0
- package/src/i18n/exposure-settings.hi.ts +31 -0
- package/src/i18n/exposure-settings.ja.ts +31 -0
- package/src/i18n/exposure-settings.ko.ts +31 -0
- package/src/i18n/exposure-settings.pt-BR.ts +31 -0
- package/src/i18n/exposure-settings.ru.ts +31 -0
- package/src/i18n/exposure-settings.zh-CN.ts +31 -0
- package/src/i18n/framing.ar.ts +78 -0
- package/src/i18n/framing.de.ts +73 -0
- package/src/i18n/framing.es.ts +78 -0
- package/src/i18n/framing.fr.ts +78 -0
- package/src/i18n/framing.he.ts +77 -0
- package/src/i18n/framing.hi.ts +82 -0
- package/src/i18n/framing.ja.ts +84 -0
- package/src/i18n/framing.ko.ts +82 -0
- package/src/i18n/framing.pt-BR.ts +84 -0
- package/src/i18n/framing.ru.ts +82 -0
- package/src/i18n/framing.zh-CN.ts +82 -0
- package/src/i18n/furniture.ar.ts +92 -0
- package/src/i18n/furniture.de.ts +93 -0
- package/src/i18n/furniture.es.ts +101 -0
- package/src/i18n/furniture.fr.ts +93 -0
- package/src/i18n/furniture.he.ts +101 -0
- package/src/i18n/furniture.hi.ts +101 -0
- package/src/i18n/furniture.ja.ts +101 -0
- package/src/i18n/furniture.ko.ts +101 -0
- package/src/i18n/furniture.pt-BR.ts +101 -0
- package/src/i18n/furniture.ru.ts +101 -0
- package/src/i18n/furniture.zh-CN.ts +101 -0
- package/src/i18n/held-prop.ar.ts +74 -0
- package/src/i18n/held-prop.de.ts +65 -0
- package/src/i18n/held-prop.es.ts +83 -0
- package/src/i18n/held-prop.fr.ts +74 -0
- package/src/i18n/held-prop.he.ts +73 -0
- package/src/i18n/held-prop.hi.ts +82 -0
- package/src/i18n/held-prop.ja.ts +84 -0
- package/src/i18n/held-prop.ko.ts +84 -0
- package/src/i18n/held-prop.pt-BR.ts +84 -0
- package/src/i18n/held-prop.ru.ts +82 -0
- package/src/i18n/held-prop.zh-CN.ts +82 -0
- package/src/i18n/index.ts +208 -0
- package/src/i18n/instrumentation.ar.ts +195 -0
- package/src/i18n/instrumentation.de.ts +195 -0
- package/src/i18n/instrumentation.es.ts +195 -0
- package/src/i18n/instrumentation.fr.ts +195 -0
- package/src/i18n/instrumentation.he.ts +195 -0
- package/src/i18n/instrumentation.hi.ts +195 -0
- package/src/i18n/instrumentation.ja.ts +195 -0
- package/src/i18n/instrumentation.ko.ts +195 -0
- package/src/i18n/instrumentation.pt-BR.ts +195 -0
- package/src/i18n/instrumentation.ru.ts +195 -0
- package/src/i18n/instrumentation.zh-CN.ts +195 -0
- package/src/i18n/lens.ar.ts +24 -0
- package/src/i18n/lens.de.ts +24 -0
- package/src/i18n/lens.es.ts +24 -0
- package/src/i18n/lens.fr.ts +24 -0
- package/src/i18n/lens.he.ts +24 -0
- package/src/i18n/lens.hi.ts +24 -0
- package/src/i18n/lens.ja.ts +24 -0
- package/src/i18n/lens.ko.ts +24 -0
- package/src/i18n/lens.pt-BR.ts +24 -0
- package/src/i18n/lens.ru.ts +25 -0
- package/src/i18n/lens.zh-CN.ts +24 -0
- package/src/i18n/lighting.ar.ts +86 -0
- package/src/i18n/lighting.de.ts +84 -0
- package/src/i18n/lighting.es.ts +89 -0
- package/src/i18n/lighting.fr.ts +84 -0
- package/src/i18n/lighting.he.ts +88 -0
- package/src/i18n/lighting.hi.ts +90 -0
- package/src/i18n/lighting.ja.ts +90 -0
- package/src/i18n/lighting.ko.ts +90 -0
- package/src/i18n/lighting.pt-BR.ts +90 -0
- package/src/i18n/lighting.ru.ts +88 -0
- package/src/i18n/lighting.zh-CN.ts +92 -0
- package/src/i18n/loop-subject.ar.ts +39 -0
- package/src/i18n/loop-subject.de.ts +39 -0
- package/src/i18n/loop-subject.es.ts +39 -0
- package/src/i18n/loop-subject.fr.ts +39 -0
- package/src/i18n/loop-subject.he.ts +39 -0
- package/src/i18n/loop-subject.hi.ts +39 -0
- package/src/i18n/loop-subject.ja.ts +39 -0
- package/src/i18n/loop-subject.ko.ts +39 -0
- package/src/i18n/loop-subject.pt-BR.ts +39 -0
- package/src/i18n/loop-subject.ru.ts +39 -0
- package/src/i18n/loop-subject.zh-CN.ts +39 -0
- package/src/i18n/materials.ar.ts +80 -0
- package/src/i18n/materials.de.ts +80 -0
- package/src/i18n/materials.es.ts +87 -0
- package/src/i18n/materials.fr.ts +80 -0
- package/src/i18n/materials.he.ts +86 -0
- package/src/i18n/materials.hi.ts +86 -0
- package/src/i18n/materials.ja.ts +88 -0
- package/src/i18n/materials.ko.ts +88 -0
- package/src/i18n/materials.pt-BR.ts +88 -0
- package/src/i18n/materials.ru.ts +86 -0
- package/src/i18n/materials.zh-CN.ts +86 -0
- package/src/i18n/mood.ar.ts +61 -0
- package/src/i18n/mood.de.ts +61 -0
- package/src/i18n/mood.es.ts +66 -0
- package/src/i18n/mood.fr.ts +61 -0
- package/src/i18n/mood.he.ts +64 -0
- package/src/i18n/mood.hi.ts +66 -0
- package/src/i18n/mood.ja.ts +66 -0
- package/src/i18n/mood.ko.ts +66 -0
- package/src/i18n/mood.pt-BR.ts +64 -0
- package/src/i18n/mood.ru.ts +64 -0
- package/src/i18n/mood.zh-CN.ts +64 -0
- package/src/i18n/music-genre.ar.ts +302 -0
- package/src/i18n/music-genre.de.ts +302 -0
- package/src/i18n/music-genre.es.ts +302 -0
- package/src/i18n/music-genre.fr.ts +302 -0
- package/src/i18n/music-genre.he.ts +302 -0
- package/src/i18n/music-genre.hi.ts +302 -0
- package/src/i18n/music-genre.ja.ts +302 -0
- package/src/i18n/music-genre.ko.ts +302 -0
- package/src/i18n/music-genre.pt-BR.ts +302 -0
- package/src/i18n/music-genre.ru.ts +302 -0
- package/src/i18n/music-genre.zh-CN.ts +302 -0
- package/src/i18n/music-mood.ar.ts +75 -0
- package/src/i18n/music-mood.de.ts +75 -0
- package/src/i18n/music-mood.es.ts +75 -0
- package/src/i18n/music-mood.fr.ts +75 -0
- package/src/i18n/music-mood.he.ts +75 -0
- package/src/i18n/music-mood.hi.ts +75 -0
- package/src/i18n/music-mood.ja.ts +75 -0
- package/src/i18n/music-mood.ko.ts +75 -0
- package/src/i18n/music-mood.pt-BR.ts +75 -0
- package/src/i18n/music-mood.ru.ts +75 -0
- package/src/i18n/music-mood.zh-CN.ts +75 -0
- package/src/i18n/person.ar.ts +638 -0
- package/src/i18n/person.de.ts +629 -0
- package/src/i18n/person.es.ts +645 -0
- package/src/i18n/person.fr.ts +621 -0
- package/src/i18n/person.he.ts +656 -0
- package/src/i18n/person.hi.ts +654 -0
- package/src/i18n/person.ja.ts +662 -0
- package/src/i18n/person.ko.ts +662 -0
- package/src/i18n/person.pt-BR.ts +656 -0
- package/src/i18n/person.ru.ts +656 -0
- package/src/i18n/person.zh-CN.ts +656 -0
- package/src/i18n/photo-genre.ar.ts +58 -0
- package/src/i18n/photo-genre.de.ts +52 -0
- package/src/i18n/photo-genre.es.ts +64 -0
- package/src/i18n/photo-genre.fr.ts +58 -0
- package/src/i18n/photo-genre.he.ts +62 -0
- package/src/i18n/photo-genre.hi.ts +63 -0
- package/src/i18n/photo-genre.ja.ts +65 -0
- package/src/i18n/photo-genre.ko.ts +63 -0
- package/src/i18n/photo-genre.pt-BR.ts +65 -0
- package/src/i18n/photo-genre.ru.ts +63 -0
- package/src/i18n/photo-genre.zh-CN.ts +63 -0
- package/src/i18n/photographer.ar.ts +75 -0
- package/src/i18n/photographer.de.ts +74 -0
- package/src/i18n/photographer.es.ts +77 -0
- package/src/i18n/photographer.fr.ts +77 -0
- package/src/i18n/photographer.he.ts +78 -0
- package/src/i18n/photographer.hi.ts +80 -0
- package/src/i18n/photographer.ja.ts +84 -0
- package/src/i18n/photographer.ko.ts +84 -0
- package/src/i18n/photographer.pt-BR.ts +83 -0
- package/src/i18n/photographer.ru.ts +78 -0
- package/src/i18n/photographer.zh-CN.ts +78 -0
- package/src/i18n/pose.ar.ts +95 -0
- package/src/i18n/pose.de.ts +96 -0
- package/src/i18n/pose.es.ts +104 -0
- package/src/i18n/pose.fr.ts +96 -0
- package/src/i18n/pose.he.ts +104 -0
- package/src/i18n/pose.hi.ts +104 -0
- package/src/i18n/pose.ja.ts +104 -0
- package/src/i18n/pose.ko.ts +104 -0
- package/src/i18n/pose.pt-BR.ts +104 -0
- package/src/i18n/pose.ru.ts +104 -0
- package/src/i18n/pose.zh-CN.ts +104 -0
- package/src/i18n/post-process-effects.ar.ts +25 -0
- package/src/i18n/post-process-effects.de.ts +24 -0
- package/src/i18n/post-process-effects.es.ts +26 -0
- package/src/i18n/post-process-effects.fr.ts +24 -0
- package/src/i18n/post-process-effects.he.ts +24 -0
- package/src/i18n/post-process-effects.hi.ts +26 -0
- package/src/i18n/post-process-effects.ja.ts +26 -0
- package/src/i18n/post-process-effects.ko.ts +26 -0
- package/src/i18n/post-process-effects.pt-BR.ts +24 -0
- package/src/i18n/post-process-effects.ru.ts +24 -0
- package/src/i18n/post-process-effects.zh-CN.ts +24 -0
- package/src/i18n/render-quality.ar.ts +34 -0
- package/src/i18n/render-quality.de.ts +30 -0
- package/src/i18n/render-quality.es.ts +35 -0
- package/src/i18n/render-quality.fr.ts +34 -0
- package/src/i18n/render-quality.he.ts +33 -0
- package/src/i18n/render-quality.hi.ts +39 -0
- package/src/i18n/render-quality.ja.ts +39 -0
- package/src/i18n/render-quality.ko.ts +39 -0
- package/src/i18n/render-quality.pt-BR.ts +37 -0
- package/src/i18n/render-quality.ru.ts +37 -0
- package/src/i18n/render-quality.zh-CN.ts +37 -0
- package/src/i18n/seasons.ar.ts +10 -0
- package/src/i18n/seasons.de.ts +10 -0
- package/src/i18n/seasons.es.ts +10 -0
- package/src/i18n/seasons.fr.ts +10 -0
- package/src/i18n/seasons.he.ts +10 -0
- package/src/i18n/seasons.hi.ts +10 -0
- package/src/i18n/seasons.ja.ts +10 -0
- package/src/i18n/seasons.ko.ts +10 -0
- package/src/i18n/seasons.pt-BR.ts +10 -0
- package/src/i18n/seasons.ru.ts +10 -0
- package/src/i18n/seasons.zh-CN.ts +10 -0
- package/src/i18n/setting.ar.ts +73 -0
- package/src/i18n/setting.de.ts +73 -0
- package/src/i18n/setting.es.ts +77 -0
- package/src/i18n/setting.fr.ts +73 -0
- package/src/i18n/setting.he.ts +76 -0
- package/src/i18n/setting.hi.ts +76 -0
- package/src/i18n/setting.ja.ts +78 -0
- package/src/i18n/setting.ko.ts +76 -0
- package/src/i18n/setting.pt-BR.ts +78 -0
- package/src/i18n/setting.ru.ts +76 -0
- package/src/i18n/setting.zh-CN.ts +76 -0
- package/src/i18n/style.ar.ts +55 -0
- package/src/i18n/style.de.ts +54 -0
- package/src/i18n/style.es.ts +54 -0
- package/src/i18n/style.fr.ts +54 -0
- package/src/i18n/style.he.ts +54 -0
- package/src/i18n/style.hi.ts +54 -0
- package/src/i18n/style.ja.ts +54 -0
- package/src/i18n/style.ko.ts +54 -0
- package/src/i18n/style.pt-BR.ts +56 -0
- package/src/i18n/style.ru.ts +54 -0
- package/src/i18n/style.zh-CN.ts +54 -0
- package/src/i18n/styling.ar.ts +295 -0
- package/src/i18n/styling.de.ts +285 -0
- package/src/i18n/styling.es.ts +317 -0
- package/src/i18n/styling.fr.ts +285 -0
- package/src/i18n/styling.he.ts +307 -0
- package/src/i18n/styling.hi.ts +323 -0
- package/src/i18n/styling.ja.ts +317 -0
- package/src/i18n/styling.ko.ts +311 -0
- package/src/i18n/styling.pt-BR.ts +301 -0
- package/src/i18n/styling.ru.ts +301 -0
- package/src/i18n/styling.zh-CN.ts +307 -0
- package/src/i18n/temporal.ar.ts +31 -0
- package/src/i18n/temporal.de.ts +24 -0
- package/src/i18n/temporal.es.ts +27 -0
- package/src/i18n/temporal.fr.ts +28 -0
- package/src/i18n/temporal.he.ts +31 -0
- package/src/i18n/temporal.hi.ts +31 -0
- package/src/i18n/temporal.ja.ts +31 -0
- package/src/i18n/temporal.ko.ts +31 -0
- package/src/i18n/temporal.pt-BR.ts +31 -0
- package/src/i18n/temporal.ru.ts +31 -0
- package/src/i18n/temporal.zh-CN.ts +31 -0
- package/src/i18n/transitions.ar.ts +97 -0
- package/src/i18n/transitions.de.ts +97 -0
- package/src/i18n/transitions.es.ts +97 -0
- package/src/i18n/transitions.fr.ts +97 -0
- package/src/i18n/transitions.he.ts +97 -0
- package/src/i18n/transitions.hi.ts +97 -0
- package/src/i18n/transitions.ja.ts +97 -0
- package/src/i18n/transitions.ko.ts +97 -0
- package/src/i18n/transitions.pt-BR.ts +97 -0
- package/src/i18n/transitions.ru.ts +97 -0
- package/src/i18n/transitions.zh-CN.ts +97 -0
- package/src/i18n/types.ts +158 -0
- package/src/i18n/vehicles.ar.ts +137 -0
- package/src/i18n/vehicles.de.ts +125 -0
- package/src/i18n/vehicles.es.ts +138 -0
- package/src/i18n/vehicles.fr.ts +125 -0
- package/src/i18n/vehicles.he.ts +136 -0
- package/src/i18n/vehicles.hi.ts +138 -0
- package/src/i18n/vehicles.ja.ts +138 -0
- package/src/i18n/vehicles.ko.ts +138 -0
- package/src/i18n/vehicles.pt-BR.ts +136 -0
- package/src/i18n/vehicles.ru.ts +136 -0
- package/src/i18n/vehicles.zh-CN.ts +136 -0
- package/src/i18n/voice-character.ar.ts +126 -0
- package/src/i18n/voice-character.de.ts +126 -0
- package/src/i18n/voice-character.es.ts +126 -0
- package/src/i18n/voice-character.fr.ts +126 -0
- package/src/i18n/voice-character.he.ts +126 -0
- package/src/i18n/voice-character.hi.ts +126 -0
- package/src/i18n/voice-character.ja.ts +126 -0
- package/src/i18n/voice-character.ko.ts +126 -0
- package/src/i18n/voice-character.pt-BR.ts +126 -0
- package/src/i18n/voice-character.ru.ts +126 -0
- package/src/i18n/voice-character.zh-CN.ts +126 -0
- package/src/i18n/voice-delivery.ar.ts +77 -0
- package/src/i18n/voice-delivery.de.ts +77 -0
- package/src/i18n/voice-delivery.es.ts +77 -0
- package/src/i18n/voice-delivery.fr.ts +77 -0
- package/src/i18n/voice-delivery.he.ts +77 -0
- package/src/i18n/voice-delivery.hi.ts +77 -0
- package/src/i18n/voice-delivery.ja.ts +77 -0
- package/src/i18n/voice-delivery.ko.ts +77 -0
- package/src/i18n/voice-delivery.pt-BR.ts +77 -0
- package/src/i18n/voice-delivery.ru.ts +77 -0
- package/src/i18n/voice-delivery.zh-CN.ts +77 -0
- package/src/i18n/weapons.ar.ts +115 -0
- package/src/i18n/weapons.de.ts +114 -0
- package/src/i18n/weapons.es.ts +116 -0
- package/src/i18n/weapons.fr.ts +103 -0
- package/src/i18n/weapons.he.ts +114 -0
- package/src/i18n/weapons.hi.ts +116 -0
- package/src/i18n/weapons.ja.ts +116 -0
- package/src/i18n/weapons.ko.ts +116 -0
- package/src/i18n/weapons.pt-BR.ts +114 -0
- package/src/i18n/weapons.ru.ts +114 -0
- package/src/i18n/weapons.zh-CN.ts +114 -0
- package/src/image-critic-node.ts +61 -0
- package/src/image-critic-types.ts +40 -0
- package/src/index.ts +866 -0
- package/src/inject-upstream.ts +15 -0
- package/src/inpaint-region.ts +51 -0
- package/src/json-evaluator.ts +732 -0
- package/src/json-path.ts +52 -0
- package/src/lip-sync-pricing.ts +90 -0
- package/src/list-merge.ts +40 -0
- package/src/list-sort.ts +122 -0
- package/src/list-source-resolver.ts +50 -0
- package/src/llm-models.ts +245 -0
- package/src/location-mention-slug.ts +291 -0
- package/src/location-preset-catalog-map.ts +128 -0
- package/src/loop-delimiter.ts +73 -0
- package/src/lora-routing.ts +95 -0
- package/src/lottie-overlay-catalog.ts +175 -0
- package/src/lottie-slots.ts +309 -0
- package/src/model-catalog.ts +2386 -0
- package/src/model-constants.ts +1910 -0
- package/src/model-tree.ts +120 -0
- package/src/monetization.ts +15 -0
- package/src/multi-pick.ts +42 -0
- package/src/node-default-mappings.ts +262 -0
- package/src/node-mappable-fields.ts +70 -0
- package/src/node-preset-export.ts +56 -0
- package/src/node-preset-extract.ts +147 -0
- package/src/node-refs.ts +253 -0
- package/src/node-runtime-keys.ts +117 -0
- package/src/object-aspect-defaults.ts +72 -0
- package/src/object-picker-types.ts +22 -0
- package/src/parameter-node-value.ts +284 -0
- package/src/pinterest-url.ts +28 -0
- package/src/pipeline-chat.ts +72 -0
- package/src/pipeline-defaults.ts +318 -0
- package/src/pipeline-events.ts +162 -0
- package/src/pipeline-state-types.ts +196 -0
- package/src/pipeline-types.ts +647 -0
- package/src/pipeline-validation.ts +87 -0
- package/src/presentation-types.ts +23 -0
- package/src/presentation-utils.ts +397 -0
- package/src/producer-types.ts +188 -0
- package/src/progress-curve.ts +99 -0
- package/src/provider-directive-defaults.ts +69 -0
- package/src/reduce-strategy-registry.ts +121 -0
- package/src/reference-board-templates.ts +81 -0
- package/src/reference-roles.ts +153 -0
- package/src/reference-sheet/__tests__/board-to-column.test.ts +20 -0
- package/src/reference-sheet/__tests__/catalog.test.ts +50 -0
- package/src/reference-sheet/__tests__/cost.test.ts +38 -0
- package/src/reference-sheet/__tests__/no-drift.test.ts +28 -0
- package/src/reference-sheet/__tests__/panel-plan.test.ts +61 -0
- package/src/reference-sheet/__tests__/panel-prompts.test.ts +17 -0
- package/src/reference-sheet/__tests__/plan-generation.test.ts +72 -0
- package/src/reference-sheet/__tests__/presets.test.ts +54 -0
- package/src/reference-sheet/__tests__/types.test.ts +24 -0
- package/src/reference-sheet/catalog.ts +144 -0
- package/src/reference-sheet/cost.ts +37 -0
- package/src/reference-sheet/credit-id.ts +7 -0
- package/src/reference-sheet/index.ts +8 -0
- package/src/reference-sheet/panel-plan.ts +65 -0
- package/src/reference-sheet/panel-prompts.ts +14 -0
- package/src/reference-sheet/plan-generation.ts +79 -0
- package/src/reference-sheet/presets.ts +77 -0
- package/src/reference-sheet/types.ts +92 -0
- package/src/repeat-types.ts +97 -0
- package/src/resolve-field-mappings.ts +119 -0
- package/src/route-filter.ts +80 -0
- package/src/scene-helper-types.ts +249 -0
- package/src/scene-node-types.ts +281 -0
- package/src/scraper-actors.ts +57 -0
- package/src/scraper-output-schemas.ts +25 -0
- package/src/seasons.ts +45 -0
- package/src/selector.ts +864 -0
- package/src/settled-with-limit.ts +42 -0
- package/src/shot-element.ts +43 -0
- package/src/social-media-specs.ts +121 -0
- package/src/social-post.ts +24 -0
- package/src/sub-workflow-validation.ts +78 -0
- package/src/supported-fonts.ts +40 -0
- package/src/surround.ts +113 -0
- package/src/switchx-pricing.ts +33 -0
- package/src/text-separators.ts +59 -0
- package/src/to-connected-references.ts +77 -0
- package/src/types.ts +272 -0
- package/src/variant-job-id.ts +17 -0
- package/src/vehicles.ts +213 -0
- package/src/video-analysis-pricing.ts +74 -0
- package/src/video-analysis.ts +127 -0
- package/src/video-duration.ts +25 -0
- package/src/voice-changer-models.ts +36 -0
- package/src/voice-matcher-types.ts +37 -0
- package/src/voices.ts +92 -0
- package/src/weapons.ts +190 -0
- package/src/workflow-export.ts +153 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n resolver + lazy loader for parameter-node picker labels/descriptions.
|
|
3
|
+
*
|
|
4
|
+
* Usage from a picker component:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const locale = useUserLocale() // current user-selected locale
|
|
8
|
+
* await ensureLocaleCatalogLoaded("styling", locale) // call once per (catalog, locale), cached
|
|
9
|
+
* const localized = getLocalizedEntry("styling", entry.id, locale)
|
|
10
|
+
* const label = localized?.label ?? entry.label // fallback to canonical English
|
|
11
|
+
* const description = localized?.description ?? entry.description
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* For search filtering, use `entryMatchesQuery(entry, locale, query)` which
|
|
15
|
+
* filters across BOTH the canonical English text AND the localized text.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { I18nCatalogId, LocaleCatalogMap, LocaleId, LocalizedEntry } from "./types.js"
|
|
19
|
+
|
|
20
|
+
export * from "./types.js"
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* In-memory cache of loaded locale catalogs. Key = `<catalog>:<locale>`.
|
|
24
|
+
* `undefined` = never loaded; `null` = loaded but missing/empty.
|
|
25
|
+
*/
|
|
26
|
+
const cache = new Map<string, LocaleCatalogMap | null>()
|
|
27
|
+
const inflight = new Map<string, Promise<LocaleCatalogMap | null>>()
|
|
28
|
+
|
|
29
|
+
function cacheKey(catalog: I18nCatalogId, locale: LocaleId): string {
|
|
30
|
+
return `${catalog}:${locale}`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Lazy-load a sidecar catalog. Returns `null` if the locale is `en` (no
|
|
35
|
+
* sidecar — English lives in the canonical catalog file) or if no sidecar
|
|
36
|
+
* file exists for that (catalog, locale) pair.
|
|
37
|
+
*
|
|
38
|
+
* Implementation note: the dynamic import string is constructed so that
|
|
39
|
+
* Vite can statically analyze the glob and code-split each locale into its
|
|
40
|
+
* own chunk. The `/* @vite-ignore *\/` comment is required because the
|
|
41
|
+
* locale variable defeats Vite's default static analysis; we accept the
|
|
42
|
+
* runtime resolution and rely on the glob-discovery at module init.
|
|
43
|
+
*/
|
|
44
|
+
export async function ensureLocaleCatalogLoaded(
|
|
45
|
+
catalog: I18nCatalogId,
|
|
46
|
+
locale: LocaleId,
|
|
47
|
+
): Promise<LocaleCatalogMap | null> {
|
|
48
|
+
if (locale === "en") return null
|
|
49
|
+
const key = cacheKey(catalog, locale)
|
|
50
|
+
const cached = cache.get(key)
|
|
51
|
+
if (cached !== undefined) return cached
|
|
52
|
+
const existing = inflight.get(key)
|
|
53
|
+
if (existing) return existing
|
|
54
|
+
const promise = loadLocaleCatalog(catalog, locale).then(
|
|
55
|
+
(map) => {
|
|
56
|
+
cache.set(key, map)
|
|
57
|
+
inflight.delete(key)
|
|
58
|
+
return map
|
|
59
|
+
},
|
|
60
|
+
(err) => {
|
|
61
|
+
inflight.delete(key)
|
|
62
|
+
// Cache the failure as null so we don't retry forever
|
|
63
|
+
cache.set(key, null)
|
|
64
|
+
// Don't throw — missing sidecars are expected during gradual rollout;
|
|
65
|
+
// the picker just falls back to English.
|
|
66
|
+
console.warn(`[i18n] failed to load ${key}:`, err)
|
|
67
|
+
return null
|
|
68
|
+
},
|
|
69
|
+
)
|
|
70
|
+
inflight.set(key, promise)
|
|
71
|
+
return promise
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolved value lookup. Reads from the in-memory cache; returns `undefined`
|
|
76
|
+
* if the locale's catalog hasn't been loaded yet (caller should await
|
|
77
|
+
* `ensureLocaleCatalogLoaded` first).
|
|
78
|
+
*/
|
|
79
|
+
export function getLocalizedEntry(
|
|
80
|
+
catalog: I18nCatalogId,
|
|
81
|
+
id: string,
|
|
82
|
+
locale: LocaleId,
|
|
83
|
+
): LocalizedEntry | undefined {
|
|
84
|
+
if (locale === "en") return undefined
|
|
85
|
+
const map = cache.get(cacheKey(catalog, locale))
|
|
86
|
+
if (!map) return undefined
|
|
87
|
+
return map[id]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Synchronous resolver that returns the best label available right now.
|
|
92
|
+
* Falls back to `englishLabel` when no translation exists (or the locale
|
|
93
|
+
* sidecar isn't loaded yet).
|
|
94
|
+
*/
|
|
95
|
+
export function resolveLabel(
|
|
96
|
+
catalog: I18nCatalogId,
|
|
97
|
+
id: string,
|
|
98
|
+
englishLabel: string,
|
|
99
|
+
locale: LocaleId,
|
|
100
|
+
): string {
|
|
101
|
+
if (locale === "en") return englishLabel
|
|
102
|
+
return getLocalizedEntry(catalog, id, locale)?.label ?? englishLabel
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Synchronous resolver that returns the best description available now.
|
|
107
|
+
* Falls back to `englishDescription` when no translation exists.
|
|
108
|
+
*/
|
|
109
|
+
export function resolveDescription(
|
|
110
|
+
catalog: I18nCatalogId,
|
|
111
|
+
id: string,
|
|
112
|
+
englishDescription: string,
|
|
113
|
+
locale: LocaleId,
|
|
114
|
+
): string {
|
|
115
|
+
if (locale === "en") return englishDescription
|
|
116
|
+
return getLocalizedEntry(catalog, id, locale)?.description ?? englishDescription
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Search predicate: returns true if `query` matches either the canonical
|
|
121
|
+
* English label/description or the localized label/description for the
|
|
122
|
+
* current locale.
|
|
123
|
+
*
|
|
124
|
+
* Empty query always matches.
|
|
125
|
+
*/
|
|
126
|
+
export function entryMatchesQuery(
|
|
127
|
+
catalog: I18nCatalogId,
|
|
128
|
+
id: string,
|
|
129
|
+
englishLabel: string,
|
|
130
|
+
englishDescription: string,
|
|
131
|
+
locale: LocaleId,
|
|
132
|
+
query: string,
|
|
133
|
+
): boolean {
|
|
134
|
+
const q = query.trim().toLowerCase()
|
|
135
|
+
if (!q) return true
|
|
136
|
+
if (englishLabel.toLowerCase().includes(q)) return true
|
|
137
|
+
if (englishDescription.toLowerCase().includes(q)) return true
|
|
138
|
+
if (locale === "en") return false
|
|
139
|
+
const localized = getLocalizedEntry(catalog, id, locale)
|
|
140
|
+
if (!localized) return false
|
|
141
|
+
if (localized.label && localized.label.toLowerCase().includes(q)) return true
|
|
142
|
+
if (localized.description && localized.description.toLowerCase().includes(q)) return true
|
|
143
|
+
return false
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Sidecar loader registry. Populated by the consuming app via
|
|
148
|
+
* `registerSidecarLoaders` at startup.
|
|
149
|
+
*
|
|
150
|
+
* Why externalised: this package is bundled by tsup for npm publish, and
|
|
151
|
+
* `tsup` does NOT expand Vite's `import.meta.glob`. Calling it from inside
|
|
152
|
+
* the bundled module yields an empty loader map at runtime → all pickers
|
|
153
|
+
* silently fall back to English regardless of the user's locale.
|
|
154
|
+
*
|
|
155
|
+
* The frontend (which is processed by Vite) owns the glob — see
|
|
156
|
+
* `frontend/src/lib/i18n-bootstrap.ts`. Backend / Node tests don't need
|
|
157
|
+
* picker translations and simply skip registration.
|
|
158
|
+
*
|
|
159
|
+
* Keys are file paths relative to `packages/shared/src/i18n/`, e.g.
|
|
160
|
+
* `"./person.ja.ts"`.
|
|
161
|
+
*/
|
|
162
|
+
type SidecarModule = { default?: LocaleCatalogMap } & Record<string, unknown>
|
|
163
|
+
export type SidecarLoader = () => Promise<unknown>
|
|
164
|
+
|
|
165
|
+
let sidecarLoaders: Record<string, SidecarLoader> = {}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Register the map of locale-sidecar loaders. Call once at app startup
|
|
169
|
+
* before any picker mounts.
|
|
170
|
+
*
|
|
171
|
+
* In Vite-processed code:
|
|
172
|
+
* ```ts
|
|
173
|
+
* import { registerSidecarLoaders } from "@nodaro/shared"
|
|
174
|
+
* registerSidecarLoaders(
|
|
175
|
+
* import.meta.glob("../../packages/shared/src/i18n/*.*.ts"),
|
|
176
|
+
* )
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function registerSidecarLoaders(loaders: Record<string, SidecarLoader>): void {
|
|
180
|
+
sidecarLoaders = loaders
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function loadLocaleCatalog(
|
|
184
|
+
catalog: I18nCatalogId,
|
|
185
|
+
locale: LocaleId,
|
|
186
|
+
): Promise<LocaleCatalogMap | null> {
|
|
187
|
+
if (locale === "en") return null
|
|
188
|
+
// Match by suffix so the registry survives different glob roots —
|
|
189
|
+
// frontend's bootstrap globs from a different relative path than
|
|
190
|
+
// this file lives at, so keys look like ".../i18n/person.ja.ts".
|
|
191
|
+
const suffix = `${catalog}.${locale}.ts`
|
|
192
|
+
const matchKey = Object.keys(sidecarLoaders).find((k) =>
|
|
193
|
+
k.endsWith(`/${suffix}`) || k === `./${suffix}`,
|
|
194
|
+
)
|
|
195
|
+
const loader = matchKey ? sidecarLoaders[matchKey] : undefined
|
|
196
|
+
if (!loader) return null
|
|
197
|
+
try {
|
|
198
|
+
const mod = (await loader()) as SidecarModule
|
|
199
|
+
if (mod.default && typeof mod.default === "object") return mod.default
|
|
200
|
+
// Fallback: convention-named export (e.g. STYLING_FR)
|
|
201
|
+
const conventional = `${catalog.toUpperCase().replace(/-/g, "_")}_${locale.toUpperCase().replace(/-/g, "_")}`
|
|
202
|
+
const named = mod[conventional]
|
|
203
|
+
if (named && typeof named === "object") return named as LocaleCatalogMap
|
|
204
|
+
return null
|
|
205
|
+
} catch {
|
|
206
|
+
return null
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { LocaleCatalogMap } from "./types.js"
|
|
2
|
+
|
|
3
|
+
const map: LocaleCatalogMap = {
|
|
4
|
+
// -------------------- INSTRUMENTS: Drums --------------------
|
|
5
|
+
"drums": { label: "طبول", description: "طقم طبول صوتي" },
|
|
6
|
+
"drum-machine": { label: "آلة الطبول", description: "إيقاعات مبرمجة" },
|
|
7
|
+
"808": { description: "باس وطقم Roland TR-808" },
|
|
8
|
+
"live-drums": { label: "طبول حية", description: "طقم صوتي مسجل" },
|
|
9
|
+
"breakbeats": { label: "بريك بيتس", description: "حلقات طبول مأخوذة كعينات" },
|
|
10
|
+
"trap-drums": { label: "طبول تراب", description: "تتابعات هاي هات + 808" },
|
|
11
|
+
|
|
12
|
+
// -------------------- INSTRUMENTS: Percussion --------------------
|
|
13
|
+
"bongos": { label: "بونغو", description: "زوج من الطبول الكوبية الصغيرة" },
|
|
14
|
+
"conga": { label: "كونغا", description: "طبل عالٍ بوجه واحد" },
|
|
15
|
+
"djembe": { label: "جمبي", description: "طبل على شكل كأس من غرب أفريقيا" },
|
|
16
|
+
"timbales": { label: "تيمبالس", description: "طبول معدنية كوبية مزدوجة" },
|
|
17
|
+
"tambourine": { label: "دف", description: "صنوج تُهز باليد" },
|
|
18
|
+
"shaker": { label: "هزّاز", description: "خشخيشة معبأة" },
|
|
19
|
+
"cowbell": { label: "جرس البقرة", description: "جرس بقرة محمول باليد" },
|
|
20
|
+
"maracas": { label: "ماراكاس", description: "زوج هزازات لاتينية" },
|
|
21
|
+
"claves": { label: "كلاڤيس", description: "عصي خشبية" },
|
|
22
|
+
"marimba": { label: "ماريمبا", description: "لوحة مفاتيح بمطارق خشبية" },
|
|
23
|
+
"vibraphone": { label: "ڤيبرافون", description: "مطرقة برنان كهربائي" },
|
|
24
|
+
"xylophone": { label: "إكسيلوفون", description: "مطرقة خشبية، صوت ساطع" },
|
|
25
|
+
"glockenspiel": { label: "غلوكنشپيل", description: "أجراس مطرقة عالية النبرة" },
|
|
26
|
+
"timpani": { label: "تيمباني", description: "طبل أوركسترالي كبير" },
|
|
27
|
+
"taiko": { label: "تايكو", description: "طبل فرقة ياباني" },
|
|
28
|
+
"frame-drum": { label: "طبل إطاري", description: "طبل دائري ضحل" },
|
|
29
|
+
"cajon": { label: "كاخون", description: "طبل بيروفي على شكل صندوق" },
|
|
30
|
+
"darbuka": { label: "دربوكة", description: "طبل كأسي من الشرق الأوسط" },
|
|
31
|
+
|
|
32
|
+
// -------------------- INSTRUMENTS: Keys --------------------
|
|
33
|
+
"piano": { label: "بيانو", description: "بيانو كبير أو قائم صوتي" },
|
|
34
|
+
"electric-piano": { label: "بيانو كهربائي", description: "بأسلوب Rhodes / Wurlitzer" },
|
|
35
|
+
"wurlitzer": { description: "بيانو كهربائي Wurlitzer كلاسيكي" },
|
|
36
|
+
"rhodes": { description: "بيانو كهربائي Rhodes كلاسيكي" },
|
|
37
|
+
"clavinet": { label: "كلاڤينيت", description: "Hohner D6 فانكي" },
|
|
38
|
+
"organ": { label: "أرغن", description: "Hammond أو أرغن أنابيب" },
|
|
39
|
+
"hammond-organ": { description: "أرغن B3 سول / روك" },
|
|
40
|
+
"pipe-organ": { label: "أرغن الأنابيب", description: "كاتدرائية / كنيسة" },
|
|
41
|
+
"accordion": { label: "أكورديون", description: "قصبات يحركها منفاخ" },
|
|
42
|
+
"mellotron": { label: "ميلوترون", description: "لوحة مفاتيح بحلقات شريط" },
|
|
43
|
+
"harpsichord": { label: "هاربسيكورد", description: "لوحة مفاتيح بأوتار منقورة" },
|
|
44
|
+
"celesta": { label: "سيليستا", description: "لوحة مفاتيح بصوت أجراس" },
|
|
45
|
+
|
|
46
|
+
// -------------------- INSTRUMENTS: Synth --------------------
|
|
47
|
+
"synthesizer": { label: "مؤلف توليفي", description: "مؤلف تناظري أو رقمي" },
|
|
48
|
+
"lead-synth": { label: "سينث رئيسي", description: "سينث لحني حاد" },
|
|
49
|
+
"pluck-synth": { label: "سينث منقور", description: "نغمة قصيرة منقورة" },
|
|
50
|
+
"pads": { label: "وسائد سينث", description: "نسيج سينث ممتد" },
|
|
51
|
+
"arpeggiator": { label: "أربيجياتور", description: "أنماط أربيجيو متسلسلة" },
|
|
52
|
+
"vocoder": { description: "سينث معدّل بالصوت" },
|
|
53
|
+
"talkbox": { description: "سينث مشكّل بالفم" },
|
|
54
|
+
"modular-synth": { label: "موديولاري", description: "سينث تناظري قابل للتوصيل" },
|
|
55
|
+
"fm-synth": { label: "سينث FM", description: "سينث تعديل التردد" },
|
|
56
|
+
"wavetable-synth": { label: "ويڤتيبل", description: "سينث مسح جدول الموجات" },
|
|
57
|
+
"stab-synth": { label: "ستاب", description: "وتر قصير إيقاعي" },
|
|
58
|
+
|
|
59
|
+
// -------------------- INSTRUMENTS: Guitar --------------------
|
|
60
|
+
"acoustic-guitar": { label: "جيتار صوتي", description: "أوتار فولاذية أو نايلون" },
|
|
61
|
+
"electric-guitar": { label: "جيتار كهربائي", description: "جسم صلب، غالباً مشوّه" },
|
|
62
|
+
"classical-guitar": { label: "جيتار كلاسيكي", description: "أوتار نايلون، نقر بالأصابع" },
|
|
63
|
+
"12-string-guitar": { label: "جيتار 12 وتراً", description: "ضرب بأوتار مزدوجة" },
|
|
64
|
+
"pedal-steel": { label: "بيدال ستيل", description: "ستيل انزلاقي ريفي" },
|
|
65
|
+
"lap-steel": { label: "لاب ستيل", description: "ستيل هاواي على الحجر" },
|
|
66
|
+
"dobro": { label: "دوبرو", description: "جيتار رنّان" },
|
|
67
|
+
"banjo": { label: "بانجو", description: "5 أوتار أو تينور" },
|
|
68
|
+
"mandolin": { label: "ماندولين", description: "فولك / بلوغراس" },
|
|
69
|
+
"ukulele": { label: "يوكوليلي", description: "يوكوليلي سوبرانو-تينور" },
|
|
70
|
+
|
|
71
|
+
// -------------------- INSTRUMENTS: Bass --------------------
|
|
72
|
+
"bass-guitar": { label: "جيتار باس", description: "باس كهربائي منخفض النبرة" },
|
|
73
|
+
"synth-bass": { label: "باس سينث", description: "ترددات منخفضة مولّفة" },
|
|
74
|
+
"sub-bass": { label: "ساب باس", description: "ترددات ساب جيبية عميقة" },
|
|
75
|
+
"acoustic-bass": { label: "باس صوتي", description: "جيتار باس صوتي" },
|
|
76
|
+
"upright-bass": { label: "كونترباص قائم", description: "كونترباص، أسلوب جاز" },
|
|
77
|
+
"fretless-bass": { label: "باس بدون عتبات", description: "جيتار باس انزلاقي" },
|
|
78
|
+
"acid-bass": { label: "باس أسيد", description: "TB-303 squelch" },
|
|
79
|
+
"wobble-bass": { label: "باس ووبل", description: "دبستب معدّل بـ LFO" },
|
|
80
|
+
"reese-bass": { label: "باس Reese", description: "دروم آند باس مفكوك التوليف" },
|
|
81
|
+
|
|
82
|
+
// -------------------- INSTRUMENTS: Brass --------------------
|
|
83
|
+
"brass": { label: "قسم النحاسيات", description: "بوق، ترومبون، إلخ" },
|
|
84
|
+
"trumpet": { label: "بوق", description: "بوق منفرد" },
|
|
85
|
+
"trombone": { label: "ترومبون", description: "ترومبون منفرد" },
|
|
86
|
+
"french-horn": { label: "بوق فرنسي", description: "نحاس ناعم" },
|
|
87
|
+
"tuba": { label: "توبا", description: "أدنى النحاسيات نبرة" },
|
|
88
|
+
"saxophone": { label: "ساكسوفون", description: "ساكسوفون منفرد أو في قسم" },
|
|
89
|
+
"flugelhorn": { label: "فلوغلهورن", description: "ابن عم البوق الناعم" },
|
|
90
|
+
"cornet": { label: "كورنيت", description: "كورنيت فرقة نحاسية" },
|
|
91
|
+
"muted-trumpet": { label: "بوق مكتوم", description: "بوق جاز مكتوم" },
|
|
92
|
+
|
|
93
|
+
// -------------------- INSTRUMENTS: Woodwinds --------------------
|
|
94
|
+
"flute": { label: "فلوت", description: "فلوت حفلات" },
|
|
95
|
+
"clarinet": { label: "كلارينت", description: "كلارينت منفرد" },
|
|
96
|
+
"harmonica": { label: "هارمونيكا", description: "هارمونيكا بلوز" },
|
|
97
|
+
"oboe": { label: "أوبوا", description: "تحركه قصبة، حزين" },
|
|
98
|
+
"bassoon": { label: "باسون", description: "قصبة مزدوجة منخفضة" },
|
|
99
|
+
"english-horn": { label: "بوق إنجليزي", description: "أوبوا تينور" },
|
|
100
|
+
"piccolo": { label: "بيكولو", description: "فلوت عالي النبرة" },
|
|
101
|
+
"recorder": { label: "ريكوردر", description: "آلة نفخ خشبية ناعمة الصوت" },
|
|
102
|
+
"pan-flute": { label: "فلوت بان", description: "فلوت أنابيب من الأنديز" },
|
|
103
|
+
|
|
104
|
+
// -------------------- INSTRUMENTS: Strings --------------------
|
|
105
|
+
"strings": { label: "قسم الأوتار", description: "قسم أوتار أوركسترالي" },
|
|
106
|
+
"violin": { label: "كمان", description: "كمان منفرد" },
|
|
107
|
+
"viola": { label: "ڤيولا", description: "ڤيولا منفردة" },
|
|
108
|
+
"cello": { label: "تشيلو", description: "تشيلو منفرد" },
|
|
109
|
+
"double-bass": { label: "كونترباص", description: "كونترباص أوركسترالي" },
|
|
110
|
+
"harp": { label: "قيثارة", description: "قيثارة حفلات أو فولك" },
|
|
111
|
+
"pizzicato-strings": { label: "بيتزيكاتو", description: "أوتار منقورة" },
|
|
112
|
+
"staccato-strings": { label: "ستاكاتو", description: "أوتار قصيرة وقوية" },
|
|
113
|
+
"fiddle": { label: "كمان فولك", description: "كمان بأسلوب فولك" },
|
|
114
|
+
|
|
115
|
+
// -------------------- INSTRUMENTS: World --------------------
|
|
116
|
+
"sitar": { label: "سيتار", description: "آلة هندية ذات رقبة طويلة" },
|
|
117
|
+
"tabla": { label: "تابلا", description: "طبول يدوية هندية" },
|
|
118
|
+
"steel-drum": { label: "طبل فولاذي", description: "ستيل بان من ترينيداد" },
|
|
119
|
+
"kalimba": { label: "كاليمبا", description: "بيانو الإبهام الأفريقي" },
|
|
120
|
+
"bagpipes": { label: "مزمار القربة", description: "مزمار القربة الاسكتلندي" },
|
|
121
|
+
"didgeridoo": { label: "ديدجريدو", description: "آلة نفخ أسترالية" },
|
|
122
|
+
"oud": { label: "عود", description: "عود شرق أوسطي" },
|
|
123
|
+
"erhu": { label: "إرهو", description: "كمان صيني ذو وترين" },
|
|
124
|
+
"koto": { label: "كوتو", description: "قانون ياباني" },
|
|
125
|
+
"shakuhachi": { label: "شاكوهاتشي", description: "فلوت ياباني ينفخ من الطرف" },
|
|
126
|
+
"shamisen": { label: "شاميسن", description: "عود ياباني ذو 3 أوتار" },
|
|
127
|
+
"duduk": { label: "دودوك", description: "قصبة مزدوجة أرمنية" },
|
|
128
|
+
"balalaika": { label: "بالالايكا", description: "عود روسي مثلث" },
|
|
129
|
+
"bouzouki": { label: "بوزوكي", description: "عود يوناني طويل العنق" },
|
|
130
|
+
"kora": { label: "كورا", description: "آلة 21 وتراً من غرب أفريقيا" },
|
|
131
|
+
"hang-drum": { label: "طبل هانغ", description: "هاندبان فولاذي" },
|
|
132
|
+
|
|
133
|
+
// -------------------- INSTRUMENTS: Middle Eastern --------------------
|
|
134
|
+
"kamancheh": { label: "كمنجة", description: "آلة وترية فارسية ذات قوس وسنّ" },
|
|
135
|
+
"ney": { label: "ناي", description: "ناي قصبي يُنفخ من الطرف (فارسي/عربي)" },
|
|
136
|
+
"santur": { label: "سنطور", description: "آلة وترية فارسية تُعزف بالمطارق" },
|
|
137
|
+
|
|
138
|
+
// -------------------- PRODUCTION_STYLES --------------------
|
|
139
|
+
"polished": { label: "مصقولة", description: "إنتاج نقي وسائد" },
|
|
140
|
+
"lo-fi": { description: "هسهسة شريط دافئة، غير مثالية" },
|
|
141
|
+
"raw": { label: "خام", description: "بدون فلترة، إحساس مباشر" },
|
|
142
|
+
"vintage": { label: "كلاسيكي", description: "دفء تناظري" },
|
|
143
|
+
"modern": { label: "حديث", description: "رقمي معاصر" },
|
|
144
|
+
"minimalist": { label: "بساطة", description: "متناثر، مقيّد" },
|
|
145
|
+
"wall-of-sound": { label: "جدار الصوت", description: "كثيف، متعدد الطبقات" },
|
|
146
|
+
"ambient": { label: "أمبيانت", description: "جو، مع تردد صدى" },
|
|
147
|
+
"garage-band": { label: "فرقة الكراج", description: "DIY، مسجل في القبو" },
|
|
148
|
+
"live-recording": { label: "حي", description: "صوت حفل / غرفة" },
|
|
149
|
+
"demo-quality": { label: "ديمو", description: "جمالية ديمو خام" },
|
|
150
|
+
"studio-pristine": { label: "استوديو نقي", description: "جودة مرجعية هاي فاي" },
|
|
151
|
+
"tape-saturated": { label: "شريط مشبع", description: "دفء شريط تناظري + تشغيل" },
|
|
152
|
+
"8-bit-retro": { label: "8-bit ريترو", description: "صوت ألعاب ريترو منخفض المعدل" },
|
|
153
|
+
|
|
154
|
+
// -------------------- VOCAL_PRESENCE --------------------
|
|
155
|
+
"instrumental": { label: "آلي", description: "بدون غناء (حصري)" },
|
|
156
|
+
"male-lead": { label: "غناء رجالي رئيسي", description: "غناء رجالي رئيسي" },
|
|
157
|
+
"female-lead": { label: "غناء نسائي رئيسي", description: "غناء نسائي رئيسي" },
|
|
158
|
+
"androgynous-lead": { label: "محايد جنسياً", description: "غناء رئيسي محايد جنسياً" },
|
|
159
|
+
"duet": { label: "ثنائي", description: "مغنيان رئيسيان" },
|
|
160
|
+
"choir": { label: "جوقة", description: "غناء جوقة / مجموعة" },
|
|
161
|
+
"gospel-choir": { label: "جوقة غوسبل", description: "جوقة دعم بأسلوب غوسبل" },
|
|
162
|
+
"harmony-stack": { label: "تكديس الهارمونيات", description: "هارمونيات صوتية مكدسة" },
|
|
163
|
+
"rapper-lead": { label: "مؤدي راب", description: "راب رئيسي" },
|
|
164
|
+
"spoken-word": { label: "كلمة منطوقة", description: "إلقاء / شعر فوق الموسيقى" },
|
|
165
|
+
"vocal-chops": { label: "قطع صوتية", description: "أصوات مأخوذة كعينات ومقطعة" },
|
|
166
|
+
"mixed": { label: "مختلط", description: "عدة مغنين رئيسيين" },
|
|
167
|
+
|
|
168
|
+
// -------------------- SINGING_STYLES --------------------
|
|
169
|
+
"pop-singing": { description: "أسلوب رئيسي سائد" },
|
|
170
|
+
"rock-singing": { description: "أداء صوتي بأسلوب الروك" },
|
|
171
|
+
"operatic": { label: "أوبرالي", description: "تقنية أوبرا كلاسيكية" },
|
|
172
|
+
"classical-vocals": { label: "كلاسيكي", description: "صوت كلاسيكي مدرّب" },
|
|
173
|
+
"rap": { label: "راب", description: "أداء منطوق إيقاعي" },
|
|
174
|
+
"trap-melodic": { label: "تراب (لحني)", description: "تراب لحني مع أوتو تيون" },
|
|
175
|
+
"growl": { label: "غراول", description: "غراول بأسلوب ديث ميتال" },
|
|
176
|
+
"scream": { label: "صراخ", description: "هاردكور / مصروخ" },
|
|
177
|
+
"shout": { label: "نداء", description: "نداء بانك / مرتل" },
|
|
178
|
+
"falsetto": { label: "فالسيتو", description: "نطاق عالٍ، خفيف" },
|
|
179
|
+
"head-voice": { label: "صوت الرأس", description: "نطاق عالٍ رنّان" },
|
|
180
|
+
"chest-voice": { label: "صوت الصدر", description: "نطاق منخفض قوي" },
|
|
181
|
+
"belting": { label: "بلتنغ", description: "نغمات عالية قوية ممتدة" },
|
|
182
|
+
"crooning": { label: "كرونينغ", description: "رومانسي كلاسيكي ناعم" },
|
|
183
|
+
"scat": { label: "سكات", description: "مقاطع جاز مرتجلة" },
|
|
184
|
+
"yodeling": { label: "يودلينغ", description: "تحول النطاق الألبي" },
|
|
185
|
+
"throat-singing": { label: "غناء الحلق", description: "نغمات إضافية منغولية / توڤانية" },
|
|
186
|
+
"melismatic": { label: "ميليسماتي", description: "جريات متعددة النغمات لكل مقطع" },
|
|
187
|
+
"autotuned": { label: "مضبوط بالأوتو تيون", description: "غناء مصحح الطبقة، معالج" },
|
|
188
|
+
"vocoded": { label: "معالج بالڤوكودر", description: "أصوات معالجة بالڤوكودر" },
|
|
189
|
+
"whisper-singing": { label: "غناء همسي", description: "غناء هادئ وحميمي" },
|
|
190
|
+
"breathy-singing": { label: "نَفَسي", description: "غناء هوائي حميمي" },
|
|
191
|
+
"harmonized": { label: "متناغم", description: "هارمونيات متعددة الأصوات" },
|
|
192
|
+
"chant": { label: "ترتيل", description: "ترتيل ليتورجي / رهباني" },
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export default map
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { LocaleCatalogMap } from "./types.js"
|
|
2
|
+
|
|
3
|
+
const map: LocaleCatalogMap = {
|
|
4
|
+
// -------------------- INSTRUMENTS: Drums --------------------
|
|
5
|
+
"drums": { label: "Schlagzeug", description: "Akustisches Schlagzeug" },
|
|
6
|
+
"drum-machine": { label: "Drumcomputer", description: "Programmierte Beats" },
|
|
7
|
+
"808": { description: "Roland TR-808 Bass + Kit" },
|
|
8
|
+
"live-drums": { label: "Live-Schlagzeug", description: "Aufgenommenes akustisches Kit" },
|
|
9
|
+
"breakbeats": { description: "Gesampelte Drum-Loops" },
|
|
10
|
+
"trap-drums": { label: "Trap-Drums", description: "Hi-Hat-Rolls + 808" },
|
|
11
|
+
|
|
12
|
+
// -------------------- INSTRUMENTS: Percussion --------------------
|
|
13
|
+
"bongos": { description: "Paar kleine kubanische Trommeln" },
|
|
14
|
+
"conga": { description: "Hohe einfellige Trommel" },
|
|
15
|
+
"djembe": { label: "Djembé", description: "Becherförmige westafrikanische Trommel" },
|
|
16
|
+
"timbales": { description: "Kubanisches Metalltrommel-Paar" },
|
|
17
|
+
"tambourine": { label: "Tamburin", description: "Mit der Hand geschüttelte Schellen" },
|
|
18
|
+
"shaker": { description: "Gefüllte Rassel" },
|
|
19
|
+
"cowbell": { label: "Kuhglocke", description: "Handgehaltene Kuhglocke" },
|
|
20
|
+
"maracas": { description: "Lateinamerikanisches Shaker-Paar" },
|
|
21
|
+
"claves": { description: "Holzstäbe" },
|
|
22
|
+
"marimba": { description: "Holzschlägel-Tastatur" },
|
|
23
|
+
"vibraphone": { label: "Vibraphon", description: "Schlägel mit elektrischem Resonator" },
|
|
24
|
+
"xylophone": { label: "Xylophon", description: "Holzschlägel, hell" },
|
|
25
|
+
"glockenspiel": { description: "Hohe Schlägelglocken" },
|
|
26
|
+
"timpani": { label: "Pauken", description: "Große Orchesterpauke" },
|
|
27
|
+
"taiko": { description: "Japanische Ensemble-Trommel" },
|
|
28
|
+
"frame-drum": { label: "Rahmentrommel", description: "Flache runde Trommel" },
|
|
29
|
+
"cajon": { label: "Cajón", description: "Boxförmige peruanische Trommel" },
|
|
30
|
+
"darbuka": { label: "Darbuka", description: "Nahöstliche Kelchtrommel" },
|
|
31
|
+
|
|
32
|
+
// -------------------- INSTRUMENTS: Keys --------------------
|
|
33
|
+
"piano": { label: "Klavier", description: "Akustischer Flügel oder Pianino" },
|
|
34
|
+
"electric-piano": { label: "E-Piano", description: "Rhodes-/Wurlitzer-Stil" },
|
|
35
|
+
"wurlitzer": { description: "Vintage Wurlitzer E-Piano" },
|
|
36
|
+
"rhodes": { description: "Vintage Rhodes E-Piano" },
|
|
37
|
+
"clavinet": { description: "Funky Hohner D6" },
|
|
38
|
+
"organ": { label: "Orgel", description: "Hammond oder Pfeifenorgel" },
|
|
39
|
+
"hammond-organ": { description: "Soul/Rock B3-Orgel" },
|
|
40
|
+
"pipe-organ": { label: "Pfeifenorgel", description: "Kathedrale / Kirche" },
|
|
41
|
+
"accordion": { label: "Akkordeon", description: "Balgbetriebenes Rohrblatt" },
|
|
42
|
+
"mellotron": { description: "Tape-Loop-Tastatur" },
|
|
43
|
+
"harpsichord": { label: "Cembalo", description: "Tastatur mit gezupften Saiten" },
|
|
44
|
+
"celesta": { description: "Glockenähnliche Tastatur" },
|
|
45
|
+
|
|
46
|
+
// -------------------- INSTRUMENTS: Synth --------------------
|
|
47
|
+
"synthesizer": { description: "Analoger oder digitaler Synth" },
|
|
48
|
+
"lead-synth": { label: "Lead-Synth", description: "Schneidender melodischer Synth" },
|
|
49
|
+
"pluck-synth": { label: "Pluck-Synth", description: "Kurze, gezupfte Klangfarbe" },
|
|
50
|
+
"pads": { label: "Synth-Pads", description: "Gehaltene Synth-Texturen" },
|
|
51
|
+
"arpeggiator": { description: "Sequenzierte Arp-Pattern" },
|
|
52
|
+
"vocoder": { description: "Stimmmodulierter Synth" },
|
|
53
|
+
"talkbox": { description: "Mundgeformter Synth" },
|
|
54
|
+
"modular-synth": { label: "Modular", description: "Patchbarer Analog-Synth" },
|
|
55
|
+
"fm-synth": { description: "Frequenzmodulations-Synth" },
|
|
56
|
+
"wavetable-synth": { label: "Wavetable", description: "Wavetable-Scanning-Synth" },
|
|
57
|
+
"stab-synth": { label: "Stab", description: "Kurzer, perkussiver Akkord" },
|
|
58
|
+
|
|
59
|
+
// -------------------- INSTRUMENTS: Guitar --------------------
|
|
60
|
+
"acoustic-guitar": { label: "Akustische Gitarre", description: "Stahl- oder Nylonsaiten" },
|
|
61
|
+
"electric-guitar": { label: "E-Gitarre", description: "Solid-Body, oft verzerrt" },
|
|
62
|
+
"classical-guitar": { label: "Klassische Gitarre", description: "Nylonsaiten, Fingerstyle" },
|
|
63
|
+
"12-string-guitar": { label: "12-Saiten-Gitarre", description: "Doppelchörige Schlaggitarre" },
|
|
64
|
+
"pedal-steel": { description: "Country-Gleitsteel" },
|
|
65
|
+
"lap-steel": { description: "Hawaiianische Schoßsteel" },
|
|
66
|
+
"dobro": { description: "Resonator-Gitarre" },
|
|
67
|
+
"banjo": { description: "5-saitig oder Tenor" },
|
|
68
|
+
"mandolin": { label: "Mandoline", description: "Folk / Bluegrass" },
|
|
69
|
+
"ukulele": { description: "Sopran-Tenor-Uke" },
|
|
70
|
+
|
|
71
|
+
// -------------------- INSTRUMENTS: Bass --------------------
|
|
72
|
+
"bass-guitar": { label: "Bassgitarre", description: "Tieffrequenter E-Bass" },
|
|
73
|
+
"synth-bass": { label: "Synth-Bass", description: "Synthetisierte Tiefen" },
|
|
74
|
+
"sub-bass": { description: "Tiefe Sinus-Sub-Frequenzen" },
|
|
75
|
+
"acoustic-bass": { label: "Akustikbass", description: "Akustische Bassgitarre" },
|
|
76
|
+
"upright-bass": { label: "Kontrabass", description: "Kontrabass, Jazz-Stil" },
|
|
77
|
+
"fretless-bass": { description: "Bundlose, gleitende Bassgitarre" },
|
|
78
|
+
"acid-bass": { description: "TB-303-Squelch" },
|
|
79
|
+
"wobble-bass": { description: "LFO-modulierter Dubstep" },
|
|
80
|
+
"reese-bass": { description: "Verstimmter Drum-and-Bass" },
|
|
81
|
+
|
|
82
|
+
// -------------------- INSTRUMENTS: Brass --------------------
|
|
83
|
+
"brass": { label: "Bläsersatz", description: "Trompete, Posaune usw." },
|
|
84
|
+
"trumpet": { label: "Trompete", description: "Solo-Trompete" },
|
|
85
|
+
"trombone": { label: "Posaune", description: "Solo-Posaune" },
|
|
86
|
+
"french-horn": { label: "Waldhorn", description: "Weiche Blechbläser" },
|
|
87
|
+
"tuba": { description: "Tiefste Blechbläser" },
|
|
88
|
+
"saxophone": { label: "Saxophon", description: "Solo- oder Sektions-Sax" },
|
|
89
|
+
"flugelhorn": { label: "Flügelhorn", description: "Weicher Trompeten-Verwandter" },
|
|
90
|
+
"cornet": { label: "Kornett", description: "Brassband-Kornett" },
|
|
91
|
+
"muted-trumpet": { label: "Gedämpfte Trompete", description: "Gedämpfte Jazz-Trompete" },
|
|
92
|
+
|
|
93
|
+
// -------------------- INSTRUMENTS: Woodwinds --------------------
|
|
94
|
+
"flute": { label: "Flöte", description: "Konzertflöte" },
|
|
95
|
+
"clarinet": { label: "Klarinette", description: "Solo-Klarinette" },
|
|
96
|
+
"harmonica": { label: "Mundharmonika", description: "Blues-Harp" },
|
|
97
|
+
"oboe": { description: "Rohrblatt-getrieben, klagend" },
|
|
98
|
+
"bassoon": { label: "Fagott", description: "Tiefes Doppelrohrblatt" },
|
|
99
|
+
"english-horn": { label: "Englischhorn", description: "Tenor-Oboe" },
|
|
100
|
+
"piccolo": { label: "Piccoloflöte", description: "Hohe Flöte" },
|
|
101
|
+
"recorder": { label: "Blockflöte", description: "Weich klingendes Holzblasinstrument" },
|
|
102
|
+
"pan-flute": { label: "Panflöte", description: "Andine Pfeifenflöte" },
|
|
103
|
+
|
|
104
|
+
// -------------------- INSTRUMENTS: Strings --------------------
|
|
105
|
+
"strings": { label: "Streichersatz", description: "Orchestraler Streichersatz" },
|
|
106
|
+
"violin": { label: "Violine", description: "Solo-Violine" },
|
|
107
|
+
"viola": { label: "Bratsche", description: "Solo-Bratsche" },
|
|
108
|
+
"cello": { description: "Solo-Cello" },
|
|
109
|
+
"double-bass": { label: "Kontrabass", description: "Orchestraler Kontrabass" },
|
|
110
|
+
"harp": { label: "Harfe", description: "Konzert- oder Folk-Harfe" },
|
|
111
|
+
"pizzicato-strings": { label: "Pizzicato", description: "Gezupfte Streicher" },
|
|
112
|
+
"staccato-strings": { label: "Staccato", description: "Kurze, knackige Streicher" },
|
|
113
|
+
"fiddle": { label: "Fiedel", description: "Folk-Stil-Violine" },
|
|
114
|
+
|
|
115
|
+
// -------------------- INSTRUMENTS: World --------------------
|
|
116
|
+
"sitar": { description: "Indisches Instrument mit langem Hals" },
|
|
117
|
+
"tabla": { description: "Indische Handtrommeln" },
|
|
118
|
+
"steel-drum": { label: "Steeldrum", description: "Trinidadisches Steelpan" },
|
|
119
|
+
"kalimba": { description: "Afrikanisches Daumenklavier" },
|
|
120
|
+
"bagpipes": { label: "Dudelsack", description: "Schottischer Dudelsack" },
|
|
121
|
+
"didgeridoo": { description: "Australisches Blasinstrument" },
|
|
122
|
+
"oud": { description: "Nahöstliche Laute" },
|
|
123
|
+
"erhu": { description: "Chinesische 2-saitige Fiedel" },
|
|
124
|
+
"koto": { description: "Japanische Zither" },
|
|
125
|
+
"shakuhachi": { description: "Japanische Längsflöte" },
|
|
126
|
+
"shamisen": { description: "Japanische 3-saitige Laute" },
|
|
127
|
+
"duduk": { description: "Armenisches Doppelrohrblatt" },
|
|
128
|
+
"balalaika": { description: "Russische dreieckige Laute" },
|
|
129
|
+
"bouzouki": { description: "Griechische langhalsige Laute" },
|
|
130
|
+
"kora": { description: "Westafrikanisches 21-Saiten-Instrument" },
|
|
131
|
+
"hang-drum": { description: "Stahl-Handpan" },
|
|
132
|
+
|
|
133
|
+
// -------------------- INSTRUMENTS: Middle Eastern --------------------
|
|
134
|
+
"kamancheh": { description: "Persische Stachelgeige mit Bogen" },
|
|
135
|
+
"ney": { description: "Persisch/arabische endgeblasene Rohrflöte" },
|
|
136
|
+
"santur": { description: "Persisches Hackbrett" },
|
|
137
|
+
|
|
138
|
+
// -------------------- PRODUCTION_STYLES --------------------
|
|
139
|
+
"polished": { label: "Poliert", description: "Makellose, Mainstream-Produktion" },
|
|
140
|
+
"lo-fi": { description: "Warmes Bandrauschen, unvollkommen" },
|
|
141
|
+
"raw": { label: "Roh", description: "Ungefiltert, Live-Gefühl" },
|
|
142
|
+
"vintage": { description: "Analoge Wärme" },
|
|
143
|
+
"modern": { description: "Zeitgenössisch digital" },
|
|
144
|
+
"minimalist": { label: "Minimalistisch", description: "Sparsam, zurückhaltend" },
|
|
145
|
+
"wall-of-sound": { label: "Wall of Sound", description: "Dicht, geschichtet" },
|
|
146
|
+
"ambient": { description: "Atmosphärisch, hallig" },
|
|
147
|
+
"garage-band": { label: "Garagenband", description: "DIY, im Keller aufgenommen" },
|
|
148
|
+
"live-recording": { label: "Live", description: "Konzert-/Raumklang" },
|
|
149
|
+
"demo-quality": { label: "Demo", description: "Rohe Demo-Ästhetik" },
|
|
150
|
+
"studio-pristine": { label: "Studio-Brillanz", description: "Hi-Fi-Referenzqualität" },
|
|
151
|
+
"tape-saturated": { label: "Bandsättigung", description: "Analoge Bandwärme + Drive" },
|
|
152
|
+
"8-bit-retro": { description: "Niedrig aufgelöste Retro-Spielaudio" },
|
|
153
|
+
|
|
154
|
+
// -------------------- VOCAL_PRESENCE --------------------
|
|
155
|
+
"instrumental": { description: "Keine Vocals (exklusiv)" },
|
|
156
|
+
"male-lead": { label: "Männlicher Lead", description: "Männlicher Lead-Gesang" },
|
|
157
|
+
"female-lead": { label: "Weiblicher Lead", description: "Weiblicher Lead-Gesang" },
|
|
158
|
+
"androgynous-lead": { label: "Androgyn", description: "Geschlechtsneutraler Lead" },
|
|
159
|
+
"duet": { label: "Duett", description: "Zwei Lead-Sänger" },
|
|
160
|
+
"choir": { label: "Chor", description: "Chor- / Ensemblegesang" },
|
|
161
|
+
"gospel-choir": { label: "Gospelchor", description: "Gospel-Backing-Chor" },
|
|
162
|
+
"harmony-stack": { label: "Harmoniestapel", description: "Geschichtete Vocal-Harmonien" },
|
|
163
|
+
"rapper-lead": { label: "Rapper", description: "Rap-Lead" },
|
|
164
|
+
"spoken-word": { label: "Spoken Word", description: "Gesprochenes / Gedicht über Musik" },
|
|
165
|
+
"vocal-chops": { description: "Geschnittene Sample-Vocals" },
|
|
166
|
+
"mixed": { label: "Gemischt", description: "Mehrere Lead-Sänger" },
|
|
167
|
+
|
|
168
|
+
// -------------------- SINGING_STYLES --------------------
|
|
169
|
+
"pop-singing": { description: "Mainstream-Lead-Stil" },
|
|
170
|
+
"rock-singing": { description: "Rock-Stil-Gesangsdarbietung" },
|
|
171
|
+
"operatic": { label: "Opernhaft", description: "Klassische Operntechnik" },
|
|
172
|
+
"classical-vocals": { label: "Klassisch", description: "Geschulte klassische Stimme" },
|
|
173
|
+
"rap": { description: "Rhythmische gesprochene Darbietung" },
|
|
174
|
+
"trap-melodic": { label: "Trap (Melodisch)", description: "Melodischer Trap, autotune" },
|
|
175
|
+
"growl": { description: "Death-Metal-Style-Growl" },
|
|
176
|
+
"scream": { label: "Schrei", description: "Hardcore / geschrien" },
|
|
177
|
+
"shout": { label: "Ruf", description: "Punk- / Sprechgesang-Ruf" },
|
|
178
|
+
"falsetto": { label: "Falsett", description: "Hohe Lage, leicht" },
|
|
179
|
+
"head-voice": { label: "Kopfstimme", description: "Resonante hohe Lage" },
|
|
180
|
+
"chest-voice": { label: "Bruststimme", description: "Starke, tiefe Lage" },
|
|
181
|
+
"belting": { description: "Kraftvolle gehaltene Höhen" },
|
|
182
|
+
"crooning": { description: "Sanftes vintage-romantisches Singen" },
|
|
183
|
+
"scat": { label: "Scat-Gesang", description: "Improvisierte Jazz-Silben" },
|
|
184
|
+
"yodeling": { label: "Jodeln", description: "Alpiner Registerwechsel" },
|
|
185
|
+
"throat-singing": { label: "Kehlkopfgesang", description: "Mongolische / tuvinische Obertöne" },
|
|
186
|
+
"melismatic": { label: "Melismatisch", description: "Mehrtonläufe pro Silbe" },
|
|
187
|
+
"autotuned": { label: "Autogetuned", description: "Tonhöhenkorrigiert, bearbeitet" },
|
|
188
|
+
"vocoded": { label: "Vocodiert", description: "Vocoder-bearbeitete Vocals" },
|
|
189
|
+
"whisper-singing": { label: "Flüstergesang", description: "Gedämpftes, intimes Singen" },
|
|
190
|
+
"breathy-singing": { label: "Hauchig", description: "Luftiges, intimes Singen" },
|
|
191
|
+
"harmonized": { label: "Harmonisiert", description: "Mehrstimmige Harmonien" },
|
|
192
|
+
"chant": { label: "Choralgesang", description: "Liturgischer / Mönchsgesang" },
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export default map
|