This commit is contained in:
Andras Schmelczer 2026-05-31 13:17:11 +01:00
parent c995f12f8b
commit 8dc939d761
44 changed files with 3540 additions and 2159478 deletions

View file

@ -14,6 +14,7 @@ FINDER_DATA := ./finder/data
TILES := $(DATA_DIR)/uk.pmtiles
SATELLITE_TILES := $(DATA_DIR)/satellite.pmtiles
SATELLITE_HIGHRES_TILES := $(DATA_DIR)/satellite_highres.pmtiles
ARCGIS := $(DATA_DIR)/arcgis_data.parquet
PRICE_PAID := $(DATA_DIR)/price-paid-complete.parquet
IOD := $(DATA_DIR)/IoD2025_Scores.parquet
@ -33,14 +34,14 @@ ACTUAL_LISTINGS_RAW := $(FINDER_DATA)/online_listings_buy.parquet
ACTUAL_LISTINGS_ENRICHED := $(FINDER_DATA)/online_listings_buy_enriched.parquet
ETHNICITY := $(DATA_DIR)/ethnicity_by_la.parquet
CRIME_DIR := $(DATA_DIR)/crime
CRIME := $(DATA_DIR)/crime_by_lsoa.parquet
CRIME_BY_YEAR := $(DATA_DIR)/crime_by_year_by_lsoa.parquet
CRIME := $(DATA_DIR)/crime_by_postcode.parquet
CRIME_BY_YEAR := $(DATA_DIR)/crime_by_postcode_by_year.parquet
CRIME_STAMP := $(CRIME_DIR)/.downloaded
LSOA_LOOKUP := $(DATA_DIR)/lsoa_2011_to_2021.parquet
NOISE := $(DATA_DIR)/road_noise.parquet
NOISE_OVERLAY_TILES := $(DATA_DIR)/noise_lden_10m.pmtiles
CRIME_HOTSPOT_TILES := $(DATA_DIR)/crime_hotspots.pmtiles
TREE_OVERLAY_TILES := $(DATA_DIR)/trees_outside_woodlands.pmtiles
PROPERTY_BORDER_TILES := $(DATA_DIR)/property_borders.pmtiles
OFSTED := $(DATA_DIR)/ofsted.parquet
GIAS := $(DATA_DIR)/gias.parquet
NAPTAN := $(DATA_DIR)/naptan.parquet
@ -61,12 +62,12 @@ GREENSPACE := $(DATA_DIR)/greenspace_water.parquet
OS_GREENSPACE := $(DATA_DIR)/os_greenspace.parquet
PBF := $(DATA_DIR)/england-latest.osm.pbf
FR_TOW := $(DATA_DIR)/FR_TOW_V1_ALL.zip
NFI := $(DATA_DIR)/NFI_WOODLAND_ENGLAND.zip
TREE_DENSITY_PC := $(DATA_DIR)/tree_density_by_postcode.parquet
TREE_DENSITY_STREETS := $(DATA_DIR)/tree_density_by_street.parquet
TREE_DENSITY_ADDR := $(DATA_DIR)/tree_density_by_address.parquet
OFS_REGISTER := $(DATA_DIR)/ofs_register.xlsx
PLACES := $(DATA_DIR)/places.parquet
LSOA_POP := $(DATA_DIR)/lsoa_population.parquet
MEDIAN_AGE := $(DATA_DIR)/median_age.parquet
ELECTION := $(DATA_DIR)/election_results.parquet
ENGLAND_BOUNDARY := $(DATA_DIR)/england_boundary.geojson
@ -80,6 +81,8 @@ MAP_ASSETS_STAMP := $(MAP_ASSETS_DIR)/.done
PMTILES_VERSION := 1.22.3
PMTILES_BIN := $(DATA_DIR)/pmtiles
SATELLITE_TILE_ARGS ?=
SATELLITE_HIGHRES_ARGS ?=
GDAL_ECW_IMAGE ?= perfect-postcode/gdal-ecw:latest
VALIDATE_OUTPUTS := uv run python -m pipeline.validate_outputs
@ -104,27 +107,29 @@ MAP_ASSETS_DEPS := pipeline/download/map_assets.py pipeline/transform/transform_
# ── Phony aliases ─────────────────────────────────────────────────────────────
.PHONY: prepare merge tiles satellite-tiles overlay-tiles noise-overlay-tiles crime-hotspot-tiles tree-overlay-tiles \
.PHONY: prepare merge tiles satellite-tiles satellite-highres-tiles overlay-tiles noise-overlay-tiles crime-hotspot-tiles tree-overlay-tiles property-border-tiles \
download-arcgis download-price-paid download-deprivation download-ethnicity \
download-naptan download-pois download-grocery-retail-points download-ofsted download-gias download-broadband download-conservation-areas download-listed-buildings download-rental-prices \
download-postcodes download-noise download-inspire download-crime \
download-oa-boundaries download-uprn-lookup download-transit-network download-greenspace download-os-greenspace download-pbf download-fr-tow download-ofs-register download-places download-lsoa-population download-median-age download-england-boundary download-rightmove-outcodes \
download-oa-boundaries download-uprn-lookup download-transit-network download-greenspace download-os-greenspace download-pbf download-fr-tow download-nfi download-ofs-register download-places download-median-age download-england-boundary download-rightmove-outcodes \
download-map-assets \
transform-pois transform-epc-pp transform-crime transform-poi-proximity \
transform-school-proximity transform-tree-density \
generate-postcode-boundaries generate-travel-times enrich-actual-listings
prepare: $(PRICES_STAMP) download-places tiles satellite-tiles overlay-tiles generate-postcode-boundaries download-map-assets generate-travel-times | $(POSTCODES_PQ) $(PROPERTIES_PQ) $(PRICE_INDEX)
$(VALIDATE_OUTPUTS) --parquet $(POSTCODES_PQ) --parquet $(PROPERTIES_PQ) --parquet $(PRICE_INDEX)
prepare: $(PRICES_STAMP) download-places tiles satellite-tiles overlay-tiles property-border-tiles generate-postcode-boundaries download-map-assets generate-travel-times | $(POSTCODES_PQ) $(PROPERTIES_PQ) $(PRICE_INDEX)
$(VALIDATE_OUTPUTS) --parquet $(POSTCODES_PQ) --parquet $(PROPERTIES_PQ) --parquet $(PRICE_INDEX) --postcode-boundary-match "$(POSTCODES_PQ)::$(PC_BOUNDARIES)"
merge: $(MERGE_STAMP) | $(POSTCODES_PQ) $(PROPERTIES_PQ)
$(VALIDATE_OUTPUTS) --parquet $(POSTCODES_PQ) --parquet $(PROPERTIES_PQ)
enrich-actual-listings: $(ACTUAL_LISTINGS_ENRICHED)
tiles: $(TILES) $(SATELLITE_TILES)
tiles: $(TILES) $(SATELLITE_TILES) $(SATELLITE_HIGHRES_TILES)
satellite-tiles: $(SATELLITE_TILES)
overlay-tiles: noise-overlay-tiles crime-hotspot-tiles tree-overlay-tiles
satellite-highres-tiles: $(SATELLITE_HIGHRES_TILES)
overlay-tiles: noise-overlay-tiles crime-hotspot-tiles tree-overlay-tiles property-border-tiles
noise-overlay-tiles: $(NOISE_OVERLAY_TILES)
crime-hotspot-tiles: $(CRIME_HOTSPOT_TILES)
tree-overlay-tiles: $(TREE_OVERLAY_TILES)
property-border-tiles: $(PROPERTY_BORDER_TILES)
download-arcgis: $(ARCGIS)
download-price-paid: $(PRICE_PAID)
download-deprivation: $(IOD)
@ -152,9 +157,9 @@ download-greenspace: $(GREENSPACE)
download-os-greenspace: $(OS_GREENSPACE)
download-pbf: $(PBF)
download-fr-tow: $(FR_TOW)
download-nfi: $(NFI)
download-ofs-register: $(OFS_REGISTER)
download-places: $(PLACES)
download-lsoa-population: $(LSOA_POP)
download-median-age: $(MEDIAN_AGE)
download-election-results: $(ELECTION)
download-england-boundary: $(ENGLAND_BOUNDARY)
@ -169,11 +174,12 @@ transform-school-proximity: $(SCHOOL_PROX)
transform-tree-density: $(TREE_DENSITY_PC)
generate-postcode-boundaries: $(PC_BOUNDARIES_STAMP)
$(PC_BOUNDARIES_STAMP): $(OA_BOUNDARIES) $(INSPIRE_STAMP) $(UPRN_LOOKUP) $(PC_BOUNDARIES_DEPS)
$(PC_BOUNDARIES_STAMP): $(OA_BOUNDARIES) $(INSPIRE_STAMP) $(UPRN_LOOKUP) $(ARCGIS) $(PC_BOUNDARIES_DEPS)
@rm -f $@
$(VALIDATE_OUTPUTS) --dir $(INSPIRE_DIR) --zip-glob "$(INSPIRE_DIR)::*.zip"
uv run python -m pipeline.transform.postcode_boundaries \
--uprn $(UPRN_LOOKUP) \
--arcgis $(ARCGIS) \
--oa-boundaries $(OA_BOUNDARIES) \
--inspire $(INSPIRE_DIR) \
--output $(PC_BOUNDARIES)
@ -196,6 +202,14 @@ $(TILES): $(PMTILES_BIN)
$(SATELLITE_TILES): $(PMTILES_BIN) pipeline/download/satellite_tiles.py pipeline/download/tiles.py
uv run python -m pipeline.download.satellite_tiles --output $@ --pmtiles-bin $(PMTILES_BIN) --pmtiles-version $(PMTILES_VERSION) $(SATELLITE_TILE_ARGS)
# High-resolution EA Vertical Aerial Photography (London, OGL v3.0). Part of the
# `tiles` target (and `prepare`). Heavy and Docker-dependent (ECW decode): it
# downloads ~25 GB of ECW and builds the gdal-ecw image first. The server treats
# the output as optional, so a stale/missing file degrades to the Sentinel base.
$(SATELLITE_HIGHRES_TILES): $(PMTILES_BIN) pipeline/download/satellite_highres.py pipeline/download/tiles.py docker/gdal-ecw/Dockerfile
docker build -t $(GDAL_ECW_IMAGE) docker/gdal-ecw
uv run python -m pipeline.download.satellite_highres --output $@ --pmtiles-bin $(PMTILES_BIN) --pmtiles-version $(PMTILES_VERSION) --gdal-image $(GDAL_ECW_IMAGE) $(SATELLITE_HIGHRES_ARGS)
# EPC requires manual registration — fail with instructions
$(EPC):
@echo ""
@ -238,6 +252,11 @@ $(FR_TOW):
curl -L -A "Mozilla/5.0" -o $@.tmp "https://www.mediafire.com/file_premium/p5fve6wswwwjqrq/FR_TOW_V1_ALL.zip/file"
mv $@.tmp $@
$(NFI):
@mkdir -p $(DATA_DIR)
curl -L -A "Mozilla/5.0" -o $@.tmp "https://opendata.arcgis.com/api/v3/datasets/83ff06ae0fd34452af9efaddd9d221e8_0/downloads/data?format=shp&spatialRefId=27700"
mv $@.tmp $@
$(OFS_REGISTER):
@mkdir -p $(DATA_DIR)
curl -fL -A "Mozilla/5.0" -o $@.tmp https://register-api.officeforstudents.org.uk/api/Download/
@ -276,8 +295,11 @@ $(NOISE_OVERLAY_TILES): $(PMTILES_BIN) pipeline/transform/noise_overlay_tiles.py
$(CRIME_HOTSPOT_TILES): $(CRIME_STAMP) pipeline/transform/crime_hotspot_tiles.py pipeline/transform/crime.py
uv run python -m pipeline.transform.crime_hotspot_tiles --input $(CRIME_DIR) --output $@
$(TREE_OVERLAY_TILES): $(FR_TOW) pipeline/transform/tree_overlay_tiles.py pipeline/transform/tree_density.py
uv run python -m pipeline.transform.tree_overlay_tiles --tow-zip $(FR_TOW) --output $@
$(TREE_OVERLAY_TILES): $(FR_TOW) $(NFI) pipeline/transform/tree_overlay_tiles.py pipeline/transform/tree_density.py
uv run python -m pipeline.transform.tree_overlay_tiles --tow-zip $(FR_TOW) --nfi-zip $(NFI) --output $@
$(PROPERTY_BORDER_TILES): $(INSPIRE_STAMP) pipeline/transform/property_border_tiles.py pipeline/transform/postcode_boundaries/inspire.py
uv run python -m pipeline.transform.property_border_tiles --inspire $(INSPIRE_DIR) --output $@
$(INSPIRE_STAMP): $(INSPIRE_DOWNLOAD_DEPS)
@rm -f $@
@ -309,9 +331,6 @@ $(OS_GREENSPACE):
$(PLACES): $(PBF) $(ENGLAND_BOUNDARY) $(NAPTAN) $(OFS_REGISTER) $(ARCGIS)
uv run python -m pipeline.download.places --output $@ --pbf $(PBF) --boundary $(ENGLAND_BOUNDARY) --naptan $(NAPTAN) --university-register $(OFS_REGISTER) --postcodes $(ARCGIS)
$(LSOA_POP):
uv run python -m pipeline.download.lsoa_population --output $@
$(MEDIAN_AGE):
uv run python -m pipeline.download.median_age --output $@
@ -339,13 +358,9 @@ $(POIS_FILTERED): $(POIS_RAW) $(NAPTAN) $(GROCERY_RETAIL_POINTS) $(GIAS) $(OFSTE
$(EPC_PP): $(PRICE_PAID) $(EPC) pipeline/transform/join_epc_pp.py pipeline/utils/fuzzy_join.py
uv run python -m pipeline.transform.join_epc_pp --epc $(EPC) --price-paid $(PRICE_PAID) --output $@
$(CRIME) $(CRIME_BY_YEAR) &: $(CRIME_STAMP) $(LSOA_LOOKUP) pipeline/transform/crime.py
$(CRIME) $(CRIME_BY_YEAR) &: $(CRIME_STAMP) $(PC_BOUNDARIES) pipeline/transform/crime_spatial.py pipeline/transform/postcode_boundaries/loader.py pipeline/transform/crime.py
$(VALIDATE_OUTPUTS) --file $(CRIME_DIR)/archive_manifest.json --glob "$(CRIME_DIR)::**/*-street.csv"
uv run python -m pipeline.transform.crime --input $(CRIME_DIR) --output $(CRIME) --output-by-year $(CRIME_BY_YEAR) --lsoa-lookup $(LSOA_LOOKUP)
$(LSOA_LOOKUP): pipeline/download/lsoa_2011_to_2021.py
uv run python -m pipeline.download.lsoa_2011_to_2021 --output $@
$(VALIDATE_OUTPUTS) --parquet $@
uv run python -m pipeline.transform.crime_spatial --input $(CRIME_DIR) --boundaries $(PC_BOUNDARIES)/units --output $(CRIME) --output-by-year $(CRIME_BY_YEAR)
$(POI_PROXIMITY): $(ARCGIS) $(POIS_FILTERED) $(OS_GREENSPACE) $(POI_PROXIMITY_DEPS)
uv run python -m pipeline.transform.poi_proximity --arcgis $(ARCGIS) --pois $(POIS_FILTERED) --greenspace $(OS_GREENSPACE) --output $@
@ -353,9 +368,10 @@ $(POI_PROXIMITY): $(ARCGIS) $(POIS_FILTERED) $(OS_GREENSPACE) $(POI_PROXIMITY_DE
$(SCHOOL_PROX): $(OFSTED) $(ARCGIS) pipeline/transform/school_proximity.py pipeline/utils/poi_counts.py
uv run python -m pipeline.transform.school_proximity --ofsted $(OFSTED) --arcgis $(ARCGIS) --output $@
$(TREE_DENSITY_PC): $(FR_TOW) $(ARCGIS) $(PRICE_PAID) $(TREE_DENSITY_DEPS)
$(TREE_DENSITY_PC): $(FR_TOW) $(NFI) $(ARCGIS) $(PRICE_PAID) $(TREE_DENSITY_DEPS)
uv run python -m pipeline.transform.tree_density \
--tow-zip $(FR_TOW) \
--nfi-zip $(NFI) \
--arcgis $(ARCGIS) \
--price-paid $(PRICE_PAID) \
--output-postcodes $(TREE_DENSITY_PC) \
@ -371,6 +387,7 @@ $(PC_BOUNDARIES):
@echo "Generate it with:"
@echo " uv run python -m pipeline.transform.postcode_boundaries \\"
@echo " --uprn $(UPRN_LOOKUP) \\"
@echo " --arcgis $(ARCGIS) \\"
@echo " --oa-boundaries $(OA_BOUNDARIES) \\"
@echo " --inspire $(INSPIRE_DIR) \\"
@echo " --output $@"
@ -380,7 +397,7 @@ $(PC_BOUNDARIES):
# ── Final merge → postcode.parquet + properties.parquet ──────────────────────
$(MERGE_STAMP): $(EPC_PP) $(ARCGIS) $(IOD) $(POI_PROXIMITY) \
$(ETHNICITY) $(CRIME) $(NOISE) $(SCHOOL_PROX) $(BROADBAND) $(CONSERVATION_AREAS) $(LISTED_BUILDINGS) $(RENTAL) $(LSOA_POP) $(MEDIAN_AGE) $(ELECTION) $(TREE_DENSITY_PC) $(MERGE_DEPS)
$(ETHNICITY) $(CRIME) $(NOISE) $(SCHOOL_PROX) $(BROADBAND) $(CONSERVATION_AREAS) $(LISTED_BUILDINGS) $(RENTAL) $(MEDIAN_AGE) $(ELECTION) $(TREE_DENSITY_PC) $(MERGE_DEPS)
@rm -f $@
uv run python -m pipeline.transform.merge \
--epc-pp $(EPC_PP) \
@ -395,7 +412,6 @@ $(MERGE_STAMP): $(EPC_PP) $(ARCGIS) $(IOD) $(POI_PROXIMITY) \
--conservation-areas $(CONSERVATION_AREAS) \
--listed-buildings $(LISTED_BUILDINGS) \
--rental-prices $(RENTAL) \
--lsoa-population $(LSOA_POP) \
--median-age $(MEDIAN_AGE) \
--election-results $(ELECTION) \
--tree-density-postcodes $(TREE_DENSITY_PC) \
@ -423,7 +439,7 @@ $(ACTUAL_LISTINGS_ENRICHED): $(ACTUAL_LISTINGS_RAW) $(EPC) \
$(EPC_PP) $(ARCGIS) $(IOD) $(POI_PROXIMITY) \
$(ETHNICITY) $(CRIME) $(NOISE) $(SCHOOL_PROX) $(BROADBAND) \
$(CONSERVATION_AREAS) $(LISTED_BUILDINGS) $(RENTAL) \
$(LSOA_POP) $(MEDIAN_AGE) $(ELECTION) $(TREE_DENSITY_PC) \
$(MEDIAN_AGE) $(ELECTION) $(TREE_DENSITY_PC) \
$(MERGE_DEPS) pipeline/utils/fuzzy_join.py
uv run python -m pipeline.transform.merge \
--epc-pp $(EPC_PP) \
@ -438,7 +454,6 @@ $(ACTUAL_LISTINGS_ENRICHED): $(ACTUAL_LISTINGS_RAW) $(EPC) \
--conservation-areas $(CONSERVATION_AREAS) \
--listed-buildings $(LISTED_BUILDINGS) \
--rental-prices $(RENTAL) \
--lsoa-population $(LSOA_POP) \
--median-age $(MEDIAN_AGE) \
--election-results $(ELECTION) \
--tree-density-postcodes $(TREE_DENSITY_PC) \

File diff suppressed because one or more lines are too long

View file

@ -50,13 +50,10 @@
" sys.path.insert(0, str(ROOT))\n",
"\n",
"from pipeline.transform.tree_density import ( # noqa: E402\n",
" DEFAULT_TOW_TYPES,\n",
" _layers,\n",
" _metric_columns,\n",
" _parse_csv_arg,\n",
" _postcode_points,\n",
" _tow_dataset_path,\n",
" _where_for_tow_types,\n",
")\n",
"\n",
"DATA_DIR = ROOT / \"property-data\"\n",
@ -72,7 +69,6 @@
"BOUNDARY_EXPANSION_M = 50\n",
"CANDIDATE_SAMPLE_SIZE = 60\n",
"\n",
"tow_types = _parse_csv_arg(\",\".join(DEFAULT_TOW_TYPES))\n",
"density_col, area_col, count_col, height_col = _metric_columns(50)\n"
]
},
@ -127,14 +123,12 @@
"def intersecting_tow_features(dataset_path: str, layer_names: list[str], target_bng):\n",
" bbox = target_bng.bounds\n",
" rows = []\n",
" where = _where_for_tow_types(tow_types)\n",
"\n",
" for layer in layer_names:\n",
" with pyogrio.open_arrow(\n",
" dataset_path,\n",
" layer=layer,\n",
" columns=[\"Woodland_Type\", \"TOW_Area_M\", \"MEANHT\"],\n",
" where=where,\n",
" bbox=bbox,\n",
" batch_size=4096,\n",
" use_pyarrow=True,\n",

View file

@ -51,7 +51,7 @@ services:
BUGSINK_RELEASE: ${BUGSINK_RELEASE:-}
BUGSINK_SEND_DEFAULT_PII: ${BUGSINK_SEND_DEFAULT_PII:-false}
ACTUAL_LISTINGS_PATH: /app/finder-data/online_listings_buy_enriched.parquet
CRIME_BY_YEAR_PATH: /app/data/crime_by_year_by_lsoa.parquet
CRIME_BY_YEAR_PATH: /app/data/crime_by_postcode_by_year.parquet
depends_on:
screenshot:
condition: service_healthy

View file

@ -556,7 +556,9 @@ export default function App() {
initialViewState={initialViewState}
initialPOICategories={urlState.poiCategories}
initialOverlays={urlState.overlays}
initialCrimeTypes={urlState.crimeTypes}
initialBasemap={urlState.basemap}
initialColorOpacity={urlState.colorOpacity}
initialTab={urlState.tab}
initialLoading={initialLoading}
theme={theme}
@ -662,7 +664,9 @@ export default function App() {
initialViewState={initialViewState}
initialPOICategories={mapUrlState.poiCategories}
initialOverlays={mapUrlState.overlays}
initialCrimeTypes={mapUrlState.crimeTypes}
initialBasemap={mapUrlState.basemap}
initialColorOpacity={mapUrlState.colorOpacity}
initialTab={mapUrlState.tab}
initialLoading={initialLoading}
theme={theme}

View file

@ -74,11 +74,11 @@ const DEMO_FEATURES: FeatureMeta[] = [
prefix: '£',
},
{
name: 'Serious crime per 1k residents (avg/yr)',
name: 'Serious crime (avg/yr)',
type: 'numeric',
group: 'Crime',
min: 0,
max: 120,
max: 40,
step: 1,
},
{

View file

@ -9,103 +9,85 @@ type LearnTab = 'data-sources' | 'faq' | 'articles' | 'support';
interface DataSourceDef {
id: string;
url: string;
license: string;
optOutUrl?: string;
}
const DATA_SOURCE_DEFS: DataSourceDef[] = [
{
id: 'price-paid',
url: 'https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads',
license: 'Open Government Licence v3.0',
},
{
id: 'epc',
url: 'https://epc.opendatacommunities.org/downloads/domestic',
license: 'Open Government Licence v3.0',
optOutUrl:
'https://www.gov.uk/guidance/energy-performance-certificates-opt-out-of-public-disclosure',
},
{
id: 'nspl',
url: 'https://www.arcgis.com/sharing/rest/content/items/077631e063eb4e1ab43575d01381ec33/data',
license: 'Open Government Licence v3.0',
},
{
id: 'iod',
url: 'https://www.gov.uk/government/statistics/english-indices-of-deprivation-2025',
license: 'Open Government Licence v3.0',
},
{
id: 'ethnicity',
url: 'https://www.ethnicity-facts-figures.service.gov.uk/uk-population-by-ethnicity/national-and-regional-populations/regional-ethnic-diversity/latest/#download-the-data',
license: 'Open Government Licence v3.0',
},
{ id: 'crime', url: 'https://data.police.uk/data/', license: 'Open Government Licence v3.0' },
{ id: 'crime', license: 'Open Government Licence v3.0' },
{
id: 'osm-pois',
url: 'https://download.geofabrik.de/europe/great-britain-latest.osm.pbf',
license: 'Open Data Commons Open Database License (ODbL)',
},
{
id: 'geolytix-retail-points',
url: 'https://geolytix.com/blog/supermarket-retail-points/',
license: 'GEOLYTIX Open Data License',
},
{
id: 'os-open-greenspace',
url: 'https://osdatahub.os.uk/downloads/open/OpenGreenspace',
license: 'Open Government Licence v3.0',
},
{
id: 'forest-research-tow',
url: 'https://www.forestresearch.gov.uk/tools-and-resources/national-trees-outside-woodland-map/',
license: 'Open Government Licence v3.0',
},
{
id: 'nfi-woodland',
license: 'Open Government Licence v3.0',
},
{
id: 'conservation-areas',
url: 'https://www.planning.data.gov.uk/dataset/conservation-area',
license: 'Open Government Licence v3.0',
},
{
id: 'listed-buildings',
url: 'https://opendata-historicengland.hub.arcgis.com/datasets/historicengland::national-heritage-list-for-england-nhle/explore?layer=0',
license: 'Open Government Licence v3.0',
},
{
id: 'naptan',
url: 'https://naptan.dft.gov.uk/naptan/schema/2.4/doc/NaPTANSchemaGuide-2.4-v0.57.pdf',
license: 'Open Government Licence v3.0',
},
{
id: 'noise',
url: 'https://environment.data.gov.uk/spatialdata/road-noise-all-metrics-england-round-4/wcs',
license: 'Open Government Licence v3.0',
},
{
id: 'ofsted',
url: 'https://www.gov.uk/government/statistical-data-sets/monthly-management-information-ofsteds-school-inspections-outcomes',
license: 'Open Government Licence v3.0',
},
{
id: 'broadband',
url: 'https://www.ofcom.org.uk/phones-and-broadband/coverage-and-speeds/connected-nations-20252/data-downloads-2025',
license: 'Open Government Licence v3.0',
},
{
id: 'council-tax',
url: 'https://www.gov.uk/government/statistics/council-tax-levels-set-by-local-authorities-in-england-2025-to-2026',
license: 'Open Government Licence v3.0',
},
{
id: 'ons-rental',
url: 'https://www.ons.gov.uk/peoplepopulationandcommunity/housing/datasets/privaterentalmarketsummarystatisticsinengland',
license: 'Open Government Licence v3.0',
},
{
id: 'election-results',
url: 'https://electionresults.parliament.uk/general-elections/6',
license: 'Open Parliament Licence v3.0',
},
];
@ -138,6 +120,7 @@ const DS_KEYS: Record<string, [string, string, string]> = {
'learnPage.dsGreenspaceUse',
],
'forest-research-tow': ['learnPage.dsTowName', 'learnPage.dsTowOrigin', 'learnPage.dsTowUse'],
'nfi-woodland': ['learnPage.dsNfiName', 'learnPage.dsNfiOrigin', 'learnPage.dsNfiUse'],
'conservation-areas': [
'learnPage.dsConservationAreasName',
'learnPage.dsConservationAreasOrigin',
@ -358,26 +341,6 @@ export default function LearnPage() {
<p className="text-sm text-warm-700 dark:text-warm-300 mb-3">
{tDynamic(useKey)}
</p>
<a
href={source.url}
target="_blank"
rel="noopener noreferrer"
className="text-sm text-teal-600 dark:text-teal-400 hover:text-teal-800 dark:hover:text-teal-300 hover:underline break-all"
>
{source.url}
</a>
{source.optOutUrl && (
<div className="mt-2">
<a
href={source.optOutUrl}
target="_blank"
rel="noopener noreferrer"
className="text-sm text-teal-600 dark:text-teal-400 hover:text-teal-800 dark:hover:text-teal-300 hover:underline"
>
{t('learnPage.optOut')}
</a>
</div>
)}
</div>
);
})}
@ -393,39 +356,13 @@ export default function LearnPage() {
<ul className="space-y-1.5 text-sm">
<li>{t('learnPage.attrLandRegistry')}</li>
<li>
{t('learnPage.attrOgl')}{' '}
<a
href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/"
target="_blank"
rel="noopener noreferrer"
className="text-teal-400 hover:text-teal-300 hover:underline"
>
{t('learnPage.attrOglLink')}
</a>
.
{t('learnPage.attrOgl')} {t('learnPage.attrOglLink')}.
</li>
<li>{t('learnPage.attrOs')}</li>
<li>{t('learnPage.attrTfl')}</li>
<li>
{t('learnPage.attrOsm')}{' '}
<a
href="https://www.openstreetmap.org/copyright"
target="_blank"
rel="noopener noreferrer"
className="text-teal-400 hover:text-teal-300 hover:underline"
>
{t('learnPage.attrOsmContrib')}
</a>
, {t('learnPage.attrOsmLicense')}{' '}
<a
href="https://opendatacommons.org/licenses/odbl/"
target="_blank"
rel="noopener noreferrer"
className="text-teal-400 hover:text-teal-300 hover:underline"
>
{t('learnPage.attrOsmLicenseLink')}
</a>
.
{t('learnPage.attrOsm')} {t('learnPage.attrOsmContrib')},{' '}
{t('learnPage.attrOsmLicense')} {t('learnPage.attrOsmLicenseLink')}.
</li>
</ul>
</div>

View file

@ -166,6 +166,66 @@ describe('LocationSearch', () => {
});
});
it('waits for nearest postcode selection before flying to a place result', async () => {
window.localStorage.setItem(
RECENT_SEARCHES_STORAGE_KEY,
JSON.stringify([
{
type: 'place',
name: 'E14',
slug: 'e14',
place_type: 'outcode',
lat: 51.505,
lon: -0.01,
},
])
);
const nearestLookup = deferred<Response>();
vi.stubGlobal(
'fetch',
vi.fn((input: string | URL | Request) => {
const url = new URL(String(input), 'http://localhost');
if (url.pathname === '/api/nearest-postcode') return nearestLookup.promise;
return Promise.resolve(new Response(null, { status: 404 }));
})
);
const onFlyTo = vi.fn();
const onLocationSearched = vi.fn();
render(<LocationSearch onFlyTo={onFlyTo} onLocationSearched={onLocationSearched} />);
const input = screen.getByRole('textbox');
fireEvent.focus(input);
fireEvent.mouseDown(await screen.findByRole('button', { name: 'E14' }));
expect(onFlyTo).not.toHaveBeenCalled();
nearestLookup.resolve(
jsonResponse({
postcode: 'E14 2DG',
latitude: 51.506,
longitude: -0.012,
geometry: postcodeGeometry,
})
);
await waitFor(() => {
expect(onLocationSearched).toHaveBeenCalledTimes(1);
});
expect(onLocationSearched).toHaveBeenCalledWith({
postcode: 'E14 2DG',
geometry: postcodeGeometry,
latitude: 51.506,
longitude: -0.012,
zoom: 16,
markerLatitude: 51.505,
markerLongitude: -0.01,
});
expect(onFlyTo).toHaveBeenCalledWith(51.505, -0.01, 16);
expect(onLocationSearched.mock.invocationCallOrder[0]).toBeLessThan(
onFlyTo.mock.invocationCallOrder[0]
);
});
it('keeps only the three most recent local searches', async () => {
vi.stubGlobal(
'fetch',

View file

@ -132,10 +132,7 @@ export default function LocationSearch({
if (result.type === 'place') {
const zoom = ZOOM_FOR_TYPE[result.place_type] ?? 14;
// On mobile the drawer opens after onLocationSearched; MapPage handles
// the fly-to there with the correct viewport inset so the target isn't
// hidden behind the drawer. On desktop fly immediately for snappy feedback.
if (!isMobile) onFlyTo(result.lat, result.lon, zoom);
const flyZoom = result.place_type === 'outcode' ? POSTCODE_SEARCH_ZOOM : zoom;
try {
const params = new URLSearchParams({
lat: String(result.lat),
@ -158,10 +155,11 @@ export default function LocationSearch({
geometry: json.geometry,
latitude: json.latitude,
longitude: json.longitude,
zoom,
zoom: flyZoom,
markerLatitude: result.lat,
markerLongitude: result.lon,
});
if (!isMobile) onFlyTo(result.lat, result.lon, flyZoom);
search.saveRecentSearch(result);
search.clear();
if (isMobile) setExpanded(false);

View file

@ -45,7 +45,8 @@ import type { FeatureFilters } from '../../types';
import { useDeckLayers } from '../../hooks/useDeckLayers';
import { useTranslatedModes, type TravelTimeEntry } from '../../hooks/useTravelTime';
import { ts } from '../../i18n/server';
import type { OverlayId } from '../../lib/overlays';
import { type OverlayId, OVERLAY_MIN_ZOOM } from '../../lib/overlays';
import { CRIME_TYPE_VALUES } from '../../lib/crime-types';
import type { BasemapId } from '../../lib/basemaps';
interface MapProps {
@ -54,7 +55,9 @@ interface MapProps {
usePostcodeView: boolean;
pois: POI[];
activeOverlays?: Set<OverlayId>;
activeCrimeTypes?: Set<string>;
basemap?: BasemapId;
colorOpacity?: number;
actualListings?: ActualListing[];
onViewChange: (params: ViewChangeParams) => void;
viewFeature: string | null;
@ -94,6 +97,7 @@ interface MapProps {
const EMPTY_TRAVEL_ENTRIES: TravelTimeEntry[] = [];
const EMPTY_ACTUAL_LISTINGS: ActualListing[] = [];
const EMPTY_OVERLAYS = new Set<OverlayId>();
const ALL_CRIME_TYPES = new Set<string>(CRIME_TYPE_VALUES);
function formatListingPrice(price: number): string {
return `£${price.toLocaleString()}`;
@ -588,9 +592,11 @@ function overlayTileUrl(path: string): string {
function OverlayTileLayers({
activeOverlays,
activeCrimeTypes,
zoom,
}: {
activeOverlays: Set<OverlayId>;
activeCrimeTypes: Set<string>;
zoom: number;
}) {
if (zoom < POSTCODE_ZOOM_THRESHOLD || activeOverlays.size === 0) return null;
@ -598,6 +604,14 @@ function OverlayTileLayers({
const showNoise = activeOverlays.has('noise');
const showCrime = activeOverlays.has('crime-hotspots');
const showTrees = activeOverlays.has('trees-outside-woodlands');
const showPropertyBorders = activeOverlays.has('property-borders');
// Restrict the heatmap to the selected crime types. When every type is
// selected we omit the filter entirely so all features contribute.
const crimeFilter =
activeCrimeTypes.size >= CRIME_TYPE_VALUES.length
? undefined
: ['in', ['get', 'crime_type'], ['literal', Array.from(activeCrimeTypes)]];
return (
<>
@ -607,6 +621,7 @@ function OverlayTileLayers({
type="raster"
tiles={[overlayTileUrl('noise')]}
tileSize={256}
minzoom={OVERLAY_MIN_ZOOM.noise}
maxzoom={14}
>
<Layer
@ -626,6 +641,7 @@ function OverlayTileLayers({
id="overlay-crime-source"
type="vector"
tiles={[overlayTileUrl('crime-hotspots')]}
minzoom={OVERLAY_MIN_ZOOM['crime-hotspots']}
maxzoom={15}
>
<Layer
@ -633,6 +649,7 @@ function OverlayTileLayers({
type="heatmap"
source-layer="crime_hotspots"
minzoom={POSTCODE_ZOOM_THRESHOLD}
filter={crimeFilter as never}
paint={
{
'heatmap-weight': [
@ -673,6 +690,7 @@ function OverlayTileLayers({
id="overlay-trees-source"
type="vector"
tiles={[overlayTileUrl('trees-outside-woodlands')]}
minzoom={OVERLAY_MIN_ZOOM['trees-outside-woodlands']}
maxzoom={16}
>
<Layer
@ -698,6 +716,30 @@ function OverlayTileLayers({
/>
</Source>
)}
{showPropertyBorders && (
<Source
id="overlay-property-borders-source"
type="vector"
tiles={[overlayTileUrl('property-borders')]}
minzoom={OVERLAY_MIN_ZOOM['property-borders']}
maxzoom={16}
>
<Layer
id="overlay-property-borders"
type="line"
source-layer="property_borders"
minzoom={POSTCODE_ZOOM_THRESHOLD}
paint={
{
'line-color': '#b45309',
'line-opacity': ['interpolate', ['linear'], ['zoom'], 15, 0.35, 18, 0.85],
'line-width': ['interpolate', ['linear'], ['zoom'], 15, 0.4, 18, 1.4],
} as never
}
/>
</Source>
)}
</>
);
}
@ -708,7 +750,9 @@ export default memo(function Map({
usePostcodeView,
pois,
activeOverlays = EMPTY_OVERLAYS,
activeCrimeTypes = ALL_CRIME_TYPES,
basemap = 'standard',
colorOpacity = 1,
actualListings = EMPTY_ACTUAL_LISTINGS,
onViewChange,
viewFeature,
@ -929,6 +973,7 @@ export default memo(function Map({
bounds: viewportBounds,
travelTimeEntries,
mapDataBeforeId,
colorOpacity,
});
const showAutoPoiCards = !screenshotMode && viewState.zoom >= POI_AUTO_CARD_ZOOM_THRESHOLD;
@ -980,8 +1025,12 @@ export default memo(function Map({
minZoom={MAP_MIN_ZOOM}
maxBounds={maxBounds}
>
<OverlayTileLayers
activeOverlays={activeOverlays}
activeCrimeTypes={activeCrimeTypes}
zoom={viewState.zoom}
/>
<DeckOverlay layers={layers} getTooltip={null} />
<OverlayTileLayers activeOverlays={activeOverlays} zoom={viewState.zoom} />
{!screenshotMode && <ScaleControl position="bottom-left" maxWidth={100} unit="metric" />}
</MapGL>
{basemap === 'satellite' && (

View file

@ -27,9 +27,11 @@ import { useFilterCounts } from '../../hooks/useFilterCounts';
import { trackEvent } from '../../lib/analytics';
import { INITIAL_VIEW_STATE, POSTCODE_ZOOM_THRESHOLD } from '../../lib/consts';
import type { OverlayId } from '../../lib/overlays';
import { CRIME_TYPE_VALUES } from '../../lib/crime-types';
import type { BasemapId } from '../../lib/basemaps';
import { useLicense } from '../../hooks/useLicense';
import { stateToParams } from '../../lib/url-state';
import { DEFAULT_COLOR_OPACITY, normalizeColorOpacity } from '../../lib/color-opacity';
import { groupFeaturesByCategory } from '../../lib/features';
import {
getActiveAmenityFilterFeatureNames,
@ -71,8 +73,6 @@ export type { ExportState } from './map-page/types';
type PendingFlyTo = { lat: number; lng: number; zoom: number };
const EMPTY_ACTUAL_LISTINGS: ActualListing[] = [];
declare const __DEV__: boolean;
export default function MapPage({
features,
poiCategoryGroups,
@ -80,7 +80,9 @@ export default function MapPage({
initialViewState,
initialPOICategories,
initialOverlays,
initialCrimeTypes,
initialBasemap = 'standard',
initialColorOpacity = DEFAULT_COLOR_OPACITY,
initialTab,
initialLoading,
theme,
@ -114,7 +116,13 @@ export default function MapPage({
const [activeOverlays, setActiveOverlays] = useState<Set<OverlayId>>(
() => new Set(initialOverlays ?? [])
);
const [crimeTypes, setCrimeTypes] = useState<Set<string>>(
() => new Set(initialCrimeTypes ?? CRIME_TYPE_VALUES)
);
const [basemap, setBasemap] = useState<BasemapId>(initialBasemap);
const [colorOpacity, setColorOpacity] = useState(() =>
normalizeColorOpacity(initialColorOpacity)
);
const [leftPaneWidth, leftPaneHandlers] = usePaneResize(384, 200, 0.45, 'left');
const [rightPaneWidth, rightPaneHandlers] = usePaneResize(384, 200, 0.45, 'right');
const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false);
@ -122,7 +130,10 @@ export default function MapPage({
const [poiPaneOpen, setPoiPaneOpen] = useState(false);
const [overlayPaneOpen, setOverlayPaneOpen] = useState(false);
const [currentLocation, setCurrentLocation] = useState<{ lat: number; lng: number } | null>(null);
const [devActualListingsEnabled, setDevActualListingsEnabled] = useState(true);
const [listingsToggleEnabled, setListingsToggleEnabled] = useState(true);
const [pendingInitialPostcode, setPendingInitialPostcode] = useState<string | null>(
initialPostcode ?? null
);
const {
filters,
@ -482,8 +493,12 @@ export default function MapPage({
[filters, features]
);
const actualListingsTravelParam = useMemo(() => buildTravelParam(entries), [entries]);
const actualListingsEnabled = !__DEV__ || devActualListingsEnabled;
const { listings: actualListings } = useActualListings(
// Listings are gated behind the per-user `can_see_listings` flag (off by
// default). Only users with the flag get the toggle button and the fetch;
// the backing API independently rejects anyone else with 403.
const canSeeListings = user?.canSeeListings ?? false;
const actualListingsEnabled = canSeeListings && listingsToggleEnabled;
const { listings: actualListings, loading: actualListingsLoading } = useActualListings(
actualListingsEnabled ? mapData.visibleBounds : null,
{
filterParam: actualListingsFilterParam,
@ -493,9 +508,13 @@ export default function MapPage({
);
const visibleActualListings = actualListingsEnabled ? actualListings : EMPTY_ACTUAL_LISTINGS;
const handleToggleActualListings = useCallback(() => {
if (!__DEV__) return;
setDevActualListingsEnabled((enabled) => !enabled);
}, []);
if (!canSeeListings) return;
setListingsToggleEnabled((enabled) => !enabled);
}, [canSeeListings]);
const selectedPostcodeParam =
selectedHexagon?.type === 'postcode'
? selectedHexagon.id
: (pendingInitialPostcode ?? undefined);
useUrlSync(
mapData.currentView,
@ -506,7 +525,10 @@ export default function MapPage({
entries,
shareCode,
activeOverlays,
basemap
basemap,
crimeTypes,
selectedPostcodeParam,
colorOpacity
);
useInitialMapPageView(mapData, initialViewState, initialTab, setRightPaneTab);
@ -520,6 +542,7 @@ export default function MapPage({
setMobileDrawerOpen(true);
consumePendingLocationSearchFlyTo();
},
onSettled: () => setPendingInitialPostcode(null),
});
useHorizontalSwipeNavigationGuard();
useMobileBackNavigationGuard(isMobile);
@ -581,16 +604,22 @@ export default function MapPage({
entries,
shareCode,
activeOverlays,
basemap
basemap,
crimeTypes,
selectedPostcodeParam,
colorOpacity
).toString(),
[
activeOverlays,
basemap,
crimeTypes,
colorOpacity,
entries,
features,
filters,
rightPaneTab,
selectedPOICategories,
selectedPostcodeParam,
shareCode,
shareAndSaveView,
]
@ -630,7 +659,9 @@ export default function MapPage({
ogMode={ogMode}
travelTimeEntries={entries}
activeOverlays={activeOverlays}
activeCrimeTypes={crimeTypes}
basemap={basemap}
colorOpacity={colorOpacity}
/>
);
}
@ -691,8 +722,12 @@ export default function MapPage({
<OverlayPane
selectedOverlays={activeOverlays}
onOverlaysChange={setActiveOverlays}
selectedCrimeTypes={crimeTypes}
onCrimeTypesChange={setCrimeTypes}
basemap={basemap}
onBasemapChange={setBasemap}
colorOpacity={colorOpacity}
onColorOpacityChange={setColorOpacity}
zoomedIn={overlaysZoomedIn}
onClose={() => setOverlayPaneOpen(false)}
/>
@ -827,7 +862,9 @@ export default function MapPage({
mapData={mapData}
pois={pois}
activeOverlays={activeOverlays}
activeCrimeTypes={crimeTypes}
basemap={basemap}
colorOpacity={colorOpacity}
mapViewFeature={mapViewFeature}
filterRange={filterRange}
viewSource={viewSource}
@ -847,7 +884,8 @@ export default function MapPage({
currentLocation={currentLocation}
actualListings={visibleActualListings}
actualListingsEnabled={actualListingsEnabled}
onToggleActualListings={__DEV__ ? handleToggleActualListings : undefined}
actualListingsLoading={actualListingsLoading}
onToggleActualListings={canSeeListings ? handleToggleActualListings : undefined}
travelTimeEntries={entries}
bottomScreenInset={mobileBottomSheetHeight}
onBottomSheetCoveredHeightChange={setMobileBottomSheetHeight}
@ -898,7 +936,9 @@ export default function MapPage({
mapData={mapData}
pois={pois}
activeOverlays={activeOverlays}
activeCrimeTypes={crimeTypes}
basemap={basemap}
colorOpacity={colorOpacity}
mapViewFeature={mapViewFeature}
filterRange={filterRange}
viewSource={viewSource}
@ -918,7 +958,8 @@ export default function MapPage({
currentLocation={currentLocation}
actualListings={visibleActualListings}
actualListingsEnabled={actualListingsEnabled}
onToggleActualListings={__DEV__ ? handleToggleActualListings : undefined}
actualListingsLoading={actualListingsLoading}
onToggleActualListings={canSeeListings ? handleToggleActualListings : undefined}
travelTimeEntries={entries}
densityLabel={densityLabel}
totalCount={hasActiveFilters ? filterCounts.total : undefined}

View file

@ -1,8 +1,17 @@
import { useEffect, useLayoutEffect, useRef } from 'react';
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
import type { PointerEvent } from 'react';
import { useTranslation } from 'react-i18next';
import { CloseIcon } from '../ui/icons/CloseIcon';
import { TabButton } from '../ui/TabButton';
const MIN_VISIBLE_PANEL_HEIGHT_PX = 104;
function clampDragOffset(panel: HTMLElement | null, offset: number): number {
const panelHeight = panel?.offsetHeight || window.innerHeight * 0.9;
const maxOffset = Math.max(0, panelHeight - MIN_VISIBLE_PANEL_HEIGHT_PX);
return Math.min(maxOffset, Math.max(0, offset));
}
interface MobileDrawerProps {
onClose: () => void;
renderArea: () => React.ReactNode;
@ -22,6 +31,12 @@ export default function MobileDrawer({
}: MobileDrawerProps) {
const { t } = useTranslation();
const panelRef = useRef<HTMLDivElement>(null);
const dragStartYRef = useRef(0);
const dragStartOffsetRef = useRef(0);
const dragOffsetRef = useRef(0);
const isDraggingRef = useRef(false);
const [dragOffset, setDragOffset] = useState(0);
const [isDragging, setIsDragging] = useState(false);
useLayoutEffect(() => {
const panel = panelRef.current;
@ -42,6 +57,13 @@ export default function MobileDrawer({
};
}, [onPanelRectChange]);
useLayoutEffect(() => {
const panel = panelRef.current;
if (!panel || !onPanelRectChange) return;
onPanelRectChange(panel.getBoundingClientRect());
}, [dragOffset, onPanelRectChange]);
// Close on Escape
useEffect(() => {
const handler = (e: KeyboardEvent) => {
@ -51,16 +73,66 @@ export default function MobileDrawer({
return () => window.removeEventListener('keydown', handler);
}, [onClose]);
const handleDragStart = useCallback((event: PointerEvent<HTMLElement>) => {
event.preventDefault();
event.currentTarget.setPointerCapture(event.pointerId);
dragStartYRef.current = event.clientY;
dragStartOffsetRef.current = dragOffsetRef.current;
isDraggingRef.current = true;
setIsDragging(true);
}, []);
const handleDragMove = useCallback((event: PointerEvent<HTMLElement>) => {
if (!isDraggingRef.current) return;
const nextOffset = clampDragOffset(
panelRef.current,
dragStartOffsetRef.current + event.clientY - dragStartYRef.current
);
dragOffsetRef.current = nextOffset;
setDragOffset(nextOffset);
}, []);
const handleDragEnd = useCallback(() => {
if (!isDraggingRef.current) return;
dragStartYRef.current = 0;
dragStartOffsetRef.current = dragOffsetRef.current;
isDraggingRef.current = false;
setIsDragging(false);
}, []);
return (
<div data-tutorial="right-pane" className="fixed inset-0 z-50 flex flex-col">
{/* Backdrop — top 10% */}
<div className="h-[10%] bg-black/50" onClick={onClose} />
<div data-tutorial="right-pane" className="pointer-events-none fixed inset-0 z-50 flex flex-col">
<div className="h-[10%] shrink-0" aria-hidden="true" />
{/* Panel — bottom 90% */}
<div
ref={panelRef}
className="h-[90%] bg-white dark:bg-navy-950 rounded-t-2xl flex flex-col shadow-xl overflow-hidden"
className="pointer-events-auto h-[90%] bg-white dark:bg-navy-950 rounded-t-2xl flex flex-col border-t border-x border-warm-300 ring-1 ring-navy-950/10 shadow-2xl shadow-navy-950/45 dark:border-navy-600 dark:ring-white/10 dark:shadow-black/60 overflow-hidden"
style={{
transform: dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined,
transition: isDragging ? undefined : 'transform 180ms ease',
willChange: isDragging ? 'transform' : undefined,
}}
>
<div className="relative shrink-0 px-4 py-2">
<div
className="absolute inset-x-0 top-1/2 z-10 h-11 -translate-y-1/2 touch-none"
data-mobile-drawer-drag-handle
onPointerDown={handleDragStart}
onPointerMove={handleDragMove}
onPointerUp={handleDragEnd}
onPointerCancel={handleDragEnd}
/>
<div
className="pointer-events-none flex w-full items-center justify-center"
role="presentation"
>
<span className="h-1.5 w-12 rounded-full bg-warm-300 dark:bg-navy-600" />
</div>
</div>
{/* Tab bar + close */}
<div className="flex border-b border-warm-200 dark:border-navy-700 text-sm shrink-0">
<TabButton

View file

@ -1,16 +1,26 @@
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { BASEMAPS, type BasemapId } from '../../lib/basemaps';
import { OVERLAYS, type OverlayDefinition, type OverlayId } from '../../lib/overlays';
import { CRIME_TYPES, CRIME_TYPE_VALUES } from '../../lib/crime-types';
import { PillToggle } from '../ui/PillToggle';
import { IconButton } from '../ui/IconButton';
import { Slider } from '../ui/Slider';
import InfoPopup from '../ui/InfoPopup';
import { CloseIcon, InfoIcon } from '../ui/icons';
import { colorOpacityToPercent, normalizeColorOpacity } from '../../lib/color-opacity';
const CRIME_OVERLAY_ID: OverlayId = 'crime-hotspots';
interface OverlayPaneProps {
selectedOverlays: Set<OverlayId>;
onOverlaysChange: (overlays: Set<OverlayId>) => void;
selectedCrimeTypes: Set<string>;
onCrimeTypesChange: (crimeTypes: Set<string>) => void;
basemap: BasemapId;
onBasemapChange: (basemap: BasemapId) => void;
colorOpacity: number;
onColorOpacityChange: (opacity: number) => void;
zoomedIn: boolean;
onClose?: () => void;
}
@ -18,11 +28,16 @@ interface OverlayPaneProps {
export default function OverlayPane({
selectedOverlays,
onOverlaysChange,
selectedCrimeTypes,
onCrimeTypesChange,
basemap,
onBasemapChange,
colorOpacity,
onColorOpacityChange,
zoomedIn,
onClose,
}: OverlayPaneProps) {
const { t } = useTranslation();
const [infoOverlay, setInfoOverlay] = useState<OverlayDefinition | null>(null);
const toggleOverlay = (overlay: OverlayId) => {
@ -35,12 +50,31 @@ export default function OverlayPane({
onOverlaysChange(next);
};
const crimeOverlayActive = selectedOverlays.has(CRIME_OVERLAY_ID);
const toggleCrimeType = (value: string) => {
const next = new Set(selectedCrimeTypes);
if (next.has(value)) {
next.delete(value);
} else {
next.add(value);
}
onCrimeTypesChange(next);
};
const selectAllCrimeTypes = () => onCrimeTypesChange(new Set(CRIME_TYPE_VALUES));
const selectNoCrimeTypes = () => onCrimeTypesChange(new Set());
const selectNone = () => onOverlaysChange(new Set());
const showZoomWarning = !zoomedIn && selectedOverlays.size > 0;
const colorOpacityPercent = colorOpacityToPercent(colorOpacity);
const handleColorOpacityChange = ([value]: number[]) => {
onColorOpacityChange(normalizeColorOpacity((value ?? colorOpacityPercent) / 100));
};
return (
<div className="flex h-full min-h-0 flex-col overflow-hidden bg-white shadow-lg dark:bg-warm-900">
<div className="flex min-h-0 flex-col overflow-hidden bg-white shadow-lg dark:bg-warm-900">
<div className="flex-shrink-0 px-3 pt-3 pb-2">
<div className="flex items-center gap-2">
<span className="text-xs font-semibold text-warm-500 dark:text-warm-400 uppercase tracking-wide">
@ -78,7 +112,7 @@ export default function OverlayPane({
)}
</div>
<div className="min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain border-t border-warm-200 px-3 py-3 dark:border-warm-700">
<div className="min-h-0 space-y-4 overflow-y-auto overscroll-contain border-t border-warm-200 px-3 py-3 dark:border-warm-700">
<div>
<div className="mb-2 text-[10px] font-semibold uppercase tracking-wide text-warm-400 dark:text-warm-500">
Base map
@ -96,6 +130,25 @@ export default function OverlayPane({
</div>
</div>
<div>
<div className="mb-2 flex items-center justify-between gap-2">
<span className="text-[10px] font-semibold uppercase tracking-wide text-warm-400 dark:text-warm-500">
Colour opacity
</span>
<span className="text-[10px] font-medium tabular-nums text-warm-500 dark:text-warm-400">
{colorOpacityPercent}%
</span>
</div>
<Slider
min={10}
max={100}
step={5}
value={[colorOpacityPercent]}
onValueChange={handleColorOpacityChange}
aria-label="Colour opacity"
/>
</div>
<div>
<div className="mb-2 text-[10px] font-semibold uppercase tracking-wide text-warm-400 dark:text-warm-500">
Data overlays
@ -120,6 +173,49 @@ export default function OverlayPane({
))}
</div>
</div>
{crimeOverlayActive && (
<div>
<div className="mb-2 flex items-center gap-2">
<span className="text-[10px] font-semibold uppercase tracking-wide text-warm-400 dark:text-warm-500">
{t('filters.crimeType')}
</span>
<span className="text-[10px] text-warm-400 dark:text-warm-500">
{selectedCrimeTypes.size}/{CRIME_TYPES.length}
</span>
<div className="ml-auto flex items-center gap-1">
<button
onClick={selectAllCrimeTypes}
className="rounded border border-warm-300 px-1.5 py-0.5 text-[10px] text-warm-600 hover:bg-warm-50 dark:border-warm-700 dark:text-warm-400 dark:hover:bg-warm-700"
>
All
</button>
<button
onClick={selectNoCrimeTypes}
className="rounded border border-warm-300 px-1.5 py-0.5 text-[10px] text-warm-600 hover:bg-warm-50 dark:border-warm-700 dark:text-warm-400 dark:hover:bg-warm-700"
>
None
</button>
</div>
</div>
<div className="space-y-0.5">
{CRIME_TYPES.map((crime) => (
<label
key={crime.value}
className="flex cursor-pointer items-center gap-2 rounded px-1 py-0.5 text-xs text-warm-700 hover:bg-warm-50 dark:text-warm-300 dark:hover:bg-warm-800"
>
<input
type="checkbox"
checked={selectedCrimeTypes.has(crime.value)}
onChange={() => toggleCrimeType(crime.value)}
className="h-3.5 w-3.5 shrink-0 rounded border-warm-300 text-amber-600 focus:ring-1 focus:ring-amber-500 dark:border-warm-600 dark:bg-warm-800"
/>
<span>{crime.label}</span>
</label>
))}
</div>
</div>
)}
</div>
{infoOverlay && (

View file

@ -19,6 +19,7 @@ import type { SearchedLocation } from '../LocationSearch';
import { MapPinIcon } from '../../ui/icons/MapPinIcon';
import { EyeIcon } from '../../ui/icons/EyeIcon';
import { HouseIcon } from '../../ui/icons/HouseIcon';
import { SpinnerIcon } from '../../ui/icons/SpinnerIcon';
import { IndeterminateProgressBar } from '../../ui/IndeterminateProgressBar';
import type { MapFlyTo, PaneResizeHandlers } from './types';
import { MapFallback, PaneFallback } from './Fallbacks';
@ -40,7 +41,9 @@ interface DesktopMapPageProps {
mapData: MapData;
pois: POI[];
activeOverlays: Set<OverlayId>;
activeCrimeTypes: Set<string>;
basemap: BasemapId;
colorOpacity: number;
mapViewFeature: string | null;
filterRange: [number, number] | null;
viewSource: 'drag' | 'eye' | null;
@ -60,6 +63,7 @@ interface DesktopMapPageProps {
currentLocation: { lat: number; lng: number } | null;
actualListings: ActualListing[];
actualListingsEnabled: boolean;
actualListingsLoading: boolean;
onToggleActualListings?: () => void;
travelTimeEntries: TravelTimeEntry[];
densityLabel: string;
@ -93,7 +97,9 @@ export function DesktopMapPage({
mapData,
pois,
activeOverlays,
activeCrimeTypes,
basemap,
colorOpacity,
mapViewFeature,
filterRange,
viewSource,
@ -113,6 +119,7 @@ export function DesktopMapPage({
currentLocation,
actualListings,
actualListingsEnabled,
actualListingsLoading,
onToggleActualListings,
travelTimeEntries,
densityLabel,
@ -187,7 +194,9 @@ export function DesktopMapPage({
usePostcodeView={mapData.usePostcodeView}
pois={pois}
activeOverlays={activeOverlays}
activeCrimeTypes={activeCrimeTypes}
basemap={basemap}
colorOpacity={colorOpacity}
onViewChange={mapData.handleViewChange}
viewFeature={mapViewFeature}
colorRange={mapData.colorRange}
@ -223,11 +232,16 @@ export function DesktopMapPage({
type="button"
onClick={onToggleActualListings}
aria-pressed={actualListingsEnabled}
aria-busy={actualListingsLoading}
aria-label={actualListingsEnabled ? 'Hide actual listings' : 'Show actual listings'}
title={actualListingsEnabled ? 'Hide actual listings' : 'Show actual listings'}
className={`flex items-center gap-2 rounded-lg bg-white px-3 py-2 shadow-lg dark:bg-warm-800 ${actualListingsEnabled ? 'text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' : 'text-warm-500 hover:text-red-600 dark:text-warm-400 dark:hover:text-red-400'}`}
>
<HouseIcon className="h-5 w-5" />
{actualListingsLoading ? (
<SpinnerIcon className="h-5 w-5 animate-spin" />
) : (
<HouseIcon className="h-5 w-5" />
)}
<span className="text-sm font-medium">
Listings{actualListingsEnabled ? ` (${actualListings.length})` : ''}
</span>
@ -250,7 +264,7 @@ export function DesktopMapPage({
</button>
</div>
{overlayPaneOpen && (
<div className="absolute bottom-28 right-4 z-10 flex h-[260px] min-h-0 w-80 flex-col overflow-hidden rounded-lg border border-warm-200 bg-white shadow-xl dark:border-warm-700 dark:bg-warm-900">
<div className="absolute bottom-16 right-4 z-10 flex max-h-[60vh] min-h-0 w-80 flex-col overflow-hidden rounded-lg border border-warm-200 bg-white shadow-xl dark:border-warm-700 dark:bg-warm-900">
{overlayPane}
</div>
)}

View file

@ -17,6 +17,7 @@ import MobileBottomSheet from '../MobileBottomSheet';
import { MapPinIcon } from '../../ui/icons/MapPinIcon';
import { EyeIcon } from '../../ui/icons/EyeIcon';
import { HouseIcon } from '../../ui/icons/HouseIcon';
import { SpinnerIcon } from '../../ui/icons/SpinnerIcon';
import { IndeterminateProgressBar } from '../../ui/IndeterminateProgressBar';
import type { MapFlyTo } from './types';
import { MapFallback, PaneFallback } from './Fallbacks';
@ -31,7 +32,9 @@ interface MobileMapPageProps {
mapData: MapData;
pois: POI[];
activeOverlays: Set<OverlayId>;
activeCrimeTypes: Set<string>;
basemap: BasemapId;
colorOpacity: number;
mapViewFeature: string | null;
filterRange: [number, number] | null;
viewSource: 'drag' | 'eye' | null;
@ -51,6 +54,7 @@ interface MobileMapPageProps {
currentLocation: { lat: number; lng: number } | null;
actualListings: ActualListing[];
actualListingsEnabled: boolean;
actualListingsLoading: boolean;
onToggleActualListings?: () => void;
travelTimeEntries: TravelTimeEntry[];
bottomScreenInset: number;
@ -81,7 +85,9 @@ export function MobileMapPage({
mapData,
pois,
activeOverlays,
activeCrimeTypes,
basemap,
colorOpacity,
mapViewFeature,
filterRange,
viewSource,
@ -101,6 +107,7 @@ export function MobileMapPage({
currentLocation,
actualListings,
actualListingsEnabled,
actualListingsLoading,
onToggleActualListings,
travelTimeEntries,
bottomScreenInset,
@ -138,7 +145,9 @@ export function MobileMapPage({
usePostcodeView={mapData.usePostcodeView}
pois={pois}
activeOverlays={activeOverlays}
activeCrimeTypes={activeCrimeTypes}
basemap={basemap}
colorOpacity={colorOpacity}
onViewChange={mapData.handleViewChange}
viewFeature={mapViewFeature}
colorRange={mapData.colorRange}
@ -163,7 +172,6 @@ export function MobileMapPage({
actualListings={actualListings}
bounds={mapData.bounds}
hideLegend
hideLocationSearch={mobileDrawerOpen && !!selectedHexagonId}
travelTimeEntries={travelTimeEntries}
bottomScreenInset={bottomScreenInset}
/>
@ -177,10 +185,15 @@ export function MobileMapPage({
onClick={onToggleActualListings}
className={`rounded-lg bg-white p-2 shadow-lg dark:bg-warm-800 ${actualListingsEnabled ? 'text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' : 'text-warm-500 hover:text-red-600 dark:text-warm-400 dark:hover:text-red-400'}`}
aria-pressed={actualListingsEnabled}
aria-busy={actualListingsLoading}
aria-label={actualListingsEnabled ? 'Hide actual listings' : 'Show actual listings'}
title={actualListingsEnabled ? 'Hide actual listings' : 'Show actual listings'}
>
<HouseIcon className="h-5 w-5" />
{actualListingsLoading ? (
<SpinnerIcon className="h-5 w-5 animate-spin" />
) : (
<HouseIcon className="h-5 w-5" />
)}
</button>
)}
<button
@ -200,7 +213,7 @@ export function MobileMapPage({
</div>
{overlayPaneOpen && (
<div className="absolute top-24 right-3 left-3 z-20 flex h-[260px] min-h-0 flex-col overflow-hidden rounded-lg border border-warm-200 bg-white shadow-xl dark:border-warm-700 dark:bg-warm-900">
<div className="absolute top-24 right-3 left-3 z-20 flex max-h-[60dvh] min-h-0 flex-col overflow-hidden rounded-lg border border-warm-200 bg-white shadow-xl dark:border-warm-700 dark:bg-warm-900">
{overlayPane}
</div>
)}

View file

@ -21,7 +21,9 @@ interface ScreenshotMapPageProps {
ogMode?: boolean;
travelTimeEntries: TravelTimeEntry[];
activeOverlays: Set<OverlayId>;
activeCrimeTypes: Set<string>;
basemap: BasemapId;
colorOpacity: number;
}
export function ScreenshotMapPage({
@ -35,7 +37,9 @@ export function ScreenshotMapPage({
ogMode,
travelTimeEntries,
activeOverlays,
activeCrimeTypes,
basemap,
colorOpacity,
}: ScreenshotMapPageProps) {
return (
<div className="h-full w-full">
@ -46,7 +50,9 @@ export function ScreenshotMapPage({
usePostcodeView={mapData.usePostcodeView}
pois={[]}
activeOverlays={activeOverlays}
activeCrimeTypes={activeCrimeTypes}
basemap={basemap}
colorOpacity={colorOpacity}
onViewChange={mapData.handleViewChange}
viewFeature={mapViewFeature}
colorRange={mapData.colorRange}

View file

@ -35,6 +35,7 @@ interface UseInitialPostcodeSelectionOptions {
lng?: number
) => void;
onOpenMobileDrawer: (target: { lat: number; lng: number; zoom: number }) => void;
onSettled?: () => void;
}
export function useInitialPostcodeSelection({
@ -43,15 +44,11 @@ export function useInitialPostcodeSelection({
flyTo,
onLocationSearch,
onOpenMobileDrawer,
onSettled,
}: UseInitialPostcodeSelectionOptions) {
useEffect(() => {
if (!initialPostcode) return;
const params = new URLSearchParams(window.location.search);
params.delete('pc');
const newUrl = params.toString() ? `/dashboard?${params}` : '/dashboard';
window.history.replaceState(window.history.state, '', newUrl);
fetch(`/api/postcode/${encodeURIComponent(initialPostcode)}`, authHeaders())
.then((res) => {
if (!res.ok) throw new Error('Postcode not found');
@ -77,6 +74,9 @@ export function useInitialPostcodeSelection({
)
.catch(() => {
// Silently fail because the postcode might no longer exist.
})
.finally(() => {
onSettled?.();
});
}, []); // eslint-disable-line react-hooks/exhaustive-deps
}

View file

@ -28,7 +28,9 @@ export interface MapPageProps {
initialViewState: ViewState;
initialPOICategories: Set<string>;
initialOverlays?: Set<OverlayId>;
initialCrimeTypes?: Set<string>;
initialBasemap?: BasemapId;
initialColorOpacity?: number;
initialTab: 'properties' | 'area';
initialLoading: boolean;
theme: 'light' | 'dark';
@ -43,7 +45,7 @@ export interface MapPageProps {
initialTravelTime?: TravelTimeInitial;
initialPostcode?: string;
shareCode?: string;
user?: { id: string; subscription: string; isAdmin?: boolean } | null;
user?: { id: string; subscription: string; isAdmin?: boolean; canSeeListings?: boolean } | null;
onLoginClick: () => void;
onRegisterClick: () => void;
onCheckoutLoginClick?: (returnPath?: string) => void;

View file

@ -1,6 +1,6 @@
import { useEffect, useRef, useState } from 'react';
import type { ActualListing, ActualListingsResponse, Bounds } from '../types';
import { apiUrl, authHeaders, logNonAbortError } from '../lib/api';
import { apiUrl, authHeaders, isAbortError, logNonAbortError } from '../lib/api';
const DEBOUNCE_MS = 200;
@ -15,6 +15,7 @@ export function useActualListings(
{ filterParam = '', travelParam = '', shareCode = '' }: UseActualListingsOptions = {}
) {
const [listings, setListings] = useState<ActualListing[]>([]);
const [loading, setLoading] = useState(false);
const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const abortControllerRef = useRef<AbortController | null>(null);
const requestIdRef = useRef(0);
@ -26,10 +27,12 @@ export function useActualListings(
if (!bounds) {
abortControllerRef.current?.abort();
if (listings.length !== 0) setListings([]);
setLoading(false);
return;
}
if (debounceRef.current) clearTimeout(debounceRef.current);
setLoading(true);
debounceRef.current = setTimeout(async () => {
abortControllerRef.current?.abort();
@ -45,13 +48,20 @@ export function useActualListings(
authHeaders({ signal: abortControllerRef.current.signal })
);
if (!res.ok) {
if (requestIdRef.current === requestId) setListings([]);
if (requestIdRef.current === requestId) {
setListings([]);
setLoading(false);
}
throw new Error(`Actual listings fetch failed: HTTP ${res.status}`);
}
const json: ActualListingsResponse = await res.json();
if (requestIdRef.current !== requestId) return;
setListings(json.listings || []);
setLoading(false);
} catch (err) {
if (requestIdRef.current === requestId && !isAbortError(err)) {
setLoading(false);
}
logNonAbortError('Failed to fetch actual listings', err);
}
}, DEBOUNCE_MS);
@ -64,5 +74,5 @@ export function useActualListings(
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [bounds, filterParam, travelParam, shareCode]);
return { listings };
return { listings, loading };
}

View file

@ -8,6 +8,7 @@ export interface AuthUser {
isAdmin: boolean;
subscription: string;
newsletter: boolean;
canSeeListings: boolean;
}
function recordToUser(record: { id: string; [key: string]: unknown }): AuthUser {
@ -20,6 +21,7 @@ function recordToUser(record: { id: string; [key: string]: unknown }): AuthUser
isAdmin: typeof record.is_admin === 'boolean' ? record.is_admin : false,
subscription: typeof record.subscription === 'string' ? record.subscription : 'free',
newsletter: typeof record.newsletter === 'boolean' ? record.newsletter : false,
canSeeListings: typeof record.can_see_listings === 'boolean' ? record.can_see_listings : false,
};
}

View file

@ -1,7 +1,7 @@
import { useCallback, useRef, useState, useMemo, useEffect } from 'react';
import { H3HexagonLayer } from '@deck.gl/geo-layers';
import { GeoJsonLayer, TextLayer, ScatterplotLayer } from '@deck.gl/layers';
import { cellToBoundary } from 'h3-js';
import { cellToBoundary, isValidCell } from 'h3-js';
import type { PickingInfo } from '@deck.gl/core';
import type {
HexagonData,
@ -25,6 +25,7 @@ import { usePoiLayers } from './usePoiLayers';
import { useListingLayers } from './useListingLayers';
import { MarchingAntsExtension } from '../lib/MarchingAntsExtension';
import { PieHexExtension } from '../lib/PieHexExtension';
import { normalizeColorOpacity } from '../lib/color-opacity';
interface UseDeckLayersProps {
data: HexagonData[];
@ -47,6 +48,7 @@ interface UseDeckLayersProps {
bounds?: Bounds | null;
travelTimeEntries?: TravelTimeEntry[];
mapDataBeforeId: string;
colorOpacity?: number;
}
/** Normalize a distribution count array to [0..1] ratios, padded to 10 values. */
@ -69,6 +71,13 @@ function requireEnumPalette(
return palette;
}
type RgbaColor = [number, number, number, number];
function withColorOpacity(color: RgbaColor, opacity: number): RgbaColor {
if (opacity >= 1) return color;
return [color[0], color[1], color[2], Math.round(color[3] * opacity)];
}
export function useDeckLayers({
data,
postcodeData,
@ -90,6 +99,7 @@ export function useDeckLayers({
bounds: viewportBounds,
travelTimeEntries = [],
mapDataBeforeId,
colorOpacity = 1,
}: UseDeckLayersProps) {
const [hoverPosition, setHoverPosition] = useState<{ x: number; y: number } | null>(null);
const [hoveredPostcode, setHoveredPostcode] = useState<string | null>(null);
@ -128,10 +138,17 @@ export function useDeckLayers({
isDarkRef.current = isDark;
const densityGradientRef = useRef(densityGradient);
densityGradientRef.current = densityGradient;
const normalizedColorOpacity = normalizeColorOpacity(colorOpacity);
const colorOpacityRef = useRef(normalizedColorOpacity);
colorOpacityRef.current = normalizedColorOpacity;
const featureGradientRef = useRef(getFeatureGradient(viewFeature));
featureGradientRef.current = getFeatureGradient(viewFeature);
const selectedHexagonIdRef = useRef(selectedHexagonId);
selectedHexagonIdRef.current = selectedHexagonId;
const selectedHexagonSelectionRef = useRef<string | null>(null);
selectedHexagonSelectionRef.current = selectedPostcodeGeometry ? null : selectedHexagonId;
const selectedPostcodeIdRef = useRef<string | null>(null);
selectedPostcodeIdRef.current = selectedPostcodeGeometry ? selectedHexagonId : null;
const hoveredHexagonIdRef = useRef(hoveredHexagonId);
hoveredHexagonIdRef.current = hoveredHexagonId;
const hoveredPostcodeRef = useRef(hoveredPostcode);
@ -270,8 +287,10 @@ export function useDeckLayers({
return parts.join(';');
}, [travelTimeEntries]);
const colorTrigger = `${viewFeature}|${colorRange?.[0]}|${colorRange?.[1]}|${filterRange?.[0]}|${filterRange?.[1]}|${countRange.min}|${countRange.max}|${selectedHexagonId}|${hoveredHexagonId}|${theme}|${ttTrigger}`;
const postcodeColorTrigger = `${viewFeature}|${colorRange?.[0]}|${colorRange?.[1]}|${filterRange?.[0]}|${filterRange?.[1]}|${postcodeCountRange.min}|${postcodeCountRange.max}|${hoveredPostcode}|${theme}|${ttTrigger}`;
const selectedHexagonKey = selectedPostcodeGeometry ? '' : (selectedHexagonId ?? '');
const selectedPostcodeKey = selectedPostcodeGeometry ? (selectedHexagonId ?? '') : '';
const colorTrigger = `${viewFeature}|${colorRange?.[0]}|${colorRange?.[1]}|${filterRange?.[0]}|${filterRange?.[1]}|${countRange.min}|${countRange.max}|${selectedHexagonKey}|${hoveredHexagonId}|${theme}|${normalizedColorOpacity}|${ttTrigger}`;
const postcodeColorTrigger = `${viewFeature}|${colorRange?.[0]}|${colorRange?.[1]}|${filterRange?.[0]}|${filterRange?.[1]}|${postcodeCountRange.min}|${postcodeCountRange.max}|${selectedPostcodeKey}|${hoveredPostcode}|${theme}|${normalizedColorOpacity}|${ttTrigger}`;
// --- Layers ---
// PieHexExtension uses the canonical deck.gl v9 pattern: defaultProps with
@ -328,6 +347,7 @@ export function useDeckLayers({
if ((d.count as number) <= 0) {
return [0, 0, 0, 0] as [number, number, number, number];
}
const fill = (color: RgbaColor) => withColorOpacity(color, colorOpacityRef.current);
const dark = isDarkRef.current;
const vf = viewFeatureRef.current;
const clr = colorRangeRef.current;
@ -338,28 +358,25 @@ export function useDeckLayers({
if (vf.startsWith('tt_')) {
const ttVal = d[`avg_${vf}`];
if (ttVal == null) {
return (dark ? [80, 70, 65, 80] : [128, 128, 128, 80]) as [
number,
number,
number,
number,
];
return fill(dark ? [80, 70, 65, 80] : [128, 128, 128, 80]);
}
const ttMin = (d[`min_${vf}`] as number) ?? ttVal;
const ttMax = (d[`max_${vf}`] as number) ?? ttVal;
return getFeatureFillColor(
ttVal as number,
ttMin as number,
ttMax as number,
clr,
fr,
0,
densityGradientRef.current,
dark,
255,
0,
undefined,
featureGradientRef.current
return fill(
getFeatureFillColor(
ttVal as number,
ttMin as number,
ttMax as number,
clr,
fr,
0,
densityGradientRef.current,
dark,
255,
0,
undefined,
featureGradientRef.current
)
);
}
@ -367,19 +384,21 @@ export function useDeckLayers({
const val = d[`avg_${vf}`] ?? d[`min_${vf}`];
const minVal = d[`min_${vf}`] as number | undefined;
const maxVal = d[`max_${vf}`] as number | undefined;
return getFeatureFillColor(
val as number | null | undefined,
minVal,
maxVal,
clr,
fr,
0,
densityGradientRef.current,
dark,
255,
enumCountRef.current,
enumPaletteRef.current,
featureGradientRef.current
return fill(
getFeatureFillColor(
val as number | null | undefined,
minVal,
maxVal,
clr,
fr,
0,
densityGradientRef.current,
dark,
255,
enumCountRef.current,
enumPaletteRef.current,
featureGradientRef.current
)
);
}
}
@ -387,24 +406,29 @@ export function useDeckLayers({
const cr = countRangeRef.current;
const c = d.count as number;
const t = (c - cr.min) / (cr.max - cr.min);
return getFeatureFillColor(
null,
undefined,
undefined,
null,
null,
t,
densityGradientRef.current,
dark,
255
return fill(
getFeatureFillColor(
null,
undefined,
undefined,
null,
null,
t,
densityGradientRef.current,
dark,
255
)
);
},
getLineColor: (d) => {
if (d.h3 === selectedHexagonSelectionRef.current)
return [29, 228, 195, 255] as [number, number, number, number];
if (d.h3 === hoveredHexagonIdRef.current)
return [29, 228, 195, 200] as [number, number, number, number];
return [0, 0, 0, 0] as [number, number, number, number];
},
getLineWidth: (d) => {
if (d.h3 === selectedHexagonSelectionRef.current) return 4;
if (d.h3 === hoveredHexagonIdRef.current) return 2;
return 0;
},
@ -477,6 +501,7 @@ export function useDeckLayers({
if (d.count <= 0) {
return [0, 0, 0, 0] as [number, number, number, number];
}
const fill = (color: RgbaColor) => withColorOpacity(color, colorOpacityRef.current);
const dark = isDarkRef.current;
const vf = viewFeatureRef.current;
const clr = colorRangeRef.current;
@ -488,28 +513,25 @@ export function useDeckLayers({
if (vf.startsWith('tt_')) {
const ttVal = d[`avg_${vf}`];
if (ttVal == null) {
return (dark ? [80, 70, 65, 80] : [128, 128, 128, 80]) as [
number,
number,
number,
number,
];
return fill(dark ? [80, 70, 65, 80] : [128, 128, 128, 80]);
}
const ttMin = (d[`min_${vf}`] as number) ?? ttVal;
const ttMax = (d[`max_${vf}`] as number) ?? ttVal;
return getFeatureFillColor(
ttVal as number,
ttMin as number,
ttMax as number,
clr,
fr,
0,
densityGradientRef.current,
dark,
180,
0,
undefined,
featureGradientRef.current
return fill(
getFeatureFillColor(
ttVal as number,
ttMin as number,
ttMax as number,
clr,
fr,
0,
densityGradientRef.current,
dark,
180,
0,
undefined,
featureGradientRef.current
)
);
}
@ -518,40 +540,46 @@ export function useDeckLayers({
const val = d[`avg_${vf}`] ?? d[`min_${vf}`];
const minVal = d[`min_${vf}`] as number | undefined;
const maxVal = d[`max_${vf}`] as number | undefined;
return getFeatureFillColor(
val as number | null | undefined,
minVal,
maxVal,
clr,
fr,
0,
densityGradientRef.current,
dark,
180,
enumCountRef.current,
enumPaletteRef.current,
featureGradientRef.current
return fill(
getFeatureFillColor(
val as number | null | undefined,
minVal,
maxVal,
clr,
fr,
0,
densityGradientRef.current,
dark,
180,
enumCountRef.current,
enumPaletteRef.current,
featureGradientRef.current
)
);
}
}
const cr = postcodeCountRangeRef.current;
const c = d.count;
const t = (c - cr.min) / (cr.max - cr.min);
return getFeatureFillColor(
null,
undefined,
undefined,
null,
null,
t,
densityGradientRef.current,
dark,
180
return fill(
getFeatureFillColor(
null,
undefined,
undefined,
null,
null,
t,
densityGradientRef.current,
dark,
180
)
);
},
getLineColor: (f) => {
const pc = f.properties.postcode;
const dark = isDarkRef.current;
if (pc === selectedPostcodeIdRef.current)
return [29, 228, 195, 255] as [number, number, number, number];
if (pc === hoveredPostcodeRef.current)
return [29, 228, 195, 200] as [number, number, number, number];
if (f.properties.count <= 0) return [0, 0, 0, 0] as [number, number, number, number];
@ -564,6 +592,7 @@ export function useDeckLayers({
},
getLineWidth: (f) => {
const pc = f.properties.postcode;
if (pc === selectedPostcodeIdRef.current) return 4;
if (pc === hoveredPostcodeRef.current) return 2;
if (f.properties.count <= 0) return 0;
return 1;
@ -624,7 +653,7 @@ export function useDeckLayers({
let geometry: PostcodeGeometry | null = null;
if (selectedPostcodeGeometry) {
geometry = selectedPostcodeGeometry;
} else if (selectedHexagonId) {
} else if (selectedHexagonId && isValidCell(selectedHexagonId)) {
const boundary = cellToBoundary(selectedHexagonId, true);
geometry = { type: 'Polygon', coordinates: [boundary] };
}
@ -644,6 +673,7 @@ export function useDeckLayers({
getLineWidth: 3,
lineWidthUnits: 'pixels' as const,
pickable: false,
parameters: { depthTest: false },
marchTime,
extensions: [new MarchingAntsExtension()],
});

View file

@ -114,8 +114,13 @@ export function useListingLayers({ listings, zoom, isDark }: UseListingLayersPro
const [selectedCluster, setSelectedCluster] = useState<ListingClusterPoint | null>(null);
useEffect(() => {
// Each refetch returns a fresh listings array and rebuilds the cluster index, so a
// previously selected cluster's id is no longer valid (getLeaves would throw) —
// always collapse the spiderfy. A locked popup, however, holds a self-contained
// snapshot of the listings captured at click time, so preserve it across background
// refetches instead of dismissing it (mirrors clearUnlockedPopup).
setSelectedCluster(null);
setPopupInfo(null);
setPopupInfo((current) => (current?.locked ? current : null));
}, [listings]);
const clusterIndex = useMemo(() => {

View file

@ -16,7 +16,10 @@ export function useUrlSync(
travelTimeEntries?: TravelTimeEntry[],
share?: string,
selectedOverlays?: Set<OverlayId>,
basemap?: BasemapId
basemap?: BasemapId,
selectedCrimeTypes?: Set<string>,
selectedPostcode?: string,
colorOpacity?: number
) {
const urlDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);
@ -34,7 +37,10 @@ export function useUrlSync(
travelTimeEntries,
share,
selectedOverlays,
basemap
basemap,
selectedCrimeTypes,
selectedPostcode,
colorOpacity
);
const search = params.toString();
const newUrl = search ? `${window.location.pathname}?${search}` : window.location.pathname;
@ -54,5 +60,8 @@ export function useUrlSync(
share,
selectedOverlays,
basemap,
selectedCrimeTypes,
selectedPostcode,
colorOpacity,
]);
}

View file

@ -13,27 +13,28 @@ import { details } from './details';
*/
const descriptions: Record<string, Record<string, string>> = {
fr: {
'Property type': 'Type de bien : individuel, jumelé, mitoyen, appartement ou autre',
'Leasehold/Freehold': 'Indique si le bien est en bail ou en pleine propriété',
'Last known price': 'Dernier prix de vente enregistré au Land Registry',
'Estimated current price': 'Estimation modélisée du prix actuel',
'Price per sqm': 'Prix de vente divisé par la surface totale',
'Est. price per sqm': 'Prix actuel estimé divisé par la surface totale',
'Estimated monthly rent': 'Loyer mensuel privé moyen pour le secteur',
'Total floor area (sqm)': 'Surface intérieure issue du diagnostic EPC',
'Number of bedrooms & living rooms': 'Nombre de pièces habitables selon le diagnostic EPC',
'Construction year': 'Année de construction estimée selon lEPC',
'Date of last transaction': 'Date de la dernière vente enregistrée au Land Registry',
'Former council house': 'Indique si le bien a été répertorié comme logement social',
'Current energy rating': 'Classement énergétique EPC actuel (A = meilleur, G = pire)',
'Property type':
'Type de bien : maison individuelle, jumelée ou mitoyenne, appartement/duplex ou autre',
'Leasehold/Freehold': 'Indique si le bien est en bail de longue durée ou en pleine propriété',
'Last known price': 'Prix de vente le plus récent enregistré au Land Registry',
'Estimated current price': 'Estimation modélisée de la valeur actuelle du bien',
'Price per sqm': 'Prix de vente rapporté à la surface totale',
'Est. price per sqm': 'Prix actuel estimé rapporté à la surface totale',
'Estimated monthly rent': 'Loyer mensuel privé moyen dans le secteur',
'Total floor area (sqm)': 'Surface intérieure relevée lors du diagnostic EPC',
'Number of bedrooms & living rooms': 'Nombre de pièces habitables relevé lors du diagnostic EPC',
'Construction year': 'Année de construction estimée à partir de lEPC',
'Date of last transaction': 'Date de la vente la plus récente enregistrée au Land Registry',
'Former council house': 'Indique si le bien a déjà été répertorié comme logement social',
'Current energy rating': 'Classe énergétique EPC actuelle (A = meilleure, G = pire)',
'Potential energy rating':
'Classement EPC potentiel si toutes les améliorations recommandées étaient réalisées',
'Interior height (m)': 'Hauteur moyenne détage selon le diagnostic EPC',
'Street tree density percentile': 'Percentile estimé de couverture arborée pour la rue du bien',
'Classe énergétique EPC possible si toutes les améliorations recommandées étaient réalisées',
'Interior height (m)': 'Hauteur intérieure moyenne relevée lors du diagnostic EPC',
'Street tree density percentile': 'Percentile estimé de couverture arborée autour du code postal',
'Within conservation area':
'Indique si le point représentatif du code postal se trouve dans une zone de conservation',
'Indique si le point représentatif du code postal se situe dans une zone de conservation désignée',
'Listed building':
'Indique si ce bien semble correspondre à un bâtiment classé répertorié par Historic England',
'Indique si le bien semble correspondre à un bâtiment classé répertorié par Historic England',
'Good+ primary schools within 2km':
'Écoles primaires notées Bien ou Excellent par Ofsted dans un rayon de 2 km',
'Good+ secondary schools within 2km':
@ -51,24 +52,22 @@ const descriptions: Record<string, Record<string, string>> = {
'Outstanding secondary schools within 5km':
'Collèges/lycées notés Excellent par Ofsted dans un rayon de 5 km',
'Education, Skills and Training Score':
'Centile de défaveur éducative (plus élevé = moins défavorisé)',
'Income Score': 'Centile de défaveur de revenu (plus élevé = moins défavorisé)',
'Employment Score': 'Centile de défaveur demploi (plus élevé = moins défavorisé)',
'Percentile de défaveur en éducation, compétences et formation (plus élevé = moins défavorisé)',
'Income Score': 'Percentile de défaveur liée au revenu (plus élevé = moins défavorisé)',
'Employment Score': 'Percentile de défaveur liée à lemploi (plus élevé = moins défavorisé)',
'Health Deprivation and Disability Score':
'Centile de défaveur santé et handicap (plus élevé = meilleurs résultats)',
'Percentile de défaveur santé et handicap (plus élevé = meilleurs résultats)',
'Housing Conditions Score':
'Centile des conditions de logement (plus élevé = meilleures conditions)',
'Percentile des conditions de logement (plus élevé = meilleures conditions)',
'Air Quality and Road Safety Score':
'Centile air et sécurité routière (plus élevé = meilleures conditions)',
'Serious crime per 1k residents (avg/yr)': 'Taux de crimes graves pour 1 000 habitants par an',
'Minor crime per 1k residents (avg/yr)': 'Taux de délits mineurs pour 1 000 habitants par an',
'Serious crime (avg/yr)': 'Agrégat des catégories de crimes graves par an',
'Minor crime (avg/yr)': 'Agrégat des catégories de délits mineurs par an',
'Percentile de qualité de lair et de sécurité routière (plus élevé = meilleures conditions)',
'Serious crime (avg/yr)': 'Somme annuelle des catégories dinfractions graves',
'Minor crime (avg/yr)': 'Somme annuelle des catégories dinfractions mineures',
'Violence and sexual offences (avg/yr)':
'Moyenne annuelle des violences et infractions sexuelles dans le secteur',
'Burglary (avg/yr)': 'Moyenne annuelle des cambriolages dans le secteur',
'Robbery (avg/yr)': 'Moyenne annuelle des vols avec violence dans le secteur',
'Vehicle crime (avg/yr)': 'Moyenne annuelle des crimes liés aux véhicules dans le secteur',
'Vehicle crime (avg/yr)': 'Moyenne annuelle des infractions liées aux véhicules dans le secteur',
'Anti-social behaviour (avg/yr)':
'Moyenne annuelle des comportements antisociaux dans le secteur',
'Criminal damage and arson (avg/yr)':
@ -81,57 +80,59 @@ const descriptions: Record<string, Record<string, string>> = {
'Possession of weapons (avg/yr)':
'Moyenne annuelle des infractions de possession darmes dans le secteur',
'Public order (avg/yr)': 'Moyenne annuelle des troubles à lordre public dans le secteur',
'Other crime (avg/yr)': 'Moyenne annuelle des autres crimes dans le secteur',
'Other crime (avg/yr)': 'Moyenne annuelle des autres infractions dans le secteur',
'Median age': 'Âge médian de la population locale',
'% White': 'Pourcentage de la population se déclarant Blanche',
'% South Asian': 'Pourcentage de la population se déclarant Sud-Asiatique',
'% Black': 'Pourcentage de la population se déclarant Noire',
'% East Asian': 'Pourcentage de la population se déclarant Est-Asiatique',
'% White': 'Part de la population sidentifiant comme blanche',
'% South Asian': 'Part de la population sidentifiant comme sud-asiatique',
'% Black': 'Part de la population sidentifiant comme noire',
'% East Asian': 'Part de la population sidentifiant comme est-asiatique',
'% Mixed':
'Pourcentage de la population se déclarant Métisse ou de plusieurs groupes ethniques',
'% Other': 'Pourcentage de la population se déclarant dun autre groupe ethnique',
'Part de la population sidentifiant comme métisse ou de plusieurs groupes ethniques',
'% Other': 'Part de la population sidentifiant comme appartenant à un autre groupe ethnique',
'Voter turnout (%)':
'Pourcentage délecteurs inscrits ayant voté aux élections générales de 2024',
'Part des électeurs inscrits ayant voté aux élections générales de 2024',
'% Labour': 'Part des voix travaillistes aux élections générales de 2024',
'% Conservative': 'Part des voix conservatrices aux élections générales de 2024',
'% Liberal Democrat': 'Part des voix libérales-démocrates aux élections générales de 2024',
'% Reform UK': 'Part des voix Reform UK aux élections générales de 2024',
'% Green': 'Part des voix vertes aux élections générales de 2024',
'% Other parties': 'Part des voix combinée de tous les autres partis et indépendants',
'% Other parties': 'Part cumulée des voix de tous les autres partis et indépendants',
'Distance to nearest park (km)': 'Distance au parc ou espace vert le plus proche',
'Noise (dB)': 'Niveau de bruit routier au code postal en décibels (Lden)',
'Max available download speed (Mbps)': 'Débit descendant maximal disponible au code postal',
'Noise (dB)': 'Niveau maximal de bruit des transports près du code postal, en décibels (Lden)',
'Max available download speed (Mbps)': 'Débit descendant haut débit maximal disponible au code postal',
Schools: 'Écoles primaires et secondaires notées à proximité',
'Specific crimes': 'Filtrer une catégorie de criminalité de rue à la fois',
Ethnicities: 'Pourcentage de population par groupe ethnique',
'Amenity distance': 'Distance aux commodités proches',
'Amenities within 2km': 'Nombre de commodités proches dans un rayon de 2 km',
'Amenities within 5km': 'Nombre de commodités proches dans un rayon de 5 km',
'Specific crimes': 'Filtrer une seule catégorie dinfractions de rue à la fois',
Ethnicities: 'Part de la population par groupe ethnique',
'Amenity distance': 'Distance aux services de proximité',
'Amenities within 2km': 'Nombre de services de proximité dans un rayon de 2 km',
'Amenities within 5km': 'Nombre de services de proximité dans un rayon de 5 km',
'Political vote share': 'Part des voix par parti aux élections générales de 2024',
},
de: {
'Property type':
'Immobilientyp: freistehend, Doppelhaushälfte, Reihenhaus, Wohnung oder sonstige',
'Immobilientyp: freistehend, Doppelhaushälfte, Reihenhaus, Wohnung/Maisonette oder sonstige',
'Leasehold/Freehold': 'Ob die Immobilie Erbbaurecht oder Volleigentum ist',
'Last known price': 'Letzter Verkaufspreis laut Land Registry',
'Estimated current price': 'Modellierter aktueller Schätzwert der Immobilie',
'Price per sqm': 'Verkaufspreis geteilt durch die Gesamtfläche',
'Est. price per sqm': 'Geschätzter aktueller Preis geteilt durch die Gesamtfläche',
'Estimated monthly rent': 'Durchschnittliche monatliche Privatmiete in der Gegend',
'Total floor area (sqm)': 'Wohnfläche laut EPC-Gutachten',
'Estimated current price': 'Modellierte Schätzung des heutigen Immobilienwerts',
'Price per sqm': 'Verkaufspreis geteilt durch die Gesamtwohnfläche',
'Est. price per sqm': 'Geschätzter heutiger Preis geteilt durch die Gesamtwohnfläche',
'Estimated monthly rent': 'Durchschnittliche monatliche private Miete in der Gegend',
'Total floor area (sqm)': 'Gesamtwohnfläche laut EPC-Gutachten',
'Number of bedrooms & living rooms': 'Anzahl bewohnbarer Räume laut EPC-Gutachten',
'Construction year': 'Geschätztes Baujahr laut EPC',
'Date of last transaction': 'Datum des letzten Verkaufs laut Land Registry',
'Former council house': 'Ob die Immobilie jemals als Sozialbau erfasst wurde',
'Former council house':
'Ob die Immobilie jemals als kommunaler oder sozialer Wohnungsbau erfasst wurde',
'Current energy rating': 'Aktuelle EPC-Energieeffizienzklasse (A = beste, G = schlechteste)',
'Potential energy rating': 'Potenzielle EPC-Klasse bei Umsetzung aller empfohlenen Maßnahmen',
'Interior height (m)': 'Durchschnittliche Geschosshöhe laut EPC-Gutachten',
'Potential energy rating':
'Mögliche EPC-Energieeffizienzklasse, wenn alle empfohlenen Maßnahmen umgesetzt würden',
'Interior height (m)': 'Durchschnittliche Raumhöhe laut EPC-Gutachten',
'Street tree density percentile':
'Geschätztes Perzentil der Baumkronenbedeckung auf der Straße der Immobilie',
'Geschätztes Perzentil der Straßenbaumdichte rund um den Postcode',
'Within conservation area':
'Ob der repräsentative Punkt der Postleitzahl in einem Erhaltungsgebiet liegt',
'Ob der repräsentative Punkt des Postcodes in einem ausgewiesenen Denkmalschutzgebiet liegt',
'Listed building':
'Ob diese Immobilie einem Eintrag für ein denkmalgeschütztes Gebäude bei Historic England zugeordnet werden kann',
'Ob die Immobilie wahrscheinlich einem Eintrag von Historic England für ein denkmalgeschütztes Gebäude entspricht',
'Good+ primary schools within 2km':
'Von Ofsted mit Gut oder Hervorragend bewertete Grundschulen im Umkreis von 2 km',
'Good+ secondary schools within 2km':
@ -149,20 +150,17 @@ const descriptions: Record<string, Record<string, string>> = {
'Outstanding secondary schools within 5km':
'Von Ofsted mit Hervorragend bewertete weiterführende Schulen im Umkreis von 5 km',
'Education, Skills and Training Score':
'Bildungs- und Ausbildungsbenachteiligungs-Perzentil (höher = weniger benachteiligt)',
'Income Score': 'Einkommensbenachteiligungs-Perzentil (höher = weniger benachteiligt)',
'Employment Score': 'Beschäftigungsbenachteiligungs-Perzentil (höher = weniger benachteiligt)',
'Benachteiligungsperzentil für Bildung, Kompetenzen und Ausbildung (höher = weniger benachteiligt)',
'Income Score': 'Einkommensbenachteiligungsperzentil (höher = weniger benachteiligt)',
'Employment Score':
'Beschäftigungsbenachteiligungsperzentil (höher = weniger benachteiligt)',
'Health Deprivation and Disability Score':
'Gesundheits- und Behinderungsbenachteiligungs-Perzentil (höher = bessere Ergebnisse)',
'Housing Conditions Score': 'Perzentil der Wohnbedingungen (höher = bessere Bedingungen)',
'Perzentil für gesundheitliche Benachteiligung und Behinderung (höher = bessere Ergebnisse)',
'Housing Conditions Score': 'Wohnbedingungen-Perzentil (höher = bessere Bedingungen)',
'Air Quality and Road Safety Score':
'Perzentil für Luftqualität und Verkehrssicherheit (höher = bessere Bedingungen)',
'Serious crime per 1k residents (avg/yr)':
'Rate schwerer Straftaten pro 1.000 Einwohner pro Jahr',
'Minor crime per 1k residents (avg/yr)':
'Rate leichter Straftaten pro 1.000 Einwohner pro Jahr',
'Serious crime (avg/yr)': 'Summe der schweren Straftaten-Kategorien pro Jahr',
'Minor crime (avg/yr)': 'Summe der leichten Straftaten-Kategorien pro Jahr',
'Serious crime (avg/yr)': 'Jährliche Summe schwerer Straftatkategorien',
'Minor crime (avg/yr)': 'Jährliche Summe leichter Straftatkategorien',
'Violence and sexual offences (avg/yr)':
'Jährlicher Durchschnitt der Gewalt- und Sexualdelikte in der Gegend',
'Burglary (avg/yr)': 'Jährlicher Durchschnitt der Einbrüche in der Gegend',
@ -173,7 +171,8 @@ const descriptions: Record<string, Record<string, string>> = {
'Criminal damage and arson (avg/yr)':
'Jährlicher Durchschnitt der Sachbeschädigungen und Brandstiftungen in der Gegend',
'Other theft (avg/yr)': 'Jährlicher Durchschnitt des sonstigen Diebstahls in der Gegend',
'Theft from the person (avg/yr)': 'Jährlicher Durchschnitt des Taschendiebstahls in der Gegend',
'Theft from the person (avg/yr)':
'Jährlicher Durchschnitt des Diebstahls von der Person in der Gegend',
'Shoplifting (avg/yr)': 'Jährlicher Durchschnitt des Ladendiebstahls in der Gegend',
'Bicycle theft (avg/yr)': 'Jährlicher Durchschnitt des Fahrraddiebstahls in der Gegend',
'Drugs (avg/yr)': 'Jährlicher Durchschnitt der Drogendelikte in der Gegend',
@ -183,15 +182,15 @@ const descriptions: Record<string, Record<string, string>> = {
'Jährlicher Durchschnitt der Störungen der öffentlichen Ordnung in der Gegend',
'Other crime (avg/yr)': 'Jährlicher Durchschnitt sonstiger Straftaten in der Gegend',
'Median age': 'Medianalter der lokalen Bevölkerung',
'% White': 'Anteil der Bevölkerung, der sich als Weiß identifiziert',
'% South Asian': 'Anteil der Bevölkerung, der sich als Südasiatisch identifiziert',
'% Black': 'Anteil der Bevölkerung, der sich als Schwarz identifiziert',
'% East Asian': 'Anteil der Bevölkerung, der sich als Ostasiatisch identifiziert',
'% White': 'Anteil der Personen, die sich als weiß identifizieren',
'% South Asian': 'Anteil der Personen, die sich als südasiatisch identifizieren',
'% Black': 'Anteil der Personen, die sich als schwarz identifizieren',
'% East Asian': 'Anteil der Personen, die sich als ostasiatisch identifizieren',
'% Mixed':
'Anteil der Bevölkerung, der sich als gemischt oder mehreren ethnischen Gruppen zugehörig identifiziert',
'% Other': 'Anteil der Bevölkerung, der sich einer anderen ethnischen Gruppe zuordnet',
'Anteil der Personen, die sich als gemischt oder mehreren ethnischen Gruppen zugehörig identifizieren',
'% Other': 'Anteil der Personen, die sich einer anderen ethnischen Gruppe zuordnen',
'Voter turnout (%)':
'Anteil der registrierten Wähler, die bei der Parlamentswahl 2024 gewählt haben',
'Anteil der registrierten Wählerinnen und Wähler, die bei der Parlamentswahl 2024 abgestimmt haben',
'% Labour': 'Labour-Stimmenanteil bei der Parlamentswahl 2024',
'% Conservative': 'Stimmenanteil der Konservativen bei der Parlamentswahl 2024',
'% Liberal Democrat': 'Stimmenanteil der Liberaldemokraten bei der Parlamentswahl 2024',
@ -199,54 +198,52 @@ const descriptions: Record<string, Record<string, string>> = {
'% Green': 'Stimmenanteil der Grünen bei der Parlamentswahl 2024',
'% Other parties': 'Kombinierter Stimmenanteil aller anderen Parteien und Unabhängigen',
'Distance to nearest park (km)': 'Entfernung zum nächsten Park oder Grünfläche',
'Noise (dB)': 'Straßenlärmpegel an der Postleitzahl in Dezibel (Lden)',
'Noise (dB)': 'Maximaler Verkehrslärmpegel in der Nähe des Postcodes in Dezibel (Lden)',
'Max available download speed (Mbps)':
'Maximal verfügbare Breitband-Downloadgeschwindigkeit an der Postleitzahl',
'Maximal verfügbare Breitband-Downloadgeschwindigkeit am Postcode',
Schools: 'Bewertete Grundschulen und weiterführende Schulen in der Nähe',
'Specific crimes': 'Jeweils eine Straßenkriminalitätskategorie filtern',
'Specific crimes': 'Jeweils eine Kategorie der Straßenkriminalität filtern',
Ethnicities: 'Bevölkerungsanteil nach ethnischer Gruppe',
'Amenity distance': 'Entfernung zu nahe gelegener Infrastruktur',
'Amenities within 2km': 'Anzahl nahe gelegener Infrastrukturangebote im Umkreis von 2 km',
'Amenities within 5km': 'Anzahl nahe gelegener Infrastrukturangebote im Umkreis von 5 km',
'Amenity distance': 'Entfernung zu nahegelegenen Angeboten',
'Amenities within 2km': 'Anzahl nahegelegener Angebote im Umkreis von 2 km',
'Amenities within 5km': 'Anzahl nahegelegener Angebote im Umkreis von 5 km',
'Political vote share': 'Stimmenanteil nach Partei bei der Parlamentswahl 2024',
},
zh: {
'Property type': '房产类型:独立式、半独立式、联排公寓或其他',
'Property type': '房产类型:独立式、半独立式、联排住宅、公寓/复式公寓或其他',
'Leasehold/Freehold': '该房产是租赁产权还是永久产权',
'Last known price': 'Land Registry记录的最近一次售价',
'Estimated current price': '模型估算的当前价格',
'Price per sqm': '价除以总建筑面积',
'Last known price': 'Land Registry 记录的最近一次成交价',
'Estimated current price': '模型估算的当前房产价值',
'Price per sqm': '成交价除以总建筑面积',
'Est. price per sqm': '估计当前价格除以总建筑面积',
'Estimated monthly rent': '当地私人租赁平均月租',
'Total floor area (sqm)': 'EPC评估的室内建筑面积',
'Number of bedrooms & living rooms': 'EPC评估的宜居房间数',
'Construction year': 'EPC评估的建造年份',
'Date of last transaction': 'Land Registry记录的最近一次销售日期',
'Former council house': '该房产是否曾被记录为公住房',
'Current energy rating': '当前EPC能效评级A = 最佳G = 最差)',
'Potential energy rating': '实施所有建议改进后的潜在EPC评级',
'Interior height (m)': 'EPC评估的平均层高',
'Street tree density percentile': '该房产所在街道的估计树冠覆盖率百分位',
'Estimated monthly rent': '当地私人租赁平均月租',
'Total floor area (sqm)': 'EPC 评估记录的室内建筑面积',
'Number of bedrooms & living rooms': 'EPC 评估记录的可居住房间数',
'Construction year': '根据 EPC 估算的建造年份',
'Date of last transaction': 'Land Registry 记录的最近一次成交日期',
'Former council house': '该房产是否曾被记录为公房或社会住房',
'Current energy rating': '当前 EPC 能源评级A = 最佳G = 最差)',
'Potential energy rating': '完成所有建议改进后的潜在 EPC 评级',
'Interior height (m)': 'EPC 评估记录的平均室内层高',
'Street tree density percentile': '邮编周边估计街道树木覆盖率百分位',
'Within conservation area': '邮编代表点是否位于指定保护区内',
'Listed building': '该房产是否疑似匹配 Historic England 的受保护建筑条目',
'Good+ primary schools within 2km': 'Ofsted评为良好或优秀的2公里内小学',
'Good+ secondary schools within 2km': 'Ofsted评为良好或优秀的2公里内中学',
'Good+ primary schools within 5km': 'Ofsted评为良好或优秀的5公里内小学',
'Good+ secondary schools within 5km': 'Ofsted评为良好或优秀的5公里内中学',
'Outstanding primary schools within 2km': 'Ofsted评为优秀的2公里内小学',
'Outstanding secondary schools within 2km': 'Ofsted评为优秀的2公里内中学',
'Outstanding primary schools within 5km': 'Ofsted评为优秀的5公里内小学',
'Outstanding secondary schools within 5km': 'Ofsted评为优秀的5公里内中学',
'Education, Skills and Training Score': '教育与技能贫困百分位(越高越不贫困',
'Income Score': '收入贫困百分位(越高越不贫困',
'Employment Score': '就业贫困百分位(越高越不贫困',
'Health Deprivation and Disability Score': '健康与残障贫困百分位(越高结果越好)',
'Listed building': '该房产是否疑似对应 Historic England 的登录建筑记录',
'Good+ primary schools within 2km': '2 公里内 Ofsted 评为良好或优秀的小学',
'Good+ secondary schools within 2km': '2 公里内 Ofsted 评为良好或优秀的中学',
'Good+ primary schools within 5km': '5 公里内 Ofsted 评为良好或优秀的小学',
'Good+ secondary schools within 5km': '5 公里内 Ofsted 评为良好或优秀的中学',
'Outstanding primary schools within 2km': '2 公里内 Ofsted 评为优秀的小学',
'Outstanding secondary schools within 2km': '2 公里内 Ofsted 评为优秀的中学',
'Outstanding primary schools within 5km': '5 公里内 Ofsted 评为优秀的小学',
'Outstanding secondary schools within 5km': '5 公里内 Ofsted 评为优秀的中学',
'Education, Skills and Training Score': '教育、技能与培训剥夺百分位(越高 = 剥夺越少',
'Income Score': '收入剥夺百分位(越高 = 剥夺越少',
'Employment Score': '就业剥夺百分位(越高 = 剥夺越少',
'Health Deprivation and Disability Score': '健康与残障剥夺百分位(越高 = 结果越好)',
'Housing Conditions Score': '住房条件百分位(越高条件越好)',
'Air Quality and Road Safety Score': '空气质量和道路安全百分位(越高条件越好)',
'Serious crime per 1k residents (avg/yr)': '每千人每年严重犯罪率',
'Minor crime per 1k residents (avg/yr)': '每千人每年轻微犯罪率',
'Serious crime (avg/yr)': '严重犯罪类别年度总计',
'Minor crime (avg/yr)': '轻微犯罪类别年度总计',
'Air Quality and Road Safety Score': '空气质量与道路安全百分位(越高条件越好)',
'Serious crime (avg/yr)': '严重犯罪类别的年均合计',
'Minor crime (avg/yr)': '轻微犯罪类别的年均合计',
'Violence and sexual offences (avg/yr)': '该地区年均暴力和性犯罪数',
'Burglary (avg/yr)': '该地区年均入室盗窃数',
'Robbery (avg/yr)': '该地区年均抢劫数',
@ -268,23 +265,23 @@ const descriptions: Record<string, Record<string, string>> = {
'% East Asian': '东亚裔人口比例',
'% Mixed': '混血或多族裔人口比例',
'% Other': '其他族裔人口比例',
'Voter turnout (%)': '2024年大选中登记选民的投票率',
'% Labour': '2024年大选中工党得票率',
'% Conservative': '2024年大选中保守党得票率',
'% Liberal Democrat': '2024年大选中自由民主党得票率',
'% Reform UK': '2024年大选中英国改革党得票率',
'% Green': '2024年大选中绿党得票率',
'Voter turnout (%)': '2024 年大选中登记选民的投票率',
'% Labour': '2024 年大选中工党得票率',
'% Conservative': '2024 年大选中保守党得票率',
'% Liberal Democrat': '2024 年大选中自由民主党得票率',
'% Reform UK': '2024 年大选中英国改革党得票率',
'% Green': '2024 年大选中绿党得票率',
'% Other parties': '所有其他政党和独立候选人的综合得票率',
'Distance to nearest park (km)': '到最近公园或绿地的距离',
'Noise (dB)': '该邮编的道路噪音水平分贝Lden',
'Max available download speed (Mbps)': '该邮编可用的最宽带下载速度',
'Noise (dB)': '该邮编附近最高交通噪音水平Lden分贝',
'Max available download speed (Mbps)': '该邮编可用的最宽带下载速度',
Schools: '附近有评级的小学和中学',
'Specific crimes': '一次筛选一种街面犯罪类别',
Ethnicities: '按族裔群体划分的人口比例',
'Amenity distance': '到附近配套设施的距离',
'Amenities within 2km': '2公里内附近配套设施数量',
'Amenities within 5km': '5公里内附近配套设施数量',
'Political vote share': '2024年大选中各政党的得票份额',
'Amenities within 2km': '2 公里内附近配套设施数量',
'Amenities within 5km': '5 公里内附近配套设施数量',
'Political vote share': '2024 年大选中各政党的得票率',
},
hi: {
'Property type': 'संपत्ति प्रकार: अलग, अर्ध-स्वतंत्र, कतारबद्ध, फ्लैट या अन्य',
@ -330,8 +327,6 @@ const descriptions: Record<string, Record<string, string>> = {
'Housing Conditions Score': 'आवास स्थिति प्रतिशतक (अधिक = बेहतर स्थिति)',
'Air Quality and Road Safety Score':
'हवा की गुणवत्ता और सड़क सुरक्षा प्रतिशतक (अधिक = बेहतर स्थिति)',
'Serious crime per 1k residents (avg/yr)': 'प्रति 1,000 निवासियों सालाना गंभीर अपराध दर',
'Minor crime per 1k residents (avg/yr)': 'प्रति 1,000 निवासियों सालाना मामूली अपराध दर',
'Serious crime (avg/yr)': 'गंभीर अपराध श्रेणियों का सालाना कुल',
'Minor crime (avg/yr)': 'मामूली अपराध श्रेणियों का सालाना कुल',
'Violence and sexual offences (avg/yr)': 'क्षेत्र में हिंसा और यौन अपराधों का सालाना औसत',
@ -421,8 +416,6 @@ const descriptions: Record<string, Record<string, string>> = {
'Housing Conditions Score': 'Lakáskörülmények percentilise (magasabb = jobb körülmények)',
'Air Quality and Road Safety Score':
'Levegőminőség és közlekedésbiztonság percentilise (magasabb = jobb körülmények)',
'Serious crime per 1k residents (avg/yr)': 'Súlyos bűncselekmények aránya 1000 lakosra évente',
'Minor crime per 1k residents (avg/yr)': 'Kisebb bűncselekmények aránya 1000 lakosra évente',
'Serious crime (avg/yr)': 'Súlyos bűncselekményi kategóriák éves összesítése',
'Minor crime (avg/yr)': 'Kisebb bűncselekményi kategóriák éves összesítése',
'Violence and sexual offences (avg/yr)':

View file

@ -6,19 +6,19 @@
export const details: Record<string, Record<string, string>> = {
fr: {
'Property type':
'Provient des données HM Land Registry Price Paid et des certificats EPC. Individuelle, Semi-individuelle, Mitoyenne (inclut tous les sous-types de maisons en rangée), Appartements/Maisons duplex, ou Autre (bungalows, mobil-homes, etc.).',
'Données HM Land Registry Price Paid et certificats EPC. Maison individuelle, maison jumelée, maison mitoyenne (tous les sous-types de maisons en rangée), appartement/maisonette, ou autre type (bungalows, park homes, etc.).',
'Leasehold/Freehold':
"Provient des données HM Land Registry Price Paid. Freehold signifie que vous êtes propriétaire du bâtiment et du terrain sur lequel il se trouve. Leasehold signifie que vous êtes propriétaire du bâtiment mais pas du terrain : vous disposez d'un bail accordé par le propriétaire du terrain pour un nombre d'années déterminé.",
"Données HM Land Registry Price Paid. Freehold signifie que vous possédez le bâtiment et le terrain sur lequel il se trouve. Leasehold signifie que vous possédez le bâtiment mais pas le terrain : vous détenez un bail accordé par le freeholder pour une durée déterminée.",
'Last known price':
"Le dernier prix de vente enregistré pour ce bien provenant des données HM Land Registry Price Paid. Couvre les ventes résidentielles en Angleterre. Peut dater de plusieurs années si le bien n'a pas été vendu récemment.",
'Estimated current price':
"Basé sur le dernier prix de vente, les mouvements locaux des prix de revente et les biens vendus récemment à proximité. L'indice de ventes répétées est suivi par secteur de code postal et type de bien, avec lissage et combinaison avec les voisins lorsque les données sont limitées. Les ventes récentes restent proches du prix enregistré ; les ventes plus anciennes dépendent davantage du modèle.",
"Basé sur le dernier prix de vente, l'évolution locale des prix lors de reventes répétées et les biens récemment vendus à proximité. L'indice de reventes est suivi par secteur de code postal et type de bien, avec lissage et intégration des secteurs voisins lorsque les données sont rares. Les ventes récentes restent proches du prix enregistré ; les ventes plus anciennes dépendent davantage du modèle.",
'Price per sqm':
'Calculé en divisant le dernier prix de vente connu par la surface habitable totale indiquée dans le certificat EPC. Utile pour comparer la valeur entre des biens de tailles différentes. Disponible uniquement lorsque les données de prix et de surface existent toutes les deux.',
'Est. price per sqm':
'Calculé en divisant le prix actuel estimé par le modèle par la surface habitable totale indiquée dans le certificat EPC. Fournit une comparaison prix/superficie plus actualisée que le prix au mètre carré basé sur le prix de vente historique.',
'Estimated monthly rent':
"Prix moyen mensuel de location provenant de l'indice des loyers privés de l'ONS (PIPR), correspondant à l'autorité locale et au nombre de chambres.",
"Loyer mensuel moyen issu de l'ONS Price Index of Private Rents (PIPR), apparié selon la local authority et le nombre de chambres.",
'Total floor area (sqm)':
"Surface habitable totale en mètres carrés telle que mesurée lors de l'évaluation du certificat de performance énergétique (EPC). Inclut toutes les pièces habitables mais exclut les garages, dépendances et espaces extérieurs.",
'Number of bedrooms & living rooms':
@ -26,9 +26,9 @@ export const details: Record<string, Record<string, string>> = {
'Construction year':
"Dérivé de la tranche d'âge de construction indiquée dans l'EPC (par exemple « 1930-1949 ») en prenant le point médian. Moins précis pour les bâtiments anciens où la tranche d'âge s'étend sur plusieurs décennies.",
'Date of last transaction':
'La date de la vente enregistrée la plus récente pour ce bien, provenant des données HM Land Registry Price Paid. Stockée sous forme de date/heure dans les données ; convertie en année fractionnaire pour le filtrage et les graphiques.',
'Date de la vente enregistrée la plus récente pour ce bien dans les données HM Land Registry Price Paid. Stockée comme date/heure dans les données, puis convertie en année décimale pour les filtres et les graphiques.',
'Former council house':
"Dérivé du champ TENURE dans les données du certificat de performance énergétique (EPC). Si l'un des certificats EPC pour ce bien a enregistré le régime d'occupation comme location sociale, cela indique que le bien faisait partie du parc de logements du conseil municipal ou d'une association de logement au moment de cette inspection. Les biens qui ont été vendus ultérieurement (par exemple via le Right to Buy) conservent cet indicateur.",
"Déduit du champ TENURE des données Energy Performance Certificate. Si l'un des certificats EPC de ce bien indique un tenure de type social rental, cela signale qu'il faisait partie du parc de logements d'une council ou d'une housing association au moment de l'inspection. Les biens vendus ensuite, par exemple via Right to Buy, conservent cet indicateur.",
'Current energy rating':
"La note d'efficacité énergétique actuelle issue du certificat de performance énergétique (EPC). Va de A (plus efficace) à G (moins efficace). Basée sur la consommation d'énergie du bien par mètre carré de surface habitable.",
'Potential energy rating':
@ -38,73 +38,69 @@ export const details: Record<string, Record<string, string>> = {
'Street tree density percentile':
"Couverture arborée approximative autour du centroïde du code postal, dérivée de la carte Trees Outside Woodland 2025 de Forest Research. Les polygones de couvert arboré des arbres isolés et groupes d'arbres sont comptés dans un rayon de 50 m de chaque centroïde de code postal, puis convertis en percentile parmi les codes postaux anglais. Il s'agit d'une approximation fondée sur le centroïde du code postal, pas d'une mesure exacte du bien ou du segment de rue.",
'Within conservation area':
"Limites de zones de conservation de Planning Data, rattachées au point représentatif du code postal. Le jeu de données national est en cours d'amélioration et peut contenir des doublons ou une couverture locale incomplète ; les décisions sensibles aux limites doivent être vérifiées auprès de l'autorité locale de planification.",
"Limites des conservation areas dans Planning Data, rattachées au point représentatif du code postal. Le jeu de données national est encore en cours de constitution et peut contenir des doublons ou une couverture locale incomplète ; toute décision dépendant précisément d'une limite doit être vérifiée auprès de la local planning authority.",
'Listed building':
"Points de bâtiments classés de la National Heritage List for England de Historic England, associés prudemment aux adresses des biens à partir du nom de l'entrée classée et de codes postaux proches candidats. À traiter comme un signal de présélection, pas comme une décision juridique : vérifiez tout bien précis dans la NHLE et auprès de l'autorité locale de planification.",
"Points de listed buildings dans la National Heritage List for England de Historic England, appariés prudemment aux adresses à partir du nom de l'entrée classée et de codes postaux candidats à proximité. À utiliser comme signal de présélection, pas comme conclusion juridique : vérifiez tout bien précis dans la NHLE et auprès de la local planning authority.",
'Good+ primary schools within 2km':
"Écoles primaires financées par l'État dans un rayon de 2km ayant une note Ofsted actuelle de Bon ou Exceptionnel. Les écoles n'ayant pas encore été inspectées sont exclues.",
"Écoles primaires financées par l'État dans un rayon de 2 km ayant une note Ofsted actuelle Good ou Outstanding. Les écoles non encore inspectées sont exclues.",
'Good+ secondary schools within 2km':
"Lycées et collèges financés par l'État dans un rayon de 2km ayant une note Ofsted actuelle de Bon ou Exceptionnel. Les établissements n'ayant pas encore été inspectés sont exclus.",
"Écoles secondaires financées par l'État dans un rayon de 2 km ayant une note Ofsted actuelle Good ou Outstanding. Les établissements non encore inspectés sont exclus.",
'Good+ primary schools within 5km':
"Écoles primaires financées par l'État dans un rayon de 5km ayant une note Ofsted actuelle de Bon ou Exceptionnel. Les écoles n'ayant pas encore été inspectées sont exclues.",
"Écoles primaires financées par l'État dans un rayon de 5 km ayant une note Ofsted actuelle Good ou Outstanding. Les écoles non encore inspectées sont exclues.",
'Good+ secondary schools within 5km':
"Lycées et collèges financés par l'État dans un rayon de 5km ayant une note Ofsted actuelle de Bon ou Exceptionnel. Les établissements n'ayant pas encore été inspectés sont exclus.",
"Écoles secondaires financées par l'État dans un rayon de 5 km ayant une note Ofsted actuelle Good ou Outstanding. Les établissements non encore inspectés sont exclus.",
'Outstanding primary schools within 2km':
"Écoles primaires financées par l'État dans un rayon de 2km ayant une note Ofsted actuelle d'Exceptionnel. Les écoles n'ayant pas encore été inspectées sont exclues.",
"Écoles primaires financées par l'État dans un rayon de 2 km ayant une note Ofsted actuelle Outstanding. Les écoles non encore inspectées sont exclues.",
'Outstanding secondary schools within 2km':
"Lycées et collèges financés par l'État dans un rayon de 2km ayant une note Ofsted actuelle d'Exceptionnel. Les établissements n'ayant pas encore été inspectés sont exclus.",
"Écoles secondaires financées par l'État dans un rayon de 2 km ayant une note Ofsted actuelle Outstanding. Les établissements non encore inspectés sont exclus.",
'Outstanding primary schools within 5km':
"Écoles primaires financées par l'État dans un rayon de 5km ayant une note Ofsted actuelle d'Exceptionnel. Les écoles n'ayant pas encore été inspectées sont exclues.",
"Écoles primaires financées par l'État dans un rayon de 5 km ayant une note Ofsted actuelle Outstanding. Les écoles non encore inspectées sont exclues.",
'Outstanding secondary schools within 5km':
"Lycées et collèges financés par l'État dans un rayon de 5km ayant une note Ofsted actuelle d'Exceptionnel. Les établissements n'ayant pas encore été inspectés sont exclus.",
"Écoles secondaires financées par l'État dans un rayon de 5 km ayant une note Ofsted actuelle Outstanding. Les établissements non encore inspectés sont exclus.",
'Education, Skills and Training Score':
"Provient des Indices de Déprivation anglais, converti en percentile national où 0 % indique les secteurs les plus défavorisés et 100 % les moins défavorisés. Couvre les résultats scolaires, l'accès à l'enseignement supérieur, les qualifications des adultes et la maîtrise de la langue anglaise.",
"Issu des English Indices of Deprivation, converti en percentile national : 0 % correspond aux zones les plus défavorisées et 100 % aux moins défavorisées. Couvre les résultats scolaires, l'accès à l'enseignement supérieur, les qualifications des adultes et la maîtrise de l'anglais.",
'Income Score':
"Provient des Indices de Déprivation anglais, converti en percentile national où 0 % indique la plus forte déprivation de revenus et 100 % la plus faible. Basé sur les allocations de soutien au revenu, l'allocation de demandeur d'emploi sous condition de ressources, l'allocation d'emploi et de soutien sous condition de ressources, le crédit de retraite, le crédit d'impôt pour le travail et les enfants, l'Universal Credit et les demandeurs d'asile.",
"Issu des English Indices of Deprivation, converti en percentile national : 0 % correspond à la plus forte défavorisation liée au revenu et 100 % à la plus faible. Basé sur Income Support, income-based Jobseeker's Allowance, income-based Employment and Support Allowance, Pension Credit, Working Tax Credit et Child Tax Credit, Universal Credit, ainsi que les demandeurs d'asile.",
'Employment Score':
"Provient des Indices de Déprivation anglais, converti en percentile national où 0 % indique la plus forte déprivation d'emploi et 100 % la plus faible. Basé sur les allocataires de l'allocation de demandeur d'emploi, de l'allocation d'emploi et de soutien, de l'allocation d'incapacité, de l'allocation de handicap sévère, de l'allocation d'aidant et les bénéficiaires pertinents de l'Universal Credit.",
"Issu des English Indices of Deprivation, converti en percentile national : 0 % correspond à la plus forte défavorisation liée à l'emploi et 100 % à la plus faible. Basé sur les bénéficiaires de Jobseeker's Allowance, Employment and Support Allowance, Incapacity Benefit, Severe Disablement Allowance, Carer's Allowance et les bénéficiaires pertinents d'Universal Credit.",
'Health Deprivation and Disability Score':
"Provient des Indices de Déprivation anglais, converti en percentile national où 0 % indique la plus forte déprivation de santé et 100 % la plus faible. Dérivé des années de vie potentielle perdues, du ratio comparatif de maladie et d'invalidité, de la morbidité aiguë et des troubles de l'humeur et d'anxiété.",
"Issu des English Indices of Deprivation, converti en percentile national : 0 % correspond à la plus forte défavorisation liée à la santé et 100 % à la plus faible. Dérivé des années potentielles de vie perdues, du ratio comparatif de maladie et d'invalidité, de la morbidité aiguë et des troubles de l'humeur et de l'anxiété.",
'Housing Conditions Score':
'Provient du domaine Environnement de vie des Indices de Déprivation anglais, converti en percentile national où 0 % indique les pires conditions et 100 % les meilleures. Mesure la qualité du parc immobilier : disponibilité du chauffage central, état des logements et normes Decent Homes.',
'Issu du domaine Living Environment des English Indices of Deprivation, converti en percentile national : 0 % correspond aux zones les plus défavorisées et 100 % aux moins défavorisées. Mesure la qualité du parc de logements : disponibilité du chauffage central, état des logements et respect des normes Decent Homes.',
'Air Quality and Road Safety Score':
"Provient du domaine Environnement de vie des Indices de Déprivation anglais, converti en percentile national où 0 % indique les pires conditions et 100 % les meilleures. Mesure l'environnement extérieur via la qualité de l'air et les victimes d'accidents de la route impliquant des piétons et des cyclistes.",
'Serious crime per 1k residents (avg/yr)':
"Violences, braquages, cambriolages et possession d'armes pour 1 000 résidents habituels par an dans le LSOA. Utilise les données de criminalité au niveau de la rue de police.uk et les décomptes de population du Census 2021. Normalise en fonction de la densité de population afin que les zones soient comparables quelle que soit leur taille.",
'Minor crime per 1k residents (avg/yr)':
"Comportements antisociaux, vols à l'étalage, vols de vélos et autres crimes de moindre gravité pour 1 000 résidents habituels par an dans le LSOA. Utilise les données de criminalité au niveau de la rue de police.uk et les décomptes de population du Census 2021. Normalise en fonction de la densité de population afin que les zones soient comparables quelle que soit leur taille.",
"Issu du domaine Living Environment des English Indices of Deprivation, converti en percentile national : 0 % correspond aux zones les plus défavorisées et 100 % aux moins défavorisées. Mesure l'environnement extérieur au moyen d'indicateurs de qualité de l'air et des victimes d'accidents de la route impliquant piétons et cyclistes.",
'Serious crime (avg/yr)':
"Somme des violences, braquages, cambriolages et possessions d'armes par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Fournit un indicateur unique de criminalité grave.",
"Somme annuelle des violences, robberies, burglaries et possessions d'armes dans un rayon de 50 m du code postal, comptée à partir des points de criminalité street-level de police.uk (anonymisés et rattachés à des points cartographiques proches). Fournit un indicateur unique de criminalité grave.",
'Minor crime (avg/yr)':
"Somme des comportements antisociaux, vols à l'étalage, vols de vélos et autres crimes de moindre gravité par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Fournit un indicateur unique de criminalité mineure.",
"Somme annuelle des comportements antisociaux, shoplifting, vols de vélos et autres infractions de moindre gravité dans un rayon de 50 m du code postal, comptée à partir des points de criminalité street-level de police.uk (anonymisés et rattachés à des points cartographiques proches). Fournit un indicateur unique de criminalité mineure.",
'Violence and sexual offences (avg/yr)':
'Nombre moyen de violences et infractions sexuelles par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut les agressions, le harcèlement et les infractions sexuelles.',
'Nombre moyen annuel de violences et infractions sexuelles dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut les agressions, le harcèlement et les infractions sexuelles.',
'Burglary (avg/yr)':
'Nombre moyen de cambriolages par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut les cambriolages résidentiels et commerciaux.',
'Nombre moyen annuel de burglaries dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut les cambriolages résidentiels et commerciaux.',
'Robbery (avg/yr)':
'Nombre moyen de braquages par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Le braquage implique un vol avec usage ou menace de la force.',
"Nombre moyen annuel de robberies dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Le robbery désigne un vol avec usage ou menace d'usage de la force.",
'Vehicle crime (avg/yr)':
"Nombre moyen d'incidents de criminalité liés aux véhicules par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut le vol de véhicules et les vols à l'intérieur des véhicules.",
"Nombre moyen annuel d'incidents de criminalité liée aux véhicules dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut le vol de véhicules et les vols dans les véhicules.",
'Anti-social behaviour (avg/yr)':
"Nombre moyen d'incidents de comportement antisocial par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut les nuisances, les comportements antisociaux environnementaux et personnels.",
"Nombre moyen annuel d'incidents d'anti-social behaviour dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut les nuisances et les comportements antisociaux environnementaux ou personnels.",
'Criminal damage and arson (avg/yr)':
"Nombre moyen d'incidents de dommages criminels et d'incendie volontaire par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk.",
"Nombre moyen annuel d'incidents de criminal damage and arson dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk.",
'Other theft (avg/yr)':
"Nombre moyen d'infractions de « vol divers » par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut les vols ne relevant pas des catégories cambriolage, criminalité liée aux véhicules, vol à l'étalage ou vol de vélos.",
"Nombre moyen annuel d'infractions « other theft » dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut les vols non classés en burglary, vehicle crime, shoplifting ou bicycle theft.",
'Theft from the person (avg/yr)':
"Nombre moyen d'infractions de vol à la tire par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut le pickpocket et l'arrachage de sac sans violence.",
"Nombre moyen annuel d'infractions de theft from the person dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut le pickpocket et l'arrachage de sac sans recours à la force.",
'Shoplifting (avg/yr)':
"Nombre moyen d'infractions de vol à l'étalage par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk.",
"Nombre moyen annuel d'infractions de shoplifting dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk.",
'Bicycle theft (avg/yr)':
"Nombre moyen d'infractions de vol de vélos par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk.",
"Nombre moyen annuel d'infractions de vol de vélos dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk.",
'Drugs (avg/yr)':
"Nombre moyen d'infractions liées aux drogues par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut les infractions de possession et de trafic.",
"Nombre moyen annuel d'infractions liées aux drugs dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut les infractions de possession et de trafic.",
'Possession of weapons (avg/yr)':
"Nombre moyen d'infractions de possession d'armes par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk.",
"Nombre moyen annuel d'infractions de possession of weapons dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk.",
'Public order (avg/yr)':
"Nombre moyen d'infractions à l'ordre public par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Inclut les actes causant de la peur, de l'alarme ou de la détresse.",
"Nombre moyen annuel d'infractions de public order dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Inclut les actes provoquant peur, alarme ou détresse.",
'Other crime (avg/yr)':
"Nombre moyen d'autres infractions criminelles par an dans le LSOA, provenant des données de criminalité au niveau de la rue de police.uk. Catégorie fourre-tout pour les infractions non classées ailleurs.",
"Nombre moyen annuel d'infractions « other crime » dans un rayon de 50 m du code postal, daprès les données de criminalité street-level de police.uk. Catégorie résiduelle pour les infractions non classées ailleurs.",
'Median age':
"Provient du Census 2021 (TS007A). Âge médian des résidents habituels dans le LSOA, calculé par interpolation linéaire à partir des effectifs par tranche d'âge de cinq ans. Les zones à population plus jeune ont tendance à être urbaines, universitaires ou à accueillir davantage de familles ; les médianes plus élevées sont typiques des zones rurales et côtières.",
'% White':
@ -134,23 +130,23 @@ export const details: Record<string, Record<string, string>> = {
'% Other parties':
'Pourcentage des votes valides exprimés pour des partis autres que Travailliste, Conservateur, Libéral-démocrate, Reform UK et Vert dans la circonscription couvrant ce code postal. Comprend les indépendants, le Président de la Chambre et les partis mineurs.',
'Distance to nearest park (km)':
"Distance à vol d'oiseau en kilomètres depuis le code postal jusqu'à l'entrée du parc la plus proche. Couvre les parcs publics, jardins, terrains de jeux et espaces de loisirs. Utilise les emplacements des points d'accès issus du jeu de données OS Open Greenspace, de sorte que les propriétés bordant un grand parc affichent correctement une courte distance.",
"Distance à vol d'oiseau en kilomètres entre le code postal et l'entrée de parc la plus proche. Couvre les parcs publics, jardins, terrains de sport et aires de jeux. Utilise les points d'accès du jeu de données OS Open Greenspace, afin que les biens en bordure d'un grand parc affichent bien une courte distance.",
'Noise (dB)':
"Niveau de bruit routier en décibels (Lden, moyenne pondérée sur 24 heures) provenant de la cartographie stratégique du bruit de Defra, 4e cycle (2022). Modélisé à 4m au-dessus du sol sur une grille de 10m. Au-dessus d'environ 55 dB, le bruit est généralement perceptible ; au-dessus d'environ 70 dB, il est considéré comme nocif par l'OMS.",
"Niveau maximal de bruit routier, ferroviaire ou aérien en décibels (Lden, moyenne pondérée sur 24 heures) d'après le Strategic Noise Mapping Round 4 de Defra (2022). Modélisé à 4 m au-dessus du sol sur une grille de 10 m et échantillonné comme la cellule de 10 m la plus bruyante autour du point représentatif du code postal. Au-dessus d'environ 55 dB, le bruit est généralement perceptible ; au-dessus d'environ 70 dB, l'OMS le considère comme nocif.",
'Max available download speed (Mbps)':
"Vitesse de téléchargement fixe maximale disponible auprès de n'importe quel fournisseur, provenant d'Ofcom Connected Nations 2025. Représente le maximum théorique, et non les vitesses réellement atteintes. 10 Mbps = basique, 30 = superrapide, 100+ = ultra-rapide, 1000 = gigabit.",
"Débit descendant maximal de haut débit fixe disponible auprès de n'importe quel fournisseur, d'après Ofcom Connected Nations 2025. Il s'agit du maximum théorique, pas des débits réellement obtenus. 10 Mbps = basique, 30 = superfast, 100+ = ultrafast, 1000 = gigabit.",
Schools:
"Filtre les écoles primaires ou secondaires financées par l'État à proximité, selon la note Ofsted et la distance choisies. Les seuils disponibles couvrent généralement les écoles Bonnes ou Exceptionnelles, ou uniquement Exceptionnelles, dans un rayon de 2 km ou 5 km.",
'Specific crimes':
"Filtre une catégorie de criminalité de rue à la fois, en utilisant la moyenne annuelle des infractions dans le LSOA. Les valeurs proviennent des données police.uk et permettent d'isoler des catégories comme cambriolage, véhicules ou comportement antisocial.",
"Filtre une catégorie de criminalité street-level à la fois, en utilisant la moyenne annuelle des infractions dans un rayon de 50 m du code postal. Les valeurs proviennent des données police.uk et permettent d'isoler des catégories comme burglary, vehicle crime ou anti-social behaviour.",
Ethnicities:
"Filtre le pourcentage de population appartenant à un groupe ethnique sélectionné, d'après le Census 2021. Une seule catégorie est appliquée à la fois afin de comparer la composition locale entre les secteurs.",
'Amenity distance':
"Filtre la distance à la commodité la plus proche du type choisi, calculée depuis le centroïde du code postal. Utilise les données OpenStreetMap pour comparer l'accès local aux services et équipements.",
"Filtre la distance jusqu'au service ou équipement le plus proche du type choisi, calculée depuis le centroïde du code postal. Utilise les données OpenStreetMap pour comparer l'accès local aux services et équipements.",
'Amenities within 2km':
'Filtre le nombre de commodités du type choisi dans un rayon de 2 km autour du code postal. Utile pour comparer les équipements accessibles à pied ou à courte distance.',
'Filtre le nombre de services ou équipements du type choisi dans un rayon de 2 km autour du code postal. Utile pour comparer ce qui est accessible à pied ou à courte distance.',
'Amenities within 5km':
"Filtre le nombre de commodités du type choisi dans un rayon de 5 km autour du code postal. Utile pour comparer l'offre plus large de services, commerces et équipements autour d'un secteur.",
"Filtre le nombre de services ou équipements du type choisi dans un rayon de 5 km autour du code postal. Utile pour comparer l'offre plus large de services, commerces et équipements autour d'un secteur.",
'Political vote share':
'Filtre le pourcentage de votes obtenu par un parti sélectionné dans la circonscription couvrant chaque code postal, lors des élections générales britanniques de juillet 2024.',
},
@ -219,10 +215,6 @@ export const details: Record<string, Record<string, string>> = {
'Aus dem Bereich Wohnumgebung der englischen Deprivationsindizes, in ein nationales Perzentil umgerechnet: 0 % steht für die schlechtesten und 100 % für die besten Bedingungen. Misst die Qualität des Wohnungsbestands: Verfügbarkeit von Zentralheizung, Wohnungszustand und Decent Homes-Standards.',
'Air Quality and Road Safety Score':
'Aus dem Bereich Wohnumgebung der englischen Deprivationsindizes, in ein nationales Perzentil umgerechnet: 0 % steht für die schlechtesten und 100 % für die besten Bedingungen. Misst die Außenwohnumgebung anhand von Luftqualitätsindikatoren und Straßenverkehrsunfällen mit Fußgängern und Radfahrern.',
'Serious crime per 1k residents (avg/yr)':
'Gewalt, Raub, Einbruch und Waffenbesitz pro 1.000 Einwohner pro Jahr im LSOA. Verwendet police.uk-Kriminalitätsdaten auf Straßenebene und Census 2021-Bevölkerungszahlen. Normalisiert nach Bevölkerungsdichte, sodass Gebiete unabhängig von ihrer Größe vergleichbar sind.',
'Minor crime per 1k residents (avg/yr)':
'Asoziales Verhalten, Ladendiebstahl, Fahrraddiebstahl und andere weniger schwere Straftaten pro 1.000 Einwohner pro Jahr im LSOA. Verwendet police.uk-Kriminalitätsdaten auf Straßenebene und Census 2021-Bevölkerungszahlen. Normalisiert nach Bevölkerungsdichte, sodass Gebiete unabhängig von ihrer Größe vergleichbar sind.',
'Serious crime (avg/yr)':
'Summe aus Gewalt, Raub, Einbruch und Waffenbesitz pro Jahr im LSOA, aus police.uk-Kriminalitätsdaten auf Straßenebene. Bietet einen einzelnen Indikator für schwere Kriminalität.',
'Minor crime (avg/yr)':
@ -369,10 +361,6 @@ export const details: Record<string, Record<string, string>> = {
'来自英格兰剥夺指数的居住环境领域转换为全国百分位0%表示条件最差100%表示条件最好。衡量住房存量质量中央供暖覆盖率、住房状况以及Decent Homes标准。',
'Air Quality and Road Safety Score':
'来自英格兰剥夺指数的居住环境领域转换为全国百分位0%表示条件最差100%表示条件最好。通过空气质量指标以及涉及行人和骑行者的道路交通事故伤亡人数衡量室外生活环境质量。',
'Serious crime per 1k residents (avg/yr)':
'LSOA内每1,000名常住居民每年发生的暴力、抢劫、入室盗窃和持有武器犯罪数量。使用police.uk街道级犯罪数据和Census 2021人口数据。按人口密度标准化便于不同规模地区之间的比较。',
'Minor crime per 1k residents (avg/yr)':
'LSOA内每1,000名常住居民每年发生的反社会行为、商店行窃、自行车盗窃及其他较轻微犯罪数量。使用police.uk街道级犯罪数据和Census 2021人口数据。按人口密度标准化便于不同规模地区之间的比较。',
'Serious crime (avg/yr)':
'来自police.uk街道级犯罪数据的LSOA内每年暴力、抢劫、入室盗窃和持有武器犯罪总和。提供单一的严重犯罪指标。',
'Minor crime (avg/yr)':
@ -511,10 +499,6 @@ export const details: Record<string, Record<string, string>> = {
'English Indices of Deprivation के Living Environment क्षेत्र से लिया गया और राष्ट्रीय प्रतिशतक में बदला गया: 0% सबसे खराब स्थितियों और 100% सबसे अच्छी स्थितियों को दर्शाता है. यह आवास भंडार की गुणवत्ता मापता है: केंद्रीय हीटिंग की उपलब्धता, आवास की स्थिति और Decent Homes मानक.',
'Air Quality and Road Safety Score':
'English Indices of Deprivation के Living Environment क्षेत्र से लिया गया और राष्ट्रीय प्रतिशतक में बदला गया: 0% सबसे खराब स्थितियों और 100% सबसे अच्छी स्थितियों को दर्शाता है. यह वायु गुणवत्ता संकेतकों और पैदल यात्रियों/साइकिल चालकों से जुड़े सड़क यातायात दुर्घटना हताहतों के जरिए बाहरी रहने के वातावरण की गुणवत्ता मापता है.',
'Serious crime per 1k residents (avg/yr)':
'LSOA में प्रति 1,000 सामान्य निवासियों पर प्रति वर्ष हिंसा, लूट, सेंधमारी और हथियार रखने के अपराध. police.uk के सड़क-स्तर अपराध डेटा और Census 2021 जनसंख्या गणना का उपयोग करता है. जनसंख्या घनत्व के अनुसार सामान्यीकृत करता है ताकि क्षेत्र आकार की परवाह किए बिना तुलनीय हों.',
'Minor crime per 1k residents (avg/yr)':
'LSOA में प्रति 1,000 सामान्य निवासियों पर प्रति वर्ष असामाजिक व्यवहार, दुकान से चोरी, साइकिल चोरी और अन्य कम-गंभीर अपराध. police.uk के सड़क-स्तर अपराध डेटा और Census 2021 जनसंख्या गणना का उपयोग करता है. जनसंख्या घनत्व के अनुसार सामान्यीकृत करता है ताकि क्षेत्र तुलनीय हों.',
'Serious crime (avg/yr)':
'LSOA में प्रति वर्ष हिंसा, लूट, सेंधमारी और हथियार रखने के अपराधों का योग, police.uk के सड़क-स्तर अपराध डेटा से. गंभीर अपराध का एक संयुक्त संकेतक देता है.',
'Minor crime (avg/yr)':
@ -661,10 +645,6 @@ export const details: Record<string, Record<string, string>> = {
'Az Angol Nélkülözési Indexek Lakókörnyezet tartományából származik, országos percentilissé alakítva: 0% a legrosszabb, 100% a legjobb körülményeket jelzi. A lakásállomány minőségét méri: gázfűtés rendelkezésre állása, lakásállapot és Decent Homes szabványok.',
'Air Quality and Road Safety Score':
'Az Angol Nélkülözési Indexek Lakókörnyezet tartományából származik, országos percentilissé alakítva: 0% a legrosszabb, 100% a legjobb körülményeket jelzi. A külső lakókörnyezet minőségét méri a levegőminőségi mutatók és a gyalogosokat, kerékpárosokat érintő közúti közlekedési baleseti áldozatok alapján.',
'Serious crime per 1k residents (avg/yr)':
'Erőszakos bűncselekmények, rablás, betörés és fegyverbirtoklás 1 000 szokásos lakóra vetítve évente az LSOA-ban. A police.uk utcai szintű bűnügyi adatait és a Census 2021 népességszámait használja. Normalizálja a népsűrűséget, így a területek mérettől függetlenül összehasonlíthatók.',
'Minor crime per 1k residents (avg/yr)':
'Antiszociális magatartás, boltlopás, kerékpárlopás és egyéb kisebb súlyosságú bűncselekmények 1 000 szokásos lakóra vetítve évente az LSOA-ban. A police.uk utcai szintű bűnügyi adatait és a Census 2021 népességszámait használja. Normalizálja a népsűrűséget, így a területek mérettől függetlenül összehasonlíthatók.',
'Serious crime (avg/yr)':
'Az erőszakos bűncselekmények, rablás, betörés és fegyverbirtoklás éves összege az LSOA-ban, a police.uk utcai szintű bűnügyi adataiból. Egyetlen súlyos bűnözési mutatót ad.',
'Minor crime (avg/yr)':

File diff suppressed because it is too large Load diff

View file

@ -1113,6 +1113,10 @@ const en = {
dsTowOrigin: 'Forest Research / Defra NCEA',
dsTowUse:
'Tree canopy polygons for lone trees, groups of trees, and small woodlands in England. Used here to estimate tree coverage percentiles around postcode centroids.',
dsNfiName: 'National Forest Inventory Woodland',
dsNfiOrigin: 'Forest Research',
dsNfiUse:
'Woodland parcels of at least 0.5 ha across England, which the Trees Outside Woodland map deliberately excludes. Unioned with the TOW canopy so the tree-coverage metric and map overlay also include woods and forests.',
dsConservationAreasName: 'Planning Data Conservation Areas',
dsConservationAreasOrigin: 'Planning Data / local planning authorities',
dsConservationAreasUse:
@ -1458,8 +1462,6 @@ const en = {
'Air Quality and Road Safety Score': 'Air Quality and Road Safety Score',
// ─ Feature names (Crime) ─
'Serious crime per 1k residents (avg/yr)': 'Serious crime per 1k residents (avg/yr)',
'Minor crime per 1k residents (avg/yr)': 'Minor crime per 1k residents (avg/yr)',
'Serious crime (avg/yr)': 'Serious crime (avg/yr)',
'Minor crime (avg/yr)': 'Minor crime (avg/yr)',
'Violence and sexual offences (avg/yr)': 'Violence and sexual offences (avg/yr)',

View file

@ -16,7 +16,7 @@ const fr: Translations = {
copied: 'Copié !',
copiedToClipboard: 'Copié dans le presse-papiers',
loading: 'Chargement...',
loadMore: 'Charger plus',
loadMore: 'Afficher plus',
remaining: '{{count}} restant(s)',
search: 'Rechercher',
all: 'Tous',
@ -27,13 +27,13 @@ const fr: Translations = {
max: 'max',
minute: 'min',
or: 'ou',
area: 'Zone',
area: 'Secteur',
properties: 'Biens',
postcode: 'Code postal',
noAreaSelected: 'Aucune zone sélectionnée',
noAreaSelected: 'Aucun secteur sélectionné',
noAreaSelectedDesc:
'Cliquez sur une zone colorée de la carte pour voir la criminalité, les écoles, les prix et plus encore',
clickForDetails: 'Cliquez pour voir les détails',
'Sélectionnez un secteur coloré sur la carte pour voir criminalité, écoles, prix et autres données',
clickForDetails: 'Voir les détails',
property: 'bien',
propertiesPlural: 'biens',
bedsCount: '{{count}} ch.',
@ -42,7 +42,7 @@ const fr: Translations = {
bathsCount_other: '{{count}} sdb',
places: 'lieux',
noData: 'Aucune donnée',
allLow: 'Tout est faible',
allLow: 'Tout est bas',
connectingToServer: 'Connexion au serveur...',
closePane: 'Fermer le panneau',
yes: 'Oui',
@ -63,10 +63,10 @@ const fr: Translations = {
exportLabel: 'Exporter',
exporting: 'Exportation...',
exportToExcel: 'Exporter vers Excel',
exportReady: 'Export prêt. Le téléchargement devrait commencer.',
exportReady: 'Export terminé. Le téléchargement devrait démarrer.',
exportFailed: 'Échec de lexport.',
exportTimedOut: 'Lexport a expiré. Réessayez.',
exportUnavailable: 'La carte charge encore. Réessayez dans un instant.',
exportUnavailable: 'La carte est encore en cours de chargement. Réessayez dans un instant.',
exportEmpty: 'Lexport est terminé, mais le fichier est vide.',
openMenu: 'Ouvrir le menu',
closeMenu: 'Fermer le menu',
@ -75,12 +75,12 @@ const fr: Translations = {
// ── Export Menu ────────────────────────────────────
export: {
title: 'Exporter',
modeFilters: 'Codes postaux correspondant aux filtres',
modeFilters: 'Codes postaux filtrés',
modeFiltersHint:
'Exportez tous les codes postaux visibles sur la carte qui correspondent à vos filtres actuels.',
'Exportez tous les codes postaux visibles sur la carte qui respectent vos filtres actuels.',
modeList: 'Liste de codes postaux',
modeListHint:
'Ajoutez vos codes postaux un par un — la casse et les espaces sont corrigés automatiquement.',
'Ajoutez vos codes postaux un par un : le format et les espaces seront corrigés automatiquement.',
listLabel: 'Codes postaux',
listPlaceholder: 'ex. SW1A 1AA',
addRow: 'Ajouter un code postal',
@ -111,7 +111,7 @@ const fr: Translations = {
reviewDataSources: 'Consulter les sources de données',
whatYouCanCompare: 'Ce que vous pouvez comparer',
whatYouCanCompareDesc:
'Chaque page sert un vrai travail de présélection : éliminer les lieux impossibles, comparer les codes postaux restants et décider quoi vérifier ensuite.',
'Chaque page aide à présélectionner concrètement : éliminer les secteurs impossibles, comparer les codes postaux restants et décider quoi vérifier ensuite.',
howToUseIt: 'Comment lutiliser',
howToUseItDesc:
'Utilisez ces parcours pour rendre la page utile avant douvrir un portail dannonces ou de réserver une visite.',
@ -121,7 +121,7 @@ const fr: Translations = {
questionsBuyersAsk: 'Questions des acheteurs',
relatedGuides: 'Guides associés',
relatedGuidesDesc:
'Continuez parmi les pages publiques indexées grâce aux liens internes canoniques.',
'Poursuivez parmi les pages publiques indexées grâce aux liens internes canoniques.',
frequentlyAskedQuestions: 'Questions fréquentes',
relatedPages: 'Pages associées',
relatedPagesDesc:
@ -129,49 +129,49 @@ const fr: Translations = {
pages: {
'Property price map': 'Carte des prix de limmobilier',
'Compare property prices across every postcode in England':
'Comparez les prix de limmobilier pour chaque code postal en Angleterre',
'Comparez les prix immobiliers de chaque code postal en Angleterre',
'Property price map for England - Compare postcodes before viewing':
'Carte des prix de limmobilier en Angleterre - Comparez les codes postaux avant de visiter',
'Compare sold prices, estimated current value, price per square metre and local context across English postcodes before searching listings.':
'Comparez les prix de vente, la valeur actuelle estimée, le prix au mètre carré et le contexte local dans les codes postaux anglais avant de rechercher des annonces.',
'Perfect Postcode maps sold prices, estimated current value, price per square metre, property type, floor area, tenure, and local context so buyers can find realistic search areas before opening listing portals.':
'Perfect Postcode cartographie les prix de vente, la valeur actuelle estimée, le prix au mètre carré, le type de bien, la surface, le statut de propriété et le contexte local afin que les acheteurs puissent trouver des zones de recherche réalistes avant douvrir les portails dannonces.',
'Perfect Postcode cartographie les prix de vente, la valeur actuelle estimée, le prix au mètre carré, le type de bien, la surface, le statut freehold/leasehold et le contexte local afin que les acheteurs repèrent des secteurs réalistes avant douvrir les portails dannonces.',
'Screen historical sale prices and current-value estimates by postcode.':
'Consultez lhistorique des prix de vente et les estimations de la valeur actuelle par code postal.',
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
'Comparez la valeur avec le trajet, les écoles, le haut débit, la criminalité, le bruit et les services de proximité.',
'Mettez les prix en regard des trajets, écoles, débits internet, niveaux de criminalité, bruit et services de proximité.',
'Build a shortlist before spending weekends on viewings.':
'Créez une sélection avant de passer vos week-ends en visites.',
'Préparez une liste de présélection avant de passer vos week-ends en visites.',
'Find postcodes that fit the budget before listings appear':
'Trouvez les codes postaux qui correspondent au budget avant que les annonces napparaissent',
'Trouvez les codes postaux compatibles avec votre budget avant larrivée des annonces',
'Start with a maximum price and property type, then colour the map by price per square metre or estimated current price. This helps reveal areas where similar homes have historically traded within reach, even when there are no live listings today.':
'Commencez par un prix maximum et un type de bien, puis colorez la carte par prix au mètre carré ou prix actuel estimé. Cela fait ressortir les zones où des logements similaires se sont vendus à des prix accessibles, même lorsquil ny a aucune annonce en cours aujourdhui.',
'Commencez par un prix maximum et un type de bien, puis colorez la carte par prix au mètre carré ou prix actuel estimé. Cela fait ressortir les secteurs où des logements similaires se sont vendus à des prix accessibles, même lorsquil ny a aucune annonce en cours aujourdhui.',
'Filter by last known sale price, estimated current value, property type, tenure, and floor area.':
'Filtrez par dernier prix de vente connu, valeur actuelle estimée, type de bien, statut de propriété et surface.',
'Filtrez par dernier prix de vente connu, valeur actuelle estimée, type de bien, statut freehold/leasehold et surface.',
'Compare nearby postcodes using the same criteria instead of relying on area reputation.':
'Comparez les codes postaux à proximité en utilisant les mêmes critères au lieu de vous fier à la réputation de la zone.',
'Comparez les codes postaux voisins avec les mêmes critères, au lieu de vous fier à la réputation dun secteur.',
'Use the results as a shortlist for listing alerts, local research, and viewings.':
'Utilisez les résultats comme sélection pour les alertes dannonces, les recherches locales et les visites.',
'Separate cheap from good value': 'Séparez le bon marché du bon rapport qualité-prix',
'A lower price can reflect smaller homes, weaker transport, more noise, or fewer local services. The map keeps those trade-offs visible so the cheapest postcode isnt automatically treated as the best option.':
'Un prix inférieur peut refléter des logements plus petits, des transports moins pratiques, plus de bruit ou moins de services locaux. La carte garde ces compromis visibles, afin que le code postal le moins cher ne soit pas automatiquement traité comme la meilleure option.',
'Start from area value, not listing availability':
'Partir de la valeur de la zone, et non de la disponibilité des annonces',
'Partez de la valeur du secteur, pas seulement des annonces disponibles',
'Listing portals only show homes for sale today. A postcode-level property price map lets you compare wider areas, understand local price patterns, and avoid missing places where the next suitable listing might appear.':
'Les portails dannonces affichent uniquement les biens à vendre aujourdhui. Une carte des prix immobiliers au niveau du code postal vous permet de comparer des zones plus larges, de comprendre les tendances de prix locales et déviter de manquer des endroits où la prochaine annonce adaptée pourrait apparaître.',
'Use prices alongside real constraints': 'Utiliser les prix avec des contraintes réelles',
'Les portails dannonces affichent uniquement les biens à vendre aujourdhui. Une carte des prix par code postal vous permet de comparer des secteurs plus larges, de comprendre les tendances locales et de ne pas manquer lendroit où la prochaine annonce pertinente pourrait apparaître.',
'Use prices alongside real constraints': 'Croisez les prix avec vos contraintes réelles',
'Budget rarely matters on its own. Perfect Postcode combines price filters with travel time, school quality, property size, energy performance, local environment, and services so your shortlist reflects how you actually want to live.':
'Le budget compte rarement à lui seul. Perfect Postcode combine des filtres de prix avec le temps de trajet, la qualité des écoles, la taille du bien, la performance énergétique, lenvironnement local et les services afin que votre sélection reflète la façon dont vous souhaitez réellement vivre.',
'Le budget compte rarement seul. Perfect Postcode combine les prix avec le temps de trajet, la qualité des écoles, la taille du bien, la performance énergétique, lenvironnement local et les services pour que votre sélection reflète vraiment votre mode de vie.',
'What the price data is for': 'À quoi servent les données de prix',
'Use the map to compare areas and spot search candidates. It isnt a valuation, mortgage decision, survey, legal search, or live listing feed.':
'Utilisez la carte pour comparer les zones et repérer des pistes de recherche. Il ne sagit pas dune estimation officielle, dune décision de prêt immobilier, dune expertise, dune recherche juridique ou dun flux dannonces en direct.',
'How to validate a promising area': 'Comment valider une zone prometteuse',
'Utilisez la carte pour comparer les secteurs et repérer des pistes. Ce nest ni une estimation officielle, ni une décision de prêt, ni un survey, ni une recherche juridique, ni un flux dannonces en direct.',
'How to validate a promising area': 'Comment valider un secteur prometteur',
'Once a postcode looks promising, check current listings, sold-price comparables, agent details, flood searches, legal packs, surveys, and local authority information before making a decision.':
'Une fois quun code postal semble prometteur, vérifiez les annonces actuelles, les ventes comparables, les informations de lagent, les risques dinondation, les dossiers juridiques, les expertises et les informations des autorités locales avant de prendre une décision.',
'Lorsquun code postal semble prometteur, vérifiez les annonces à jour, les ventes comparables, les informations de lagent, les recherches de risque dinondation, les dossiers juridiques, les surveys et les informations de lautorité locale avant de décider.',
'Is this a replacement for Rightmove or Zoopla?':
'Est-ce un remplacement pour Rightmove ou Zoopla ?',
'No. Use it before and alongside listing portals. Perfect Postcode helps decide where to look; listing portals show whats currently for sale.':
'Non. Utilisez-le avant et parallèlement aux portails dannonces. Perfect Postcode aide à décider où chercher ; les portails dannonces affichent ce qui est actuellement en vente.',
'Non. Utilisez-le avant et en parallèle des portails dannonces. Perfect Postcode vous aide à décider où chercher ; les portails affichent les biens actuellement en vente.',
'Can I compare price with schools or commute time?':
'Puis-je comparer les prix avec les écoles ou le temps de trajet ?',
'Yes. Price filters can be combined with travel-time, schools, crime, broadband, road-noise, amenities, and environment filters.':
@ -187,54 +187,54 @@ const fr: Translations = {
'Découvrez quels jeux de données alimentent les filtres de codes postaux et où se situent leurs limites.',
Methodology: 'Méthodologie',
'Understand how the map is intended to support shortlisting, not replace due diligence.':
'Comprenez comment la carte aide à présélectionner des zones sans remplacer les vérifications préalables.',
'Postcode checker': 'Vérificateur de code postal',
'Comprenez comment la carte aide à présélectionner sans remplacer la due diligence.',
'Postcode checker': 'Vérification de code postal',
'Check one postcode before you spend time on a viewing.':
'Vérifiez un code postal avant de consacrer du temps à une visite.',
'Explore the property map': 'Explorez la carte immobilière',
'Postcode property search': 'Recherche immobilière par code postal',
'Find postcodes that match your property search criteria':
'Trouvez les codes postaux qui correspondent à vos critères de recherche immobilière',
'Trouvez les codes postaux qui respectent vos critères de recherche immobilière',
'Postcode property search - Find areas that match your criteria':
'Recherche immobilière par code postal - Trouvez les zones qui correspondent à vos critères',
'Recherche immobilière par code postal - Trouvez les secteurs compatibles avec vos critères',
'Search every postcode by budget, property type, floor area, tenure, commute, schools, crime, broadband, noise, parks and local amenities.':
'Recherchez chaque code postal par budget, type de bien, surface, statut de propriété, trajet, écoles, criminalité, haut débit, bruit, parcs et services de proximité.',
'Cherchez dans tous les codes postaux par budget, type de bien, surface, statut freehold/leasehold, trajet, écoles, criminalité, haut débit, bruit, parcs et services de proximité.',
'Search every postcode by budget, property type, size, tenure, commute, schools, crime, broadband, noise, parks, and local amenities instead of checking areas one at a time.':
'Recherchez chaque code postal par budget, type de bien, taille, statut de propriété, trajet, écoles, criminalité, haut débit, bruit, parcs et services de proximité au lieu de vérifier les zones une par une.',
'Cherchez dans tous les codes postaux par budget, type de bien, taille, statut freehold/leasehold, trajet, écoles, criminalité, haut débit, bruit, parcs et services de proximité, au lieu de vérifier les secteurs un par un.',
'Filter England-wide postcode data from one map.':
'Filtrez les données des codes postaux de toute lAngleterre à partir dune seule carte.',
'Shortlist unfamiliar areas with comparable evidence.':
'Présélectionnez des zones inconnues avec des éléments de comparaison.',
'Présélectionnez des secteurs inconnus avec des données comparables.',
'Save and share search areas before booking viewings.':
'Enregistrez et partagez les zones de recherche avant de réserver des visites.',
'Enregistrez et partagez vos secteurs de recherche avant de réserver des visites.',
'Turn a broad brief into postcode candidates':
'Transformez un cahier des charges général en codes postaux candidats',
'Transformez un cahier des charges large en codes postaux à explorer',
'Enter the practical constraints first: budget, property size, tenure, travel time, school needs, broadband, and tolerance for road noise or crime levels. The map removes places that fail those constraints and keeps the remaining options comparable.':
'Saisissez dabord les contraintes pratiques : budget, taille du bien, statut de propriété, temps de trajet, besoins scolaires, haut débit et tolérance au bruit routier ou aux niveaux de criminalité. La carte exclut les lieux qui ne respectent pas ces contraintes et garde les options restantes comparables.',
'Entrez dabord les contraintes pratiques : budget, taille du bien, statut freehold/leasehold, temps de trajet, besoins scolaires, haut débit et tolérance au bruit routier ou aux niveaux de criminalité. La carte écarte les lieux qui ne les respectent pas et garde les options restantes comparables.',
'Relax one constraint at a time': 'Assouplir une contrainte à la fois',
'When the search becomes too narrow, loosen a single filter and watch which postcodes reappear. This makes compromise explicit instead of relying on guesswork.':
'Lorsque la recherche devient trop étroite, assouplissez un seul filtre et observez quels codes postaux réapparaissent. Cela rend le compromis explicite au lieu de sappuyer sur lintuition.',
'Turn vague areas into specific postcodes':
'Transformez des zones vagues en codes postaux spécifiques',
'Transformez des secteurs vagues en codes postaux précis',
'Broad town or borough searches hide large differences between streets. Perfect Postcode helps you move from a general area to postcodes that satisfy your hard requirements.':
'Les recherches larges par ville ou arrondissement masquent de grandes différences entre les rues. Perfect Postcode vous aide à passer dune zone générale à des codes postaux qui répondent à vos exigences strictes.',
'Les recherches larges par ville ou borough masquent de grandes différences dune rue à lautre. Perfect Postcode vous aide à passer dun secteur général à des codes postaux qui respectent vos critères stricts.',
'Keep trade-offs visible': 'Gardez les compromis visibles',
'When there are too many or too few matches, adjust one constraint at a time and see exactly which postcodes reappear. That makes compromises explicit instead of relying on guesswork.':
'Lorsquil y a trop ou trop peu de correspondances, ajustez une contrainte à la fois et voyez exactement quels codes postaux réapparaissent. Cela rend les compromis explicites au lieu de sappuyer sur lintuition.',
'Quand il y a trop ou trop peu de résultats, ajustez une contrainte à la fois et voyez exactement quels codes postaux réapparaissent. Les compromis deviennent explicites au lieu de reposer sur lintuition.',
'Why postcode-level comparison matters':
'Pourquoi la comparaison au niveau du code postal est importante',
'Two nearby postcodes can differ on schools, road noise, transport access, property mix, and price. Comparing at postcode level reduces the chance of treating a whole town as one uniform market.':
'Deux codes postaux proches peuvent différer par les écoles, le bruit routier, laccès aux transports, le parc immobilier et les prix. La comparaison au niveau du code postal réduit le risque de traiter une ville entière comme un seul marché uniforme.',
'How to use the results': 'Comment utiliser les résultats',
'Treat matching postcodes as a research queue: check live listings, visit streets, confirm schools and admissions, and review current official sources.':
'Traitez les codes postaux correspondants comme une liste de recherche : vérifiez les annonces en cours, visitez les rues, confirmez les écoles et les admissions, puis consultez les sources officielles à jour.',
'Considérez les codes postaux retenus comme une liste de recherche : vérifiez les annonces en cours, allez dans les rues, confirmez écoles et admissions, puis consultez les sources officielles à jour.',
'Can I save a postcode property search?':
'Puis-je enregistrer une recherche immobilière par code postal ?',
'Yes. Licensed users can save searches and return to them later. Saved searches are designed for shortlists and comparison notes.':
'Oui. Les utilisateurs sous licence peuvent enregistrer leurs recherches et y revenir plus tard. Les recherches enregistrées sont conçues pour les sélections et les notes de comparaison.',
'Can I search without knowing the area?': 'Puis-je chercher sans connaître la zone ?',
'Can I search without knowing the area?': 'Puis-je chercher sans connaître le secteur ?',
'Yes. The map is designed to surface unfamiliar areas that match practical constraints, not just places you already know.':
'Oui. La carte est conçue pour faire apparaître des zones inconnues qui correspondent à des contraintes pratiques, et pas seulement des endroits que vous connaissez déjà.',
'Oui. La carte fait ressortir des secteurs que vous ne connaissez pas encore, dès lors quils respectent vos contraintes pratiques.',
'Are the results live property listings?':
'Les résultats sont-ils des annonces immobilières en cours ?',
'No. The tool compares postcode data and historical/contextual property signals. You still need listing portals for current availability.':
@ -245,9 +245,9 @@ const fr: Translations = {
'Start a postcode search': 'Lancer une recherche de code postal',
'Commute property search': 'Recherche immobilière par temps de trajet',
'Search for places to live by commute time':
'Rechercher des lieux de résidence par temps de trajet',
'Rechercher des endroits où vivre selon le temps de trajet',
'Commute property search - Find places to live by travel time':
'Recherche immobilière par temps de trajet  Trouver des endroits où vivre selon le temps de trajet',
'Recherche immobilière par temps de trajet - Trouver où vivre selon vos trajets',
'Filter postcodes by commute time, then compare price, schools, safety, broadband, road noise, parks and property data on one map.':
'Filtrez les codes postaux par temps de trajet, puis comparez les prix, les écoles, la sécurité, le haut débit, le bruit routier, les parcs et les données immobilières sur une seule carte.',
'Filter postcodes by modelled car, cycling, walking, and public transport travel times, then layer on property price, schools, crime, broadband, noise, and local amenities.':
@ -255,16 +255,16 @@ const fr: Translations = {
'Compare reachable postcodes by realistic travel-time bands.':
'Comparez les codes postaux accessibles par tranches de temps de trajet réalistes.',
'Search by destination first, then filter for property and neighbourhood fit.':
'Recherchez dabord par destination, puis filtrez selon ladéquation du bien et du quartier.',
'Cherchez dabord par destination, puis filtrez selon le bien et le quartier.',
'Avoid areas that look close on a map but fail the daily journey.':
'Évitez les zones qui semblent proches sur une carte mais ne conviennent pas au trajet quotidien.',
'Évitez les secteurs qui semblent proches sur une carte mais ne tiennent pas pour le trajet quotidien.',
'Start with the destination that matters': 'Commencez par la destination qui compte',
'Choose a commute destination, transport mode, and time range, then add the property filters. This prevents a cheap-looking area from reaching the shortlist if the daily journey doesnt work.':
'Choisissez une destination de trajet, un mode de transport et une plage horaire, puis ajoutez les filtres immobiliers. Cela évite quune zone apparemment bon marché nentre dans la sélection si le trajet quotidien ne convient pas.',
'Choisissez la destination du trajet, le mode de transport et une durée maximale, puis ajoutez les filtres immobiliers. Ainsi, un secteur apparemment bon marché ne reste pas dans la sélection si le trajet quotidien ne fonctionne pas.',
'Compare the commute against the rest of daily life':
'Comparez les déplacements avec le reste de la vie quotidienne',
'A fast commute isnt enough if the property size, school context, safety threshold, broadband, or road-noise exposure dont fit. The map keeps those signals side by side.':
'Un trajet rapide ne suffit pas si la taille du bien, le contexte scolaire, le seuil de sécurité, le haut débit ou lexposition au bruit routier ne conviennent pas. La carte garde ces indicateurs côte à côte.',
'Un trajet rapide ne suffit pas si la taille du bien, le contexte scolaire, le niveau de sécurité, le haut débit ou lexposition au bruit routier ne conviennent pas. La carte garde ces indicateurs côte à côte.',
'Commute from postcodes, not just place names':
'Évaluez le trajet depuis les codes postaux, pas seulement depuis les noms de lieux',
'Two streets in the same town can have very different station access, road routes, and public transport options. Postcode-level travel-time filtering keeps that difference visible.':
@ -272,15 +272,15 @@ const fr: Translations = {
'Balance journey time with the rest of the move':
'Équilibrez le temps de trajet avec le reste du déménagement',
'A fast commute only helps if the area also fits your budget, housing needs, school preferences, safety threshold, broadband requirement, and tolerance for road noise.':
'Un trajet rapide nest utile que si la zone correspond aussi à votre budget, à vos besoins de logement, à vos préférences scolaires, à votre seuil de sécurité, à vos exigences de haut débit et à votre tolérance au bruit routier.',
'Un trajet rapide nest utile que si le secteur respecte aussi votre budget, vos besoins de logement, vos préférences scolaires, votre niveau de sécurité, vos exigences de haut débit et votre tolérance au bruit routier.',
'How travel-time filters should be interpreted':
'Comment interpréter les filtres de temps de trajet',
'Travel-time modelling is useful for comparing areas consistently. Before committing, check current timetables, disruption patterns, parking, cycling conditions, and walking routes.':
'La modélisation du temps de trajet est utile pour comparer les zones de manière cohérente. Avant de vous engager, vérifiez les horaires actuels, les perturbations habituelles, le stationnement, les conditions cyclables et les itinéraires piétons.',
'La modélisation des temps de trajet aide à comparer les secteurs de manière cohérente. Avant de vous engager, vérifiez les horaires à jour, les perturbations habituelles, le stationnement, les conditions à vélo et les itinéraires à pied.',
'Why commute filters are combined with property data':
'Pourquoi les filtres de trajet sont combinés avec les données immobilières',
'Commute search is most useful when it removes impossible areas while still showing whether the remaining options are affordable and liveable.':
'La recherche par temps de trajet est surtout utile lorsquelle élimine les zones impossibles tout en indiquant si les options restantes sont abordables et agréables à vivre.',
'La recherche par temps de trajet est surtout utile lorsquelle écarte les secteurs incompatibles tout en montrant si les options restantes sont abordables et vivables.',
'Can I compare car, cycling, walking, and public transport?':
'Puis-je comparer la voiture, le vélo, la marche et les transports publics ?',
'The product supports multiple travel modes where precomputed destination data is available.':
@ -289,18 +289,18 @@ const fr: Translations = {
'No. Treat them as a consistent comparison model, then verify the real route before making viewing or purchase decisions.':
'Non. Traitez-les comme un modèle de comparaison cohérent, puis vérifiez litinéraire réel avant de prendre une décision de visite ou dachat.',
'Can I combine commute filters with schools and price?':
'Puis-je combiner les filtres de trajet domicile-travail avec les écoles et le prix ?',
'Puis-je combiner les filtres de trajet avec les écoles et le prix ?',
'Yes. The commute filter can be layered with property price, size, schools, broadband, crime, amenities, and environmental signals.':
'Oui. Le filtre de trajet peut être combiné avec le prix immobilier, la taille, les écoles, le haut débit, la criminalité, les services de proximité et les indicateurs environnementaux.',
'Bristol property search guide': 'Guide de recherche immobilière à Bristol',
'A worked example for balancing city access, price, and local context.':
'Un exemple concret pour équilibrer laccès à la ville, le prix et le contexte local.',
'Search by commute time': 'Rechercher par temps de trajet',
'Schools and property search': 'Recherche immobilière avec écoles',
'Schools and property search': 'Recherche immobilière et écoles',
'Find property search areas with schools and family trade-offs in view':
'Trouvez des zones de recherche immobilière en gardant visibles les compromis scolaires et familiaux',
'Trouvez des secteurs de recherche en gardant visibles écoles et compromis familiaux',
'School property search - Compare postcodes for family moves':
'Recherche immobilière par écoles - Comparez les codes postaux pour un déménagement familial',
'Recherche immobilière par écoles - Comparez les codes postaux pour une famille',
'Compare nearby schools, property size, prices, parks, safety, commute and local amenities before building a viewing shortlist.':
'Comparez les écoles à proximité, la taille du bien, les prix, les parcs, la sécurité, le trajet et les services de proximité avant de créer une sélection de visites.',
'Compare nearby Ofsted ratings, education context, property size, budget, safety, parks, commute, and local amenities before narrowing your viewing shortlist.':
@ -308,34 +308,34 @@ const fr: Translations = {
'Filter for nearby school quality alongside housing requirements.':
'Filtrez la qualité des écoles à proximité ainsi que les exigences en matière de logement.',
'Compare family-friendly trade-offs across unfamiliar postcodes.':
'Comparez les compromis adaptés aux familles entre des codes postaux inconnus.',
'Comparez les compromis familiaux entre des codes postaux que vous connaissez mal.',
'Use the map as a shortlist tool before checking admissions and catchments.':
'Utilisez la carte comme outil de présélection avant de vérifier les admissions et les secteurs scolaires.',
'Utilisez la carte pour présélectionner avant de vérifier admissions et catchment areas.',
'Use school context without ignoring the home':
'Utiliser le contexte scolaire sans ignorer la maison',
'Start with property size, budget, and commute constraints, then layer in nearby school quality and local context. This prevents school-led searches from hiding affordability or daily-life problems.':
'Commencez par la taille du bien, le budget et les contraintes de trajet, puis ajoutez la qualité des écoles à proximité et le contexte local. Cela évite quune recherche guidée par lécole masque des problèmes daccessibilité financière ou de vie quotidienne.',
'Verify admissions before deciding': 'Vérifier les admissions avant de décider',
'School data can point to promising areas, but admissions rules and catchments can change. Confirm current arrangements with schools and local authorities.':
'Les données scolaires peuvent indiquer des zones prometteuses, mais les règles dadmission et les secteurs scolaires peuvent changer. Confirmez les arrangements actuels avec les écoles et les autorités locales.',
'Les données scolaires peuvent indiquer des secteurs prometteurs, mais les règles dadmission et les catchment areas peuvent changer. Confirmez les modalités en vigueur auprès des écoles et des autorités locales.',
'School quality is one part of the shortlist':
'La qualité des écoles nest quune partie de la sélection',
'Perfect Postcode helps you compare nearby school data with the other practical constraints that shape a family move: space, price, commute, parks, safety, and local services.':
'Perfect Postcode vous aide à comparer les données des écoles à proximité avec les autres contraintes pratiques dun déménagement familial : espace, prix, trajet, parcs, sécurité et services locaux.',
'Check catchments before making decisions':
'Vérifier les secteurs scolaires avant de prendre des décisions',
'Vérifier les catchment areas avant de décider',
'Admissions rules and catchment boundaries can change. Use postcode-level school data to find promising areas, then verify current admissions details with the school or local authority.':
'Les règles dadmission et les limites des secteurs scolaires peuvent changer. Utilisez les données scolaires au niveau du code postal pour trouver des zones prometteuses, puis vérifiez les détails actuels des admissions auprès de lécole ou des autorités locales.',
'Les règles dadmission et les limites de catchment peuvent changer. Utilisez les données scolaires par code postal pour repérer des secteurs prometteurs, puis vérifiez les admissions à jour auprès de lécole ou de lautorité locale.',
'How to treat school filters': 'Comment traiter les filtres scolaires',
'Use school filters to narrow research, not to assume admission eligibility. Ratings, distance, admissions criteria, and school capacity should all be checked with current official sources.':
'Utilisez les filtres scolaires pour affiner la recherche, et non pour supposer léligibilité à ladmission. Les notes, la distance, les critères dadmission et la capacité de lécole doivent tous être vérifiés auprès de sources officielles à jour.',
'Utilisez les filtres scolaires pour affiner la recherche, pas pour supposer une admission possible. Notes, distance, critères dadmission et capacité doivent être vérifiés auprès de sources officielles à jour.',
'Family trade-offs to compare': 'Les compromis familiaux à comparer',
'Combine schools with parks, road noise, crime, property size, commute, broadband, and price so the shortlist reflects the whole move.':
'Combinez les écoles avec les parcs, le bruit routier, la criminalité, la taille du bien, le trajet, le haut débit et le prix afin que la sélection reflète lensemble du déménagement.',
'Does this show school catchment guarantees?':
'Cela garantit-il lappartenance à un secteur scolaire ?',
'No. It helps identify promising areas, but catchments and admissions must be verified with the school or local authority.':
'Non. Cela permet didentifier les zones prometteuses, mais les secteurs scolaires et les admissions doivent être vérifiés auprès de lécole ou des autorités locales.',
'Non. Cela aide à repérer des secteurs prometteurs, mais les catchments et admissions doivent être vérifiés auprès de lécole ou de lautorité locale.',
'Can I combine school filters with parks and safety?':
'Puis-je combiner les filtres scolaires avec les parcs et la sécurité ?',
'Yes. School-aware search can be combined with crime, parks, commute, price, property size, and local services.':
@ -349,7 +349,7 @@ const fr: Translations = {
'Check postcode data before you book a viewing':
'Vérifiez les données du code postal avant de réserver une visite',
'Postcode checker - Property, crime, broadband, noise and schools':
'Vérificateur de code postal - Immobilier, criminalité, haut débit, bruit et écoles',
'Vérification de code postal - Immobilier, criminalité, haut débit, bruit et écoles',
'Check postcode-level property prices, EPC data, crime, broadband, road noise, schools, council tax, amenities and travel-time context.':
'Vérifiez les prix immobiliers au niveau du code postal, les données EPC, la criminalité, le haut débit, le bruit routier, les écoles, la council tax, les services de proximité et le contexte du temps de trajet.',
'Review property prices, EPC context, crime, broadband, road noise, local amenities, schools, deprivation, council tax, and travel-time data from one postcode-first map.':
@ -363,33 +363,33 @@ const fr: Translations = {
'Check the street before spending a viewing slot':
'Vérifiez la rue avant dy consacrer un créneau de visite',
'Use the postcode checker to review price history, local context, amenities, schools, and environment signals before you commit time to visiting.':
'Utilisez le vérificateur de code postal pour examiner lhistorique des prix, le contexte local, les services de proximité, les écoles et les indicateurs environnementaux avant de consacrer du temps à une visite.',
'Utilisez la vérification de code postal pour examiner lhistorique des prix, le contexte local, les services de proximité, les écoles et les indicateurs environnementaux avant de consacrer du temps à une visite.',
'Compare neighbouring postcodes': 'Comparez les codes postaux voisins',
'If one postcode looks promising, compare adjacent areas using the same filters. This often reveals whether a concern is street-specific or part of a wider pattern.':
'Si un code postal semble prometteur, comparez les zones adjacentes en utilisant les mêmes filtres. Cela révèle souvent si une préoccupation est spécifique à une rue ou fait partie dun schéma plus large.',
'Si un code postal semble prometteur, comparez les secteurs voisins avec les mêmes filtres. Cela révèle souvent si un signal dalerte est propre à la rue ou relève dun schéma plus large.',
'Useful before and alongside listing portals':
'Utile avant et parallèlement aux portails dannonces',
'Listing photos rarely tell you enough about the surrounding street. Perfect Postcode gives you an evidence-led postcode check before you commit time to a viewing.':
'Les photos dannonce en disent rarement assez sur la rue environnante. Perfect Postcode vous donne un contrôle du code postal fondé sur des données avant de consacrer du temps à une visite.',
'Les photos dannonce en disent rarement assez sur la rue. Perfect Postcode vous donne une vérification de code postal fondée sur des données avant de consacrer du temps à une visite.',
'A screening tool, not professional advice':
'Un outil de tri préalable, pas un conseil professionnel',
'Un outil de présélection, pas un conseil professionnel',
'The data is designed for shortlisting and comparison. Any purchase still needs current listing checks, legal due diligence, flood searches, lender requirements, and survey findings.':
'Les données sont conçues pour la présélection et la comparaison. Tout achat nécessite toujours de vérifier les annonces à jour, les points juridiques, les risques dinondation, les exigences du prêteur et les rapports dexpertise.',
'Les données servent à présélectionner et comparer. Tout achat nécessite encore de vérifier les annonces à jour, la due diligence juridique, les recherches de risque dinondation, les exigences du prêteur et les conclusions du survey.',
'What a postcode check can catch': 'Ce quune vérification du code postal peut détecter',
'A postcode check can surface price context, environmental signals, nearby amenities, and other local indicators that are easy to miss in a listing.':
'Une vérification du code postal peut faire apparaître le contexte des prix, les indicateurs environnementaux, les services de proximité et dautres indicateurs locaux faciles à manquer dans une annonce.',
'What a postcode check cant prove':
'Ce quune vérification du code postal ne peut pas prouver',
'It cant confirm the condition of a home, future development, legal title, lender requirements, or current street-level experience. Those still need direct checks.':
'Il ne peut pas confirmer létat dun logement, les futurs aménagements, le titre juridique, les exigences du prêteur ou lexpérience réelle dans la rue. Ces points nécessitent encore des vérifications directes.',
'Il ne peut pas confirmer létat dun logement, les futurs projets, le titre de propriété, les exigences du prêteur ou le ressenti actuel dans la rue. Ces points demandent encore des vérifications directes.',
'Can I use the checker before a viewing?':
'Puis-je utiliser le vérificateur avant une visite ?',
'Puis-je utiliser cet outil avant une visite ?',
'Yes. Thats one of the main use cases: screen the postcode first, then decide whether the viewing is worth the time.':
'Oui. Cest lun des principaux cas dutilisation : examinez dabord le code postal, puis décidez si la visite vaut le temps consacré.',
'Does the checker include exact property condition?':
'Le vérificateur inclut-il létat exact du bien ?',
'Loutil indique-t-il létat exact du bien ?',
'No. Property condition requires listing details, surveys, and direct inspection.':
'Non. Létat dun bien nécessite les détails de lannonce, des expertises et une inspection directe.',
'Non. Létat dun bien se vérifie avec les détails de lannonce, un survey et une inspection sur place.',
'Can I compare multiple postcodes?': 'Puis-je comparer plusieurs codes postaux ?',
'Yes. The map is designed for consistent comparison across postcodes.':
'Oui. La carte est conçue pour une comparaison cohérente entre les codes postaux.',
@ -400,9 +400,9 @@ const fr: Translations = {
'Birmingham property search - Compare postcodes by price and commute':
'Recherche immobilière à Birmingham - Comparez les codes postaux par prix et trajet',
'Use postcode-level data to compare Birmingham property prices, commute trade-offs, schools, crime, broadband and local amenities before viewings.':
'Utilisez les données au niveau du code postal pour comparer les prix immobiliers à Birmingham, les compromis de trajet, les écoles, la criminalité, le haut débit et les services de proximité avant les visites.',
'Utilisez les données par code postal pour comparer prix immobiliers, compromis de trajet, écoles, criminalité, haut débit et services de proximité à Birmingham avant les visites.',
'Birmingham searches can change quickly from street to street. Use postcode-level evidence to compare budget, commute, schools, noise, crime, and local services before deciding where to watch listings.':
'Les recherches à Birmingham peuvent changer rapidement dune rue à lautre. Utilisez des données au niveau du code postal pour comparer le budget, le trajet, les écoles, le bruit, la criminalité et les services locaux avant de décider où surveiller les annonces.',
'À Birmingham, une recherche peut changer dune rue à lautre. Utilisez les données par code postal pour comparer budget, trajet, écoles, bruit, criminalité et services locaux avant de décider où surveiller les annonces.',
'Start with commute corridors': 'Commencez par les axes de trajet',
'Choose the destination that matters, such as a workplace, station, university, or hospital, then compare reachable postcodes by transport mode and travel-time band.':
'Choisissez la destination qui compte, comme un lieu de travail, une gare, une université ou un hôpital, puis comparez les codes postaux accessibles par mode de transport et tranche de temps de trajet.',
@ -414,7 +414,7 @@ const fr: Translations = {
'Vérifiez litinéraire manuellement avant de réserver des visites.',
'Compare price with property type': 'Comparez le prix avec le type de bien',
'Median prices alone can be misleading if the local property mix changes. Add property type, tenure, floor area, and price filters so similar areas are compared fairly.':
'Les prix médians seuls peuvent être trompeurs si le parc immobilier local varie. Ajoutez des filtres de type de bien, de statut de propriété, de surface et de prix afin que des zones comparables soient évaluées équitablement.',
'Les prix médians seuls peuvent tromper si le parc immobilier local varie. Ajoutez type de bien, statut freehold/leasehold, surface et prix pour comparer équitablement des secteurs similaires.',
'Keep family and environment trade-offs visible':
'Gardez les compromis familiaux et environnementaux visibles',
'Layer school context, parks, road noise, broadband, and crime signals on top of the property filters. That makes it easier to decide which compromises are acceptable.':
@ -422,15 +422,15 @@ const fr: Translations = {
'Can Perfect Postcode tell me the best area in Birmingham?':
'Perfect Postcode peut-il mindiquer le meilleur quartier de Birmingham ?',
'No tool can decide the best area for every buyer. It helps compare postcodes against your own constraints so you can build a better shortlist.':
'Aucun outil ne peut décider du meilleur quartier pour chaque acheteur. Il aide à comparer les codes postaux à vos propres contraintes afin de créer une meilleure sélection.',
'Aucun outil ne peut choisir le meilleur quartier pour chaque acheteur. Il compare les codes postaux à vos propres contraintes pour bâtir une liste plus solide.',
'Should I use this instead of local knowledge?':
'Dois-je lutiliser à la place de la connaissance locale ?',
'No. Use it to find and compare candidates, then validate them with visits, local advice, listings, and official checks.':
'Non. Utilisez-le pour trouver et comparer des candidats, puis validez-les avec des visites, des conseils locaux, des annonces et des contrôles officiels.',
'Non. Utilisez-le pour trouver et comparer des pistes, puis validez-les par des visites, des avis locaux, des annonces et des vérifications officielles.',
'Compare price patterns before looking at live listings.':
'Comparez les tendances de prix avant de consulter les annonces en cours.',
'Search by travel time and then layer on property requirements.':
'Recherchez par temps de trajet, puis ajoutez les critères immobiliers.',
'Cherchez par temps de trajet, puis ajoutez les critères immobiliers.',
'Understand how to interpret filters and limitations.':
'Comprenez comment interpréter les filtres et les limites.',
'Compare Birmingham postcodes': 'Comparez les codes postaux de Birmingham',
@ -441,15 +441,15 @@ const fr: Translations = {
'Compare Manchester-area postcodes by budget, commute, property type, schools, broadband, crime, noise and amenities before booking viewings.':
'Comparez les codes postaux de la région de Manchester par budget, trajet, type de bien, écoles, haut débit, criminalité, bruit et services de proximité avant de réserver des visites.',
'A Manchester-area search can span city-centre, suburban, and commuter options. Perfect Postcode helps keep each postcode comparable against the same property and daily-life constraints.':
'Une recherche dans la région de Manchester peut couvrir le centre-ville, la banlieue et les communes de navetteurs. Perfect Postcode permet de comparer chaque code postal avec les mêmes contraintes immobilières et de vie quotidienne.',
'Une recherche autour de Manchester peut couvrir centre-ville, banlieue et villes de commuter belt. Perfect Postcode garde chaque code postal comparable avec les mêmes contraintes immobilières et de vie quotidienne.',
'Use travel time to define the real search area':
'Utiliser le temps de trajet pour définir la véritable zone de recherche',
'Utiliser le temps de trajet pour définir le vrai secteur de recherche',
'Start from the destinations that matter, then compare reachable postcodes rather than assuming every nearby place has the same practical journey.':
'Commencez par les destinations qui comptent, puis comparez les codes postaux accessibles plutôt que de supposer que chaque lieu proche offre le même trajet réel.',
'Compare housing requirements before lifestyle preferences':
'Comparez les exigences en matière de logement avant les préférences de style de vie',
'Filter by property type, floor area, tenure, and price before judging amenities. That keeps the shortlist grounded in homes that could realistically work.':
'Filtrez par type de bien, surface, statut de propriété et prix avant de juger les services de proximité. La sélection reste ainsi fondée sur des logements réellement envisageables.',
'Filtrez par type de bien, surface, statut freehold/leasehold et prix avant de juger les services de proximité. La sélection reste fondée sur des logements réellement envisageables.',
'Check local context consistently': 'Vérifiez le contexte local de manière cohérente',
'Use broadband, crime, road noise, parks, schools, and amenities as comparable signals. Then validate the strongest candidates with current local checks.':
'Utilisez le haut débit, la criminalité, le bruit routier, les parcs, les écoles et les services de proximité comme indicateurs comparables. Validez ensuite les meilleurs candidats avec des vérifications locales à jour.',
@ -461,7 +461,7 @@ const fr: Translations = {
'No. Use it to decide where to search, then use listing portals for current homes for sale.':
'Non. Utilisez-le pour décider où chercher, puis utilisez les portails dannonces pour les biens actuellement à vendre.',
'Move from a broad search brief to specific postcode candidates.':
'Passez dune recherche générale à des codes postaux candidats précis.',
'Passez dun brief de recherche large à des codes postaux précis.',
'Data sources': 'Sources de données',
'Review the datasets used for property and local-context comparison.':
'Examinez les jeux de données utilisés pour la comparaison immobilière et le contexte local.',
@ -481,19 +481,19 @@ const fr: Translations = {
'Si laccès au centre, à une gare, à un hôpital, à une université ou à un parc dactivités est important, utilisez dabord des filtres de temps de trajet, puis comparez les codes postaux restants à partir des données immobilières.',
'Compare value, not just headline price': 'Comparez la valeur, pas seulement le prix affiché',
'Use price, property type, and floor-area filters together. This helps distinguish lower-cost areas from areas that simply contain smaller or different homes.':
'Utilisez ensemble les filtres de prix, de type de bien et de surface. Cela permet de distinguer les zones moins chères de celles qui contiennent simplement des logements plus petits ou différents.',
'Utilisez ensemble les filtres de prix, de type de bien et de surface. Cela distingue les secteurs vraiment moins chers de ceux qui comptent simplement des logements plus petits ou différents.',
'Screen environmental and local-service signals':
'Filtrer les indicateurs environnementaux et les services locaux',
'Examiner environnement et services locaux',
'Road noise, parks, broadband, crime, and amenities can affect whether a property works day to day. Use them as screening criteria before booking viewings.':
'Le bruit routier, les parcs, le haut débit, la criminalité et les services de proximité peuvent affecter la vie quotidienne dans un logement. Utilisez-les comme critères de tri avant de réserver des visites.',
'Can I use this for commuter villages around Bristol?':
'Puis-je lutiliser pour les villages de navetteurs autour de Bristol ?',
'Puis-je lutiliser pour les villages de commuter belt autour de Bristol ?',
'Yes, where the relevant postcode and travel-time data is available. Always verify routes and services manually before deciding.':
'Oui, lorsque les données de code postal et de temps de trajet pertinentes sont disponibles. Vérifiez toujours les itinéraires et les services manuellement avant de décider.',
'Can this tell me whether a listing is good value?':
'Cela peut-il me dire si une annonce présente un bon rapport qualité-prix ?',
'Cela peut-il me dire si une annonce est au bon prix ?',
'It can provide area context, but a specific listing still needs comparable sales, condition checks, survey findings, and professional advice where appropriate.':
'Il peut fournir un contexte de secteur, mais une annonce précise nécessite toujours des ventes comparables, des vérifications détat, des rapports dexpertise et des conseils professionnels le cas échéant.',
'Loutil fournit le contexte du secteur, mais une annonce précise demande encore des ventes comparables, une vérification de létat, les conclusions du survey et, si nécessaire, un conseil professionnel.',
'Search by reachable postcodes before refining by budget and local context.':
'Recherchez par codes postaux accessibles avant daffiner par budget et contexte local.',
'Understand price patterns before setting listing alerts.':
@ -513,18 +513,18 @@ const fr: Translations = {
'Perfect Postcode combine des jeux de données sur limmobilier, les transports, léducation, lenvironnement et les services locaux afin que les acheteurs puissent comparer les codes postaux de manière cohérente. Cette page explique à quoi servent les données et où elles doivent être vérifiées.',
'Property and housing context': 'Contexte immobilier et logement',
'The product uses property transaction and housing-context datasets to support filters such as sale price, property type, tenure, floor area, energy performance, and estimated current value.':
'Le produit utilise des jeux de données sur les transactions immobilières et le contexte du logement pour prendre en charge des filtres comme le prix de vente, le type de bien, le statut de propriété, la surface, la performance énergétique et la valeur actuelle estimée.',
'Le produit utilise des jeux de données sur les transactions immobilières et le contexte du logement pour alimenter des filtres comme le prix de vente, le type de bien, le statut freehold/leasehold, la surface, la performance énergétique et la valeur actuelle estimée.',
'Use these fields to compare areas, not as a formal valuation.':
'Utilisez ces champs pour comparer des zones, et non comme une évaluation formelle.',
'Utilisez ces champs pour comparer des secteurs, pas comme une estimation officielle.',
'Check current listings, title information, lender requirements, and survey results before buying.':
'Vérifiez les annonces à jour, les informations de titre, les exigences du prêteur et les rapports dexpertise avant dacheter.',
'Vérifiez les annonces à jour, le titre de propriété, les exigences du prêteur et les résultats du survey avant dacheter.',
'Schools, safety, broadband, and environment':
'Écoles, sécurité, haut débit et environnement',
'Local-context filters help compare postcodes on signals that affect daily life. They should be treated as screening data and checked against current official sources for decisions.':
'Les filtres de contexte local permettent de comparer les codes postaux selon des indicateurs qui affectent la vie quotidienne. Ils doivent être traités comme des données de tri et vérifiés auprès de sources officielles à jour avant toute décision.',
'Travel-time data': 'Données sur le temps de trajet',
'Travel-time filters are designed for consistent area comparison. Route availability, disruption, parking, walking access, and timetable details should be verified before committing to an area.':
'Les filtres de temps de trajet sont conçus pour une comparaison cohérente des zones. La disponibilité des itinéraires, les perturbations, le stationnement, laccès à pied et les détails des horaires doivent être vérifiés avant de sengager dans une zone.',
'Les filtres de temps de trajet servent à comparer les secteurs de manière cohérente. Disponibilité des itinéraires, perturbations, stationnement, accès à pied et horaires doivent être vérifiés avant de sengager sur un secteur.',
'Why does coverage focus on England?':
'Pourquoi la couverture se concentre-t-elle sur lAngleterre ?',
'Several core property, education, and local-context datasets are jurisdiction-specific. England coverage keeps comparisons more consistent.':
@ -532,7 +532,7 @@ const fr: Translations = {
'How should I handle stale or missing data?':
'Comment dois-je gérer les données obsolètes ou manquantes ?',
'Use the map as a shortlist tool. If a postcode matters, verify the latest details with current official sources and direct local checks.':
'Utilisez la carte comme outil de présélection. Si un code postal est important, vérifiez les derniers détails auprès des sources officielles actuelles et effectuez des contrôles locaux directs.',
'Utilisez la carte pour présélectionner. Si un code postal compte vraiment, vérifiez les derniers détails auprès de sources officielles à jour et par des contrôles locaux directs.',
'How filters and comparisons should be interpreted.':
'Comment les filtres et les comparaisons doivent être interprétés.',
'Review postcode-level context before a viewing.':
@ -547,7 +547,7 @@ const fr: Translations = {
'Understand how to use postcode filters, property estimates, travel-time data, school context and local signals as a home-buying shortlist tool.':
'Comprenez comment utiliser les filtres de codes postaux, les estimations immobilières, les données de temps de trajet, le contexte scolaire et les indicateurs locaux comme outil de présélection pour un achat immobilier.',
'Perfect Postcode is designed to make area shortlisting more evidence-led. It doesnt replace estate agents, surveyors, conveyancers, lenders, school admissions teams, or local authority checks.':
'Perfect Postcode est conçu pour rendre la présélection de zones plus factuelle. Il ne remplace pas les agents immobiliers, les experts, les juristes spécialisés en transfert immobilier, les prêteurs, les équipes dadmission scolaire ni les contrôles des autorités locales.',
'Perfect Postcode rend la présélection de secteurs plus factuelle. Il ne remplace pas les estate agents, surveyors, conveyancers, prêteurs, services dadmission scolaire ni les vérifications auprès de lautorité locale.',
'Start with hard constraints': 'Commencez avec des contraintes strictes',
'Begin with non-negotiables such as budget, property type, floor area, commute time, and essential services. This removes impossible postcodes before softer preferences are considered.':
'Commencez par les éléments non négociables comme le budget, le type de bien, la surface, le temps de trajet et les services essentiels. Cela exclut les codes postaux impossibles avant de tenir compte des préférences plus souples.',
@ -560,13 +560,13 @@ const fr: Translations = {
'Can the tool choose the right postcode for me?':
'Loutil peut-il choisir le bon code postal pour moi ?',
'No. It helps compare evidence and reduce the search area. The final decision needs direct visits, current listings, legal checks, surveys, and personal judgement.':
'Non. Il aide à comparer les données et à réduire la zone de recherche. La décision finale nécessite des visites sur place, des annonces à jour, des vérifications juridiques, des expertises et votre propre jugement.',
'Non. Il aide à comparer les données et à réduire le secteur de recherche. La décision finale demande des visites, des annonces à jour, des vérifications juridiques, des surveys et votre propre jugement.',
'How should I use estimates?': 'Comment dois-je utiliser les estimations ?',
'Use estimates as comparison signals, not as professional valuations or purchase advice.':
'Utilisez les estimations comme signaux de comparaison, et non comme évaluations professionnelles ou conseils dachat.',
'Understand where key filters come from.': 'Comprenez doù viennent les filtres clés.',
'Apply the methodology to price-led area comparison.':
'Appliquez la méthodologie à la comparaison de zones basée sur les prix.',
'Appliquez la méthodologie à la comparaison de secteurs par les prix.',
'Apply the methodology to destination-led search.':
'Appliquez la méthodologie à la recherche basée sur la destination.',
Trust: 'Confiance',
@ -577,27 +577,27 @@ const fr: Translations = {
'Learn how Perfect Postcode treats saved searches, account data and property research workflows with privacy and security in mind.':
'Découvrez comment Perfect Postcode traite les recherches enregistrées, les données de compte et les parcours de recherche immobilière en tenant compte de la confidentialité et de la sécurité.',
'Property research can reveal personal priorities, budgets, and locations. The product keeps public SEO pages separate from account-only areas and marks private dashboard/account routes as noindex.':
'La recherche immobilière peut révéler des priorités personnelles, des budgets et des emplacements. Le produit sépare les pages SEO publiques des zones réservées aux comptes et marque les routes privées du tableau de bord et du compte en noindex.',
'La recherche immobilière peut révéler des priorités personnelles, des budgets et des lieux. Le produit sépare les pages SEO publiques des espaces réservés au compte et marque les pages privées du tableau de bord et du compte en noindex.',
'Public pages and private areas are separated':
'Les pages publiques et les zones privées sont séparées',
'Pages publiques et espaces privés sont séparés',
'Marketing, methodology, guide, and support pages are indexable. Dashboard, account, saved searches, invites, and invitation routes are marked noindex or blocked from crawler access where appropriate.':
'Les pages marketing, méthodologie, guide et support sont indexables. Le tableau de bord, le compte, les recherches enregistrées, les invitations et les routes dinvitation sont marqués noindex ou bloqués à laccès des robots dindexation, le cas échéant.',
'Les pages marketing, méthodologie, guides et assistance sont indexables. Le tableau de bord, le compte, les recherches enregistrées, les invitations et les pages dinvitation sont marqués noindex ou bloqués aux robots dindexation quand cest nécessaire.',
'Saved search data is account-scoped':
'Les données de recherche enregistrées sont limitées au compte',
'Saved searches and shared links are intended for signed-in use. They arent included in the public sitemap and shouldnt be crawlable as public content.':
'Les recherches enregistrées et les liens partagés sont destinés aux utilisateurs connectés. Ils ne sont pas inclus dans le plan du site public et ne doivent pas être explorables comme contenu public.',
'Les recherches enregistrées et les liens partagés sont destinés aux utilisateurs connectés. Ils ne figurent pas dans le sitemap public et ne doivent pas être explorables comme contenu public.',
'Search measurement without exposing private data':
'Mesurer la recherche sans exposer de données privées',
'SEO measurement should happen on public pages using aggregated analytics and Search Console data. Private query parameters and account views shouldnt become indexable landing pages.':
'La mesure SEO doit se faire sur les pages publiques à laide danalyses agrégées et de données Search Console. Les paramètres de requêtes privées et les vues de compte ne doivent pas devenir des pages de destination indexables.',
'La mesure SEO doit se faire sur les pages publiques avec des analytics agrégées et Search Console. Les paramètres de requête privés et les vues de compte ne doivent pas devenir des landing pages indexables.',
'Are saved searches listed in the sitemap?':
'Les recherches enregistrées sont-elles répertoriées dans le plan du site ?',
'No. Public SEO pages are listed; account and saved-search routes are intentionally excluded.':
'Non. Les pages SEO publiques sont répertoriées ; les routes de compte et de recherches enregistrées sont intentionnellement exclues.',
'Non. Les pages SEO publiques sont listées ; les pages de compte et de recherches enregistrées sont volontairement exclues.',
'Can private dashboard URLs appear in search?':
'Les URL privées du tableau de bord peuvent-elles apparaître dans les résultats de recherche ?',
'They shouldnt be indexed. The server marks private routes noindex and the sitemap only lists public pages.':
'Elles ne devraient pas être indexées. Le serveur marque les routes privées en noindex et le plan du site ne répertorie que les pages publiques.',
'Elles ne devraient pas être indexées. Le serveur marque les pages privées en noindex et le sitemap ne liste que les pages publiques.',
'How to use public postcode data responsibly.':
'Comment utiliser les données publiques des codes postaux de manière responsable.',
'What data powers the public comparisons.':
@ -613,7 +613,7 @@ const fr: Translations = {
createAccount: 'Créer un compte',
resetPassword: 'Réinitialiser le mot de passe',
valueProp:
'Enregistrez vos recherches, ajoutez des biens en favoris et créez une sélection de zones qui correspondent à vos critères.',
'Enregistrez vos recherches, ajoutez des biens en favoris et créez une sélection de secteurs adaptés à vos critères.',
continueWithGoogle: 'Continuer avec Google',
email: 'E-mail',
emailPlaceholder: 'vous@exemple.com',
@ -629,9 +629,9 @@ const fr: Translations = {
// ── Upgrade Modal ──────────────────────────────────
upgrade: {
title: 'Trouvez tous les codes postaux qui correspondent',
title: 'Trouvez tous les codes postaux compatibles',
description:
'Vous explorez actuellement la zone de démonstration. Obtenez un accès à vie à chaque code postal, chaque filtre, chaque quartier. Un seul paiement, pour toujours.',
'Vous explorez actuellement la zone de démonstration. Obtenez un accès à vie à tous les codes postaux, tous les filtres et tous les quartiers dAngleterre. Un seul paiement, pour toujours.',
free: 'Gratuit',
freeForEarly: 'Gratuit pour les premiers utilisateurs. Aucune carte bancaire requise.',
oneTimePayment: 'Paiement unique. Accès à vie.',
@ -641,10 +641,10 @@ const fr: Translations = {
registerAndUpgrade: 'Sinscrire et passer à la version complète',
alreadyHaveAccount: 'Vous avez déjà un compte ? Connectez-vous',
continueWithDemo: 'Continuer avec la démo',
backToSharedArea: 'Retour à la zone partagée',
backToSharedArea: 'Retour au secteur partagé',
sharedAreaDescription:
'Vous consultez une zone partagée. Pour explorer au-delà, obtenez un accès à vie à chaque code postal, chaque filtre et chaque quartier dAngleterre.',
checkoutFailed: 'Échec du paiement',
'Vous consultez un secteur partagé. Pour explorer au-delà, obtenez un accès à vie à tous les codes postaux, tous les filtres et tous les quartiers dAngleterre.',
checkoutFailed: 'Le paiement a échoué',
},
// ── Save Search Modal ──────────────────────────────
@ -666,9 +666,9 @@ const fr: Translations = {
activationDelayedTitle: 'Paiement reçu',
activationDelayedSubtitle: 'Laccès est encore en cours dactivation.',
activationDelayedDescription:
'Nous navons pas encore pu confirmer la mise à jour du compte. Actualisez dans un instant ou contactez le support si laccès napparaît pas.',
'Nous navons pas encore pu confirmer la mise à jour du compte. Actualisez dans un instant ou contactez lassistance si laccès napparaît pas.',
stayOnPricing: 'Rester sur les tarifs',
title: 'Cest fait.',
title: 'Accès activé.',
subtitle: 'Votre accès à vie est maintenant actif.',
description:
'Accès complet à chaque fonctionnalité, chaque code postal, dans toute lAngleterre.',
@ -681,17 +681,17 @@ const fr: Translations = {
addFilter: 'Ajouter des filtres',
findingPerfectPostcode: 'Recherche du code postal idéal',
addFiltersHint:
'Ajoutez des filtres ci-dessous pour restreindre la carte aux zones correspondant à vos critères',
'Ajoutez des filtres ci-dessous pour limiter la carte aux secteurs adaptés à vos critères',
upgradePrompt:
'Trouvez les codes postaux qui correspondent grâce aux filtres de criminalité, décoles, de bruit, de haut débit, de prix et plus de 50 autres filtres dans toute lAngleterre.',
'Trouvez les codes postaux compatibles grâce aux filtres de criminalité, décoles, de bruit, de haut débit, de prix et plus de 50 autres filtres dans toute lAngleterre.',
oneTimeLifetime: 'Paiement unique, accès à vie.',
upgradeToFullMap: 'Passer à la carte complète',
chooseFilters:
'Cliquez sur Ajouter pour filtrer. Les petits boutons affichent les détails des données ou colorent la carte.',
searchFeatures: 'Rechercher des critères...',
noMatchingFeatures: 'Aucun critère correspondant',
noMatchingFeatures: 'Aucun critère trouvé',
tryDifferentSearch: 'Essayez un autre terme de recherche',
allFeaturesActive: 'Tous les critères sont actifs',
allFeaturesActive: 'Tous les critères sont déjà actifs',
removeFilterHint: 'Supprimez un filtre pour voir les critères disponibles',
featureInfo: 'À propos de ces données',
aboutData: 'À propos de ces données',
@ -705,24 +705,24 @@ const fr: Translations = {
replayTutorial: 'Rejouer le tutoriel interactif',
clearAll: 'Tout effacer',
clearAllTitle: 'Effacer tous les filtres ?',
clearAllSavePrompt: 'Souhaitez-vous sauvegarder vos filtres actuels avant de les effacer ?',
clearAllSavePrompt: 'Souhaitez-vous enregistrer vos filtres actuels avant de les effacer ?',
clearAllUpdatePrompt:
'Mettre à jour <strong>{{name}}</strong> avec vos filtres actuels avant deffacer ?',
saveAndClear: 'Sauvegarder et effacer',
saveAndClear: 'Enregistrer et effacer',
updateAndClear: 'Mettre à jour et effacer',
clearWithoutSaving: 'Effacer sans sauvegarder',
clearWithoutSaving: 'Effacer sans enregistrer',
clearWithoutUpdating: 'Effacer sans mettre à jour',
filtersOut: 'exclut {{value}}',
schoolType: 'Type décole',
schoolRating: 'Note de lécole',
schoolRating: 'Évaluation Ofsted',
schoolDistance: 'Distance de lécole',
primary: 'Primaire',
secondary: 'Secondaire',
rating: 'Note',
goodPlus: 'Bien+',
outstanding: 'Excellent',
goodPlus: 'Good+',
outstanding: 'Outstanding',
distance: 'Distance',
crimeType: 'Type de crime',
crimeType: 'Type dinfraction',
ethnicity: 'Origine ethnique',
poiType: 'Type de point dintérêt',
party: 'Parti',
@ -733,7 +733,7 @@ const fr: Translations = {
// ── Philosophy Popup ───────────────────────────────
philosophy: {
intro:
'Commencez par vos critères indispensables, puis ajoutez les critères souhaités. La carte se réduit au fur et à mesure que vous ajoutez des filtres. Les zones restantes sont vos meilleures correspondances.',
'Commencez par vos critères indispensables, puis ajoutez les préférences. La carte se resserre à mesure que vous ajoutez des filtres. Les secteurs restants sont vos meilleures options.',
step1Title: 'Budget et fondamentaux',
step1Desc: '(fourchette de prix, surface, type de bien)',
step2Title: 'Trajet',
@ -741,11 +741,11 @@ const fr: Translations = {
step3Title: 'Sécurité',
step3Desc: '(taux de criminalité, niveaux de bruit, stabilité du sol)',
step4Title: 'Écoles',
step4Desc: '(proximité décoles notées Bien ou Excellent par Ofsted)',
step4Desc: '(écoles Ofsted Good ou Outstanding à proximité)',
step5Title: 'Cadre de vie',
step5Desc: '(restaurants, parcs, haut débit)',
step6Title: 'Énergie',
step6Desc: '(classements DPE, isolation, coûts de chauffage)',
step6Desc: '(notes EPC, isolation, coûts de chauffage)',
tip: 'Astuce : si rien ne correspond, assouplissez un critère à la fois pour voir quel compromis ouvre le plus doptions.',
},
@ -754,14 +754,14 @@ const fr: Translations = {
travelTime: 'Temps de trajet ({{mode}})',
maxTime: 'Temps maximum',
selectDestination: 'Sélectionner une destination...',
bestCase: 'Meilleur cas',
bestCaseTitle: 'Meilleur temps de trajet',
bestCase: 'Meilleur scénario',
bestCaseTitle: 'Temps de trajet le plus rapide',
bestCaseDesc:
'Utilise le temps de trajet réaliste le plus rapide (si vous partez au bon moment et avez de bonnes correspondances). Par défaut, la <strong>médiane</strong> est utilisée, représentant un trajet typique quelle que soit lheure de départ.',
'Utilise le temps de trajet réaliste le plus rapide (si vous partez au bon moment et avez de bonnes correspondances). Par défaut, la <strong>médiane</strong> est utilisée pour représenter un trajet typique, quelle que soit lheure de départ.',
noChange: 'Sans correspondance',
noChangeTitle: 'Trajets directs uniquement',
noChangeDesc:
'Limite aux trajets <strong>sans correspondance</strong> : marche, un seul service de transport, puis marche jusquà destination.',
'Limite aux trajets <strong>sans correspondance</strong> : marche, un seul service de transport en commun, puis marche jusquà destination.',
noBuses: 'Sans bus',
noBusesTitle: 'Exclure les bus',
noBusesDesc:
@ -771,7 +771,7 @@ const fr: Translations = {
removeTravelTime: 'Supprimer le temps de trajet',
addTravelTime: 'Ajouter le temps de trajet en {{mode}}',
clearDestination: 'Effacer la destination',
typeToFilter: 'Tapez pour filtrer...',
typeToFilter: 'Saisissez pour filtrer...',
noDestinations: 'Aucune destination trouvée',
modeCar: 'Voiture',
modeBicycle: 'Vélo',
@ -779,7 +779,7 @@ const fr: Translations = {
modeTransit: 'Transports en commun',
modeCarDesc: 'Temps de trajet en voiture par litinéraire routier le plus rapide',
modeBicycleDesc: 'Temps de trajet à vélo via des itinéraires cyclables',
modeWalkingDesc: 'Temps de marche le long des chemins piétons et trottoirs',
modeWalkingDesc: 'Temps de marche via chemins piétons et trottoirs',
modeTransitDesc: 'Temps de trajet en train, métro et bus',
},
@ -790,7 +790,7 @@ const fr: Translations = {
carDesc: ' en voiture, basé sur les vitesses de circulation habituelles et le réseau routier.',
bicycleDesc: ' à vélo, via des itinéraires adaptés aux cyclistes.',
walkingDesc: ' à pied, via les chemins piétons et trottoirs.',
mainDesc: 'Affiche le temps de trajet entre la destination sélectionnée et chaque zone.',
mainDesc: 'Affiche le temps de trajet entre la destination sélectionnée et chaque secteur.',
sliderHint: 'Utilisez le curseur pour définir votre temps de trajet maximum.',
},
@ -813,9 +813,9 @@ const fr: Translations = {
// ── Map Legend ─────────────────────────────────────
mapLegend: {
clearColourView: 'Effacer la vue en couleur',
clearColourView: 'Effacer la coloration',
resetColourScale: 'Réinitialiser léchelle de couleur',
historicalMatches: 'Correspondances immobilières historiques',
historicalMatches: 'Biens historiques correspondants',
numberOfProperties: 'Nombre de biens',
previewing: 'Aperçu de \u201c{{name}}\u201d',
},
@ -824,7 +824,7 @@ const fr: Translations = {
map: {
ogTitle: 'Votre code postal idéal',
ogPropertyPrices: 'Prix immobiliers',
ogEnergyRatings: 'Classes énergie',
ogEnergyRatings: 'Notes EPC',
ogSchools: 'Écoles',
ogCrimeStats: 'Criminalité',
ogTransport: 'Transports',
@ -835,17 +835,17 @@ const fr: Translations = {
unknownAddress: 'Adresse inconnue',
estValue: 'Valeur estimée :',
type: 'Type :',
builtForm: 'Forme du bâti :',
tenure: 'Régime foncier :',
withinConservationArea: 'Dans une zone de conservation :',
builtForm: 'Type de construction :',
tenure: 'Statut juridique :',
withinConservationArea: 'En conservation area :',
floorArea: 'Surface :',
rooms: 'Pièces :',
built: 'Construction :',
formerCouncil: 'Ancien logement social :',
exCouncilBadge: 'Peut-être ancien logement social',
listedBuildingBadge: 'Peut-être classé',
epcRating: 'Classe DPE :',
epcPotential: 'Potentiel DPE :',
exCouncilBadge: 'Probable ancien council house',
listedBuildingBadge: 'Bâtiment probablement classé',
epcRating: 'Note EPC :',
epcPotential: 'Potentiel EPC :',
renovations: 'Rénovations',
perSqm: '/m²',
historyTitle: 'Historique',
@ -854,12 +854,12 @@ const fr: Translations = {
searchPlaceholder: 'Rechercher par adresse ou code postal...',
propertyData: 'Données immobilières',
propertyDataDesc:
'Les prix proviennent du HM Land Registry (ce que les acheteurs ont réellement payé). La surface, les classes énergétiques, lannée de construction et le régime foncier proviennent des diagnostics DPE officiels. Les deux sources sont reliées par adresse au sein de chaque code postal.',
'Les prix proviennent du HM Land Registry (ce que les acheteurs ont réellement payé). La surface, les notes EPC, lannée de construction et le statut juridique proviennent des EPC officiels. Les deux sources sont rapprochées par adresse au sein de chaque code postal.',
},
// ── Area Pane ──────────────────────────────────────
areaPane: {
areaStatistics: 'Statistiques de la zone',
areaStatistics: 'Statistiques du secteur',
areaOverview: 'Vue densemble',
statsFor: 'Statistiques de tous les biens ({{type}})',
matchingFilters: ' correspondant à tous les filtres actifs',
@ -867,18 +867,18 @@ const fr: Translations = {
matchingFiltersOption: 'Filtres actifs',
allPropertiesOption: 'Tous les biens',
filtersAffectStats: 'Les statistiques de ce panneau utilisent les {{count}} filtres actifs.',
filtersIgnoredForStats: 'Affiche les statistiques de tous les biens de la zone sélectionnée.',
filtersIgnoredForStats: 'Affiche les statistiques de tous les biens du secteur sélectionné.',
noFiltersAffectStats:
'Aucun filtre actif ; les statistiques couvrent tous les biens de cette zone.',
'Aucun filtre actif ; les statistiques couvrent tous les biens de ce secteur.',
filteredStatsEmpty: 'Les statistiques filtrées sont vides',
showAllStatsHint:
'{{count}} biens existent avant les filtres. Passez à tous les biens pour inspecter cette zone.',
'{{count}} biens existent avant les filtres. Passez à tous les biens pour examiner ce secteur.',
showAllStatsFallback:
'Passez à tous les biens pour inspecter cette zone sans les filtres actifs.',
'Passez à tous les biens pour examiner ce secteur sans les filtres actifs.',
showAllStats: 'Afficher tous les biens',
closestStations: 'Gares et stations les plus proches',
noNearbyStations: 'Aucune gare ou station de métro à moins de 2 km',
closestBlockingFilters: 'Ajustements les plus proches pour inclure cette zone',
closestBlockingFilters: 'Plus petits ajustements pour inclure ce secteur',
lowerMinTo: 'Abaisser le minimum à {{value}}',
raiseMaxTo: 'Augmenter le maximum à {{value}}',
allowCategory: 'Autoriser {{value}}',
@ -939,14 +939,14 @@ const fr: Translations = {
// ── Home Page ──────────────────────────────────────
home: {
heroEyebrow: 'Pour les acheteurs qui se demandent « où chercher ? »',
heroEyebrow: 'Pour celles et ceux qui se demandent « où chercher ? »',
heroTitle1: 'Trouvez les codes postaux',
heroTitle2: 'qui correspondent à votre vie',
heroTitle2: 'adaptés à votre vie',
heroTitle3: 'Pas seulement les quartiers que vous connaissez déjà.',
heroSubtitle:
'Des quartiers londoniens aux communes de navetteurs et aux villes régionales, lAngleterre compte trop de lieux pour les rechercher un par un.',
'Des boroughs londoniens aux villes de commuter belt et aux grandes villes régionales, lAngleterre compte trop de lieux pour tout vérifier un par un.',
heroDescription:
'Définissez votre budget, trajet, écoles, sécurité, bruit, haut débit 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.',
'Définissez budget, trajet, écoles, sécurité, bruit, haut débit et cadre de vie. Perfect Postcode analyse les codes postaux dAngleterre et révèle les lieux vraiment compatibles, y compris ceux que vous nauriez jamais tapés dans un portail immobilier.',
exploreTheMap: 'Trouver mes codes postaux',
seeTheDifference: 'Voir comment ça marche',
productDemoLabel: 'Démo produit Perfect Postcode',
@ -958,11 +958,11 @@ const fr: Translations = {
showcaseFeatureNoiseShort: 'Bruit',
showcaseFeatureSchoolsShort: 'Écoles',
showcaseFeatureTravelShort: 'Trajet',
showcaseGoodPrimariesNearby: '{{count}}+ bonnes écoles primaires à proximité',
showcaseGoodPrimariesNearby: '{{count}}+ écoles primaires Good+ à proximité',
showcaseWithinRail: 'À moins de {{count}} min du train',
showcaseMatchingHomesLabel: 'Biens correspondants',
showcaseMatchingHomes: '{{value}} biens correspondants',
showcaseMedianPrice: 'médiane {{value}}',
showcaseMatchingHomesLabel: 'Biens compatibles',
showcaseMatchingHomes: '{{value}} biens compatibles',
showcaseMedianPrice: 'médiane : {{value}}',
showcaseJourneyRoutes: 'Itinéraires',
showcaseNearby: '{{value}} à proximité',
showcasePoliticalVoteShare: 'Répartition des voix',
@ -984,17 +984,17 @@ const fr: Translations = {
showcaseStep1Chip2: 'Écoles primaires bien notées',
showcaseStep1Chip3: 'Moins de £500k',
showcaseStep1VennCenter: 'Codes postaux qui cochent les trois',
showcaseStep2Tab: 'Correspondances',
showcaseStep2Tab: 'Résultats',
showcaseStep2Title: 'Laissez la carte révéler des lieux que vous nauriez pas tapés',
showcaseStep2Body:
'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.',
'Parcourez lAngleterre par compatibilité plutôt quà partir de noms de quartiers familiers. Des secteurs méconnus deviennent visibles avant que les portails dannonces ne réduisent votre horizon.',
showcaseStep2Region: 'Grand Londres',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'Groupes correspondants',
showcaseStep2ClustersLabel: 'Groupes compatibles',
showcaseStep3Tab: 'Inspecter',
showcaseStep3Title: 'Comprenez pourquoi un code postal correspond',
showcaseStep3Title: 'Comprenez pourquoi un code postal ressort',
showcaseStep3Body:
'Ouvrez nimporte quelle zone correspondante et vérifiez prix, sécurité, écoles, haut débit et compromis dans un seul panneau avant dy passer un week-end.',
'Ouvrez nimporte quel secteur compatible et vérifiez prix, sécurité, écoles, haut débit et compromis dans un seul panneau avant dy passer un week-end.',
showcaseStep3HeaderArea: 'Votre code postal idéal',
showcaseStep3HeaderFit: 'Indicateurs du quartier',
showcaseStep3Stat1Label: 'Tendance des prix vendus',
@ -1004,7 +1004,7 @@ const fr: Translations = {
showcaseStep3Stat4Label: 'Débit internet',
showcaseStep3Stat4Value: '1 Gbps disponible',
showcaseStep3Stat5Label: 'Écoles primaires',
showcaseStep3Stat5Value: '3 « Excellent » à moins dun mile',
showcaseStep3Stat5Value: '3 Outstanding à moins dun mile',
showcaseStep4Tab: 'Repérer',
showcaseStep4Title: 'Allez vérifier par vous-même',
showcaseStep4Body:
@ -1012,7 +1012,7 @@ const fr: Translations = {
showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Exporter vers Excel',
showcaseStep4ColPostcode: 'Code postal',
showcaseStep4ColScore: 'Adéquation',
showcaseStep4ColScore: 'Compatibilité',
showcaseStep4ColCommute: 'Trajet',
showcaseStep4ColPrice: 'Prix vendu médian',
showcaseStep4Conclusion: 'Vous pouvez commencer votre recherche ici.',
@ -1024,40 +1024,40 @@ const fr: Translations = {
philosophyP1:
'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, haut débit et prix vendus.',
philosophyP2:
'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.',
'Perfect Postcode inverse la recherche. Dites à la carte ce qui compte et elle affiche les codes postaux compatibles, 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',
streetIntro:
'Les grands noms de quartiers cachent les détails importants : le côté de la gare, le bruit routier, les écoles, le trajet exact et les vrais prix de vente.',
streetCard1Title: 'Trouvez les zones que vous auriez manquées',
streetCard1Title: 'Trouvez les secteurs que vous auriez manqués',
streetCard1Body:
'Faites ressortir les codes postaux qui correspondent à vos critères, au lieu de dépendre seulement des noms connus ou des recommandations.',
'Faites ressortir les codes postaux adaptés à vos critères, au lieu de dépendre seulement des noms connus ou des recommandations.',
streetCard2Title: 'Voyez les compromis avant les visites',
streetCard2Body:
'Comparez prix, surface, trajet, sécurité, écoles, haut débit, bruit et énergie avant de passer vos week-ends à enchaîner les visites.',
othersVs: 'Autres outils vs',
checkMyPostcode: 'Portails dannonces',
areaGuides: 'Rapports de code postal',
compSearchWithout: 'Découvrir des zones avant den connaître le nom',
compSearchWithout: 'Découvrir des secteurs avant den connaître le nom',
compSearchWithoutSub: '(besoins dabord, lieu ensuite)',
compAreaData: 'Données de quartier au niveau du code postal',
compAreaDataSub: '(criminalité, écoles, bruit, haut débit, services)',
compPropertyData: 'Historique par bien',
compPropertyDataSub: '(prix vendus, DPE, surface, valeur estimée)',
compPropertyDataSub: '(prix vendus, EPC, surface, valeur estimée)',
compFilters: '56 filtres qui fonctionnent ensemble',
compFiltersSub: '(pas un code postal ou une annonce à la fois)',
ctaTitle: 'Arrêtez de deviner où acheter.',
ctaTitle: 'Arrêtez de deviner où acheter ou louer.',
ctaDescription:
'Construisez une sélection de codes postaux adaptés à votre vraie vie, puis allez les tester sur place.',
},
// ── Pricing Page ───────────────────────────────────
pricingPage: {
title: 'Acheter avec une meilleure zone de recherche',
title: 'Acheter avec un meilleur secteur de recherche',
subtitle:
'Accès à vie à la carte qui vous aide à savoir où chercher avant de réserver des visites.',
costContext:
'Les acheteurs passent souvent leurs soirées à recouper annonces, trajets, rapports scolaires, cartes de criminalité, Street View et prix vendus. À Londres, cest incessant, mais le même problème existe dans toute lAngleterre. Perfect Postcode rassemble la recherche de zone sur une seule carte avant que vous nengagiez vos week-ends, vos frais et votre attention.',
lessThanSurvey: 'Moins quune expertise immobilière. Bien plus utile pour guider vos choix.',
'Les acheteurs passent souvent leurs soirées à recouper annonces, trajets, rapports scolaires, cartes de criminalité, Street View et prix vendus. À Londres, cest incessant, mais le même problème existe dans toute lAngleterre. Perfect Postcode rassemble la recherche de secteur sur une seule carte avant que vous nengagiez vos week-ends, vos frais et votre attention.',
lessThanSurvey: 'Moins cher quun survey immobilier. Bien plus utile pour guider vos choix.',
currentTier: 'Offre actuelle',
firstNUsers: '{{count}} premiers utilisateurs',
everyoneAfter: 'Utilisateurs suivants',
@ -1077,7 +1077,7 @@ const fr: Translations = {
feat1: '56 filtres dans toute lAngleterre',
feat2: 'Chaque code postal recherchable selon vos besoins',
feat3: 'Exploration illimitée de la carte, recherches enregistrées et exportations',
feat4: '13 M de transactions historiques et contexte de prix',
feat4: '13 M de ventes historiques et contexte des prix',
feat5: 'Trajets, écoles, criminalité, bruit, haut débit et plus',
feat6: 'Toutes les futures mises à jour de données incluses',
},
@ -1148,6 +1148,10 @@ const fr: Translations = {
dsTowOrigin: 'Forest Research / Defra NCEA',
dsTowUse:
'Polygones de couvert arboré pour les arbres isolés, groupes darbres et petits bois en Angleterre. Utilisés ici pour estimer les percentiles de couvert arboré autour des centroïdes de codes postaux.',
dsNfiName: 'Zones boisées de lInventaire forestier national',
dsNfiOrigin: 'Forest Research',
dsNfiUse:
'Parcelles boisées dau moins 0,5 ha en Angleterre, que la carte des arbres hors forêt exclut volontairement. Fusionnées avec le couvert TOW afin que lindicateur de couvert arboré et la couche cartographique incluent aussi les bois et forêts.',
dsConservationAreasName: 'Zones de conservation de Planning Data',
dsConservationAreasOrigin: 'Planning Data / autorités locales de planification',
dsConservationAreasUse:
@ -1504,8 +1508,6 @@ const fr: Translations = {
'Air Quality and Road Safety Score': 'Score qualité de lair et sécurité routière',
// ─ Feature names (Crime) ─
'Serious crime per 1k residents (avg/yr)': 'Infractions graves pour 1k habitants (moy./an)',
'Minor crime per 1k residents (avg/yr)': 'Infractions mineures pour 1k habitants (moy./an)',
'Serious crime (avg/yr)': 'Infractions graves (moy./an)',
'Minor crime (avg/yr)': 'Infractions mineures (moy./an)',
'Violence and sexual offences (avg/yr)': 'Violences et infractions sexuelles (moy./an)',

View file

@ -12,8 +12,8 @@ const hi: Translations = {
open: 'खोलें',
share: 'साझा करें',
copy: 'कॉपी करें',
copied: 'कॉपी हो गया!',
copiedToClipboard: 'क्लिपबोर्ड पर कॉपी किया गया',
copied: 'कॉपी हो गया',
copiedToClipboard: 'क्लिपबोर्ड पर कॉपी हो गया',
loading: 'लोड हो रहा है...',
loadMore: 'और लोड करें',
remaining: '{{count}} बाकी',
@ -27,14 +27,14 @@ const hi: Translations = {
minute: 'मिनट',
or: 'या',
area: 'क्षेत्र',
properties: 'संपत्तियां',
properties: 'प्रॉपर्टीज़',
postcode: 'पोस्टकोड',
noAreaSelected: 'कोई क्षेत्र चुना नहीं गया',
noAreaSelectedDesc:
'अपराध, स्कूल, कीमतें और बाकी जानकारी देखने के लिए मानचित्र पर किसी भी रंगीन क्षेत्र पर क्लिक करें',
'अपराध, स्कूल, कीमतें और बाकी जानकारी देखने के लिए मैप पर किसी भी रंगीन हिस्से पर क्लिक करें',
clickForDetails: 'विवरण के लिए क्लिक करें',
property: 'संपत्ति',
propertiesPlural: 'संपत्तियां',
property: 'प्रॉपर्टी',
propertiesPlural: 'प्रॉपर्टीज़',
bedsCount: '{{count}} बेडरूम',
bedsCount_other: '{{count}} बेडरूम',
bathsCount: '{{count}} बाथरूम',
@ -58,23 +58,23 @@ const hi: Translations = {
logIn: 'लॉग इन',
createAccount: 'खाता बनाएं',
sharing: 'साझा किया जा रहा है...',
exportLabel: 'निर्यात',
exporting: 'निर्यात हो रहा है...',
exportToExcel: 'Excel में निर्यात करें',
exportReady: 'निर्यात तैयार है. आपका डाउनलोड शुरू हो जाना चाहिए.',
exportFailed: 'निर्यात विफल रहा.',
exportTimedOut: 'निर्यात की समय सीमा समाप्त हो गई. फिर कोशिश करें.',
exportUnavailable: 'मानचित्र अभी लोड हो रहा है. थोड़ी देर में फिर कोशिश करें.',
exportEmpty: 'निर्यात पूरा हुआ, लेकिन फ़ाइल खाली है.',
exportLabel: 'Export',
exporting: 'Export हो रहा है...',
exportToExcel: 'Excel में export करें',
exportReady: 'Export तैयार है. डाउनलोड अपने-आप शुरू हो जाना चाहिए.',
exportFailed: 'Export नहीं हो पाया.',
exportTimedOut: 'Export में बहुत देर लग गई. फिर कोशिश करें.',
exportUnavailable: 'मैप अभी लोड हो रहा है. थोड़ी देर में फिर कोशिश करें.',
exportEmpty: 'Export पूरा हुआ, लेकिन फ़ाइल खाली है.',
openMenu: 'मेनू खोलें',
closeMenu: 'मेनू बंद करें',
},
export: {
title: 'निर्यात',
title: 'Export',
modeFilters: 'फ़िल्टर से मेल खाते पोस्टकोड',
modeFiltersHint:
'मानचित्र पर दिखने वाले उन सभी पोस्टकोड का निर्यात करें जो आपके मौजूदा फ़िल्टर से मेल खाते हैं.',
'मैप पर दिख रहे उन सभी पोस्टकोड को export करें जो आपके मौजूदा फ़िल्टर से मैच करते हैं.',
modeList: 'पोस्टकोड की सूची',
modeListHint:
'अपने पोस्टकोड एक-एक करके जोड़ें — स्पेसिंग और अक्षरों का रूप अपने आप ठीक हो जाएगा.',
@ -87,17 +87,17 @@ const hi: Translations = {
},
userMenu: {
fullAccess: 'पूरी पहुँच',
fullAccess: 'Full access',
demo: 'डेमो',
themeLight: 'थीम: हल्की',
themeDark: 'थीम: गहरी',
themeLight: 'थीम: Light',
themeDark: 'थीम: Dark',
account: 'खाता',
logOut: 'लॉग आउट',
},
mobileMenu: {
menu: 'मेनू',
home: 'ुख्य पृष्ठ',
home: 'होम',
},
seo: {
@ -105,400 +105,400 @@ const hi: Translations = {
reviewDataSources: 'डेटा स्रोतों की समीक्षा करें',
whatYouCanCompare: 'आप क्या तुलना कर सकते हैं',
whatYouCanCompareDesc:
'हर पेज असली शॉर्टलिस्टिंग के काम पर केंद्रित है: अनुपयुक्त जगहें हटाना, बचे हुए पोस्टकोड की तुलना करना और अगली जांच तय करना.',
'हर पेज असली शॉर्टलिस्ट बनाने के काम के लिए है: जो जगहें काम नहीं आतीं उन्हें हटाना, बचे पोस्टकोड की तुलना करना और अगली जांच तय करना.',
howToUseIt: 'इसे कैसे इस्तेमाल करें',
howToUseItDesc:
'लिस्टिंग पोर्टल खोलने या मकान देखने की बुकिंग करने से पहले इन तरीकों से पेज को उपयोगी बनाएं.',
'लिस्टिंग पोर्टल खोलने या viewing बुक करने से पहले इन तरीकों से पेज को अपने काम का बनाएं.',
methodAndLimitations: 'तरीका और सीमाएं',
methodAndLimitationsDesc:
'डेटा तुलना और शॉर्टलिस्टिंग के लिए है. महत्वपूर्ण निर्णयों के लिए फिर भी ताजा लिस्टिंग, पेशेवर जांच और सीधे स्थानीय सत्यापन की जरूरत होती है.',
'डेटा तुलना और शॉर्टलिस्ट बनाने के लिए है. बड़े फैसलों से पहले फिर भी ताज़ा लिस्टिंग, पेशेवर जांच और स्थानीय तौर पर पुष्टि जरूरी है.',
questionsBuyersAsk: 'खरीदारों के सवाल',
relatedGuides: 'संबंधित गाइड',
relatedGuidesDesc: 'मानक आंतरिक लिंक से इंडेक्स किए गए सार्वजनिक पेजों पर आगे बढ़ें.',
relatedGuidesDesc: 'इन आधिकारिक internal links से indexed public pages पर आगे पढ़ें.',
frequentlyAskedQuestions: 'अक्सर पूछे जाने वाले सवाल',
relatedPages: 'संबंधित पेज',
relatedPagesDesc: 'इन आंतरिक लिंक से उसी संपत्ति-खोज प्रक्रिया को दूसरे कोण से देखें.',
relatedPagesDesc: 'इन internal links से उसी प्रॉपर्टी खोज को दूसरे नजरिए से देखें.',
pages: {
'Property price map': 'संपत्ति मूल्य मानचित्र',
'Property price map': 'प्रॉपर्टी कीमतों का मैप',
'Compare property prices across every postcode in England':
'इंग्लैंड में प्रत्येक पोस्टकोड पर संपत्ति की कीमतों की तुलना करें',
'इंग्लैंड के हर पोस्टकोड में प्रॉपर्टी कीमतों की तुलना करें',
'Property price map for England - Compare postcodes before viewing':
'इंग्लैंड के लिए संपत्ति मूल्य मानचित्र - देखने से पहले पोस्टकोड की तुलना करें',
'इंग्लैंड का प्रॉपर्टी कीमत मैप - viewing से पहले पोस्टकोड की तुलना करें',
'Compare sold prices, estimated current value, price per square metre and local context across English postcodes before searching listings.':
'लिस्टिंग खोजने से पहले इंग्लैंड के पोस्टकोडों में बेची गई कीमतों, अनुमानित मौजूदा कीमत, प्रति वर्ग मीटर कीमत और स्थानीय संदर्भ की तुलना करें',
'लिस्टिंग खोजने से पहले इंग्लैंड के पोस्टकोडों में sold prices, अनुमानित मौजूदा कीमत, प्रति वर्ग मीटर कीमत और स्थानीय संदर्भ की तुलना करें.',
'Perfect Postcode maps sold prices, estimated current value, price per square metre, property type, floor area, tenure, and local context so buyers can find realistic search areas before opening listing portals.':
'Perfect Postcode बेची गई कीमतें, अनुमानित मौजूदा कीमत, प्रति वर्ग मीटर कीमत, संपत्ति का प्रकार, फर्श क्षेत्रफल, स्वामित्व प्रकार और स्थानीय संदर्भ दिखाता है, ताकि खरीदार लिस्टिंग पोर्टल खोलने से पहले व्यावहारिक खोज क्षेत्र पहचान सकें।',
'Perfect Postcode sold prices, अनुमानित मौजूदा कीमत, प्रति वर्ग मीटर कीमत, प्रॉपर्टी टाइप, floor area, tenure और स्थानीय संदर्भ दिखाता है, ताकि खरीदार लिस्टिंग पोर्टल खोलने से पहले व्यावहारिक search areas पहचान सकें.',
'Screen historical sale prices and current-value estimates by postcode.':
'पोस्टकोड के हिसाब से ऐतिहासिक बिक्री कीमतें और मौजूदा कीमत के अनुमान जांचें।',
'पोस्टकोड के हिसाब से पुरानी बिक्री कीमतें और मौजूदा कीमत के अनुमान देखें.',
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
'मूल्य की तुलना आवागमन, स्कूल, ब्रॉडबैंड, अपराध, शोर और सुविधाओं से करें।',
'कीमत को commute, स्कूल, ब्रॉडबैंड, अपराध, शोर और सुविधाओं के साथ तुलना करें.',
'Build a shortlist before spending weekends on viewings.':
'मकान देखने में सप्ताहांत लगाने से पहले शॉर्टलिस्ट बनाएं।',
'weekend viewings में समय लगाने से पहले शॉर्टलिस्ट बनाएं.',
'Find postcodes that fit the budget before listings appear':
'लिस्टिंग आने से पहले ऐसे पोस्टकोड खोजें जो बजट में फिट हों',
'Start with a maximum price and property type, then colour the map by price per square metre or estimated current price. This helps reveal areas where similar homes have historically traded within reach, even when there are no live listings today.':
'अधिकतम कीमत और संपत्ति के प्रकार से शुरू करें, फिर प्रति वर्ग मीटर कीमत या अनुमानित मौजूदा कीमत के आधार पर मानचित्र को रंगें। इससे वे क्षेत्र सामने आते हैं जहां समान घर पहले आपकी पहुंच वाली कीमतों पर बिके हैं, भले ही आज वहां कोई लाइव लिस्टिंग न हो।',
'अधिकतम कीमत और प्रॉपर्टी टाइप से शुरू करें, फिर मैप को प्रति वर्ग मीटर कीमत या अनुमानित मौजूदा कीमत के हिसाब से रंगें. इससे वे इलाके दिखते हैं जहां मिलते-जुलते घर पहले आपके बजट के भीतर बिके हैं, भले ही आज वहां live listing न हो.',
'Filter by last known sale price, estimated current value, property type, tenure, and floor area.':
'अंतिम ज्ञात बिक्री कीमत, अनुमानित मौजूदा कीमत, संपत्ति का प्रकार, स्वामित्व प्रकार और फर्श क्षेत्रफल के आधार पर फ़िल्टर करें।',
'आखिरी ज्ञात बिक्री कीमत, अनुमानित मौजूदा कीमत, प्रॉपर्टी टाइप, tenure और floor area से फ़िल्टर करें.',
'Compare nearby postcodes using the same criteria instead of relying on area reputation.':
'क्षेत्र की प्रतिष्ठा पर निर्भर रहने के बजाय समान मानदंड का उपयोग करके आस-पास के पोस्टकोड की तुलना करें।',
'इलाके की reputation पर निर्भर रहने के बजाय समान criteria से आस-पास के पोस्टकोड की तुलना करें.',
'Use the results as a shortlist for listing alerts, local research, and viewings.':
'लिस्टिंग अलर्ट, स्थानीय शोध और मकान देखने की योजना के लिए परिणामों को शॉर्टलिस्ट की तरह इस्तेमाल करें।',
'Separate cheap from good value': 'सस्ते को अच्छे मूल्य से अलग करें',
'Listing alerts, स्थानीय research और viewings की योजना के लिए results को शॉर्टलिस्ट की तरह इस्तेमाल करें.',
'Separate cheap from good value': 'सस्ता और good value अलग-अलग देखें',
'A lower price can reflect smaller homes, weaker transport, more noise, or fewer local services. The map keeps those trade-offs visible so the cheapest postcode isnt automatically treated as the best option.':
'कम कीमत छोटे घरों, कमजोर परिवहन, अधिक शोर या कम स्थानीय सेवाओं की ओर इशारा कर सकती है। मानचित्र ये समझौते सामने रखता है, इसलिए सबसे सस्ता पोस्टकोड अपने आप सबसे अच्छा विकल्प नहीं मान लिया जाता।',
'कम कीमत छोटे घरों, कमजोर transport, ज्यादा शोर या कम स्थानीय सेवाओं की वजह से हो सकती है. मैप ये trade-offs सामने रखता है, ताकि सबसे सस्ता पोस्टकोड अपने-आप सबसे अच्छा विकल्प न मान लिया जाए.',
'Start from area value, not listing availability':
'क्षेत्र की कीमत से शुरू करें, लिस्टिंग की उपलब्धता से नहीं',
'Area value से शुरू करें, listing availability से नहीं',
'Listing portals only show homes for sale today. A postcode-level property price map lets you compare wider areas, understand local price patterns, and avoid missing places where the next suitable listing might appear.':
'लिस्टिंग पोर्टल केवल वे घर दिखाते हैं जो आज बिक्री पर हैं। पोस्टकोड-स्तर का संपत्ति मूल्य मानचित्र आपको बड़े क्षेत्रों की तुलना करने, स्थानीय कीमत पैटर्न समझने और उन जगहों को न चूकने में मदद करता है जहां अगली उपयुक्त लिस्टिंग आ सकती है।',
'Use prices alongside real constraints': 'वास्तविक बाधाओं के साथ-साथ कीमतों का उपयोग करें',
'लिस्टिंग पोर्टल सिर्फ वे घर दिखाते हैं जो आज बिक्री पर हैं. पोस्टकोड-level प्रॉपर्टी कीमत मैप आपको बड़े इलाकों की तुलना करने, स्थानीय price patterns समझने और उन जगहों को न चूकने में मदद करता है जहां अगली सही listing आ सकती है.',
'Use prices alongside real constraints': 'कीमत को असली constraints के साथ देखें',
'Budget rarely matters on its own. Perfect Postcode combines price filters with travel time, school quality, property size, energy performance, local environment, and services so your shortlist reflects how you actually want to live.':
'बजट अकेले शायद ही पर्याप्त होता है। Perfect Postcode कीमत फ़िल्टर को यात्रा समय, स्कूल गुणवत्ता, संपत्ति के आकार, ऊर्जा प्रदर्शन, स्थानीय वातावरण और सेवाओं से जोड़ता है, ताकि आपकी शॉर्टलिस्ट आपके रहने के असली तरीके को दिखाए।',
'What the price data is for': 'मूल्य डेटा किस लिए है',
'सिर्फ बजट शायद ही काफी होता है. Perfect Postcode price filters को travel time, स्कूल quality, प्रॉपर्टी size, energy performance, स्थानीय माहौल और services से जोड़ता है, ताकि आपकी shortlist आपके असल रहने के तरीके को दिखाए.',
'What the price data is for': 'Price data किस काम आता है',
'Use the map to compare areas and spot search candidates. It isnt a valuation, mortgage decision, survey, legal search, or live listing feed.':
'्षेत्रों की तुलना करने और संभावित विकल्प पहचानने के लिए मानचित्र का उपयोग करें। यह मूल्यांकन, बंधक निर्णय, सर्वेक्षण, कानूनी खोज या लाइव लिस्टिंग फ़ीड नहीं है।',
'How to validate a promising area': 'एक आशाजनक क्षेत्र का सत्यापन कैसे करें',
'इलाकों की तुलना करने और संभावित विकल्प पहचानने के लिए मैप इस्तेमाल करें. यह valuation, mortgage decision, survey, legal search या live listing feed नहीं है.',
'How to validate a promising area': 'अच्छे लग रहे इलाके की पुष्टि कैसे करें',
'Once a postcode looks promising, check current listings, sold-price comparables, agent details, flood searches, legal packs, surveys, and local authority information before making a decision.':
'जब कोई पोस्टकोड अच्छा लगे, तो निर्णय लेने से पहले मौजूदा लिस्टिंग, मिलती-जुलती बिक्री कीमतें, एजेंट विवरण, बाढ़ खोज, कानूनी कागजात, सर्वेक्षण और स्थानीय प्राधिकरण की जानकारी जांचें।',
'जब कोई पोस्टकोड अच्छा लगे, तो फैसला लेने से पहले मौजूदा listings, comparable sold prices, agent details, flood searches, legal packs, surveys और local authority जानकारी जांचें.',
'Is this a replacement for Rightmove or Zoopla?':
'क्या यह राइटमूव या ज़ूप्ला का प्रतिस्थापन है?',
'क्या यह Rightmove या Zoopla की जगह लेता है?',
'No. Use it before and alongside listing portals. Perfect Postcode helps decide where to look; listing portals show whats currently for sale.':
'नहीं. इसे लिस्टिंग पोर्टल से पहले और उनके साथ इस्तेमाल करें। Perfect Postcode तय करने में मदद करता है कि कहां देखना है; लिस्टिंग पोर्टल दिखाते हैं कि अभी बिक्री के लिए क्या है।',
'नहीं. इसे listing portals से पहले और उनके साथ इस्तेमाल करें. Perfect Postcode तय करने में मदद करता है कि कहां देखना है; listing portals दिखाते हैं कि अभी बिक्री पर क्या है.',
'Can I compare price with schools or commute time?':
'क्या मैं कीमत की तुलना स्कूलों या आवागमन के समय से कर सकता हूँ?',
'क्या मैं कीमत को स्कूलों या commute time से compare कर सकता हूँ?',
'Yes. Price filters can be combined with travel-time, schools, crime, broadband, road-noise, amenities, and environment filters.':
'हाँ। कीमत फ़िल्टर को यात्रा-समय, स्कूल, अपराध, ब्रॉडबैंड, सड़क-शोर, सुविधाओं और पर्यावरण फ़िल्टर के साथ जोड़ा जा सकता है।',
'Does the map cover all of the UK?': 'क्या मानचित्र पूरे ब्रिटेन को कवर करता है?',
'हाँ. Price filters को travel-time, स्कूल, अपराध, ब्रॉडबैंड, road noise, सुविधाओं और environment filters के साथ जोड़ा जा सकता है.',
'Does the map cover all of the UK?': 'क्या मैप पूरे UK को cover करता है?',
'The current product focuses on England because several core property and postcode datasets are England-specific.':
'वर्तमान उत्पाद इंग्लैंड पर केंद्रित है क्योंकि कई मुख्य संपत्ति और पोस्टकोड डेटासेट इंग्लैंड-विशिष्ट हैं।',
'अभी product इंग्लैंड पर केंद्रित है, क्योंकि कई core प्रॉपर्टी और पोस्टकोड datasets England-specific हैं.',
'Birmingham property search guide': 'बर्मिंघम संपत्ति खोज गाइड',
'A worked example for balancing price, commute, and family trade-offs.':
'कीमत, आवागमन और परिवार से जुड़े समझौतों को संतुलित करने का एक उदाहरण।',
'कीमत, commute और परिवार से जुड़े trade-offs को balance करने का worked example.',
'Data sources and coverage': 'डेटा स्रोत और कवरेज',
'See which datasets sit behind the postcode filters and where they have limits.':
'देखें कि पोस्टकोड फ़िल्टर के पीछे कौन से डेटासेट हैं और उनकी सीमाएँ कहाँ हैं।',
Methodology: 'क्रियाविधि',
'देखें कि पोस्टकोड फ़िल्टर किन datasets पर चलते हैं और उनकी सीमाएं कहां हैं.',
Methodology: 'Methodology',
'Understand how the map is intended to support shortlisting, not replace due diligence.':
'समझें कि मानचित्र शॉर्टलिस्टिंग में मदद करने के लिए है, जरूरी जांच की जगह लेने के लिए नहीं।',
'Postcode checker': 'पोस्टकोड जांच',
'समझें कि मैप shortlist बनाने में मदद करता है, due diligence की जगह नहीं लेता.',
'Postcode checker': 'पोस्टकोड जांचें',
'Check one postcode before you spend time on a viewing.':
'मकान देखने में समय लगाने से पहले एक पोस्टकोड जांच लें।',
'Explore the property map': 'संपत्ति मानचित्र देखें',
'Postcode property search': 'पोस्टकोड संपत्ति खोज',
'Viewing में समय लगाने से पहले एक पोस्टकोड check कर लें.',
'Explore the property map': 'प्रॉपर्टी मैप देखें',
'Postcode property search': 'पोस्टकोड से प्रॉपर्टी खोजें',
'Find postcodes that match your property search criteria':
'ऐसे पोस्टकोड खोजें जो आपकी संपत्ति खोज की शर्तों से मेल खाते हों',
'ऐसे पोस्टकोड खोजें जो आपकी प्रॉपर्टी search criteria से match करते हों',
'Postcode property search - Find areas that match your criteria':
'पोस्टकोड संपत्ति खोज - आपकी शर्तों से मेल खाते क्षेत्र खोजें',
'Postcode property search - आपकी शर्तों से match करते इलाके खोजें',
'Search every postcode by budget, property type, floor area, tenure, commute, schools, crime, broadband, noise, parks and local amenities.':
'हर पोस्टकोड को बजट, संपत्ति के प्रकार, फर्श क्षेत्रफल, स्वामित्व प्रकार, आवागमन, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं के आधार पर खोजें।',
'हर पोस्टकोड को बजट, प्रॉपर्टी टाइप, floor area, tenure, commute, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं से search करें.',
'Search every postcode by budget, property type, size, tenure, commute, schools, crime, broadband, noise, parks, and local amenities instead of checking areas one at a time.':
'एक-एक क्षेत्र जांचने के बजाय हर पोस्टकोड को बजट, संपत्ति के प्रकार, आकार, स्वामित्व प्रकार, आवागमन, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं के आधार पर खोजें।',
'एक-एक इलाका जांचने के बजाय हर पोस्टकोड को बजट, प्रॉपर्टी टाइप, size, tenure, commute, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं से search करें.',
'Filter England-wide postcode data from one map.':
'एक ही मानचित्र से पूरे इंग्लैंड का पोस्टकोड डेटा फ़िल्टर करें।',
'एक ही मैप से पूरे इंग्लैंड का postcode data फ़िल्टर करें.',
'Shortlist unfamiliar areas with comparable evidence.':
'तुलनीय प्रमाण के साथ अनजान क्षेत्रों को शॉर्टलिस्ट करें।',
'Comparable evidence के साथ अनजान इलाकों को shortlist करें.',
'Save and share search areas before booking viewings.':
'मकान देखने की बुकिंग से पहले खोज क्षेत्र सहेजें और साझा करें।',
'Turn a broad brief into postcode candidates': 'व्यापक जरूरतों को संभावित पोस्टकोड में बदलें',
'Viewings बुक करने से पहले search areas सेव और शेयर करें.',
'Turn a broad brief into postcode candidates': 'Broad brief को postcode candidates में बदलें',
'Enter the practical constraints first: budget, property size, tenure, travel time, school needs, broadband, and tolerance for road noise or crime levels. The map removes places that fail those constraints and keeps the remaining options comparable.':
'पहले व्यावहारिक शर्तें दर्ज करें: बजट, संपत्ति का आकार, स्वामित्व प्रकार, यात्रा समय, स्कूल की जरूरतें, ब्रॉडबैंड, और सड़क के शोर या अपराध स्तर को लेकर आपकी सहनशीलता। मानचित्र उन जगहों को हटा देता है जो इन शर्तों पर खरी नहीं उतरतीं और बचे विकल्पों को तुलनीय रखता है।',
'Relax one constraint at a time': 'एक समय में एक बाधा में ढील दें',
'पहले practical constraints डालें: बजट, प्रॉपर्टी size, tenure, travel time, स्कूल needs, ब्रॉडबैंड, और road noise या crime levels को लेकर आपकी tolerance. मैप उन जगहों को हटा देता है जो fit नहीं बैठतीं और बचे विकल्पों को compare करने लायक रखता है.',
'Relax one constraint at a time': 'एक बार में एक constraint ढीला करें',
'When the search becomes too narrow, loosen a single filter and watch which postcodes reappear. This makes compromise explicit instead of relying on guesswork.':
'जब खोज बहुत सीमित हो जाए, तो एक फ़िल्टर ढीला करें और देखें कि कौन से पोस्टकोड फिर दिखाई देते हैं। इससे अनुमान लगाने के बजाय समझौता साफ दिखता है।',
'Turn vague areas into specific postcodes': 'अस्पष्ट क्षेत्रों को विशिष्ट पोस्टकोड में बदलें',
'जब search बहुत संकरी हो जाए, तो एक फ़िल्टर ढीला करें और देखें कौन से पोस्टकोड वापस आते हैं. इससे guesswork के बजाय compromise साफ दिखता है.',
'Turn vague areas into specific postcodes': 'धुंधले area ideas को specific postcodes में बदलें',
'Broad town or borough searches hide large differences between streets. Perfect Postcode helps you move from a general area to postcodes that satisfy your hard requirements.':
'व्यापक शहर या बरो की खोजें सड़कों के बीच बड़े अंतर छिपा देती हैं। Perfect Postcode आपको सामान्य क्षेत्र से उन पोस्टकोड तक ले जाता है जो आपकी अनिवार्य शर्तों को पूरा करते हैं।',
'Keep trade-offs visible': 'समझौते साफ दिखाई दें',
'Town या borough-level searches सड़कों के बीच बड़े फर्क छिपा देती हैं. Perfect Postcode आपको general area से उन पोस्टकोड तक ले जाता है जो आपकी hard requirements पूरी करते हैं.',
'Keep trade-offs visible': 'Trade-offs साफ रखें',
'When there are too many or too few matches, adjust one constraint at a time and see exactly which postcodes reappear. That makes compromises explicit instead of relying on guesswork.':
'जब मिलान बहुत ज्यादा या बहुत कम हों, तो एक बार में एक शर्त बदलें और देखें कि कौन से पोस्टकोड फिर दिखाई देते हैं। इससे अंदाजे के बजाय समझौते साफ हो जाते हैं।',
'जब matches बहुत ज्यादा या बहुत कम हों, तो एक बार में एक condition बदलें और देखें कौन से पोस्टकोड वापस आते हैं. इससे guesswork के बजाय compromises साफ हो जाते हैं.',
'Why postcode-level comparison matters': 'पोस्टकोड-स्तरीय तुलना क्यों मायने रखती है',
'Two nearby postcodes can differ on schools, road noise, transport access, property mix, and price. Comparing at postcode level reduces the chance of treating a whole town as one uniform market.':
'पास के दो पोस्टकोड स्कूलों, सड़क के शोर, परिवहन पहुंच, संपत्ति प्रकारों और कीमत में अलग हो सकते हैं। पोस्टकोड स्तर पर तुलना करने से पूरे शहर को एक जैसा बाजार मानने की गलती कम होती है।',
'पास के दो पोस्टकोड स्कूल, road noise, transport access, property mix और कीमत में काफी अलग हो सकते हैं. Postcode-level comparison से पूरे शहर को एक जैसा market मानने की गलती कम होती है.',
'How to use the results': 'परिणामों का उपयोग कैसे करें',
'Treat matching postcodes as a research queue: check live listings, visit streets, confirm schools and admissions, and review current official sources.':
'मेल खाते पोस्टकोड को जांच-सूची की तरह लें: लाइव लिस्टिंग देखें, सड़कों पर जाएँ, स्कूल और दाखिले की पुष्टि करें, और मौजूदा आधिकारिक स्रोतों की समीक्षा करें।',
'Can I save a postcode property search?': 'क्या मैं पोस्टकोड संपत्ति खोज सहेज सकता हूँ?',
'Matching postcodes को research queue की तरह लें: live listings देखें, streets visit करें, schools और admissions confirm करें, और current official sources check करें.',
'Can I save a postcode property search?': 'क्या मैं postcode property search सेव कर सकता हूँ?',
'Yes. Licensed users can save searches and return to them later. Saved searches are designed for shortlists and comparison notes.':
'हाँ। लाइसेंस प्राप्त उपयोगकर्ता खोजें सहेज सकते हैं और बाद में उन पर लौट सकते हैं। सहेजी गई खोजें शॉर्टलिस्ट और तुलना नोट्स के लिए बनाई गई हैं।',
'Can I search without knowing the area?': 'क्या मैं क्षेत्र जाने बिना खोज कर सकता हूँ?',
'हाँ. Licensed users searches सेव कर सकते हैं और बाद में वहीं लौट सकते हैं. Saved searches shortlist और comparison notes के लिए बनाई गई हैं.',
'Can I search without knowing the area?': 'क्या area जाने बिना search कर सकता हूँ?',
'Yes. The map is designed to surface unfamiliar areas that match practical constraints, not just places you already know.':
'हाँ। मानचित्र ऐसे अनजान क्षेत्र सामने लाने के लिए बनाया गया है जो आपकी व्यावहारिक शर्तों से मेल खाते हैं, सिर्फ वे जगहें नहीं जिन्हें आप पहले से जानते हैं।',
'Are the results live property listings?': 'क्या परिणाम लाइव संपत्ति सूची हैं?',
'हाँ. मैप उन अनजान इलाकों को सामने लाने के लिए बना है जो आपकी practical constraints से match करते हैं, सिर्फ उन जगहों को नहीं जिन्हें आप पहले से जानते हैं.',
'Are the results live property listings?': 'क्या results live property listings हैं?',
'No. The tool compares postcode data and historical/contextual property signals. You still need listing portals for current availability.':
'नहीं. यह साधन पोस्टकोड डेटा और ऐतिहासिक/संदर्भ संपत्ति संकेतों की तुलना करता है। मौजूदा उपलब्धता के लिए आपको अब भी लिस्टिंग पोर्टल देखने होंगे।',
'नहीं. यह tool postcode data और historical/contextual property signals की तुलना करता है. Current availability के लिए listing portals देखने होंगे.',
'Manchester property search guide': 'मैनचेस्टर संपत्ति खोज गाइड',
'A regional guide for narrowing a broad search around Greater Manchester.':
'ग्रेटर मैनचेस्टर के आसपास व्यापक खोज को सीमित करने के लिए एक क्षेत्रीय मार्गदर्शिका।',
'Start a postcode search': 'पोस्टकोड खोज प्रारंभ करें',
'Commute property search': 'यात्रा संपत्ति खोज',
'Greater Manchester के आसपास broad search को narrow करने के लिए regional guide.',
'Start a postcode search': 'Postcode search शुरू करें',
'Commute property search': 'Commute के हिसाब से प्रॉपर्टी खोजें',
'Search for places to live by commute time':
'आवागमन के समय के अनुसार रहने के लिए स्थान खोजें',
'Commute time के हिसाब से रहने की जगहें खोजें',
'Commute property search - Find places to live by travel time':
'आवागमन आधारित संपत्ति खोज - यात्रा समय से रहने की जगहें खोजें',
'Commute property search - travel time से रहने की जगहें खोजें',
'Filter postcodes by commute time, then compare price, schools, safety, broadband, road noise, parks and property data on one map.':
'आवागमन के समय के अनुसार पोस्टकोड फ़िल्टर करें, फिर एक मानचित्र पर कीमत, स्कूल, सुरक्षा, ब्रॉडबैंड, सड़क शोर, पार्क और संपत्ति डेटा की तुलना करें।',
'Commute time से पोस्टकोड फ़िल्टर करें, फिर एक मैप पर कीमत, स्कूल, सुरक्षा, ब्रॉडबैंड, road noise, पार्क और property data की तुलना करें.',
'Filter postcodes by modelled car, cycling, walking, and public transport travel times, then layer on property price, schools, crime, broadband, noise, and local amenities.':
'कार, साइकिल, पैदल और सार्वजनिक परिवहन के मॉडल किए गए यात्रा समय से पोस्टकोड फ़िल्टर करें, फिर संपत्ति की कीमत, स्कूल, अपराध, ब्रॉडबैंड, शोर और स्थानीय सुविधाएं जोड़ें।',
'कार, साइकिल, पैदल और public transport के modelled travel times से पोस्टकोड फ़िल्टर करें, फिर property price, स्कूल, crime, ब्रॉडबैंड, noise और local amenities जोड़ें.',
'Compare reachable postcodes by realistic travel-time bands.':
'व्यावहारिक यात्रा-समय बैंड के अनुसार पहुंच वाले पोस्टकोड की तुलना करें।',
'Realistic travel-time bands के हिसाब से reachable postcodes की तुलना करें.',
'Search by destination first, then filter for property and neighbourhood fit.':
'पहले गंतव्य से खोजें, फिर संपत्ति और पड़ोस की उपयुक्तता से फ़िल्टर करें।',
'पहले destination से search करें, फिर property और neighbourhood fit से फ़िल्टर करें.',
'Avoid areas that look close on a map but fail the daily journey.':
'उन क्षेत्रों से बचें जो मानचित्र पर पास लगते हैं लेकिन रोज की यात्रा में काम नहीं आते।',
'Start with the destination that matters': 'उस गंतव्य से शुरुआत करें जो मायने रखता है',
'उन इलाकों से बचें जो मैप पर पास लगते हैं, लेकिन रोज के commute में काम नहीं आते.',
'Start with the destination that matters': 'सबसे जरूरी destination से शुरुआत करें',
'Choose a commute destination, transport mode, and time range, then add the property filters. This prevents a cheap-looking area from reaching the shortlist if the daily journey doesnt work.':
'आवागमन का गंतव्य, यात्रा का तरीका और समय सीमा चुनें, फिर संपत्ति फ़िल्टर जोड़ें। अगर रोज की यात्रा काम नहीं आती, तो सस्ता दिखने वाला क्षेत्र शॉर्टलिस्ट में नहीं पहुंचेगा।',
'Commute destination, travel mode और time range चुनें, फिर property filters जोड़ें. अगर रोज की यात्रा काम नहीं आती, तो सस्ता दिखने वाला area shortlist में नहीं पहुंचेगा.',
'Compare the commute against the rest of daily life':
'आवागमन की तुलना रोजमर्रा की बाकी जरूरतों से करें',
'Commute को रोजमर्रा की बाकी जरूरतों से मिलाकर देखें',
'A fast commute isnt enough if the property size, school context, safety threshold, broadband, or road-noise exposure dont fit. The map keeps those signals side by side.':
'अगर संपत्ति का आकार, स्कूल संदर्भ, सुरक्षा सीमा, ब्रॉडबैंड या सड़क-शोर का असर मेल नहीं खाता, तो तेज आवागमन काफी नहीं है। मानचित्र इन संकेतों को साथ-साथ रखता है।',
'अगर property size, school context, safety threshold, ब्रॉडबैंड या road-noise exposure fit नहीं बैठता, तो fast commute काफी नहीं है. मैप इन signals को साथ-साथ रखता है.',
'Commute from postcodes, not just place names':
'सिर्फ जगह के नाम से नहीं, पोस्टकोड से आवागमन देखें',
'सिर्फ place names नहीं, postcodes से commute देखें',
'Two streets in the same town can have very different station access, road routes, and public transport options. Postcode-level travel-time filtering keeps that difference visible.':
'एक ही शहर की दो सड़कों में स्टेशन तक पहुंच, सड़क मार्ग और सार्वजनिक परिवहन विकल्प बहुत अलग हो सकते हैं। पोस्टकोड-स्तरीय यात्रा-समय फ़िल्टरिंग यह अंतर सामने रखती है।',
'एक ही town की दो streets में station access, road routes और public transport options बहुत अलग हो सकते हैं. Postcode-level travel-time filtering यह फर्क सामने रखती है.',
'Balance journey time with the rest of the move':
'यात्रा समय को घर बदलने की बाकी जरूरतों से संतुलित करें',
'Journey time को move की बाकी जरूरतों से balance करें',
'A fast commute only helps if the area also fits your budget, housing needs, school preferences, safety threshold, broadband requirement, and tolerance for road noise.':
'तेज आवागमन तभी मदद करता है जब क्षेत्र आपके बजट, आवास जरूरतों, स्कूल प्राथमिकताओं, सुरक्षा सीमा, ब्रॉडबैंड जरूरत और सड़क शोर की सहनशीलता से भी मेल खाता हो।',
'Fast commute तभी मदद करता है जब area आपके बजट, housing needs, school preferences, safety threshold, ब्रॉडबैंड जरूरत और road noise tolerance से भी match करता हो.',
'How travel-time filters should be interpreted':
'यात्रा-समय फ़िल्टर की व्याख्या कैसे की जानी चाहिए',
'Travel-time filters को कैसे पढ़ें',
'Travel-time modelling is useful for comparing areas consistently. Before committing, check current timetables, disruption patterns, parking, cycling conditions, and walking routes.':
'यात्रा-समय मॉडलिंग क्षेत्रों की लगातार तुलना के लिए उपयोगी है। निर्णय लेने से पहले मौजूदा समय-सारिणी, व्यवधान पैटर्न, पार्किंग, साइकिल की स्थिति और पैदल रास्ते जांचें।',
'Travel-time modelling इलाकों की consistent comparison के लिए useful है. Commit करने से पहले current timetables, disruption patterns, parking, cycling conditions और walking routes जरूर check करें.',
'Why commute filters are combined with property data':
'आवागमन फ़िल्टर को संपत्ति डेटा के साथ क्यों जोड़ा जाता है?',
'Commute filters को property data के साथ क्यों जोड़ा जाता है?',
'Commute search is most useful when it removes impossible areas while still showing whether the remaining options are affordable and liveable.':
'आवागमन खोज तब सबसे उपयोगी होती है जब यह अनुपयुक्त क्षेत्रों को हटाती है और साथ ही दिखाती है कि बचे विकल्प किफायती और रहने लायक हैं या नहीं।',
'Commute search सबसे useful तब है जब यह impossible areas हटाती है और साथ में दिखाती है कि बचे options affordable और रहने लायक हैं या नहीं.',
'Can I compare car, cycling, walking, and public transport?':
'क्या मैं कार, साइकिल चलाना, पैदल चलना और सार्वजनिक परिवहन की तुलना कर सकता हूँ?',
'क्या मैं कार, cycling, walking और public transport compare कर सकता हूँ?',
'The product supports multiple travel modes where precomputed destination data is available.':
'जहां पहले से गणना किया गया गंतव्य डेटा उपलब्ध है, वहां उत्पाद कई यात्रा तरीकों का समर्थन करता है।',
'Are travel times exact?': 'क्या यात्रा का समय सटीक है?',
'जहां precomputed destination data उपलब्ध है, वहां product कई travel modes support करता है.',
'Are travel times exact?': 'क्या travel times exact हैं?',
'No. Treat them as a consistent comparison model, then verify the real route before making viewing or purchase decisions.':
'नहीं. इन्हें तुलना के लिए एक समान मॉडल मानें, फिर मकान देखने या खरीद का निर्णय लेने से पहले असली मार्ग की पुष्टि करें।',
'नहीं. इन्हें consistent comparison model मानें, फिर viewing या खरीद का फैसला लेने से पहले असली route verify करें.',
'Can I combine commute filters with schools and price?':
'क्या मैं स्कूलों और कीमत के साथ आवागमन फ़िल्टर जोड़ सकता हूँ?',
'क्या commute filters को स्कूल और कीमत के साथ जोड़ सकता हूँ?',
'Yes. The commute filter can be layered with property price, size, schools, broadband, crime, amenities, and environmental signals.':
'हाँ। आवागमन फ़िल्टर को संपत्ति की कीमत, आकार, स्कूल, ब्रॉडबैंड, अपराध, सुविधाओं और पर्यावरण संकेतों के साथ जोड़ा जा सकता है।',
'हाँ. Commute filter को property price, size, स्कूल, ब्रॉडबैंड, crime, amenities और environmental signals के साथ layer किया जा सकता है.',
'Bristol property search guide': 'ब्रिस्टल संपत्ति खोज गाइड',
'A worked example for balancing city access, price, and local context.':
'शहर की पहुंच, कीमत और स्थानीय संदर्भ को संतुलित करने के लिए एक कारगर उदाहरण।',
'Search by commute time': 'आवागमन समय के आधार पर खोजें',
'Schools and property search': 'स्कूल और संपत्ति खोज',
'City access, price और local context को balance करने का worked example.',
'Search by commute time': 'Commute time से search करें',
'Schools and property search': 'Schools और प्रॉपर्टी खोज',
'Find property search areas with schools and family trade-offs in view':
'स्कूलों और परिवार से जुड़े समझौतों को ध्यान में रखकर संपत्ति खोज क्षेत्र खोजें',
'स्कूल और family trade-offs को सामने रखकर property search areas खोजें',
'School property search - Compare postcodes for family moves':
'स्कूल संपत्ति खोज - पारिवारिक स्थानांतरण के लिए पोस्टकोड की तुलना करें',
'School property search - family move के लिए पोस्टकोड compare करें',
'Compare nearby schools, property size, prices, parks, safety, commute and local amenities before building a viewing shortlist.':
'देखने के लिए शॉर्टलिस्ट बनाने से पहले आस-पास के स्कूलों, संपत्ति के आकार, कीमतों, पार्कों, सुरक्षा, आवागमन और स्थानीय सुविधाओं की तुलना करें।',
'Viewing shortlist बनाने से पहले nearby schools, property size, prices, parks, safety, commute और local amenities compare करें.',
'Compare nearby Ofsted ratings, education context, property size, budget, safety, parks, commute, and local amenities before narrowing your viewing shortlist.':
'मकान देखने की शॉर्टलिस्ट घटाने से पहले आस-पास की Ofsted रेटिंग, शिक्षा संदर्भ, संपत्ति का आकार, बजट, सुरक्षा, पार्क, आवागमन और स्थानीय सुविधाओं की तुलना करें।',
'Viewing shortlist narrow करने से पहले nearby Ofsted ratings, education context, property size, budget, safety, parks, commute और local amenities compare करें.',
'Filter for nearby school quality alongside housing requirements.':
'आवास आवश्यकताओं के साथ-साथ नजदीकी स्कूल की गुणवत्ता के लिए फ़िल्टर करें।',
'Housing requirements के साथ nearby school quality भी फ़िल्टर करें.',
'Compare family-friendly trade-offs across unfamiliar postcodes.':
'अनजान पोस्टकोडों में परिवार-अनुकूल समझौतों की तुलना करें।',
'अनजान postcodes में family-friendly trade-offs compare करें.',
'Use the map as a shortlist tool before checking admissions and catchments.':
'दाखिले और प्रवेश क्षेत्रों की जांच से पहले मानचित्र को शॉर्टलिस्ट बनाने के साधन की तरह इस्तेमाल करें।',
'Admissions और catchments check करने से पहले मैप को shortlist tool की तरह इस्तेमाल करें.',
'Use school context without ignoring the home':
'घर को नज़रअंदाज़ किए बिना स्कूल के संदर्भ का उपयोग करें',
'School context देखें, लेकिन घर को नजरअंदाज न करें',
'Start with property size, budget, and commute constraints, then layer in nearby school quality and local context. This prevents school-led searches from hiding affordability or daily-life problems.':
'संपत्ति के आकार, बजट और आवागमन की शर्तों से शुरुआत करें, फिर पास के स्कूलों की गुणवत्ता और स्थानीय संदर्भ जोड़ें। इससे स्कूल-आधारित खोजें सामर्थ्य या रोजमर्रा की दिक्कतों को छिपा नहीं पातीं।',
'Verify admissions before deciding': 'निर्णय लेने से पहले प्रवेश सत्यापित करें',
'Property size, budget और commute constraints से शुरू करें, फिर nearby school quality और local context जोड़ें. इससे school-led searches affordability या daily-life problems को छिपा नहीं पातीं.',
'Verify admissions before deciding': 'फैसले से पहले admissions verify करें',
'School data can point to promising areas, but admissions rules and catchments can change. Confirm current arrangements with schools and local authorities.':
'स्कूल डेटा अच्छे लगने वाले क्षेत्रों की ओर इशारा कर सकता है, लेकिन दाखिला नियम और प्रवेश क्षेत्र बदल सकते हैं। स्कूलों और स्थानीय अधिकारियों से मौजूदा व्यवस्था की पुष्टि करें।',
'School quality is one part of the shortlist': 'स्कूल की गुणवत्ता शॉर्टलिस्ट का एक हिस्सा है',
'School data promising areas दिखा सकता है, लेकिन admissions rules और catchments बदल सकते हैं. Schools और local authorities से current arrangements confirm करें.',
'School quality is one part of the shortlist': 'School quality shortlist का सिर्फ एक हिस्सा है',
'Perfect Postcode helps you compare nearby school data with the other practical constraints that shape a family move: space, price, commute, parks, safety, and local services.':
'Perfect Postcode आपको आस-पास के स्कूल डेटा की तुलना उन व्यावहारिक शर्तों से करने में मदद करता है जो परिवार के स्थानांतरण को प्रभावित करती हैं: जगह, कीमत, आवागमन, पार्क, सुरक्षा और स्थानीय सेवाएं।',
'Check catchments before making decisions': 'निर्णय लेने से पहले प्रवेश क्षेत्र जांचें',
'Perfect Postcode nearby school data को उन practical constraints के साथ compare करने में मदद करता है जो family move को shape करती हैं: space, price, commute, parks, safety और local services.',
'Check catchments before making decisions': 'फैसले से पहले catchments check करें',
'Admissions rules and catchment boundaries can change. Use postcode-level school data to find promising areas, then verify current admissions details with the school or local authority.':
'दाखिला नियम और प्रवेश क्षेत्र बदल सकते हैं। अच्छे लगने वाले क्षेत्र खोजने के लिए पोस्टकोड-स्तरीय स्कूल डेटा का उपयोग करें, फिर स्कूल या स्थानीय प्राधिकरण से मौजूदा दाखिला विवरण सत्यापित करें।',
'Admissions rules और catchment boundaries बदल सकते हैं. Promising areas खोजने के लिए postcode-level school data इस्तेमाल करें, फिर school या local authority से current admissions details verify करें.',
'How to treat school filters': 'स्कूल फ़िल्टर को कैसे समझें',
'Use school filters to narrow research, not to assume admission eligibility. Ratings, distance, admissions criteria, and school capacity should all be checked with current official sources.':
'शोध को सीमित करने के लिए स्कूल फ़िल्टर का उपयोग करें, प्रवेश पात्रता मानने के लिए नहीं। रेटिंग, दूरी, दाखिला मानदंड और स्कूल क्षमता सभी मौजूदा आधिकारिक स्रोतों से जांचें।',
'Family trade-offs to compare': 'तुलना करने लायक पारिवारिक समझौते',
'School filters research narrow करने के लिए इस्तेमाल करें, admission eligibility मानने के लिए नहीं. Ratings, distance, admissions criteria और school capacity current official sources से check करें.',
'Family trade-offs to compare': 'Compare करने लायक family trade-offs',
'Combine schools with parks, road noise, crime, property size, commute, broadband, and price so the shortlist reflects the whole move.':
'स्कूलों को पार्क, सड़क के शोर, अपराध, संपत्ति के आकार, आवागमन, ब्रॉडबैंड और कीमत के साथ मिलाएं ताकि शॉर्टलिस्ट पूरे स्थानांतरण को दिखाए।',
'Does this show school catchment guarantees?': 'क्या यह स्कूल कैचमेंट गारंटी दिखाता है?',
'Schools को parks, road noise, crime, property size, commute, broadband और price के साथ मिलाएं ताकि shortlist पूरा move दिखाए.',
'Does this show school catchment guarantees?': 'क्या यह school catchment guarantee दिखाता है?',
'No. It helps identify promising areas, but catchments and admissions must be verified with the school or local authority.':
'नहीं. यह अच्छे लगने वाले क्षेत्रों की पहचान में मदद करता है, लेकिन प्रवेश क्षेत्र और दाखिला स्कूल या स्थानीय प्राधिकरण से सत्यापित करने होंगे।',
'नहीं. यह promising areas पहचानने में मदद करता है, लेकिन catchments और admissions school या local authority से verify करने होंगे.',
'Can I combine school filters with parks and safety?':
'क्या मैं स्कूल फ़िल्टर को पार्क और सुरक्षा के साथ जोड़ सकता हूँ?',
'क्या school filters को parks और safety के साथ जोड़ सकता हूँ?',
'Yes. School-aware search can be combined with crime, parks, commute, price, property size, and local services.':
'हाँ। स्कूल-केंद्रित खोज को अपराध, पार्क, आवागमन, कीमत, संपत्ति के आकार और स्थानीय सेवाओं के साथ जोड़ा जा सकता है।',
'हाँ. School-aware search को crime, parks, commute, price, property size और local services के साथ जोड़ा जा सकता है.',
'Is Ofsted the only school signal?': 'क्या Ofsted ही स्कूल का एकमात्र संकेत है?',
'No single score should decide a move. Use the map as a starting point, then review current school information in detail.':
'घर बदलने का निर्णय किसी एक अंक से नहीं होना चाहिए। मानचित्र को शुरुआती बिंदु की तरह इस्तेमाल करें, फिर मौजूदा स्कूल जानकारी विस्तार से देखें।',
'Move का फैसला किसी एक score से नहीं होना चाहिए. मैप को starting point की तरह इस्तेमाल करें, फिर current school information detail में देखें.',
'See where education, property, transport, and environment data comes from.':
'देखें कि शिक्षा, संपत्ति, परिवहन और पर्यावरण डेटा कहाँ से आता है।',
'Explore school-aware searches': 'स्कूल-केंद्रित खोजें देखें',
'देखें education, property, transport और environment data कहां से आता है.',
'Explore school-aware searches': 'School-aware searches देखें',
'Check postcode data before you book a viewing':
'देखने की बुकिंग करने से पहले पोस्टकोड डेटा की जाँच करें',
'Viewing बुक करने से पहले postcode data check करें',
'Postcode checker - Property, crime, broadband, noise and schools':
'पोस्टकोड चेकर - संपत्ति, अपराध, ब्रॉडबैंड, शोर और स्कूल',
'Postcode checker - property, crime, broadband, noise और schools',
'Check postcode-level property prices, EPC data, crime, broadband, road noise, schools, council tax, amenities and travel-time context.':
'पोस्टकोड-स्तरीय संपत्ति कीमतें, EPC डेटा, अपराध, ब्रॉडबैंड, सड़क शोर, स्कूल, काउंसिल टैक्स, सुविधाएं और यात्रा-समय संदर्भ जांचें।',
'Postcode-level property prices, EPC data, crime, broadband, road noise, schools, council tax, amenities और travel-time context check करें.',
'Review property prices, EPC context, crime, broadband, road noise, local amenities, schools, deprivation, council tax, and travel-time data from one postcode-first map.':
'पोस्टकोड-केंद्रित मानचित्र से संपत्ति कीमतें, EPC संदर्भ, अपराध, ब्रॉडबैंड, सड़क शोर, स्थानीय सुविधाएं, स्कूल, वंचना, काउंसिल टैक्स और यात्रा-समय डेटा की समीक्षा करें।',
'Postcode-first मैप से property prices, EPC context, crime, broadband, road noise, local amenities, schools, deprivation, council tax और travel-time data review करें.',
'Check multiple local signals before visiting a street.':
'किसी सड़क पर जाने से पहले कई स्थानीय संकेत जांचें।',
'किसी street पर जाने से पहले कई local signals check करें.',
'Use official and open datasets rather than reputation alone.':
'केवल प्रतिष्ठा के बजाय आधिकारिक और खुले डेटासेट का उपयोग करें।',
'सिर्फ reputation के बजाय official और open datasets इस्तेमाल करें.',
'Compare postcodes consistently across England.':
'पूरे इंग्लैंड में लगातार पोस्टकोड की तुलना करें।',
'पूरे इंग्लैंड में postcodes की consistent comparison करें.',
'Check the street before spending a viewing slot':
'देखने का स्लॉट खर्च करने से पहले सड़क की जाँच करें',
'Viewing slot लगाने से पहले street check करें',
'Use the postcode checker to review price history, local context, amenities, schools, and environment signals before you commit time to visiting.':
'मकान देखने में समय लगाने से पहले कीमत इतिहास, स्थानीय संदर्भ, सुविधाएं, स्कूल और पर्यावरण संकेत देखने के लिए पोस्टकोड जांचक का उपयोग करें।',
'Compare neighbouring postcodes': 'पड़ोसी पोस्टकोड की तुलना करें',
'Viewing में समय लगाने से पहले price history, local context, amenities, schools और environment signals देखने के लिए postcode checker इस्तेमाल करें.',
'Compare neighbouring postcodes': 'Neighbouring postcodes compare करें',
'If one postcode looks promising, compare adjacent areas using the same filters. This often reveals whether a concern is street-specific or part of a wider pattern.':
'यदि एक पोस्टकोड आशाजनक लगता है, तो उसी फ़िल्टर का उपयोग करके आसन्न क्षेत्रों की तुलना करें। इससे अक्सर पता चलता है कि कोई चिंता सड़क-विशिष्ट है या व्यापक पैटर्न का हिस्सा है।',
'Useful before and alongside listing portals': 'लिस्टिंग पोर्टल से पहले और साथ में उपयोगी',
'अगर एक पोस्टकोड promising लगे, तो उन्हीं filters से पास के areas compare करें. इससे अक्सर पता चलता है कि concern सिर्फ एक street का है या wider pattern का.',
'Useful before and alongside listing portals': 'Listing portals से पहले और साथ में उपयोगी',
'Listing photos rarely tell you enough about the surrounding street. Perfect Postcode gives you an evidence-led postcode check before you commit time to a viewing.':
'लिस्टिंग फ़ोटो आसपास की सड़क के बारे में शायद ही पर्याप्त बताती हैं। मकान देखने का समय देने से पहले Perfect Postcode आपको प्रमाण-आधारित पोस्टकोड जांच देता है।',
'A screening tool, not professional advice': 'छांटने का साधन, पेशेवर सलाह नहीं',
'Listing photos आसपास की street के बारे में अक्सर काफी नहीं बतातीं. Viewing में समय देने से पहले Perfect Postcode evidence-led postcode check देता है.',
'A screening tool, not professional advice': 'Screening tool है, professional advice नहीं',
'The data is designed for shortlisting and comparison. Any purchase still needs current listing checks, legal due diligence, flood searches, lender requirements, and survey findings.':
'डेटा शॉर्टलिस्टिंग और तुलना के लिए बनाया गया है। किसी भी खरीद के लिए अब भी मौजूदा लिस्टिंग जांच, कानूनी जांच, बाढ़ खोज, ऋणदाता की शर्तें और सर्वेक्षण निष्कर्ष जरूरी हैं।',
'What a postcode check can catch': 'पोस्टकोड जांच क्या दिखा सकती है',
'डेटा shortlisting और comparison के लिए है. किसी भी purchase से पहले current listing checks, legal due diligence, flood searches, lender requirements और survey findings जरूरी हैं.',
'What a postcode check can catch': 'Postcode check क्या पकड़ सकता है',
'A postcode check can surface price context, environmental signals, nearby amenities, and other local indicators that are easy to miss in a listing.':
'पोस्टकोड जांच कीमत संदर्भ, पर्यावरणीय संकेत, आस-पास की सुविधाएं और ऐसे स्थानीय संकेतक सामने ला सकती है जो लिस्टिंग में आसानी से छूट जाते हैं।',
'What a postcode check cant prove': 'पोस्टकोड जांच क्या साबित नहीं कर सकती',
'Postcode check price context, environmental signals, nearby amenities और ऐसे local indicators दिखा सकता है जो listing में आसानी से छूट जाते हैं.',
'What a postcode check cant prove': 'Postcode check क्या prove नहीं कर सकता',
'It cant confirm the condition of a home, future development, legal title, lender requirements, or current street-level experience. Those still need direct checks.':
'यह घर की स्थिति, भविष्य के विकास, कानूनी स्वामित्व, ऋणदाता शर्तों या मौजूदा सड़क-स्तर अनुभव की पुष्टि नहीं कर सकती। इनके लिए अब भी सीधी जांच चाहिए।',
'यह घर की condition, future development, legal title, lender requirements या current street-level experience confirm नहीं कर सकता. इनके लिए direct checks चाहिए.',
'Can I use the checker before a viewing?':
'क्या मैं देखने से पहले चेकर का उपयोग कर सकता हूँ?',
'क्या viewing से पहले checker इस्तेमाल कर सकता हूँ?',
'Yes. Thats one of the main use cases: screen the postcode first, then decide whether the viewing is worth the time.':
'हाँ। यही इसका एक मुख्य उपयोग है: पहले पोस्टकोड जांचें, फिर तय करें कि मकान देखने जाना समय के लायक है या नहीं।',
'हाँ. यही इसका एक मुख्य use case है: पहले postcode check करें, फिर तय करें कि viewing समय के लायक है या नहीं.',
'Does the checker include exact property condition?':
'क्या चेकर में संपत्ति की सटीक स्थिति शामिल है?',
'क्या checker में exact property condition शामिल है?',
'No. Property condition requires listing details, surveys, and direct inspection.':
'नहीं, संपत्ति की स्थिति के लिए लिस्टिंग विवरण, सर्वेक्षण और प्रत्यक्ष निरीक्षण की आवश्यकता होती है।',
'Can I compare multiple postcodes?': 'क्या मैं अनेक पोस्टकोड की तुलना कर सकता हूँ?',
'नहीं. Property condition के लिए listing details, surveys और direct inspection चाहिए.',
'Can I compare multiple postcodes?': 'क्या मैं कई postcodes compare कर सकता हूँ?',
'Yes. The map is designed for consistent comparison across postcodes.':
'हाँ। मानचित्र पोस्टकोडों के बीच लगातार तुलना के लिए बनाया गया है।',
'Check postcodes on the map': 'मानचित्र पर पोस्टकोड जांचें',
'Regional guide': 'क्षेत्रीय मार्गदर्शक',
'हाँ. मैप postcodes के बीच consistent comparison के लिए बना है.',
'Check postcodes on the map': 'मैप पर postcodes check करें',
'Regional guide': 'क्षेत्रीय गाइड',
'How to compare Birmingham postcodes before a property search':
'संपत्ति खोज से पहले बर्मिंघम पोस्टकोड की तुलना कैसे करें',
'Property search से पहले Birmingham postcodes कैसे compare करें',
'Birmingham property search - Compare postcodes by price and commute':
'बर्मिंघम संपत्ति खोज - कीमत और आवागमन के आधार पर पोस्टकोड की तुलना करें',
'Birmingham property search - कीमत और commute से postcodes compare करें',
'Use postcode-level data to compare Birmingham property prices, commute trade-offs, schools, crime, broadband and local amenities before viewings.':
'मकान देखने से पहले बर्मिंघम की संपत्ति कीमतों, आवागमन से जुड़े समझौतों, स्कूलों, अपराध, ब्रॉडबैंड और स्थानीय सुविधाओं की तुलना के लिए पोस्टकोड-स्तरीय डेटा इस्तेमाल करें।',
'Viewings से पहले Birmingham property prices, commute trade-offs, schools, crime, broadband और local amenities compare करने के लिए postcode-level data इस्तेमाल करें.',
'Birmingham searches can change quickly from street to street. Use postcode-level evidence to compare budget, commute, schools, noise, crime, and local services before deciding where to watch listings.':
'बर्मिंघम में खोज एक सड़क से दूसरी सड़क पर तेजी से बदल सकती है। लिस्टिंग कहां देखनी है यह तय करने से पहले बजट, आवागमन, स्कूल, शोर, अपराध और स्थानीय सेवाओं की तुलना के लिए पोस्टकोड-स्तरीय प्रमाण इस्तेमाल करें।',
'Start with commute corridors': 'आवागमन गलियारों से शुरुआत करें',
'Birmingham में search street-to-street काफी बदल सकती है. Listings कहां watch करनी हैं यह तय करने से पहले budget, commute, schools, noise, crime और local services compare करने के लिए postcode-level evidence इस्तेमाल करें.',
'Start with commute corridors': 'Commute corridors से शुरुआत करें',
'Choose the destination that matters, such as a workplace, station, university, or hospital, then compare reachable postcodes by transport mode and travel-time band.':
'वह गंतव्य चुनें जो मायने रखता है, जैसे कार्यस्थल, स्टेशन, विश्वविद्यालय या अस्पताल, फिर यात्रा के तरीके और यात्रा-समय बैंड से पहुंच वाले पोस्टकोड की तुलना करें।',
'वह destination चुनें जो मायने रखता है, जैसे workplace, station, university या hospital, फिर transport mode और travel-time band से reachable postcodes compare करें.',
'Use commute time as a hard filter before judging price.':
'कीमत का आकलन करने से पहले आवागमन समय को अनिवार्य फ़िल्टर की तरह इस्तेमाल करें।',
'कीमत judge करने से पहले commute time को hard filter की तरह इस्तेमाल करें.',
'Compare public transport with car, cycling, or walking where available.':
'जहां उपलब्ध हो वहां सार्वजनिक परिवहन की तुलना कार, साइकिल या पैदल चलने से करें।',
'जहां available हो, public transport को car, cycling या walking से compare करें.',
'Check the route manually before booking viewings.':
'मकान देखने की बुकिंग से पहले मार्ग खुद जांचें।',
'Compare price with property type': 'संपत्ति के प्रकार के साथ कीमत की तुलना करें',
'Viewings book करने से पहले route खुद check करें.',
'Compare price with property type': 'Price को property type के साथ compare करें',
'Median prices alone can be misleading if the local property mix changes. Add property type, tenure, floor area, and price filters so similar areas are compared fairly.':
'अगर स्थानीय संपत्ति प्रकारों का मिश्रण बदलता है, तो सिर्फ मध्यिका कीमतें भटका सकती हैं। समान क्षेत्रों की निष्पक्ष तुलना के लिए संपत्ति का प्रकार, स्वामित्व प्रकार, फर्श क्षेत्रफल और कीमत फ़िल्टर जोड़ें।',
'अगर local property mix बदलता है, तो सिर्फ median prices misleading हो सकती हैं. Similar areas की fair comparison के लिए property type, tenure, floor area और price filters जोड़ें.',
'Keep family and environment trade-offs visible':
'परिवार और पर्यावरण से जुड़े समझौते साफ रखें',
'Family और environment trade-offs साफ रखें',
'Layer school context, parks, road noise, broadband, and crime signals on top of the property filters. That makes it easier to decide which compromises are acceptable.':
'संपत्ति फ़िल्टर के साथ स्कूल संदर्भ, पार्क, सड़क शोर, ब्रॉडबैंड और अपराध संकेत जोड़ें। इससे तय करना आसान होता है कि कौन से समझौते स्वीकार्य हैं।',
'Property filters के ऊपर school context, parks, road noise, broadband और crime signals layer करें. इससे तय करना आसान होता है कि कौन से compromises acceptable हैं.',
'Can Perfect Postcode tell me the best area in Birmingham?':
'क्या Perfect Postcode मुझे बर्मिंघम में सबसे अच्छा क्षेत्र बता सकता है?',
'क्या Perfect Postcode मुझे Birmingham का best area बता सकता है?',
'No tool can decide the best area for every buyer. It helps compare postcodes against your own constraints so you can build a better shortlist.':
'कोई भी साधन हर खरीदार के लिए सबसे अच्छा क्षेत्र तय नहीं कर सकता। यह आपकी अपनी शर्तों के आधार पर पोस्टकोड की तुलना करने में मदद करता है, ताकि आप बेहतर शॉर्टलिस्ट बना सकें।',
'कोई tool हर buyer के लिए best area तय नहीं कर सकता. यह आपकी अपनी constraints के against postcodes compare करने में मदद करता है, ताकि आप बेहतर shortlist बना सकें.',
'Should I use this instead of local knowledge?':
'क्या मुझे स्थानीय ज्ञान के स्थान पर इसका उपयोग करना चाहिए?',
'क्या इसे local knowledge की जगह इस्तेमाल करना चाहिए?',
'No. Use it to find and compare candidates, then validate them with visits, local advice, listings, and official checks.':
'नहीं. इसका उपयोग संभावित विकल्प खोजने और उनकी तुलना करने के लिए करें, फिर जाकर देखकर, स्थानीय सलाह, लिस्टिंग और आधिकारिक जांच से उनकी पुष्टि करें।',
'नहीं. इससे candidates खोजें और compare करें, फिर visits, local advice, listings और official checks से validate करें.',
'Compare price patterns before looking at live listings.':
'लाइव लिस्टिंग देखने से पहले मूल्य पैटर्न की तुलना करें।',
'Live listings देखने से पहले price patterns compare करें.',
'Search by travel time and then layer on property requirements.':
'यात्रा समय से खोजें और फिर संपत्ति की जरूरतें जोड़ें।',
'Travel time से search करें, फिर property requirements layer करें.',
'Understand how to interpret filters and limitations.':
'समझें कि फ़िल्टर और सीमाओं की व्याख्या कैसे करें।',
'समझें filters और limitations को कैसे interpret करना है.',
'Compare Birmingham postcodes': 'बर्मिंघम पोस्टकोड की तुलना करें',
'How to compare Manchester postcodes for a property search':
'संपत्ति खोज के लिए मैनचेस्टर पोस्टकोड की तुलना कैसे करें',
'Property search के लिए Manchester postcodes कैसे compare करें',
'Manchester property search - Compare postcodes before viewing':
'मैनचेस्टर संपत्ति खोज - देखने से पहले पोस्टकोड की तुलना करें',
'Manchester property search - viewing से पहले postcodes compare करें',
'Compare Manchester-area postcodes by budget, commute, property type, schools, broadband, crime, noise and amenities before booking viewings.':
'बुकिंग देखने से पहले बजट, आवागमन, संपत्ति के प्रकार, स्कूल, ब्रॉडबैंड, अपराध, शोर और सुविधाओं के आधार पर मैनचेस्टर-क्षेत्र के पोस्टकोड की तुलना करें।',
'Viewings book करने से पहले budget, commute, property type, schools, broadband, crime, noise और amenities से Manchester-area postcodes compare करें.',
'A Manchester-area search can span city-centre, suburban, and commuter options. Perfect Postcode helps keep each postcode comparable against the same property and daily-life constraints.':
'मैनचेस्टर क्षेत्र की खोज शहर-केंद्र, उपनगर और आवागमन-आधारित विकल्पों तक फैल सकती है। Perfect Postcode हर पोस्टकोड को समान संपत्ति और रोजमर्रा की शर्तों पर तुलनीय रखता है।',
'Manchester-area search city-centre, suburban और commuter options तक फैल सकती है. Perfect Postcode हर postcode को समान property और daily-life constraints पर comparable रखता है.',
'Use travel time to define the real search area':
'वास्तविक खोज क्षेत्र को परिभाषित करने के लिए यात्रा समय का उपयोग करें',
'Real search area define करने के लिए travel time इस्तेमाल करें',
'Start from the destinations that matter, then compare reachable postcodes rather than assuming every nearby place has the same practical journey.':
'जो गंतव्य मायने रखते हैं उनसे शुरू करें, फिर यह मानने के बजाय कि हर पास की जगह की यात्रा समान होगी, पहुंच वाले पोस्टकोड की तुलना करें।',
'जो destinations मायने रखते हैं उनसे शुरू करें, फिर यह assume करने के बजाय कि हर nearby place का journey समान होगा, reachable postcodes compare करें.',
'Compare housing requirements before lifestyle preferences':
'जीवनशैली प्राथमिकताओं से पहले आवास आवश्यकताओं की तुलना करें',
'Lifestyle preferences से पहले housing requirements compare करें',
'Filter by property type, floor area, tenure, and price before judging amenities. That keeps the shortlist grounded in homes that could realistically work.':
'सुविधाओं का आकलन करने से पहले संपत्ति के प्रकार, फर्श क्षेत्रफल, स्वामित्व प्रकार और कीमत से फ़िल्टर करें। इससे शॉर्टलिस्ट ऐसे घरों पर आधारित रहती है जो सच में काम आ सकते हैं।',
'Check local context consistently': 'स्थानीय संदर्भ की लगातार जाँच करें',
'Amenities judge करने से पहले property type, floor area, tenure और price से फ़िल्टर करें. इससे shortlist ऐसे घरों पर based रहती है जो सच में काम आ सकते हैं.',
'Check local context consistently': 'Local context consistently check करें',
'Use broadband, crime, road noise, parks, schools, and amenities as comparable signals. Then validate the strongest candidates with current local checks.':
'ब्रॉडबैंड, अपराध, सड़क शोर, पार्क, स्कूल और सुविधाओं को तुलनीय संकेतों की तरह इस्तेमाल करें। फिर सबसे मजबूत विकल्पों की मौजूदा स्थानीय जांच से पुष्टि करें।',
'Broadband, crime, road noise, parks, schools और amenities को comparable signals की तरह इस्तेमाल करें. फिर strongest candidates को current local checks से validate करें.',
'Can I compare Manchester suburbs with city-centre postcodes?':
'क्या मैं मैनचेस्टर उपनगरों की तुलना सिटी-सेंटर पोस्टकोड से कर सकता हूँ?',
'क्या मैं Manchester suburbs को city-centre postcodes से compare कर सकता हूँ?',
'Yes. Use the same budget, property, commute, and local-context filters across both so trade-offs remain visible.':
'हाँ। दोनों में वही बजट, संपत्ति, आवागमन और स्थानीय-संदर्भ फ़िल्टर लगाएं, ताकि समझौते साफ दिखते रहें।',
'Does this include live listings?': 'क्या इसमें मौजूदा लिस्टिंग शामिल हैं?',
'हाँ. दोनों में वही budget, property, commute और local-context filters लगाएं, ताकि trade-offs visible रहें.',
'Does this include live listings?': 'क्या इसमें live listings शामिल हैं?',
'No. Use it to decide where to search, then use listing portals for current homes for sale.':
'नहीं. इसका उपयोग यह तय करने के लिए करें कि कहां खोज करनी है, फिर अभी बिक्री पर मौजूद घरों के लिए लिस्टिंग पोर्टल देखें।',
'नहीं. इसे यह तय करने के लिए इस्तेमाल करें कि कहां search करनी है, फिर अभी बिक्री पर घरों के लिए listing portals देखें.',
'Move from a broad search brief to specific postcode candidates.':
'व्यापक खोज जरूरतों से विशिष्ट संभावित पोस्टकोड तक जाएं।',
'Broad search brief से specific postcode candidates तक जाएं.',
'Data sources': 'डेटा स्रोत',
'Review the datasets used for property and local-context comparison.':
'संपत्ति और स्थानीय-संदर्भ तुलना के लिए उपयोग किए गए डेटासेट की समीक्षा करें।',
'Property और local-context comparison में इस्तेमाल datasets review करें.',
'Check a single postcode before arranging a viewing.':
'मकान देखने की व्यवस्था करने से पहले एक पोस्टकोड जांचें।',
'Viewing arrange करने से पहले एक postcode check करें.',
'Compare Manchester postcodes': 'मैनचेस्टर पोस्टकोड की तुलना करें',
'How to compare Bristol postcodes before a property search':
'संपत्ति खोज से पहले ब्रिस्टल पोस्टकोड की तुलना कैसे करें',
'Property search से पहले Bristol postcodes कैसे compare करें',
'Bristol property search - Compare postcodes by commute and price':
'ब्रिस्टल संपत्ति खोज - आवागमन और कीमत से पोस्टकोड की तुलना करें',
'Bristol property search - commute और price से postcodes compare करें',
'Compare Bristol postcodes by price, commute, property size, schools, broadband, crime, road noise, parks and amenities before viewings.':
'मकान देखने से पहले कीमत, आवागमन, संपत्ति के आकार, स्कूल, ब्रॉडबैंड, अपराध, सड़क शोर, पार्क और सुविधाओं से ब्रिस्टल पोस्टकोड की तुलना करें।',
'Viewings से पहले price, commute, property size, schools, broadband, crime, road noise, parks और amenities से Bristol postcodes compare करें.',
'Bristol searches often involve sharp trade-offs between price, journey time, property size, and neighbourhood context. A postcode-first comparison keeps those trade-offs visible.':
'ब्रिस्टल में खोज करते समय कीमत, यात्रा समय, संपत्ति के आकार और पड़ोस के संदर्भ के बीच अक्सर कड़े समझौते करने पड़ते हैं। पोस्टकोड-केंद्रित तुलना इन समझौतों को सामने रखती है।',
'Make commute constraints explicit': 'आवागमन संबंधी बाधाओं को स्पष्ट करें',
'Bristol searches में price, journey time, property size और neighbourhood context के बीच अक्सर sharp trade-offs होते हैं. Postcode-first comparison इन्हें visible रखती है.',
'Make commute constraints explicit': 'Commute constraints साफ करें',
'If access to the centre, a station, hospital, university, or business park matters, use travel-time filters first and then compare the remaining postcodes by property data.':
'अगर केंद्र, स्टेशन, अस्पताल, विश्वविद्यालय या बिजनेस पार्क तक पहुंच मायने रखती है, तो पहले यात्रा-समय फ़िल्टर लगाएं और फिर बचे पोस्टकोड की संपत्ति डेटा से तुलना करें।',
'अगर centre, station, hospital, university या business park तक access मायने रखती है, तो पहले travel-time filters लगाएं और फिर बचे postcodes को property data से compare करें.',
'Compare value, not just headline price':
'सिर्फ दिखती कीमत नहीं, वास्तविक मूल्य की तुलना करें',
'सिर्फ headline price नहीं, value compare करें',
'Use price, property type, and floor-area filters together. This helps distinguish lower-cost areas from areas that simply contain smaller or different homes.':
'कीमत, संपत्ति प्रकार और फर्श क्षेत्रफल फ़िल्टर साथ इस्तेमाल करें। इससे सचमुच कम लागत वाले क्षेत्रों को उन क्षेत्रों से अलग करना आसान होता है जहां बस छोटे या अलग तरह के घर हैं।',
'Price, property type और floor-area filters साथ इस्तेमाल करें. इससे सच में lower-cost areas को उन areas से अलग करना आसान होता है जहां बस छोटे या अलग homes हैं.',
'Screen environmental and local-service signals':
'पर्यावरण और स्थानीय सेवाओं के संकेत छांटें',
'Environment और local-service signals screen करें',
'Road noise, parks, broadband, crime, and amenities can affect whether a property works day to day. Use them as screening criteria before booking viewings.':
'सड़क शोर, पार्क, ब्रॉडबैंड, अपराध और सुविधाएं तय कर सकती हैं कि कोई संपत्ति रोजमर्रा की जिंदगी में ठीक बैठेगी या नहीं। मकान देखने की बुकिंग से पहले इन्हें छांटने की शर्तों की तरह इस्तेमाल करें।',
'Road noise, parks, broadband, crime और amenities तय कर सकते हैं कि कोई property रोजमर्रा की जिंदगी में काम आएगी या नहीं. Viewings book करने से पहले इन्हें screening criteria की तरह इस्तेमाल करें.',
'Can I use this for commuter villages around Bristol?':
'क्या मैं इसका उपयोग ब्रिस्टल के आसपास आने-जाने वाले गांवों के लिए कर सकता हूं?',
'क्या मैं इसे Bristol के आसपास commuter villages के लिए इस्तेमाल कर सकता हूँ?',
'Yes, where the relevant postcode and travel-time data is available. Always verify routes and services manually before deciding.':
'हाँ, जहां संबंधित पोस्टकोड और यात्रा-समय डेटा उपलब्ध है। निर्णय लेने से पहले मार्गों और सेवाओं की खुद पुष्टि करें।',
'हाँ, जहां relevant postcode और travel-time data available है. फैसला लेने से पहले routes और services खुद verify करें.',
'Can this tell me whether a listing is good value?':
'क्या यह बता सकता है कि कोई लिस्टिंग अच्छा सौदा है या नहीं?',
'क्या यह बता सकता है कि कोई listing good value है या नहीं?',
'It can provide area context, but a specific listing still needs comparable sales, condition checks, survey findings, and professional advice where appropriate.':
'यह क्षेत्र का संदर्भ दे सकता है, लेकिन किसी खास लिस्टिंग के लिए अब भी तुलनीय बिक्री, स्थिति जांच, सर्वेक्षण निष्कर्ष और जहां जरूरी हो पेशेवर सलाह चाहिए।',
'यह area context दे सकता है, लेकिन किसी specific listing के लिए अब भी comparable sales, condition checks, survey findings और जहां जरूरी हो professional advice चाहिए.',
'Search by reachable postcodes before refining by budget and local context.':
'बजट और स्थानीय संदर्भ से और सीमित करने से पहले पहुंच वाले पोस्टकोड से खोजें।',
'Budget और local context से refine करने से पहले reachable postcodes से search करें.',
'Understand price patterns before setting listing alerts.':
'लिस्टिंग अलर्ट सेट करने से पहले कीमत पैटर्न समझें।',
'Privacy and security': 'गोपनीयता और सुरक्षा',
'Listing alerts सेट करने से पहले price patterns समझें.',
'Privacy and security': 'Privacy और security',
'How account and saved-search data is handled in the product.':
'उत्पाद में खाता और सहेजी गई खोजों का डेटा कैसे संभाला जाता है।',
'Product में account और saved-search data कैसे handle होता है.',
'Compare Bristol postcodes': 'ब्रिस्टल पोस्टकोड की तुलना करें',
'Trust and coverage': 'भरोसा और कवरेज',
'Perfect Postcode data sources and coverage': 'Perfect Postcode डेटा स्रोत और कवरेज',
'Trust and coverage': 'Trust और coverage',
'Perfect Postcode data sources and coverage': 'Perfect Postcode data sources और coverage',
'Perfect Postcode data sources - Property, schools, commute and local context':
'Perfect Postcode डेटा स्रोत - संपत्ति, स्कूल, आवागमन और स्थानीय संदर्भ',
'Perfect Postcode data sources - property, schools, commute और local context',
'Review the public and official datasets used by Perfect Postcode, including property prices, EPC, schools, crime, broadband, noise and travel-time context.':
'संपत्ति कीमतों, EPC, स्कूल, अपराध, ब्रॉडबैंड, शोर और यात्रा-समय संदर्भ सहित Perfect Postcode में उपयोग किए गए सार्वजनिक और आधिकारिक डेटासेट की समीक्षा करें।',
'Property prices, EPC, schools, crime, broadband, noise और travel-time context सहित Perfect Postcode में इस्तेमाल public और official datasets review करें.',
'Perfect Postcode combines property, transport, education, environment, and local-service datasets so buyers can compare postcodes consistently. This page explains what the data is for and where it should be verified.':
'Perfect Postcode संपत्ति, परिवहन, शिक्षा, पर्यावरण और स्थानीय-सेवा डेटासेट जोड़ता है, ताकि खरीदार पोस्टकोडों की लगातार तुलना कर सकें। यह पेज बताता है कि डेटा किस काम के लिए है और इसकी पुष्टि कहां करनी चाहिए।',
'Property and housing context': 'संपत्ति और आवास संदर्भ',
'Perfect Postcode property, transport, education, environment और local-service datasets जोड़ता है, ताकि buyers postcodes को consistently compare कर सकें. यह page बताता है कि data किस काम आता है और कहां verify करना चाहिए.',
'Property and housing context': 'Property और housing context',
'The product uses property transaction and housing-context datasets to support filters such as sale price, property type, tenure, floor area, energy performance, and estimated current value.':
'उत्पाद बिक्री कीमत, संपत्ति प्रकार, स्वामित्व प्रकार, फर्श क्षेत्रफल, ऊर्जा प्रदर्शन और अनुमानित मौजूदा कीमत जैसे फ़िल्टरों के लिए संपत्ति लेनदेन और आवास-संदर्भ डेटासेट इस्तेमाल करता है।',
'Product sale price, property type, tenure, floor area, energy performance और estimated current value जैसे filters के लिए property transaction और housing-context datasets इस्तेमाल करता है.',
'Use these fields to compare areas, not as a formal valuation.':
'इन फ़ील्ड का उपयोग क्षेत्रों की तुलना के लिए करें, औपचारिक मूल्यांकन की तरह नहीं।',
'इन fields को areas compare करने के लिए इस्तेमाल करें, formal valuation की तरह नहीं.',
'Check current listings, title information, lender requirements, and survey results before buying.':
'खरीदने से पहले मौजूदा लिस्टिंग, स्वामित्व रिकॉर्ड, ऋणदाता की शर्तें और सर्वेक्षण परिणाम जांचें।',
'खरीदने से पहले current listings, title information, lender requirements और survey results check करें.',
'Schools, safety, broadband, and environment': 'स्कूल, सुरक्षा, ब्रॉडबैंड और पर्यावरण',
'Local-context filters help compare postcodes on signals that affect daily life. They should be treated as screening data and checked against current official sources for decisions.':
'स्थानीय-संदर्भ फ़िल्टर रोजमर्रा की जिंदगी को प्रभावित करने वाले संकेतों पर पोस्टकोड की तुलना में मदद करते हैं। इन्हें छांटने वाला डेटा मानें और निर्णयों के लिए मौजूदा आधिकारिक स्रोतों से जांचें।',
@ -1091,6 +1091,10 @@ const hi: Translations = {
dsTowOrigin: 'Forest Research / Defra NCEA',
dsTowUse:
'इंग्लैंड में अकेले पेड़ों, पेड़ों के समूहों और छोटे वन क्षेत्रों के वृक्ष आच्छादन बहुभुज. यहां पोस्टकोड केंद्रों के आसपास वृक्ष आच्छादन प्रतिशतक का अनुमान लगाने के लिए उपयोग किया गया है.',
dsNfiName: 'राष्ट्रीय वन सूची वनभूमि',
dsNfiOrigin: 'Forest Research',
dsNfiUse:
'इंग्लैंड में कम से कम 0.5 हेक्टेयर के वन क्षेत्र, जिन्हें वन क्षेत्र से बाहर पेड़ों का नक्शा जानबूझकर बाहर रखता है. TOW वृक्ष आच्छादन के साथ संयोजित, ताकि वृक्ष आच्छादन मीट्रिक और मानचित्र ओवरले में वास्तविक वन भी शामिल हों.',
dsConservationAreasName: 'Planning Data संरक्षण क्षेत्र',
dsConservationAreasOrigin: 'Planning Data / स्थानीय योजना प्राधिकरण',
dsConservationAreasUse:
@ -1406,8 +1410,6 @@ const hi: Translations = {
'Health Deprivation and Disability Score': 'स्वास्थ्य वंचना और विकलांगता स्कोर',
'Housing Conditions Score': 'आवास स्थिति स्कोर',
'Air Quality and Road Safety Score': 'हवा की गुणवत्ता और सड़क सुरक्षा स्कोर',
'Serious crime per 1k residents (avg/yr)': 'प्रति 1,000 निवासियों गंभीर अपराध (औसत/वर्ष)',
'Minor crime per 1k residents (avg/yr)': 'प्रति 1,000 निवासियों मामूली अपराध (औसत/वर्ष)',
'Serious crime (avg/yr)': 'गंभीर अपराध (औसत/वर्ष)',
'Minor crime (avg/yr)': 'मामूली अपराध (औसत/वर्ष)',
'Violence and sexual offences (avg/yr)': 'हिंसा और यौन अपराध (औसत/वर्ष)',

View file

@ -16,10 +16,10 @@ const hu: Translations = {
copied: 'Másolva!',
copiedToClipboard: 'Vágólapra másolva',
loading: 'Betöltés...',
loadMore: 'Továbbiak betöltése',
remaining: 'még {{count}} hátra',
loadMore: 'Továbbiak',
remaining: 'Még {{count}}',
search: 'Keresés',
all: 'Mind',
all: 'Összes',
none: 'Egyik sem',
viewDataSource: 'Adatforrás megtekintése',
total: 'Összesen',
@ -38,9 +38,9 @@ const hu: Translations = {
propertiesPlural: 'ingatlanok',
bedsCount: '{{count}} hálószoba',
bedsCount_other: '{{count}} hálószoba',
bathsCount: '{{count}} fürdő',
bathsCount_other: '{{count}} fürdő',
places: 'helyek',
bathsCount: '{{count}} fürdőszoba',
bathsCount_other: '{{count}} fürdőszoba',
places: 'hely',
noData: 'Nincs adat',
allLow: 'Mind alacsony',
connectingToServer: 'Kapcsolódás a szerverhez...',
@ -52,11 +52,11 @@ const hu: Translations = {
// ── Header / Nav ───────────────────────────────────
header: {
appName: 'Perfect Postcode',
dashboard: 'Vezérlőpult',
dashboard: 'Térkép',
learn: 'Tudnivalók',
pricing: 'Árak',
inviteFriends: 'Barátok meghívása',
saved: 'Mentett',
saved: 'Mentések',
logIn: 'Bejelentkezés',
createAccount: 'Regisztráció',
sharing: 'Megosztás...',
@ -75,12 +75,12 @@ const hu: Translations = {
// ── Export Menu ────────────────────────────────────
export: {
title: 'Exportálás',
modeFilters: 'Szűrőknek megfelelő irányítószámok',
modeFilters: 'A szűrőknek megfelelő irányítószámok',
modeFiltersHint:
'Exportáld a térképen látható minden olyan irányítószámot, amely megfelel a jelenlegi szűrőknek.',
'Exportáld a térképen látható összes irányítószámot, amely megfelel a jelenlegi szűrőknek.',
modeList: 'Irányítószám-lista',
modeListHint:
'Add hozzá az irányítószámokat egyenként a szóközöket és a kis- és nagybetűket automatikusan javítjuk.',
'Add meg az irányítószámokat egyenként a szóközöket és a kis- és nagybetűket automatikusan javítjuk.',
listLabel: 'Irányítószámok',
listPlaceholder: 'pl. SW1A 1AA',
addRow: 'Irányítószám hozzáadása',
@ -109,31 +109,31 @@ const hu: Translations = {
seo: {
breadcrumb: 'Morzsanavigáció',
reviewDataSources: 'Adatforrások áttekintése',
whatYouCanCompare: 'Mit tudsz összehasonlítani',
whatYouCanCompare: 'Mit hasonlíthatsz össze',
whatYouCanCompareDesc:
'Minden oldal valódi előszűrési munkára épül: a lehetetlen helyek kizárására, a megmaradó irányítószámok összevetésére és a következő ellenőrzés eldöntésére.',
'Minden oldal valódi előválogatási munkára épül: a kizárt helyek kiszűrésére, a megmaradó irányítószámok összevetésére és a következő ellenőrzés kiválasztására.',
howToUseIt: 'Használat',
howToUseItDesc:
'Ezekkel a munkafolyamatokkal az oldal már azelőtt hasznos, hogy hirdetési portált nyitnál vagy megtekintést foglalnál.',
methodAndLimitations: 'Módszer és korlátok',
methodAndLimitationsDesc:
'Az adatok összehasonlításra és előszűrésre szolgálnak. Fontos döntésekhez továbbra is aktuális hirdetések, szakmai ellenőrzések és közvetlen helyi ellenőrzés szükséges.',
questionsBuyersAsk: 'Vevői kérdések',
'Az adatok összehasonlításra és előválogatásra valók. Fontos döntésekhez továbbra is aktuális hirdetések, szakmai ellenőrzések és közvetlen helyi utánajárás kell.',
questionsBuyersAsk: 'A vevők gyakori kérdései',
relatedGuides: 'Kapcsolódó útmutatók',
relatedGuidesDesc:
'Folytasd az indexelt nyilvános oldalakon, kanonikus belső hivatkozásokon keresztül.',
'Folytasd az indexelt nyilvános oldalakon, hivatalos belső hivatkozásokon keresztül.',
frequentlyAskedQuestions: 'Gyakori kérdések',
relatedPages: 'Kapcsolódó oldalak',
relatedPagesDesc:
'Ezekkel a belső linkekkel ugyanazt az ingatlankeresési folyamatot más nézőpontból nézheted meg.',
'Ezekkel a belső linkekkel ugyanazt az ingatlankeresési folyamatot más nézőpontból is megnézheted.',
pages: {
'Property price map': 'Ingatlanártérkép',
'Compare property prices across every postcode in England':
'Hasonlítsa össze az ingatlanárakat az összes angliai irányítószám között',
'Hasonlítsd össze az ingatlanárakat Anglia összes irányítószámánál',
'Property price map for England - Compare postcodes before viewing':
'Angliai ingatlanártérkép - Irányítószámok összehasonlítása megtekintés előtt',
'Compare sold prices, estimated current value, price per square metre and local context across English postcodes before searching listings.':
'Hasonlítsa össze az eladási árakat, a becsült aktuális értéket, a négyzetméterárat és a helyi környezetet az angliai irányítószámok között, mielőtt hirdetéseket keresne.',
'Hasonlítsd össze az eladási árakat, a becsült jelenlegi értéket, a négyzetméterárat és a helyi környezetet az angliai irányítószámoknál, mielőtt hirdetéseket néznél.',
'Perfect Postcode maps sold prices, estimated current value, price per square metre, property type, floor area, tenure, and local context so buyers can find realistic search areas before opening listing portals.':
'A Perfect Postcode megmutatja az eladási árakat, a becsült jelenlegi értéket, a négyzetméterárat, az ingatlantípust, az alapterületet, a tulajdonformát és a helyi környezetet, így a vásárlók reális keresési területeket találhatnak, mielőtt hirdetési portálokat nyitnának meg.',
'Screen historical sale prices and current-value estimates by postcode.':
@ -141,37 +141,37 @@ const hu: Translations = {
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
'Vesse össze az ár-értéket az ingázással, az iskolákkal, a szélessávval, a bűnözéssel, a zajjal és a szolgáltatásokkal.',
'Build a shortlist before spending weekends on viewings.':
'Állítson össze szűkített listát, mielőtt a hétvégéit megtekintésekre szánná.',
'Állíts össze szűkített listát, mielőtt hétvégéket szánnál megtekintésekre.',
'Find postcodes that fit the budget before listings appear':
'Még a hirdetések megjelenése előtt találja meg a költségvetésnek megfelelő irányítószámokat',
'Találd meg a költségvetésedhez illő irányítószámokat még a hirdetések előtt',
'Start with a maximum price and property type, then colour the map by price per square metre or estimated current price. This helps reveal areas where similar homes have historically traded within reach, even when there are no live listings today.':
'Kezdje a maximális árral és az ingatlantípussal, majd színezze a térképet négyzetméterár vagy becsült aktuális ár alapján. Ez segít feltárni azokat a területeket, ahol korábban elérhető áron keltek el hasonló otthonok, még akkor is, ha ma nincsenek élő hirdetések.',
'Kezdd a maximális árral és az ingatlantípussal, majd színezd a térképet négyzetméterár vagy becsült jelenlegi ár szerint. Így láthatod, hol keltek el korábban hasonló otthonok elérhető áron, akkor is, ha ma nincs aktív hirdetés.',
'Filter by last known sale price, estimated current value, property type, tenure, and floor area.':
'Szűrés az utolsó ismert eladási ár, a becsült jelenlegi érték, az ingatlan típusa, tulajdonformája és alapterülete alapján.',
'Compare nearby postcodes using the same criteria instead of relying on area reputation.':
'Hasonlítsa össze a közeli irányítószámokat ugyanazokkal a feltételekkel ahelyett, hogy a környék hírére hagyatkozna.',
'Hasonlítsd össze a közeli irányítószámokat ugyanazokkal a feltételekkel, ne csak a környék hírnevére hagyatkozz.',
'Use the results as a shortlist for listing alerts, local research, and viewings.':
'Az eredményeket szűkített listaként használja hirdetési értesítésekhez, helyi kutatáshoz és megtekintésekhez.',
'Separate cheap from good value': 'Válassza szét az olcsót a jó ár-értéktől',
'Használd az eredményeket szűkített listaként hirdetési értesítésekhez, helyi utánajáráshoz és megtekintésekhez.',
'Separate cheap from good value': 'Válaszd szét az olcsót a valóban jó értéktől',
'A lower price can reflect smaller homes, weaker transport, more noise, or fewer local services. The map keeps those trade-offs visible so the cheapest postcode isnt automatically treated as the best option.':
'Az alacsonyabb ár kisebb otthonokat, gyengébb közlekedést, nagyobb zajt vagy kevesebb helyi szolgáltatást tükrözhet. A térkép láthatóvá teszi ezeket a kompromisszumokat, így a legolcsóbb irányítószám nem számít automatikusan a legjobb választásnak.',
'Az alacsonyabb ár mögött kisebb otthonok, gyengébb közlekedés, több zaj vagy kevesebb helyi szolgáltatás is állhat. A térkép láthatóvá teszi ezeket a kompromisszumokat, így a legolcsóbb irányítószám nem lesz automatikusan a legjobb választás.',
'Start from area value, not listing availability':
'A terület értékéből induljon ki, ne a hirdetéskínálatból',
'A környék értékéből indulj ki, ne az aktuális hirdetésekből',
'Listing portals only show homes for sale today. A postcode-level property price map lets you compare wider areas, understand local price patterns, and avoid missing places where the next suitable listing might appear.':
'A hirdetési portálok csak a ma eladó otthonokat mutatják. Az irányítószám-szintű ingatlanártérkép segítségével szélesebb területeket hasonlíthat össze, megértheti a helyi ármintákat, és nem marad le olyan helyekről, ahol később megfelelő hirdetés jelenhet meg.',
'Use prices alongside real constraints': 'Használja az árakat valós korlátok mellett',
'A hirdetési portálok csak a ma eladó otthonokat mutatják. Az irányítószám-szintű ingatlanártérkép szélesebb területek összehasonlításában segít, megmutatja a helyi ármintákat, és segít nem lemaradni azokról a helyekről, ahol később jó hirdetés jelenhet meg.',
'Use prices alongside real constraints': 'Az árakat a valós feltételekkel együtt nézd',
'Budget rarely matters on its own. Perfect Postcode combines price filters with travel time, school quality, property size, energy performance, local environment, and services so your shortlist reflects how you actually want to live.':
'A költségvetés ritkán számít önmagában. A Perfect Postcode az árszűrőket utazási idővel, iskolaminőséggel, ingatlanmérettel, energiahatékonysággal, helyi környezettel és szolgáltatásokkal kombinálja, így a szűkített lista azt tükrözi, ahogyan valóban élni szeretne.',
'A költségvetés ritkán elég önmagában. A Perfect Postcode az árszűrőket utazási idővel, iskolaminőséggel, ingatlanmérettel, energiahatékonysággal, helyi környezettel és szolgáltatásokkal kombinálja, így a szűkített lista azt tükrözi, ahogyan tényleg élni szeretnél.',
'What the price data is for': 'Mire szolgálnak az áradatok',
'Use the map to compare areas and spot search candidates. It isnt a valuation, mortgage decision, survey, legal search, or live listing feed.':
'Használja a térképet területek összehasonlítására és keresési jelöltek megtalálására. Ez nem értékbecslés, jelzáloghitel-döntés, műszaki felmérés, jogi keresés vagy élő hirdetésforrás.',
'How to validate a promising area': 'Hogyan ellenőrizzen egy ígéretes területet',
'A térkép területek összehasonlítására és ígéretes keresési célpontok megtalálására való. Nem értékbecslés, jelzáloghitel-döntés, survey, jogi átvilágítás vagy élő hirdetésforrás.',
'How to validate a promising area': 'Hogyan ellenőrizz egy ígéretes környéket',
'Once a postcode looks promising, check current listings, sold-price comparables, agent details, flood searches, legal packs, surveys, and local authority information before making a decision.':
'Ha egy irányítószám ígéretesnek tűnik, döntés előtt ellenőrizze az aktuális hirdetéseket, az összehasonlítható eladási árakat, az ingatlanközvetítői adatokat, az árvízkockázati kereséseket, a jogi dokumentumokat, a műszaki felméréseket és a helyi hatósági információkat.',
'Ha egy irányítószám ígéretesnek tűnik, döntés előtt nézd meg az aktuális hirdetéseket, az összehasonlítható eladási árakat, az ingatlanközvetítői adatokat, az árvízkockázati kereséseket, a jogi dokumentumokat, a survey eredményeit és a helyi önkormányzati információkat.',
'Is this a replacement for Rightmove or Zoopla?':
'Ez helyettesíti a Rightmove-ot vagy a Zoopla-t?',
'No. Use it before and alongside listing portals. Perfect Postcode helps decide where to look; listing portals show whats currently for sale.':
'Nem. Használja a hirdetési portálok előtt és mellett. A Perfect Postcode segít eldönteni, hol keressen; a hirdetési portálok megmutatják, mi van jelenleg eladó.',
'Nem. Használd a hirdetési portálok előtt és mellett. A Perfect Postcode abban segít, hol érdemes keresni; a hirdetési portálok azt mutatják meg, mi van éppen eladó.',
'Can I compare price with schools or commute time?':
'Összehasonlíthatom az árat az iskolákkal vagy az ingázási idővel?',
'Yes. Price filters can be combined with travel-time, schools, crime, broadband, road-noise, amenities, and environment filters.':
@ -184,50 +184,50 @@ const hu: Translations = {
'Kidolgozott példa az ár, az ingázás és a családi kompromisszumok egyensúlyozására.',
'Data sources and coverage': 'Adatforrások és lefedettség',
'See which datasets sit behind the postcode filters and where they have limits.':
'Tekintse meg, mely adatkészletek állnak az irányítószám-szűrők mögött, és hol vannak a korlátaik.',
'Nézd meg, mely adatkészletek állnak az irányítószám-szűrők mögött, és hol vannak a korlátaik.',
Methodology: 'Módszertan',
'Understand how the map is intended to support shortlisting, not replace due diligence.':
'Ismerje meg, hogyan támogatja a térkép az előválogatást anélkül, hogy helyettesítené az alapos ellenőrzést.',
'Ismerd meg, hogyan segíti a térkép az előválogatást anélkül, hogy helyettesítené az alapos ellenőrzést.',
'Postcode checker': 'Irányítószám-ellenőrző',
'Check one postcode before you spend time on a viewing.':
'Ellenőrizzen egy irányítószámot, mielőtt időt szánna egy megtekintésre.',
'Explore the property map': 'Fedezze fel az ingatlantérképet',
'Ellenőrizz egy irányítószámot, mielőtt időt szánnál egy megtekintésre.',
'Explore the property map': 'Fedezd fel az ingatlantérképet',
'Postcode property search': 'Irányítószám-alapú ingatlankeresés',
'Find postcodes that match your property search criteria':
'Keressen az ingatlankeresési feltételeinek megfelelő irányítószámokat',
'Keress az ingatlankeresési feltételeidnek megfelelő irányítószámokat',
'Postcode property search - Find areas that match your criteria':
'Irányítószám-alapú ingatlankeresés Találja meg a feltételeinek megfelelő területeket',
'Irányítószám-alapú ingatlankeresés Találd meg a feltételeidnek megfelelő területeket',
'Search every postcode by budget, property type, floor area, tenure, commute, schools, crime, broadband, noise, parks and local amenities.':
'Keressen az összes irányítószám között költségvetés, ingatlantípus, alapterület, tulajdonforma, ingázás, iskolák, bűnözés, szélessáv, zaj, parkok és helyi szolgáltatások alapján.',
'Keress az összes irányítószám között költségvetés, ingatlantípus, alapterület, tulajdonforma, ingázás, iskolák, bűnözés, szélessáv, zaj, parkok és helyi szolgáltatások alapján.',
'Search every postcode by budget, property type, size, tenure, commute, schools, crime, broadband, noise, parks, and local amenities instead of checking areas one at a time.':
'Keressen az összes irányítószám között költségvetés, ingatlantípus, méret, tulajdonforma, ingázás, iskolák, bűnözés, szélessáv, zaj, parkok és helyi szolgáltatások szerint, ahelyett, hogy egyenként ellenőrizné a területeket.',
'Keress az összes irányítószám között költségvetés, ingatlantípus, méret, tulajdonforma, ingázás, iskolák, bűnözés, szélessáv, zaj, parkok és helyi szolgáltatások szerint, ahelyett, hogy egyenként ellenőriznéd a területeket.',
'Filter England-wide postcode data from one map.':
'Szűrje az Anglia-szerte elérhető irányítószámadatokat egyetlen térképen.',
'Szűrd Anglia irányítószámadatait egyetlen térképen.',
'Shortlist unfamiliar areas with comparable evidence.':
'Válogasson elő ismeretlen területeket összehasonlítható adatok alapján.',
'Válogass elő ismeretlen területeket összehasonlítható adatok alapján.',
'Save and share search areas before booking viewings.':
'Mentse és ossza meg a keresési területeket a megtekintések lefoglalása előtt.',
'Mentsd és oszd meg a keresési területeket, mielőtt megtekintéseket foglalnál.',
'Turn a broad brief into postcode candidates':
'Alakítsa a tág keresési igényt irányítószám-jelöltekké',
'Alakítsd a tág keresési igényt konkrét irányítószám-jelöltekké',
'Enter the practical constraints first: budget, property size, tenure, travel time, school needs, broadband, and tolerance for road noise or crime levels. The map removes places that fail those constraints and keeps the remaining options comparable.':
'Először adja meg a gyakorlati feltételeket: költségvetés, ingatlanméret, tulajdonforma, utazási idő, iskolai igények, szélessáv, valamint a közúti zajjal vagy bűnözési szinttel kapcsolatos tűréshatár. A térkép kizárja azokat a helyeket, amelyek nem felelnek meg ezeknek a feltételeknek, és összehasonlíthatóan tartja a fennmaradó lehetőségeket.',
'Relax one constraint at a time': 'Egyszerre egy feltételt lazítson',
'Először add meg a gyakorlati feltételeket: költségvetés, ingatlanméret, tulajdonforma, utazási idő, iskolai igények, szélessáv, valamint a közúti zajjal vagy bűnözéssel kapcsolatos tűréshatárod. A térkép kizárja a nem megfelelő helyeket, és összehasonlíthatóan tartja a fennmaradó lehetőségeket.',
'Relax one constraint at a time': 'Egyszerre egy feltételen lazíts',
'When the search becomes too narrow, loosen a single filter and watch which postcodes reappear. This makes compromise explicit instead of relying on guesswork.':
'Ha a keresés túl szűk lesz, lazítson egyetlen szűrőn, és figyelje, mely irányítószámok jelennek meg újra. Ez találgatás helyett egyértelművé teszi a kompromisszumot.',
'Ha a keresés túl szűk lesz, lazíts egyetlen szűrőn, és figyeld, mely irányítószámok jelennek meg újra. Így a kompromisszum nem találgatás lesz.',
'Turn vague areas into specific postcodes':
'Alakítsa a homályos területeket konkrét irányítószámokká',
'Alakítsd a homályos területeket konkrét irányítószámokká',
'Broad town or borough searches hide large differences between streets. Perfect Postcode helps you move from a general area to postcodes that satisfy your hard requirements.':
'A tág városi vagy kerületi keresések nagy utcáról utcára változó különbségeket rejtenek el. A Perfect Postcode segít az általános területtől eljutni azokig az irányítószámokig, amelyek megfelelnek a szigorú feltételeinek.',
'Keep trade-offs visible': 'Tartsa láthatóvá a kompromisszumokat',
'A tág városi vagy kerületi keresések elrejtik az utcáról utcára változó különbségeket. A Perfect Postcode segít az általános területtől eljutni azokig az irányítószámokig, amelyek megfelelnek a kötelező feltételeidnek.',
'Keep trade-offs visible': 'Tartsd láthatóan a kompromisszumokat',
'When there are too many or too few matches, adjust one constraint at a time and see exactly which postcodes reappear. That makes compromises explicit instead of relying on guesswork.':
'Ha túl sok vagy túl kevés a találat, egyszerre egy feltételt módosítson, és nézze meg pontosan, mely irányítószámok jelennek meg újra. Ez találgatás helyett egyértelművé teszi a kompromisszumokat.',
'Ha túl sok vagy túl kevés a találat, egyszerre egy feltételt módosíts, és nézd meg pontosan, mely irányítószámok jelennek meg újra. Így a kompromisszumok láthatóvá válnak, nem csak találgatások.',
'Why postcode-level comparison matters':
'Miért számít az irányítószám-szintű összehasonlítás?',
'Two nearby postcodes can differ on schools, road noise, transport access, property mix, and price. Comparing at postcode level reduces the chance of treating a whole town as one uniform market.':
'Két közeli irányítószám is eltérhet iskolák, közúti zaj, közlekedési hozzáférés, ingatlanösszetétel és ár alapján. Az irányítószám-szintű összehasonlítás csökkenti annak esélyét, hogy egy egész várost egységes piacként kezeljen.',
'How to use the results': 'Hogyan használjuk fel az eredményeket',
'Treat matching postcodes as a research queue: check live listings, visit streets, confirm schools and admissions, and review current official sources.':
'Kezelje az egyező irányítószámokat kutatási sorként: ellenőrizze az élő hirdetéseket, látogassa meg az utcákat, erősítse meg az iskolai és felvételi adatokat, és tekintse át az aktuális hivatalos forrásokat.',
'Kezeld a találó irányítószámokat kutatási listaként: nézd meg az élő hirdetéseket, járd be az utcákat, ellenőrizd az iskolai és felvételi adatokat, és nézd át az aktuális hivatalos forrásokat.',
'Can I save a postcode property search?': 'Elmenthetem az irányítószámú ingatlankeresést?',
'Yes. Licensed users can save searches and return to them later. Saved searches are designed for shortlists and comparison notes.':
'Igen. A licenccel rendelkező felhasználók elmenthetik a kereséseket, és később visszatérhetnek hozzájuk. A mentett keresések szűkített listákhoz és összehasonlító jegyzetekhez készültek.',
@ -236,44 +236,44 @@ const hu: Translations = {
'Igen. A térképet úgy terveztük, hogy a gyakorlati feltételeknek megfelelő, ismeretlen területeket is felszínre hozza, ne csak a már ismert helyeket.',
'Are the results live property listings?': 'Az eredmények élő ingatlanhirdetések?',
'No. The tool compares postcode data and historical/contextual property signals. You still need listing portals for current availability.':
'Nem. Az eszköz irányítószám-adatokat és történeti, illetve környezeti ingatlanjelzéseket hasonlít össze. Az aktuális kínálathoz továbbra is hirdetési portálokra van szüksége.',
'Nem. Az eszköz irányítószám-adatokat és történeti, illetve helyi ingatlanjelzéseket hasonlít össze. Az aktuális kínálathoz továbbra is hirdetési portálokra van szükséged.',
'Manchester property search guide': 'Manchester ingatlankeresési útmutató',
'A regional guide for narrowing a broad search around Greater Manchester.':
'Regionális útmutató a Nagy-Manchester környéki keresés szűkítéséhez.',
'Start a postcode search': 'Irányítószám-keresés indítása',
'Commute property search': 'Ingázás alapú ingatlankeresés',
'Search for places to live by commute time': 'Keressen lakóhelyeket ingázási idő alapján',
'Search for places to live by commute time': 'Keress lakóhelyet ingázási idő alapján',
'Commute property search - Find places to live by travel time':
'Ingázás alapú ingatlankeresés Lakóhelykeresés utazási idő alapján',
'Filter postcodes by commute time, then compare price, schools, safety, broadband, road noise, parks and property data on one map.':
'Szűrje az irányítószámokat ingázási idő szerint, majd hasonlítsa össze az árakat, az iskolákat, a biztonságot, a szélessávot, az útzajt, a parkokat és az ingatlanadatokat egy térképen.',
'Szűrd az irányítószámokat ingázási idő szerint, majd hasonlítsd össze az árakat, az iskolákat, a biztonságot, a szélessávot, az útzajt, a parkokat és az ingatlanadatokat egy térképen.',
'Filter postcodes by modelled car, cycling, walking, and public transport travel times, then layer on property price, schools, crime, broadband, noise, and local amenities.':
'Szűrje az irányítószámokat modellezett autós, kerékpáros, gyalogos és tömegközlekedési utazási idők alapján, majd egészítse ki ingatlanárral, iskolákkal, bűnözéssel, szélessávval, zajjal és helyi szolgáltatásokkal.',
'Szűrd az irányítószámokat modellezett autós, kerékpáros, gyalogos és tömegközlekedési menetidők alapján, majd tedd mellé az ingatlanárat, az iskolákat, a bűnözést, a szélessávot, a zajt és a helyi szolgáltatásokat.',
'Compare reachable postcodes by realistic travel-time bands.':
'Hasonlítsa össze az elérhető irányítószámokat valós utazási idősávok szerint.',
'Hasonlítsd össze az elérhető irányítószámokat reális utazási idősávok szerint.',
'Search by destination first, then filter for property and neighbourhood fit.':
'Először úti cél szerint keressen, majd szűrjön ingatlan- és környékilleszkedésre.',
'Először úti cél szerint keress, majd szűrj ingatlanra és környékilleszkedésre.',
'Avoid areas that look close on a map but fail the daily journey.':
'Kerülje azokat a területeket, amelyek a térképen közelinek tűnnek, de a napi utazásban nem működnek.',
'Start with the destination that matters': 'Kezdje a céllal, ami számít',
'Kerüld azokat a területeket, amelyek a térképen közelinek tűnnek, de a mindennapi úton nem működnek.',
'Start with the destination that matters': 'Kezdd a fontos célponttal',
'Choose a commute destination, transport mode, and time range, then add the property filters. This prevents a cheap-looking area from reaching the shortlist if the daily journey doesnt work.':
'Válasszon ingázási célt, közlekedési módot és időtartományt, majd adja hozzá az ingatlanszűrőket. Így egy olcsónak tűnő terület nem kerül be a szűkített listába, ha a napi utazás nem működik.',
'Válassz ingázási célt, közlekedési módot és időtartományt, majd add hozzá az ingatlanszűrőket. Így egy olcsónak tűnő terület nem kerül be a szűkített listába, ha a napi út nem működik.',
'Compare the commute against the rest of daily life':
'Hasonlítsa össze az ingázást a mindennapi élet többi részével',
'Az ingázást a mindennapi élet többi részével együtt nézd',
'A fast commute isnt enough if the property size, school context, safety threshold, broadband, or road-noise exposure dont fit. The map keeps those signals side by side.':
'A gyors ingázás nem elég, ha az ingatlan mérete, az iskolai környezet, a biztonsági küszöb, a szélessáv vagy a közúti zajnak való kitettség nem megfelelő. A térkép egymás mellett tartja ezeket a jelzéseket.',
'A gyors ingázás nem elég, ha az ingatlan mérete, az iskolai környezet, a biztonsági szint, a szélessáv vagy a közúti zaj nem passzol. A térkép egymás mellett mutatja ezeket a jeleket.',
'Commute from postcodes, not just place names':
'Ingázás irányítószámokból, nem csak helynevekből',
'Two streets in the same town can have very different station access, road routes, and public transport options. Postcode-level travel-time filtering keeps that difference visible.':
'Ugyanabban a városban két utcának nagyon eltérő lehet az állomáselérése, közúti útvonala és tömegközlekedési kínálata. Az irányítószám-szintű utazásiidő-szűrés láthatóvá teszi ezt a különbséget.',
'Ugyanabban a városban két utcáról teljesen más lehet az állomás elérése, az autós útvonal vagy a tömegközlekedés. Az irányítószám-szintű menetidő-szűrés láthatóvá teszi ezt a különbséget.',
'Balance journey time with the rest of the move':
'Hangolja össze az utazási időt a költözés többi részével',
'Hangold össze az utazási időt a költözés többi részével',
'A fast commute only helps if the area also fits your budget, housing needs, school preferences, safety threshold, broadband requirement, and tolerance for road noise.':
'A gyors ingázás csak akkor segít, ha a terület belefér a költségvetésbe, megfelel a lakhatási igényeknek, az iskolai preferenciáknak, a biztonsági küszöbnek, a szélessávú elvárásnak és az útzajjal kapcsolatos tűréshatárnak.',
'A gyors ingázás csak akkor segít, ha a terület belefér a költségvetésbe, megfelel a lakhatási igényeknek, az iskolai preferenciáknak, a biztonsági elvárásnak, a szélessávigénynek és az útzajjal kapcsolatos tűréshatárnak.',
'How travel-time filters should be interpreted':
'Hogyan kell értelmezni az utazási időszűrőket',
'Travel-time modelling is useful for comparing areas consistently. Before committing, check current timetables, disruption patterns, parking, cycling conditions, and walking routes.':
'Az utazási idő modellezése hasznos a területek következetes összehasonlításához. Elköteleződés előtt ellenőrizze az aktuális menetrendeket, a fennakadási mintákat, a parkolást, a kerékpáros körülményeket és a gyalogos útvonalakat.',
'Az utazási idő modellezése hasznos a területek következetes összehasonlításához. Döntés előtt ellenőrizd az aktuális menetrendeket, a jellemző fennakadásokat, a parkolást, a kerékpáros körülményeket és a gyalogos útvonalakat.',
'Why commute filters are combined with property data':
'Miért kombináljuk az ingázási szűrőket ingatlanadatokkal?',
'Commute search is most useful when it removes impossible areas while still showing whether the remaining options are affordable and liveable.':
@ -284,7 +284,7 @@ const hu: Translations = {
'A termék többféle közlekedési módot támogat ott, ahol előre kiszámított céladatok állnak rendelkezésre.',
'Are travel times exact?': 'Pontosak az utazási idők?',
'No. Treat them as a consistent comparison model, then verify the real route before making viewing or purchase decisions.':
'Nem. Kezelje őket következetes összehasonlítási modellként, majd ellenőrizze a valódi útvonalat, mielőtt megtekintési vagy vásárlási döntést hozna.',
'Nem. Kezeld őket következetes összehasonlítási modellként, majd ellenőrizd a valódi útvonalat, mielőtt megtekintési vagy vásárlási döntést hoznál.',
'Can I combine commute filters with schools and price?':
'Kombinálhatom az ingázási szűrőket az iskolákkal és az árakkal?',
'Yes. The commute filter can be layered with property price, size, schools, broadband, crime, amenities, and environmental signals.':
@ -295,39 +295,39 @@ const hu: Translations = {
'Search by commute time': 'Keresés ingázási idő szerint',
'Schools and property search': 'Iskolák és ingatlankeresés',
'Find property search areas with schools and family trade-offs in view':
'Keressen olyan ingatlankeresési területeket, ahol az iskolák és a családi kompromisszumok is látszanak',
'Keress olyan területeket, ahol az iskolák és a családi kompromisszumok is látszanak',
'School property search - Compare postcodes for family moves':
'Iskolák és ingatlankeresés Irányítószámok összehasonlítása családi költözéshez',
'Compare nearby schools, property size, prices, parks, safety, commute and local amenities before building a viewing shortlist.':
'Hasonlítsa össze a közeli iskolákat, az ingatlanméretet, az árakat, a parkokat, a biztonságot, az ingázást és a helyi szolgáltatásokat, mielőtt megtekintési listát állít össze.',
'Hasonlítsd össze a közeli iskolákat, az ingatlanméretet, az árakat, a parkokat, a biztonságot, az ingázást és a helyi szolgáltatásokat, mielőtt megtekintési listát állítasz össze.',
'Compare nearby Ofsted ratings, education context, property size, budget, safety, parks, commute, and local amenities before narrowing your viewing shortlist.':
'Hasonlítsa össze a közeli Ofsted-minősítéseket, az oktatási környezetet, az ingatlanméretet, a költségvetést, a biztonságot, a parkokat, az ingázást és a helyi szolgáltatásokat, mielőtt szűkítené a megtekintési listát.',
'Hasonlítsd össze a közeli Ofsted-minősítéseket, az oktatási környezetet, az ingatlanméretet, a költségvetést, a biztonságot, a parkokat, az ingázást és a helyi szolgáltatásokat, mielőtt szűkítenéd a megtekintési listát.',
'Filter for nearby school quality alongside housing requirements.':
'Szűrjön közeli iskolaminőségre a lakhatási követelmények mellett.',
'Szűrj közeli iskolaminőségre a lakhatási igények mellett.',
'Compare family-friendly trade-offs across unfamiliar postcodes.':
'Hasonlítsa össze a családbarát kompromisszumokat az ismeretlen irányítószámok között.',
'Hasonlítsd össze a családbarát kompromisszumokat az ismeretlen irányítószámok között.',
'Use the map as a shortlist tool before checking admissions and catchments.':
'Használja a térképet előválogatási eszközként, mielőtt ellenőrizné a felvételi szabályokat és az iskolai körzeteket.',
'Használd a térképet előválogatáshoz, mielőtt ellenőriznéd a felvételi szabályokat és az iskolai körzeteket.',
'Use school context without ignoring the home':
'Használja az iskolai környezetet anélkül, hogy figyelmen kívül hagyná az otthont',
'Az iskolai környezetet az otthonnal együtt nézd',
'Start with property size, budget, and commute constraints, then layer in nearby school quality and local context. This prevents school-led searches from hiding affordability or daily-life problems.':
'Kezdje az ingatlanmérettel, a költségvetéssel és az ingázási feltételekkel, majd adja hozzá a közeli iskolák minőségét és a helyi környezetet. Így az iskola alapján indított keresések nem rejtik el a megfizethetőségi vagy mindennapi életet érintő problémákat.',
'Verify admissions before deciding': 'Döntés előtt ellenőrizze a felvételi szabályokat',
'Kezdd az ingatlanmérettel, a költségvetéssel és az ingázási feltételekkel, majd add hozzá a közeli iskolák minőségét és a helyi környezetet. Így az iskola alapján indított keresés nem rejti el a megfizethetőségi vagy mindennapi életet érintő problémákat.',
'Verify admissions before deciding': 'Döntés előtt ellenőrizd a felvételi szabályokat',
'School data can point to promising areas, but admissions rules and catchments can change. Confirm current arrangements with schools and local authorities.':
'Az iskolai adatok ígéretes területekre utalhatnak, de a felvételi szabályok és az iskolai körzetek változhatnak. Erősítse meg az aktuális szabályokat az iskolákkal és a helyi hatóságokkal.',
'School quality is one part of the shortlist':
'Az iskolaminőség csak a szűkített lista egyik része',
'Perfect Postcode helps you compare nearby school data with the other practical constraints that shape a family move: space, price, commute, parks, safety, and local services.':
'A Perfect Postcode segítségével a közeli iskolai adatokat összevetheti a családi költözést meghatározó többi gyakorlati feltétellel: lakótér, ár, ingázás, parkok, biztonság és helyi szolgáltatások.',
'Check catchments before making decisions': 'Döntés előtt ellenőrizze az iskolai körzeteket',
'Check catchments before making decisions': 'Döntés előtt ellenőrizd az iskolai körzeteket',
'Admissions rules and catchment boundaries can change. Use postcode-level school data to find promising areas, then verify current admissions details with the school or local authority.':
'A felvételi szabályok és az iskolai körzethatárok változhatnak. Használja az irányítószám-szintű iskolai adatokat az ígéretes területek megtalálásához, majd ellenőrizze az aktuális felvételi részleteket az iskolával vagy a helyi hatósággal.',
'A felvételi szabályok és az iskolai körzethatárok változhatnak. Használd az irányítószám-szintű iskolai adatokat az ígéretes területek megtalálásához, majd ellenőrizd az aktuális felvételi részleteket az iskolával vagy a helyi önkormányzattal.',
'How to treat school filters': 'Hogyan kezeljük az iskolai szűrőket',
'Use school filters to narrow research, not to assume admission eligibility. Ratings, distance, admissions criteria, and school capacity should all be checked with current official sources.':
'Használja az iskolai szűrőket a kutatás szűkítésére, ne a felvételi jogosultság feltételezésére. A minősítéseket, a távolságot, a felvételi feltételeket és az iskolai kapacitást mind aktuális hivatalos forrásokból kell ellenőrizni.',
'Az iskolai szűrők a keresés szűkítésére valók, nem a felvételi jogosultság bizonyítására. A minősítést, távolságot, felvételi feltételeket és kapacitást mindig aktuális hivatalos forrásból ellenőrizd.',
'Family trade-offs to compare': 'Összehasonlítandó családi kompromisszumok',
'Combine schools with parks, road noise, crime, property size, commute, broadband, and price so the shortlist reflects the whole move.':
'Kombinálja az iskolákat parkokkal, közúti zajjal, bűnözéssel, ingatlanmérettel, ingázással, szélessávval és árral, hogy a szűkített lista a teljes költözést tükrözze.',
'Kombináld az iskolákat parkokkal, közúti zajjal, bűnözéssel, ingatlanmérettel, ingázással, szélessávval és árral, hogy a szűkített lista a teljes költözést tükrözze.',
'Does this show school catchment guarantees?':
'Ez garantálja az iskolai körzethez tartozást?',
'No. It helps identify promising areas, but catchments and admissions must be verified with the school or local authority.':
@ -338,44 +338,44 @@ const hu: Translations = {
'Igen. Az iskolai szempontú keresés kombinálható bűnözéssel, parkokkal, ingázással, árral, ingatlanmérettel és helyi szolgáltatásokkal.',
'Is Ofsted the only school signal?': 'Az Ofsted az egyetlen iskolai mutató?',
'No single score should decide a move. Use the map as a starting point, then review current school information in detail.':
'Egyetlen pontszám sem dönthet egy költözésről. Használja a térképet kiindulási pontként, majd tekintse át részletesen az aktuális iskolai információkat.',
'Egyetlen pontszám sem dönthet egy költözésről. Használd a térképet kiindulópontként, majd nézd át részletesen az aktuális iskolai információkat.',
'See where education, property, transport, and environment data comes from.':
'Tekintse meg, honnan származnak az oktatási, ingatlan-, közlekedési és környezeti adatok.',
'Nézd meg, honnan származnak az oktatási, ingatlan-, közlekedési és környezeti adatok.',
'Explore school-aware searches': 'Fedezze fel az iskolai szempontú kereséseket',
'Check postcode data before you book a viewing':
'A megtekintés lefoglalása előtt ellenőrizze az irányítószám adatait',
'Postcode checker - Property, crime, broadband, noise and schools':
'Irányítószám-ellenőrző Ingatlanok, bűnözés, szélessáv, zaj és iskolák',
'Check postcode-level property prices, EPC data, crime, broadband, road noise, schools, council tax, amenities and travel-time context.':
'Ellenőrizze az irányítószám-szintű ingatlanárakat, az EPC-adatokat, a bűnözést, a szélessávot, az útzajt, az iskolákat, az önkormányzati adót, a szolgáltatásokat és az utazási idő környezetét.',
'Ellenőrizd az irányítószám-szintű ingatlanárakat, az EPC-adatokat, a bűnözést, a szélessávot, az útzajt, az iskolákat, a council tax szintjét, a szolgáltatásokat és az utazási időt.',
'Review property prices, EPC context, crime, broadband, road noise, local amenities, schools, deprivation, council tax, and travel-time data from one postcode-first map.':
'Tekintse át az ingatlanárakat, az EPC-adatokat, a bűnözést, a szélessávot, a közúti zajt, a helyi szolgáltatásokat, az iskolákat, a deprivációt, az önkormányzati adót és az utazásiidő-adatokat egyetlen, irányítószám-központú térképen.',
'Nézd át az ingatlanárakat, az EPC-adatokat, a bűnözést, a szélessávot, a közúti zajt, a helyi szolgáltatásokat, az iskolákat, a hátrányos helyzetet, a council tax szintjét és az utazásiidő-adatokat egyetlen, irányítószám-központú térképen.',
'Check multiple local signals before visiting a street.':
'Ellenőrizzen több helyi mutatót, mielőtt felkeres egy utcát.',
'Ellenőrizz több helyi mutatót, mielőtt elmész egy utcába.',
'Use official and open datasets rather than reputation alone.':
'Használjon hivatalos és nyílt adatkészleteket, ne csak a hírnevet.',
'Compare postcodes consistently across England.':
'Hasonlítsa össze következetesen az irányítószámokat Angliában.',
'Hasonlítsd össze következetesen az angliai irányítószámokat.',
'Check the street before spending a viewing slot':
'Ellenőrizze az utcát, mielőtt megtekintési időpontot szánna rá',
'Ellenőrizd az utcát, mielőtt megtekintési időpontot szánnál rá',
'Use the postcode checker to review price history, local context, amenities, schools, and environment signals before you commit time to visiting.':
'Használja az irányítószám-ellenőrzőt az árelőzmények, a helyi környezet, a szolgáltatások, az iskolák és a környezeti jelzések áttekintésére, mielőtt időt szánna a látogatásra.',
'Compare neighbouring postcodes': 'Hasonlítsa össze a szomszédos irányítószámokat',
'Használd az irányítószám-ellenőrzőt az árelőzmények, a helyi környezet, a szolgáltatások, az iskolák és a környezeti jelzések áttekintésére, mielőtt időt szánnál a látogatásra.',
'Compare neighbouring postcodes': 'Hasonlítsd össze a szomszédos irányítószámokat',
'If one postcode looks promising, compare adjacent areas using the same filters. This often reveals whether a concern is street-specific or part of a wider pattern.':
'Ha egy irányítószám ígéretesnek tűnik, hasonlítsa össze a szomszédos területeket ugyanazokkal a szűrőkkel. Ez gyakran felfedi, hogy a probléma utcaspecifikus vagy egy szélesebb minta része.',
'Ha egy irányítószám ígéretesnek tűnik, hasonlítsd össze a szomszédos területeket ugyanazokkal a szűrőkkel. Ez gyakran megmutatja, hogy az aggály csak az adott utcára jellemző-e, vagy egy tágabb mintázat része.',
'Useful before and alongside listing portals':
'Hasznos a hirdetési portálok előtt és mellett',
'Listing photos rarely tell you enough about the surrounding street. Perfect Postcode gives you an evidence-led postcode check before you commit time to a viewing.':
'A hirdetési fotók ritkán árulnak el eleget a környező utcáról. A Perfect Postcode adatokon alapuló irányítószám-ellenőrzést ad, mielőtt időt szánna a megtekintésre.',
'A hirdetési fotók ritkán árulnak el eleget a környező utcáról. A Perfect Postcode adatokon alapuló irányítószám-ellenőrzést ad, mielőtt időt szánnál a megtekintésre.',
'A screening tool, not professional advice': 'Szűrőeszköz, nem szakmai tanács',
'The data is designed for shortlisting and comparison. Any purchase still needs current listing checks, legal due diligence, flood searches, lender requirements, and survey findings.':
'Az adatok előválogatásra és összehasonlításra készültek. Minden vásárláshoz továbbra is szükség van az aktuális hirdetések ellenőrzésére, jogi átvilágításra, árvízkockázati keresésekre, hitelezői követelményekre és műszaki felmérési eredményekre.',
'Az adatok előválogatásra és összehasonlításra valók. Vásárlás előtt továbbra is ellenőrizni kell az aktuális hirdetéseket, a jogi átvilágítást, az árvízkockázati kereséseket, a hitelezői követelményeket és a survey eredményeit.',
'What a postcode check can catch': 'Amit egy irányítószám-ellenőrzés feltárhat',
'A postcode check can surface price context, environmental signals, nearby amenities, and other local indicators that are easy to miss in a listing.':
'Az irányítószám-ellenőrzés feltárhat árkörnyezetet, környezeti jelzéseket, közeli szolgáltatásokat és más helyi mutatókat, amelyek felett egy hirdetésben könnyű elsiklani.',
'What a postcode check cant prove': 'Amit az irányítószám-ellenőrzés nem tud bizonyítani',
'It cant confirm the condition of a home, future development, legal title, lender requirements, or current street-level experience. Those still need direct checks.':
'Nem tudja megerősíteni az otthon állapotát, a jövőbeli fejlesztéseket, a jogcímet, a hitelezői követelményeket vagy az aktuális utcai tapasztalatot. Ezekhez továbbra is közvetlen ellenőrzés kell.',
'Nem tudja igazolni az otthon állapotát, a jövőbeli fejlesztéseket, a tulajdoni jogcímet, a hitelezői követelményeket vagy az aktuális utcai élményt. Ezekhez továbbra is közvetlen ellenőrzés kell.',
'Can I use the checker before a viewing?': 'Használhatom az ellenőrzőt megtekintés előtt?',
'Yes. Thats one of the main use cases: screen the postcode first, then decide whether the viewing is worth the time.':
'Igen. Ez az egyik fő felhasználási eset: először szűrje meg az irányítószámot, majd döntse el, megéri-e a megtekintés az időt.',
@ -386,186 +386,186 @@ const hu: Translations = {
'Can I compare multiple postcodes?': 'Összehasonlíthatok több irányítószámot?',
'Yes. The map is designed for consistent comparison across postcodes.':
'Igen. A térképet az irányítószámok következetes összehasonlítására tervezték.',
'Check postcodes on the map': 'Ellenőrizze az irányítószámokat a térképen',
'Check postcodes on the map': 'Ellenőrizd az irányítószámokat a térképen',
'Regional guide': 'Regionális útmutató',
'How to compare Birmingham postcodes before a property search':
'Birmingham irányítószámainak összehasonlítása ingatlankeresés előtt',
'Birmingham property search - Compare postcodes by price and commute':
'Birminghami ingatlankeresés Hasonlítsa össze az irányítószámokat ár és ingázás alapján',
'Birminghami ingatlankeresés Hasonlítsd össze az irányítószámokat ár és ingázás alapján',
'Use postcode-level data to compare Birmingham property prices, commute trade-offs, schools, crime, broadband and local amenities before viewings.':
'Használja az irányítószám-szintű adatokat a birminghami ingatlanárak, ingázási kompromisszumok, iskolák, bűnözés, szélessáv és helyi szolgáltatások összehasonlítására a megtekintések előtt.',
'Használd az irányítószám-szintű adatokat a birminghami ingatlanárak, ingázási kompromisszumok, iskolák, bűnözés, szélessáv és helyi szolgáltatások összehasonlítására a megtekintések előtt.',
'Birmingham searches can change quickly from street to street. Use postcode-level evidence to compare budget, commute, schools, noise, crime, and local services before deciding where to watch listings.':
'A birminghami keresés utcáról utcára gyorsan változhat. Használjon irányítószám-szintű adatokat a költségvetés, az ingázás, az iskolák, a zaj, a bűnözés és a helyi szolgáltatások összehasonlítására, mielőtt eldönti, hol figyelje a hirdetéseket.',
'Start with commute corridors': 'Kezdje az ingázási folyosókkal',
'Start with commute corridors': 'Kezdd az ingázási útvonalakkal',
'Choose the destination that matters, such as a workplace, station, university, or hospital, then compare reachable postcodes by transport mode and travel-time band.':
'Válassza ki a fontos úti célt, például munkahelyet, állomást, egyetemet vagy kórházat, majd hasonlítsa össze az elérhető irányítószámokat közlekedési mód és utazási idősáv szerint.',
'Válaszd ki a fontos úti célt, például munkahelyet, állomást, egyetemet vagy kórházat, majd hasonlítsd össze az elérhető irányítószámokat közlekedési mód és utazási idősáv szerint.',
'Use commute time as a hard filter before judging price.':
'Használja az ingázási időt szigorú szűrőként, mielőtt az árat mérlegelné.',
'Használd az ingázási időt kemény szűrőként, mielőtt az árat mérlegelnéd.',
'Compare public transport with car, cycling, or walking where available.':
'Hasonlítsa össze a tömegközlekedést autóval, kerékpárral vagy gyaloglással, ahol lehetséges.',
'Hasonlítsd össze a tömegközlekedést autóval, kerékpárral vagy gyaloglással, ahol van adat.',
'Check the route manually before booking viewings.':
'A megtekintések lefoglalása előtt ellenőrizze az útvonalat manuálisan.',
'Compare price with property type': 'Hasonlítsa össze az árat az ingatlan típusával',
'Compare price with property type': 'Az árat az ingatlantípussal együtt nézd',
'Median prices alone can be misleading if the local property mix changes. Add property type, tenure, floor area, and price filters so similar areas are compared fairly.':
'A medián árak önmagukban félrevezetők lehetnek, ha a helyi ingatlanösszetétel eltér. Adjon hozzá ingatlantípust, tulajdonformát, alapterületet és árszűrőket, hogy hasonló területeket igazságosan hasonlítson össze.',
'A medián ár önmagában félrevezető lehet, ha eltér a helyi ingatlanösszetétel. Adj hozzá ingatlantípust, tulajdonformát, alapterületet és árszűrőket, hogy hasonló területeket hasonlíts össze.',
'Keep family and environment trade-offs visible':
'Tartsa láthatóvá a családi és környezeti kompromisszumokat',
'Layer school context, parks, road noise, broadband, and crime signals on top of the property filters. That makes it easier to decide which compromises are acceptable.':
'Az ingatlanszűrők mellé tegye hozzá az iskolai környezetet, a parkokat, az útzajt, a szélessávot és a bűnözési jelzéseket. Így könnyebb eldönteni, mely kompromisszumok elfogadhatók.',
'Az ingatlanszűrők mellé tedd hozzá az iskolai környezetet, a parkokat, az útzajt, a szélessávot és a bűnözési jeleket. Így könnyebb eldönteni, mely kompromisszumok férnek bele.',
'Can Perfect Postcode tell me the best area in Birmingham?':
'Meg tudja mondani a Perfect Postcode, melyik Birmingham legjobb környéke?',
'No tool can decide the best area for every buyer. It helps compare postcodes against your own constraints so you can build a better shortlist.':
'Egyetlen eszköz sem tudja eldönteni, melyik a legjobb terület minden vásárló számára. Ez az irányítószámokat a saját feltételeihez képest hasonlítja össze, hogy jobb szűkített listát készíthessen.',
'Egyetlen eszköz sem tudja eldönteni, melyik a legjobb terület minden vevőnek. Ez az irányítószámokat a saját feltételeidhez képest hasonlítja össze, hogy jobb szűkített listát készíthess.',
'Should I use this instead of local knowledge?': 'Ezt használjam a helyismeret helyett?',
'No. Use it to find and compare candidates, then validate them with visits, local advice, listings, and official checks.':
'Nem. Használja jelöltek keresésére és összehasonlítására, majd ellenőrizze őket látogatásokkal, helyi tanácsokkal, hirdetésekkel és hivatalos ellenőrzésekkel.',
'Nem. Használd jelöltek keresésére és összehasonlítására, majd ellenőrizd őket személyes látogatással, helyi tanáccsal, hirdetésekkel és hivatalos forrásokkal.',
'Compare price patterns before looking at live listings.':
'Hasonlítsa össze az ármintákat, mielőtt élő hirdetéseket nézne.',
'Hasonlítsd össze az ármintákat, mielőtt élő hirdetéseket néznél.',
'Search by travel time and then layer on property requirements.':
'Keressen utazási idő szerint, majd adja hozzá az ingatlanigényeket.',
'Keress utazási idő szerint, majd add hozzá az ingatlanigényeket.',
'Understand how to interpret filters and limitations.':
'Ismerje meg a szűrők és korlátozások értelmezését.',
'Compare Birmingham postcodes': 'Hasonlítsa össze a birminghami irányítószámokat',
'Ismerd meg a szűrők és korlátozások értelmezését.',
'Compare Birmingham postcodes': 'Hasonlítsd össze a birminghami irányítószámokat',
'How to compare Manchester postcodes for a property search':
'Hogyan hasonlítsuk össze a manchesteri irányítószámokat ingatlankereséshez',
'Manchester property search - Compare postcodes before viewing':
'Manchesteri ingatlankeresés - Irányítószámok összehasonlítása megtekintés előtt',
'Compare Manchester-area postcodes by budget, commute, property type, schools, broadband, crime, noise and amenities before booking viewings.':
'Hasonlítsa össze Manchester környéki irányítószámait költségvetés, ingázás, ingatlantípus, iskolák, szélessáv, bűnözés, zaj és szolgáltatások szerint, mielőtt lefoglalná a megtekintéseket.',
'Hasonlítsd össze Manchester környéki irányítószámait költségvetés, ingázás, ingatlantípus, iskolák, szélessáv, bűnözés, zaj és szolgáltatások szerint, mielőtt megtekintéseket foglalnál.',
'A Manchester-area search can span city-centre, suburban, and commuter options. Perfect Postcode helps keep each postcode comparable against the same property and daily-life constraints.':
'A Manchester környéki keresés kiterjedhet belvárosi, külvárosi és ingázó lehetőségekre is. A Perfect Postcode segít minden irányítószámot ugyanazokhoz az ingatlan- és mindennapi életet érintő feltételekhez viszonyítani.',
'Egy Manchester környéki keresés belvárosi, külvárosi és ingázó helyeket is lefedhet. A Perfect Postcode segít minden irányítószámot ugyanazokhoz az ingatlan- és mindennapi életet érintő feltételekhez viszonyítani.',
'Use travel time to define the real search area':
'Használja az utazási időt a valódi keresési terület meghatározásához',
'Az utazási idővel határozd meg a valódi keresési területet',
'Start from the destinations that matter, then compare reachable postcodes rather than assuming every nearby place has the same practical journey.':
'Induljon ki a fontos célpontokból, majd hasonlítsa össze az elérhető irányítószámokat, ahelyett, hogy azt feltételezné, hogy minden közeli helyről ugyanúgy lehet eljutni oda.',
'Indulj ki a fontos célpontokból, majd hasonlítsd össze az elérhető irányítószámokat, ne feltételezd, hogy minden közeli helyről ugyanúgy lehet eljutni oda.',
'Compare housing requirements before lifestyle preferences':
'Hasonlítsa össze a lakhatási igényeket az életmódbeli preferenciák előtt',
'A lakhatási igényeket nézd az életmódbeli preferenciák előtt',
'Filter by property type, floor area, tenure, and price before judging amenities. That keeps the shortlist grounded in homes that could realistically work.':
'Szűrjön ingatlantípus, alapterület, tulajdonforma és ár alapján, mielőtt a szolgáltatásokat mérlegelné. Így a szűkített lista olyan otthonokra épül, amelyek reálisan működhetnek.',
'Check local context consistently': 'Következetesen ellenőrizze a helyi környezetet',
'Szűrj ingatlantípus, alapterület, tulajdonforma és ár alapján, mielőtt a szolgáltatásokat mérlegelnéd. Így a szűkített lista olyan otthonokra épül, amelyek reálisan működhetnek.',
'Check local context consistently': 'A helyi környezetet következetesen nézd',
'Use broadband, crime, road noise, parks, schools, and amenities as comparable signals. Then validate the strongest candidates with current local checks.':
'Használja a szélessávot, a bűnözést, az útzajt, a parkokat, az iskolákat és a szolgáltatásokat összehasonlítható mutatóként. Ezután aktuális helyi ellenőrzésekkel erősítse meg a legjobb jelölteket.',
'Használd a szélessávot, a bűnözést, az útzajt, a parkokat, az iskolákat és a szolgáltatásokat összehasonlítható mutatóként. Ezután aktuális helyi ellenőrzésekkel erősítsd meg a legjobb jelölteket.',
'Can I compare Manchester suburbs with city-centre postcodes?':
'Összehasonlíthatom Manchester külvárosait a városközpont irányítószámaival?',
'Yes. Use the same budget, property, commute, and local-context filters across both so trade-offs remain visible.':
'Igen. Mindkettőnél ugyanazokat a költségvetési, ingatlan-, ingázási és helyi környezeti szűrőket használja, így a kompromisszumok láthatóak maradnak.',
'Igen. Mindkettőnél ugyanazokat a költségvetési, ingatlan-, ingázási és helyi környezeti szűrőket használd, így a kompromisszumok láthatóak maradnak.',
'Does this include live listings?': 'Tartalmaz élő hirdetéseket?',
'No. Use it to decide where to search, then use listing portals for current homes for sale.':
'Nem. Használja annak eldöntésére, hol keressen, majd a jelenleg eladó otthonokhoz használja a hirdetési portálokat.',
'Nem. Használd annak eldöntésére, hol érdemes keresni, majd a jelenleg eladó otthonokhoz használd a hirdetési portálokat.',
'Move from a broad search brief to specific postcode candidates.':
'Lépjen tovább a tág keresési igényből konkrét irányítószám-jelöltekre.',
'Lépj tovább a tág keresési igényből konkrét irányítószám-jelöltekre.',
'Data sources': 'Adatforrások',
'Review the datasets used for property and local-context comparison.':
'Tekintse át az ingatlan- és helyi környezeti összehasonlításhoz használt adatkészleteket.',
'Nézd át az ingatlan- és helyi környezeti összehasonlításhoz használt adatkészleteket.',
'Check a single postcode before arranging a viewing.':
'A megtekintés megszervezése előtt ellenőrizze az irányítószámot.',
'Compare Manchester postcodes': 'Hasonlítsa össze a manchesteri irányítószámokat',
'A megtekintés megszervezése előtt ellenőrizd az irányítószámot.',
'Compare Manchester postcodes': 'Hasonlítsd össze a manchesteri irányítószámokat',
'How to compare Bristol postcodes before a property search':
'Hogyan hasonlítsuk össze Bristol irányítószámait ingatlankeresés előtt',
'Bristol property search - Compare postcodes by commute and price':
'Ingatlankeresés Bristolban Hasonlítsa össze az irányítószámokat ingázás és ár alapján',
'Ingatlankeresés Bristolban Hasonlítsd össze az irányítószámokat ingázás és ár alapján',
'Compare Bristol postcodes by price, commute, property size, schools, broadband, crime, road noise, parks and amenities before viewings.':
'Hasonlítsa össze Bristol irányítószámait ár, ingázás, ingatlan mérete, iskolák, szélessáv, bűnözés, közúti zaj, parkok és szolgáltatások szerint a megtekintés előtt.',
'Hasonlítsd össze Bristol irányítószámait ár, ingázás, ingatlanméret, iskolák, szélessáv, bűnözés, közúti zaj, parkok és szolgáltatások szerint a megtekintés előtt.',
'Bristol searches often involve sharp trade-offs between price, journey time, property size, and neighbourhood context. A postcode-first comparison keeps those trade-offs visible.':
'A bristoli keresések gyakran éles kompromisszumokkal járnak az ár, az utazási idő, az ingatlanméret és a környék jellemzői között. Az irányítószám-központú összehasonlítás láthatóvá teszi ezeket a kompromisszumokat.',
'Make commute constraints explicit': 'Tegye egyértelművé az ingázási korlátozásokat',
'Make commute constraints explicit': 'Tedd egyértelművé az ingázási korlátokat',
'If access to the centre, a station, hospital, university, or business park matters, use travel-time filters first and then compare the remaining postcodes by property data.':
'Ha fontos a központ, állomás, kórház, egyetem vagy üzleti park elérése, először használja az utazási idő szűrőit, majd hasonlítsa össze a fennmaradó irányítószámokat ingatlanadatok alapján.',
'Ha fontos a központ, állomás, kórház, egyetem vagy business park elérése, először használd az utazási idő szűrőit, majd hasonlítsd össze a fennmaradó irányítószámokat ingatlanadatok alapján.',
'Compare value, not just headline price':
'Az értéket hasonlítsa össze, ne csak a kiemelt árat',
'Az értéket nézd, ne csak a kiemelt árat',
'Use price, property type, and floor-area filters together. This helps distinguish lower-cost areas from areas that simply contain smaller or different homes.':
'Használja együtt az ár-, ingatlantípus- és alapterület-szűrőket. Ez segít megkülönböztetni az olcsóbb területeket azoktól, ahol egyszerűen kisebb vagy eltérő otthonok vannak.',
'Használd együtt az ár-, ingatlantípus- és alapterület-szűrőket. Ez segít megkülönböztetni az olcsóbb területeket azoktól, ahol egyszerűen kisebb vagy eltérő otthonok vannak.',
'Screen environmental and local-service signals':
'Környezeti és helyi szolgáltatási jelzések előszűrése',
'Road noise, parks, broadband, crime, and amenities can affect whether a property works day to day. Use them as screening criteria before booking viewings.':
'Az útzaj, a parkok, a szélessáv, a bűnözés és a szolgáltatások befolyásolhatják, mennyire működik egy ingatlan a mindennapokban. Használja őket szűrési feltételként a megtekintések lefoglalása előtt.',
'Az útzaj, a parkok, a szélessáv, a bűnözés és a szolgáltatások befolyásolhatják, mennyire működik egy ingatlan a mindennapokban. Használd őket szűrési feltételként, mielőtt megtekintéseket foglalnál.',
'Can I use this for commuter villages around Bristol?':
'Használhatom ezt a Bristol környéki ingázó falvakhoz?',
'Yes, where the relevant postcode and travel-time data is available. Always verify routes and services manually before deciding.':
'Igen, ahol rendelkezésre állnak a vonatkozó irányítószám- és utazásiidő-adatok. Döntés előtt mindig ellenőrizze manuálisan az útvonalakat és a szolgáltatásokat.',
'Igen, ahol rendelkezésre állnak a vonatkozó irányítószám- és utazásiidő-adatok. Döntés előtt mindig ellenőrizd kézzel az útvonalakat és a szolgáltatásokat.',
'Can this tell me whether a listing is good value?':
'Meg tudja mondani, hogy egy hirdetés jó ár-értékű-e?',
'It can provide area context, but a specific listing still needs comparable sales, condition checks, survey findings, and professional advice where appropriate.':
'Területi környezetet tud adni, de egy konkrét hirdetéshez továbbra is összehasonlítható eladásokra, állapotellenőrzésekre, műszaki felmérési eredményekre és adott esetben szakmai tanácsra van szükség.',
'Search by reachable postcodes before refining by budget and local context.':
'Keressen elérhető irányítószámok alapján, mielőtt költségvetés és helyi környezet szerint finomítana.',
'Keress elérhető irányítószámok alapján, mielőtt költségvetés és helyi környezet szerint finomítanál.',
'Understand price patterns before setting listing alerts.':
'Ismerje meg az ármintákat, mielőtt hirdetési értesítéseket állít be.',
'Ismerd meg az ármintákat, mielőtt hirdetési értesítéseket állítasz be.',
'Privacy and security': 'Adatvédelem és biztonság',
'How account and saved-search data is handled in the product.':
'Hogyan történik a fiók és a mentett keresési adatok kezelése a termékben.',
'Compare Bristol postcodes': 'Hasonlítsa össze a bristoli irányítószámokat',
'Compare Bristol postcodes': 'Hasonlítsd össze a bristoli irányítószámokat',
'Trust and coverage': 'Megbízhatóság és lefedettség',
'Perfect Postcode data sources and coverage': 'Perfect Postcode adatforrások és lefedettség',
'Perfect Postcode data sources - Property, schools, commute and local context':
'Perfect Postcode-adatforrások ingatlanok, iskolák, ingázás és helyi környezet',
'Review the public and official datasets used by Perfect Postcode, including property prices, EPC, schools, crime, broadband, noise and travel-time context.':
'Tekintse át a Perfect Postcode által használt nyilvános és hivatalos adatkészleteket, többek között az ingatlanárakat, az EPC-t, az iskolákat, a bűnözést, a szélessávot, a zajt és az utazásiidő-környezetet.',
'Nézd át a Perfect Postcode által használt nyilvános és hivatalos adatkészleteket, többek között az ingatlanárakat, az EPC-t, az iskolákat, a bűnözést, a szélessávot, a zajt és az utazásiidő-adatokat.',
'Perfect Postcode combines property, transport, education, environment, and local-service datasets so buyers can compare postcodes consistently. This page explains what the data is for and where it should be verified.':
'A Perfect Postcode ingatlan-, közlekedési, oktatási, környezeti és helyi szolgáltatási adatkészleteket egyesít, így a vásárlók következetesen hasonlíthatják össze az irányítószámokat. Ez az oldal elmagyarázza, mire valók az adatok, és hol kell őket ellenőrizni.',
'A Perfect Postcode ingatlan-, közlekedési, oktatási, környezeti és helyi szolgáltatási adatkészleteket egyesít, így a vevők következetesen hasonlíthatják össze az irányítószámokat. Ez az oldal elmagyarázza, mire valók az adatok, és hol kell őket ellenőrizni.',
'Property and housing context': 'Ingatlan- és lakhatási környezet',
'The product uses property transaction and housing-context datasets to support filters such as sale price, property type, tenure, floor area, energy performance, and estimated current value.':
'A termék ingatlantranzakciós és lakhatási adatkészleteket használ az olyan szűrők támogatására, mint az eladási ár, az ingatlantípus, a tulajdonforma, az alapterület, az energetikai teljesítmény és a becsült aktuális érték.',
'Use these fields to compare areas, not as a formal valuation.':
'Ezeket a mezőket területek összehasonlítására használja, ne hivatalos értékbecslésként.',
'Ezeket a mezőket területek összehasonlítására használd, ne hivatalos értékbecslésként.',
'Check current listings, title information, lender requirements, and survey results before buying.':
'Vásárlás előtt ellenőrizze az aktuális hirdetéseket, a tulajdoni információkat, a hitelezői követelményeket és a műszaki felmérés eredményeit.',
'Vásárlás előtt ellenőrizd az aktuális hirdetéseket, a tulajdoni információkat, a hitelezői követelményeket és a survey eredményét.',
'Schools, safety, broadband, and environment': 'Iskolák, biztonság, szélessáv és környezet',
'Local-context filters help compare postcodes on signals that affect daily life. They should be treated as screening data and checked against current official sources for decisions.':
'A helyi környezeti szűrők segítenek összehasonlítani az irányítószámokat olyan jelzések alapján, amelyek befolyásolják a mindennapi életet. Ezeket előszűrési adatként kell kezelni, és döntés előtt aktuális hivatalos forrásokkal kell ellenőrizni.',
'Travel-time data': 'Utazásiidő-adatok',
'Travel-time filters are designed for consistent area comparison. Route availability, disruption, parking, walking access, and timetable details should be verified before committing to an area.':
'Az utazásiidő-szűrők következetes területi összehasonlításra készültek. Az útvonalak elérhetőségét, a fennakadásokat, a parkolást, a gyalogos megközelítést és a menetrendi részleteket ellenőrizni kell, mielőtt elköteleződik egy terület mellett.',
'Az utazásiidő-szűrők következetes területi összehasonlításra készültek. Az útvonalak elérhetőségét, a fennakadásokat, a parkolást, a gyalogos megközelítést és a menetrendi részleteket ellenőrizni kell, mielőtt elköteleződnél egy terület mellett.',
'Why does coverage focus on England?': 'Miért fókuszál a lefedettség Angliára?',
'Several core property, education, and local-context datasets are jurisdiction-specific. England coverage keeps comparisons more consistent.':
'Több alapvető ingatlan-, oktatási és helyi környezeti adatkészlet joghatósághoz kötött. Az angliai lefedettség következetesebbé teszi az összehasonlításokat.',
'How should I handle stale or missing data?':
'Hogyan kezeljem az elavult vagy hiányzó adatokat?',
'Use the map as a shortlist tool. If a postcode matters, verify the latest details with current official sources and direct local checks.':
'Használja a térképet előválogatási eszközként. Ha egy irányítószám fontos, ellenőrizze a legfrissebb részleteket aktuális hivatalos forrásokkal és közvetlen helyi ellenőrzésekkel.',
'Használd a térképet előválogatási eszközként. Ha egy irányítószám fontos, ellenőrizd a legfrissebb részleteket aktuális hivatalos forrásokkal és közvetlen helyi utánajárással.',
'How filters and comparisons should be interpreted.':
'Hogyan kell értelmezni a szűrőket és az összehasonlításokat.',
'Review postcode-level context before a viewing.':
'Megtekintés előtt tekintse át az irányítószám-szintű környezetet.',
'Megtekintés előtt nézd át az irányítószám-szintű környezetet.',
'How saved searches and account data are handled.':
'A mentett keresések és fiókadatok kezelésének módja.',
'How to use the map': 'Hogyan kell használni a térképet',
'How to use the map': 'A térkép használata',
'Methodology for postcode property research':
'Az irányítószám-alapú ingatlankutatás módszertana',
'Perfect Postcode methodology - How to interpret postcode property data':
'Perfect Postcode módszertan Az irányítószám-alapú ingatlanadatok értelmezése',
'Understand how to use postcode filters, property estimates, travel-time data, school context and local signals as a home-buying shortlist tool.':
'Ismerje meg, hogyan használhatja az irányítószám-szűrőket, az ingatlanbecsléseket, az utazásiidő-adatokat, az iskolai környezetet és a helyi jelzéseket lakásvásárlási előválogatási eszközként.',
'Ismerd meg, hogyan használhatod az irányítószám-szűrőket, az ingatlanbecsléseket, az utazásiidő-adatokat, az iskolai környezetet és a helyi jeleket lakásvásárlási előválogatáshoz.',
'Perfect Postcode is designed to make area shortlisting more evidence-led. It doesnt replace estate agents, surveyors, conveyancers, lenders, school admissions teams, or local authority checks.':
'A Perfect Postcode célja, hogy a területek előválogatása inkább adatokra épüljön. Nem helyettesíti az ingatlanközvetítőket, műszaki felmérőket, ingatlanjogászokat, hitelezőket, iskolai felvételi csapatokat vagy helyi hatósági ellenőrzéseket.',
'Start with hard constraints': 'Kezdje a szigorú feltételekkel',
'A Perfect Postcode célja, hogy a területek előválogatása adatokra épüljön. Nem helyettesíti az ingatlanközvetítőket, surveyorokat, conveyancereket, hitelezőket, iskolai felvételi csapatokat vagy helyi önkormányzati ellenőrzéseket.',
'Start with hard constraints': 'Kezdd a kötelező feltételekkel',
'Begin with non-negotiables such as budget, property type, floor area, commute time, and essential services. This removes impossible postcodes before softer preferences are considered.':
'Kezdje az alkuképtelen feltételekkel, például a költségvetéssel, az ingatlantípussal, az alapterülettel, az ingázási idővel és az alapvető szolgáltatásokkal. Ez kizárja a szóba sem jövő irányítószámokat, mielőtt a rugalmasabb preferenciákat mérlegelné.',
'Use colour layers for trade-offs': 'Használjon színrétegeket a kompromisszumokhoz',
'Kezdd azokkal, amikből nem engedsz: költségvetés, ingatlantípus, alapterület, ingázási idő és alapvető szolgáltatások. Így a szóba sem jövő irányítószámok kiesnek, mielőtt a rugalmasabb preferenciákra térnél.',
'Use colour layers for trade-offs': 'Használj színrétegeket a kompromisszumokhoz',
'After filtering, colour the remaining map by one signal at a time: price per square metre, road noise, school context, commute time, broadband, or crime. This makes trade-offs easier to discuss.':
'Szűrés után egyszerre egy jelzés szerint színezze a fennmaradó térképet: négyzetméterár, útzaj, iskolai környezet, ingázási idő, szélessáv vagy bűnözés. Így könnyebb megbeszélni a kompromisszumokat.',
'Measure whats working': 'Mérje meg, mi működik',
'Szűrés után egyszerre egy jel szerint színezd a fennmaradó térképet: négyzetméterár, útzaj, iskolai környezet, ingázási idő, szélessáv vagy bűnözés. Így könnyebb megbeszélni a kompromisszumokat.',
'Measure whats working': 'Mérd, mi működik',
'Use Search Console and analytics to track which public pages are indexed, which queries produce impressions, and which pages convert visitors into dashboard exploration. Review Core Web Vitals after every substantial frontend change.':
'Használja a Search Console-t és az analitikát annak követésére, mely nyilvános oldalak indexelődnek, mely lekérdezések eredményeznek megjelenítéseket, és mely oldalak viszik tovább a látogatókat a térkép felfedezéséhez. Minden jelentős frontend-módosítás után tekintse át a Core Web Vitals mutatókat.',
'Használd a Search Console-t és az analitikát annak követésére, mely nyilvános oldalak indexelődnek, mely lekérdezések hoznak megjelenéseket, és mely oldalak viszik tovább a látogatókat a térkép felfedezéséhez. Minden jelentős frontend-módosítás után nézd át a Core Web Vitals mutatókat.',
'Can the tool choose the right postcode for me?':
'Ki tudja választani az eszköz a számomra megfelelő irányítószámot?',
'No. It helps compare evidence and reduce the search area. The final decision needs direct visits, current listings, legal checks, surveys, and personal judgement.':
'Nem. Segít összehasonlítani az adatokat és szűkíteni a keresési területet. A végső döntéshez közvetlen látogatásokra, aktuális hirdetésekre, jogi ellenőrzésekre, műszaki felmérésekre és személyes megítélésre van szükség.',
'How should I use estimates?': 'Hogyan használjam a becsléseket?',
'Use estimates as comparison signals, not as professional valuations or purchase advice.':
'Használja a becsléseket összehasonlító jelzésként, ne szakmai értékbecslésként vagy vásárlási tanácsként.',
'Understand where key filters come from.': 'Ismerje meg, honnan származnak a kulcsszűrők.',
'A becsléseket összehasonlító jelként használd, ne szakmai értékbecslésként vagy vásárlási tanácsként.',
'Understand where key filters come from.': 'Ismerd meg, honnan származnak a kulcsszűrők.',
'Apply the methodology to price-led area comparison.':
'Alkalmazza a módszertant az árvezérelt terület-összehasonlításra.',
'Alkalmazd a módszertant az árvezérelt terület-összehasonlításra.',
'Apply the methodology to destination-led search.':
'Alkalmazza a módszertant a célvezérelt keresésre.',
'Alkalmazd a módszertant a célvezérelt keresésre.',
Trust: 'Bizalom',
'Privacy and security for saved property searches':
'Adatvédelem és biztonság a mentett ingatlankereséshez',
'Perfect Postcode privacy and security - Saved searches and account data':
'Perfect Postcode adatvédelem és biztonság Mentett keresések és fiókadatok',
'Learn how Perfect Postcode treats saved searches, account data and property research workflows with privacy and security in mind.':
'Ismerje meg, hogyan kezeli a Perfect Postcode a mentett kereséseket, a fiókadatokat és az ingatlankutatási munkafolyamatokat az adatvédelem és a biztonság szem előtt tartásával.',
'Ismerd meg, hogyan kezeli a Perfect Postcode a mentett kereséseket, a fiókadatokat és az ingatlankutatási munkafolyamatokat adatvédelmi és biztonsági szempontból.',
'Property research can reveal personal priorities, budgets, and locations. The product keeps public SEO pages separate from account-only areas and marks private dashboard/account routes as noindex.':
'Az ingatlankutatás feltárhat személyes prioritásokat, költségvetést és helyszíneket. A termék elkülöníti a nyilvános SEO-oldalakat a csak fiókkal elérhető területektől, és a privát térkép-/fiókútvonalakat noindexként jelöli.',
'Public pages and private areas are separated':
@ -592,7 +592,7 @@ const hu: Translations = {
'What data powers the public comparisons.':
'Milyen adatok alapozzák meg a nyilvános összehasonlításokat.',
'Explore public postcode-search workflows.':
'Fedezze fel a nyilvános irányítószám-keresési munkafolyamatokat.',
'Fedezd fel a nyilvános irányítószám-keresési folyamatokat.',
},
},
@ -611,7 +611,7 @@ const hu: Translations = {
passwordPlaceholderLogin: 'Jelszavad',
forgotPassword: 'Elfelejtetted a jelszavad?',
resetSent: 'Ellenőrizd az e-mailjeidet a visszaállító hivatkozáshoz.',
pleaseWait: 'Kérjük, várj...',
pleaseWait: 'Egy pillanat...',
sendResetLink: 'Visszaállító hivatkozás küldése',
backToLogin: 'Vissza a bejelentkezéshez',
},
@ -622,12 +622,12 @@ const hu: Translations = {
description:
'Jelenleg a demóterületet fedezed fel. Szerezz élethosszig tartó hozzáférést Anglia minden irányítószámához, minden szűrőjéhez és minden környékéhez. Egyetlen fizetés, örökre.',
free: 'Ingyenes',
freeForEarly: 'Ingyenes a korai felhasználóknak. Nem szükséges bankkártya.',
freeForEarly: 'Ingyenes a korai felhasználóknak. Bankkártya nélkül.',
oneTimePayment: 'Egyszeri fizetés. Élethosszig tartó hozzáférés.',
redirecting: 'Átirányítás...',
claimFreeAccess: 'Ingyenes hozzáférés igénylése',
upgradeFor: 'Frissítés {{price}} áron',
registerAndUpgrade: 'Regisztráció és frissítés',
upgradeFor: 'Teljes hozzáférés {{price}} áron',
registerAndUpgrade: 'Regisztráció és teljes hozzáférés',
alreadyHaveAccount: 'Már van fiókod? Jelentkezz be',
continueWithDemo: 'Folytatás demóval',
backToSharedArea: 'Vissza a megosztott területre',
@ -640,10 +640,10 @@ const hu: Translations = {
saveSearch: {
title: 'Keresés mentése',
saved: 'Keresés elmentve',
savedSuccess: 'A keresés sikeresen elmentve.',
savedSuccess: 'A keresésed elmentve.',
viewSavedSearches: 'Mentett keresések megtekintése',
name: 'Név',
namePlaceholder: 'Keresésem',
namePlaceholder: 'Saját keresésem',
saving: 'Mentés...',
},
@ -655,41 +655,41 @@ const hu: Translations = {
activationDelayedTitle: 'Fizetés beérkezett',
activationDelayedSubtitle: 'A hozzáférés még aktiválás alatt van.',
activationDelayedDescription:
'Még nem tudtuk megerősíteni a fiók frissítését. Frissíts hamarosan, vagy írj az ügyfélszolgálatnak, ha a hozzáférés nem jelenik meg.',
'Még nem tudtuk megerősíteni a fiók frissítését. Frissíts hamarosan, vagy írj az ügyfélszolgálatnak, ha a hozzáférés nem jelenik meg.',
stayOnPricing: 'Maradás az áraknál',
title: 'Benne vagy.',
subtitle: 'Az élethosszig tartó hozzáférésed most aktív.',
description: 'Teljes hozzáférés minden funkcióhoz, minden irányítószámhoz, egész Angliában.',
startExploring: 'Felfedezés indítása',
startExploring: 'Térkép megnyitása',
},
// ── Filters ────────────────────────────────────────
filters: {
activeFilters: 'Aktív szűrők',
addFilter: 'Szűrő hozzáadása',
findingPerfectPostcode: 'A tökéletes irányítószám megtalálása',
findingPerfectPostcode: 'Tökéletes irányítószám keresése',
addFiltersHint: 'Adj hozzá szűrőket a térkép szűkítéséhez a feltételeidnek megfelelően',
upgradePrompt:
'Találj megfelelő irányítószámokat bűnözés, iskolák, zaj, szélessáv, árak és több mint 50 további szűrő alapján egész Angliában.',
oneTimeLifetime: 'Egyszeri fizetés, élethosszig tartó hozzáférés.',
upgradeToFullMap: 'Frissítés a teljes térképre',
upgradeToFullMap: 'Teljes térkép megnyitása',
chooseFilters:
'Kattints a Hozzáadásra a szűréshez. A kis gombok adatokat mutatnak vagy színezik a térképet.',
searchFeatures: 'Jellemzők keresése...',
searchFeatures: 'Szűrők keresése...',
noMatchingFeatures: 'Nincs találat',
tryDifferentSearch: 'Próbálj más keresőkifejezést',
allFeaturesActive: 'Minden jellemző aktív',
removeFilterHint: 'Távolíts el egy szűrőt az elérhető jellemzők megtekintéséhez',
featureInfo: 'Az adatról',
aboutData: 'Az adatról',
aboutDataShort: 'Adat',
allFeaturesActive: 'Minden szűrő aktív',
removeFilterHint: 'Távolíts el egy szűrőt az elérhető lehetőségek megtekintéséhez',
featureInfo: 'Erről az adatról',
aboutData: 'Erről az adatról',
aboutDataShort: 'Infó',
colourMap: 'Térkép színezése',
colourMapShort: 'Térkép színezése',
clearColourMap: 'Térképszínezés törlése',
colourMapShort: 'Színezés',
clearColourMap: 'Színezés törlése',
addFilterAction: 'Hozzáadás',
addFilterLabel: 'Szűrő hozzáadása',
removeFilter: 'Szűrő eltávolítása',
replayTutorial: 'Interaktív bemutató újrajátszása',
replayTutorial: 'Bemutató újraindítása',
clearAll: 'Összes törlése',
clearAllTitle: 'Összes szűrő törlése?',
clearAllSavePrompt: 'Szeretnéd menteni a jelenlegi szűrőket a törlés előtt?',
@ -699,11 +699,11 @@ const hu: Translations = {
updateAndClear: 'Frissítés és törlés',
clearWithoutSaving: 'Törlés mentés nélkül',
clearWithoutUpdating: 'Törlés frissítés nélkül',
filtersOut: '{{value}} elemet kiszűr',
filtersOut: '{{value}} helyet kiszűr',
schoolType: 'Iskolatípus',
schoolRating: 'Iskolai értékelés',
schoolDistance: 'Iskolatávolság',
primary: 'Általános',
primary: 'Általános iskola',
secondary: 'Középiskola',
rating: 'Értékelés',
goodPlus: 'Jó+',
@ -1134,6 +1134,10 @@ const hu: Translations = {
dsTowOrigin: 'Forest Research / Defra NCEA',
dsTowUse:
'Fák lombkorona-poligonjai magányos fákhoz, facsoportokhoz és kisebb erdőfoltokhoz Angliában. Itt az irányítószám-középpontok körüli lombkorona-fedettségi percentilisek becslésére használjuk.',
dsNfiName: 'Az Országos erdőleltár erdőterületei',
dsNfiOrigin: 'Forest Research',
dsNfiUse:
'Legalább 0,5 hektáros erdőterületek Angliában, amelyeket az erdőn kívüli fák térképe szándékosan kihagy. A TOW lombkoronával egyesítve, hogy a lombkorona-fedettségi mutató és a térképréteg az erdőket is tartalmazza.',
dsConservationAreasName: 'Planning Data műemlékvédelmi területek',
dsConservationAreasOrigin: 'Planning Data / helyi tervezési hatóságok',
dsConservationAreasUse:
@ -1485,8 +1489,6 @@ const hu: Translations = {
'Air Quality and Road Safety Score': 'Levegőminőség és közlekedésbiztonság pontszám',
// ─ Feature names (Crime) ─
'Serious crime per 1k residents (avg/yr)': 'Súlyos bűncselekmény 1000 lakosra (éves átlag)',
'Minor crime per 1k residents (avg/yr)': 'Kisebb bűncselekmény 1000 lakosra (éves átlag)',
'Serious crime (avg/yr)': 'Súlyos bűncselekmény (éves átlag)',
'Minor crime (avg/yr)': 'Kisebb bűncselekmény (éves átlag)',
'Violence and sexual offences (avg/yr)': 'Erőszak és szexuális bűncselekmények (éves átlag)',

File diff suppressed because it is too large Load diff

View file

@ -32,14 +32,18 @@ export const ZOOM_TO_RESOLUTION_THRESHOLDS = [
{ maxZoom: 9, resolution: 6 },
{ maxZoom: 10.5, resolution: 7 },
{ maxZoom: 11.5, resolution: 8 },
{ maxZoom: 13, resolution: 9 },
] as const;
export const SMALLEST_VISIBLE_HEXAGON_RESOLUTION = Math.max(
...ZOOM_TO_RESOLUTION_THRESHOLDS.map(({ resolution }) => resolution)
);
export const POSTCODE_ZOOM_THRESHOLD = 15;
// Shared limit at which the zoomed-in detail layers — postcodes AND the map
// overlays (noise, crime, trees, property borders) — start showing. Set just
// past the finest hexagon level so detail appears while still relatively
// zoomed out. (Each overlay additionally can't render below its own tile-data
// floor, OVERLAY_MIN_ZOOM, regardless of this limit.)
export const POSTCODE_ZOOM_THRESHOLD = 12.5;
export const POSTCODE_SEARCH_ZOOM = 16;
export const FEATURE_GRADIENT: { t: number; color: [number, number, number] }[] = [
@ -233,8 +237,7 @@ export const STACKED_GROUPS: Record<
{
label: 'Serious crime',
feature: 'Serious crime (avg/yr)',
rateFeature: 'Serious crime per 1k residents (avg/yr)',
unit: 'per 1k/yr',
unit: 'avg/yr',
components: [
'Violence and sexual offences (avg/yr)',
'Robbery (avg/yr)',
@ -245,8 +248,7 @@ export const STACKED_GROUPS: Record<
{
label: 'Minor crime',
feature: 'Minor crime (avg/yr)',
rateFeature: 'Minor crime per 1k residents (avg/yr)',
unit: 'per 1k/yr',
unit: 'avg/yr',
components: [
'Anti-social behaviour (avg/yr)',
'Criminal damage and arson (avg/yr)',

View file

@ -247,21 +247,6 @@ const FEATURE_ICON_PATHS: Record<string, ReactNode> = {
<line x1="12" y1="16" x2="12.01" y2="16" />
</>
),
'Serious crime per 1k residents (avg/yr)': (
<>
<line x1="12" y1="3" x2="12" y2="15" />
<circle cx="12" cy="18" r="3" />
<path d="M8 3h8" />
</>
),
'Minor crime per 1k residents (avg/yr)': (
<>
<path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="M23 21v-2a4 4 0 00-3-3.87" />
<path d="M16 3.13a4 4 0 010 7.75" />
</>
),
// ── Crime ────────────────────────────────────
'Anti-social behaviour (avg/yr)': (

View file

@ -29,8 +29,8 @@ describe('map utilities', () => {
expect(zoomToResolution(6.9)).toBe(5);
expect(zoomToResolution(7)).toBe(6);
expect(zoomToResolution(10.6)).toBe(8);
expect(zoomToResolution(14)).toBe(9);
expect(SMALLEST_VISIBLE_HEXAGON_RESOLUTION).toBe(9);
expect(zoomToResolution(14)).toBe(8);
expect(SMALLEST_VISIBLE_HEXAGON_RESOLUTION).toBe(8);
});
it('computes exact viewport bounds by default', () => {

View file

@ -19,6 +19,13 @@ const MAX_MERCATOR_LATITUDE = 85;
const SATELLITE_MAX_ZOOM = 13;
const SATELLITE_ATTRIBUTION =
'Sentinel-2 cloudless - https://s2maps.eu by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2024)';
// High-resolution EA Vertical Aerial Photography, stacked over Sentinel-2 where it
// exists (currently Greater London). The source is sparse: the server returns 204
// outside coverage, so the (overzoomed) Sentinel base shows through the gaps.
const SATELLITE_HIGHRES_MIN_ZOOM = 14;
const SATELLITE_HIGHRES_MAX_ZOOM = 19;
const SATELLITE_HIGHRES_ATTRIBUTION =
'Aerial photography © Environment Agency copyright and/or database right 2011. All rights reserved. Open Government Licence v3.0';
export function getMapDataBeforeId(basemap: BasemapId): string {
return basemap === 'satellite' ? 'roads_runway' : 'landuse_park';
@ -121,6 +128,7 @@ export function getMapStyle(theme: 'light' | 'dark', basemap: BasemapId): StyleS
// Use absolute URL for tiles - required by MapLibre
const tileUrl = `${window.location.origin}/api/tiles/{z}/{x}/{y}`;
const satelliteTileUrl = `${window.location.origin}/api/tiles/satellite/{z}/{x}/{y}`;
const satelliteHighresTileUrl = `${window.location.origin}/api/tiles/satellite-highres/{z}/{x}/{y}`;
const baseLayers = layers('protomaps', flavor, { lang: 'en' });
const isDark = theme === 'dark';
@ -170,6 +178,14 @@ export function getMapStyle(theme: 'light' | 'dark', basemap: BasemapId): StyleS
maxzoom: SATELLITE_MAX_ZOOM,
attribution: SATELLITE_ATTRIBUTION,
},
'satellite-highres': {
type: 'raster',
tiles: [satelliteHighresTileUrl],
tileSize: 256,
minzoom: SATELLITE_HIGHRES_MIN_ZOOM,
maxzoom: SATELLITE_HIGHRES_MAX_ZOOM,
attribution: SATELLITE_HIGHRES_ATTRIBUTION,
},
protomaps: {
type: 'vector',
tiles: [tileUrl],
@ -195,6 +211,19 @@ export function getMapStyle(theme: 'light' | 'dark', basemap: BasemapId): StyleS
'raster-contrast': isDark ? 0.08 : 0.03,
},
},
{
// Stacked above the Sentinel-2 raster: sharp EA aerial where it exists,
// transparent (Sentinel shows through) where the server returns 204.
id: 'satellite-highres-raster',
type: 'raster',
source: 'satellite-highres',
paint: {
'raster-fade-duration': 120,
'raster-brightness-min': isDark ? 0.08 : 0,
'raster-brightness-max': isDark ? 0.86 : 1,
'raster-contrast': isDark ? 0.08 : 0.03,
},
},
...modifiedLayers.filter(isSatelliteReferenceLayer).map(satelliteReferenceLayer),
],
} as StyleSpecification;

View file

@ -1,4 +1,9 @@
export const OVERLAY_IDS = ['noise', 'crime-hotspots', 'trees-outside-woodlands'] as const;
export const OVERLAY_IDS = [
'noise',
'crime-hotspots',
'trees-outside-woodlands',
'property-borders',
] as const;
export type OverlayId = (typeof OVERLAY_IDS)[number];
@ -26,10 +31,17 @@ export const OVERLAYS: OverlayDefinition[] = [
},
{
id: 'trees-outside-woodlands',
label: 'Trees',
description: 'Trees Outside Woodland canopy polygons',
label: 'Trees & woodland',
description: 'Tree canopy and woodland polygons',
detail:
'Forest Research Trees Outside Woodland (TOW) v1 canopy polygons covering lone trees and groups of trees outside mapped woodland blocks. Useful for spotting tree-lined streets and green pockets that broader land-use layers miss. Polygon opacity scales with canopy area.',
'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.',
},
{
id: 'property-borders',
label: 'Property borders',
description: 'Individual freehold property/land-parcel boundaries',
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.',
},
];
@ -38,3 +50,18 @@ const OVERLAY_ID_SET = new Set<string>(OVERLAY_IDS);
export function isOverlayId(value: string): value is OverlayId {
return OVERLAY_ID_SET.has(value);
}
/**
* Lowest zoom at which each overlay's tiles are generated by the pipeline
* (see the `--min-zoom` defaults in pipeline/transform/*_tiles.py). Used as
* the tile source's `minzoom` so we don't request tiles that don't exist
* this is a data-availability floor, NOT the visibility limit. The limit at
* which overlays (and postcodes) start showing is the shared
* POSTCODE_ZOOM_THRESHOLD.
*/
export const OVERLAY_MIN_ZOOM: Record<OverlayId, number> = {
'crime-hotspots': 12,
noise: 12,
'property-borders': 12,
'trees-outside-woodlands': 12,
};

View file

@ -153,6 +153,27 @@ describe('url-state', () => {
expect(state.poiCategories).toEqual(new Set());
});
it('serializes a selected postcode for saved dashboard URLs', () => {
const params = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
undefined,
undefined,
undefined,
'SW1A 1AA'
);
expect(params.get('pc')).toBe('SW1A 1AA');
window.history.replaceState({}, '', `/?${params.toString()}`);
expect(parseUrlState().postcode).toBe('SW1A 1AA');
});
it('round-trips overlay selections', () => {
const params = stateToParams(
null,
@ -197,6 +218,139 @@ describe('url-state', () => {
expect(parseUrlState().basemap).toBe('standard');
});
it('round-trips non-default colour opacity', () => {
const defaultParams = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
1
);
expect(defaultParams.has('colorOpacity')).toBe(false);
const params = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
0.45
);
expect(params.get('colorOpacity')).toBe('45');
window.history.replaceState({}, '', `/?${params.toString()}`);
expect(parseUrlState().colorOpacity).toBe(0.45);
window.history.replaceState({}, '', '/?colorOpacity=not-a-number');
expect(parseUrlState().colorOpacity).toBe(1);
window.history.replaceState({}, '', '/?colorOpacity=0');
expect(parseUrlState().colorOpacity).toBe(0.1);
});
it('round-trips a crime-type subset when the crime overlay is active', () => {
const params = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
new Set(['crime-hotspots']),
undefined,
new Set(['Burglary', 'Robbery'])
);
expect(params.getAll('crimeType')).toEqual(['Burglary', 'Robbery']);
window.history.replaceState({}, '', `/?${params.toString()}&crimeType=NotAType`);
expect(parseUrlState().crimeTypes).toEqual(new Set(['Burglary', 'Robbery']));
});
it('omits crime types when all are selected or the crime overlay is off', () => {
const allSelected = new Set([
'Violence and sexual offences',
'Anti-social behaviour',
'Criminal damage and arson',
'Public order',
'Shoplifting',
'Vehicle crime',
'Burglary',
'Other theft',
'Theft from the person',
'Bicycle theft',
'Drugs',
'Robbery',
'Possession of weapons',
'Other crime',
]);
const allParams = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
new Set(['crime-hotspots']),
undefined,
allSelected
);
expect(allParams.getAll('crimeType')).toEqual([]);
// Subset selected but the crime overlay is not active → nothing emitted.
const overlayOffParams = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
new Set(['noise']),
undefined,
new Set(['Burglary'])
);
expect(overlayOffParams.getAll('crimeType')).toEqual([]);
expect(parseUrlState().crimeTypes).toBeUndefined();
});
it('round-trips a fully-deselected crime-type state via sentinel', () => {
const params = stateToParams(
null,
{},
[],
new Set(),
'area',
undefined,
undefined,
new Set(['crime-hotspots']),
undefined,
new Set()
);
expect(params.getAll('crimeType')).toEqual(['__none']);
window.history.replaceState({}, '', `/?${params.toString()}`);
expect(parseUrlState().crimeTypes).toEqual(new Set());
});
it('round-trips repeated school filters with dedicated URL params', () => {
const schoolOne = createSchoolFilterKey('primary', 'good', 2, 1);
const schoolTwo = createSchoolFilterKey('secondary', 'outstanding', 5, 2);

View file

@ -50,16 +50,26 @@ import {
} from './poi-distance-filter';
import { dedupeTravelTimeEntries } from './travel-params';
import { isOverlayId, type OverlayId } from './overlays';
import { CRIME_TYPES, isCrimeTypeValue } from './crime-types';
import { isBasemapId, type BasemapId } from './basemaps';
import {
DEFAULT_COLOR_OPACITY,
colorOpacityToPercent,
normalizeColorOpacity,
} from './color-opacity';
const POI_NONE_PARAM = '__none';
const CRIME_TYPES_NONE_PARAM = '__none';
const CRIME_OVERLAY_ID: OverlayId = 'crime-hotspots';
export interface UrlState {
viewState: ViewState;
filters: FeatureFilters;
poiCategories: Set<string>;
overlays: Set<OverlayId>;
crimeTypes?: Set<string>;
basemap: BasemapId;
colorOpacity: number;
tab: 'properties' | 'area';
travelTime?: TravelTimeInitial;
postcode?: string;
@ -216,6 +226,7 @@ export function parseUrlState(): UrlState {
poiCategories: new Set(),
overlays: new Set(),
basemap: 'standard',
colorOpacity: DEFAULT_COLOR_OPACITY,
tab: 'area',
};
@ -256,18 +267,36 @@ export function parseUrlState(): UrlState {
result.overlays = new Set(overlayParams.filter(isOverlayId));
}
// Crime-type filter: repeated `crimeType` params, or the `__none` sentinel.
// Absent means "all types" (handled downstream), so leave it undefined.
const crimeTypeParams = params.getAll('crimeType');
if (crimeTypeParams.length > 0) {
result.crimeTypes = crimeTypeParams.includes(CRIME_TYPES_NONE_PARAM)
? new Set()
: new Set(crimeTypeParams.filter(isCrimeTypeValue));
}
const basemap = params.get('basemap');
if (basemap && isBasemapId(basemap)) {
result.basemap = basemap;
}
const colorOpacity = params.get('colorOpacity');
if (colorOpacity != null) {
const colorOpacityPercent = Number(colorOpacity);
if (!isNaN(colorOpacityPercent)) {
result.colorOpacity = normalizeColorOpacity(colorOpacityPercent / 100);
}
}
// Tab: full name
const tab = params.get('tab');
if (tab === 'properties' || tab === 'area') {
result.tab = tab;
}
// Navigate-to-postcode: one-time param for opening a saved property
// Selected postcode. This is also accepted as the historical one-time
// navigate-to-postcode param used by saved-property links.
const pc = params.get('pc');
if (pc) {
result.postcode = pc;
@ -329,7 +358,10 @@ export function stateToParams(
travelTimeEntries?: TravelTimeEntry[],
share?: string,
selectedOverlays?: Set<OverlayId>,
basemap?: BasemapId
basemap?: BasemapId,
selectedCrimeTypes?: Set<string>,
selectedPostcode?: string,
colorOpacity?: number
): URLSearchParams {
const params = new URLSearchParams();
@ -412,16 +444,40 @@ export function stateToParams(
params.set('tab', 'properties');
}
if (selectedPostcode) {
params.set('pc', selectedPostcode);
}
if (selectedOverlays) {
for (const overlay of selectedOverlays) {
params.append('overlay', overlay);
}
}
// Crime-type selection only matters while the crime overlay is on. Emit it
// only when it deviates from the default (all types selected) to keep URLs
// clean; a fully-deselected state uses an explicit sentinel.
if (selectedOverlays?.has(CRIME_OVERLAY_ID) && selectedCrimeTypes) {
if (selectedCrimeTypes.size === 0) {
params.append('crimeType', CRIME_TYPES_NONE_PARAM);
} else if (selectedCrimeTypes.size < CRIME_TYPES.length) {
for (const crimeType of selectedCrimeTypes) {
params.append('crimeType', crimeType);
}
}
}
if (basemap && basemap !== 'standard') {
params.set('basemap', basemap);
}
if (colorOpacity != null) {
const normalizedColorOpacity = normalizeColorOpacity(colorOpacity);
if (normalizedColorOpacity !== DEFAULT_COLOR_OPACITY) {
params.set('colorOpacity', String(colorOpacityToPercent(normalizedColorOpacity)));
}
}
// Travel time: repeated `tt` params
if (travelTimeEntries) {
for (const entry of dedupeTravelTimeEntries(travelTimeEntries)) {

View file

@ -11,38 +11,38 @@
"items": [
{
"cueIndex": 0,
"text": "Wählen Sie kein Zuhause durch endloses Scrollen.",
"text": "Suchen Sie Ihr neues Zuhause nicht, indem Sie endlos durch Inserate scrollen.",
"gapBeforeMs": 0
},
{
"cueIndex": 1,
"text": "Beschreiben Sie, was Ihnen wichtig ist. Budget, Pendelzeit, Schulen, alles.",
"text": "Sagen Sie einfach, was Ihnen wichtig ist: Budget, Arbeitsweg, Schulen, alles, was zählt.",
"gapBeforeMs": 0
},
{
"cueIndex": 2,
"text": "Die Karte zeigt jede passende Postleitzahl in ganz England.",
"text": "Auf der Karte leuchten alle passenden Postleitzahlen in England auf.",
"gapBeforeMs": 300
},
{
"cueIndex": 3,
"text": "Ein Regler bewegt sich. Die Karte antwortet sofort.",
"text": "Verschieben Sie einen Regler, und die Karte reagiert sofort.",
"gapBeforeMs": 500
},
{
"cueIndex": 4,
"text": "Öffnen Sie eine Postleitzahl. Preise. Schulen. Kriminalität. Lärm. Alles auf einer Karte.",
"text": "Öffnen Sie eine beliebige Postleitzahl: Verkaufspreise, Schulen, Kriminalität, Lärm. Alles auf einem Bildschirm.",
"gapBeforeMs": 500
},
{
"cueIndex": 5,
"text": "Mit dieser Auswahl zu den Inseraten. Sie wissen jetzt, wo Sie suchen sollen.",
"text": "Gehen Sie mit Ihrer Vorauswahl zu den Inseraten. Jetzt wissen Sie, wo sich die Suche lohnt.",
"gapBeforeMs": 500
},
{
"cueIndex": 6,
"text": "Perfect Postcode. Wissen, wo Sie suchen sollten, bevor Inserate Ihre Suche bestimmen.",
"text": "Perfect Postcode. Erst wissen, wo Sie suchen sollten, dann in die Inserate einsteigen.",
"gapBeforeMs": 600
}
]
}
}

View file

@ -11,38 +11,38 @@
"items": [
{
"cueIndex": 0,
"text": "Wählen Sie kein Zuhause durch endloses Scrollen.",
"text": "Suchen Sie Ihr neues Zuhause nicht, indem Sie endlos durch Inserate scrollen.",
"gapBeforeMs": 0
},
{
"cueIndex": 1,
"text": "Beschreiben Sie, was Ihnen wichtig ist. Budget, Pendelzeit, Schulen, alles.",
"text": "Sagen Sie einfach, was Ihnen wichtig ist: Budget, Arbeitsweg, Schulen, alles, was zählt.",
"gapBeforeMs": 0
},
{
"cueIndex": 2,
"text": "Die Karte zeigt jede passende Postleitzahl in ganz England.",
"text": "Auf der Karte leuchten alle passenden Postleitzahlen in England auf.",
"gapBeforeMs": 300
},
{
"cueIndex": 3,
"text": "Ein Regler bewegt sich. Die Karte antwortet sofort.",
"text": "Verschieben Sie einen Regler, und die Karte reagiert sofort.",
"gapBeforeMs": 500
},
{
"cueIndex": 4,
"text": "Öffnen Sie eine Postleitzahl. Preise. Schulen. Kriminalität. Lärm. Alles auf einer Karte.",
"text": "Öffnen Sie eine beliebige Postleitzahl: Verkaufspreise, Schulen, Kriminalität, Lärm. Alles auf einem Bildschirm.",
"gapBeforeMs": 500
},
{
"cueIndex": 5,
"text": "Mit dieser Auswahl zu den Inseraten. Sie wissen jetzt, wo Sie suchen sollen.",
"text": "Gehen Sie mit Ihrer Vorauswahl zu den Inseraten. Jetzt wissen Sie, wo sich die Suche lohnt.",
"gapBeforeMs": 500
},
{
"cueIndex": 6,
"text": "Perfect Postcode. Wissen, wo Sie suchen sollten, bevor Inserate Ihre Suche bestimmen.",
"text": "Perfect Postcode. Erst wissen, wo Sie suchen sollten, dann in die Inserate einsteigen.",
"gapBeforeMs": 600
}
]
}
}

View file

@ -11,38 +11,38 @@
"items": [
{
"cueIndex": 0,
"text": "Don't pick a home by scrolling listings.",
"text": "घर चुनने के लिए सिर्फ लिस्टिंग्स स्क्रोल मत करते रहिए।",
"gapBeforeMs": 0
},
{
"cueIndex": 1,
"text": "Describe what you want. Budget, commute, schools, whatever matters.",
"text": "आप जो चाहते हैं, बस बता दीजिए: बजट, रोज़ का सफर, स्कूल, जो भी आपके लिए मायने रखता है।",
"gapBeforeMs": 0
},
{
"cueIndex": 2,
"text": "The map lights up with every postcode in England that fits.",
"text": "इंग्लैंड के सभी मैचिंग पोस्टकोड मैप पर हाइलाइट हो जाते हैं।",
"gapBeforeMs": 300
},
{
"cueIndex": 3,
"text": "Move one slider. The map answers instantly.",
"text": "एक स्लाइडर बदलते ही मैप तुरंत नतीजे दिखा देता है।",
"gapBeforeMs": 500
},
{
"cueIndex": 4,
"text": "Open any postcode. Sold prices. Schools. Crime. Noise. All on one screen.",
"text": "किसी भी पोस्टकोड को खोलिए। बिके हुए घरों के दाम, स्कूल, अपराध, शोर-शराबा। सब एक ही स्क्रीन पर।",
"gapBeforeMs": 500
},
{
"cueIndex": 5,
"text": "Take your shortlist to the listings. Now you know where to search.",
"text": "अपनी शॉर्टलिस्ट लेकर लिस्टिंग्स पर जाइए। अब आपको पता है, तलाश कहाँ करनी है।",
"gapBeforeMs": 500
},
{
"cueIndex": 6,
"text": "Perfect Postcode. Know where to look before listings take over.",
"text": "Perfect Postcode. लिस्टिंग्स में उलझने से पहले जानिए, घर कहाँ ढूँढना है।",
"gapBeforeMs": 600
}
]
}
}

View file

@ -11,38 +11,38 @@
"items": [
{
"cueIndex": 0,
"text": "Don't pick a home by scrolling listings.",
"text": "घर चुनने के लिए सिर्फ लिस्टिंग्स स्क्रोल मत करते रहिए।",
"gapBeforeMs": 0
},
{
"cueIndex": 1,
"text": "Describe what you want. Budget, commute, schools, whatever matters.",
"text": "आप जो चाहते हैं, बस बता दीजिए: बजट, रोज़ का सफर, स्कूल, जो भी आपके लिए मायने रखता है।",
"gapBeforeMs": 0
},
{
"cueIndex": 2,
"text": "The map lights up with every postcode in England that fits.",
"text": "इंग्लैंड के सभी मैचिंग पोस्टकोड मैप पर हाइलाइट हो जाते हैं।",
"gapBeforeMs": 300
},
{
"cueIndex": 3,
"text": "Move one slider. The map answers instantly.",
"text": "एक स्लाइडर बदलते ही मैप तुरंत नतीजे दिखा देता है।",
"gapBeforeMs": 500
},
{
"cueIndex": 4,
"text": "Open any postcode. Sold prices. Schools. Crime. Noise. All on one screen.",
"text": "किसी भी पोस्टकोड को खोलिए। बिके हुए घरों के दाम, स्कूल, अपराध, शोर-शराबा। सब एक ही स्क्रीन पर।",
"gapBeforeMs": 500
},
{
"cueIndex": 5,
"text": "Take your shortlist to the listings. Now you know where to search.",
"text": "अपनी शॉर्टलिस्ट लेकर लिस्टिंग्स पर जाइए। अब आपको पता है, तलाश कहाँ करनी है।",
"gapBeforeMs": 500
},
{
"cueIndex": 6,
"text": "Perfect Postcode. Know where to look before listings take over.",
"text": "Perfect Postcode. लिस्टिंग्स में उलझने से पहले जानिए, घर कहाँ ढूँढना है।",
"gapBeforeMs": 600
}
]
}
}

View file

@ -11,38 +11,38 @@
"items": [
{
"cueIndex": 0,
"text": "别再靠刷房源挑家了。",
"text": "选家,别再从一条条房源开始刷。",
"gapBeforeMs": 0
},
{
"cueIndex": 1,
"text": "用日常话告诉地图你想要的家。预算、通勤、学校,什么都行。",
"text": "想要什么,直接说出来。预算、通勤、学校,凡是重要的都可以。",
"gapBeforeMs": 0
},
{
"cueIndex": 2,
"text": "地图点亮每一个符合条件的英格兰邮编。",
"text": "全英格兰符合条件的邮编,都会在地图上亮起来。",
"gapBeforeMs": 300
},
{
"cueIndex": 3,
"text": "动一个滑块,地图立刻给答案。",
"text": "滑块轻轻一调,地图马上给你答案。",
"gapBeforeMs": 500
},
{
"cueIndex": 4,
"text": "打开任意邮编。成交价、学校、犯罪率、噪音,一目了然。",
"text": "点开任意邮编,成交价、学校、治安、噪音,全都在同一屏。",
"gapBeforeMs": 500
},
{
"cueIndex": 5,
"text": "带着这份清单去房源网站。现在你知道该在哪儿找了。",
"text": "带着候选清单再去看房源。该从哪儿找,你已经心里有数。",
"gapBeforeMs": 500
},
{
"cueIndex": 6,
"text": "Perfect Postcode. 先知道该看哪里,再让房源牵着你走。",
"text": "Perfect Postcode。先锁定该看哪里,再让房源进入视野。",
"gapBeforeMs": 600
}
]
}
}

View file

@ -11,38 +11,38 @@
"items": [
{
"cueIndex": 0,
"text": "别再靠刷房源挑家了。",
"text": "选家,别再从一条条房源开始刷。",
"gapBeforeMs": 0
},
{
"cueIndex": 1,
"text": "用日常话告诉地图你想要的家。预算、通勤、学校,什么都行。",
"text": "想要什么,直接说出来。预算、通勤、学校,凡是重要的都可以。",
"gapBeforeMs": 0
},
{
"cueIndex": 2,
"text": "地图点亮每一个符合条件的英格兰邮编。",
"text": "全英格兰符合条件的邮编,都会在地图上亮起来。",
"gapBeforeMs": 300
},
{
"cueIndex": 3,
"text": "动一个滑块,地图立刻给答案。",
"text": "滑块轻轻一调,地图马上给你答案。",
"gapBeforeMs": 500
},
{
"cueIndex": 4,
"text": "打开任意邮编。成交价、学校、犯罪率、噪音,一目了然。",
"text": "点开任意邮编,成交价、学校、治安、噪音,全都在同一屏。",
"gapBeforeMs": 500
},
{
"cueIndex": 5,
"text": "带着这份清单去房源网站。现在你知道该在哪儿找了。",
"text": "带着候选清单再去看房源。该从哪儿找,你已经心里有数。",
"gapBeforeMs": 500
},
{
"cueIndex": 6,
"text": "Perfect Postcode. 先知道该看哪里,再让房源牵着你走。",
"text": "Perfect Postcode。先锁定该看哪里,再让房源进入视野。",
"gapBeforeMs": 600
}
]
}
}