Files
oil-formula-calculator/frontend/src/composables/useOilTranslation.js
Hera Zhao 28ab51c437
All checks were successful
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 5s
Test / build-check (push) Successful in 3s
PR Preview / test (pull_request) Successful in 5s
PR Preview / deploy-preview (pull_request) Successful in 17s
Test / e2e-test (push) Successful in 53s
fix: RecipeIn加en_name字段修复共享500错误 + 前端配方名翻译
- RecipeIn 模型添加 en_name 字段,修复共享配方500错误
- recipeNameEn 使用关键词字典翻译,预览卡片英文名不再显示中文

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 13:51:36 +00:00

104 lines
5.0 KiB
JavaScript

// Oil English names map
const OIL_EN = {
'薰衣草': 'Lavender', '茶树': 'Tea Tree', '乳香': 'Frankincense',
'柠檬': 'Lemon', '椒样薄荷': 'Peppermint', '丝柏': 'Cypress',
'尤加利': 'Eucalyptus', '迷迭香': 'Rosemary', '天竺葵': 'Geranium',
'依兰依兰': 'Ylang Ylang', '佛手柑': 'Bergamot', '生姜': 'Ginger',
'没药': 'Myrrh', '檀香': 'Sandalwood', '雪松': 'Cedarwood',
'罗马洋甘菊': 'Roman Chamomile', '永久花': 'Helichrysum',
'快乐鼠尾草': 'Clary Sage', '广藿香': 'Patchouli',
'百里香': 'Thyme', '牛至': 'Oregano', '冬青': 'Wintergreen',
'肉桂': 'Cinnamon', '丁香': 'Clove', '黑胡椒': 'Black Pepper',
'葡萄柚': 'Grapefruit', '橙花': 'Neroli', '玫瑰': 'Rose',
'岩兰草': 'Vetiver', '马郁兰': 'Marjoram', '芫荽': 'Coriander',
'柠檬草': 'Lemongrass', '杜松浆果': 'Juniper Berry', '甜橙': 'Wild Orange',
'香茅': 'Citronella', '薄荷': 'Peppermint', '扁柏': 'Arborvitae',
'古巴香脂': 'Copaiba', '椰子油': 'Coconut Oil',
'芳香调理': 'AromaTouch', '保卫复方': 'On Guard', '保卫': 'On Guard',
'乐活复方': 'Balance', '乐活': 'DigestZen',
'舒缓复方': 'Past Tense', '舒缓': 'Deep Blue',
'净化复方': 'Purify', '净化清新': 'Purify',
'呼吸复方': 'Breathe', '顺畅呼吸': 'Breathe',
'舒压复方': 'Adaptiv', '安定情绪': 'Balance',
'安宁神气': 'Serenity', '多特瑞': 'doTERRA',
'野橘': 'Wild Orange', '柑橘清新': 'Citrus Bliss',
'新瑞活力': 'MetaPWR', '元气': 'Zendocrine',
'温柔呵护': 'ClaryCalm', '西洋蓍草': 'Yarrow|Pom',
'西班牙牛至': 'Oregano',
}
export function oilEn(name) {
if (OIL_EN[name]) return OIL_EN[name]
// Try without common suffixes
const base = name.replace(/复方$|呵护$/, '')
if (base !== name && OIL_EN[base]) return OIL_EN[base]
// Try adding suffixes
if (OIL_EN[name + '复方']) return OIL_EN[name + '复方']
return ''
}
const RECIPE_KEYWORDS = {
'头疗':'Scalp Therapy','头痛':'Headache','偏头痛':'Migraine','头皮':'Scalp','头发':'Hair',
'肩颈':'Neck & Shoulder','颈椎':'Cervical','肩':'Shoulder','腰椎':'Lumbar','腰':'Lower Back',
'关节':'Joint','膝':'Knee','背':'Back','胸':'Chest','腹部':'Abdominal',
'乳腺':'Breast','子宫':'Uterine','私密':'Intimate','卵巢':'Ovarian',
'淋巴':'Lymph','肝':'Liver','肾':'Kidney','脾':'Spleen','胃':'Stomach','肺':'Lung','肠':'Intestinal',
'酸痛':'Pain Relief','疼痛':'Pain Relief','止痛':'Pain Relief',
'感冒':'Cold','发烧':'Fever','咳嗽':'Cough','咽喉':'Throat',
'过敏':'Allergy','鼻炎':'Rhinitis','哮喘':'Asthma',
'湿疹':'Eczema','痘痘':'Acne','粉刺':'Acne',
'消炎':'Anti-Inflammatory','便秘':'Constipation','消化':'Digestion',
'失眠':'Insomnia','助眠':'Sleep Aid','好眠':'Sleep Well','安眠':'Sleep',
'焦虑':'Anxiety','抑郁':'Depression','情绪':'Emotional',
'压力':'Stress','放松':'Relaxation','舒缓':'Soothing',
'水肿':'Edema','痛经':'Menstrual Pain','月经':'Menstrual','更年期':'Menopause','荷尔蒙':'Hormone',
'结节':'Nodule','囊肿':'Cyst','灰指甲':'Nail Fungus','脚气':'Athlete\'s Foot',
'白发':'Gray Hair','脱发':'Hair Loss','生发':'Hair Growth',
'瘦身':'Slimming','紫外线':'UV','抗衰':'Anti-Aging','美白':'Whitening','补水':'Hydrating',
'排毒':'Detox','净化':'Purifying','驱蚊':'Mosquito Repellent',
'护理':'Care','调理':'Therapy','修复':'Repair','养护':'Nourish',
'按摩':'Massage','刮痧':'Gua Sha','泡脚':'Foot Soak','精油浴':'Oil Bath',
'喷雾':'Spray','扩香':'Diffuser',
'疏通':'Unblock','祛湿':'Dampness Relief','驱寒':'Warming','健脾':'Spleen Wellness',
'美容':'Beauty','面膜':'Face Mask','发膜':'Hair Mask',
'配方':'Blend','方':'Blend','包':'Blend',
'增强版':'Enhanced','高配版':'Premium','男士':'Men\'s','儿童':'Children\'s',
'呼吸系统':'Respiratory System','呼吸':'Respiratory','免疫':'Immunity',
'缓解':'Relief','改善':'Improve','预防':'Prevention',
'带脉':'Belt Meridian','经络':'Meridian','静脉曲张':'Varicose Veins',
'口腔溃疡':'Mouth Ulcer','口唇疱疹':'Cold Sore','蚊虫叮咬':'Insect Bite',
'暖宫':'Uterus Warming','调经':'Menstrual Regulation',
}
const _SORTED = Object.keys(RECIPE_KEYWORDS).sort((a, b) => b.length - a.length)
export function recipeNameEn(name) {
if (!name) return name
const parts = []
let i = 0
while (i < name.length) {
let matched = false
for (const key of _SORTED) {
if (name.substring(i, i + key.length) === key) {
const en = RECIPE_KEYWORDS[key]
if (!parts.includes(en)) parts.push(en)
i += key.length
matched = true
break
}
}
if (!matched) i++
}
return parts.length ? parts.join(' ') : name
}
// Custom translations (can be set by admin)
const customTranslations = {}
export function setCustomTranslation(zhName, enName) {
customTranslations[zhName] = enName
}
export function getCustomTranslation(zhName) {
return customTranslations[zhName]
}