feat: implement centralized taxonomy for programmatic SEO

- Create taxonomy system with oils.json (5 oils) and concerns.json (9 concerns)
- Migrate 10 content files to new data/content/oil-for-concern/ structure
- Add scripts: generate-urls.js, validate-taxonomy.js, migrate-content.js
- Update dataLoader.ts to use centralized taxonomy
- Generate 40 URLs (10 pairs × 4 languages)
- Create sitemap-programmatic.xml for SEO
- Update by-oil and by-concern directory pages
This commit is contained in:
Unchained
2026-04-09 08:04:35 +02:00
parent 9d07a60d3f
commit 9ab07ab01d
25 changed files with 4618 additions and 117 deletions

273
data/taxonomy/concerns.json Normal file
View File

@@ -0,0 +1,273 @@
{
"schema": {
"version": "1.0.0",
"lastUpdated": "2026-04-09"
},
"concerns": {
"wrinkles": {
"id": "wrinkles",
"slug": {
"sr": "bore",
"en": "wrinkles",
"de": "falten",
"fr": "rides"
},
"name": {
"sr": "Bore",
"en": "Wrinkles",
"de": "Falten",
"fr": "Rides"
},
"namePlural": {
"sr": "Bore",
"en": "Wrinkles",
"de": "Falten",
"fr": "Rides"
},
"category": "anti-aging",
"description": {
"sr": "Fine linije i dublje bore usled smanjenja kolagena",
"en": "Fine lines and deep wrinkles due to collagen loss",
"de": "Feine Linien und tiefe Falten durch Kollagenverlust",
"fr": "Ridules et rides profondes dues à la perte de collagène"
},
"severityLevels": ["fine-lines", "moderate", "deep"],
"oils": ["argan-oil", "rosehip-oil"],
"keyIngredients": ["retinol", "vitamin-e", "peptides"],
"priority": 1
},
"dry-skin": {
"id": "dry-skin",
"slug": {
"sr": "suva-koza",
"en": "dry-skin",
"de": "trockene-haut",
"fr": "peau-seche"
},
"name": {
"sr": "Suva koža",
"en": "Dry Skin",
"de": "Trockene Haut",
"fr": "Peau sèche"
},
"category": "hydration",
"description": {
"sr": "Koža koja lack vlage, često osećaj zatezanja",
"en": "Skin lacking moisture, often feels tight",
"de": "Haut mit Feuchtigkeitsmangel, fühlt sich oft spannt an",
"fr": "Peau manquant d'hydratation, sensation de tiraillement"
},
"oils": ["argan-oil"],
"keyIngredients": ["hyaluronic-acid", "squalene", "ceramides"],
"priority": 2
},
"acne": {
"id": "acne",
"slug": {
"sr": "akne",
"en": "acne",
"de": "akne",
"fr": "acne"
},
"name": {
"sr": "Akne",
"en": "Acne",
"de": "Akne",
"fr": "Acné"
},
"category": "clarifying",
"description": {
"sr": "Zapaljenje folikula dlaka uzrokovan bakterijama i viškom sebuma",
"en": "Inflammation of hair follicles caused by bacteria and excess sebum",
"de": "Entzündung der Haarfollikel durch Bakterien und überschüssigen Talg",
"fr": "Inflammation des follicules pileux causée par des bactéries et excès de sébum"
},
"severityLevels": ["occasional", "moderate", "severe"],
"oils": ["jojoba-oil"],
"keyIngredients": ["tea-tree-oil", "salicylic-acid", "zinc"],
"priority": 3
},
"oily-skin": {
"id": "oily-skin",
"slug": {
"sr": "masna-koza",
"en": "oily-skin",
"de": "fettige-haut",
"fr": "peau-grasse"
},
"name": {
"sr": "Masna koža",
"en": "Oily Skin",
"de": "Fettige Haut",
"fr": "Peau grasse"
},
"category": "balancing",
"description": {
"sr": "Prekomerna proizvodnja sebuma koja dovodi do sjaja",
"en": "Excessive sebum production leading to shine",
"de": "Übermäßige Talgproduktion führt zu Glanz",
"fr": "Production excessive de sébum entraînant de la brillance"
},
"oils": ["jojoba-oil"],
"keyIngredients": ["niacinamide", "zinc", "clay"],
"priority": 4
},
"dark-spots": {
"id": "dark-spots",
"slug": {
"sr": "tamne-pjege",
"en": "dark-spots",
"de": "dunkle-flecken",
"fr": "taches-sombres"
},
"name": {
"sr": "Tamne pjege",
"en": "Dark Spots",
"de": "Dunkle Flecken",
"fr": "Taches sombres"
},
"category": "brightening",
"description": {
"sr": "Hiperpigmentacija uzrokovana suncem ili post-akne",
"en": "Hyperpigmentation caused by sun or post-acne",
"de": "Hyperpigmentierung durch Sonne oder Post-Akne",
"fr": "Hyperpigmentation causée par le soleil ou post-acné"
},
"oils": ["rosehip-oil"],
"keyIngredients": ["vitamin-c", "kojic-acid", "alpha-arbutin"],
"priority": 5
},
"hyperpigmentation": {
"id": "hyperpigmentation",
"slug": {
"sr": "hiperpigmentacija",
"en": "hyperpigmentation",
"de": "hyperpigmentierung",
"fr": "hyperpigmentation"
},
"name": {
"sr": "Hiperpigmentacija",
"en": "Hyperpigmentation",
"de": "Hyperpigmentierung",
"fr": "Hyperpigmentation"
},
"category": "brightening",
"description": {
"sr": "Tamne fleke na koži usled prekomernog melanina",
"en": "Dark patches on skin due to excess melanin",
"de": "Dunkle Hautflecken durch überschüssiges Melanin",
"fr": "Taches sombres sur la peau dues à un excès de mélanine"
},
"oils": ["sea-buckthorn-oil"],
"keyIngredients": ["vitamin-c", "tranexamic-acid"],
"priority": 6
},
"acne-scars": {
"id": "acne-scars",
"slug": {
"sr": "oziljci-od-akni",
"en": "acne-scars",
"de": "aknenarben",
"fr": "cicatrices-dacne"
},
"name": {
"sr": "Ožiljci od akni",
"en": "Acne Scars",
"de": "Aknenarben",
"fr": "Cicatrices d'acné"
},
"category": "healing",
"description": {
"sr": "Ožiljci nastali nakon zarastanja akni",
"en": "Scars formed after acne healing",
"de": "Narben, die sich nach der Akne-Heilung bilden",
"fr": "Cicatrices formées après la guérison de l'acné"
},
"scarTypes": ["atrophic", "hypertrophic", "post-inflammatory"],
"oils": ["rosehip-oil"],
"keyIngredients": ["vitamin-a", "centella-asiatica", "allantoin"],
"priority": 7
},
"under-eye-bags": {
"id": "under-eye-bags",
"slug": {
"sr": "podocnjaci",
"en": "under-eye-bags",
"de": "augenringe",
"fr": "cernes"
},
"name": {
"sr": "Podočnjaci",
"en": "Under-Eye Bags",
"de": "Augenringe",
"fr": "Cernes"
},
"category": "anti-aging",
"description": {
"sr": "Oticanje i tamni krugovi ispod očiju",
"en": "Puffiness and dark circles under eyes",
"de": "Schwellungen und Augenringe",
"fr": "Poches et cernes sous les yeux"
},
"oils": ["argan-oil"],
"keyIngredients": ["caffeine", "vitamin-k", "peptides"],
"priority": 8
},
"sensitive-skin": {
"id": "sensitive-skin",
"slug": {
"sr": "osetljiva-koza",
"en": "sensitive-skin",
"de": "empfindliche-haut",
"fr": "peau-sensible"
},
"name": {
"sr": "Osetljiva koža",
"en": "Sensitive Skin",
"de": "Empfindliche Haut",
"fr": "Peau sensible"
},
"category": "soothing",
"description": {
"sr": "Koža sklona crvenilu, svrabu i iritaciji",
"en": "Skin prone to redness, itching and irritation",
"de": "Haut neigt zu Rötungen, Juckreiz und Reizungen",
"fr": "Peau sujette aux rougeurs, démangeaisons et irritations"
},
"triggers": ["fragrance", "alcohol", "harsh-cleansers"],
"oils": ["sweet-almond-oil"],
"keyIngredients": ["panthenol", "allantoin", "chamomile"],
"priority": 9
}
},
"categories": {
"anti-aging": {
"name": { "sr": "Anti-aging", "en": "Anti-Aging", "de": "Anti-Aging", "fr": "Anti-âge" },
"priority": 1
},
"hydration": {
"name": { "sr": "Hidratacija", "en": "Hydration", "de": "Feuchtigkeit", "fr": "Hydratation" },
"priority": 2
},
"brightening": {
"name": { "sr": "Posvetljivanje", "en": "Brightening", "de": "Aufhellung", "fr": "Éclaircissement" },
"priority": 3
},
"balancing": {
"name": { "sr": "Balansiranje", "en": "Balancing", "de": "Balance", "fr": "Équilibrage" },
"priority": 4
},
"clarifying": {
"name": { "sr": "Čišćenje", "en": "Clarifying", "de": "Klärung", "fr": "Clarification" },
"priority": 5
},
"healing": {
"name": { "sr": "Lečenje", "en": "Healing", "de": "Heilung", "fr": "Guérison" },
"priority": 6
},
"soothing": {
"name": { "sr": "Umirujuće", "en": "Soothing", "de": "Beruhigung", "fr": "Apaisant" },
"priority": 7
}
}
}

