diff --git a/frontend/src/components/RecipeDetailOverlay.vue b/frontend/src/components/RecipeDetailOverlay.vue
index e4b6afd..3958584 100644
--- a/frontend/src/components/RecipeDetailOverlay.vue
+++ b/frontend/src/components/RecipeDetailOverlay.vue
@@ -64,7 +64,7 @@
-
{{ getCardOilName(ing.oil) }}
- {{ ing.drops }} {{ cardLang === 'en' ? (ing.drops === 1 ? 'drop' : 'drops') : '滴' }}
+ {{ ing.drops }} {{ oilsStore.unitLabelPlural(ing.oil, ing.drops, cardLang) }}
{{ oilsStore.fmtPrice(oilsStore.pricePerDrop(ing.oil) * ing.drops) }}
{{ oilsStore.fmtPrice(retailPerDrop(ing.oil) * ing.drops) }}
diff --git a/frontend/src/stores/oils.js b/frontend/src/stores/oils.js
index b64f6a0..a7cd4fa 100644
--- a/frontend/src/stores/oils.js
+++ b/frontend/src/stores/oils.js
@@ -93,6 +93,21 @@ export const useOilsStore = defineStore('oils', () => {
delete oilsMeta.value[name]
}
+ function isPortionUnit(name) {
+ const meta = oilsMeta.value[name]
+ return meta && meta.dropCount === 1
+ }
+
+ function unitLabel(name, lang = 'zh') {
+ if (isPortionUnit(name)) return lang === 'en' ? 'portion' : '份'
+ return lang === 'en' ? 'drop' : '滴'
+ }
+
+ function unitLabelPlural(name, count, lang = 'zh') {
+ if (isPortionUnit(name)) return lang === 'en' ? (count === 1 ? 'portion' : 'portions') : '份'
+ return lang === 'en' ? (count === 1 ? 'drop' : 'drops') : '滴'
+ }
+
return {
oils,
oilsMeta,
@@ -105,5 +120,8 @@ export const useOilsStore = defineStore('oils', () => {
loadOils,
saveOil,
deleteOil,
+ isPortionUnit,
+ unitLabel,
+ unitLabelPlural,
}
})
diff --git a/frontend/src/views/Inventory.vue b/frontend/src/views/Inventory.vue
index 6cdecc3..2d71d29 100644
--- a/frontend/src/views/Inventory.vue
+++ b/frontend/src/views/Inventory.vue
@@ -76,7 +76,7 @@
class="match-ing"
:class="{ missing: !ownedSet.has(ing.oil) }"
>
- {{ ing.oil }} {{ ing.drops }}滴
+ {{ ing.oil }} {{ ing.drops }}{{ oils.unitLabel(ing.oil) }}