HookSpot

{{ $t("app.title") }}

LIFF

{{ $t("app.subtitle") }}

{{ $t("spots.title") }}

📍 {{ $t("spots.located") }} 📍 {{ $t("spots.defaultLocation") }}

📍

{{ $t("spots.empty") }}

🔍

{{ $t("spots.filterEmpty") }}

spot cover

{{ spot.name }}

★ {{ spot.rating_avg || '5.0' }}

{{ spot.location_text }}

{{ fish.emoji }} {{ fish.name }}
{{ spot.type === 'sea' ? $t('spots.sea') : spot.type === 'pond' ? $t('spots.pond') : $t('spots.fresh') }} {{ spot.is_free ? $t('detail.free') : (spot.entry_fee ? spot.entry_fee + ' ฿' : $t('detail.paid')) }} · {{ $t("spots.distance", { km: spot.distance_km }) }}

{{ (tideData && tideData.has_tide) ? $t("tides.title") : $t("tides.inlandTitle") }}

{{ $t("tides.station", { name: tideData.station_name }) }} {{ $t("tides.inlandBadge") }}
{{ $t("tides.loading") }}
{{ $t("tides.empty") }}

{{ $t("tides.chartTitle") }}

{{ evt.type === 'HIGH' ? $t('tides.highTide') : $t('tides.lowTide') }}

{{ evt.time.substring(11, 16) }}

{{ $t("tides.meter", { val: evt.water_level }) }}

🏞️

{{ $t("tides.inlandNoticeTitle") }}

{{ $t("tides.freshwater") }}

{{ $t("tides.inlandNoticeDesc", { km: tideData.distance_to_tide_km ? Math.round(tideData.distance_to_tide_km) : '50+' }) }}

{{ $t("tides.inlandKey1") }} ⏱ {{ $t("tides.inlandKey1Val") }}
{{ $t("tides.inlandKey2") }} 🌅 {{ $t("tides.inlandKey2Val") }}
{{ tideData.tide_data.best_window_info?.is_current ? '🔥' : '🌅' }}

{{ $t(tideData.tide_data.best_window_info?.label_key || 'tides.bestWindow') }}

{{ tideData.tide_data.best_window_info?.tag || 'PRIME' }}

{{ tideData.tide_data.best_window }}

{{ tideData.tide_data.best_window_info?.is_current ? $t("tides.windowHappening") : $t("tides.highActivity") }}
{{ $t("tides.fishingScoreTitle") }} {{ tideData.tide_data.fishing_label || 'Good' }}
{{ tideData.tide_data.fishing_score || 75 }} INDEX
{{ '★'.repeat(tideData.tide_data.fishing_stars || 4) + '☆'.repeat(Math.max(0, 5 - (tideData.tide_data.fishing_stars || 4))) }}
{{ $t("tides.weatherTitle") }} 🌦

{{ tideData.tide_data.weather.description || $t('tides.sunny') }}

{{ $t('tides.temperature') }} 🌡 {{ tideData.tide_data.weather.temp }}°
{{ $t('tides.windSpeed') }} 💨 {{ tideData.tide_data.weather.wind_speed }}k
⏱ {{ $t('tides.pressure') }} {{ tideData.tide_data.weather.pressure || 1012 }} hPa

{{ $t("tides.unlock7Days") }}

{{ $t("tides.unlockDesc") }}

{{ $t("catches.title") }}

{{ $t("catches.empty") }}
catch image ⚖️ {{ item.weight_kg }} kg

{{ item.emoji }} {{ item.fish_name }}

{{ item.description || $t('catches.noDescription') }}

angler avatar {{ item.angler_name }}
🎣

{{ $t("modal.title") }}

{{ $t("modal.subtitle") }}

{{ downloadModal.message }}

🌊

{{ $t("modal.featureTideTitle") }}

{{ $t("modal.featureTideDesc") }}

📍

{{ $t("modal.featureSpotTitle") }}

{{ $t("modal.featureSpotDesc") }}

📸

{{ $t("modal.featureCatchTitle") }}

{{ $t("modal.featureCatchDesc") }}

Android 9.0+ · {{ $t("modal.safeAndFree") }}

spot cover large
{{ selectedSpot.type === 'sea' ? $t('spots.sea') : selectedSpot.type === 'pond' ? $t('spots.pond') : $t('spots.fresh') }} ★ {{ selectedSpot.rating_avg || '5.0' }} ({{ $t('detail.reviews', { count: selectedSpot.rating_count || 12 }) }})

{{ selectedSpot.name }}

📍 {{ selectedSpot.location_text }} · {{ $t('spots.distance', { km: selectedSpot.distance_km }) }}

{{ $t("detail.feeTitle") }}

{{ selectedSpot.is_free ? $t('detail.free') : $t('detail.paid') }}

{{ selectedSpot.entry_fee || $t('detail.negotiable') }} THB

{{ $t("detail.fishTitle") }}

{{ fish.emoji }} {{ fish.name }} {{ $t("detail.noFish") }}
catch image large
angler avatar large

{{ selectedCatch.angler_name }}

{{ $t("detail.postedOn", { date: formatDate(selectedCatch.caught_at) }) }}

{{ selectedCatch.emoji }} {{ selectedCatch.fish_name }}

{{ $t("detail.weight") }}

{{ selectedCatch.weight_kg || '--' }} kg

{{ $t("detail.length") }}

{{ selectedCatch.length_cm || '--' }} cm

{{ $t("detail.tipsTitle") }}

{{ selectedCatch.description || $t('detail.noTips') }}