This commit is contained in:
Andras Schmelczer 2026-06-25 22:08:36 +01:00
parent c2c4ed6708
commit 2efa4d9f47
9 changed files with 1324 additions and 125 deletions

View file

@ -56,6 +56,8 @@ const en = {
closePane: 'Close pane',
yes: 'Yes',
no: 'No',
captions: 'Captions',
sqm: 'sqm',
},
// ── Header / Nav ───────────────────────────────────
@ -610,6 +612,10 @@ const en = {
backToLogin: 'Back to login',
registerConsent:
'By creating an account you agree to our <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>.',
loginFailed: 'Login failed',
registrationFailed: 'Registration failed',
oauthFailed: 'OAuth login failed',
passwordResetFailed: 'Password reset request failed',
},
// ── Upgrade Modal ──────────────────────────────────
@ -704,6 +710,11 @@ const en = {
outstanding: 'Outstanding',
distance: 'Distance',
crimeType: 'Crime type',
qualificationLevel: 'Qualification level',
tenureType: 'Tenure type',
crimeWindow: 'Averaging period',
crimeWindow7y: '7-year',
crimeWindow2y: '2-year',
ethnicity: 'Ethnicity',
poiType: 'POI type',
party: 'Party',
@ -794,6 +805,7 @@ const en = {
refiningResults: 'Refining results...',
weeklyLimitReached:
'Youve reached the weekly AI usage limit. Itll reset automatically next week.',
generateFailed: 'Failed to generate filters',
},
// ── Map Legend ─────────────────────────────────────
@ -813,6 +825,23 @@ const en = {
ogSchools: 'Schools',
ogCrimeStats: 'Crime stats',
ogTransport: 'Transport',
basemap: {
standard: 'Map',
satellite: 'Satellite',
},
error: {
heading: 'The map ran into a problem',
body: 'This can happen when your browsers graphics context is interrupted.',
reload: 'Reload the map',
},
actualListings: {
label: 'Listings',
show: 'Show actual listings',
hide: 'Hide actual listings',
},
poi: {
zoomInToSeeDetails: 'Zoom in to see details',
},
},
// ── Properties Pane ────────────────────────────────
@ -890,6 +919,20 @@ const en = {
crimeDataEnds: 'Police data for this area ends {{year}}',
residents: 'Residents',
residentsTooltip: 'Usual residents (ONS Census 2021)',
crimeWindow7y: 'Last 7 years',
crimeWindow2y: 'Last 2 years',
crimeWindowLabel: 'Time period',
crimeCardTitle: '{{name}} per year',
crimeRecordsToggle: 'Show individual crimes',
crimeRecordsHide: 'Hide individual crimes',
crimeRecordsCount: '{{count}} crimes',
crimeRecordsLoading: 'Loading crimes…',
crimeRecordsEmpty: 'No individual crimes recorded',
crimeRecordsError: 'Could not load crimes',
crimeRecordsLoadMore: 'Load more',
crimeNoLocation: 'Location withheld',
crimeOutcomeUnknown: 'Outcome not recorded',
crimeYearPointTooltip: '{{year}}: {{rate}}/yr',
},
// ── Street View ────────────────────────────────────
@ -914,6 +957,7 @@ const en = {
searchOn: 'Search {{radius}} on',
exact: 'exact',
outcodeNotRecognised: 'Outcode not recognised',
radiusMi: '{{count}} mi radius',
},
// ── Location Search ────────────────────────────────
@ -971,6 +1015,7 @@ const en = {
showcaseJourneyRoutes: 'Journey routes',
showcaseNearby: '{{value}} nearby',
showcasePoliticalVoteShare: 'Political vote share',
showcaseGe2024: '2024 GE',
showcaseLotsMore: '...and lots more',
showcaseMinutes: '{{count}} min',
showcaseSendShortlist: 'Send the shortlist',
@ -1395,6 +1440,8 @@ const en = {
noShareLinksYet: 'No shared links yet',
copyShareLink: 'Copy shared link',
clicksLabel: 'clicks',
fetchShareLinksError: 'Failed to fetch share links',
updateNewsletterError: 'Failed to update newsletter',
},
// ── Saved Page ─────────────────────────────────────
@ -1409,6 +1456,12 @@ const en = {
deleteSearchConfirm: 'Are you sure you want to delete this saved search? This cant be undone.',
isBeingUpdated: '<strong>{{name}}</strong> is being updated',
updating: 'Updating...',
loadFailed: 'Failed to load searches',
saveFailed: 'Failed to save search',
deleteFailed: 'Failed to delete search',
updateNotesFailed: 'Failed to update notes',
updateNameFailed: 'Failed to update name',
updateFailed: 'Failed to update search',
},
// ── Invites Page ───────────────────────────────────
@ -1428,6 +1481,7 @@ const en = {
created: 'Created',
redeemed: 'Redeemed',
pending: 'Pending',
createInviteError: 'Failed to create invite',
},
// ── Invite Page ────────────────────────────────────
@ -1454,6 +1508,105 @@ const en = {
youAlreadyHaveLicense: 'You already have a license',
accountHasFullAccess: 'Your account already has full access.',
failedToValidate: 'Failed to validate invite link',
redeemFailed: 'Failed to redeem invite',
},
// ── Error Boundaries ───────────────────────────────
errors: {
appCrashTitle: 'Something went wrong',
appCrashBody: 'Refresh the page to try again.',
},
// ── Listing Popups ─────────────────────────────────
listing: {
viewed: 'Viewed',
openListing: 'Open listing',
listings: 'listings',
listing: 'Listing',
showingOf: 'Showing {{visible}} of {{count}}',
groupedNear: 'Grouped near this map position',
},
// ── Map Overlays Pane ──────────────────────────────
overlays: {
heading: 'Overlays',
baseMap: 'Base map',
colourOpacity: 'Colour opacity',
dataOverlays: 'Data overlays',
about: 'About {{name}}',
zoomWarning: 'Zoom in further to see the selected overlay.',
zoomWarning_other: 'Zoom in further to see the selected overlays.',
noise: {
label: 'Noise',
detail:
'Defra Strategic Noise Mapping Round 4 (2022), combining road, rail, and airport sources. Values are the EU-standard Lden metric (day-evening-night 24-hour weighted average), modelled on a 10m grid at 4m above ground. Brighter areas indicate higher modelled noise. Licensed under the Open Government Licence v3.0.',
},
crimeHotspots: {
label: 'Crime hotspots',
detail:
'Client-side heatmap of street-level crimes published by police.uk over the most recent months. Police.uk coordinates are anonymised snap-to-grid points, not exact offence locations, so the heatmap should be read as an approximation of relative density rather than a precise map of incidents.',
},
treesOutsideWoodlands: {
label: 'Trees & woodland',
detail:
'Forest Research Trees Outside Woodland (TOW) v1 canopy polygons — lone trees and groups of trees — unioned with National Forest Inventory (NFI) woodland blocks (≥0.5 ha) that TOW deliberately excludes. Together they cover both street trees and actual woods. Polygon opacity scales with canopy area.',
},
propertyBorders: {
label: 'Property borders',
detail:
'HM Land Registry INSPIRE Index Polygons — the position and indicative extent of freehold registered property in England & Wales, drawn as outlines at street level. These are "general boundaries" for guidance only, not the precise legal boundary of a property, and they exclude leasehold-only interests and unregistered land (roughly 8590% of freehold land is covered). This information is subject to Crown copyright and database rights 2026 and is reproduced with the permission of HM Land Registry. The polygons (including the associated geometry, namely x, y co-ordinates) are subject to Crown copyright and database rights 2026 Ordnance Survey AC0000851063. Licensed under the Open Government Licence v3.0.',
},
newDevelopments: {
label: 'New developments',
detail:
'A forward-looking pipeline of new housing. Blue markers mark sites on the statutory MHCLG Brownfield Land registers — each carrying an estimated net-dwelling capacity and planning-permission status — together with Homes England Land Hub disposal sites. These show where new homes are planned, often years before they appear in EPC or sale records. Dwelling figures are capacity estimates, not commitments, and a site on a register is an opportunity rather than a guarantee of construction. Licensed under the Open Government Licence v3.0.',
},
},
// ── Crime-type overlay selector ────────────────────
crimeTypes: {
violenceAndSexualOffences: 'Violence & sexual offences',
antiSocialBehaviour: 'Anti-social behaviour',
criminalDamageAndArson: 'Criminal damage & arson',
publicOrder: 'Public order',
shoplifting: 'Shoplifting',
vehicleCrime: 'Vehicle crime',
burglary: 'Burglary',
otherTheft: 'Other theft',
theftFromThePerson: 'Theft from the person',
bicycleTheft: 'Bicycle theft',
drugs: 'Drugs',
robbery: 'Robbery',
possessionOfWeapons: 'Possession of weapons',
otherCrime: 'Other crime',
},
// ── Journey Instructions ───────────────────────────
journey: {
bus: 'Bus',
lineSuffix: 'line',
},
// ── POI Popups ─────────────────────────────────────
poiPopup: {
school: {
capacity: 'Capacity',
type: 'Type',
ages: 'Ages',
gender: 'Gender',
pupilsLabel: 'Pupils',
pupils: 'pupils',
freeMeal: 'Free meal',
ofsted: 'Ofsted',
sixthForm: 'Sixth form',
religion: 'Religion',
admissions: 'Admissions',
trust: 'Trust',
address: 'Address',
localAuthority: 'LA',
head: 'Head',
website: 'Website',
},
},
// ── Format / Time ──────────────────────────────────
@ -1495,6 +1648,9 @@ const en = {
step6Title: 'Whats nearby?',
step6Content:
'Toggle schools, shops, stations, parks, and restaurants on the map to see whats within reach.',
step7Title: 'Layer on more context',
step7Content:
'Toggle overlays like crime hotspots, noise, tree cover, property boundaries, and new-build sites on the map, and switch the basemap to suit.',
},
// ── Server-derived values ──────────────────────────
@ -1517,11 +1673,11 @@ const en = {
'Property type': 'Property type',
'Leasehold/Freehold': 'Leasehold/Freehold',
'Last known price': 'Last known price',
'Estimated price': 'Estimated price',
'Estimated current price': 'Estimated current price',
'Estimated price': 'Est. price',
'Estimated current price': 'Est. current price',
'Price per sqm': 'Price per sqm',
'Est. price per sqm': 'Est. price per sqm',
'Estimated monthly rent': 'Estimated monthly rent',
'Estimated monthly rent': 'Est. monthly rent',
'Total floor area (sqm)': 'Total floor area (sqm)',
'Number of bedrooms & living rooms': 'Number of bedrooms & living rooms',
'Construction year': 'Construction year',
@ -1552,23 +1708,56 @@ const en = {
'Housing Conditions Score': 'Housing Conditions Score',
'Air Quality and Road Safety Score': 'Air Quality and Road Safety Score',
// ─ Feature names (Crime) ─
'Serious crime (avg/yr)': 'Serious crime (density)',
'Minor crime (avg/yr)': 'Minor crime (density)',
'Violence and sexual offences (avg/yr)': 'Violence and sexual offences (density)',
'Burglary (avg/yr)': 'Burglary (density)',
'Robbery (avg/yr)': 'Robbery (density)',
'Vehicle crime (avg/yr)': 'Vehicle crime (density)',
'Anti-social behaviour (avg/yr)': 'Anti-social behaviour (density)',
'Criminal damage and arson (avg/yr)': 'Criminal damage and arson (density)',
'Other theft (avg/yr)': 'Other theft (density)',
'Theft from the person (avg/yr)': 'Theft from the person (density)',
'Shoplifting (avg/yr)': 'Shoplifting (density)',
'Bicycle theft (avg/yr)': 'Bicycle theft (density)',
'Drugs (avg/yr)': 'Drugs (density)',
'Possession of weapons (avg/yr)': 'Possession of weapons (density)',
'Public order (avg/yr)': 'Public order (density)',
'Other crime (avg/yr)': 'Other crime (density)',
// ─ Feature names (Crime) — population-normalised rate, 7-year & 2-year ─
'Serious crime (/yr, 7y)': 'Serious crime (per year, 7yr)',
'Serious crime (/yr, 2y)': 'Serious crime (per year, 2yr)',
'Minor crime (/yr, 7y)': 'Minor crime (per year, 7yr)',
'Minor crime (/yr, 2y)': 'Minor crime (per year, 2yr)',
'Violence and sexual offences (/yr, 7y)':
'Violence & sexual offences (per year, 7yr)',
'Violence and sexual offences (/yr, 2y)':
'Violence & sexual offences (per year, 2yr)',
'Burglary (/yr, 7y)': 'Burglary (per year, 7yr)',
'Burglary (/yr, 2y)': 'Burglary (per year, 2yr)',
'Robbery (/yr, 7y)': 'Robbery (per year, 7yr)',
'Robbery (/yr, 2y)': 'Robbery (per year, 2yr)',
'Vehicle crime (/yr, 7y)': 'Vehicle crime (per year, 7yr)',
'Vehicle crime (/yr, 2y)': 'Vehicle crime (per year, 2yr)',
'Anti-social behaviour (/yr, 7y)': 'Anti-social behaviour (per year, 7yr)',
'Anti-social behaviour (/yr, 2y)': 'Anti-social behaviour (per year, 2yr)',
'Criminal damage and arson (/yr, 7y)': 'Criminal damage & arson (per year, 7yr)',
'Criminal damage and arson (/yr, 2y)': 'Criminal damage & arson (per year, 2yr)',
'Other theft (/yr, 7y)': 'Other theft (per year, 7yr)',
'Other theft (/yr, 2y)': 'Other theft (per year, 2yr)',
'Theft from the person (/yr, 7y)': 'Theft from the person (per year, 7yr)',
'Theft from the person (/yr, 2y)': 'Theft from the person (per year, 2yr)',
'Shoplifting (/yr, 7y)': 'Shoplifting (per year, 7yr)',
'Shoplifting (/yr, 2y)': 'Shoplifting (per year, 2yr)',
'Bicycle theft (/yr, 7y)': 'Bicycle theft (per year, 7yr)',
'Bicycle theft (/yr, 2y)': 'Bicycle theft (per year, 2yr)',
'Drugs (/yr, 7y)': 'Drugs (per year, 7yr)',
'Drugs (/yr, 2y)': 'Drugs (per year, 2yr)',
'Possession of weapons (/yr, 7y)': 'Possession of weapons (per year, 7yr)',
'Possession of weapons (/yr, 2y)': 'Possession of weapons (per year, 2yr)',
'Public order (/yr, 7y)': 'Public order (per year, 7yr)',
'Public order (/yr, 2y)': 'Public order (per year, 2yr)',
'Other crime (/yr, 7y)': 'Other crime (per year, 7yr)',
'Other crime (/yr, 2y)': 'Other crime (per year, 2yr)',
// Bare crime-type labels (per-type breakdown rows + records list).
// ("Burglary" is already defined in the specific-crime overflow keys below.)
'Violence and sexual offences': 'Violence & sexual offences',
Robbery: 'Robbery',
'Vehicle crime': 'Vehicle crime',
'Anti-social behaviour': 'Anti-social behaviour',
'Criminal damage and arson': 'Criminal damage & arson',
'Other theft': 'Other theft',
'Theft from the person': 'Theft from the person',
Shoplifting: 'Shoplifting',
'Bicycle theft': 'Bicycle theft',
Drugs: 'Drugs',
'Possession of weapons': 'Possession of weapons',
'Public order': 'Public order',
'Other crime': 'Other crime',
// ─ Feature names (Neighbours) ─
'Median age': 'Median age',