160
data/taxonomy/oils.json Normal file
View File

@@ -0,0 +1,160 @@
{
"schema": {
"version": "1.0.0",
"lastUpdated": "2026-04-09"
},
"oils": {
"argan-oil": {
"id": "argan-oil",
"slug": {
"sr": "arganovo-ulje",
"en": "argan-oil",
"de": "arganoel",
"fr": "huile-dargan"
},
"name": {
"sr": "Arganovo ulje",
"en": "Argan Oil",
"de": "Arganöl",
"fr": "Huile d'argan"
},
"shortDescription": {
"sr": "Marokansko 'tečno zlato' bogato vitaminom E",
"en": "Moroccan 'liquid gold' rich in vitamin E",
"de": "Marokkanisches 'flüssiges Gold' reich an Vitamin E",
"fr": "'Or liquide' marocain riche en vitamine E"
},
"icon": "droplet",
"categories": ["anti-aging", "hydration"],
"skinTypes": ["dry", "mature", "normal"],
"concerns": ["wrinkles", "dry-skin", "under-eye-bags"],
"keyIngredients": ["vitamin-e", "omega-6", "omega-9", "squalene"],
"comedogenicRating": 0,
"absorptionRate": "medium",
"color": "golden-yellow",
"scent": "nutty-light"
},
"rosehip-oil": {
"id": "rosehip-oil",
"slug": {
"sr": "ulje-divlje-ruze",
"en": "rosehip-oil",
"de": "hagebuttenoel",
"fr": "huile-de-rose-musquee"
},
"name": {
"sr": "Ulje divlje ruže",
"en": "Rosehip Oil",
"de": "Hagebuttenöl",
"fr": "Huile de rose musquée"
},
"shortDescription": {
"sr": "Bogato vitaminom A i esencijalnim masnim kiselinama",
"en": "Rich in vitamin A and essential fatty acids",
"de": "Reich an Vitamin A und essenziellen Fettsäuren",
"fr": "Riche en vitamine A et acides gras essentiels"
},
"icon": "flower",
"categories": ["brightening", "regeneration", "anti-aging"],
"skinTypes": ["mature", "damaged", "uneven"],
"concerns": ["wrinkles", "dark-spots", "acne-scars"],
"keyIngredients": ["vitamin-a", "vitamin-c", "omega-3", "omega-6"],
"comedogenicRating": 1,
"absorptionRate": "fast",
"color": "orange-red",
"scent": "earthy"
},
"jojoba-oil": {
"id": "jojoba-oil",
"slug": {
"sr": "jojoba-ulje",
"en": "jojoba-oil",
"de": "jojobaoel",
"fr": "huile-de-jojoba"
},
"name": {
"sr": "Jojoba ulje",
"en": "Jojoba Oil",
"de": "Jojobaöl",
"fr": "Huile de jojoba"
},
"shortDescription": {
"sr": "Tečni vosak sličan ljudskom sebumu",
"en": "Liquid wax similar to human sebum",
"de": "Flüssiges Wachs ähnlich menschlichem Talg",
"fr": "Cire liquide similaire au sébum humain"
},
"icon": "leaf",
"categories": ["balancing", "clarifying"],
"skinTypes": ["oily", "acne-prone", "combination"],
"concerns": ["acne", "oily-skin"],
"keyIngredients": ["eicosenoic-acid", "erucic-acid", "oleic-acid"],
"comedogenicRating": 2,
"absorptionRate": "fast",
"color": "golden",
"scent": "neutral"
},
"sea-buckthorn-oil": {
"id": "sea-buckthorn-oil",
"slug": {
"sr": "ulje-pasjeg-trna",
"en": "sea-buckthorn-oil",
"de": "sanddornoel",
"fr": "huile-dargousier"
},
"name": {
"sr": "Ulje pasjeg trna",
"en": "Sea Buckthorn Oil",
"de": "Sanddornöl",
"fr": "Huile d'argousier"
},
"shortDescription": {
"sr": "Superfood za kožu sa 12x više vitamina C od narandže",
"en": "Superfood for skin with 12x more vitamin C than oranges",
"de": "Superfood für die Haut mit 12x mehr Vitamin C als Orangen",
"fr": "Super-aliment pour la peau avec 12x plus de vitamine C que les oranges"
},
"icon": "berry",
"categories": ["brightening", "healing"],
"skinTypes": ["damaged", "mature", "dull"],
"concerns": ["hyperpigmentation"],
"keyIngredients": ["vitamin-c", "vitamin-e", "beta-carotene", "omega-7"],
"comedogenicRating": 1,
"absorptionRate": "medium",
"color": "deep-orange",
"scent": "fruity"
},
"sweet-almond-oil": {
"id": "sweet-almond-oil",
"slug": {
"sr": "ulje-slatkog-badema",
"en": "sweet-almond-oil",
"de": "suessmandeloel",
"fr": "huile-damande-douce"
},
"name": {
"sr": "Ulje slatkog badema",
"en": "Sweet Almond Oil",
"de": "Süßmandelöl",
"fr": "Huile d'amande douce"
},
"shortDescription": {
"sr": "Blago i hranljivo, idealno za osetljivu kožu",
"en": "Gentle and nourishing, ideal for sensitive skin",
"de": "Sanft und nährend, ideal für empfindliche Haut",
"fr": "Doux et nourrissant, idéal pour les peaux sensibles"
},
"icon": "nut",
"categories": ["soothing", "nourishing"],
"skinTypes": ["sensitive", "dry", "baby"],
"concerns": ["sensitive-skin"],
"keyIngredients": ["vitamin-e", "zinc", "oleic-acid", "linoleic-acid"],
"comedogenicRating": 2,
"absorptionRate": "slow",
"color": "pale-yellow",
"scent": "sweet-nutty"
}
},
"locales": ["sr", "en", "de", "fr"],
"defaultLocale": "sr"
}