Revert homepage

This commit is contained in:
Andras Schmelczer 2026-05-16 20:25:53 +01:00
parent 48c13fbcdd
commit 47d89f6fad
9 changed files with 343 additions and 289 deletions

View file

@ -448,16 +448,26 @@ export function useMapData({
]); ]);
// Use drag data only when it matches the current view feature and request key. // Use drag data only when it matches the current view feature and request key.
// The first render of a new drag must not reuse the previous drag's preview range.
const dragJustStarted =
Boolean(activeFeature) &&
(previousDragStateRef.current.activeFeature !== activeFeature ||
previousDragStateRef.current.filterStateKey !== filterStateKey);
const hasMatchingDragData = const hasMatchingDragData =
!dragJustStarted &&
Boolean(activeFeature && viewFeature && activeDragRequest) && Boolean(activeFeature && viewFeature && activeDragRequest) &&
dragFeatureRef.current === viewFeature && dragFeatureRef.current === viewFeature &&
dragDataKey === activeDragRequest?.requestKey; dragDataKey === activeDragRequest?.requestKey;
const hasCurrentRangeData = activeFeature
? hasMatchingDragData
: loadedDataKey === dataRequestKey;
const data = (hasMatchingDragData ? dragHexData : null) ?? rawData; const data = (hasMatchingDragData ? dragHexData : null) ?? rawData;
const effectivePostcodeData = (hasMatchingDragData ? dragPostcodeData : null) ?? postcodeData; const effectivePostcodeData = (hasMatchingDragData ? dragPostcodeData : null) ?? postcodeData;
// Compute p5/p95 from the data currently being drawn. During slider drags // Compute p5/p95 from the data currently being drawn. During slider drags
// this uses the drag-preview data so the colour scale resets to that preview. // this uses the drag-preview data so the colour scale resets to that preview.
const dataRange = useMemo((): [number, number] | null => { const dataRange = useMemo((): [number, number] | null => {
if (!hasCurrentRangeData) return null;
if (!dataViewFeature) return null; if (!dataViewFeature) return null;
const isTravelTime = dataViewFeature.startsWith('tt_'); const isTravelTime = dataViewFeature.startsWith('tt_');
@ -499,7 +509,15 @@ export function useMapData({
percentile(vals, COLOR_RANGE_LOW_PERCENTILE), percentile(vals, COLOR_RANGE_LOW_PERCENTILE),
percentile(vals, COLOR_RANGE_HIGH_PERCENTILE), percentile(vals, COLOR_RANGE_HIGH_PERCENTILE),
]; ];
}, [dataViewFeature, data, effectivePostcodeData, usePostcodeView, features, bounds]); }, [
bounds,
data,
dataViewFeature,
effectivePostcodeData,
features,
hasCurrentRangeData,
usePostcodeView,
]);
// Live color range for the legend and hex coloring. // Live color range for the legend and hex coloring.
const liveColorRange = useMemo((): [number, number] | null => { const liveColorRange = useMemo((): [number, number] | null => {
@ -516,19 +534,11 @@ export function useMapData({
return [0, meta.values.length - 1]; return [0, meta.values.length - 1];
} }
if (dataRange) return dataRange; if (dataRange) return dataRange;
if (activeFeature && !hasMatchingDragData) return null; if (activeFeature) return null;
if (loadedDataKey !== dataRequestKey) return null; if (loadedDataKey !== dataRequestKey) return null;
if (meta.min != null && meta.max != null) return [meta.min, meta.max]; if (meta.min != null && meta.max != null) return [meta.min, meta.max];
return null; return null;
}, [ }, [activeFeature, dataRequestKey, dataRange, dataViewFeature, features, loadedDataKey]);
activeFeature,
dataRequestKey,
dataRange,
dataViewFeature,
features,
hasMatchingDragData,
loadedDataKey,
]);
const isEyePreviewingPinnedFeature = const isEyePreviewingPinnedFeature =
!activeFeature && dataViewFeature != null && dataViewFeature === pinnedDataViewFeature; !activeFeature && dataViewFeature != null && dataViewFeature === pinnedDataViewFeature;

View file

@ -901,18 +901,18 @@ const de: Translations = {
// ── Home Page ────────────────────────────────────── // ── Home Page ──────────────────────────────────────
home: { home: {
heroEyebrow: 'Finden Sie zuerst, wo Sie suchen sollten', heroEyebrow: 'Für Käufer, die fragen: „Wo soll ich überhaupt suchen?“',
heroTitle1: 'Suchen Sie nicht länger', heroTitle1: 'Finden Sie die Postleitzahlen',
heroTitle2: 'an den falschen Orten', heroTitle2: 'die zu Ihrem Leben passen',
heroTitle3: 'Bevor Inserate Ihre Suche verengen.', heroTitle3: 'Nicht nur die Gegenden, die Sie schon kennen.',
heroSubtitle: heroSubtitle:
'Finden Sie Postleitzahlen, bei denen Budget, Pendelweg und Alltag zusammenpassen.', 'Von Londoner Stadtteilen über Pendlerorte bis zu regionalen Städten: England hat zu viele Orte, um sie einzeln zu recherchieren.',
heroDescription: heroDescription:
'Perfect Postcode filtert zuerst jede Postleitzahl, damit Sie Besichtigungen nur dort verfolgen, wo es wirklich passt.', 'Legen Sie Budget, Pendelzeit, Schulen, Sicherheit, Lärm, Breitband und Lebensstil fest. Perfect Postcode scannt Englands Postleitzahlen und zeigt Orte, die wirklich passen, auch Gegenden, die Sie nie in ein Immobilienportal eingegeben hätten.',
exploreTheMap: 'Zeigen Sie mir, wo ich suchen soll', exploreTheMap: 'Passende Postleitzahlen finden',
seeTheDifference: 'Demo ansehen', seeTheDifference: 'So funktioniert es',
productDemoLabel: 'Sehen, wie Sie zuerst den richtigen Suchort finden', productDemoLabel: 'Perfect Postcode-Produktdemo',
playProductDemo: 'Suchort-Demo abspielen', playProductDemo: 'Perfect Postcode-Produktdemo abspielen',
scrollToProductDemo: 'Zur Produktdemo scrollen', scrollToProductDemo: 'Zur Produktdemo scrollen',
showcaseHeader: 'So funktioniert es', showcaseHeader: 'So funktioniert es',
showcaseContext: 'So funktioniert Perfect Postcode', showcaseContext: 'So funktioniert Perfect Postcode',
@ -920,44 +920,45 @@ const de: Translations = {
showcaseFeatureNoiseShort: 'Lärm', showcaseFeatureNoiseShort: 'Lärm',
showcaseFeatureSchoolsShort: 'Schulen', showcaseFeatureSchoolsShort: 'Schulen',
showcaseFeatureTravelShort: 'Fahrzeit', showcaseFeatureTravelShort: 'Fahrzeit',
showcaseGoodPrimariesNearby: '{{count}}+ gute oder hervorragende Grundschulen in der Nähe', showcaseGoodPrimariesNearby: '{{count}}+ gute Grundschulen in der Nähe',
showcaseWithinRail: 'Innerhalb von {{count}} Min. eines Bahnhofs', showcaseWithinRail: 'Innerhalb von {{count}} Min. zur Bahn',
showcaseMatchingHomesLabel: 'Passende Postleitzahlen', showcaseMatchingHomesLabel: 'Passende Immobilien',
showcaseMatchingHomes: '{{value}} passende Postleitzahlen', showcaseMatchingHomes: '{{value}} passende Immobilien',
showcaseMedianPrice: '{{value}} Median', showcaseMedianPrice: '{{value}} Median',
showcaseJourneyRoutes: 'Routen', showcaseJourneyRoutes: 'Routen',
showcaseNearby: '{{value}} in der Nähe', showcaseNearby: '{{value}} in der Nähe',
showcasePoliticalVoteShare: 'Politischer Stimmenanteil', showcasePoliticalVoteShare: 'Politischer Stimmenanteil',
showcaseLotsMore: 'Mehr Nachbarschaftsdaten', showcaseLotsMore: '...und vieles mehr',
showcaseMinutes: '{{count}} Min.', showcaseMinutes: '{{count}} Min.',
showcaseSendShortlist: 'Auswahlliste senden', showcaseSendShortlist: 'Auswahlliste senden',
showcaseDownloadXlsx: '.xlsx herunterladen', showcaseDownloadXlsx: '.xlsx herunterladen',
showcaseTopThree: 'Top 3', showcaseTopThree: 'Top 3',
showcaseScoutBullet1: 'Prüfen Sie die Straße, bevor Sie sich auf Inseratsalarme festlegen.', showcaseScoutBullet1:
'Gehen Sie durch die Straßen, bevor die Inseratsuche Ihre Optionen einengt.',
showcaseScoutBullet2: showcaseScoutBullet2:
'Testen Sie den Pendelweg von einer echten Haustür, nicht nur anhand eines Bezirksnamens.', 'Testen Sie den Pendelweg von einer echten Haustür, nicht nur anhand eines Bezirksnamens.',
showcaseScoutBullet3: 'Vergleichen Sie Besichtigungen mit belastbaren Daten im Rücken.', showcaseScoutBullet3: 'Vergleichen Sie Besichtigungen mit belastbaren Daten im Rücken.',
showcaseStep1Tab: 'Filtern', showcaseStep1Tab: 'Filtern',
showcaseStep1Title: 'Festlegen, was funktionieren muss', showcaseStep1Title: 'Aus vagen Wünschen eine präzise Suche machen',
showcaseStep1Body: showcaseStep1Body:
'Fügen Sie Budget, Pendelweg, Schulen, Sicherheit, Lärm und lokale Details hinzu. Sehen Sie zu, wie die falschen Postleitzahlen herausfallen.', 'Legen Sie fest, was zählt, und sehen Sie genau, wie viele unpassende Postleitzahlen jede Anforderung aus Ihrer Suche ausschließt.',
showcaseStep1Chip1: 'Ruhige Straßen', showcaseStep1Chip1: 'Ruhige Straßen',
showcaseStep1Chip2: 'Gute Grundschulen in der Nähe', showcaseStep1Chip2: 'Top-Grundschulen',
showcaseStep1Chip3: 'Unter £500k', showcaseStep1Chip3: 'Unter £500k',
showcaseStep1VennCenter: 'Postleitzahlen, die alle drei erfüllen', showcaseStep1VennCenter: 'Postleitzahlen, die alle drei erfüllen',
showcaseStep2Tab: 'Abgleichen', showcaseStep2Tab: 'Abgleichen',
showcaseStep2Title: 'Sehen Sie die Orte, die übrig bleiben', showcaseStep2Title: 'Die Karte zeigt Orte, die Sie nicht eingegeben hätten',
showcaseStep2Body: showcaseStep2Body:
'Suchen Sie nach praktischen Kriterien, nicht nach vertrauten Namen. Die Karte zeigt Postleitzahlen-Cluster, die Sie zuerst prüfen sollten.', 'Durchsuchen Sie England nach Passung, statt mit vertrauten Gebietsnamen zu beginnen. Verborgene Ecken werden sichtbar, bevor Immobilienportale Ihre Suche einengen.',
showcaseStep2Region: 'Großraum London', showcaseStep2Region: 'Großraum London',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT', showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'Passende Gruppen', showcaseStep2ClustersLabel: 'Passende Gruppen',
showcaseStep3Tab: 'Prüfen', showcaseStep3Tab: 'Prüfen',
showcaseStep3Title: 'Prüfen Sie die Daten', showcaseStep3Title: 'Prüfen, warum eine Postleitzahl passt',
showcaseStep3Body: showcaseStep3Body:
'Öffnen Sie eine Postleitzahl und sehen Sie Preis, Pendelweg, Schulen, Kriminalität, Breitband und Kompromisse, bevor Sie besichtigen.', 'Öffnen Sie ein passendes Gebiet und prüfen Sie Preise, Sicherheit, Schulen, Breitband und Kompromisse in einem Bereich, bevor Sie ein Wochenende dort verbringen.',
showcaseStep3HeaderArea: 'Vorausgewählte Postleitzahl', showcaseStep3HeaderArea: 'Ihre perfekte Postleitzahl',
showcaseStep3HeaderFit: 'Was passt', showcaseStep3HeaderFit: 'Nachbarschaftsbelege',
showcaseStep3Stat1Label: 'Verkaufspreis-Trend', showcaseStep3Stat1Label: 'Verkaufspreis-Trend',
showcaseStep3Stat2Label: 'Kriminalität', showcaseStep3Stat2Label: 'Kriminalität',
showcaseStep3Stat2Value: 'Unter dem Bezirksdurchschnitt', showcaseStep3Stat2Value: 'Unter dem Bezirksdurchschnitt',
@ -967,35 +968,34 @@ const de: Translations = {
showcaseStep3Stat5Label: 'Grundschulen', showcaseStep3Stat5Label: 'Grundschulen',
showcaseStep3Stat5Value: '3 „Hervorragend“ innerhalb von 1 Meile', showcaseStep3Stat5Value: '3 „Hervorragend“ innerhalb von 1 Meile',
showcaseStep4Tab: 'Erkunden', showcaseStep4Tab: 'Erkunden',
showcaseStep4Title: 'Nehmen Sie die Auswahlliste mit auf die Straße', showcaseStep4Title: 'Selbst vor Ort prüfen',
showcaseStep4Body: showcaseStep4Body:
'Exportieren Sie die prüfenswerten Postleitzahlen, testen Sie den Pendelweg, laufen Sie die Straßen ab und vergleichen Sie Besichtigungen mit gespeichertem Kontext.', 'Nehmen Sie drei fundierte Ausgangspunkte mit in die echte Welt. Laufen Sie durch die Straßen, testen Sie den Pendelweg und vergleichen Sie Besichtigungen mit Kontext.',
showcaseStep4FileName: 'areas-to-scout.xlsx', showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Nach Excel exportieren', showcaseStep4ExportLabel: 'Nach Excel exportieren',
showcaseStep4ColPostcode: 'Postleitzahl', showcaseStep4ColPostcode: 'Postleitzahl',
showcaseStep4ColScore: 'Passung', showcaseStep4ColScore: 'Passung',
showcaseStep4ColCommute: 'Pendeln', showcaseStep4ColCommute: 'Pendeln',
showcaseStep4ColPrice: 'Median-Verkaufspreis', showcaseStep4ColPrice: 'Median verkauft',
showcaseStep4Conclusion: showcaseStep4Conclusion: 'Von hier aus können Sie Ihre Suche beginnen.',
'Exportieren Sie eine Auswahlliste und beginnen Sie, die Straßen zu prüfen.', statProperties: 'historische Verkäufe',
statProperties: 'Verkäufe laut HM Land Registry', statFilters: 'kombinierbare Filter',
statFilters: 'Möglichkeiten, die Karte einzugrenzen',
statEvery: 'Jede', statEvery: 'Jede',
statPostcodeInEngland: 'aktive Postleitzahl in England', statPostcodeInEngland: 'Postleitzahl in England',
ourPhilosophy: 'Beginnen Sie nicht länger mit Orten, die Sie schon kennen.', ourPhilosophy: 'Beginnen Sie mit Ihrem Leben, nicht mit einer Postleitzahl',
philosophyP1: philosophyP1:
'Die meisten Suchen beginnen mit einem Ortsnamen und hoffen dann, dass passende Wohnungen auftauchen. Das überspringt die schwierigere Frage: Welche Orte lohnen sich wirklich für die Suche?', 'Die meisten Immobilienseiten fragen, wo Sie wohnen möchten. In London ist das besonders schwierig, aber das gleiche Problem gibt es in ganz England: Käufer starten mit wenigen bekannten Orten und prüfen dann Pendelzeit, Schulen, Kriminalität, Street View, Breitband und Verkaufspreise in getrennten Tabs.',
philosophyP2: philosophyP2:
'Perfect Postcode beginnt vor dem Immobilienportal. Legen Sie fest, was ein Ort leisten muss, und sehen Sie zuerst die Postleitzahlen, die Ihre Aufmerksamkeit verdienen.', 'Perfect Postcode dreht die Suche um. Sagen Sie der Karte, was zählt, und sie zeigt passende Postleitzahlen mit nachvollziehbaren Gründen. Erst Daten, dann vor Ort das Gefühl prüfen.',
streetTitle: 'Orte ändern sich von Straße zu Straße', streetTitle: 'Orte ändern sich von Straße zu Straße',
streetIntro: streetIntro:
'Die richtige Bahnhofsseite, eine laute Straße oder ein einzelner Schuleinzugsbereich können die Suche verändern. Gebietsnamen ebnen all das ein.', 'Große Gebietsnamen verdecken die Details, die zählen: Bahnhofsseite, Straßenlärm, Schulmix, genaue Pendelzeit und echte Verkaufspreise.',
streetCard1Title: 'Raus aus der Falle vertrauter Namen', streetCard1Title: 'Finden Sie Gegenden, die Sie übersehen hätten',
streetCard1Body: streetCard1Body:
'Finden Sie passende Postleitzahlen außerhalb der Orte, die bereits auf Ihrer Liste stehen.', 'Entdecken Sie Postleitzahlen, die Ihren Anforderungen entsprechen, statt sich nur auf bekannte Namen, Empfehlungen oder Hype zu verlassen.',
streetCard2Title: 'Kennen Sie die Kompromisse, bevor Sie losgehen', streetCard2Title: 'Sehen Sie Kompromisse vor Besichtigungen',
streetCard2Body: streetCard2Body:
'Prüfen Sie Preis, Pendelweg, Lärm, Schulen, Sicherheit, Breitband und nahe gelegene Ausstattung, bevor Sie Besichtigungen buchen.', 'Vergleichen Sie Preis, Platz, Pendelzeit, Sicherheit, Schulen, Breitband, Lärm und Energieeffizienz, bevor Sie Wochenenden mit Besichtigungen verbringen.',
othersVs: 'Andere vs', othersVs: 'Andere vs',
checkMyPostcode: 'Immobilienportale', checkMyPostcode: 'Immobilienportale',
areaGuides: 'Postleitzahl-Berichte', areaGuides: 'Postleitzahl-Berichte',
@ -1005,11 +1005,11 @@ const de: Translations = {
compAreaDataSub: '(Kriminalität, Schulen, Lärm, Breitband, Ausstattung)', compAreaDataSub: '(Kriminalität, Schulen, Lärm, Breitband, Ausstattung)',
compPropertyData: 'Historie auf Immobilienebene', compPropertyData: 'Historie auf Immobilienebene',
compPropertyDataSub: '(Verkaufspreise, EPC, Wohnfläche, Schätzwert)', compPropertyDataSub: '(Verkaufspreise, EPC, Wohnfläche, Schätzwert)',
compFilters: 'Budget, Pendelweg, Schulen, Sicherheit und lokale Daten zusammen', compFilters: '56 Filter, die zusammenarbeiten',
compFiltersSub: '(Budget + Pendelweg + Schulen + Sicherheit + lokaler Kontext)', compFiltersSub: '(nicht eine Postleitzahl oder ein Inserat nach dem anderen)',
ctaTitle: 'Finden Sie heraus, wo Sie suchen sollten, bevor Sie Besichtigungen buchen.', ctaTitle: 'Hören Sie auf zu raten, wo Sie kaufen sollen.',
ctaDescription: ctaDescription:
'Erstellen Sie eine Postleitzahlen-Auswahlliste aus den Dingen, die zählen, und prüfen Sie dann die Straßen persönlich.', 'Erstellen Sie eine Auswahlliste von Postleitzahlen, die zu Ihrem echten Leben passen, und prüfen Sie sie dann vor Ort.',
}, },
// ── Pricing Page ─────────────────────────────────── // ── Pricing Page ───────────────────────────────────

View file

@ -873,17 +873,18 @@ const en = {
// ── Home Page ────────────────────────────────────── // ── Home Page ──────────────────────────────────────
home: { home: {
heroEyebrow: 'Find where to look first', heroEyebrow: 'For buyers asking “where should I even look?”',
heroTitle1: 'Stop searching', heroTitle1: 'Find the postcodes that',
heroTitle2: 'the wrong places', heroTitle2: 'fit your life',
heroTitle3: 'Before listings narrow your search.', heroTitle3: 'Not just the areas you already know.',
heroSubtitle: 'Find postcodes where your budget, commute, and daily life line up.', heroSubtitle:
'From London boroughs to commuter towns and regional cities, England has too many places to research one by one.',
heroDescription: heroDescription:
'Perfect Postcode filters every postcode first, so you only chase viewings in places that work.', 'Set your budget, commute, schools, safety, noise, broadband, and lifestyle needs. Perfect Postcode scans Englands postcodes and reveals the places that actually fit, including areas youd never have typed into a listing portal.',
exploreTheMap: 'Show me where to look', exploreTheMap: 'Find my matching postcodes',
seeTheDifference: 'Watch demo', seeTheDifference: 'See how it works',
productDemoLabel: 'See how to find where to look first', productDemoLabel: 'Perfect Postcode product demo',
playProductDemo: 'Play the where-to-look demo', playProductDemo: 'Play Perfect Postcode product demo',
scrollToProductDemo: 'Scroll to product demo', scrollToProductDemo: 'Scroll to product demo',
showcaseHeader: 'How it works', showcaseHeader: 'How it works',
showcaseContext: 'How Perfect Postcode works', showcaseContext: 'How Perfect Postcode works',
@ -891,43 +892,43 @@ const en = {
showcaseFeatureNoiseShort: 'Noise', showcaseFeatureNoiseShort: 'Noise',
showcaseFeatureSchoolsShort: 'Schools', showcaseFeatureSchoolsShort: 'Schools',
showcaseFeatureTravelShort: 'Travel', showcaseFeatureTravelShort: 'Travel',
showcaseGoodPrimariesNearby: '{{count}}+ Good or Outstanding primary schools nearby', showcaseGoodPrimariesNearby: '{{count}}+ good primaries nearby',
showcaseWithinRail: 'Within {{count}} min of a station', showcaseWithinRail: 'Within {{count}} min of rail',
showcaseMatchingHomesLabel: 'Matching postcodes', showcaseMatchingHomesLabel: 'Matching homes',
showcaseMatchingHomes: '{{value}} matching postcodes', showcaseMatchingHomes: '{{value}} matching homes',
showcaseMedianPrice: '{{value}} median', showcaseMedianPrice: '{{value}} median',
showcaseJourneyRoutes: 'Journey routes', showcaseJourneyRoutes: 'Journey routes',
showcaseNearby: '{{value}} nearby', showcaseNearby: '{{value}} nearby',
showcasePoliticalVoteShare: 'Political vote share', showcasePoliticalVoteShare: 'Political vote share',
showcaseLotsMore: 'More neighbourhood data', showcaseLotsMore: '...and lots more',
showcaseMinutes: '{{count}} min', showcaseMinutes: '{{count}} min',
showcaseSendShortlist: 'Send the shortlist', showcaseSendShortlist: 'Send the shortlist',
showcaseDownloadXlsx: 'Download .xlsx', showcaseDownloadXlsx: 'Download .xlsx',
showcaseTopThree: 'Top 3', showcaseTopThree: 'Top 3',
showcaseScoutBullet1: 'Check the street before you commit to listing alerts.', showcaseScoutBullet1: 'Walk the streets before the listing search narrows your options.',
showcaseScoutBullet2: 'Test the commute from a real front door, not a borough name.', showcaseScoutBullet2: 'Test the commute from a real front door, not a borough name.',
showcaseScoutBullet3: 'Compare viewings with evidence already saved.', showcaseScoutBullet3: 'Compare viewings with evidence already in hand.',
showcaseStep1Tab: 'Filter', showcaseStep1Tab: 'Filter',
showcaseStep1Title: 'Set what has to work', showcaseStep1Title: 'Turn vague needs into a tight search',
showcaseStep1Body: showcaseStep1Body:
'Add budget, commute, schools, safety, noise, and local details. Watch the wrong postcodes drop out.', 'Set what matters and see exactly how many wrong-fit postcodes each requirement keeps out of your search.',
showcaseStep1Chip1: 'Quiet streets', showcaseStep1Chip1: 'Quiet streets',
showcaseStep1Chip2: 'Good primaries nearby', showcaseStep1Chip2: 'Top-rated primaries',
showcaseStep1Chip3: 'Under £500k', showcaseStep1Chip3: 'Under £500k',
showcaseStep1VennCenter: 'Postcodes that meet all three', showcaseStep1VennCenter: 'Postcodes that meet all three',
showcaseStep2Tab: 'Match', showcaseStep2Tab: 'Match',
showcaseStep2Title: 'See the places left standing', showcaseStep2Title: 'Let the map surface places you wouldnt have typed',
showcaseStep2Body: showcaseStep2Body:
'Search by practical checks, not familiar names. The map shows postcode clusters worth checking first.', 'Scan England by fit instead of starting from familiar area names. Hidden pockets become visible before listing portals narrow your imagination.',
showcaseStep2Region: 'Greater London', showcaseStep2Region: 'Greater London',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT', showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'Matching clusters', showcaseStep2ClustersLabel: 'Matching clusters',
showcaseStep3Tab: 'Inspect', showcaseStep3Tab: 'Inspect',
showcaseStep3Title: 'Check the evidence', showcaseStep3Title: 'Inspect why a postcode made the cut',
showcaseStep3Body: showcaseStep3Body:
'Open a postcode and see the price, commute, schools, crime, broadband, and trade-offs before you visit.', 'Open any matching area and check prices, safety, schools, broadband, and trade-offs in one pane before you spend a weekend there.',
showcaseStep3HeaderArea: 'Shortlisted postcode', showcaseStep3HeaderArea: 'Your perfect postcode',
showcaseStep3HeaderFit: 'What works', showcaseStep3HeaderFit: 'Neighbourhood evidence',
showcaseStep3Stat1Label: 'Sold price trend', showcaseStep3Stat1Label: 'Sold price trend',
showcaseStep3Stat2Label: 'Crime rate', showcaseStep3Stat2Label: 'Crime rate',
showcaseStep3Stat2Value: 'Below borough avg.', showcaseStep3Stat2Value: 'Below borough avg.',
@ -935,49 +936,50 @@ const en = {
showcaseStep3Stat4Label: 'Broadband', showcaseStep3Stat4Label: 'Broadband',
showcaseStep3Stat4Value: '1 Gbps available', showcaseStep3Stat4Value: '1 Gbps available',
showcaseStep3Stat5Label: 'Primary schools', showcaseStep3Stat5Label: 'Primary schools',
showcaseStep3Stat5Value: '3 Outstanding within 1 mile', showcaseStep3Stat5Value: '3 outstanding within 1 mile',
showcaseStep4Tab: 'Scout', showcaseStep4Tab: 'Scout',
showcaseStep4Title: 'Take the shortlist to the streets', showcaseStep4Title: 'Scout it out yourself',
showcaseStep4Body: showcaseStep4Body:
'Export the postcodes worth checking, test the commute, walk the roads, and compare viewings with context saved.', 'Take three grounded starting points into the real world. Walk the streets, test the commute, and compare viewings with context.',
showcaseStep4FileName: 'areas-to-scout.xlsx', showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Export to Excel', showcaseStep4ExportLabel: 'Export to Excel',
showcaseStep4ColPostcode: 'Postcode', showcaseStep4ColPostcode: 'Postcode',
showcaseStep4ColScore: 'Match', showcaseStep4ColScore: 'Fit',
showcaseStep4ColCommute: 'Commute', showcaseStep4ColCommute: 'Commute',
showcaseStep4ColPrice: 'Median sold price', showcaseStep4ColPrice: 'Median sold',
showcaseStep4Conclusion: 'Export a shortlist and start checking streets.', showcaseStep4Conclusion: 'You can start your journey from here.',
statProperties: 'HM Land Registry sales', statProperties: 'historical sales',
statFilters: 'ways to narrow the map', statFilters: 'combinable filters',
statEvery: 'Every', statEvery: 'Every',
statPostcodeInEngland: 'active postcode in England', statPostcodeInEngland: 'postcode in England',
ourPhilosophy: 'Stop starting with towns you already know.', ourPhilosophy: 'Start with your life, not a postcode',
philosophyP1: philosophyP1:
'Most searches start with a place name, then hope the right homes appear. That skips the harder question: which places are actually worth searching?', 'Most property sites ask where you want to live. In London thats painfully hard, but the same problem shows up across England: buyers choose from the few places they know, then cross-check commute tools, Ofsted, police data, Street View, broadband checkers, and sold prices in separate tabs.',
philosophyP2: philosophyP2:
'Perfect Postcode starts before the listing site. Set the things a place must support, then see the postcodes that deserve your attention first.', 'Perfect Postcode flips the search. Tell the map what matters and it shows the postcodes that qualify, with evidence for why theyre worth inspecting. Data first, then go test the vibe.',
streetTitle: 'Places change street by street', streetTitle: 'Places change street by street',
streetIntro: streetIntro:
'The right side of a station, a noisy road, or one school catchment can change the search. Area names flatten all of that.', 'Broad area names hide the details that matter: the station side, the road noise, the school mix, the exact commute, and what similar homes actually sold for.',
streetCard1Title: 'Escape the familiar-name trap', streetCard1Title: 'Find areas you may have missed',
streetCard1Body: 'Find postcode-level matches outside the places already on your list.', streetCard1Body:
streetCard2Title: 'Know the trade-offs before you go', 'Surface postcodes that match your requirements instead of relying on familiar names, friend recommendations, or “up-and-coming” hype.',
streetCard2Title: 'See the trade-offs before viewings',
streetCard2Body: streetCard2Body:
'Check price, commute, noise, schools, safety, broadband, and nearby amenities before booking viewings.', 'Compare price, space, commute, safety, schools, broadband, noise, and energy ratings before you spend weekends travelling between viewings.',
othersVs: 'Other tools vs', othersVs: 'Others vs',
checkMyPostcode: 'Listing sites', checkMyPostcode: 'Listing portals',
areaGuides: 'Postcode checkers', areaGuides: 'Postcode reports',
compSearchWithout: 'Find areas before you know their names', compSearchWithout: 'Discover areas before you know their names',
compSearchWithoutSub: '(requirements first, location second)', compSearchWithoutSub: '(requirements first, location second)',
compAreaData: 'Neighbourhood evidence in one place', compAreaData: 'Postcode-level neighbourhood evidence',
compAreaDataSub: '(crime, schools, noise, broadband, amenities)', compAreaDataSub: '(crime, schools, noise, broadband, amenities)',
compPropertyData: 'Street-level property context', compPropertyData: 'Property-level history',
compPropertyDataSub: '(sold prices, EPC, floor area, estimated value)', compPropertyDataSub: '(sold prices, EPC, floor area, estimated value)',
compFilters: 'Budget, commute, schools, safety, and local data together', compFilters: '56 filters working together',
compFiltersSub: '(budget + commute + schools + safety + local context)', compFiltersSub: '(not one postcode or one listing at a time)',
ctaTitle: 'Find where to look before you book viewings.', ctaTitle: 'Stop guessing where to buy.',
ctaDescription: ctaDescription:
'Build a postcode shortlist from the things that matter, then check the streets in person.', 'Build a shortlist of postcodes that fit your actual life, then test them in person.',
}, },
// ── Pricing Page ─────────────────────────────────── // ── Pricing Page ───────────────────────────────────

View file

@ -906,17 +906,18 @@ const fr: Translations = {
// ── Home Page ────────────────────────────────────── // ── Home Page ──────────────────────────────────────
home: { home: {
heroEyebrow: 'Trouvez dabord où chercher', heroEyebrow: 'Pour les acheteurs qui se demandent « où chercher ? »',
heroTitle1: 'Arrêtez de chercher', heroTitle1: 'Trouvez les codes postaux',
heroTitle2: 'aux mauvais endroits', heroTitle2: 'qui correspondent à votre vie',
heroTitle3: 'Avant que les annonces ne resserrent votre recherche.', heroTitle3: 'Pas seulement les quartiers que vous connaissez déjà.',
heroSubtitle: 'Trouvez les codes postaux où budget, trajet et quotidien salignent.', heroSubtitle:
'Des quartiers londoniens aux villes de banlieue et aux villes régionales, lAngleterre compte trop de lieux pour les rechercher un par un.',
heroDescription: heroDescription:
'Perfect Postcode filtre dabord chaque code postal, pour que vous ne couriez après des visites que dans les lieux qui fonctionnent.', 'Définissez votre budget, trajet, écoles, sécurité, bruit, débit internet et style de vie. Perfect Postcode analyse les codes postaux dAngleterre et révèle les lieux qui correspondent vraiment, y compris ceux que vous nauriez jamais cherchés sur un portail immobilier.',
exploreTheMap: 'Montrez-moi où chercher', exploreTheMap: 'Trouver mes codes postaux',
seeTheDifference: 'Voir la démo', seeTheDifference: 'Voir comment ça marche',
productDemoLabel: 'Voir comment trouver où chercher dabord', productDemoLabel: 'Démo produit Perfect Postcode',
playProductDemo: 'Lire la démo « où chercher »', playProductDemo: 'Lire la démo produit Perfect Postcode',
scrollToProductDemo: 'Faire défiler jusquà la démo produit', scrollToProductDemo: 'Faire défiler jusquà la démo produit',
showcaseHeader: 'Comment ça marche', showcaseHeader: 'Comment ça marche',
showcaseContext: 'Comment fonctionne Perfect Postcode', showcaseContext: 'Comment fonctionne Perfect Postcode',
@ -924,44 +925,45 @@ const fr: Translations = {
showcaseFeatureNoiseShort: 'Bruit', showcaseFeatureNoiseShort: 'Bruit',
showcaseFeatureSchoolsShort: 'Écoles', showcaseFeatureSchoolsShort: 'Écoles',
showcaseFeatureTravelShort: 'Trajet', showcaseFeatureTravelShort: 'Trajet',
showcaseGoodPrimariesNearby: '{{count}}+ écoles primaires Good ou Outstanding à proximité', showcaseGoodPrimariesNearby: '{{count}}+ bonnes écoles primaires à proximité',
showcaseWithinRail: 'À moins de {{count}} min dune gare', showcaseWithinRail: 'À moins de {{count}} min du train',
showcaseMatchingHomesLabel: 'Codes postaux correspondants', showcaseMatchingHomesLabel: 'Biens correspondants',
showcaseMatchingHomes: '{{value}} codes postaux correspondants', showcaseMatchingHomes: '{{value}} biens correspondants',
showcaseMedianPrice: 'médiane {{value}}', showcaseMedianPrice: 'médiane {{value}}',
showcaseJourneyRoutes: 'Itinéraires', showcaseJourneyRoutes: 'Itinéraires',
showcaseNearby: '{{value}} à proximité', showcaseNearby: '{{value}} à proximité',
showcasePoliticalVoteShare: 'Répartition des voix', showcasePoliticalVoteShare: 'Répartition des voix',
showcaseLotsMore: 'Plus de données de quartier', showcaseLotsMore: '...et bien plus',
showcaseMinutes: '{{count}} min', showcaseMinutes: '{{count}} min',
showcaseSendShortlist: 'Envoyer la sélection', showcaseSendShortlist: 'Envoyer la sélection',
showcaseDownloadXlsx: 'Télécharger le .xlsx', showcaseDownloadXlsx: 'Télécharger le .xlsx',
showcaseTopThree: 'Top 3', showcaseTopThree: 'Top 3',
showcaseScoutBullet1: 'Vérifiez la rue avant de vous engager dans des alertes dannonces.', showcaseScoutBullet1:
'Parcourez les rues avant que la recherche dannonces ne réduise vos options.',
showcaseScoutBullet2: showcaseScoutBullet2:
'Testez le trajet depuis une vraie porte dentrée, pas seulement depuis un nom darrondissement.', 'Testez le trajet depuis une vraie porte dentrée, pas seulement depuis un nom darrondissement.',
showcaseScoutBullet3: 'Comparez les visites avec des preuves déjà en main.', showcaseScoutBullet3: 'Comparez les visites avec des preuves déjà en main.',
showcaseStep1Tab: 'Filtrer', showcaseStep1Tab: 'Filtrer',
showcaseStep1Title: 'Définissez ce qui doit fonctionner', showcaseStep1Title: 'Transformez des besoins vagues en recherche précise',
showcaseStep1Body: showcaseStep1Body:
'Ajoutez budget, trajet, écoles, sécurité, bruit et détails locaux. Regardez les mauvais codes postaux disparaître.', 'Définissez ce qui compte et voyez exactement combien de codes postaux inadaptés chaque exigence retire de votre recherche.',
showcaseStep1Chip1: 'Rues calmes', showcaseStep1Chip1: 'Rues calmes',
showcaseStep1Chip2: 'Bonnes écoles primaires proches', showcaseStep1Chip2: 'Écoles primaires bien notées',
showcaseStep1Chip3: 'Moins de £500k', showcaseStep1Chip3: 'Moins de £500k',
showcaseStep1VennCenter: 'Codes postaux qui cochent les trois', showcaseStep1VennCenter: 'Codes postaux qui cochent les trois',
showcaseStep2Tab: 'Associer', showcaseStep2Tab: 'Comparer',
showcaseStep2Title: 'Voyez les lieux qui restent', showcaseStep2Title: 'Laissez la carte révéler des lieux que vous nauriez pas tapés',
showcaseStep2Body: showcaseStep2Body:
'Cherchez par critères pratiques, pas par noms familiers. La carte montre les grappes de codes postaux à vérifier en premier.', 'Parcourez lAngleterre par adéquation au lieu de partir de noms de quartiers familiers. Des poches méconnues deviennent visibles avant que les portails dannonces ne réduisent votre horizon.',
showcaseStep2Region: 'Grand Londres', showcaseStep2Region: 'Grand Londres',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT', showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'Grappes correspondantes', showcaseStep2ClustersLabel: 'Grappes correspondantes',
showcaseStep3Tab: 'Inspecter', showcaseStep3Tab: 'Inspecter',
showcaseStep3Title: 'Vérifiez les preuves', showcaseStep3Title: 'Comprenez pourquoi un code postal correspond',
showcaseStep3Body: showcaseStep3Body:
'Ouvrez un code postal et voyez prix, trajet, écoles, criminalité, débit internet et compromis avant de vous déplacer.', 'Ouvrez nimporte quelle zone correspondante et vérifiez prix, sécurité, écoles, débit internet et compromis dans un seul panneau avant dy passer un week-end.',
showcaseStep3HeaderArea: 'Code postal présélectionné', showcaseStep3HeaderArea: 'Votre code postal idéal',
showcaseStep3HeaderFit: 'Ce qui fonctionne', showcaseStep3HeaderFit: 'Éléments sur le quartier',
showcaseStep3Stat1Label: 'Tendance des prix vendus', showcaseStep3Stat1Label: 'Tendance des prix vendus',
showcaseStep3Stat2Label: 'Criminalité', showcaseStep3Stat2Label: 'Criminalité',
showcaseStep3Stat2Value: 'Sous la moyenne de larrondissement', showcaseStep3Stat2Value: 'Sous la moyenne de larrondissement',
@ -971,34 +973,34 @@ const fr: Translations = {
showcaseStep3Stat5Label: 'Écoles primaires', showcaseStep3Stat5Label: 'Écoles primaires',
showcaseStep3Stat5Value: '3 « Excellent » à moins dun mile', showcaseStep3Stat5Value: '3 « Excellent » à moins dun mile',
showcaseStep4Tab: 'Repérer', showcaseStep4Tab: 'Repérer',
showcaseStep4Title: 'Emmenez la sélection dans la rue', showcaseStep4Title: 'Allez vérifier par vous-même',
showcaseStep4Body: showcaseStep4Body:
'Exportez les codes postaux à vérifier, testez le trajet, parcourez les rues et comparez les visites avec le contexte sauvegardé.', 'Emportez trois points de départ solides dans le monde réel. Parcourez les rues, testez le trajet et comparez les visites avec du contexte.',
showcaseStep4FileName: 'areas-to-scout.xlsx', showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Exporter vers Excel', showcaseStep4ExportLabel: 'Exporter vers Excel',
showcaseStep4ColPostcode: 'Code postal', showcaseStep4ColPostcode: 'Code postal',
showcaseStep4ColScore: 'Adéquation', showcaseStep4ColScore: 'Ajust.',
showcaseStep4ColCommute: 'Trajet', showcaseStep4ColCommute: 'Trajet',
showcaseStep4ColPrice: 'Prix de vente médian', showcaseStep4ColPrice: 'Prix médian',
showcaseStep4Conclusion: 'Exportez une sélection et commencez à vérifier les rues.', showcaseStep4Conclusion: 'Vous pouvez commencer votre recherche ici.',
statProperties: 'ventes HM Land Registry', statProperties: 'ventes historiques',
statFilters: 'façons de resserrer la carte', statFilters: 'filtres combinables',
statEvery: 'Chaque', statEvery: 'Chaque',
statPostcodeInEngland: 'code postal actif en Angleterre', statPostcodeInEngland: 'code postal dAngleterre',
ourPhilosophy: 'Arrêtez de commencer par les villes que vous connaissez déjà.', ourPhilosophy: 'Commencez par votre vie, pas par un code postal',
philosophyP1: philosophyP1:
'La plupart des recherches commencent par un nom de lieu, puis espèrent que les bons biens apparaîtront. Cela évite la question plus difficile : quels lieux valent vraiment la peine dêtre recherchés ?', 'La plupart des sites immobiliers demandent où vous voulez vivre. À Londres, cest particulièrement difficile, mais le même problème existe partout en Angleterre : les acheteurs partent des quelques lieux quils connaissent, puis vérifient séparément trajets, écoles, criminalité, Street View, débit internet et prix vendus.',
philosophyP2: philosophyP2:
'Perfect Postcode commence avant le site dannonces. Définissez ce quun lieu doit permettre, puis voyez les codes postaux qui méritent votre attention en premier.', 'Perfect Postcode inverse la recherche. Dites à la carte ce qui compte et elle affiche les codes postaux qui correspondent, avec les raisons pour lesquelles ils méritent dêtre étudiés. Les données dabord, puis allez tester lambiance.',
streetTitle: 'Tout change rue par rue', streetTitle: 'Tout change rue par rue',
streetIntro: streetIntro:
'Le bon côté dune gare, une route bruyante ou une zone de recrutement scolaire peuvent changer la recherche. Les noms de zones gomment tout cela.', 'Les grands noms de quartiers cachent les détails importants : le côté de la gare, le bruit de la route, les écoles, le trajet exact et les vrais prix de vente.',
streetCard1Title: 'Échappez au piège des noms familiers', streetCard1Title: 'Trouvez les zones que vous auriez manquées',
streetCard1Body: streetCard1Body:
'Trouvez des correspondances au niveau du code postal hors des lieux déjà sur votre liste.', 'Faites ressortir les codes postaux qui correspondent à vos critères, au lieu de dépendre seulement des noms connus ou des recommandations.',
streetCard2Title: 'Connaissez les compromis avant dy aller', streetCard2Title: 'Voyez les compromis avant les visites',
streetCard2Body: streetCard2Body:
'Vérifiez prix, trajet, bruit, écoles, sécurité, débit internet et commodités proches avant de réserver des visites.', 'Comparez prix, surface, trajet, sécurité, écoles, débit internet, bruit et énergie avant de passer vos week-ends à courir les visites.',
othersVs: 'Les autres vs', othersVs: 'Les autres vs',
checkMyPostcode: 'Portails dannonces', checkMyPostcode: 'Portails dannonces',
areaGuides: 'Rapports de code postal', areaGuides: 'Rapports de code postal',
@ -1008,11 +1010,11 @@ const fr: Translations = {
compAreaDataSub: '(criminalité, écoles, bruit, débit internet, services)', compAreaDataSub: '(criminalité, écoles, bruit, débit internet, services)',
compPropertyData: 'Historique par propriété', compPropertyData: 'Historique par propriété',
compPropertyDataSub: '(prix vendus, DPE, surface, valeur estimée)', compPropertyDataSub: '(prix vendus, DPE, surface, valeur estimée)',
compFilters: 'Budget, trajet, écoles, sécurité et données locales ensemble', compFilters: '56 filtres qui fonctionnent ensemble',
compFiltersSub: '(budget + trajet + écoles + sécurité + contexte local)', compFiltersSub: '(pas un code postal ou une annonce à la fois)',
ctaTitle: 'Trouvez où chercher avant de réserver des visites.', ctaTitle: 'Arrêtez de deviner où acheter.',
ctaDescription: ctaDescription:
'Construisez une sélection de codes postaux à partir de ce qui compte, puis vérifiez les rues sur place.', 'Construisez une sélection de codes postaux adaptés à votre vraie vie, puis allez les tester sur place.',
}, },
// ── Pricing Page ─────────────────────────────────── // ── Pricing Page ───────────────────────────────────

View file

@ -856,17 +856,18 @@ const hi: Translations = {
}, },
home: { home: {
heroEyebrow: 'पहले पता करें कि कहां देखना है', heroEyebrow: 'उन खरीदारों के लिए जो पूछते हैं “मुझे देखना कहां शुरू करना चाहिए?”',
heroTitle1: 'गलत जगहों पर', heroTitle1: 'वे पोस्टकोड खोजें जो',
heroTitle2: 'खोजना बंद करें', heroTitle2: 'आपकी जिंदगी से मेल खाते हैं',
heroTitle3: 'इससे पहले कि लिस्टिंग आपकी खोज सीमित कर दें.', heroTitle3: 'सिर्फ वे क्षेत्र नहीं जिन्हें आप पहले से जानते हैं.',
heroSubtitle: 'ऐसे पोस्टकोड खोजें जहां आपका बजट, आवागमन और रोजमर्रा की जिंदगी मेल खाते हों.', heroSubtitle:
'लंदन बरो से लेकर कम्यूटर टाउन और क्षेत्रीय शहरों तक, इंग्लैंड में एक-एक जगह रिसर्च करने के लिए बहुत अधिक स्थान हैं.',
heroDescription: heroDescription:
'Perfect Postcode पहले हर पोस्टकोड को फिल्टर करता है, ताकि आप सिर्फ उन्हीं जगहों पर मकान देखने जाएं जो सच में काम आती हैं.', 'अपना बजट, आवागमन, स्कूल, सुरक्षा, शोर, ब्रॉडबैंड और जीवनशैली की जरूरतें सेट करें. Perfect Postcode इंग्लैंड के पोस्टकोड स्कैन करता है और वे जगहें दिखाता है जो सच में मेल खाती हैं, उन क्षेत्रों सहित जिन्हें आप किसी प्रॉपर्टी पोर्टल में कभी नहीं खोजते.',
exploreTheMap: 'मुझे दिखाएं कहां देखना है', exploreTheMap: 'मेरे मेल खाते पोस्टकोड खोजें',
seeTheDifference: 'डेमो देखें', seeTheDifference: 'देखें यह कैसे काम करता है',
productDemoLabel: 'देखें कि पहले कहां देखना है कैसे पता करें', productDemoLabel: 'Perfect Postcode उत्पाद डेमो',
playProductDemo: '“कहां देखना है” डेमो चलाएं', playProductDemo: 'Perfect Postcode उत्पाद डेमो चलाएं',
scrollToProductDemo: 'उत्पाद डेमो तक स्क्रोल करें', scrollToProductDemo: 'उत्पाद डेमो तक स्क्रोल करें',
showcaseHeader: 'यह कैसे काम करता है', showcaseHeader: 'यह कैसे काम करता है',
showcaseContext: 'Perfect Postcode कैसे काम करता है', showcaseContext: 'Perfect Postcode कैसे काम करता है',
@ -874,43 +875,43 @@ const hi: Translations = {
showcaseFeatureNoiseShort: 'शोर', showcaseFeatureNoiseShort: 'शोर',
showcaseFeatureSchoolsShort: 'स्कूल', showcaseFeatureSchoolsShort: 'स्कूल',
showcaseFeatureTravelShort: 'यात्रा', showcaseFeatureTravelShort: 'यात्रा',
showcaseGoodPrimariesNearby: '{{count}}+ अच्छे या उत्कृष्ट प्राइमरी स्कूल पास में', showcaseGoodPrimariesNearby: '{{count}}+ अच्छे प्राइमरी स्कूल पास में',
showcaseWithinRail: 'स्टेशन से {{count}} मिनट के भीतर', showcaseWithinRail: 'रेल से {{count}} मिनट के भीतर',
showcaseMatchingHomesLabel: 'मेल खाते पोस्टकोड', showcaseMatchingHomesLabel: 'मेल खाते घर',
showcaseMatchingHomes: '{{value}} मेल खाते पोस्टकोड', showcaseMatchingHomes: '{{value}} मेल खाते घर',
showcaseMedianPrice: '{{value}} मीडियन', showcaseMedianPrice: '{{value}} मीडियन',
showcaseJourneyRoutes: 'यात्रा मार्ग', showcaseJourneyRoutes: 'यात्रा मार्ग',
showcaseNearby: '{{value}} पास में', showcaseNearby: '{{value}} पास में',
showcasePoliticalVoteShare: 'राजनीतिक वोट हिस्सेदारी', showcasePoliticalVoteShare: 'राजनीतिक वोट हिस्सेदारी',
showcaseLotsMore: 'पड़ोस का और डेटा', showcaseLotsMore: '...और भी बहुत कुछ',
showcaseMinutes: '{{count}} मिनट', showcaseMinutes: '{{count}} मिनट',
showcaseSendShortlist: 'शॉर्टलिस्ट भेजें', showcaseSendShortlist: 'शॉर्टलिस्ट भेजें',
showcaseDownloadXlsx: '.xlsx डाउनलोड करें', showcaseDownloadXlsx: '.xlsx डाउनलोड करें',
showcaseTopThree: 'शीर्ष 3', showcaseTopThree: 'शीर्ष 3',
showcaseScoutBullet1: 'लिस्टिंग अलर्ट लगाने से पहले सड़क जांचें.', showcaseScoutBullet1: 'लिस्टिंग खोज आपके विकल्प घटाए, उससे पहले सड़कें चलकर देखें.',
showcaseScoutBullet2: 'आवागमन किसी असली दरवाजे से जांचें, सिर्फ बरो नाम से नहीं.', showcaseScoutBullet2: 'आवागमन किसी असली दरवाजे से जांचें, सिर्फ बरो नाम से नहीं.',
showcaseScoutBullet3: 'पहले से सहेजे गए प्रमाण के साथ मकान देखने के विकल्पों की तुलना करें.', showcaseScoutBullet3: 'पहले से मौजूद प्रमाण के साथ viewing की तुलना करें.',
showcaseStep1Tab: 'फिल्टर', showcaseStep1Tab: 'फिल्टर',
showcaseStep1Title: 'सेट करें कि क्या काम करना जरूरी है', showcaseStep1Title: 'अस्पष्ट जरूरतों को सटीक खोज में बदलें',
showcaseStep1Body: showcaseStep1Body:
'बजट, आवागमन, स्कूल, सुरक्षा, शोर और स्थानीय विवरण जोड़ें. गलत पोस्टकोड को बाहर होते देखें.', 'जो मायने रखता है उसे सेट करें और देखें कि हर जरूरत कितने गलत-फिट पोस्टकोड को आपकी खोज से बाहर रखती है.',
showcaseStep1Chip1: 'शांत सड़कें', showcaseStep1Chip1: 'शांत सड़कें',
showcaseStep1Chip2: 'पास में अच्छे प्राइमरी', showcaseStep1Chip2: 'शीर्ष-रेटेड प्राइमरी',
showcaseStep1Chip3: '£500,000 से कम', showcaseStep1Chip3: '£500,000 से कम',
showcaseStep1VennCenter: 'तीनों शर्तों को पूरा करने वाले पोस्टकोड', showcaseStep1VennCenter: 'तीनों शर्तों को पूरा करने वाले पोस्टकोड',
showcaseStep2Tab: 'मिलान', showcaseStep2Tab: 'मिलान',
showcaseStep2Title: 'बची हुई जगहें देखें', showcaseStep2Title: 'मानचित्र को वे जगहें दिखाने दें जिन्हें आप टाइप नहीं करते',
showcaseStep2Body: showcaseStep2Body:
'परिचित नामों से नहीं, व्यावहारिक जांचों से खोजें. मानचित्र पहले जांचने लायक पोस्टकोड क्लस्टर दिखाता है.', 'परिचित इलाकों के नामों से शुरू करने के बजाय अपनी जरूरतों से मेल के आधार पर इंग्लैंड देखें. प्रॉपर्टी पोर्टल आपकी सोच सीमित करें, उससे पहले छिपे हुए अच्छे इलाके सामने आ जाते हैं.',
showcaseStep2Region: 'ग्रेटर लंदन', showcaseStep2Region: 'ग्रेटर लंदन',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT', showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'मेल खाते क्लस्टर', showcaseStep2ClustersLabel: 'मेल खाते क्लस्टर',
showcaseStep3Tab: 'जांचें', showcaseStep3Tab: 'जांचें',
showcaseStep3Title: 'प्रमाण जांचें', showcaseStep3Title: 'जांचें कि कोई पोस्टकोड क्यों चुना गया',
showcaseStep3Body: showcaseStep3Body:
'कोई पोस्टकोड खोलें और मकान देखने से पहले कीमत, आवागमन, स्कूल, अपराध, ब्रॉडबैंड और समझौते देखें.', 'किसी भी मेल खाते क्षेत्र को खोलें और वहां सप्ताहांत बिताने से पहले कीमतें, सुरक्षा, स्कूल, ब्रॉडबैंड और समझौते एक ही पैनल में जांचें.',
showcaseStep3HeaderArea: 'शॉर्टलिस्ट किया गया पोस्टकोड', showcaseStep3HeaderArea: 'आपका परफेक्ट पोस्टकोड',
showcaseStep3HeaderFit: 'क्या काम करता है', showcaseStep3HeaderFit: 'पड़ोस का प्रमाण',
showcaseStep3Stat1Label: 'बेची गई कीमत का रुझान', showcaseStep3Stat1Label: 'बेची गई कीमत का रुझान',
showcaseStep3Stat2Label: 'अपराध दर', showcaseStep3Stat2Label: 'अपराध दर',
showcaseStep3Stat2Value: 'बरो औसत से कम', showcaseStep3Stat2Value: 'बरो औसत से कम',
@ -920,33 +921,34 @@ const hi: Translations = {
showcaseStep3Stat5Label: 'प्राइमरी स्कूल', showcaseStep3Stat5Label: 'प्राइमरी स्कूल',
showcaseStep3Stat5Value: '1 मील के अंदर 3 उत्कृष्ट', showcaseStep3Stat5Value: '1 मील के अंदर 3 उत्कृष्ट',
showcaseStep4Tab: 'स्काउट', showcaseStep4Tab: 'स्काउट',
showcaseStep4Title: 'शॉर्टलिस्ट को सड़कों तक ले जाएं', showcaseStep4Title: 'खुद जाकर देखें',
showcaseStep4Body: showcaseStep4Body:
'जांचने लायक पोस्टकोड निर्यात करें, आवागमन आजमाएं, सड़कें चलकर देखें और सहेजे गए संदर्भ के साथ मकान देखने के विकल्पों की तुलना करें.', 'तीन ठोस शुरुआती बिंदुओं को वास्तविक दुनिया में ले जाएं. सड़कें चलकर देखें, आवागमन आजमाएं और संदर्भ के साथ मकानों की देखने-समझने की यात्राओं की तुलना करें.',
showcaseStep4FileName: 'areas-to-scout.xlsx', showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Excel में निर्यात करें', showcaseStep4ExportLabel: 'Excel में निर्यात करें',
showcaseStep4ColPostcode: 'पोस्टकोड', showcaseStep4ColPostcode: 'पोस्टकोड',
showcaseStep4ColScore: 'फिट', showcaseStep4ColScore: 'फिट',
showcaseStep4ColCommute: 'आवागमन', showcaseStep4ColCommute: 'आवागमन',
showcaseStep4ColPrice: 'मीडियन बिक्री मूल्य', showcaseStep4ColPrice: 'मीडियन बिक्री',
showcaseStep4Conclusion: 'शॉर्टलिस्ट निर्यात करें और सड़कें जांचना शुरू करें.', showcaseStep4Conclusion: 'आप अपनी यात्रा यहां से शुरू कर सकते हैं.',
statProperties: 'HM Land Registry बिक्री', statProperties: 'ऐतिहासिक बिक्री',
statFilters: 'मानचित्र को संकरा करने के तरीके', statFilters: 'जोड़े जा सकने वाले फिल्टर',
statEvery: 'हर', statEvery: 'हर',
statPostcodeInEngland: 'इंग्लैंड का सक्रिय पोस्टकोड', statPostcodeInEngland: 'इंग्लैंड का पोस्टकोड',
ourPhilosophy: 'उन कस्बों से शुरू करना बंद करें जिन्हें आप पहले से जानते हैं.', ourPhilosophy: 'पोस्टकोड नहीं, अपनी जिंदगी से शुरू करें',
philosophyP1: philosophyP1:
'अधिकांश खोजें किसी जगह के नाम से शुरू होती हैं, फिर उम्मीद करती हैं कि सही घर मिल जाएंगे. इससे कठिन सवाल छूट जाता है: कौन सी जगहें सच में खोजने लायक हैं?', 'अधिकांश संपत्ति साइटें पूछती हैं कि आप कहां रहना चाहते हैं. लंदन में यह बहुत कठिन है, लेकिन यही समस्या पूरे इंग्लैंड में आती है: खरीदार उन कुछ जगहों में से चुनते हैं जिन्हें वे जानते हैं, फिर आवागमन टूल, Ofsted, पुलिस डेटा, Street View, ब्रॉडबैंड जांच और बेचे गए दामों को अलग-अलग टैब में मिलाते हैं.',
philosophyP2: philosophyP2:
'Perfect Postcode लिस्टिंग साइट से पहले शुरू होता है. सेट करें कि किसी जगह को क्या समर्थन देना चाहिए, फिर वे पोस्टकोड देखें जो पहले आपका ध्यान मांगते हैं.', 'Perfect Postcode खोज को उलट देता है. मानचित्र को बताएं कि क्या मायने रखता है और यह वे पोस्टकोड दिखाता है जो योग्य हैं, साथ में प्रमाण भी कि वे देखने लायक क्यों हैं. पहले डेटा, फिर माहौल खुद परखें.',
streetTitle: 'जगहें सड़क-दर-सड़क बदलती हैं', streetTitle: 'जगहें सड़क-दर-सड़क बदलती हैं',
streetIntro: streetIntro:
'स्टेशन का सही तरफ होना, शोर वाली सड़क या एक स्कूल कैचमेंट भी खोज बदल सकता है. क्षेत्र के नाम यह सब समतल कर देते हैं.', 'बड़े क्षेत्र नाम वे विवरण छिपा देते हैं जो मायने रखते हैं: स्टेशन किस तरफ है, सड़क का शोर, स्कूल मिश्रण, सटीक आवागमन और समान घर वास्तव में किस कीमत पर बिके.',
streetCard1Title: 'परिचित नामों के जाल से बाहर निकलें', streetCard1Title: 'वे क्षेत्र खोजें जो आपसे छूट सकते थे',
streetCard1Body: 'अपनी सूची में पहले से मौजूद जगहों से बाहर पोस्टकोड-स्तर के मेल खोजें.', streetCard1Body:
streetCard2Title: 'जाने से पहले समझौते जानें', 'परिचित नामों, दोस्तों की सिफारिशों या “उभरते इलाके” की चर्चा पर निर्भर रहने के बजाय अपनी जरूरतों से मेल खाते पोस्टकोड सामने लाएं.',
streetCard2Title: 'मकान देखने से पहले समझौते समझें',
streetCard2Body: streetCard2Body:
'मकान देखने की बुकिंग से पहले कीमत, आवागमन, शोर, स्कूल, सुरक्षा, ब्रॉडबैंड और पास की सुविधाएं जांचें.', 'सप्ताहांत मकान देखने में बिताने से पहले कीमत, जगह, आवागमन, सुरक्षा, स्कूल, ब्रॉडबैंड, शोर और ऊर्जा रेटिंग की तुलना करें.',
othersVs: 'दूसरे बनाम', othersVs: 'दूसरे बनाम',
checkMyPostcode: 'प्रॉपर्टी पोर्टल', checkMyPostcode: 'प्रॉपर्टी पोर्टल',
areaGuides: 'पोस्टकोड रिपोर्ट', areaGuides: 'पोस्टकोड रिपोर्ट',
@ -956,11 +958,11 @@ const hi: Translations = {
compAreaDataSub: '(अपराध, स्कूल, शोर, ब्रॉडबैंड, सुविधाएं)', compAreaDataSub: '(अपराध, स्कूल, शोर, ब्रॉडबैंड, सुविधाएं)',
compPropertyData: 'संपत्ति-स्तर इतिहास', compPropertyData: 'संपत्ति-स्तर इतिहास',
compPropertyDataSub: '(बेची कीमतें, EPC, फर्श क्षेत्र, अनुमानित मूल्य)', compPropertyDataSub: '(बेची कीमतें, EPC, फर्श क्षेत्र, अनुमानित मूल्य)',
compFilters: 'बजट, आवागमन, स्कूल, सुरक्षा और स्थानीय डेटा साथ में', compFilters: '56 फिल्टर साथ काम करते हुए',
compFiltersSub: '(बजट + आवागमन + स्कूल + सुरक्षा + स्थानीय संदर्भ)', compFiltersSub: '(एक समय में केवल एक पोस्टकोड या एक लिस्टिंग नहीं)',
ctaTitle: 'मकान देखने की बुकिंग से पहले पता करें कि कहां देखना है.', ctaTitle: 'कहां खरीदना है, इसका अनुमान लगाना बंद करें.',
ctaDescription: ctaDescription:
'जो बातें मायने रखती हैं उनसे पोस्टकोड शॉर्टलिस्ट बनाएं, फिर सड़कों को खुद जांचें.', 'उन पोस्टकोड की शॉर्टलिस्ट बनाएं जो आपकी वास्तविक जिंदगी से मेल खाते हैं, फिर उन्हें खुद जांचें.',
}, },
pricingPage: { pricingPage: {

View file

@ -887,18 +887,18 @@ const hu: Translations = {
// ── Home Page ────────────────────────────────────── // ── Home Page ──────────────────────────────────────
home: { home: {
heroEyebrow: 'Először találd meg, hol érdemes keresni', heroEyebrow: 'Vevőknek, akik azt kérdezik: „hol is kezdjem?”',
heroTitle1: 'Ne keress tovább', heroTitle1: 'Találd meg az irányítószámokat',
heroTitle2: 'rossz helyeken', heroTitle2: 'amelyek illenek az életedhez',
heroTitle3: 'Mielőtt a hirdetések beszűkítik a keresést.', heroTitle3: 'Nem csak azokat a környékeket, amelyeket már ismersz.',
heroSubtitle: heroSubtitle:
'Találd meg azokat az irányítószámokat, ahol a költségvetésed, az ingázásod és a mindennapjaid összeérnek.', 'A londoni városrészeken, ingázó településeken és regionális városokon át Angliában túl sok hely van ahhoz, hogy egyenként kutasd át őket.',
heroDescription: heroDescription:
'A Perfect Postcode először minden irányítószámot megszűr, így csak ott mész megtekintésre, ahol tényleg működhet.', 'Állítsd be a költségvetést, ingázást, iskolákat, biztonságot, zajt, internetet és életstílust. A Perfect Postcode átnézi Anglia irányítószámait, és megmutatja azokat a helyeket is, amelyeket sosem írtál volna be egy ingatlanportálra.',
exploreTheMap: 'Mutasd, hol keressek', exploreTheMap: 'Megfelelő irányítószámok keresése',
seeTheDifference: 'Demó megtekintése', seeTheDifference: 'Így működik',
productDemoLabel: 'Nézd meg, hogyan találod meg először, hol keress', productDemoLabel: 'Perfect Postcode termékdemó',
playProductDemo: '„Hol keress” demó lejátszása', playProductDemo: 'Perfect Postcode termékdemó lejátszása',
scrollToProductDemo: 'Ugrás a termékdemóhoz', scrollToProductDemo: 'Ugrás a termékdemóhoz',
showcaseHeader: 'Így működik', showcaseHeader: 'Így működik',
showcaseContext: 'Így működik a Perfect Postcode', showcaseContext: 'Így működik a Perfect Postcode',
@ -906,43 +906,44 @@ const hu: Translations = {
showcaseFeatureNoiseShort: 'Zaj', showcaseFeatureNoiseShort: 'Zaj',
showcaseFeatureSchoolsShort: 'Iskolák', showcaseFeatureSchoolsShort: 'Iskolák',
showcaseFeatureTravelShort: 'Utazás', showcaseFeatureTravelShort: 'Utazás',
showcaseGoodPrimariesNearby: '{{count}}+ jó vagy kiváló általános iskola a közelben', showcaseGoodPrimariesNearby: '{{count}}+ jó általános iskola a közelben',
showcaseWithinRail: '{{count}} percen belül egy állomástól', showcaseWithinRail: '{{count}} percen belül vasúthoz',
showcaseMatchingHomesLabel: 'Illeszkedő irányítószámok', showcaseMatchingHomesLabel: 'Illeszkedő otthonok',
showcaseMatchingHomes: '{{value}} illeszkedő irányítószám', showcaseMatchingHomes: '{{value}} illeszkedő otthon',
showcaseMedianPrice: '{{value}} medián', showcaseMedianPrice: '{{value}} medián',
showcaseJourneyRoutes: 'Útvonalak', showcaseJourneyRoutes: 'Útvonalak',
showcaseNearby: '{{value}} a közelben', showcaseNearby: '{{value}} a közelben',
showcasePoliticalVoteShare: 'Politikai szavazatarány', showcasePoliticalVoteShare: 'Politikai szavazatarány',
showcaseLotsMore: 'További környékadatok', showcaseLotsMore: '...és még sok más',
showcaseMinutes: '{{count}} perc', showcaseMinutes: '{{count}} perc',
showcaseSendShortlist: 'Küldd el a szűkített listát', showcaseSendShortlist: 'Küldd el a szűkített listát',
showcaseDownloadXlsx: '.xlsx letöltése', showcaseDownloadXlsx: '.xlsx letöltése',
showcaseTopThree: 'Top 3', showcaseTopThree: 'Top 3',
showcaseScoutBullet1: 'Ellenőrizd az utcát, mielőtt hirdetésfigyelőkre hagyatkozol.', showcaseScoutBullet1:
'Járd be az utcákat, mielőtt a hirdetéskeresés leszűkíti a lehetőségeidet.',
showcaseScoutBullet2: 'Valódi bejárati ajtótól teszteld az ingázást, ne csak városrésznévből.', showcaseScoutBullet2: 'Valódi bejárati ajtótól teszteld az ingázást, ne csak városrésznévből.',
showcaseScoutBullet3: 'Bizonyítékokkal a kezedben hasonlítsd össze a megtekintéseket.', showcaseScoutBullet3: 'Bizonyítékokkal a kezedben hasonlítsd össze a megtekintéseket.',
showcaseStep1Tab: 'Szűrés', showcaseStep1Tab: 'Szűrés',
showcaseStep1Title: 'Állítsd be, minek kell működnie', showcaseStep1Title: 'A homályos igényekből pontos keresés lesz',
showcaseStep1Body: showcaseStep1Body:
'Add hozzá a költségvetést, ingázást, iskolákat, biztonságot, zajt és helyi részleteket. Figyeld, ahogy a rossz irányítószámok kiesnek.', 'Állítsd be, mi számít, és pontosan lásd, hogy minden feltétel hány nem megfelelő irányítószámot zár ki a keresésből.',
showcaseStep1Chip1: 'Csendes utcák', showcaseStep1Chip1: 'Csendes utcák',
showcaseStep1Chip2: 'Jó általános iskolák a közelben', showcaseStep1Chip2: 'Kiváló általános iskolák',
showcaseStep1Chip3: '£500k alatt', showcaseStep1Chip3: '£500k alatt',
showcaseStep1VennCenter: 'Mindhárom feltételt teljesítő irányítószámok', showcaseStep1VennCenter: 'Mindhárom feltételt teljesítő irányítószámok',
showcaseStep2Tab: 'Egyeztetés', showcaseStep2Tab: 'Egyeztetés',
showcaseStep2Title: 'Nézd meg a fennmaradó helyeket', showcaseStep2Title: 'A térkép olyan helyeket hoz felszínre, amelyeket be sem írtál volna',
showcaseStep2Body: showcaseStep2Body:
'Gyakorlati ellenőrzések alapján keress, ne ismerős nevek szerint. A térkép megmutatja, mely irányítószám-klasztereket érdemes először megnézni.', 'Ismert területnevek helyett illeszkedés alapján pásztázd végig Angliát. A rejtett, jó lehetőségek láthatóvá válnak, mielőtt a hirdetési portálok leszűkítenék a gondolkodásodat.',
showcaseStep2Region: 'Nagy-London', showcaseStep2Region: 'Nagy-London',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT', showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'Találati klaszterek', showcaseStep2ClustersLabel: 'Találati klaszterek',
showcaseStep3Tab: 'Vizsgálat', showcaseStep3Tab: 'Vizsgálat',
showcaseStep3Title: 'Ellenőrizd a bizonyítékokat', showcaseStep3Title: 'Nézd meg, miért került be egy irányítószám',
showcaseStep3Body: showcaseStep3Body:
'Nyiss meg egy irányítószámot, és megtekintés előtt nézd meg az árat, ingázást, iskolákat, bűnözést, internetet és kompromisszumokat.', 'Nyiss meg bármelyik megfelelő területet, és egy panelen ellenőrizd az árakat, biztonságot, iskolákat, internetet és kompromisszumokat, mielőtt rászánsz egy hétvégét.',
showcaseStep3HeaderArea: 'Szűkített irányítószám', showcaseStep3HeaderArea: 'A te tökéletes irányítószámod',
showcaseStep3HeaderFit: 'Mi működik', showcaseStep3HeaderFit: 'Környékadatok',
showcaseStep3Stat1Label: 'Eladási ár trend', showcaseStep3Stat1Label: 'Eladási ár trend',
showcaseStep3Stat2Label: 'Bűnözési ráta', showcaseStep3Stat2Label: 'Bűnözési ráta',
showcaseStep3Stat2Value: 'Borough-átlag alatt', showcaseStep3Stat2Value: 'Borough-átlag alatt',
@ -952,33 +953,34 @@ const hu: Translations = {
showcaseStep3Stat5Label: 'Általános iskolák', showcaseStep3Stat5Label: 'Általános iskolák',
showcaseStep3Stat5Value: '3 „outstanding” 1 mérföldön belül', showcaseStep3Stat5Value: '3 „outstanding” 1 mérföldön belül',
showcaseStep4Tab: 'Felderítés', showcaseStep4Tab: 'Felderítés',
showcaseStep4Title: 'Vidd ki a listát az utcára', showcaseStep4Title: 'Nézd meg személyesen',
showcaseStep4Body: showcaseStep4Body:
'Exportáld az ellenőrzésre érdemes irányítószámokat, próbáld ki az ingázást, járd be az utcákat, és mentett kontextussal hasonlítsd össze a megtekintéseket.', 'Vigyél magaddal három megalapozott kiindulópontot a való világba. Sétáld be az utcákat, próbáld ki az ingázást, és kontextussal hasonlítsd össze a megtekintéseket.',
showcaseStep4FileName: 'areas-to-scout.xlsx', showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Exportálás Excelbe', showcaseStep4ExportLabel: 'Exportálás Excelbe',
showcaseStep4ColPostcode: 'Irányítószám', showcaseStep4ColPostcode: 'Irányítószám',
showcaseStep4ColScore: 'Egyezés', showcaseStep4ColScore: 'Egyezés',
showcaseStep4ColCommute: 'Ingázás', showcaseStep4ColCommute: 'Ingázás',
showcaseStep4ColPrice: 'Medián eladási ár', showcaseStep4ColPrice: 'Medián eladási ár',
showcaseStep4Conclusion: 'Exportálj egy szűkített listát, és kezdd el ellenőrizni az utcákat.', showcaseStep4Conclusion: 'Innen már el tudod indítani a keresést.',
statProperties: 'HM Land Registry eladás', statProperties: 'korábbi eladás',
statFilters: 'mód a térkép szűkítésére', statFilters: 'kombinálható szűrő',
statEvery: 'Minden', statEvery: 'Minden',
statPostcodeInEngland: 'aktív irányítószám Angliában', statPostcodeInEngland: 'irányítószám Angliában',
ourPhilosophy: 'Ne azokkal a városokkal kezdj, amelyeket már ismersz.', ourPhilosophy: 'Az életedből indulj ki, ne egy irányítószámból',
philosophyP1: philosophyP1:
'A legtöbb keresés egy helynévvel indul, aztán reméli, hogy megjelennek a jó otthonok. Ez kihagyja a nehezebb kérdést: mely helyeken érdemes valójában keresni?', 'A legtöbb ingatlanoldal először azt kérdezi, hol szeretnél élni. Londonban ez különösen nehéz, de ugyanez a probléma egész Angliában megjelenik: a vevők néhány ismert helyből indulnak ki, majd külön füleken ellenőrzik az ingázást, iskolákat, bűnözést, Street View-t, internetet és eladási árakat.',
philosophyP2: philosophyP2:
'A Perfect Postcode még a hirdetési oldal előtt indul. Állítsd be, mit kell támogatnia egy helynek, majd nézd meg először azokat az irányítószámokat, amelyek megérdemlik a figyelmedet.', 'A Perfect Postcode megfordítja a keresést. Mondd meg a térképnek, mi számít, és megmutatja a megfelelő irányítószámokat, indoklással együtt. Előbb az adatok, aztán a helyszíni benyomás.',
streetTitle: 'A helyek utcáról utcára változnak', streetTitle: 'A helyek utcáról utcára változnak',
streetIntro: streetIntro:
'Az állomás jó oldala, egy zajos út vagy egyetlen iskolakörzet is megváltoztathatja a keresést. A területnevek mindezt elsimítják.', 'A nagy környéknevek elrejtik a fontos részleteket: az állomás melyik oldalát, az útzajt, az iskolákat, a pontos ingázást és a valódi eladási árakat.',
streetCard1Title: 'Lépj ki az ismerős nevek csapdájából', streetCard1Title: 'Találd meg a kihagyott környékeket',
streetCard1Body: 'Találj irányítószám-szintű egyezéseket a már listázott helyeken kívül.', streetCard1Body:
streetCard2Title: 'Ismerd meg a kompromisszumokat, mielőtt elindulsz', 'Hozd felszínre azokat az irányítószámokat, amelyek megfelelnek a feltételeidnek, ne csak ismert nevekre vagy ajánlásokra hagyatkozz.',
streetCard2Title: 'Lásd a kompromisszumokat megtekintés előtt',
streetCard2Body: streetCard2Body:
'Megtekintések foglalása előtt ellenőrizd az árat, ingázást, zajt, iskolákat, biztonságot, internetet és közeli szolgáltatásokat.', 'Hasonlítsd össze az árat, méretet, ingázást, biztonságot, iskolákat, internetet, zajt és energiahatékonyságot, mielőtt hétvégéket töltesz megtekintésekkel.',
othersVs: 'Mások vs.', othersVs: 'Mások vs.',
checkMyPostcode: 'Ingatlanportálok', checkMyPostcode: 'Ingatlanportálok',
areaGuides: 'Irányítószám-riportok', areaGuides: 'Irányítószám-riportok',
@ -988,11 +990,11 @@ const hu: Translations = {
compAreaDataSub: '(bűnözés, iskolák, zaj, internet, szolgáltatások)', compAreaDataSub: '(bűnözés, iskolák, zaj, internet, szolgáltatások)',
compPropertyData: 'Ingatlanszintű előzmények', compPropertyData: 'Ingatlanszintű előzmények',
compPropertyDataSub: '(eladási árak, EPC, alapterület, becsült érték)', compPropertyDataSub: '(eladási árak, EPC, alapterület, becsült érték)',
compFilters: 'Költségvetés, ingázás, iskolák, biztonság és helyi adatok együtt', compFilters: '56 együtt működő szűrő',
compFiltersSub: '(költségvetés + ingázás + iskolák + biztonság + helyi kontextus)', compFiltersSub: '(nem egy irányítószám vagy hirdetés egyszerre)',
ctaTitle: 'Találd meg, hol érdemes keresni, mielőtt megtekintéseket foglalsz.', ctaTitle: 'Ne találgasd, hol vegyél.',
ctaDescription: ctaDescription:
'Készíts irányítószám-listát abból, ami számít, majd ellenőrizd személyesen az utcákat.', 'Készíts listát olyan irányítószámokból, amelyek illenek a valós életedhez, majd nézd meg őket személyesen.',
}, },
// ── Pricing Page ─────────────────────────────────── // ── Pricing Page ───────────────────────────────────

View file

@ -833,16 +833,17 @@ const zh: Translations = {
// ── Home Page ────────────────────────────────────── // ── Home Page ──────────────────────────────────────
home: { home: {
heroEyebrow: '先找准该看哪里', heroEyebrow: '适合正在问“我到底该看哪里?”的买家',
heroTitle1: '别再搜索', heroTitle1: '找到真正',
heroTitle2: '不合适的地方', heroTitle2: '适合您生活的邮编',
heroTitle3: '在房源缩小您的选择之前。', heroTitle3: '不只局限于您已经知道的区域。',
heroSubtitle: '找到预算、通勤和日常生活都匹配的邮编。', heroSubtitle: '从伦敦街区到通勤城镇和英格兰各地城市,可研究的地方太多,无法一个个筛查。',
heroDescription: 'Perfect Postcode 会先筛选每个邮编,让您只追踪真正合适地点的看房机会。', heroDescription:
exploreTheMap: '告诉我该看哪里', '设定预算、通勤、学校、安全、噪音、宽带和生活方式需求。Perfect Postcode 会扫描英格兰的邮编,显示真正匹配的地方,包括您从未想过要在房源网站上搜索的区域。',
seeTheDifference: '观看演示', exploreTheMap: '找到匹配的邮编',
productDemoLabel: '了解如何先找准该看哪里', seeTheDifference: '查看使用方式',
playProductDemo: '播放“该看哪里”演示', productDemoLabel: 'Perfect Postcode 产品演示',
playProductDemo: '播放 Perfect Postcode 产品演示',
scrollToProductDemo: '滚动到产品演示', scrollToProductDemo: '滚动到产品演示',
showcaseHeader: '工作原理', showcaseHeader: '工作原理',
showcaseContext: 'Perfect Postcode 的工作流程', showcaseContext: 'Perfect Postcode 的工作流程',
@ -850,40 +851,42 @@ const zh: Translations = {
showcaseFeatureNoiseShort: '噪声', showcaseFeatureNoiseShort: '噪声',
showcaseFeatureSchoolsShort: '学校', showcaseFeatureSchoolsShort: '学校',
showcaseFeatureTravelShort: '出行', showcaseFeatureTravelShort: '出行',
showcaseGoodPrimariesNearby: '附近 {{count}}+ 所良好或优秀小学', showcaseGoodPrimariesNearby: '附近 {{count}}+ 所良好小学',
showcaseWithinRail: '距车站 {{count}} 分钟内', showcaseWithinRail: '{{count}} 分钟内到达铁路',
showcaseMatchingHomesLabel: '匹配邮编', showcaseMatchingHomesLabel: '匹配房源',
showcaseMatchingHomes: '{{value}} 个匹配邮编', showcaseMatchingHomes: '{{value}} 个匹配房源',
showcaseMedianPrice: '{{value}} 中位数', showcaseMedianPrice: '{{value}} 中位数',
showcaseJourneyRoutes: '出行路线', showcaseJourneyRoutes: '出行路线',
showcaseNearby: '附近 {{value}} 个', showcaseNearby: '附近 {{value}} 个',
showcasePoliticalVoteShare: '政党得票份额', showcasePoliticalVoteShare: '政党得票份额',
showcaseLotsMore: '更多社区数据', showcaseLotsMore: '……以及更多',
showcaseMinutes: '{{count}} 分钟', showcaseMinutes: '{{count}} 分钟',
showcaseSendShortlist: '发送候选名单', showcaseSendShortlist: '发送候选名单',
showcaseDownloadXlsx: '下载 .xlsx', showcaseDownloadXlsx: '下载 .xlsx',
showcaseTopThree: '前 3 名', showcaseTopThree: '前 3 名',
showcaseScoutBullet1: '订阅房源提醒前,先核查街道。', showcaseScoutBullet1: '在房源搜索缩小选择之前,先实地走走街道。',
showcaseScoutBullet2: '从真实门牌测试通勤,而不是只看行政区名称。', showcaseScoutBullet2: '从真实门牌测试通勤,而不是只看行政区名称。',
showcaseScoutBullet3: '带着已有证据比较看房结果。', showcaseScoutBullet3: '带着已有证据比较看房结果。',
showcaseStep1Tab: '筛选', showcaseStep1Tab: '筛选',
showcaseStep1Title: '设定必须满足的条件', showcaseStep1Title: '把模糊需求变成精准搜索',
showcaseStep1Body: '加入预算、通勤、学校、安全、噪音和本地细节,看不合适的邮编逐个被筛掉。', showcaseStep1Body: '设置真正重要的条件,并清楚看到每项要求为您排除了多少不合适的邮编。',
showcaseStep1Chip1: '安静街道', showcaseStep1Chip1: '安静街道',
showcaseStep1Chip2: '附近优质小学', showcaseStep1Chip2: '顶级小学',
showcaseStep1Chip3: '£500,000 以内', showcaseStep1Chip3: '£500,000 以内',
showcaseStep1VennCenter: '同时满足三项条件的邮编', showcaseStep1VennCenter: '同时满足三项条件的邮编',
showcaseStep2Tab: '匹配', showcaseStep2Tab: '匹配',
showcaseStep2Title: '查看剩下的可选地点', showcaseStep2Title: '让地图浮现您原本不会输入的地方',
showcaseStep2Body: '按实际条件搜索,而不是按熟悉地名搜索。地图会显示值得优先核查的邮编集群。', showcaseStep2Body:
'按匹配度扫描英格兰,而不是从熟悉的地名开始。房源门户缩小您的想象之前,隐藏的好区域会先显现出来。',
showcaseStep2Region: '大伦敦', showcaseStep2Region: '大伦敦',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT', showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: '匹配集群', showcaseStep2ClustersLabel: '匹配集群',
showcaseStep3Tab: '检查', showcaseStep3Tab: '检查',
showcaseStep3Title: '核查依据', showcaseStep3Title: '查看某个邮编为什么入选',
showcaseStep3Body: '打开一个邮编,在看房前查看价格、通勤、学校、犯罪率、宽带和取舍。', showcaseStep3Body:
showcaseStep3HeaderArea: '候选邮编', '打开任何匹配区域,在一个面板中查看价格、安全、学校、宽带和取舍,再决定是否花一个周末去实地看。',
showcaseStep3HeaderFit: '匹配点', showcaseStep3HeaderArea: '您的理想邮编',
showcaseStep3HeaderFit: '社区证据',
showcaseStep3Stat1Label: '成交价走势', showcaseStep3Stat1Label: '成交价走势',
showcaseStep3Stat2Label: '犯罪率', showcaseStep3Stat2Label: '犯罪率',
showcaseStep3Stat2Value: '低于本区平均水平', showcaseStep3Stat2Value: '低于本区平均水平',
@ -893,31 +896,34 @@ const zh: Translations = {
showcaseStep3Stat5Label: '小学', showcaseStep3Stat5Label: '小学',
showcaseStep3Stat5Value: '1英里内3所「优秀」', showcaseStep3Stat5Value: '1英里内3所「优秀」',
showcaseStep4Tab: '踏勘', showcaseStep4Tab: '踏勘',
showcaseStep4Title: '把候选名单带到实地', showcaseStep4Title: '亲自去看一看',
showcaseStep4Body: '导出值得核查的邮编,测试通勤,走走街道,并用已保存的背景信息比较看房结果。', showcaseStep4Body:
'带着三个有数据支撑的起点走进现实。实地走街、测试通勤,并带着背景信息比较看房结果。',
showcaseStep4FileName: 'areas-to-scout.xlsx', showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: '导出到 Excel', showcaseStep4ExportLabel: '导出到 Excel',
showcaseStep4ColPostcode: '邮编', showcaseStep4ColPostcode: '邮编',
showcaseStep4ColScore: '匹配', showcaseStep4ColScore: '匹配',
showcaseStep4ColCommute: '通勤', showcaseStep4ColCommute: '通勤',
showcaseStep4ColPrice: '成交中位价', showcaseStep4ColPrice: '成交中位价',
showcaseStep4Conclusion: '导出候选名单,开始核查街道。', showcaseStep4Conclusion: '您可以从这里开始。',
statProperties: 'HM Land Registry 成交记录', statProperties: '历史成交记录',
statFilters: '种缩小地图范围的方法', statFilters: '可组合筛选条件',
statEvery: '每个', statEvery: '覆盖',
statPostcodeInEngland: '英格兰活跃邮编', statPostcodeInEngland: '英格兰每个邮编',
ourPhilosophy: '别再从已经熟悉的城镇开始。', ourPhilosophy: '从生活需求出发,而不是从邮编出发',
philosophyP1: philosophyP1:
'大多数搜索先从地名开始,然后希望合适的房源会出现。这跳过了更难的问题:哪些地方真的值得搜索?', '大多数房产网站先问您想住哪里。在伦敦这个问题尤其困难,但英格兰各地都有同样的问题:买家通常只能从几个熟悉的地方开始,然后分别查询通勤、学校、犯罪率、街景、宽带和成交价。',
philosophyP2: philosophyP2:
'Perfect Postcode 从房源网站之前开始。设定一个地方必须支持的生活条件,然后先查看最值得关注的邮编。', 'Perfect Postcode 反过来做搜索。告诉地图什么重要,它会显示符合条件的邮编,并解释为什么值得查看。先看数据,再去现场感受。',
streetTitle: '每条街都可能不同', streetTitle: '每条街都可能不同',
streetIntro: streetIntro:
'车站的哪一侧、嘈杂道路或一个学校学区,都可能改变搜索结果。区域名称会抹平这些差异。', '大的区域名称会掩盖关键细节:车站哪一侧、道路噪音、学校组合、真实通勤时间,以及类似房产的实际成交价。',
streetCard1Title: '避开熟悉地名的陷阱', streetCard1Title: '发现您可能错过的区域',
streetCard1Body: '在已列入清单的地方之外,找到邮编级别的匹配项。', streetCard1Body:
streetCard2Title: '出发前先看清取舍', '根据您的条件找出匹配的邮编,而不是只依赖熟悉的地名、朋友推荐或“潜力区域”的宣传。',
streetCard2Body: '预约看房前,先核查价格、通勤、噪音、学校、安全、宽带和附近配套。', streetCard2Title: '看房前先看清取舍',
streetCard2Body:
'在把周末花在看房之前,先比较价格、空间、通勤、安全、学校、宽带、噪音和能源评级。',
othersVs: '与其他平台对比', othersVs: '与其他平台对比',
checkMyPostcode: '房源门户', checkMyPostcode: '房源门户',
areaGuides: '邮编报告', areaGuides: '邮编报告',
@ -927,10 +933,10 @@ const zh: Translations = {
compAreaDataSub: '(犯罪率、学校、噪音、宽带、设施)', compAreaDataSub: '(犯罪率、学校、噪音、宽带、设施)',
compPropertyData: '房产级历史记录', compPropertyData: '房产级历史记录',
compPropertyDataSub: '成交价、EPC、面积、估值', compPropertyDataSub: '成交价、EPC、面积、估值',
compFilters: '预算、通勤、学校、安全和本地数据一起筛选', compFilters: '56 项联动筛选',
compFiltersSub: '预算 + 通勤 + 学校 + 安全 + 本地背景', compFiltersSub: '不是一次查一个邮编或一个房源',
ctaTitle: '预约看房前,先找到该看哪里。', ctaTitle: '别再猜哪里值得买。',
ctaDescription: '根据真正重要的条件建立邮编候选名单,再亲自核查街道。', ctaDescription: '先建立符合真实生活需求的邮编候选名单,再去实地感受。',
}, },
// ── Pricing Page ─────────────────────────────────── // ── Pricing Page ───────────────────────────────────

View file

@ -6,7 +6,7 @@
<meta name="theme-color" content="#fafaf9" media="(prefers-color-scheme: light)" /> <meta name="theme-color" content="#fafaf9" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#0a0e1a" media="(prefers-color-scheme: dark)" /> <meta name="theme-color" content="#0a0e1a" media="(prefers-color-scheme: dark)" />
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<title>Stop searching the wrong places | Perfect Postcode</title> <title>Perfect Postcode - Find where to buy before browsing listings</title>
<meta name="description" content="Filter every postcode in England by budget, commute, schools, crime, noise, broadband, property prices and amenities before you start chasing viewings." /> <meta name="description" content="Filter every postcode in England by budget, commute, schools, crime, noise, broadband, property prices and amenities before you start chasing viewings." />
<meta name="x-og-placeholder" content="__PERFECT_POSTCODE_OG_TAGS__" /> <meta name="x-og-placeholder" content="__PERFECT_POSTCODE_OG_TAGS__" />
<script> <script>

View file

@ -1,13 +1,14 @@
use std::sync::Arc; use std::sync::Arc;
use axum::Extension;
use axum::extract::State; use axum::extract::State;
use axum::http::StatusCode; use axum::http::StatusCode;
use axum::response::IntoResponse; use axum::response::IntoResponse;
use axum::response::Json; use axum::response::Json;
use axum::Extension;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::auth::OptionalUser; use crate::auth::OptionalUser;
use crate::data::{PlaceData, slugify};
use crate::licensing::{check_license_point, resolve_share_code}; use crate::licensing::{check_license_point, resolve_share_code};
use crate::state::SharedState; use crate::state::SharedState;
use crate::utils::normalize_postcode; use crate::utils::normalize_postcode;
@ -28,6 +29,29 @@ pub struct JourneyResponse {
minutes: Option<i16>, minutes: Option<i16>,
/// Best-case (5th percentile) total travel time in minutes (transit only). /// Best-case (5th percentile) total travel time in minutes (transit only).
best_minutes: Option<i16>, best_minutes: Option<i16>,
/// Destination coordinates from PlaceData, used by clients for unambiguous external links.
#[serde(skip_serializing_if = "Option::is_none")]
destination_lat: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
destination_lon: Option<f32>,
}
fn destination_coordinates(place_data: &PlaceData, slug: &str) -> Option<(f32, f32)> {
let best_idx = place_data
.name
.iter()
.enumerate()
.filter_map(|(idx, name)| {
(place_data.travel_destination[idx] && slugify(name) == slug).then_some(idx)
})
.min_by(|a, b| {
place_data.type_rank[*a]
.cmp(&place_data.type_rank[*b])
.then(place_data.population[*b].cmp(&place_data.population[*a]))
.then(place_data.name[*a].len().cmp(&place_data.name[*b].len()))
})?;
Some((place_data.lat[best_idx], place_data.lon[best_idx]))
} }
pub async fn get_journey( pub async fn get_journey(
@ -72,10 +96,16 @@ pub async fn get_journey(
.and_then(|j| serde_json::from_str::<serde_json::Value>(j).ok()); .and_then(|j| serde_json::from_str::<serde_json::Value>(j).ok());
let minutes = row.map(|r| r.minutes); let minutes = row.map(|r| r.minutes);
let best_minutes = row.and_then(|r| r.best_minutes); let best_minutes = row.and_then(|r| r.best_minutes);
let (destination_lat, destination_lon) =
destination_coordinates(&state.place_data, &query.slug)
.map(|(lat, lon)| (Some(lat), Some(lon)))
.unwrap_or((None, None));
Ok(Json(JourneyResponse { Ok(Json(JourneyResponse {
journey, journey,
minutes, minutes,
best_minutes, best_minutes,
destination_lat,
destination_lon,
})) }))
} }