@@ -109,7 +109,7 @@ export default memo(function HoverCard({
return (
diff --git a/frontend/src/components/map/LocationSearch.test.tsx b/frontend/src/components/map/LocationSearch.test.tsx
new file mode 100644
index 0000000..7d855de
--- /dev/null
+++ b/frontend/src/components/map/LocationSearch.test.tsx
@@ -0,0 +1,215 @@
+import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
+import { afterEach, describe, expect, it, vi } from 'vitest';
+
+import LocationSearch from './LocationSearch';
+import type { PostcodeGeometry } from '../../types';
+
+const RECENT_SEARCHES_STORAGE_KEY = 'perfect-postcode.locationSearch.recent';
+
+vi.mock('react-i18next', () => ({
+ useTranslation: () => ({
+ t: (key: string) =>
+ key === 'locationSearch.placeholder' ? 'Search places or postcodes...' : key,
+ }),
+}));
+
+vi.mock('../../hooks/useIsMobile', () => ({
+ useIsMobile: () => false,
+}));
+
+vi.mock('../../lib/pocketbase', () => ({
+ default: { authStore: { isValid: false, token: '' } },
+}));
+
+const postcodeGeometry: PostcodeGeometry = {
+ type: 'Polygon',
+ coordinates: [
+ [
+ [-0.12, 51.5],
+ [-0.11, 51.5],
+ [-0.11, 51.51],
+ [-0.12, 51.51],
+ [-0.12, 51.5],
+ ],
+ ],
+};
+
+function deferred
() {
+ let resolve!: (value: T) => void;
+ let reject!: (reason?: unknown) => void;
+ const promise = new Promise((res, rej) => {
+ resolve = res;
+ reject = rej;
+ });
+ return { promise, resolve, reject };
+}
+
+function jsonResponse(body: unknown): Response {
+ return new Response(JSON.stringify(body), {
+ status: 200,
+ headers: { 'Content-Type': 'application/json' },
+ });
+}
+
+describe('LocationSearch', () => {
+ afterEach(() => {
+ cleanup();
+ window.localStorage.clear();
+ vi.unstubAllGlobals();
+ });
+
+ it('ignores stale postcode lookups when a newer search starts', async () => {
+ const firstLookup = deferred();
+ const secondLookup = deferred();
+ const requests: { postcode: string; signal?: AbortSignal | null }[] = [];
+
+ vi.stubGlobal(
+ 'fetch',
+ vi.fn((input: string | URL | Request, init?: RequestInit) => {
+ const url = new URL(String(input), 'http://localhost');
+ const postcode = decodeURIComponent(url.pathname.replace('/api/postcode/', ''));
+ requests.push({ postcode, signal: init?.signal });
+ if (postcode === 'SW1A 1AA') return firstLookup.promise;
+ if (postcode === 'E14 2DG') return secondLookup.promise;
+ return Promise.resolve(new Response(null, { status: 404 }));
+ })
+ );
+
+ const onFlyTo = vi.fn();
+ const onLocationSearched = vi.fn();
+
+ render();
+
+ const input = screen.getByRole('textbox');
+ fireEvent.change(input, { target: { value: 'SW1A 1AA' } });
+ fireEvent.keyDown(input, { key: 'Enter' });
+
+ fireEvent.change(input, { target: { value: 'E14 2DG' } });
+ fireEvent.keyDown(input, { key: 'Enter' });
+
+ expect(requests).toHaveLength(2);
+ expect(requests[0].signal?.aborted).toBe(true);
+
+ secondLookup.resolve(
+ jsonResponse({
+ postcode: 'E14 2DG',
+ latitude: 51.505,
+ longitude: -0.01,
+ geometry: postcodeGeometry,
+ })
+ );
+
+ await waitFor(() => {
+ expect(onLocationSearched).toHaveBeenCalledTimes(1);
+ });
+ expect(onFlyTo).toHaveBeenCalledWith(51.505, -0.01, 16);
+ expect(onLocationSearched).toHaveBeenCalledWith({
+ postcode: 'E14 2DG',
+ geometry: postcodeGeometry,
+ latitude: 51.505,
+ longitude: -0.01,
+ zoom: 16,
+ });
+
+ firstLookup.resolve(
+ jsonResponse({
+ postcode: 'SW1A 1AA',
+ latitude: 51.501,
+ longitude: -0.141,
+ geometry: postcodeGeometry,
+ })
+ );
+
+ await new Promise((resolve) => setTimeout(resolve, 0));
+ expect(onFlyTo).toHaveBeenCalledTimes(1);
+ expect(onLocationSearched).toHaveBeenCalledTimes(1);
+ });
+
+ it('stores successful searches locally and shows them when the input is empty', async () => {
+ vi.stubGlobal(
+ 'fetch',
+ vi.fn((input: string | URL | Request) => {
+ const url = new URL(String(input), 'http://localhost');
+ const postcode = decodeURIComponent(url.pathname.replace('/api/postcode/', ''));
+ return Promise.resolve(
+ jsonResponse({
+ postcode,
+ latitude: 51.505,
+ longitude: -0.01,
+ geometry: postcodeGeometry,
+ })
+ );
+ })
+ );
+
+ const onFlyTo = vi.fn();
+ const onLocationSearched = vi.fn();
+
+ render();
+
+ const input = screen.getByRole('textbox');
+ fireEvent.change(input, { target: { value: 'SW1A 1AA' } });
+ fireEvent.keyDown(input, { key: 'Enter' });
+
+ await waitFor(() => {
+ expect(onLocationSearched).toHaveBeenCalledTimes(1);
+ });
+
+ expect(JSON.parse(window.localStorage.getItem(RECENT_SEARCHES_STORAGE_KEY) ?? '[]')).toEqual([
+ { type: 'postcode', label: 'SW1A 1AA' },
+ ]);
+
+ fireEvent.focus(input);
+
+ await waitFor(() => {
+ expect(screen.getByRole('button', { name: 'SW1A 1AA' })).toBeTruthy();
+ });
+ });
+
+ it('keeps only the three most recent local searches', async () => {
+ vi.stubGlobal(
+ 'fetch',
+ vi.fn((input: string | URL | Request) => {
+ const url = new URL(String(input), 'http://localhost');
+ const postcode = decodeURIComponent(url.pathname.replace('/api/postcode/', ''));
+ return Promise.resolve(
+ jsonResponse({
+ postcode,
+ latitude: 51.505,
+ longitude: -0.01,
+ geometry: postcodeGeometry,
+ })
+ );
+ })
+ );
+
+ render();
+
+ const input = screen.getByRole('textbox');
+ for (const postcode of ['SW1A 1AA', 'E14 2DG', 'W1A 1AA', 'EC1A 1BB']) {
+ fireEvent.change(input, { target: { value: postcode } });
+ fireEvent.keyDown(input, { key: 'Enter' });
+
+ await waitFor(() => {
+ const stored = JSON.parse(
+ window.localStorage.getItem(RECENT_SEARCHES_STORAGE_KEY) ?? '[]'
+ ) as { label?: string }[];
+ expect(stored[0]?.label).toBe(postcode);
+ });
+ }
+
+ const stored = JSON.parse(window.localStorage.getItem(RECENT_SEARCHES_STORAGE_KEY) ?? '[]') as {
+ label?: string;
+ }[];
+ expect(stored.map((search) => search.label)).toEqual(['EC1A 1BB', 'W1A 1AA', 'E14 2DG']);
+
+ fireEvent.focus(input);
+
+ await waitFor(() => {
+ expect(screen.getByRole('button', { name: 'EC1A 1BB' })).toBeTruthy();
+ expect(screen.getByRole('button', { name: 'W1A 1AA' })).toBeTruthy();
+ expect(screen.getByRole('button', { name: 'E14 2DG' })).toBeTruthy();
+ });
+ expect(screen.queryByText('SW1A 1AA')).toBeNull();
+ });
+});
diff --git a/frontend/src/components/map/LocationSearch.tsx b/frontend/src/components/map/LocationSearch.tsx
index 761016d..508f7f5 100644
--- a/frontend/src/components/map/LocationSearch.tsx
+++ b/frontend/src/components/map/LocationSearch.tsx
@@ -1,7 +1,7 @@
import { useState, useCallback, useRef, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import type { MapFlyToOptions, PostcodeGeometry } from '../../types';
-import { authHeaders } from '../../lib/api';
+import { authHeaders, isAbortError } from '../../lib/api';
import { POSTCODE_SEARCH_ZOOM } from '../../lib/consts';
import { useIsMobile } from '../../hooks/useIsMobile';
import { useLocationSearch, type SearchResult } from '../../hooks/useLocationSearch';
@@ -16,6 +16,7 @@ export interface SearchedLocation {
geometry: PostcodeGeometry;
latitude: number;
longitude: number;
+ zoom: number;
markerLatitude?: number;
markerLongitude?: number;
openProperties?: boolean;
@@ -73,6 +74,34 @@ export default function LocationSearch({
const isMobile = useIsMobile();
const containerRef = useRef(null);
const inputRef = useRef(null);
+ const lookupAbortRef = useRef(null);
+ const lookupRequestIdRef = useRef(0);
+
+ const cancelLookup = useCallback((updateLoading = true) => {
+ lookupRequestIdRef.current += 1;
+ lookupAbortRef.current?.abort();
+ lookupAbortRef.current = null;
+ if (updateLoading) setLoading(false);
+ }, []);
+
+ const beginLookup = useCallback(() => {
+ lookupAbortRef.current?.abort();
+ const controller = new AbortController();
+ lookupAbortRef.current = controller;
+ lookupRequestIdRef.current += 1;
+ setError(null);
+ setLoading(true);
+ search.close();
+ return { controller, requestId: lookupRequestIdRef.current };
+ }, [search]);
+
+ const isCurrentLookup = useCallback((requestId: number, controller: AbortController) => {
+ return (
+ lookupRequestIdRef.current === requestId &&
+ lookupAbortRef.current === controller &&
+ !controller.signal.aborted
+ );
+ }, []);
// Close on outside click
useEffect(() => {
@@ -93,106 +122,136 @@ export default function LocationSearch({
}
}, [isMobile, expanded]);
+ useEffect(() => {
+ return () => cancelLookup(false);
+ }, [cancelLookup]);
+
const selectResult = useCallback(
async (result: SearchResult) => {
+ const { controller, requestId } = beginLookup();
+
if (result.type === 'place') {
const zoom = ZOOM_FOR_TYPE[result.place_type] ?? 14;
- setError(null);
- setLoading(true);
- search.close();
- onFlyTo(result.lat, result.lon, zoom);
+ // 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);
try {
const params = new URLSearchParams({
lat: String(result.lat),
lng: String(result.lon),
log: 'false',
});
- const res = await fetch(`/api/nearest-postcode?${params}`, authHeaders());
+ const res = await fetch(
+ `/api/nearest-postcode?${params}`,
+ authHeaders({ signal: controller.signal })
+ );
+ if (!isCurrentLookup(requestId, controller)) return;
if (!res.ok) {
setError(t('locationSearch.lookupFailed'));
return;
}
const json: PostcodeLookupResponse = await res.json();
+ if (!isCurrentLookup(requestId, controller)) return;
onLocationSearched?.({
postcode: json.postcode,
geometry: json.geometry,
latitude: json.latitude,
longitude: json.longitude,
+ zoom,
markerLatitude: result.lat,
markerLongitude: result.lon,
});
+ search.saveRecentSearch(result);
search.clear();
if (isMobile) setExpanded(false);
- } catch {
+ } catch (error) {
+ if (!isCurrentLookup(requestId, controller) || isAbortError(error)) return;
setError(t('locationSearch.lookupFailed'));
} finally {
- setLoading(false);
+ if (isCurrentLookup(requestId, controller)) {
+ lookupAbortRef.current = null;
+ setLoading(false);
+ }
}
return;
}
if (result.type === 'address') {
- setError(null);
- setLoading(true);
- search.close();
try {
const res = await fetch(
`/api/postcode/${encodeURIComponent(result.postcode)}`,
- authHeaders()
+ authHeaders({ signal: controller.signal })
);
+ if (!isCurrentLookup(requestId, controller)) return;
if (!res.ok) {
setError(t('locationSearch.postcodeNotFound'));
return;
}
const json: PostcodeLookupResponse = await res.json();
- onFlyTo(result.lat, result.lon, 17);
+ if (!isCurrentLookup(requestId, controller)) return;
+ if (!isMobile) onFlyTo(result.lat, result.lon, 17);
onLocationSearched?.({
postcode: json.postcode,
geometry: json.geometry,
latitude: result.lat,
longitude: result.lon,
+ zoom: 17,
markerLatitude: result.lat,
markerLongitude: result.lon,
openProperties: true,
focusAddress: result.address,
});
+ search.saveRecentSearch(result);
search.clear();
if (isMobile) setExpanded(false);
- } catch {
+ } catch (error) {
+ if (!isCurrentLookup(requestId, controller) || isAbortError(error)) return;
setError(t('locationSearch.lookupFailed'));
} finally {
- setLoading(false);
+ if (isCurrentLookup(requestId, controller)) {
+ lookupAbortRef.current = null;
+ setLoading(false);
+ }
}
return;
}
// Postcode — fetch geometry
- setError(null);
- setLoading(true);
- search.close();
try {
- const res = await fetch(`/api/postcode/${encodeURIComponent(result.label)}`, authHeaders());
+ const res = await fetch(
+ `/api/postcode/${encodeURIComponent(result.label)}`,
+ authHeaders({ signal: controller.signal })
+ );
+ if (!isCurrentLookup(requestId, controller)) return;
if (!res.ok) {
setError(t('locationSearch.postcodeNotFound'));
return;
}
const json: PostcodeLookupResponse = await res.json();
- onFlyTo(json.latitude, json.longitude, POSTCODE_SEARCH_ZOOM);
+ if (!isCurrentLookup(requestId, controller)) return;
+ if (!isMobile) onFlyTo(json.latitude, json.longitude, POSTCODE_SEARCH_ZOOM);
onLocationSearched?.({
postcode: json.postcode,
geometry: json.geometry,
latitude: json.latitude,
longitude: json.longitude,
+ zoom: POSTCODE_SEARCH_ZOOM,
});
+ search.saveRecentSearch(result);
search.clear();
if (isMobile) setExpanded(false);
- } catch {
+ } catch (error) {
+ if (!isCurrentLookup(requestId, controller) || isAbortError(error)) return;
setError(t('locationSearch.lookupFailed'));
} finally {
- setLoading(false);
+ if (isCurrentLookup(requestId, controller)) {
+ lookupAbortRef.current = null;
+ setLoading(false);
+ }
}
},
- [onFlyTo, onLocationSearched, isMobile, search, t]
+ [beginLookup, isCurrentLookup, onFlyTo, onLocationSearched, isMobile, search, t]
);
const [locating, setLocating] = useState(false);
@@ -203,6 +262,7 @@ export default function LocationSearch({
return;
}
setError(null);
+ cancelLookup();
setLocating(true);
search.close();
try {
@@ -234,7 +294,7 @@ export default function LocationSearch({
} finally {
setLocating(false);
}
- }, [onFlyTo, onCurrentLocationFound, isMobile, search, t]);
+ }, [cancelLookup, onFlyTo, onCurrentLocationFound, isMobile, search, t]);
// Mobile collapsed state: search icon + locate button
if (isMobile && !expanded) {
@@ -281,7 +341,10 @@ export default function LocationSearch({
'px-2 py-2 text-sm w-56 border-none outline-none bg-transparent text-warm-700 dark:text-warm-200 placeholder-warm-400 dark:placeholder-warm-500'
}
inputRef={inputRef}
- onInputChange={() => setError(null)}
+ onInputChange={() => {
+ setError(null);
+ cancelLookup();
+ }}
/>
)}
@@ -962,7 +1024,7 @@ export default memo(function Map({
left: listingPopup.x,
top: listingPopup.y - 12,
transform: 'translate(-50%, -100%)',
- zIndex: 9999,
+ zIndex: 30,
}}
onMouseLeave={clearListingPopup}
>
diff --git a/frontend/src/components/map/MapPage.tsx b/frontend/src/components/map/MapPage.tsx
index be63e19..5e66f2a 100644
--- a/frontend/src/components/map/MapPage.tsx
+++ b/frontend/src/components/map/MapPage.tsx
@@ -1,7 +1,7 @@
import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { Trans, useTranslation } from 'react-i18next';
-import type { MapFlyToOptions, PostcodeGeometry } from '../../types';
+import type { ActualListing, MapFlyToOptions, PostcodeGeometry } from '../../types';
import type { SearchedLocation } from './LocationSearch';
import { useMapData } from '../../hooks/useMapData';
import { usePOIData } from '../../hooks/usePOIData';
@@ -25,11 +25,7 @@ import {
import { apiUrl, authHeaders, buildFilterString } from '../../lib/api';
import { useFilterCounts } from '../../hooks/useFilterCounts';
import { trackEvent } from '../../lib/analytics';
-import {
- INITIAL_VIEW_STATE,
- POSTCODE_SEARCH_ZOOM,
- POSTCODE_ZOOM_THRESHOLD,
-} from '../../lib/consts';
+import { INITIAL_VIEW_STATE, POSTCODE_ZOOM_THRESHOLD } from '../../lib/consts';
import type { OverlayId } from '../../lib/overlays';
import { useLicense } from '../../hooks/useLicense';
import { stateToParams } from '../../lib/url-state';
@@ -67,6 +63,9 @@ import type { MapFlyTo, MapPageProps } from './map-page/types';
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,
@@ -115,6 +114,7 @@ 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 {
filters,
@@ -378,7 +378,7 @@ export default function MapPage({
pendingLocationSearchFlyToRef.current = {
lat: markerLat ?? result.latitude,
lng: markerLng ?? result.longitude,
- zoom: result.openProperties ? 17 : POSTCODE_SEARCH_ZOOM,
+ zoom: result.zoom,
};
setMobileDrawerOpen(true);
consumePendingLocationSearchFlyTo();
@@ -450,11 +450,20 @@ export default function MapPage({
[filters, features]
);
const actualListingsTravelParam = useMemo(() => buildTravelParam(entries), [entries]);
- const { listings: actualListings } = useActualListings(mapData.bounds, {
- filterParam: actualListingsFilterParam,
- travelParam: actualListingsTravelParam,
- shareCode,
- });
+ const actualListingsEnabled = !__DEV__ || devActualListingsEnabled;
+ const { listings: actualListings } = useActualListings(
+ actualListingsEnabled ? mapData.bounds : null,
+ {
+ filterParam: actualListingsFilterParam,
+ travelParam: actualListingsTravelParam,
+ shareCode,
+ }
+ );
+ const visibleActualListings = actualListingsEnabled ? actualListings : EMPTY_ACTUAL_LISTINGS;
+ const handleToggleActualListings = useCallback(() => {
+ if (!__DEV__) return;
+ setDevActualListingsEnabled((enabled) => !enabled);
+ }, []);
const [isAreaGroupExpanded, toggleAreaGroup] = useCollapsibleGroups(true);
useUrlSync(
@@ -798,7 +807,9 @@ export default function MapPage({
onLocationSearched={handleLocationSearchResult}
onCurrentLocationFound={handleCurrentLocationFound}
currentLocation={currentLocation}
- actualListings={actualListings}
+ actualListings={visibleActualListings}
+ actualListingsEnabled={actualListingsEnabled}
+ onToggleActualListings={__DEV__ ? handleToggleActualListings : undefined}
travelTimeEntries={entries}
bottomScreenInset={mobileBottomSheetHeight}
onBottomSheetCoveredHeightChange={setMobileBottomSheetHeight}
@@ -866,7 +877,9 @@ export default function MapPage({
onLocationSearched={handleLocationSearchResult}
onCurrentLocationFound={handleCurrentLocationFound}
currentLocation={currentLocation}
- actualListings={actualListings}
+ actualListings={visibleActualListings}
+ actualListingsEnabled={actualListingsEnabled}
+ onToggleActualListings={__DEV__ ? handleToggleActualListings : undefined}
travelTimeEntries={entries}
densityLabel={densityLabel}
totalCount={hasActiveFilters ? filterCounts.total : undefined}
diff --git a/frontend/src/components/map/MapPageSelectionPane.tsx b/frontend/src/components/map/MapPageSelectionPane.tsx
index 009a78e..9f6c820 100644
--- a/frontend/src/components/map/MapPageSelectionPane.tsx
+++ b/frontend/src/components/map/MapPageSelectionPane.tsx
@@ -36,7 +36,7 @@ export function MapPageSelectionPane({
return (
+
{/* Backdrop — top 10% */}
diff --git a/frontend/src/components/map/PropertiesPane.tsx b/frontend/src/components/map/PropertiesPane.tsx
index be7a179..ff6e691 100644
--- a/frontend/src/components/map/PropertiesPane.tsx
+++ b/frontend/src/components/map/PropertiesPane.tsx
@@ -191,7 +191,7 @@ function PropertyCard({ property }: { property: Property }) {
)}
{property.listed_building === 'Yes' && (
- {ts('Listed building')}
+ {t('propertyCard.listedBuildingBadge')}
)}
diff --git a/frontend/src/components/map/map-page/DesktopMapPage.tsx b/frontend/src/components/map/map-page/DesktopMapPage.tsx
index e13088a..f24e611 100644
--- a/frontend/src/components/map/map-page/DesktopMapPage.tsx
+++ b/frontend/src/components/map/map-page/DesktopMapPage.tsx
@@ -17,6 +17,7 @@ import type { OverlayId } from '../../../lib/overlays';
import type { SearchedLocation } from '../LocationSearch';
import { MapPinIcon } from '../../ui/icons/MapPinIcon';
import { EyeIcon } from '../../ui/icons/EyeIcon';
+import { HouseIcon } from '../../ui/icons/HouseIcon';
import { IndeterminateProgressBar } from '../../ui/IndeterminateProgressBar';
import type { MapFlyTo, PaneResizeHandlers } from './types';
import { MapFallback, PaneFallback } from './Fallbacks';
@@ -56,6 +57,8 @@ interface DesktopMapPageProps {
onCurrentLocationFound: (lat: number, lng: number) => void;
currentLocation: { lat: number; lng: number } | null;
actualListings: ActualListing[];
+ actualListingsEnabled: boolean;
+ onToggleActualListings?: () => void;
travelTimeEntries: TravelTimeEntry[];
densityLabel: string;
totalCount?: number;
@@ -106,6 +109,8 @@ export function DesktopMapPage({
onCurrentLocationFound,
currentLocation,
actualListings,
+ actualListingsEnabled,
+ onToggleActualListings,
travelTimeEntries,
densityLabel,
totalCount,
@@ -154,7 +159,7 @@ export function DesktopMapPage({
{filtersPane}
@@ -208,7 +213,20 @@ export function DesktopMapPage({
totalCount={totalCount}
/>
-
+
+ {onToggleActualListings && (
+
+
+ Listings
+
+ )}
void;
currentLocation: { lat: number; lng: number } | null;
actualListings: ActualListing[];
+ actualListingsEnabled: boolean;
+ onToggleActualListings?: () => void;
travelTimeEntries: TravelTimeEntry[];
bottomScreenInset: number;
onBottomSheetCoveredHeightChange: (height: number) => void;
@@ -94,6 +97,8 @@ export function MobileMapPage({
onCurrentLocationFound,
currentLocation,
actualListings,
+ actualListingsEnabled,
+ onToggleActualListings,
travelTimeEntries,
bottomScreenInset,
onBottomSheetCoveredHeightChange,
@@ -161,7 +166,19 @@ export function MobileMapPage({
-
+
+ {onToggleActualListings && (
+
+
+
+ )}
void;
+ onExport: (options?: { postcodes?: string[] }) => void;
exporting: boolean;
}
diff --git a/frontend/src/components/map/map-page/useExportController.ts b/frontend/src/components/map/map-page/useExportController.ts
index 0404890..bd2bc65 100644
--- a/frontend/src/components/map/map-page/useExportController.ts
+++ b/frontend/src/components/map/map-page/useExportController.ts
@@ -135,73 +135,86 @@ export function useExportController({
useEffect(() => clearExportNoticeTimer, [clearExportNoticeTimer]);
- const handleExport = useCallback(() => {
- if (exporting) return;
- if (!bounds) {
- showExportNotice({ kind: 'error', message: t('header.exportUnavailable') });
- return;
- }
+ const handleExport = useCallback(
+ (options?: { postcodes?: string[] }) => {
+ if (exporting) return;
- const { south, west, north, east } = bounds;
- const params = new URLSearchParams({
- bounds: `${south},${west},${north},${east}`,
- });
- const filterStr = buildFilterString(filters, features);
- if (filterStr) params.set('filters', filterStr);
- const travelParam = buildTravelParam(travelTimeEntries);
- if (travelParam) params.set('travel', travelParam);
- appendTravelStateParams(params, travelTimeEntries);
- for (const overlay of selectedOverlays) {
- params.append('overlay', overlay);
- }
- if (shareCode) params.set('share', shareCode);
- const url = apiUrl('export', params);
+ const postcodeList = options?.postcodes?.map((p) => p.trim()).filter(Boolean) ?? [];
+ const isListMode = postcodeList.length > 0;
- const controller = new AbortController();
- let timedOut = false;
- const timeoutId = window.setTimeout(() => {
- timedOut = true;
- controller.abort();
- }, EXPORT_TIMEOUT_MS);
-
- setExporting(true);
- clearExportNotice();
-
- void (async () => {
- try {
- const res = await fetch(url, authHeaders({ signal: controller.signal }));
- if (!res.ok) throw new Error(await getExportErrorMessage(res));
-
- const blob = await res.blob();
- if (blob.size === 0) throw new Error(t('header.exportEmpty'));
-
- triggerExportDownload(blob, getExportFileName(res));
- trackEvent('Export');
- showExportNotice({ kind: 'success', message: t('header.exportReady') });
- } catch (err) {
- if (!timedOut) logNonAbortError('Export failed', err);
- const detail = err instanceof Error && err.message.trim() ? ` ${err.message}` : '';
- showExportNotice({
- kind: 'error',
- message: timedOut ? t('header.exportTimedOut') : `${t('header.exportFailed')}${detail}`,
- });
- } finally {
- window.clearTimeout(timeoutId);
- setExporting(false);
+ if (!isListMode && !bounds) {
+ showExportNotice({ kind: 'error', message: t('header.exportUnavailable') });
+ return;
}
- })();
- }, [
- bounds,
- clearExportNotice,
- exporting,
- features,
- filters,
- selectedOverlays,
- shareCode,
- showExportNotice,
- t,
- travelTimeEntries,
- ]);
+
+ const params = new URLSearchParams();
+ if (isListMode) {
+ params.set('postcodes', postcodeList.join(','));
+ if (shareCode) params.set('share', shareCode);
+ } else {
+ const { south, west, north, east } = bounds!;
+ params.set('bounds', `${south},${west},${north},${east}`);
+ const filterStr = buildFilterString(filters, features);
+ if (filterStr) params.set('filters', filterStr);
+ const travelParam = buildTravelParam(travelTimeEntries);
+ if (travelParam) params.set('travel', travelParam);
+ appendTravelStateParams(params, travelTimeEntries);
+ for (const overlay of selectedOverlays) {
+ params.append('overlay', overlay);
+ }
+ if (shareCode) params.set('share', shareCode);
+ }
+ const url = apiUrl('export', params);
+
+ const controller = new AbortController();
+ let timedOut = false;
+ const timeoutId = window.setTimeout(() => {
+ timedOut = true;
+ controller.abort();
+ }, EXPORT_TIMEOUT_MS);
+
+ setExporting(true);
+ clearExportNotice();
+
+ void (async () => {
+ try {
+ const res = await fetch(url, authHeaders({ signal: controller.signal }));
+ if (!res.ok) throw new Error(await getExportErrorMessage(res));
+
+ const blob = await res.blob();
+ if (blob.size === 0) throw new Error(t('header.exportEmpty'));
+
+ triggerExportDownload(blob, getExportFileName(res));
+ trackEvent('Export');
+ showExportNotice({ kind: 'success', message: t('header.exportReady') });
+ } catch (err) {
+ if (!timedOut) logNonAbortError('Export failed', err);
+ const detail = err instanceof Error && err.message.trim() ? ` ${err.message}` : '';
+ showExportNotice({
+ kind: 'error',
+ message: timedOut
+ ? t('header.exportTimedOut')
+ : `${t('header.exportFailed')}${detail}`,
+ });
+ } finally {
+ window.clearTimeout(timeoutId);
+ setExporting(false);
+ }
+ })();
+ },
+ [
+ bounds,
+ clearExportNotice,
+ exporting,
+ features,
+ filters,
+ selectedOverlays,
+ shareCode,
+ showExportNotice,
+ t,
+ travelTimeEntries,
+ ]
+ );
useEffect(() => {
onExportStateChange?.({ onExport: handleExport, exporting });
diff --git a/frontend/src/components/ui/ExportMenu.tsx b/frontend/src/components/ui/ExportMenu.tsx
new file mode 100644
index 0000000..ae3ea39
--- /dev/null
+++ b/frontend/src/components/ui/ExportMenu.tsx
@@ -0,0 +1,221 @@
+import { useEffect, useId, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { CloseIcon } from './icons/CloseIcon';
+import { DownloadIcon } from './icons/DownloadIcon';
+import { SpinnerIcon } from './icons/SpinnerIcon';
+
+export type ExportMode = 'filters' | 'list';
+
+interface ExportMenuProps {
+ open: boolean;
+ exporting: boolean;
+ onClose: () => void;
+ onExport: (options?: { postcodes?: string[] }) => void;
+}
+
+const EMPTY_LIST: string[] = [''];
+
+export default function ExportMenu({ open, exporting, onClose, onExport }: ExportMenuProps) {
+ const { t } = useTranslation();
+ const [mode, setMode] = useState('filters');
+ const [postcodes, setPostcodes] = useState(EMPTY_LIST);
+ const titleId = useId();
+ const inputRefs = useRef>([]);
+ const focusIndexRef = useRef(null);
+
+ useEffect(() => {
+ if (!open) return;
+ const handler = (e: KeyboardEvent) => {
+ if (e.key === 'Escape') onClose();
+ };
+ window.addEventListener('keydown', handler);
+ return () => window.removeEventListener('keydown', handler);
+ }, [open, onClose]);
+
+ useEffect(() => {
+ if (focusIndexRef.current == null) return;
+ inputRefs.current[focusIndexRef.current]?.focus();
+ focusIndexRef.current = null;
+ }, [postcodes.length]);
+
+ if (!open) return null;
+
+ const cleaned = postcodes.map((p) => p.trim()).filter(Boolean);
+ const canSubmit = !exporting && (mode === 'filters' || cleaned.length > 0);
+
+ const handleSubmit = () => {
+ if (!canSubmit) return;
+ if (mode === 'list') {
+ onExport({ postcodes: cleaned });
+ } else {
+ onExport();
+ }
+ };
+
+ const updateAt = (idx: number, value: string) => {
+ setPostcodes((prev) => prev.map((p, i) => (i === idx ? value : p)));
+ };
+
+ const addRow = () => {
+ setPostcodes((prev) => {
+ focusIndexRef.current = prev.length;
+ return [...prev, ''];
+ });
+ };
+
+ const removeAt = (idx: number) => {
+ setPostcodes((prev) => {
+ if (prev.length <= 1) return [''];
+ return prev.filter((_, i) => i !== idx);
+ });
+ };
+
+ const handleInputKeyDown = (e: React.KeyboardEvent, idx: number) => {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ if (idx === postcodes.length - 1 && postcodes[idx].trim()) {
+ addRow();
+ } else {
+ inputRefs.current[idx + 1]?.focus();
+ }
+ } else if (
+ e.key === 'Backspace' &&
+ postcodes[idx] === '' &&
+ postcodes.length > 1
+ ) {
+ e.preventDefault();
+ focusIndexRef.current = Math.max(0, idx - 1);
+ removeAt(idx);
+ }
+ };
+
+ const cardClass = (selected: boolean) =>
+ `w-full text-left cursor-pointer rounded-lg border p-3 transition-colors ${
+ selected
+ ? 'border-teal-500 bg-teal-50 dark:bg-teal-900/20'
+ : 'border-warm-200 dark:border-warm-700 hover:border-warm-300 dark:hover:border-warm-600 bg-white dark:bg-warm-800'
+ }`;
+
+ return (
+ <>
+
+
+
+
+ {t('export.title')}
+
+
+
+
+
+
+
+
setMode('filters')}
+ className={cardClass(mode === 'filters')}
+ >
+
+ {t('export.modeFilters')}
+
+
+ {t('export.modeFiltersHint')}
+
+
+
+
setMode('list')}
+ className={cardClass(mode === 'list')}
+ >
+
+ {t('export.modeList')}
+
+
+ {t('export.modeListHint')}
+
+
+
+ {mode === 'list' && (
+
+
+ {t('export.listLabel')}
+
+
+ {postcodes.map((value, idx) => (
+
+ {
+ inputRefs.current[idx] = el;
+ }}
+ type="text"
+ value={value}
+ onChange={(e) => updateAt(idx, e.target.value)}
+ onKeyDown={(e) => handleInputKeyDown(e, idx)}
+ placeholder={t('export.listPlaceholder')}
+ autoComplete="off"
+ spellCheck={false}
+ className="flex-1 rounded border border-warm-200 dark:border-warm-700 bg-white dark:bg-warm-900 px-3 py-1.5 text-sm text-navy-950 dark:text-warm-100 font-mono uppercase placeholder:normal-case placeholder:font-sans placeholder:text-warm-400 focus:outline-none focus:border-teal-500"
+ />
+ removeAt(idx)}
+ disabled={postcodes.length === 1 && !value}
+ aria-label={t('export.removeRow')}
+ className="flex cursor-pointer items-center justify-center w-8 h-8 rounded text-warm-500 hover:text-warm-700 hover:bg-warm-100 dark:hover:bg-warm-700 disabled:opacity-30 disabled:cursor-not-allowed transition-colors"
+ >
+
+
+
+ ))}
+
+
+
+ +
+
+ {t('export.addRow')}
+
+
+ {t('export.listCount', { count: cleaned.length })}
+
+
+ )}
+
+
+
+
+ {exporting ? (
+
+ ) : (
+
+ )}
+ {exporting ? t('header.exporting') : t('header.exportLabel')}
+
+
+
+ >
+ );
+}
diff --git a/frontend/src/components/ui/Header.tsx b/frontend/src/components/ui/Header.tsx
index 248461d..c5b4015 100644
--- a/frontend/src/components/ui/Header.tsx
+++ b/frontend/src/components/ui/Header.tsx
@@ -15,6 +15,7 @@ import { SpinnerIcon } from './icons/SpinnerIcon';
import UserMenu from './UserMenu';
import MobileMenu from './MobileMenu';
import LanguageDropdown from './LanguageDropdown';
+import ExportMenu from './ExportMenu';
export type Page =
| 'home'
@@ -37,7 +38,7 @@ export type Page =
| 'invite';
export interface HeaderExportState {
- onExport: () => void;
+ onExport: (options?: { postcodes?: string[] }) => void;
exporting: boolean;
}
@@ -110,6 +111,7 @@ export default function Header({
const [copied, setCopied] = useState(false);
const [sharing, setSharing] = useState(false);
const [menuOpen, setMenuOpen] = useState(false);
+ const [exportMenuOpen, setExportMenuOpen] = useState(false);
const [isDashboardTabletSidebarWidth, setIsDashboardTabletSidebarWidth] = useState(
() => window.matchMedia(DASHBOARD_TABLET_SIDEBAR_QUERY).matches
);
@@ -292,7 +294,7 @@ export default function Header({
{exportState && (
setExportMenuOpen(true)}
disabled={exportState.exporting}
className="flex cursor-pointer items-center gap-1.5 px-3 py-1.5 rounded bg-navy-800 hover:bg-navy-700 transition-colors text-sm disabled:opacity-50"
title={t('header.exportToExcel')}
@@ -407,6 +409,7 @@ export default function Header({
theme={theme}
onToggleTheme={onToggleTheme}
exportState={exportState}
+ onOpenExportMenu={() => setExportMenuOpen(true)}
onSaveSearch={onSaveSearch}
savingSearch={savingSearch}
isEditingSearch={!!editingSearch}
@@ -420,6 +423,18 @@ export default function Header({
sharing={sharing}
/>
)}
+ {/* Export menu modal (shared between desktop and mobile triggers) */}
+ {exportState && (
+ setExportMenuOpen(false)}
+ onExport={(opts) => {
+ setExportMenuOpen(false);
+ exportState.onExport(opts);
+ }}
+ />
+ )}
{/* Mobile "Copied" toast */}
{useSidebarNav && copied && (
diff --git a/frontend/src/components/ui/MobileMenu.tsx b/frontend/src/components/ui/MobileMenu.tsx
index 33415d8..798a81a 100644
--- a/frontend/src/components/ui/MobileMenu.tsx
+++ b/frontend/src/components/ui/MobileMenu.tsx
@@ -19,6 +19,7 @@ interface MobileMenuProps {
theme: 'light' | 'dark';
onToggleTheme: () => void;
exportState: HeaderExportState | null;
+ onOpenExportMenu: () => void;
onSaveSearch: (() => void) | null;
savingSearch: boolean;
isEditingSearch: boolean;
@@ -39,6 +40,7 @@ export default function MobileMenu({
theme,
onToggleTheme,
exportState,
+ onOpenExportMenu,
onSaveSearch,
savingSearch,
isEditingSearch,
@@ -122,8 +124,8 @@ export default function MobileMenu({
{exportState && (
{
- exportState.onExport();
onClose();
+ onOpenExportMenu();
}}
disabled={exportState.exporting}
className={dashboardActionClass}
diff --git a/frontend/src/components/ui/PlaceSearchInput.tsx b/frontend/src/components/ui/PlaceSearchInput.tsx
index 623c884..449e246 100644
--- a/frontend/src/components/ui/PlaceSearchInput.tsx
+++ b/frontend/src/components/ui/PlaceSearchInput.tsx
@@ -13,9 +13,9 @@ interface SearchHook {
activeIndex: number;
setActiveIndex: (idx: number) => void;
open: boolean;
- setOpen: (open: boolean) => void;
handleInputChange: (value: string) => void;
handleKeyDown: (e: React.KeyboardEvent, onSelect: (result: SearchResult) => void) => void;
+ showEmptySearches: () => void;
}
interface PlaceSearchInputProps {
@@ -129,7 +129,7 @@ export function PlaceSearchInput({
onInputChange?.();
}}
onFocus={() => {
- if (search.results.length > 0) search.setOpen(true);
+ search.showEmptySearches();
}}
onKeyDown={(e) => search.handleKeyDown(e, onSelect)}
placeholder={placeholder}
diff --git a/frontend/src/hooks/useDeckLayers.ts b/frontend/src/hooks/useDeckLayers.ts
index fe52717..33c1e24 100644
--- a/frontend/src/hooks/useDeckLayers.ts
+++ b/frontend/src/hooks/useDeckLayers.ts
@@ -104,7 +104,11 @@ export function useDeckLayers({
const isDark = theme === 'dark';
const densityGradient = isDark ? DENSITY_GRADIENT_DARK : DENSITY_GRADIENT;
- const { poiLayers, popupInfo, clearPopupInfo } = usePoiLayers({ pois, zoom, isDark });
+ const { poiLayers, visiblePois, popupInfo, clearPopupInfo } = usePoiLayers({
+ pois,
+ zoom,
+ isDark,
+ });
const { listingLayers, listingPopup, clearListingPopup } = useListingLayers({
listings: actualListings,
zoom,
@@ -421,8 +425,50 @@ export function useDeckLayers({
}, [data, colorTrigger, handleHexagonClick, handleHexagonHover]);
const postcodeLayer = useMemo(() => {
+ const isEnum = enumCountRef.current > 0;
+ const distKey = viewFeatureRef.current ? `dist_${viewFeatureRef.current}` : '';
+
+ const ratiosCache = new WeakMap();
+ const getRatios = (f: PostcodeFeature): number[] => {
+ let r = ratiosCache.get(f);
+ if (!r) {
+ r = distToRatios(f.properties[distKey]);
+ ratiosCache.set(f, r);
+ }
+ return r;
+ };
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const pieProps: Record = isEnum
+ ? {
+ extensions: [new PieHexExtension(requireEnumPalette(enumPaletteRef.current))],
+ getCenter: (f: PostcodeFeature) => f.properties.centroid,
+ getRatios0: (f: PostcodeFeature) => {
+ const r = getRatios(f);
+ return [r[0], r[1], r[2], r[3]];
+ },
+ getRatios1: (f: PostcodeFeature) => {
+ const r = getRatios(f);
+ return [r[4], r[5], r[6], r[7]];
+ },
+ getRatios2: (f: PostcodeFeature) => {
+ const r = getRatios(f);
+ return [r[8], r[9]];
+ },
+ }
+ : {};
+ const pieUpdateTriggers: Record = isEnum
+ ? {
+ getCenter: [postcodeColorTrigger, postcodeData],
+ getRatios0: [postcodeColorTrigger, postcodeData],
+ getRatios1: [postcodeColorTrigger, postcodeData],
+ getRatios2: [postcodeColorTrigger, postcodeData],
+ }
+ : {};
+
return new GeoJsonLayer({
- id: 'postcode-polygons',
+ ...pieProps,
+ id: isEnum ? 'postcode-polygons-pie' : 'postcode-polygons',
data: postcodeData as PostcodeFeature[],
getFillColor: (f) => {
const d = f.properties;
@@ -525,6 +571,7 @@ export function useDeckLayers({
getFillColor: [postcodeColorTrigger],
getLineColor: [postcodeColorTrigger],
getLineWidth: [postcodeColorTrigger],
+ ...pieUpdateTriggers,
},
extruded: false,
pickable: true,
@@ -651,6 +698,7 @@ export function useDeckLayers({
return {
layers,
+ visiblePois,
popupInfo,
clearPopupInfo,
listingPopup,
diff --git a/frontend/src/hooks/useLocationSearch.ts b/frontend/src/hooks/useLocationSearch.ts
index 75c104c..675f206 100644
--- a/frontend/src/hooks/useLocationSearch.ts
+++ b/frontend/src/hooks/useLocationSearch.ts
@@ -2,6 +2,9 @@ import { useState, useCallback, useRef, useEffect } from 'react';
import type { AddressResult, PlaceResult } from '../types';
import { authHeaders, logNonAbortError } from '../lib/api';
+const RECENT_SEARCHES_STORAGE_KEY = 'perfect-postcode.locationSearch.recent';
+const RECENT_SEARCH_LIMIT = 3;
+
/** Matches a full UK postcode with complete inward code (e.g. "E14 2DG", "SW1A1AA").
* Outcodes like "E14" or "SW1A" intentionally do NOT match — they go through /api/places instead. */
const FULL_POSTCODE_RE = /^[A-Z]{1,2}\d[A-Z\d]?\s*\d[A-Z]{2}$/i;
@@ -77,9 +80,84 @@ export type SearchResult =
city?: string;
};
+function isFiniteNumber(value: unknown): value is number {
+ return typeof value === 'number' && Number.isFinite(value);
+}
+
+function isSearchResult(value: unknown): value is SearchResult {
+ if (!value || typeof value !== 'object') return false;
+
+ const result = value as Record;
+ if (result.type === 'postcode') {
+ return typeof result.label === 'string';
+ }
+
+ if (result.type === 'address') {
+ return (
+ typeof result.address === 'string' &&
+ typeof result.postcode === 'string' &&
+ isFiniteNumber(result.lat) &&
+ isFiniteNumber(result.lon)
+ );
+ }
+
+ if (result.type === 'place') {
+ return (
+ typeof result.name === 'string' &&
+ typeof result.slug === 'string' &&
+ typeof result.place_type === 'string' &&
+ isFiniteNumber(result.lat) &&
+ isFiniteNumber(result.lon) &&
+ (result.city === undefined || typeof result.city === 'string')
+ );
+ }
+
+ return false;
+}
+
+function readRecentSearches(): SearchResult[] {
+ if (typeof window === 'undefined') return [];
+
+ try {
+ const raw = window.localStorage.getItem(RECENT_SEARCHES_STORAGE_KEY);
+ if (!raw) return [];
+ const parsed: unknown = JSON.parse(raw);
+ if (!Array.isArray(parsed)) return [];
+ return parsed.filter(isSearchResult).slice(0, RECENT_SEARCH_LIMIT);
+ } catch {
+ return [];
+ }
+}
+
+function writeRecentSearches(searches: SearchResult[]) {
+ if (typeof window === 'undefined') return;
+
+ try {
+ window.localStorage.setItem(
+ RECENT_SEARCHES_STORAGE_KEY,
+ JSON.stringify(searches.slice(0, RECENT_SEARCH_LIMIT))
+ );
+ } catch {
+ // Recent searches are a convenience only; storage failures should not affect search.
+ }
+}
+
+function searchResultKey(result: SearchResult): string {
+ if (result.type === 'postcode') {
+ return `postcode:${normalizePostcode(result.label)}`;
+ }
+
+ if (result.type === 'address') {
+ return `address:${result.postcode.toUpperCase()}:${result.address.toLowerCase()}`;
+ }
+
+ return `place:${result.slug}`;
+}
+
export function useLocationSearch(mode?: string) {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
+ const [recentSearches, setRecentSearches] = useState(readRecentSearches);
const [activeIndex, setActiveIndex] = useState(-1);
const [open, setOpen] = useState(false);
const abortRef = useRef(null);
@@ -98,9 +176,9 @@ export function useLocationSearch(mode?: string) {
const trimmed = value.trim();
if (!trimmed) {
- setResults([]);
+ setResults(recentSearches);
lastResultsRef.current = [];
- setOpen(false);
+ setOpen(recentSearches.length > 0);
return;
}
@@ -181,9 +259,20 @@ export function useLocationSearch(mode?: string) {
}
}, 200);
},
- [mode]
+ [mode, recentSearches]
);
+ const showEmptySearches = useCallback(() => {
+ if (latestQueryRef.current.trim()) {
+ setOpen(results.length > 0);
+ return;
+ }
+
+ setResults(recentSearches);
+ setActiveIndex(-1);
+ setOpen(recentSearches.length > 0);
+ }, [recentSearches, results.length]);
+
const close = useCallback(() => setOpen(false), []);
const clear = useCallback(() => {
@@ -195,6 +284,18 @@ export function useLocationSearch(mode?: string) {
setActiveIndex(-1);
}, []);
+ const saveRecentSearch = useCallback((result: SearchResult) => {
+ setRecentSearches((prev) => {
+ const key = searchResultKey(result);
+ const next = [result, ...prev.filter((recent) => searchResultKey(recent) !== key)].slice(
+ 0,
+ RECENT_SEARCH_LIMIT
+ );
+ writeRecentSearches(next);
+ return next;
+ });
+ }, []);
+
const handleKeyDown = useCallback(
(e: React.KeyboardEvent, onSelect: (result: SearchResult) => void) => {
if (e.key === 'ArrowDown') {
@@ -234,6 +335,8 @@ export function useLocationSearch(mode?: string) {
setOpen,
handleInputChange,
handleKeyDown,
+ showEmptySearches,
+ saveRecentSearch,
close,
clear,
};
diff --git a/frontend/src/hooks/usePoiLayers.test.ts b/frontend/src/hooks/usePoiLayers.test.ts
index 3c758fe..1ab0764 100644
--- a/frontend/src/hooks/usePoiLayers.test.ts
+++ b/frontend/src/hooks/usePoiLayers.test.ts
@@ -146,10 +146,12 @@ describe('usePoiLayers', () => {
);
expect(layerById(result.current.poiLayers, 'poi-background').props.data).toEqual([]);
+ expect(result.current.visiblePois).toEqual([]);
rerender({ zoom: 14 });
expect(layerById(result.current.poiLayers, 'poi-background').props.data).toEqual([busStop]);
+ expect(result.current.visiblePois).toEqual([busStop]);
});
it('keeps POI hover popup state in sync with layer hover events', () => {
diff --git a/frontend/src/hooks/usePoiLayers.ts b/frontend/src/hooks/usePoiLayers.ts
index 874bf33..3eef5e5 100644
--- a/frontend/src/hooks/usePoiLayers.ts
+++ b/frontend/src/hooks/usePoiLayers.ts
@@ -271,5 +271,5 @@ export function usePoiLayers({ pois, zoom, isDark }: UsePoiLayersProps) {
const clearPopupInfo = useCallback(() => setPopupInfo(null), []);
- return { poiLayers, popupInfo, clearPopupInfo };
+ return { poiLayers, visiblePois, popupInfo, clearPopupInfo };
}
diff --git a/frontend/src/i18n/descriptions.ts b/frontend/src/i18n/descriptions.ts
index 368a7fd..fa33160 100644
--- a/frontend/src/i18n/descriptions.ts
+++ b/frontend/src/i18n/descriptions.ts
@@ -32,6 +32,8 @@ const descriptions: Record> = {
'Street tree density percentile': 'Percentile estimé de couverture arborée pour la rue du bien',
'Within conservation area':
'Indique si le point représentatif du code postal se trouve dans une zone de conservation',
+ 'Listed building':
+ 'Indique si ce 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':
@@ -127,7 +129,9 @@ const descriptions: Record> = {
'Street tree density percentile':
'Geschätztes Perzentil der Baumkronenbedeckung auf der Straße der Immobilie',
'Within conservation area':
- 'Ob der repräsentative Punkt der Postleitzahl in einer Conservation Area liegt',
+ 'Ob der repräsentative Punkt der Postleitzahl in einem Erhaltungsgebiet liegt',
+ 'Listed building':
+ 'Ob diese Immobilie einem Eintrag für ein denkmalgeschütztes Gebäude bei Historic England zugeordnet werden kann',
'Good+ primary schools within 2km':
'Von Ofsted mit Gut oder Hervorragend bewertete Grundschulen im Umkreis von 2 km',
'Good+ secondary schools within 2km':
@@ -224,6 +228,7 @@ const descriptions: Record> = {
'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公里内小学',
@@ -299,6 +304,8 @@ const descriptions: Record> = {
'Interior height (m)': 'EPC सर्वेक्षण के अनुसार औसत अंदरूनी ऊंचाई',
'Street tree density percentile': 'संपत्ति वाली सड़क का अनुमानित वृक्ष आच्छादन प्रतिशतक',
'Within conservation area': 'पोस्टकोड प्रतिनिधि बिंदु नामित संरक्षण क्षेत्र में है या नहीं',
+ 'Listed building':
+ 'यह संपत्ति Historic England के सूचीबद्ध भवन रिकॉर्ड से मिलती-जुलती है या नहीं',
'Good+ primary schools within 2km':
'2 किमी के भीतर Ofsted से अच्छी या उत्कृष्ट रेटिंग वाले प्राइमरी स्कूल',
'Good+ secondary schools within 2km':
@@ -386,7 +393,9 @@ const descriptions: Record> = {
'Street tree density percentile':
'Az ingatlan utcájának becsült lombkorona-fedettségi percentilise',
'Within conservation area':
- 'Az irányítószám reprezentatív pontja kijelölt conservation area területre esik-e',
+ 'Az irányítószám reprezentatív pontja kijelölt műemléki területre esik-e',
+ 'Listed building':
+ 'Az ingatlan látszólag megfelel-e egy Historic England műemléki épület bejegyzésének',
'Good+ primary schools within 2km':
'Ofsted által Jó vagy Kiváló minősítésű általános iskolák 2 km-en belül',
'Good+ secondary schools within 2km':
diff --git a/frontend/src/i18n/details.ts b/frontend/src/i18n/details.ts
index 89d7c38..2e30372 100644
--- a/frontend/src/i18n/details.ts
+++ b/frontend/src/i18n/details.ts
@@ -36,9 +36,11 @@ export const details: Record> = {
'Interior height (m)':
"Hauteur intérieure moyenne (sol au plafond) en mètres telle qu'enregistrée lors de l'évaluation du certificat de performance énergétique (EPC). Calculée en divisant le volume intérieur total par la surface habitable totale.",
'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'un proxy de centroïde de code postal, pas d'une mesure exacte du bien ou du segment de rue.",
+ "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 Historic England, rattachées au point représentatif du code postal. Le jeu de données national est indicatif plutôt que définitif ; les décisions sensibles aux limites doivent être vérifiées auprès de l'autorité locale de planification.",
+ '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.",
'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.",
'Good+ secondary schools within 2km':
@@ -156,11 +158,11 @@ export const details: Record> = {
'Property type':
'Aus den HM Land Registry Price Paid-Daten und EPC-Zertifikaten. Freistehend, Doppelhaushälfte, Reihenhaus (umfasst alle Untertypen), Wohnungen/Maisonettes oder Sonstiges (Bungalows, Mobilheime usw.).',
'Leasehold/Freehold':
- 'Aus den HM Land Registry Price Paid-Daten. Freehold bedeutet, dass Sie das Gebäude und das Grundstück besitzen. Leasehold bedeutet, dass Sie das Gebäude, aber nicht das Grundstück besitzen: Sie haben einen Pachtvertrag vom Freeholder für eine festgelegte Anzahl von Jahren.',
+ 'Aus den HM Land Registry Price Paid-Daten. Volleigentum bedeutet, dass du das Gebäude und das Grundstück besitzt. Erbbaurecht bedeutet, dass du das Gebäude, aber nicht das Grundstück besitzt: Du hast vom Grundeigentümer einen Vertrag für eine festgelegte Anzahl von Jahren.',
'Last known price':
'Der zuletzt erfasste Verkaufspreis für diese Immobilie aus den HM Land Registry Price Paid-Daten. Umfasst Wohnimmobilienverkäufe in England. Kann Jahre alt sein, wenn die Immobilie nicht kürzlich verkauft wurde.',
'Estimated current price':
- 'Basiert auf dem letzten Verkaufspreis, lokalen Preisbewegungen aus Wiederverkäufen und nahegelegenen kürzlich verkauften Immobilien. Der Repeat-Sales-Index wird nach Postleitzahlensektor und Immobilientyp verfolgt, mit Glättung und Nachbarschafts-Blending bei begrenzten Daten. Kürzliche Verkäufe bleiben nahe am erfassten Preis; ältere Verkäufe hängen stärker vom Modell ab.',
+ 'Basiert auf dem letzten Verkaufspreis, lokalen Preisbewegungen aus Wiederverkäufen und nahegelegenen kürzlich verkauften Immobilien. Der Index wiederholter Verkäufe wird nach Postleitzahlensektor und Immobilientyp verfolgt, mit Glättung und Einbeziehung benachbarter Daten bei begrenzten Daten. Kürzliche Verkäufe bleiben nahe am erfassten Preis; ältere Verkäufe hängen stärker vom Modell ab.',
'Price per sqm':
'Berechnet durch Division des zuletzt bekannten Verkaufspreises durch die Gesamtnutzfläche aus dem EPC-Zertifikat. Nützlich zum Vergleich des Wertes verschiedener Immobiliengrößen. Nur verfügbar, wenn sowohl Preis- als auch Flächendaten vorhanden sind.',
'Est. price per sqm':
@@ -184,9 +186,11 @@ export const details: Record> = {
'Interior height (m)':
'Durchschnittliche lichte Raumhöhe in Metern, wie während der Energieausweis-Begutachtung erfasst. Berechnet durch Division des gesamten Innenvolumens durch die Gesamtwohnfläche.',
'Street tree density percentile':
- 'Ungefähre Baumkronenbedeckung rund um den Postleitzahlen-Zentroiden aus der Forest-Research-Karte Trees Outside Woodland 2025. Baumkronen-Polygone für Einzelbäume und Baumgruppen werden im Umkreis von 50 m um jeden Postleitzahlen-Zentroiden gezählt und dann in ein Perzentil über englische Postleitzahlen umgerechnet. Dies ist ein Postleitzahlen-Zentroid-Proxy, keine exakte Messung für Immobilie oder Straßenabschnitt.',
+ 'Ungefähre Baumkronenbedeckung rund um den Postleitzahlen-Zentroiden aus der Forest-Research-Karte Trees Outside Woodland 2025. Baumkronen-Polygone für Einzelbäume und Baumgruppen werden im Umkreis von 50 m um jeden Postleitzahlen-Zentroiden gezählt und dann in ein Perzentil über englische Postleitzahlen umgerechnet. Dies ist ein Näherungswert auf Basis des Postleitzahlen-Zentroids, keine exakte Messung für Immobilie oder Straßenabschnitt.',
'Within conservation area':
- 'Historic-England-Grenzen für Conservation Areas, dem repräsentativen Punkt der Postleitzahl zugeordnet. Der nationale Datensatz ist indikativ und nicht rechtsverbindlich; grenznahe Entscheidungen sollten bei der lokalen Planungsbehörde geprüft werden.',
+ 'Historic-England-Grenzen für Erhaltungsgebiete, dem repräsentativen Punkt der Postleitzahl zugeordnet. Der nationale Datensatz ist indikativ und nicht rechtsverbindlich; grenznahe Entscheidungen sollten bei der lokalen Planungsbehörde geprüft werden.',
+ 'Listed building':
+ 'Punktdaten zu denkmalgeschützten Gebäuden aus der National Heritage List for England von Historic England, vorsichtig mit Immobilienadressen abgeglichen anhand des Namens des Denkmaleintrags und nahegelegener Postleitzahlkandidaten. Behandle dies als Vorauswahl-Hinweis, nicht als rechtliche Feststellung: Prüfe jede konkrete Immobilie in der NHLE und bei der lokalen Planungsbehörde.',
'Good+ primary schools within 2km':
'Staatlich geförderte Grundschulen innerhalb von 2 km mit einer aktuellen Ofsted-Bewertung von Gut oder Hervorragend. Noch nicht inspizierte Schulen sind ausgeschlossen.',
'Good+ secondary schools within 2km':
@@ -335,6 +339,8 @@ export const details: Record> = {
'基于 Forest Research 2025 年 Trees Outside Woodland 地图估算的邮编质心周边树冠覆盖率。系统会统计每个邮编质心 50 米范围内的孤立树木和树群树冠多边形,然后转换为英格兰邮编范围内的百分位。这是邮编质心近似指标,不是精确的房产或道路路段测量。',
'Within conservation area':
'Historic England 保护区边界,与邮编代表点匹配。全国数据集是指示性而非最终权威;涉及边界的决策应向地方规划部门核实。',
+ 'Listed building':
+ 'Historic England 英格兰国家遗产名录(NHLE)中的受保护建筑点位记录,会根据名录条目名称和附近候选邮编,谨慎匹配到房产地址。请把它当作初筛信号,而不是法律认定:具体房产应在 NHLE 和地方规划部门核实。',
'Good+ primary schools within 2km':
'2km范围内Ofsted评级为“良好”或“优秀”的公立小学数量。尚未接受评估的学校不计入。',
'Good+ secondary schools within 2km':
@@ -475,6 +481,8 @@ export const details: Record> = {
'Forest Research के 2025 Trees Outside Woodland नक्शे से निकाला गया पोस्टकोड केंद्र के आसपास का अनुमानित वृक्ष आच्छादन. अकेले पेड़ों और पेड़ों के समूहों के वृक्ष-शिखर बहुभुजों को हर पोस्टकोड केंद्र से 50m के भीतर गिना जाता है, फिर इंग्लैंड के पोस्टकोडों के मुकाबले प्रतिशतक में बदला जाता है. यह पोस्टकोड-केंद्र पर आधारित अनुमानक है, किसी संपत्ति या सड़क-खंड की सटीक माप नहीं.',
'Within conservation area':
'Historic England संरक्षण क्षेत्र सीमाएं पोस्टकोड प्रतिनिधि बिंदु से मिलाई जाती हैं. राष्ट्रीय डेटासेट संकेतक है, अंतिम आधिकारिक नहीं; सीमा-संवेदनशील निर्णय स्थानीय योजना प्राधिकरण से जांचे जाने चाहिए.',
+ 'Listed building':
+ 'Historic England की इंग्लैंड की राष्ट्रीय धरोहर सूची (NHLE) में सूचीबद्ध भवनों के बिंदु रिकॉर्ड, जिन्हें सूचीबद्ध प्रविष्टि के नाम और पास के संभावित पोस्टकोड के आधार पर संपत्ति पते से सावधानी से मिलाया गया है. इसे केवल प्रारंभिक जांच संकेत मानें, कानूनी निर्णय नहीं: किसी भी विशिष्ट संपत्ति को NHLE और स्थानीय योजना प्राधिकरण से सत्यापित करें.',
'Good+ primary schools within 2km':
'2 km के भीतर सरकारी वित्तपोषित प्राइमरी स्कूल जिनकी मौजूदा Ofsted रेटिंग अच्छी या उत्कृष्ट है. जिन स्कूलों का अभी निरीक्षण नहीं हुआ है, उन्हें शामिल नहीं किया गया है.',
'Good+ secondary schools within 2km':
@@ -590,9 +598,9 @@ export const details: Record> = {
},
hu: {
'Property type':
- 'Az HM Land Registry Price Paid adatokból és EPC tanúsítványokból. Különálló, Ikerház, Sorház (minden sorház altípust tartalmaz), Lakás/Maisonette, vagy Egyéb (bungaló, mobilház stb.).',
+ 'Az HM Land Registry Price Paid adatokból és EPC tanúsítványokból. Különálló ház, ikerház, sorház (minden sorház-altípussal), lakás vagy kétszintes lakás, illetve egyéb típus (bungaló, mobilház stb.).',
'Leasehold/Freehold':
- 'Az HM Land Registry Price Paid adatokból. A Freehold azt jelenti, hogy az épület és a telek is az Ön tulajdona. A Leasehold azt jelenti, hogy az épület az Ön tulajdona, de a telek nem: a telektulajdonostól meghatározott számú évre szóló bérleti jogot kapott.',
+ 'Az HM Land Registry Price Paid adatokból. A teljes tulajdon azt jelenti, hogy az épület és a telek is az Ön tulajdona. A bérleti tulajdonjog azt jelenti, hogy az épület az Ön tulajdona, de a telek nem: a telektulajdonostól meghatározott számú évre szóló jogot kapott.',
'Last known price':
'Az ingatlan utolsó rögzített adásvételi ára az HM Land Registry Price Paid adatokból. Az angliai lakóingatlan-értékesítésekre vonatkozik. Lehet, hogy évekkel ezelőtti adat, ha az ingatlan nem kelt el a közelmúltban.',
'Estimated current price':
@@ -620,9 +628,11 @@ export const details: Record> = {
'Interior height (m)':
'Az EPC-tanúsítvány felmérése során rögzített átlagos belső padló-mennyezet magasság méterben. A teljes belső térfogatot osztják a teljes alapterülettel.',
'Street tree density percentile':
- 'A Forest Research 2025-os Trees Outside Woodland térképéből származó hozzávetőleges lombkorona-fedettség az irányítószám-középpont körül. A magányos fák és facsoportok lombkorona-poligonjait minden irányítószám-középpont 50 méteres körzetében számoljuk, majd az angliai irányítószámok közötti percentilissé alakítjuk. Ez irányítószám-középponti proxy, nem pontos ingatlan- vagy utcaszakasz-mérés.',
+ 'A Forest Research 2025-os Trees Outside Woodland térképéből származó hozzávetőleges lombkorona-fedettség az irányítószám-középpont körül. A magányos fák és facsoportok lombkorona-poligonjait minden irányítószám-középpont 50 méteres körzetében számoljuk, majd az angliai irányítószámok közötti percentilissé alakítjuk. Ez az irányítószám-középponton alapuló közelítő mutató, nem pontos ingatlan- vagy utcaszakasz-mérés.',
'Within conservation area':
- 'Historic England conservation area határok az irányítószám reprezentatív pontjához rendelve. Az országos adatállomány tájékoztató jellegű, nem végleges; határérzékeny döntéseknél a helyi tervezési hatóság adatait kell ellenőrizni.',
+ 'A Historic England műemléki területeinek határai az irányítószám reprezentatív pontjához rendelve. Az országos adatállomány tájékoztató jellegű, nem végleges; határérzékeny döntéseknél a helyi tervezési hatóság adatait kell ellenőrizni.',
+ 'Listed building':
+ 'A Historic England National Heritage List for England műemlékiépület-pontrekordjai, amelyeket óvatosan egyeztetünk ingatlancímekhez a műemléki bejegyzés neve és a közeli irányítószám-jelöltek alapján. Előszűrési jelzésként kezelendő, nem jogi megállapításként: minden konkrét ingatlant ellenőrizni kell az NHLE-ben és a helyi tervezési hatóságnál.',
'Good+ primary schools within 2km':
'2 km-en belüli állami fenntartású általános iskolák, amelyek aktuális Ofsted besorolása Jó vagy Kiemelkedő. A még nem vizsgált iskolák ki vannak zárva.',
'Good+ secondary schools within 2km':
diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts
index c57992d..c728295 100644
--- a/frontend/src/i18n/locales/de.ts
+++ b/frontend/src/i18n/locales/de.ts
@@ -32,7 +32,7 @@ const de: Translations = {
postcode: 'Postleitzahl',
noAreaSelected: 'Kein Gebiet ausgewählt',
noAreaSelectedDesc:
- 'Klicken Sie auf ein farbiges Gebiet auf der Karte, um Kriminalität, Schulen, Preise und mehr zu sehen',
+ 'Klicke auf ein farbiges Gebiet auf der Karte, um Kriminalität, Schulen, Preise und mehr zu sehen',
clickForDetails: 'Für Details klicken',
property: 'Immobilie',
propertiesPlural: 'Immobilien',
@@ -42,8 +42,8 @@ const de: Translations = {
bathsCount_other: '{{count}} Bäder',
places: 'Orte',
noData: 'Keine Daten',
- allLow: 'Alles niedrig',
- connectingToServer: 'Verbindung zum Server...',
+ allLow: 'Alle niedrig',
+ connectingToServer: 'Verbindung zum Server wird hergestellt...',
closePane: 'Bereich schließen',
yes: 'Ja',
no: 'Nein',
@@ -62,8 +62,8 @@ const de: Translations = {
sharing: 'Wird geteilt...',
exportLabel: 'Exportieren',
exporting: 'Wird exportiert...',
- exportToExcel: 'Als Excel exportieren',
- exportReady: 'Export bereit. Der Download sollte starten.',
+ exportToExcel: 'Nach Excel exportieren',
+ exportReady: 'Export bereit. Der Download sollte gleich starten.',
exportFailed: 'Export fehlgeschlagen.',
exportTimedOut: 'Zeitüberschreitung beim Export. Bitte erneut versuchen.',
exportUnavailable: 'Die Karte lädt noch. Bitte gleich erneut versuchen.',
@@ -72,6 +72,23 @@ const de: Translations = {
closeMenu: 'Menü schließen',
},
+ // ── Export Menu ────────────────────────────────────
+ export: {
+ title: 'Exportieren',
+ modeFilters: 'Postleitzahlen, die zu den Filtern passen',
+ modeFiltersHint:
+ 'Exportiere alle auf der Karte sichtbaren Postleitzahlen, die deinen aktuellen Filtern entsprechen.',
+ modeList: 'Postleitzahlenliste',
+ modeListHint:
+ 'Füge deine Postleitzahlen einzeln hinzu – Schreibweise und Leerzeichen werden für dich korrigiert.',
+ listLabel: 'Postleitzahlen',
+ listPlaceholder: 'z. B. SW1A 1AA',
+ addRow: 'Postleitzahl hinzufügen',
+ removeRow: 'Postleitzahl entfernen',
+ listCount: '{{count}} Postleitzahl',
+ listCount_other: '{{count}} Postleitzahlen',
+ },
+
// ── User Menu ──────────────────────────────────────
userMenu: {
fullAccess: 'Vollzugriff',
@@ -90,77 +107,75 @@ const de: Translations = {
// ── SEO Page Chrome ────────────────────────────────
seo: {
- breadcrumb: 'Breadcrumb',
+ breadcrumb: 'Navigationspfad',
reviewDataSources: 'Datenquellen prüfen',
- whatYouCanCompare: 'Was Sie vergleichen können',
+ whatYouCanCompare: 'Was du vergleichen kannst',
whatYouCanCompareDesc:
- 'Jede Seite ist für echte Vorauswahl gedacht: unmögliche Orte aussortieren, die verbleibenden Postleitzahlen vergleichen und entscheiden, was als Nächstes geprüft werden soll.',
- howToUseIt: 'So nutzen Sie es',
+ 'Jede Seite unterstützt echte Vorauswahl: ungeeignete Orte aussortieren, die verbleibenden Postleitzahlen vergleichen und entscheiden, was als Nächstes geprüft werden soll.',
+ howToUseIt: 'So nutzt du es',
howToUseItDesc:
- 'Nutzen Sie diese Abläufe, damit die Seite schon hilft, bevor Sie ein Immobilienportal öffnen oder eine Besichtigung buchen.',
+ 'Nutze diese Abläufe, damit die Seite schon hilft, bevor du ein Immobilienportal öffnest oder eine Besichtigung buchst.',
methodAndLimitations: 'Methode und Grenzen',
methodAndLimitationsDesc:
- 'Die Daten dienen zum Vergleichen und Vorauswählen. Wichtige Entscheidungen brauchen weiterhin aktuelle Inserate, fachliche Prüfungen und direkte lokale Validierung.',
+ 'Die Daten dienen dem Vergleich und der Vorauswahl. Wichtige Entscheidungen brauchen weiterhin aktuelle Inserate, fachliche Prüfungen und direkte Prüfung vor Ort.',
questionsBuyersAsk: 'Fragen von Käufern',
relatedGuides: 'Verwandte Leitfäden',
relatedGuidesDesc:
- 'Navigieren Sie mit kanonischen internen Links durch die indexierten öffentlichen Seiten.',
+ 'Navigiere mit kanonischen internen Links durch die indexierten öffentlichen Seiten.',
frequentlyAskedQuestions: 'Häufig gestellte Fragen',
relatedPages: 'Verwandte Seiten',
relatedPagesDesc:
- 'Folgen Sie diesen internen Links, um denselben Immobiliensuch-Workflow aus einem anderen Blickwinkel zu vergleichen.',
+ 'Folge diesen internen Links, um denselben Immobiliensuch-Workflow aus einem anderen Blickwinkel zu vergleichen.',
pages: {
'Property price map': 'Immobilienpreiskarte',
'Compare property prices across every postcode in England':
- 'Vergleichen Sie Immobilienpreise für alle Postleitzahlen in England',
+ 'Vergleiche Immobilienpreise für alle Postleitzahlen in England',
'Property price map for England - Compare postcodes before viewing':
- 'Immobilienpreiskarte für England – Vergleichen Sie die Postleitzahlen vor der Ansicht',
+ 'Immobilienpreiskarte für England – Vergleiche Postleitzahlen vor der Besichtigung',
'Compare sold prices, estimated current value, price per square metre and local context across English postcodes before searching listings.':
- 'Vergleichen Sie die Verkaufspreise, den geschätzten aktuellen Wert, den Preis pro Quadratmeter und den lokalen Kontext in allen englischen Postleitzahlen, bevor Sie nach Angeboten suchen.',
+ 'Vergleiche die Verkaufspreise, den geschätzten aktuellen Wert, den Preis pro Quadratmeter und den lokalen Kontext in allen englischen Postleitzahlen, bevor du nach Angeboten suchst.',
'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 bildet die Verkaufspreise, den geschätzten aktuellen Wert, den Preis pro Quadratmeter, den Immobilientyp, die Grundfläche, den Besitz und den lokalen Kontext ab, sodass Käufer realistische Suchbereiche finden können, bevor sie Angebotsportale öffnen.',
+ 'Perfect Postcode zeigt Verkaufspreise, geschätzte aktuelle Werte, Preise pro Quadratmeter, Immobilientyp, Wohnfläche, Eigentumsform und lokalen Kontext, damit Käufer realistische Suchgebiete finden können, bevor sie Immobilienportale öffnen.',
'Screen historical sale prices and current-value estimates by postcode.':
- 'Überprüfen Sie historische Verkaufspreise und aktuelle Wertschätzungen nach Postleitzahl.',
+ 'Prüfe historische Verkaufspreise und aktuelle Wertschätzungen nach Postleitzahl.',
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
- 'Vergleichen Sie den Wert mit Pendelverkehr, Schulen, Breitband, Kriminalität, Lärm und Annehmlichkeiten.',
+ 'Vergleiche den Wert mit Pendelzeit, Schulen, Breitband, Kriminalität, Lärm und Angeboten vor Ort.',
'Build a shortlist before spending weekends on viewings.':
- 'Erstellen Sie eine Auswahlliste, bevor Sie die Wochenenden mit Besichtigungen verbringen.',
+ 'Erstelle eine Auswahlliste, bevor du die Wochenenden mit Besichtigungen verbringst.',
'Find postcodes that fit the budget before listings appear':
- 'Finden Sie Postleitzahlen, die zum Budget passen, bevor Einträge erscheinen',
+ 'Finde Postleitzahlen, die zum Budget passen, bevor Inserate erscheinen',
'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.':
- 'Beginnen Sie mit einem Höchstpreis und einem Immobilientyp und färben Sie die Karte dann nach dem Preis pro Quadratmeter oder dem geschätzten aktuellen Preis ein. Dies hilft dabei, Bereiche aufzudecken, in denen in der Vergangenheit ähnliche Häuser in Reichweite gehandelt wurden, auch wenn es heute keine Live-Einträge gibt.',
+ 'Beginne mit einem Höchstpreis und einem Immobilientyp und färbe die Karte dann nach Preis pro Quadratmeter oder geschätztem aktuellem Preis ein. So erkennst du Gebiete, in denen ähnliche Immobilien historisch preislich in Reichweite lagen, auch wenn es heute keine Live-Inserate gibt.',
'Filter by last known sale price, estimated current value, property type, tenure, and floor area.':
- 'Filtern Sie nach dem letzten bekannten Verkaufspreis, dem geschätzten aktuellen Wert, der Immobilienart, der Eigentumsform und der Wohnfläche.',
+ 'Filtere nach dem letzten bekannten Verkaufspreis, dem geschätzten aktuellen Wert, der Immobilienart, der Eigentumsform und der Wohnfläche.',
'Compare nearby postcodes using the same criteria instead of relying on area reputation.':
- 'Vergleichen Sie nahegelegene Postleitzahlen anhand derselben Kriterien, anstatt sich auf die Reputation der Region zu verlassen.',
+ 'Vergleiche nahegelegene Postleitzahlen anhand derselben Kriterien, statt dich auf den Ruf eines Gebiets zu verlassen.',
'Use the results as a shortlist for listing alerts, local research, and viewings.':
- 'Verwenden Sie die Ergebnisse als Auswahlliste für Angebotsbenachrichtigungen, lokale Recherchen und Besichtigungen.',
- 'Separate cheap from good value':
- 'Unterscheiden Sie günstig von gutem Preis-Leistungs-Verhältnis',
+ 'Verwende die Ergebnisse als Auswahlliste für Angebotsbenachrichtigungen, lokale Recherchen und Besichtigungen.',
+ 'Separate cheap from good value': 'Unterscheide günstig von gutem Preis-Leistungs-Verhältnis',
'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 isn’t automatically treated as the best option.':
- 'Ein niedrigerer Preis kann auf kleinere Häuser, schwächere Transportmöglichkeiten, mehr Lärm oder weniger lokale Dienstleistungen zurückzuführen sein. Die Karte macht diese Kompromisse sichtbar, sodass die günstigste Postleitzahl nicht automatisch als beste Option behandelt wird.',
+ 'Ein niedrigerer Preis kann kleinere Immobilien, schlechtere Verkehrsanbindung, mehr Lärm oder weniger Angebote vor Ort bedeuten. Die Karte macht diese Kompromisse sichtbar, sodass die günstigste Postleitzahl nicht automatisch als beste Option gilt.',
'Start from area value, not listing availability':
- 'Beginnen Sie mit dem Wert eines Gebiets, nicht mit der Verfügbarkeit von Angeboten',
+ 'Beginne mit dem Wert eines Gebiets, nicht mit der Verfügbarkeit von Angeboten',
'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.':
- 'Immobilienportale zeigen nur Häuser, die heute zum Verkauf stehen. Eine Immobilienpreiskarte auf Postleitzahlenebene ermöglicht es Ihnen, größere Gebiete zu vergleichen, lokale Preismuster zu verstehen und keine Orte zu verpassen, an denen das nächste passende Angebot erscheinen könnte.',
- 'Use prices alongside real constraints':
- 'Nutzen Sie Preise zusammen mit realen Anforderungen',
+ 'Immobilienportale zeigen nur Immobilien, die gerade zum Verkauf stehen. Eine Immobilienpreiskarte auf Postleitzahlenebene hilft dir, größere Gebiete zu vergleichen, lokale Preismuster zu verstehen und Orte nicht zu verpassen, an denen das nächste passende Inserat erscheinen könnte.',
+ 'Use prices alongside real constraints': 'Nutze Preise zusammen mit realen Anforderungen',
'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.':
- 'Das Budget allein zählt selten. Perfect Postcode kombiniert Preisfilter mit Reisezeit, Schulqualität, Wohnfläche, Energieeffizienz, lokaler Umgebung und Dienstleistungen, sodass Ihre Auswahlliste widerspiegelt, wie Sie tatsächlich leben möchten.',
+ 'Das Budget allein reicht selten aus. Perfect Postcode kombiniert Preisfilter mit Fahrzeit, Schulqualität, Wohnfläche, Energieeffizienz, lokalem Umfeld und Infrastruktur, sodass deine Auswahlliste widerspiegelt, wie du tatsächlich leben möchtest.',
'What the price data is for': 'Wozu dienen die Preisdaten?',
'Use the map to compare areas and spot search candidates. It isn’t a valuation, mortgage decision, survey, legal search, or live listing feed.':
- 'Nutzen Sie die Karte, um Gebiete zu vergleichen und Suchkandidaten zu erkennen. Es handelt sich nicht um eine Wertermittlung, eine Hypothekenentscheidung, ein Gutachten, eine rechtliche Prüfung oder einen Live-Angebots-Feed.',
- 'How to validate a promising area': 'So validieren Sie ein vielversprechendes Gebiet',
+ 'Nutze die Karte, um Gebiete zu vergleichen und Suchkandidaten zu erkennen. Sie ist keine Wertermittlung, keine Hypothekenentscheidung, kein Gutachten, keine rechtliche Prüfung und kein Live-Inseratsfeed.',
+ 'How to validate a promising area': 'So prüfst du ein vielversprechendes Gebiet',
'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.':
- 'Sobald eine Postleitzahl vielversprechend aussieht, prüfen Sie aktuelle Angebote, Vergleichswerte zu Verkaufspreisen, Maklerdetails, Hochwasser-Recherchen, rechtliche Unterlagen, Gutachten und Informationen der örtlichen Behörden, bevor Sie eine Entscheidung treffen.',
+ 'Sobald eine Postleitzahl vielversprechend aussieht, prüfe aktuelle Inserate, vergleichbare Verkaufspreise, Maklerangaben, Hochwasserprüfungen, rechtliche Unterlagen, Gutachten und Informationen der örtlichen Behörden, bevor du eine Entscheidung triffst.',
'Is this a replacement for Rightmove or Zoopla?':
'Ist dies ein Ersatz für Rightmove oder Zoopla?',
'No. Use it before and alongside listing portals. Perfect Postcode helps decide where to look; listing portals show what’s currently for sale.':
- 'Nein. Verwenden Sie es vor und neben Immobilienportalen. Perfect Postcode hilft bei der Entscheidung, wo gesucht werden soll. Immobilienportale zeigen, was gerade zum Verkauf steht.',
+ 'Nein. Nutze es vor und neben Immobilienportalen. Perfect Postcode hilft dir zu entscheiden, wo du suchen solltest; Immobilienportale zeigen, was gerade zum Verkauf steht.',
'Can I compare price with schools or commute time?':
'Kann ich den Preis mit Schulen oder der Pendelzeit vergleichen?',
'Yes. Price filters can be combined with travel-time, schools, crime, broadband, road-noise, amenities, and environment filters.':
- 'Ja. Preisfilter können mit Reisezeit-, Schul-, Kriminalitäts-, Breitband-, Straßenlärm-, Ausstattungs- und Umgebungsfiltern kombiniert werden.',
+ 'Ja. Preisfilter können mit Fahrzeit-, Schul-, Kriminalitäts-, Breitband-, Straßenlärm-, Infrastruktur- und Umweltfiltern kombiniert werden.',
'Does the map cover all of the UK?': 'Deckt die Karte ganz Großbritannien ab?',
'The current product focuses on England because several core property and postcode datasets are England-specific.':
'Das aktuelle Produkt konzentriert sich auf England, da mehrere zentrale Datensätze zu Immobilien und Postleitzahlen spezifisch für England sind.',
@@ -169,205 +184,203 @@ const de: Translations = {
'Ein praktisches Beispiel für den Ausgleich von Preis-, Pendel- und Familienkompromissen.',
'Data sources and coverage': 'Datenquellen und Abdeckung',
'See which datasets sit behind the postcode filters and where they have limits.':
- 'Sehen Sie, welche Datensätze sich hinter den Postleitzahlenfiltern befinden und wo diese Grenzen haben.',
+ 'Sieh, welche Datensätze sich hinter den Postleitzahlenfiltern befinden und wo diese Grenzen haben.',
Methodology: 'Methodik',
'Understand how the map is intended to support shortlisting, not replace due diligence.':
- 'Verstehen Sie, dass die Karte die Auswahl von Kandidaten unterstützen und nicht die Due Diligence ersetzen soll.',
+ 'Verstehe, dass die Karte die Vorauswahl unterstützen und nicht die sorgfältige Prüfung ersetzen soll.',
'Postcode checker': 'Postleitzahlenprüfer',
'Check one postcode before you spend time on a viewing.':
- 'Überprüfen Sie eine Postleitzahl, bevor Sie Zeit für eine Besichtigung aufwenden.',
- 'Explore the property map': 'Entdecken Sie die Immobilienkarte',
+ 'Überprüfe eine Postleitzahl, bevor du Zeit für eine Besichtigung aufwendest.',
+ 'Explore the property map': 'Entdecke die Immobilienkarte',
'Postcode property search': 'Immobiliensuche nach Postleitzahlen',
'Find postcodes that match your property search criteria':
- 'Finden Sie Postleitzahlen, die Ihren Immobiliensuchkriterien entsprechen',
+ 'Finde Postleitzahlen, die deinen Immobiliensuchkriterien entsprechen',
'Postcode property search - Find areas that match your criteria':
- 'Immobiliensuche nach Postleitzahlen – Finden Sie Gebiete, die Ihren Kriterien entsprechen',
+ 'Immobiliensuche nach Postleitzahlen – Finde Gebiete, die zu deinen Kriterien passen',
'Search every postcode by budget, property type, floor area, tenure, commute, schools, crime, broadband, noise, parks and local amenities.':
- 'Durchsuchen Sie jede Postleitzahl nach Budget, Immobilientyp, Wohnfläche, Eigentumsform, Pendelweg, Schulen, Kriminalität, Breitband, Lärm, Parks und örtlichen Annehmlichkeiten.',
+ 'Durchsuche jede Postleitzahl nach Budget, Immobilientyp, Wohnfläche, Eigentumsform, Pendelweg, Schulen, Kriminalität, Breitband, Lärm, Parks und Angeboten vor Ort.',
'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.':
- 'Durchsuchen Sie jede Postleitzahl nach Budget, Immobilientyp, Größe, Eigentumsform, Pendelweg, Schulen, Kriminalität, Breitband, Lärm, Parks und örtlichen Annehmlichkeiten, anstatt die Gebiete einzeln zu überprüfen.',
+ 'Durchsuche jede Postleitzahl nach Budget, Immobilientyp, Größe, Eigentumsform, Pendelweg, Schulen, Kriminalität, Breitband, Lärm, Parks und Angeboten vor Ort, statt Gebiete einzeln zu prüfen.',
'Filter England-wide postcode data from one map.':
- 'Filtern Sie englandweite Postleitzahlendaten aus einer Karte.',
+ 'Filtere englandweite Postleitzahlendaten auf einer einzigen Karte.',
'Shortlist unfamiliar areas with comparable evidence.':
- 'Nehmen Sie unbekannte Gebiete mit vergleichbaren Belegen in die engere Auswahl.',
+ 'Nimm unbekannte Gebiete mit vergleichbaren Belegen in die engere Auswahl.',
'Save and share search areas before booking viewings.':
- 'Speichern und teilen Sie Suchbereiche, bevor Sie Besichtigungen buchen.',
+ 'Speichere und teile Suchbereiche, bevor du Besichtigungen buchst.',
'Turn a broad brief into postcode candidates':
- 'Verwandeln Sie einen umfassenden Auftrag in Postleitzahlenkandidaten',
+ 'Verwandle ein grobes Suchprofil in Postleitzahl-Kandidaten',
'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.':
- 'Geben Sie zunächst die praktischen Einschränkungen ein: Budget, Wohnfläche, Eigentumsform, Reisezeit, Schulbedarf, Breitbandanschluss und Toleranz gegenüber Straßenlärm oder Kriminalität. Die Karte entfernt Orte, die diese Einschränkungen nicht erfüllen, und sorgt dafür, dass die verbleibenden Optionen vergleichbar bleiben.',
- 'Relax one constraint at a time': 'Lockern Sie eine Einschränkung nach der anderen',
+ 'Gib zuerst die praktischen Anforderungen ein: Budget, Wohnfläche, Eigentumsform, Fahrzeit, Schulanforderungen, Breitband und Toleranz gegenüber Straßenlärm oder Kriminalität. Die Karte entfernt Orte, die diese Anforderungen nicht erfüllen, und hält die verbleibenden Optionen vergleichbar.',
+ 'Relax one constraint at a time': 'Lockere eine Einschränkung nach der anderen',
'When the search becomes too narrow, loosen a single filter and watch which postcodes reappear. This makes compromise explicit instead of relying on guesswork.':
- 'Wenn die Suche zu eng wird, lockern Sie einen einzelnen Filter und beobachten Sie, welche Postleitzahlen wieder auftauchen. Dies macht Kompromisse explizit, anstatt sich auf Vermutungen zu verlassen.',
+ 'Wenn die Suche zu eng wird, lockere einen einzelnen Filter und beobachte, welche Postleitzahlen wieder auftauchen. Dies macht Kompromisse explizit, anstatt sich auf Vermutungen zu verlassen.',
'Turn vague areas into specific postcodes':
- 'Verwandeln Sie unklare Gebiete in konkrete Postleitzahlen',
+ 'Verwandle unklare Gebiete in konkrete Postleitzahlen',
'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.':
- 'Bei umfangreichen Stadt- oder Bezirkssuchen verbergen sich große Unterschiede zwischen den Straßen. Perfect Postcode hilft Ihnen, von einem allgemeinen Gebiet zu Postleitzahlen zu gelangen, die Ihren harten Anforderungen entsprechen.',
- 'Keep trade-offs visible': 'Halten Sie Kompromisse sichtbar',
+ 'Breite Stadt- oder Bezirkssuchen verdecken große Unterschiede zwischen einzelnen Straßen. Perfect Postcode hilft dir, von einem allgemeinen Gebiet zu Postleitzahlen zu gelangen, die deine festen Anforderungen erfüllen.',
+ 'Keep trade-offs visible': 'Halte Kompromisse sichtbar',
'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.':
- 'Wenn es zu viele oder zu wenige Übereinstimmungen gibt, passen Sie jeweils eine Einschränkung an und sehen Sie genau, welche Postleitzahlen wieder angezeigt werden. Das macht Kompromisse explizit, anstatt sich auf Vermutungen zu verlassen.',
+ 'Wenn es zu viele oder zu wenige Treffer gibt, passe jeweils eine Anforderung an und sieh genau, welche Postleitzahlen wieder auftauchen. So werden Kompromisse sichtbar, statt auf Vermutungen zu beruhen.',
'Why postcode-level comparison matters':
'Warum der Vergleich auf Postleitzahlenebene wichtig ist',
'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.':
'Zwei nahegelegene Postleitzahlen können sich hinsichtlich Schulen, Straßenlärm, Verkehrsanbindung, Immobilienmix und Preis unterscheiden. Ein Vergleich auf Postleitzahlenebene verringert die Wahrscheinlichkeit, dass eine ganze Stadt als ein einheitlicher Markt behandelt wird.',
- 'How to use the results': 'So nutzen Sie die Ergebnisse',
+ 'How to use the results': 'So nutzt du die Ergebnisse',
'Treat matching postcodes as a research queue: check live listings, visit streets, confirm schools and admissions, and review current official sources.':
- 'Behandeln Sie übereinstimmende Postleitzahlen wie eine Recherchewarteschlange: Überprüfen Sie Live-Einträge, besuchen Sie Straßen, bestätigen Sie Schulen und Zulassungen und überprüfen Sie aktuelle offizielle Quellen.',
+ 'Behandle passende Postleitzahlen wie eine Recherche-Liste: Prüfe Live-Inserate, besuche Straßen, bestätige Schulen und Aufnahmebedingungen und sieh aktuelle offizielle Quellen nach.',
'Can I save a postcode property search?':
'Kann ich eine Postleitzahlen-Immobiliensuche speichern?',
'Yes. Licensed users can save searches and return to them later. Saved searches are designed for shortlists and comparison notes.':
- 'Ja. Lizenzierte Benutzer können Suchanfragen speichern und später darauf zurückgreifen. Gespeicherte Suchen sind für Auswahllisten und Vergleichsnotizen konzipiert.',
+ 'Ja. Lizenzierte Nutzer können Suchen speichern und später darauf zurückgreifen. Gespeicherte Suchen sind für Auswahllisten und Vergleichsnotizen gedacht.',
'Can I search without knowing the area?': 'Kann ich suchen, ohne die Gegend zu kennen?',
'Yes. The map is designed to surface unfamiliar areas that match practical constraints, not just places you already know.':
- 'Ja. Die Karte ist so konzipiert, dass sie unbekannte Gebiete aufzeigt, die den praktischen Gegebenheiten entsprechen, und nicht nur Orte, die Sie bereits kennen.',
+ 'Ja. Die Karte ist darauf ausgelegt, unbekannte Gebiete sichtbar zu machen, die zu deinen praktischen Anforderungen passen, nicht nur Orte, die du bereits kennst.',
'Are the results live property listings?':
'Handelt es sich bei den Ergebnissen um Live-Immobilienanzeigen?',
'No. The tool compares postcode data and historical/contextual property signals. You still need listing portals for current availability.':
- 'Nein. Das Tool vergleicht Postleitzahlendaten und historische/kontextbezogene Immobiliensignale. Für die aktuelle Verfügbarkeit benötigen Sie weiterhin Immobilienportale.',
+ 'Nein. Das Werkzeug vergleicht Postleitzahlendaten und historische sowie kontextbezogene Immobiliensignale. Für aktuelle Verfügbarkeit brauchst du weiterhin Immobilienportale.',
'Manchester property search guide': 'Leitfaden zur Immobiliensuche in Manchester',
'A regional guide for narrowing a broad search around Greater Manchester.':
'Ein regionaler Leitfaden zur Eingrenzung einer umfassenden Suche im Großraum Manchester.',
- 'Start a postcode search': 'Starten Sie eine Postleitzahlensuche',
+ 'Start a postcode search': 'Starte eine Postleitzahlensuche',
'Commute property search': 'Pendler-Immobiliensuche',
- 'Search for places to live by commute time': 'Suchen Sie nach Wohnorten nach Pendelzeit',
+ 'Search for places to live by commute time': 'Suche nach Wohnorten nach Pendelzeit',
'Commute property search - Find places to live by travel time':
- 'Pendler-Immobiliensuche – Finden Sie Wohnorte nach Reisezeit',
+ 'Pendel-Immobiliensuche – Finde Wohnorte nach Fahrzeit',
'Filter postcodes by commute time, then compare price, schools, safety, broadband, road noise, parks and property data on one map.':
- 'Filtern Sie Postleitzahlen nach Pendelzeit und vergleichen Sie dann Preise, Schulen, Sicherheit, Breitband, Straßenlärm, Parks und Grundstücksdaten auf einer Karte.',
+ 'Filtere Postleitzahlen nach Pendelzeit und vergleiche dann Preise, Schulen, Sicherheit, Breitband, Straßenlärm, Parks und Immobiliendaten auf einer Karte.',
'Filter postcodes by modelled car, cycling, walking, and public transport travel times, then layer on property price, schools, crime, broadband, noise, and local amenities.':
- 'Filtern Sie Postleitzahlen nach modellierten Fahrzeiten für Autos, Radfahrer, Fußgänger und öffentliche Verkehrsmittel und fügen Sie dann Immobilienpreise, Schulen, Kriminalität, Breitband, Lärm und örtliche Annehmlichkeiten hinzu.',
+ 'Filtere Postleitzahlen nach modellierten Fahrzeiten für Auto, Fahrrad, Fußwege und öffentlichen Verkehr und ergänze Immobilienpreise, Schulen, Kriminalität, Breitband, Lärm und Angebote vor Ort.',
'Compare reachable postcodes by realistic travel-time bands.':
- 'Vergleichen Sie erreichbare Postleitzahlen anhand realistischer Reisezeitbereiche.',
+ 'Vergleiche erreichbare Postleitzahlen anhand realistischer Fahrzeitspannen.',
'Search by destination first, then filter for property and neighbourhood fit.':
- 'Suchen Sie zuerst nach Reiseziel und filtern Sie dann nach der passenden Immobilie und Nachbarschaft.',
+ 'Suche zuerst nach dem Ziel und filtere dann nach passender Immobilie und Nachbarschaft.',
'Avoid areas that look close on a map but fail the daily journey.':
- 'Vermeiden Sie Gebiete, die auf einer Karte nah aussehen, aber bei der täglichen Fahrt durchfallen.',
- 'Start with the destination that matters': 'Beginnen Sie mit dem Ziel, das zählt',
+ 'Vermeide Gebiete, die auf einer Karte nah aussehen, aber bei der täglichen Fahrt durchfallen.',
+ 'Start with the destination that matters': 'Beginne mit dem Ziel, das zählt',
'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 doesn’t work.':
- 'Wählen Sie ein Pendelziel, ein Verkehrsmittel und einen Zeitrahmen aus und fügen Sie dann die Immobilienfilter hinzu. Dadurch wird verhindert, dass ein günstig wirkendes Gebiet in die engere Wahl kommt, wenn die tägliche Anreise nicht klappt.',
+ 'Wähle ein Pendelziel, ein Verkehrsmittel und einen Zeitrahmen aus und füge dann die Immobilienfilter hinzu. Dadurch wird verhindert, dass ein günstig wirkendes Gebiet in die engere Wahl kommt, wenn die tägliche Anreise nicht klappt.',
'Compare the commute against the rest of daily life':
- 'Vergleichen Sie den Weg zur Arbeit mit dem Rest des täglichen Lebens',
+ 'Vergleiche den Weg zur Arbeit mit dem Rest des täglichen Lebens',
'A fast commute isn’t enough if the property size, school context, safety threshold, broadband, or road-noise exposure don’t fit. The map keeps those signals side by side.':
'Ein schnelles Pendeln reicht nicht aus, wenn Wohnfläche, Schulkontext, Sicherheitsschwelle, Breitband oder Straßenlärm nicht passen. Die Karte zeigt diese Signale nebeneinander an.',
'Commute from postcodes, not just place names':
- 'Pendeln Sie über Postleitzahlen, nicht nur über Ortsnamen',
+ 'Pendle über Postleitzahlen, nicht nur über Ortsnamen',
'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.':
- 'Zwei Straßen in derselben Stadt können sehr unterschiedliche Bahnanbindungen, Straßenrouten und ÖPNV-Optionen haben. Durch die Reisezeitfilterung auf Postleitzahlenebene bleibt dieser Unterschied sichtbar.',
+ 'Zwei Straßen in derselben Stadt können sehr unterschiedliche Bahnhofsanbindungen, Straßenrouten und ÖPNV-Optionen haben. Fahrzeitfilter auf Postleitzahlenebene halten diesen Unterschied sichtbar.',
'Balance journey time with the rest of the move':
- 'Gleichen Sie die Reisezeit mit dem Rest des Umzugs aus',
+ 'Wäge die Fahrzeit gegen den Rest des Umzugs ab',
'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.':
- 'Ein schnelles Pendeln hilft nur, wenn die Gegend auch zu Ihrem Budget, Ihren Wohnbedürfnissen, Ihren Schulpräferenzen, Ihrer Sicherheitsschwelle, Ihrem Breitbandbedarf und Ihrer Toleranz gegenüber Straßenlärm passt.',
- 'How travel-time filters should be interpreted':
- 'Wie Reisezeitfilter interpretiert werden sollten',
+ 'Ein schnelles Pendeln hilft nur, wenn die Gegend auch zu deinem Budget, deinen Wohnbedürfnissen, deinen Schulpräferenzen, deiner Sicherheitsschwelle, deinem Breitbandbedarf und deiner Toleranz gegenüber Straßenlärm passt.',
+ 'How travel-time filters should be interpreted': 'Wie Fahrzeitfilter zu verstehen sind',
'Travel-time modelling is useful for comparing areas consistently. Before committing, check current timetables, disruption patterns, parking, cycling conditions, and walking routes.':
- 'Die Reisezeitmodellierung ist nützlich, um Gebiete konsistent zu vergleichen. Bevor Sie sich festlegen, prüfen Sie aktuelle Fahrpläne, Störungsmuster, Parkmöglichkeiten, Radfahrbedingungen und Fußwege.',
+ 'Fahrzeitmodellierung hilft, Gebiete konsistent zu vergleichen. Bevor du dich festlegst, prüfe aktuelle Fahrpläne, Störungsmuster, Parkmöglichkeiten, Radbedingungen und Fußwege.',
'Why commute filters are combined with property data':
'Warum Pendelfilter mit Immobiliendaten kombiniert werden',
'Commute search is most useful when it removes impossible areas while still showing whether the remaining options are affordable and liveable.':
- 'Die Pendelsuche ist am nützlichsten, wenn sie unmögliche Bereiche entfernt und gleichzeitig anzeigt, ob die verbleibenden Optionen erschwinglich und lebenswert sind.',
+ 'Die Pendelsuche ist am nützlichsten, wenn sie ungeeignete Gebiete ausschließt und zugleich zeigt, ob die verbleibenden Optionen bezahlbar und lebenswert sind.',
'Can I compare car, cycling, walking, and public transport?':
'Kann ich Auto, Fahrrad, Zu-Fuß-Gehen und öffentliche Verkehrsmittel vergleichen?',
'The product supports multiple travel modes where precomputed destination data is available.':
- 'Das Produkt unterstützt mehrere Reisemodi, bei denen vorberechnete Zieldaten verfügbar sind.',
- 'Are travel times exact?': 'Sind die Reisezeiten genau?',
+ 'Das Produkt unterstützt mehrere Verkehrsmittel, sofern vorberechnete Zieldaten verfügbar sind.',
+ 'Are travel times exact?': 'Sind die Fahrzeiten genau?',
'No. Treat them as a consistent comparison model, then verify the real route before making viewing or purchase decisions.':
- 'Nein. Behandeln Sie sie als konsistentes Vergleichsmodell und überprüfen Sie dann die tatsächliche Route, bevor Sie eine Besichtigungs- oder Kaufentscheidung treffen.',
+ 'Nein. Behandle sie als konsistentes Vergleichsmodell und überprüfe dann die tatsächliche Route, bevor du eine Besichtigungs- oder Kaufentscheidung triffst.',
'Can I combine commute filters with schools and price?':
'Kann ich Pendelfilter mit Schulen und Preis kombinieren?',
'Yes. The commute filter can be layered with property price, size, schools, broadband, crime, amenities, and environmental signals.':
- 'Ja. Der Pendelfilter lässt sich mit Immobilienpreis, Größe, Schulen, Breitband, Kriminalität, Ausstattung und Umweltsignalen kombinieren.',
+ 'Ja. Der Pendelfilter lässt sich mit Immobilienpreis, Größe, Schulen, Breitband, Kriminalität, Infrastruktur und Umweltsignalen kombinieren.',
'Bristol property search guide': 'Leitfaden zur Immobiliensuche in Bristol',
'A worked example for balancing city access, price, and local context.':
'Ein praktisches Beispiel für den Ausgleich von Stadterreichbarkeit, Preis und lokalem Kontext.',
'Search by commute time': 'Suche nach Pendelzeit',
'Schools and property search': 'Suche nach Schulen und Immobilien',
'Find property search areas with schools and family trade-offs in view':
- 'Finden Sie Immobiliensuchgebiete mit Blick auf Schulen und Familienkompromisse',
+ 'Finde Immobiliensuchgebiete mit Blick auf Schulen und Familienkompromisse',
'School property search - Compare postcodes for family moves':
- 'Schulorientierte Immobiliensuche – Vergleichen Sie Postleitzahlen für Familienumzüge',
+ 'Schulorientierte Immobiliensuche – Vergleiche Postleitzahlen für Familienumzüge',
'Compare nearby schools, property size, prices, parks, safety, commute and local amenities before building a viewing shortlist.':
- 'Vergleichen Sie Schulen in der Nähe, Wohnfläche, Preise, Parks, Sicherheit, Pendelweg und örtliche Annehmlichkeiten, bevor Sie eine Besichtigungs-Auswahlliste erstellen.',
+ 'Vergleiche nahegelegene Schulen, Wohnfläche, Preise, Parks, Sicherheit, Pendelweg und Angebote vor Ort, bevor du eine Besichtigungs-Auswahlliste erstellst.',
'Compare nearby Ofsted ratings, education context, property size, budget, safety, parks, commute, and local amenities before narrowing your viewing shortlist.':
- 'Vergleichen Sie Ofsted-Bewertungen in der Nähe, den Bildungskontext, die Wohnfläche, das Budget, die Sicherheit, Parks, den Pendelweg und örtliche Annehmlichkeiten, bevor Sie Ihre Besichtigungs-Auswahlliste eingrenzen.',
+ 'Vergleiche nahegelegene Ofsted-Bewertungen, Bildungskontext, Wohnfläche, Budget, Sicherheit, Parks, Pendelweg und Angebote vor Ort, bevor du deine Besichtigungs-Auswahlliste eingrenzt.',
'Filter for nearby school quality alongside housing requirements.':
- 'Filtern Sie nach der Qualität von Schulen in der Nähe zusammen mit den Wohnanforderungen.',
+ 'Filtere nach der Qualität von Schulen in der Nähe zusammen mit den Wohnanforderungen.',
'Compare family-friendly trade-offs across unfamiliar postcodes.':
- 'Vergleichen Sie familienfreundliche Kompromisse über unbekannte Postleitzahlen hinweg.',
+ 'Vergleiche familienfreundliche Kompromisse über unbekannte Postleitzahlen hinweg.',
'Use the map as a shortlist tool before checking admissions and catchments.':
- 'Nutzen Sie die Karte als Tool für die Auswahlliste, bevor Sie Zulassungen und Einzugsgebiete prüfen.',
+ 'Nutze die Karte als Werkzeug für die Vorauswahl, bevor du Aufnahmebedingungen und Einzugsgebiete prüfst.',
'Use school context without ignoring the home':
- 'Nutzen Sie den schulischen Kontext, ohne das Zuhause zu vernachlässigen',
+ 'Nutze den schulischen Kontext, ohne das Zuhause zu vernachlässigen',
'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.':
- 'Beginnen Sie mit Wohnfläche, Budget und Pendelbeschränkungen und ergänzen Sie dann die Qualität der nahegelegenen Schulen und den lokalen Kontext. Dadurch wird verhindert, dass schulgeführte Suchen Erschwinglichkeits- oder Alltagsprobleme verbergen.',
- 'Verify admissions before deciding':
- 'Überprüfen Sie die Zulassungen, bevor Sie eine Entscheidung treffen',
+ 'Beginne mit Wohnfläche, Budget und Pendelanforderungen und ergänze dann die Qualität nahegelegener Schulen und den lokalen Kontext. So verhindern schulorientierte Suchen, dass Bezahlbarkeit oder Alltagsprobleme ausgeblendet werden.',
+ 'Verify admissions before deciding': 'Prüfe die Aufnahmebedingungen, bevor du entscheidest',
'School data can point to promising areas, but admissions rules and catchments can change. Confirm current arrangements with schools and local authorities.':
- 'Schuldaten können auf vielversprechende Gebiete hinweisen, aber Zulassungsregeln und Einzugsgebiete können sich ändern. Bestätigen Sie aktuelle Vereinbarungen mit Schulen und lokalen Behörden.',
+ 'Schuldaten können auf vielversprechende Gebiete hinweisen, aber Aufnahmeregeln und Einzugsgebiete können sich ändern. Bestätige die aktuellen Regelungen bei Schulen und lokalen Behörden.',
'School quality is one part of the shortlist':
'Die Schulqualität ist ein Teil der engeren Auswahl',
'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.':
- 'Mit Perfect Postcode können Sie die Daten naheliegender Schulen mit den anderen praktischen Einschränkungen vergleichen, die einen Familienumzug beeinflussen: Platz, Preis, Pendelweg, Parks, Sicherheit und örtliche Dienstleistungen.',
+ 'Mit Perfect Postcode kannst du Daten nahegelegener Schulen mit anderen praktischen Anforderungen vergleichen, die einen Familienumzug prägen: Platz, Preis, Pendelweg, Parks, Sicherheit und Angebote vor Ort.',
'Check catchments before making decisions':
- 'Überprüfen Sie die Einzugsgebiete, bevor Sie Entscheidungen treffen',
+ 'Überprüfe die Einzugsgebiete, bevor du Entscheidungen triffst',
'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.':
- 'Zulassungsregeln und Einzugsgebietsgrenzen können sich ändern. Verwenden Sie Schuldaten auf Postleitzahlenebene, um vielversprechende Gebiete zu finden, und überprüfen Sie dann die aktuellen Zulassungsdaten bei der Schule oder der örtlichen Behörde.',
- 'How to treat school filters': 'Wie man Schulfilter behandelt',
+ 'Aufnahmeregeln und Einzugsgebietsgrenzen können sich ändern. Nutze Schuldaten auf Postleitzahlenebene, um vielversprechende Gebiete zu finden, und prüfe dann die aktuellen Aufnahmedetails bei der Schule oder der örtlichen Behörde.',
+ 'How to treat school filters': 'Wie du Schulfilter einordnest',
'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.':
- 'Verwenden Sie Schulfilter, um die Recherche einzugrenzen und nicht, um eine Zulassungsberechtigung anzunehmen. Bewertungen, Entfernung, Zulassungskriterien und Schulkapazität sollten anhand aktueller offizieller Quellen überprüft werden.',
+ 'Verwende Schulfilter, um die Recherche einzugrenzen, nicht um eine Aufnahmeberechtigung anzunehmen. Bewertungen, Entfernung, Aufnahmekriterien und Schulkapazität solltest du mit aktuellen offiziellen Quellen prüfen.',
'Family trade-offs to compare': 'Familienkompromisse zum Vergleich',
'Combine schools with parks, road noise, crime, property size, commute, broadband, and price so the shortlist reflects the whole move.':
- 'Kombinieren Sie Schulen mit Parks, Straßenlärm, Kriminalität, Wohnfläche, Pendelweg, Breitband und Preis, damit die Auswahlliste den gesamten Umzug widerspiegelt.',
+ 'Kombiniere Schulen mit Parks, Straßenlärm, Kriminalität, Wohnfläche, Pendelweg, Breitband und Preis, damit die Auswahlliste den gesamten Umzug widerspiegelt.',
'Does this show school catchment guarantees?': 'Zeigt dies garantierte Schul-Einzugsgebiete?',
'No. It helps identify promising areas, but catchments and admissions must be verified with the school or local authority.':
- 'Nein. Es hilft dabei, vielversprechende Gebiete zu identifizieren, Einzugsgebiete und Zulassungen müssen jedoch bei der Schule oder der örtlichen Behörde überprüft werden.',
+ 'Nein. Es hilft dabei, vielversprechende Gebiete zu erkennen, aber Einzugsgebiete und Aufnahmebedingungen müssen bei der Schule oder der örtlichen Behörde geprüft werden.',
'Can I combine school filters with parks and safety?':
'Kann ich Schulfilter mit Parks und Sicherheit kombinieren?',
'Yes. School-aware search can be combined with crime, parks, commute, price, property size, and local services.':
- 'Ja. Die schulbezogene Suche kann mit Kriminalität, Parks, Pendelweg, Preis, Wohnfläche und lokalen Dienstleistungen kombiniert werden.',
+ 'Ja. Die schulbezogene Suche kann mit Kriminalität, Parks, Pendelweg, Preis, Wohnfläche und Angeboten vor Ort kombiniert werden.',
'Is Ofsted the only school signal?': 'Ist Ofsted das einzige Schulsignal?',
'No single score should decide a move. Use the map as a starting point, then review current school information in detail.':
- 'Kein einzelner Wert sollte über einen Umzug entscheiden. Nutzen Sie die Karte als Ausgangspunkt und sehen Sie sich dann die aktuellen Schulinformationen im Detail an.',
+ 'Kein einzelner Wert sollte über einen Umzug entscheiden. Nutze die Karte als Ausgangspunkt und sieh dir dann die aktuellen Schulinformationen im Detail an.',
'See where education, property, transport, and environment data comes from.':
- 'Sehen Sie, woher Bildungs-, Immobilien-, Transport- und Umweltdaten stammen.',
- 'Explore school-aware searches': 'Entdecken Sie schulbezogene Suchanfragen',
+ 'Sieh, woher Bildungs-, Immobilien-, Transport- und Umweltdaten stammen.',
+ 'Explore school-aware searches': 'Entdecke schulbezogene Suchanfragen',
'Check postcode data before you book a viewing':
- 'Überprüfen Sie die Postleitzahlendaten, bevor Sie eine Besichtigung buchen',
+ 'Überprüfe die Postleitzahlendaten, bevor du eine Besichtigung buchst',
'Postcode checker - Property, crime, broadband, noise and schools':
'Postleitzahlenprüfer – Immobilien, Kriminalität, Breitband, Lärm und Schulen',
'Check postcode-level property prices, EPC data, crime, broadband, road noise, schools, council tax, amenities and travel-time context.':
- 'Überprüfen Sie Immobilienpreise auf Postleitzahlenebene, EPC-Daten, Kriminalität, Breitband, Straßenlärm, Schulen, Council Tax, Annehmlichkeiten und Reisezeitkontext.',
+ 'Prüfe Immobilienpreise auf Postleitzahlenebene, EPC-Daten, Kriminalität, Breitband, Straßenlärm, Schulen, Council Tax, Angebote vor Ort und Fahrzeitkontext.',
'Review property prices, EPC context, crime, broadband, road noise, local amenities, schools, deprivation, council tax, and travel-time data from one postcode-first map.':
- 'Überprüfen Sie Immobilienpreise, EPC-Kontext, Kriminalität, Breitband, Straßenlärm, örtliche Annehmlichkeiten, Schulen, Deprivation, Council Tax und Reisezeitdaten auf einer postleitzahlenbasierten Karte.',
+ 'Prüfe Immobilienpreise, EPC-Kontext, Kriminalität, Breitband, Straßenlärm, Angebote vor Ort, Schulen, Benachteiligung, Council Tax und Fahrzeitdaten auf einer postleitzahlenbasierten Karte.',
'Check multiple local signals before visiting a street.':
- 'Überprüfen Sie mehrere örtliche Signale, bevor Sie eine Straße besuchen.',
+ 'Überprüfe mehrere örtliche Signale, bevor du eine Straße besuchst.',
'Use official and open datasets rather than reputation alone.':
- 'Nutzen Sie offizielle und offene Datensätze und nicht nur die Reputation.',
+ 'Nutze offizielle und offene Datensätze statt nur den Ruf eines Gebiets.',
'Compare postcodes consistently across England.':
- 'Vergleichen Sie Postleitzahlen einheitlich in ganz England.',
+ 'Vergleiche Postleitzahlen einheitlich in ganz England.',
'Check the street before spending a viewing slot':
- 'Prüfen Sie die Straße, bevor Sie einen Besichtigungstermin nutzen',
+ 'Prüfe die Straße, bevor du einen Besichtigungstermin nutzt',
'Use the postcode checker to review price history, local context, amenities, schools, and environment signals before you commit time to visiting.':
- 'Nutzen Sie den Postleitzahlen-Checker, um die Preisentwicklung, den lokalen Kontext, die Ausstattung, Schulen und Umgebungssignale zu überprüfen, bevor Sie sich Zeit für einen Besuch nehmen.',
- 'Compare neighbouring postcodes': 'Vergleichen Sie benachbarte Postleitzahlen',
+ 'Nutze den Postleitzahlenprüfer, um Preisentwicklung, lokalen Kontext, Angebote vor Ort, Schulen und Umweltsignale zu prüfen, bevor du Zeit in einen Besuch investierst.',
+ 'Compare neighbouring postcodes': 'Vergleiche benachbarte Postleitzahlen',
'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.':
- 'Wenn eine Postleitzahl vielversprechend aussieht, vergleichen Sie benachbarte Gebiete mit denselben Filtern. Dies zeigt oft, ob ein Problem straßenspezifisch ist oder Teil eines umfassenderen Musters.',
+ 'Wenn eine Postleitzahl vielversprechend aussieht, vergleiche benachbarte Gebiete mit denselben Filtern. Dies zeigt oft, ob ein Problem straßenspezifisch ist oder Teil eines umfassenderen Musters.',
'Useful before and alongside listing portals': 'Nützlich vor und neben Immobilienportalen',
'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.':
- 'Inseratsfotos verraten Ihnen selten genug über die umliegende Straße. Perfect Postcode bietet Ihnen eine evidenzbasierte Postleitzahlenprüfung, bevor Sie sich Zeit für eine Besichtigung nehmen.',
+ 'Inseratsfotos verraten dir selten genug über die umliegende Straße. Perfect Postcode bietet dir eine evidenzbasierte Postleitzahlenprüfung, bevor du dir Zeit für eine Besichtigung nimmst.',
'A screening tool, not professional advice':
- 'Ein Screening-Tool, keine professionelle Beratung',
+ 'Ein Prüfwerkzeug, keine professionelle Beratung',
'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.':
- 'Die Daten dienen der Auswahl und dem Vergleich. Für jeden Kauf sind weiterhin aktuelle Inseratsprüfungen, rechtliche Due-Diligence-Prüfungen, Hochwasserrecherchen, Kreditgeberanforderungen und Gutachterergebnisse erforderlich.',
+ 'Die Daten dienen der Vorauswahl und dem Vergleich. Für jeden Kauf sind weiterhin aktuelle Inseratsprüfungen, rechtliche Sorgfaltsprüfungen, Hochwasserprüfungen, Anforderungen des Kreditgebers und Gutachtenergebnisse erforderlich.',
'What a postcode check can catch': 'Was eine Postleitzahlenprüfung erkennen kann',
'A postcode check can surface price context, environmental signals, nearby amenities, and other local indicators that are easy to miss in a listing.':
- 'Eine Postleitzahlenprüfung kann Preiskontext, Umweltsignale, nahegelegene Annehmlichkeiten und andere lokale Indikatoren aufdecken, die in einem Inserat leicht übersehen werden.',
+ 'Eine Postleitzahlenprüfung kann Preiskontext, Umweltsignale, nahegelegene Angebote und andere lokale Hinweise sichtbar machen, die in einem Inserat leicht übersehen werden.',
'What a postcode check can’t prove': 'Was eine Postleitzahlenprüfung nicht beweisen kann',
'It can’t confirm the condition of a home, future development, legal title, lender requirements, or current street-level experience. Those still need direct checks.':
'Sie kann nicht den Zustand eines Hauses, künftige Bauvorhaben, den Rechtstitel, die Anforderungen des Kreditgebers oder den aktuellen Eindruck auf Straßenebene bestätigen. Diese erfordern weiterhin direkte Prüfungen.',
'Can I use the checker before a viewing?':
- 'Kann ich den Checker vor einer Besichtigung nutzen?',
+ 'Kann ich den Prüfer vor einer Besichtigung nutzen?',
'Yes. That’s one of the main use cases: screen the postcode first, then decide whether the viewing is worth the time.':
- 'Ja. Das ist einer der Hauptanwendungsfälle: Überprüfen Sie zuerst die Postleitzahl und entscheiden Sie dann, ob sich die Besichtigung lohnt.',
+ 'Ja. Das ist einer der Hauptanwendungsfälle: Überprüfe zuerst die Postleitzahl und entscheide dann, ob sich die Besichtigung lohnt.',
'Does the checker include exact property condition?':
'Enthält der Prüfer den genauen Zustand der Immobilie?',
'No. Property condition requires listing details, surveys, and direct inspection.':
@@ -375,200 +388,200 @@ const de: Translations = {
'Can I compare multiple postcodes?': 'Kann ich mehrere Postleitzahlen vergleichen?',
'Yes. The map is designed for consistent comparison across postcodes.':
'Ja. Die Karte ist für einen konsistenten Vergleich über mehrere Postleitzahlen hinweg konzipiert.',
- 'Check postcodes on the map': 'Überprüfen Sie die Postleitzahlen auf der Karte',
- 'Regional guide': 'Regionalführer',
+ 'Check postcodes on the map': 'Überprüfe die Postleitzahlen auf der Karte',
+ 'Regional guide': 'Regionaler Leitfaden',
'How to compare Birmingham postcodes before a property search':
- 'So vergleichen Sie die Postleitzahlen von Birmingham vor einer Immobiliensuche',
+ 'So vergleichst du die Postleitzahlen von Birmingham vor einer Immobiliensuche',
'Birmingham property search - Compare postcodes by price and commute':
- 'Immobiliensuche in Birmingham – Vergleichen Sie Postleitzahlen nach Preis und Pendelweg',
+ 'Immobiliensuche in Birmingham – Vergleiche Postleitzahlen nach Preis und Pendelweg',
'Use postcode-level data to compare Birmingham property prices, commute trade-offs, schools, crime, broadband and local amenities before viewings.':
- 'Nutzen Sie Daten auf Postleitzahlenebene, um Immobilienpreise in Birmingham, Pendel-Kompromisse, Schulen, Kriminalität, Breitband und örtliche Annehmlichkeiten vor Besichtigungen zu vergleichen.',
+ 'Nutze Daten auf Postleitzahlenebene, um Immobilienpreise in Birmingham, Pendelkompromisse, Schulen, Kriminalität, Breitband und Angebote vor Ort vor Besichtigungen zu vergleichen.',
'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.':
- 'Die Suche in Birmingham kann sich von Straße zu Straße schnell ändern. Nutzen Sie Belege auf Postleitzahlenebene, um Budget, Pendelweg, Schulen, Lärm, Kriminalität und örtliche Dienstleistungen zu vergleichen, bevor Sie entscheiden, wo Sie Inserate beobachten möchten.',
- 'Start with commute corridors': 'Beginnen Sie mit Pendelkorridoren',
+ 'Die Suche in Birmingham kann sich von Straße zu Straße schnell verändern. Nutze Belege auf Postleitzahlenebene, um Budget, Pendelweg, Schulen, Lärm, Kriminalität und Angebote vor Ort zu vergleichen, bevor du entscheidest, wo du Inserate beobachten möchtest.',
+ 'Start with commute corridors': 'Beginne mit Pendelkorridoren',
'Choose the destination that matters, such as a workplace, station, university, or hospital, then compare reachable postcodes by transport mode and travel-time band.':
- 'Wählen Sie das gewünschte Ziel aus, z. B. einen Arbeitsplatz, einen Bahnhof, eine Universität oder ein Krankenhaus, und vergleichen Sie dann erreichbare Postleitzahlen nach Verkehrsmittel und Reisezeitspanne.',
+ 'Wähle das wichtige Ziel, etwa Arbeitsplatz, Bahnhof, Universität oder Krankenhaus, und vergleiche dann erreichbare Postleitzahlen nach Verkehrsmittel und Fahrzeitspanne.',
'Use commute time as a hard filter before judging price.':
- 'Nutzen Sie die Pendelzeit als harten Filter, bevor Sie den Preis beurteilen.',
+ 'Nutze die Pendelzeit als harten Filter, bevor du den Preis beurteilst.',
'Compare public transport with car, cycling, or walking where available.':
- 'Vergleichen Sie öffentliche Verkehrsmittel mit dem Auto, dem Fahrrad oder zu Fuß, sofern verfügbar.',
+ 'Vergleiche öffentliche Verkehrsmittel mit dem Auto, dem Fahrrad oder zu Fuß, sofern verfügbar.',
'Check the route manually before booking viewings.':
- 'Überprüfen Sie die Route manuell, bevor Sie Besichtigungen buchen.',
- 'Compare price with property type': 'Vergleichen Sie den Preis mit dem Immobilientyp',
+ 'Überprüfe die Route manuell, bevor du Besichtigungen buchst.',
+ 'Compare price with property type': 'Vergleiche den Preis mit dem Immobilientyp',
'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.':
- 'Medianpreise allein können irreführend sein, wenn sich der lokale Immobilienmix ändert. Fügen Sie Filter für Immobilientyp, Eigentumsform, Wohnfläche und Preis hinzu, damit ähnliche Gebiete fair verglichen werden.',
+ 'Medianpreise allein können irreführend sein, wenn sich der lokale Immobilienmix ändert. Füge Filter für Immobilientyp, Eigentumsform, Wohnfläche und Preis hinzu, damit ähnliche Gebiete fair verglichen werden.',
'Keep family and environment trade-offs visible':
- 'Halten Sie die Kompromisse zwischen Familie und Umwelt sichtbar',
+ 'Halte Familien- und Umweltkompromisse sichtbar',
'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.':
- 'Überlagern Sie die Immobilienfilter mit Schulkontext, Parks, Straßenlärm, Breitband und Kriminalitätssignalen. Das erleichtert die Entscheidung, welche Kompromisse akzeptabel sind.',
+ 'Überlagere die Immobilienfilter mit Schulkontext, Parks, Straßenlärm, Breitband und Kriminalitätssignalen. Das erleichtert die Entscheidung, welche Kompromisse akzeptabel sind.',
'Can Perfect Postcode tell me the best area in Birmingham?':
'Kann mir Perfect Postcode die beste Gegend in Birmingham nennen?',
'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.':
- 'Kein Tool kann für jeden Käufer das beste Gebiet bestimmen. Es hilft Ihnen, Postleitzahlen mit Ihren eigenen Anforderungen abzugleichen, sodass Sie eine bessere Auswahlliste erstellen können.',
+ 'Kein Werkzeug kann für jeden Käufer das beste Gebiet bestimmen. Es hilft dir, Postleitzahlen mit deinen eigenen Anforderungen abzugleichen, damit du eine bessere Auswahlliste erstellen kannst.',
'Should I use this instead of local knowledge?':
'Sollte ich dies anstelle von lokalem Wissen verwenden?',
'No. Use it to find and compare candidates, then validate them with visits, local advice, listings, and official checks.':
- 'Nein. Verwenden Sie es, um Kandidaten zu finden und zu vergleichen, und validieren Sie sie dann durch Besuche, Beratung vor Ort, Inserate und offizielle Überprüfungen.',
+ 'Nein. Nutze es, um Kandidaten zu finden und zu vergleichen, und prüfe sie dann durch Besuche, Rat vor Ort, Inserate und offizielle Nachweise.',
'Compare price patterns before looking at live listings.':
- 'Vergleichen Sie Preismuster, bevor Sie sich Live-Angebote ansehen.',
+ 'Vergleiche Preismuster, bevor du dir Live-Angebote ansiehst.',
'Search by travel time and then layer on property requirements.':
- 'Suchen Sie nach Reisezeit und fügen Sie dann die Immobilienanforderungen hinzu.',
+ 'Suche nach Fahrzeit und ergänze dann die Immobilienanforderungen.',
'Understand how to interpret filters and limitations.':
- 'Verstehen Sie, wie Sie Filter und Einschränkungen interpretieren.',
- 'Compare Birmingham postcodes': 'Vergleichen Sie die Postleitzahlen von Birmingham',
+ 'Verstehe, wie du Filter und Einschränkungen interpretierst.',
+ 'Compare Birmingham postcodes': 'Vergleiche die Postleitzahlen von Birmingham',
'How to compare Manchester postcodes for a property search':
- 'So vergleichen Sie die Postleitzahlen von Manchester für eine Immobiliensuche',
+ 'So vergleichst du die Postleitzahlen von Manchester für eine Immobiliensuche',
'Manchester property search - Compare postcodes before viewing':
- 'Immobiliensuche in Manchester – Vergleichen Sie die Postleitzahlen vor der Besichtigung',
+ 'Immobiliensuche in Manchester – Vergleiche die Postleitzahlen vor der Besichtigung',
'Compare Manchester-area postcodes by budget, commute, property type, schools, broadband, crime, noise and amenities before booking viewings.':
- 'Vergleichen Sie Postleitzahlen im Raum Manchester nach Budget, Pendelweg, Immobilientyp, Schulen, Breitband, Kriminalität, Lärm und Ausstattung, bevor Sie Besichtigungen buchen.',
+ 'Vergleiche Postleitzahlen im Raum Manchester nach Budget, Pendelweg, Immobilientyp, Schulen, Breitband, Kriminalität, Lärm und Angeboten vor Ort, bevor du Besichtigungen buchst.',
'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.':
'Eine Suche im Raum Manchester kann Optionen im Stadtzentrum, in Vorstädten und für Pendler umfassen. Perfect Postcode trägt dazu bei, dass jede Postleitzahl unter den gleichen Immobilien- und Alltagsanforderungen vergleichbar bleibt.',
'Use travel time to define the real search area':
- 'Nutzen Sie die Reisezeit, um das tatsächliche Suchgebiet zu definieren',
+ 'Nutze Fahrzeit, um das tatsächliche Suchgebiet zu definieren',
'Start from the destinations that matter, then compare reachable postcodes rather than assuming every nearby place has the same practical journey.':
- 'Beginnen Sie mit den Zielen, die wichtig sind, und vergleichen Sie dann die erreichbaren Postleitzahlen, anstatt davon auszugehen, dass jeder Ort in der Nähe die gleiche praktische Anfahrt hat.',
+ 'Beginne mit den Zielen, die wichtig sind, und vergleiche dann die erreichbaren Postleitzahlen, anstatt davon auszugehen, dass jeder Ort in der Nähe die gleiche praktische Anfahrt hat.',
'Compare housing requirements before lifestyle preferences':
- 'Vergleichen Sie zunächst die Wohnanforderungen und dann Ihre Lebensstilpräferenzen',
+ 'Vergleiche zunächst die Wohnanforderungen und dann deine Lebensstilpräferenzen',
'Filter by property type, floor area, tenure, and price before judging amenities. That keeps the shortlist grounded in homes that could realistically work.':
- 'Filtern Sie nach Immobilientyp, Wohnfläche, Eigentumsform und Preis, bevor Sie die Ausstattung beurteilen. Dadurch bleibt die Auswahlliste auf Häuser beschränkt, die realistisch in Frage kommen.',
- 'Check local context consistently': 'Überprüfen Sie den lokalen Kontext konsequent',
+ 'Filtere nach Immobilientyp, Wohnfläche, Eigentumsform und Preis, bevor du Angebote vor Ort bewertest. So bleibt die Auswahlliste auf Immobilien beschränkt, die realistisch infrage kommen.',
+ 'Check local context consistently': 'Überprüfe den lokalen Kontext konsequent',
'Use broadband, crime, road noise, parks, schools, and amenities as comparable signals. Then validate the strongest candidates with current local checks.':
- 'Nutzen Sie Breitband, Kriminalität, Straßenlärm, Parks, Schulen und Einrichtungen als vergleichbare Signale. Anschließend validieren Sie die stärksten Kandidaten mit aktuellen lokalen Prüfungen.',
+ 'Nutze Breitband, Kriminalität, Straßenlärm, Parks, Schulen und Angebote vor Ort als vergleichbare Signale. Anschließend prüfst du die stärksten Kandidaten mit aktuellen lokalen Nachweisen.',
'Can I compare Manchester suburbs with city-centre postcodes?':
'Kann ich Vororte von Manchester mit Postleitzahlen im Stadtzentrum vergleichen?',
'Yes. Use the same budget, property, commute, and local-context filters across both so trade-offs remain visible.':
- 'Ja. Verwenden Sie für beide die gleichen Filter für Budget, Immobilie, Pendelweg und lokalen Kontext, damit Kompromisse sichtbar bleiben.',
+ 'Ja. Verwende für beide die gleichen Filter für Budget, Immobilie, Pendelweg und lokalen Kontext, damit Kompromisse sichtbar bleiben.',
'Does this include live listings?': 'Umfasst dies aktuelle Inserate?',
'No. Use it to decide where to search, then use listing portals for current homes for sale.':
- 'Nein. Verwenden Sie es, um zu entscheiden, wo Sie suchen möchten, und nutzen Sie dann die Immobilienportale für aktuell zum Verkauf stehende Häuser.',
+ 'Nein. Nutze es, um zu entscheiden, wo du suchen möchtest, und nutze dann Immobilienportale für aktuell zum Verkauf stehende Immobilien.',
'Move from a broad search brief to specific postcode candidates.':
- 'Wechseln Sie von einem breiten Suchprofil zu konkreten Postleitzahl-Kandidaten.',
+ 'Wechsle von einem breiten Suchprofil zu konkreten Postleitzahl-Kandidaten.',
'Data sources': 'Datenquellen',
'Review the datasets used for property and local-context comparison.':
- 'Überprüfen Sie die Datensätze, die für den Vergleich von Immobilien und lokalem Kontext verwendet werden.',
+ 'Überprüfe die Datensätze, die für den Vergleich von Immobilien und lokalem Kontext verwendet werden.',
'Check a single postcode before arranging a viewing.':
- 'Überprüfen Sie eine einzelne Postleitzahl, bevor Sie eine Besichtigung vereinbaren.',
- 'Compare Manchester postcodes': 'Vergleichen Sie die Postleitzahlen von Manchester',
+ 'Überprüfe eine einzelne Postleitzahl, bevor du eine Besichtigung vereinbarst.',
+ 'Compare Manchester postcodes': 'Vergleiche die Postleitzahlen von Manchester',
'How to compare Bristol postcodes before a property search':
- 'So vergleichen Sie die Postleitzahlen von Bristol vor einer Immobiliensuche',
+ 'So vergleichst du die Postleitzahlen von Bristol vor einer Immobiliensuche',
'Bristol property search - Compare postcodes by commute and price':
- 'Immobiliensuche in Bristol – Vergleichen Sie Postleitzahlen nach Pendelweg und Preis',
+ 'Immobiliensuche in Bristol – Vergleiche Postleitzahlen nach Pendelweg und Preis',
'Compare Bristol postcodes by price, commute, property size, schools, broadband, crime, road noise, parks and amenities before viewings.':
- 'Vergleichen Sie die Postleitzahlen von Bristol nach Preis, Pendelweg, Wohnfläche, Schulen, Breitband, Kriminalität, Straßenlärm, Parks und Annehmlichkeiten vor der Besichtigung.',
+ 'Vergleiche die Postleitzahlen von Bristol nach Preis, Pendelweg, Wohnfläche, Schulen, Breitband, Kriminalität, Straßenlärm, Parks und Angeboten vor Ort vor der Besichtigung.',
'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.':
- 'Bei Suchanfragen in Bristol müssen oft deutliche Kompromisse zwischen Preis, Reisezeit, Wohnfläche und Nachbarschaftskontext eingegangen werden. Ein postleitzahlenbasierter Vergleich macht diese Kompromisse sichtbar.',
- 'Make commute constraints explicit': 'Machen Sie Pendelbeschränkungen explizit',
+ 'Suchen in Bristol bringen oft deutliche Kompromisse zwischen Preis, Fahrzeit, Wohnfläche und Nachbarschaftskontext mit sich. Ein Vergleich zuerst auf Postleitzahlenebene hält diese Kompromisse sichtbar.',
+ 'Make commute constraints explicit': 'Mache Pendelanforderungen klar',
'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.':
- 'Wenn die Erreichbarkeit des Zentrums, eines Bahnhofs, eines Krankenhauses, einer Universität oder eines Gewerbegebiets von Bedeutung ist, verwenden Sie zunächst Reisezeitfilter und vergleichen Sie dann die übrigen Postleitzahlen anhand der Immobiliendaten.',
+ 'Wenn die Erreichbarkeit des Zentrums, eines Bahnhofs, Krankenhauses, einer Universität oder eines Gewerbegebiets wichtig ist, nutze zuerst Fahrzeitfilter und vergleiche dann die übrigen Postleitzahlen anhand der Immobiliendaten.',
'Compare value, not just headline price':
- 'Vergleichen Sie den Wert, nicht nur den Gesamtpreis',
+ 'Vergleiche den Wert, nicht nur den sichtbaren Preis',
'Use price, property type, and floor-area filters together. This helps distinguish lower-cost areas from areas that simply contain smaller or different homes.':
- 'Nutzen Sie Preis-, Immobilientyp- und Wohnflächenfilter gemeinsam. Dies hilft dabei, günstigere Gebiete von Gebieten zu unterscheiden, in denen sich lediglich kleinere oder andere Häuser befinden.',
+ 'Nutze Preis-, Immobilientyp- und Wohnflächenfilter gemeinsam. So kannst du günstigere Gebiete von Gebieten unterscheiden, in denen einfach kleinere oder andere Immobilien stehen.',
'Screen environmental and local-service signals':
- 'Überprüfen Sie Umgebungs- und lokale Servicesignale',
+ 'Prüfe Umwelt- und lokale Versorgungssignale',
'Road noise, parks, broadband, crime, and amenities can affect whether a property works day to day. Use them as screening criteria before booking viewings.':
- 'Straßenlärm, Parks, Breitband, Kriminalität und Annehmlichkeiten können sich darauf auswirken, ob eine Immobilie im Alltag funktioniert. Nutzen Sie sie als Auswahlkriterien, bevor Sie Besichtigungen buchen.',
+ 'Straßenlärm, Parks, Breitband, Kriminalität und Angebote vor Ort können beeinflussen, ob eine Immobilie im Alltag funktioniert. Nutze sie als Prüfkriterien, bevor du Besichtigungen buchst.',
'Can I use this for commuter villages around Bristol?':
'Kann ich dies für Pendlerdörfer rund um Bristol nutzen?',
'Yes, where the relevant postcode and travel-time data is available. Always verify routes and services manually before deciding.':
- 'Ja, sofern die entsprechenden Postleitzahlen- und Reisezeitdaten verfügbar sind. Überprüfen Sie Routen und Dienste immer manuell, bevor Sie eine Entscheidung treffen.',
+ 'Ja, sofern die entsprechenden Postleitzahlen- und Fahrzeitdaten verfügbar sind. Prüfe Routen und Verbindungen immer manuell, bevor du entscheidest.',
'Can this tell me whether a listing is good value?':
'Kann mir das sagen, ob ein Inserat ein gutes Preis-Leistungs-Verhältnis bietet?',
'It can provide area context, but a specific listing still needs comparable sales, condition checks, survey findings, and professional advice where appropriate.':
- 'Es kann einen gebietsbezogenen Kontext bieten, aber für ein bestimmtes Inserat sind dennoch vergleichbare Verkäufe, Zustandsprüfungen, Gutachterergebnisse und gegebenenfalls professionelle Beratung erforderlich.',
+ 'Es kann Gebietskontext liefern, aber ein bestimmtes Inserat braucht weiterhin vergleichbare Verkäufe, Zustandsprüfungen, Gutachtenergebnisse und gegebenenfalls professionelle Beratung.',
'Search by reachable postcodes before refining by budget and local context.':
- 'Suchen Sie nach erreichbaren Postleitzahlen, bevor Sie die Suche nach Budget und lokalem Kontext verfeinern.',
+ 'Suche nach erreichbaren Postleitzahlen, bevor du die Suche nach Budget und lokalem Kontext verfeinerst.',
'Understand price patterns before setting listing alerts.':
- 'Verstehen Sie Preismuster, bevor Sie Inseratsbenachrichtigungen einrichten.',
+ 'Verstehe Preismuster, bevor du Inseratsbenachrichtigungen einrichtest.',
'Privacy and security': 'Privatsphäre und Sicherheit',
'How account and saved-search data is handled in the product.':
- 'Wie Konto- und gespeicherte Suchdaten im Produkt verarbeitet werden.',
- 'Compare Bristol postcodes': 'Vergleichen Sie die Postleitzahlen von Bristol',
+ 'Wie Konto- und gespeicherte Suchdaten im Produkt behandelt werden.',
+ 'Compare Bristol postcodes': 'Vergleiche die Postleitzahlen von Bristol',
'Trust and coverage': 'Vertrauen und Abdeckung',
'Perfect Postcode data sources and coverage': 'Perfect Postcode – Datenquellen und Abdeckung',
'Perfect Postcode data sources - Property, schools, commute and local context':
'Perfect Postcode – Datenquellen: Immobilien, Schulen, Pendelweg und lokaler Kontext',
'Review the public and official datasets used by Perfect Postcode, including property prices, EPC, schools, crime, broadband, noise and travel-time context.':
- 'Überprüfen Sie die von Perfect Postcode verwendeten öffentlichen und offiziellen Datensätze, einschließlich Immobilienpreise, EPC, Schulen, Kriminalität, Breitband, Lärm und Reisezeitkontext.',
+ 'Prüfe die von Perfect Postcode verwendeten öffentlichen und offiziellen Datensätze, einschließlich Immobilienpreise, EPC, Schulen, Kriminalität, Breitband, Lärm und Fahrzeitkontext.',
'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 kombiniert Immobilien-, Transport-, Bildungs-, Umwelt- und lokale Dienstleistungsdatensätze, sodass Käufer Postleitzahlen konsistent vergleichen können. Auf dieser Seite wird erläutert, wozu die Daten dienen und wo sie überprüft werden sollten.',
+ 'Perfect Postcode kombiniert Datensätze zu Immobilien, Verkehr, Bildung, Umwelt und lokaler Versorgung, damit Käufer Postleitzahlen konsistent vergleichen können. Diese Seite erklärt, wozu die Daten dienen und wo sie geprüft werden sollten.',
'Property and housing context': 'Immobilien- und Wohnkontext',
'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.':
'Das Produkt nutzt Datensätze zu Immobilientransaktionen und zum Wohnkontext, um Filter wie Verkaufspreis, Immobilientyp, Eigentumsform, Wohnfläche, Energieeffizienz und geschätzten aktuellen Wert zu unterstützen.',
'Use these fields to compare areas, not as a formal valuation.':
- 'Verwenden Sie diese Felder zum Vergleichen von Gebieten, nicht als formale Wertermittlung.',
+ 'Verwende diese Felder zum Vergleichen von Gebieten, nicht als formale Bewertung.',
'Check current listings, title information, lender requirements, and survey results before buying.':
- 'Überprüfen Sie vor dem Kauf aktuelle Inserate, Grundbuchinformationen, Kreditgeberanforderungen und Gutachterergebnisse.',
+ 'Überprüfe vor dem Kauf aktuelle Inserate, Grundbuchinformationen, Kreditgeberanforderungen und Gutachterergebnisse.',
'Schools, safety, broadband, and environment': 'Schulen, Sicherheit, Breitband und Umwelt',
'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.':
- 'Lokale Kontextfilter helfen beim Vergleich von Postleitzahlen anhand von Signalen, die das tägliche Leben beeinflussen. Sie sollten als Screening-Daten behandelt und für Entscheidungen mit aktuellen offiziellen Quellen verglichen werden.',
- 'Travel-time data': 'Reisezeitdaten',
+ 'Lokale Kontextfilter helfen, Postleitzahlen anhand von Signalen zu vergleichen, die den Alltag beeinflussen. Sie sollten als Prüfdaten behandelt und für Entscheidungen mit aktuellen offiziellen Quellen abgeglichen werden.',
+ 'Travel-time data': 'Fahrzeitdaten',
'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.':
- 'Reisezeitfilter sind für einen konsistenten Gebietsvergleich konzipiert. Bevor Sie sich für ein Gebiet entscheiden, sollten Sie Routenverfügbarkeit, Störungen, Parkmöglichkeiten, Fußläufigkeit und Fahrplandetails überprüfen.',
+ 'Fahrzeitfilter sind für konsistente Gebietsvergleiche gedacht. Bevor du dich für ein Gebiet entscheidest, solltest du Routenverfügbarkeit, Störungen, Parkmöglichkeiten, Fußwege und Fahrplandetails prüfen.',
'Why does coverage focus on England?': 'Warum konzentriert sich die Abdeckung auf England?',
'Several core property, education, and local-context datasets are jurisdiction-specific. England coverage keeps comparisons more consistent.':
'Mehrere zentrale Datensätze zu Immobilien, Bildung und lokalem Kontext sind jurisdiktionsspezifisch. Eine Abdeckung von England sorgt für konsistentere Vergleiche.',
'How should I handle stale or missing data?':
'Wie gehe ich mit veralteten oder fehlenden Daten um?',
'Use the map as a shortlist tool. If a postcode matters, verify the latest details with current official sources and direct local checks.':
- 'Nutzen Sie die Karte als Shortlist-Tool. Wenn eine Postleitzahl von Bedeutung ist, überprüfen Sie die neuesten Angaben anhand aktueller offizieller Quellen und direkt vor Ort.',
+ 'Nutze die Karte als Werkzeug für die Vorauswahl. Wenn eine Postleitzahl wichtig ist, prüfe die neuesten Angaben anhand aktueller offizieller Quellen und direkt vor Ort.',
'How filters and comparisons should be interpreted.':
'Wie Filter und Vergleiche interpretiert werden sollten.',
'Review postcode-level context before a viewing.':
- 'Überprüfen Sie vor einer Besichtigung den Kontext auf Postleitzahlenebene.',
+ 'Überprüfe vor einer Besichtigung den Kontext auf Postleitzahlenebene.',
'How saved searches and account data are handled.':
'Wie mit gespeicherten Suchanfragen und Kontodaten umgegangen wird.',
- 'How to use the map': 'So verwenden Sie die Karte',
+ 'How to use the map': 'So verwendest du die Karte',
'Methodology for postcode property research':
'Methodik für die Immobilienrecherche nach Postleitzahlen',
'Perfect Postcode methodology - How to interpret postcode property data':
- 'Perfect Postcode Methodik – So interpretieren Sie Immobiliendaten auf Postleitzahlenebene',
+ 'Perfect Postcode Methodik – So interpretierst du Immobiliendaten auf Postleitzahlenebene',
'Understand how to use postcode filters, property estimates, travel-time data, school context and local signals as a home-buying shortlist tool.':
- 'Verstehen Sie, wie Sie Postleitzahlenfilter, Immobilienschätzungen, Reisezeitdaten, Schulkontext und lokale Signale als Tool für die Auswahlliste beim Hauskauf verwenden.',
+ 'Verstehe, wie du Postleitzahlenfilter, Immobilienschätzungen, Fahrzeitdaten, Schulkontext und lokale Signale als Werkzeug für die Vorauswahl beim Hauskauf nutzt.',
'Perfect Postcode is designed to make area shortlisting more evidence-led. It doesn’t replace estate agents, surveyors, conveyancers, lenders, school admissions teams, or local authority checks.':
- 'Perfect Postcode wurde entwickelt, um die Gebietsauswahl evidenzbasierter zu gestalten. Es ersetzt keine Immobilienmakler, Gutachter, Notare, Kreditgeber, Schulzulassungsteams oder Prüfungen durch örtliche Behörden.',
- 'Start with hard constraints': 'Beginnen Sie mit harten Einschränkungen',
+ 'Perfect Postcode wurde entwickelt, um die Gebietsvorauswahl stärker auf Daten zu stützen. Es ersetzt keine Immobilienmakler, Gutachter, Notare, Kreditgeber, Schulaufnahmestellen oder Prüfungen durch örtliche Behörden.',
+ 'Start with hard constraints': 'Beginne mit harten Einschränkungen',
'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.':
- 'Beginnen Sie mit nicht verhandelbaren Faktoren wie Budget, Immobilientyp, Wohnfläche, Pendelzeit und wesentlichen Dienstleistungen. Dadurch werden unmögliche Postleitzahlen ausgeschlossen, bevor weichere Präferenzen berücksichtigt werden.',
- 'Use colour layers for trade-offs': 'Verwenden Sie Farbebenen für Kompromisse',
+ 'Beginne mit unverhandelbaren Faktoren wie Budget, Immobilientyp, Wohnfläche, Pendelzeit und grundlegender Versorgung. Dadurch werden ungeeignete Postleitzahlen ausgeschlossen, bevor weichere Präferenzen berücksichtigt werden.',
+ 'Use colour layers for trade-offs': 'Verwende Farbebenen für Kompromisse',
'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.':
- 'Färben Sie die verbleibende Karte nach dem Filtern jeweils nach einem Signal ein: Preis pro Quadratmeter, Straßenlärm, Schulkontext, Pendelzeit, Breitband oder Kriminalität. Dies erleichtert die Diskussion von Kompromissen.',
- 'Measure what’s working': 'Messen Sie, was funktioniert',
+ 'Färbe die verbleibende Karte nach dem Filtern jeweils nach einem Signal ein: Preis pro Quadratmeter, Straßenlärm, Schulkontext, Pendelzeit, Breitband oder Kriminalität. So lassen sich Kompromisse leichter besprechen.',
+ 'Measure what’s working': 'Miss, was funktioniert',
'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.':
- 'Verwenden Sie die Search Console und Analysen, um zu verfolgen, welche öffentlichen Seiten indexiert werden, welche Abfragen Impressionen erzeugen und welche Seiten Besucher zur Dashboard-Nutzung führen. Überprüfen Sie die Core Web Vitals nach jeder wesentlichen Frontend-Änderung.',
+ 'Verwende Search Console und Analytics, um zu verfolgen, welche öffentlichen Seiten indexiert werden, welche Suchanfragen Impressionen erzeugen und welche Seiten Besucher zum Erkunden des Dashboards bringen. Prüfe die Core Web Vitals nach jeder größeren Frontend-Änderung.',
'Can the tool choose the right postcode for me?':
- 'Kann das Tool die richtige Postleitzahl für mich auswählen?',
+ 'Kann das Werkzeug die richtige Postleitzahl für mich auswählen?',
'No. It helps compare evidence and reduce the search area. The final decision needs direct visits, current listings, legal checks, surveys, and personal judgement.':
'Nein. Es hilft, Belege zu vergleichen und das Suchgebiet einzugrenzen. Die endgültige Entscheidung erfordert direkte Besuche, aktuelle Inserate, rechtliche Prüfungen, Gutachten und persönliches Urteilsvermögen.',
'How should I use estimates?': 'Wie verwende ich Schätzungen?',
'Use estimates as comparison signals, not as professional valuations or purchase advice.':
- 'Nutzen Sie Schätzungen als Vergleichssignale, nicht als professionelle Wertermittlung oder Kaufberatung.',
- 'Understand where key filters come from.': 'Verstehen Sie, woher Schlüsselfilter kommen.',
+ 'Nutze Schätzungen als Vergleichssignale, nicht als professionelle Wertermittlung oder Kaufberatung.',
+ 'Understand where key filters come from.': 'Verstehe, woher die wichtigsten Filter kommen.',
'Apply the methodology to price-led area comparison.':
- 'Wenden Sie die Methodik auf einen preisgeführten Gebietsvergleich an.',
+ 'Wende die Methodik auf preisorientierte Gebietsvergleiche an.',
'Apply the methodology to destination-led search.':
- 'Wenden Sie die Methodik auf die zielgeführte Suche an.',
+ 'Wende die Methodik auf zielbasierte Suchen an.',
Trust: 'Vertrauen',
'Privacy and security for saved property searches':
'Datenschutz und Sicherheit für gespeicherte Immobiliensuchen',
'Perfect Postcode privacy and security - Saved searches and account data':
'Perfect Postcode – Datenschutz und Sicherheit – Gespeicherte Suchanfragen und Kontodaten',
'Learn how Perfect Postcode treats saved searches, account data and property research workflows with privacy and security in mind.':
- 'Erfahren Sie, wie Perfect Postcode gespeicherte Suchanfragen, Kontodaten und Immobilienrecherche-Workflows unter Berücksichtigung von Datenschutz und Sicherheit behandelt.',
+ 'Erfahre, wie Perfect Postcode gespeicherte Suchen, Kontodaten und Abläufe der Immobilienrecherche mit Blick auf Datenschutz und Sicherheit behandelt.',
'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.':
- 'Eine Immobilienrecherche kann persönliche Prioritäten, Budgets und Standorte offenlegen. Das Produkt trennt öffentliche SEO-Seiten von kontogebundenen Bereichen und markiert private Dashboard-/Kontorouten als noindex.',
+ 'Eine Immobilienrecherche kann persönliche Prioritäten, Budgets und Standorte offenlegen. Das Produkt trennt öffentliche SEO-Seiten von kontogebundenen Bereichen und markiert private Dashboard- und Kontorouten als noindex.',
'Public pages and private areas are separated':
- 'Öffentliche Seiten und private Bereiche werden getrennt',
+ 'Öffentliche Seiten und private Bereiche sind getrennt',
'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.':
- 'Marketing-, Methodik-, Leitfaden- und Supportseiten sind indexierbar. Dashboard, Konto, gespeicherte Suchen und Einladungsrouten werden gegebenenfalls als noindex markiert oder für den Crawler-Zugriff gesperrt.',
+ 'Marketing-, Methodik-, Leitfaden- und Supportseiten sind indexierbar. Dashboard, Konto, gespeicherte Suchen, Einladungen und Einladungsrouten werden bei Bedarf als noindex markiert oder für Crawler gesperrt.',
'Saved search data is account-scoped': 'Gespeicherte Suchdaten sind kontobezogen',
'Saved searches and shared links are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
- 'Gespeicherte Suchen und geteilte Links sind für angemeldete Benutzer vorgesehen. Sie sind nicht in der öffentlichen Sitemap enthalten und sollten nicht als öffentlicher Inhalt gecrawlt werden können.',
+ 'Gespeicherte Suchen und geteilte Links sind für angemeldete Nutzer gedacht. Sie sind nicht in der öffentlichen Sitemap enthalten und sollten nicht als öffentlicher Inhalt crawlbar sein.',
'Search measurement without exposing private data':
'Suchmessung ohne Offenlegung privater Daten',
'SEO measurement should happen on public pages using aggregated analytics and Search Console data. Private query parameters and account views shouldn’t become indexable landing pages.':
- 'SEO-Messung sollte auf öffentlichen Seiten mit aggregierten Analysen und Search-Console-Daten erfolgen. Private Abfrageparameter und Kontoansichten sollten nicht zu indexierbaren Landingpages werden.',
+ 'SEO-Messung sollte auf öffentlichen Seiten mit aggregierten Analytics- und Search-Console-Daten erfolgen. Private Abfrageparameter und Kontoansichten sollten nicht zu indexierbaren Landingpages werden.',
'Are saved searches listed in the sitemap?':
'Werden gespeicherte Suchanfragen in der Sitemap aufgeführt?',
'No. Public SEO pages are listed; account and saved-search routes are intentionally excluded.':
@@ -578,11 +591,11 @@ const de: Translations = {
'They shouldn’t be indexed. The server marks private routes noindex and the sitemap only lists public pages.':
'Sie sollten nicht indexiert werden. Der Server markiert private Routen als noindex und die Sitemap listet nur öffentliche Seiten auf.',
'How to use public postcode data responsibly.':
- 'So gehen Sie verantwortungsvoll mit öffentlichen Postleitzahldaten um.',
+ 'So gehst du verantwortungsvoll mit öffentlichen Postleitzahldaten um.',
'What data powers the public comparisons.':
'Welche Daten den öffentlichen Vergleichen zugrunde liegen.',
'Explore public postcode-search workflows.':
- 'Entdecken Sie öffentliche Workflows zur Postleitzahlensuche.',
+ 'Entdecke öffentliche Workflows zur Postleitzahlensuche.',
},
},
@@ -592,15 +605,15 @@ const de: Translations = {
createAccount: 'Konto erstellen',
resetPassword: 'Passwort zurücksetzen',
valueProp:
- 'Speichern Sie Suchen, merken Sie sich Immobilien und erstellen Sie eine Auswahlliste passender Gebiete.',
+ 'Speichere Suchen, markiere Immobilien und erstelle eine Auswahlliste passender Gebiete.',
continueWithGoogle: 'Weiter mit Google',
email: 'E-Mail',
emailPlaceholder: 'name@beispiel.de',
password: 'Passwort',
passwordPlaceholderRegister: 'Mind. 8 Zeichen',
- passwordPlaceholderLogin: 'Ihr Passwort',
+ passwordPlaceholderLogin: 'Dein Passwort',
forgotPassword: 'Passwort vergessen?',
- resetSent: 'Prüfen Sie Ihre E-Mails für einen Link zum Zurücksetzen.',
+ resetSent: 'Prüfe deine E-Mails für einen Link zum Zurücksetzen.',
pleaseWait: 'Bitte warten...',
sendResetLink: 'Link zum Zurücksetzen senden',
backToLogin: 'Zurück zur Anmeldung',
@@ -610,19 +623,19 @@ const de: Translations = {
upgrade: {
title: 'Jede passende Postleitzahl finden',
description:
- 'Sie erkunden gerade das Demogebiet. Erhalten Sie lebenslangen Zugang zu jeder Postleitzahl, jedem Filter und jedem Viertel in England. Eine Zahlung, für immer.',
+ 'Du erkundest gerade das Demogebiet. Erhalte lebenslangen Zugang zu jeder Postleitzahl, jedem Filter und jedem Viertel in England. Eine Zahlung, für immer.',
free: 'Kostenlos',
freeForEarly: 'Kostenlos für Frühnutzer. Keine Kreditkarte erforderlich.',
oneTimePayment: 'Einmalzahlung. Lebenslanger Zugang.',
redirecting: 'Weiterleitung...',
claimFreeAccess: 'Kostenlosen Zugang sichern',
upgradeFor: 'Upgrade für {{price}}',
- registerAndUpgrade: 'Registrieren & Upgraden',
+ registerAndUpgrade: 'Registrieren & upgraden',
alreadyHaveAccount: 'Bereits ein Konto? Anmelden',
continueWithDemo: 'Mit Demo fortfahren',
backToSharedArea: 'Zurück zum geteilten Gebiet',
sharedAreaDescription:
- 'Sie sehen ein geteiltes Gebiet. Um darüber hinaus zu erkunden, sichern Sie sich lebenslangen Zugriff auf jede Postleitzahl, jeden Filter und jede Nachbarschaft in England.',
+ 'Du siehst ein geteiltes Gebiet. Um darüber hinaus zu erkunden, sichere dir lebenslangen Zugriff auf jede Postleitzahl, jeden Filter und jede Nachbarschaft in England.',
checkoutFailed: 'Bezahlvorgang fehlgeschlagen',
},
@@ -630,7 +643,7 @@ const de: Translations = {
saveSearch: {
title: 'Suche speichern',
saved: 'Suche gespeichert',
- savedSuccess: 'Ihre Suche wurde erfolgreich gespeichert.',
+ savedSuccess: 'Deine Suche wurde erfolgreich gespeichert.',
viewSavedSearches: 'Gespeicherte Suchen ansehen',
name: 'Name',
namePlaceholder: 'Meine Suche',
@@ -640,15 +653,15 @@ const de: Translations = {
// ── License Success ────────────────────────────────
licenseSuccess: {
verifyingTitle: 'Zugang wird geprüft',
- verifyingSubtitle: 'Wir prüfen Ihr Konto, bevor wir die Karte freischalten.',
+ verifyingSubtitle: 'Wir prüfen dein Konto, bevor wir die Karte freischalten.',
verifyingDescription: 'Das dauert nach dem Bezahlen normalerweise nur ein paar Sekunden.',
activationDelayedTitle: 'Zahlung erhalten',
activationDelayedSubtitle: 'Der Zugang wird noch aktiviert.',
activationDelayedDescription:
- 'Wir konnten die Kontoaktualisierung noch nicht bestätigen. Aktualisieren Sie gleich noch einmal oder kontaktieren Sie den Support, falls der Zugang nicht erscheint.',
+ 'Wir konnten die Kontoaktualisierung noch nicht bestätigen. Aktualisiere gleich noch einmal oder kontaktiere den Support, falls der Zugang nicht erscheint.',
stayOnPricing: 'Auf der Preisseite bleiben',
- title: 'Sie sind dabei.',
- subtitle: 'Ihr lebenslanger Zugang ist jetzt aktiv.',
+ title: 'Du bist dabei.',
+ subtitle: 'Dein lebenslanger Zugang ist jetzt aktiv.',
description: 'Voller Zugang zu allen Funktionen, allen Postleitzahlen, in ganz England.',
startExploring: 'Jetzt entdecken',
},
@@ -659,18 +672,18 @@ const de: Translations = {
addFilter: 'Filter hinzufügen',
findingPerfectPostcode: 'Die perfekte Postleitzahl finden',
addFiltersHint:
- 'Fügen Sie unten Filter hinzu, um die Karte auf Gebiete einzugrenzen, die Ihren Kriterien entsprechen',
+ 'Füge unten Filter hinzu, um die Karte auf Gebiete einzugrenzen, die deinen Kriterien entsprechen',
upgradePrompt:
- 'Finden Sie passende Postleitzahlen mit Kriminalität, Schulen, Lärm, Breitband, Preisen und über 50 weiteren Filtern in ganz England.',
+ 'Finde passende Postleitzahlen mit Kriminalität, Schulen, Lärm, Breitband, Preisen und über 50 weiteren Filtern in ganz England.',
oneTimeLifetime: 'Einmalzahlung, lebenslanger Zugang.',
- upgradeToFullMap: 'Zur Vollversion upgraden',
+ upgradeToFullMap: 'Auf die vollständige Karte upgraden',
chooseFilters:
- 'Klicken Sie auf Hinzufügen, um zu filtern. Die kleinen Schaltflächen zeigen Daten oder färben die Karte.',
+ 'Klicke auf Hinzufügen, um zu filtern. Die kleinen Schaltflächen zeigen Datendetails oder färben die Karte ein.',
searchFeatures: 'Filter durchsuchen...',
noMatchingFeatures: 'Keine passenden Filter',
- tryDifferentSearch: 'Versuchen Sie einen anderen Suchbegriff',
+ tryDifferentSearch: 'Versuche einen anderen Suchbegriff',
allFeaturesActive: 'Alle Filter sind aktiv',
- removeFilterHint: 'Entfernen Sie einen Filter, um verfügbare Merkmale zu sehen',
+ removeFilterHint: 'Entferne einen Filter, um verfügbare Merkmale zu sehen',
featureInfo: 'Über diese Daten',
aboutData: 'Über diese Daten',
aboutDataShort: 'Info',
@@ -683,7 +696,7 @@ const de: Translations = {
replayTutorial: 'Interaktives Tutorial erneut abspielen',
clearAll: 'Alle löschen',
clearAllTitle: 'Alle Filter löschen?',
- clearAllSavePrompt: 'Möchten Sie Ihre aktuellen Filter vor dem Löschen speichern?',
+ clearAllSavePrompt: 'Möchtest du deine aktuellen Filter vor dem Löschen speichern?',
clearAllUpdatePrompt:
'{{name}} mit den aktuellen Filtern aktualisieren, bevor gelöscht wird?',
saveAndClear: 'Speichern & löschen',
@@ -695,7 +708,7 @@ const de: Translations = {
schoolRating: 'Schulbewertung',
schoolDistance: 'Schulentfernung',
primary: 'Grundschule',
- secondary: 'Weiterführend',
+ secondary: 'Weiterführende Schule',
rating: 'Bewertung',
goodPlus: 'Gut+',
outstanding: 'Hervorragend',
@@ -711,7 +724,7 @@ const de: Translations = {
// ── Philosophy Popup ───────────────────────────────
philosophy: {
intro:
- 'Beginnen Sie mit Ihren Muss-Kriterien, dann fügen Sie Kann-Kriterien hinzu. Die Karte grenzt sich ein, wenn Sie Filter hinzufügen. Die verbleibenden Gebiete sind Ihre besten Treffer.',
+ 'Beginne mit deinen Muss-Kriterien und füge danach Kann-Kriterien hinzu. Die Karte wird enger, wenn du Filter hinzufügst. Die verbleibenden Gebiete sind deine besten Treffer.',
step1Title: 'Budget und Grundlagen',
step1Desc: '(Preisrahmen, Wohnfläche, Immobilientyp)',
step2Title: 'Pendelweg',
@@ -724,30 +737,30 @@ const de: Translations = {
step5Desc: '(Restaurants, Parks, Breitbandgeschwindigkeit)',
step6Title: 'Energie',
step6Desc: '(EPC-Bewertungen, Dämmung, Heizkosten)',
- tip: 'Tipp: Wenn nichts passt, lockern Sie eine Bedingung nach der anderen, um zu sehen, welcher Kompromiss die meisten Optionen eröffnet.',
+ tip: 'Tipp: Wenn nichts passt, lockere eine Bedingung nach der anderen, um zu sehen, welcher Kompromiss die meisten Optionen eröffnet.',
},
// ── Travel Time ────────────────────────────────────
travel: {
- travelTime: 'Reisezeit ({{mode}})',
+ travelTime: 'Fahrzeit ({{mode}})',
maxTime: 'Maximale Zeit',
selectDestination: 'Ziel auswählen...',
- bestCase: 'Bestfall',
- bestCaseTitle: 'Bestmögliche Reisezeit',
+ bestCase: 'Bestwert',
+ bestCaseTitle: 'Bestmögliche Fahrzeit',
bestCaseDesc:
- 'Verwendet die schnellste realistische Reisezeit (bei guter Abfahrtsplanung und guten Anschlüssen). Standard ist der Median, der eine typische Fahrt unabhängig vom Abfahrtszeitpunkt darstellt.',
+ 'Verwendet die schnellste realistische Fahrzeit (bei gut gewählter Abfahrt und guten Anschlüssen). Standard ist der Median, der eine typische Fahrt unabhängig vom Abfahrtszeitpunkt darstellt.',
noChange: 'Ohne Umstieg',
noChangeTitle: 'Nur direkte Verbindungen',
noChangeDesc:
- 'Beschränkt auf Fahrten ohne Umstiege —gehen, in ein Verkehrsmittel einsteigen, zum Ziel gehen.',
+ 'Beschränkt auf Fahrten ohne Umstiege — zu Fuß gehen, in ein Verkehrsmittel einsteigen und am Ziel wieder zu Fuß gehen.',
noBuses: 'Ohne Bus',
noBusesTitle: 'Busse ausschließen',
noBusesDesc:
- 'Schließt Busse aus —nur Bahn, U-Bahn, Tram und Fähre. Praktisch, um staufreie Verbindungen zu finden.',
+ 'Schließt Busse aus — nur Bahn, U-Bahn, Tram und Fähre. Hilfreich, um Verbindungen ohne Straßenverkehr zu finden.',
previewOnMap: 'Auf Karte anzeigen',
stopPreviewing: 'Vorschau beenden',
- removeTravelTime: 'Reisezeit entfernen',
- addTravelTime: '{{mode}}-Reisezeit hinzufügen',
+ removeTravelTime: 'Fahrzeit entfernen',
+ addTravelTime: '{{mode}}-Fahrzeit hinzufügen',
clearDestination: 'Ziel löschen',
typeToFilter: 'Tippen zum Filtern...',
noDestinations: 'Keine Ziele gefunden',
@@ -758,7 +771,7 @@ const de: Translations = {
modeCarDesc: 'Fahrzeit über die schnellste Straßenroute',
modeBicycleDesc: 'Radfahrzeit auf fahrradfreundlichen Strecken',
modeWalkingDesc: 'Gehzeit über Fußwege und Bürgersteige',
- modeTransitDesc: 'Reisezeit mit Bahn, U-Bahn und Bus',
+ modeTransitDesc: 'Fahrzeit mit Bahn, U-Bahn und Bus',
},
// ── Travel Time Info Popup ─────────────────────────
@@ -768,25 +781,25 @@ const de: Translations = {
carDesc: ' mit dem Auto, basierend auf typischen Straßengeschwindigkeiten und dem Straßennetz.',
bicycleDesc: ' mit dem Fahrrad, auf fahrradfreundlichen Strecken.',
walkingDesc: ' zu Fuß, über Fußwege und Bürgersteige.',
- mainDesc: 'Zeigt die Reisezeit vom ausgewählten Ziel zu jedem Gebiet.',
- sliderHint: 'Verwenden Sie den Schieberegler, um Ihre maximale Pendelzeit festzulegen.',
+ mainDesc: 'Zeigt, wie lange der Weg vom ausgewählten Ziel zu jedem Gebiet dauert.',
+ sliderHint: 'Verwende den Schieberegler, um deine maximale Pendelzeit festzulegen.',
},
// ── AI Filter ──────────────────────────────────────
aiFilter: {
- describeIdealArea: 'Beschreiben Sie, wo Sie leben möchten',
+ describeIdealArea: 'Beschreibe, wo du leben möchtest',
aiSearch: 'KI-Suche',
- describeHint: 'beschreiben Sie, wonach Sie suchen',
+ describeHint: 'beschreibe, wonach du suchst',
placeholder: 'z. B. 2 Schlafzimmer unter £525k, 45 Min. zur Arbeit, ruhig...',
example1: '2 Schlafzimmer unter £525k, 45 Min. zur Arbeit',
- example2: 'Familienfreundliche Gebiete nahe guten Schulen unter £650k',
+ example2: 'Familienfreundliche Gebiete nahe guter Schulen unter £650k',
example3: 'Mehr Platz mit vernünftigem Pendelweg',
analysing: 'Anfrage wird analysiert...',
searchingDestinations: 'Ziele werden gesucht...',
generatingFilters: 'Filter werden generiert...',
refiningResults: 'Ergebnisse werden verfeinert...',
weeklyLimitReached:
- 'Sie haben das wöchentliche KI-Nutzungslimit erreicht. Es wird nächste Woche automatisch zurückgesetzt.',
+ 'Du hast das wöchentliche KI-Nutzungslimit erreicht. Es wird nächste Woche automatisch zurückgesetzt.',
},
// ── Map Legend ─────────────────────────────────────
@@ -795,12 +808,12 @@ const de: Translations = {
resetColourScale: 'Farbskala zurücksetzen',
historicalMatches: 'Historische Immobilientreffer',
numberOfProperties: 'Anzahl der Immobilien',
- previewing: 'Vorschau von \u201c{{name}}\u201d',
+ previewing: 'Vorschau von “{{name}}”',
},
// ── Map ────────────────────────────────────────────
map: {
- ogTitle: 'Ihre perfekte Postleitzahl',
+ ogTitle: 'Deine perfekte Postleitzahl',
ogPropertyPrices: 'Immobilienpreise',
ogEnergyRatings: 'Energiebewertungen',
ogSchools: 'Schulen',
@@ -814,24 +827,25 @@ const de: Translations = {
estValue: 'Gesch. Wert:',
type: 'Typ:',
builtForm: 'Bauweise:',
- tenure: 'Besitzart:',
- withinConservationArea: 'In Erhaltungsgebiet:',
+ tenure: 'Eigentumsform:',
+ withinConservationArea: 'In Denkmalschutzgebiet:',
floorArea: 'Wohnfläche:',
rooms: 'Zimmer:',
built: 'Baujahr:',
- formerCouncil: 'Ehem. Sozialbau:',
- exCouncilBadge: 'Ehem. Sozialbau',
+ formerCouncil: 'Ehem. kommunaler Wohnungsbau:',
+ exCouncilBadge: 'Evtl. ehem. kommunaler Wohnungsbau',
+ listedBuildingBadge: 'Evtl. denkmalgeschützt',
epcRating: 'EPC-Bewertung:',
epcPotential: 'EPC-Potenzial:',
renovations: 'Renovierungen',
perSqm: '/m²',
- historyTitle: 'Verlauf',
+ historyTitle: 'Historie',
historySale: 'Verkauf',
- historyBuilt: 'Gebaut',
+ historyBuilt: 'Baujahr',
searchPlaceholder: 'Nach Adresse oder Postleitzahl suchen...',
propertyData: 'Immobiliendaten',
propertyDataDesc:
- 'Preise stammen vom HM Land Registry (was Käufer tatsächlich bezahlt haben). Wohnfläche, Energiebewertungen, Baujahr und Besitzart stammen aus offiziellen EPC-Gutachten. Beide Quellen werden nach Adresse innerhalb jeder Postleitzahl abgeglichen.',
+ 'Preise stammen vom HM Land Registry (was Käufer tatsächlich bezahlt haben). Wohnfläche, Energieeffizienzklassen, Baujahr und Eigentumsform stammen aus offiziellen EPC-Gutachten. Beide Quellen werden nach Adresse innerhalb jeder Postleitzahl abgeglichen.',
},
// ── Area Pane ──────────────────────────────────────
@@ -850,9 +864,9 @@ const de: Translations = {
'Keine aktiven Filter; die Statistiken umfassen alle Immobilien in diesem Gebiet.',
filteredStatsEmpty: 'Gefilterte Statistiken sind leer',
showAllStatsHint:
- 'Vor den Filtern gibt es {{count}} Immobilien. Wechseln Sie zu allen Immobilien, um dieses Gebiet zu prüfen.',
+ 'Vor den Filtern gibt es {{count}} Immobilien. Wechsle zu allen Immobilien, um dieses Gebiet zu prüfen.',
showAllStatsFallback:
- 'Wechseln Sie zu allen Immobilien, um dieses Gebiet ohne aktive Filter zu prüfen.',
+ 'Wechsle zu allen Immobilien, um dieses Gebiet ohne aktive Filter zu prüfen.',
showAllStats: 'Alle Immobilien anzeigen',
closestStations: 'Nächste Bahnhöfe',
noNearbyStations: 'Keine Bahn- oder U-Bahn-Station im Umkreis von 2 km',
@@ -860,14 +874,13 @@ const de: Translations = {
lowerMinTo: 'Minimum auf {{value}} senken',
raiseMaxTo: 'Maximum auf {{value}} erhöhen',
allowCategory: '{{value}} zulassen',
- missingFilterValue:
- 'Kein Wert für diesen Filter; entfernen Sie ihn oder lassen Sie fehlende Werte zu',
+ missingFilterValue: 'Kein Wert für diesen Filter; entferne ihn',
noFilterDataShort: 'Keine Daten',
travelTo: 'Fahrt zu {{destination}}',
viewProperties: '{{count}} Immobilien ansehen',
viewPropertiesShort: 'Immobilien ansehen',
priceHistory: 'Preisentwicklung',
- journeysFrom: 'Reisezeiten für {{label}}',
+ journeysFrom: 'Fahrzeiten für {{label}}',
to: 'Nach {{destination}}',
noJourneyData: 'Keine Verbindungsdaten verfügbar',
viewOnGoogleMaps: 'Auf Google Maps ansehen',
@@ -876,16 +889,6 @@ const de: Translations = {
nationalAvg: 'Landesdurchschnitt',
},
- // ── Histogram Legend ───────────────────────────────
- histogramLegend: {
- tealBars: 'Türkise Balken',
- tealBarsDesc: 'zeigen die Verteilung im ausgewählten Gebiet',
- greyBars: 'Graue Balken',
- greyBarsDesc: 'zeigen die Gesamtverteilung über alle Gebiete',
- dashedLine: 'Gestrichelte Linie',
- dashedLineDesc: 'zeigt den landesweiten Durchschnitt',
- },
-
// ── Street View ────────────────────────────────────
streetView: {
title: 'Street View',
@@ -896,7 +899,7 @@ const de: Translations = {
// ── POI Pane ───────────────────────────────────────
poiPane: {
pois: 'POIs',
- pointsOfInterest: 'Sehenswürdigkeiten & Einrichtungen',
+ pointsOfInterest: 'Interessante Orte',
poiDescription:
'Daten von OpenStreetMap, NaPTAN und GEOLYTIX Grocery Retail Points. Umfasst Haltestellen, Geschäfte, Supermarktketten, Restaurants, Gesundheitsangebote, Freizeit und mehr.',
searchCategories: 'Kategorien durchsuchen...',
@@ -917,25 +920,25 @@ const de: Translations = {
lookupFailed: 'Suche fehlgeschlagen',
searchLabel: 'Orte oder Postleitzahlen suchen',
locateMe: 'Zu meinem Standort',
- geolocationUnsupported: 'Geolokalisierung wird von Ihrem Browser nicht unterstützt',
+ geolocationUnsupported: 'Geolokalisierung wird von deinem Browser nicht unterstützt',
geolocationFailed: 'Standort konnte nicht ermittelt werden',
},
// ── Mobile Drawer ──────────────────────────────────
mobileDrawer: {
- closeDrawer: 'Schublade schließen',
+ closeDrawer: 'Seitenbereich schließen',
},
// ── Home Page ──────────────────────────────────────
home: {
heroEyebrow: 'Für Käufer, die fragen: „Wo soll ich überhaupt suchen?“',
- heroTitle1: 'Finden Sie die Postleitzahlen',
- heroTitle2: 'die zu Ihrem Leben passen',
- heroTitle3: 'Nicht nur die Gegenden, die Sie schon kennen.',
+ heroTitle1: 'Finde die Postleitzahlen',
+ heroTitle2: 'die zu deinem Leben passen',
+ heroTitle3: 'Nicht nur die Gegenden, die du schon kennst.',
heroSubtitle:
'Von Londoner Stadtteilen über Pendlerorte bis zu regionalen Städten: England hat zu viele Orte, um sie einzeln zu recherchieren.',
heroDescription:
- 'Legen Sie Budget, Pendelzeit, Schulen, Sicherheit, Lärm, Breitband und Lebensstil fest. Perfect Postcode scannt Englands Postleitzahlen und zeigt Orte, die wirklich passen, auch Gegenden, die Sie nie in ein Immobilienportal eingegeben hätten.',
+ 'Lege Budget, Pendelzeit, Schulen, Sicherheit, Lärm, Breitband und Lebensstil fest. Perfect Postcode scannt Englands Postleitzahlen und zeigt Orte, die wirklich passen, auch Gegenden, die du nie in ein Immobilienportal eingegeben hättest.',
exploreTheMap: 'Passende Postleitzahlen finden',
seeTheDifference: 'So funktioniert es',
productDemoLabel: 'Perfect Postcode-Produktdemo',
@@ -957,35 +960,34 @@ const de: Translations = {
showcasePoliticalVoteShare: 'Politischer Stimmenanteil',
showcaseLotsMore: '...und vieles mehr',
showcaseMinutes: '{{count}} Min.',
- showcaseSendShortlist: 'Auswahlliste senden',
+ showcaseSendShortlist: 'Auswahlliste verschicken',
showcaseDownloadXlsx: '.xlsx herunterladen',
showcaseTopThree: 'Top 3',
- showcaseScoutBullet1:
- 'Gehen Sie durch die Straßen, bevor die Inseratsuche Ihre Optionen einengt.',
+ showcaseScoutBullet1: 'Geh durch die Straßen, bevor die Inseratsuche deine Optionen einengt.',
showcaseScoutBullet2:
- 'Testen Sie den Pendelweg von einer echten Haustür, nicht nur anhand eines Bezirksnamens.',
- showcaseScoutBullet3: 'Vergleichen Sie Besichtigungen mit belastbaren Daten im Rücken.',
+ 'Teste den Pendelweg von einer echten Haustür, nicht nur anhand eines Bezirksnamens.',
+ showcaseScoutBullet3: 'Vergleiche Besichtigungen mit belastbaren Daten im Rücken.',
showcaseStep1Tab: 'Filtern',
showcaseStep1Title: 'Aus vagen Wünschen eine präzise Suche machen',
showcaseStep1Body:
- 'Legen Sie fest, was zählt, und sehen Sie genau, wie viele unpassende Postleitzahlen jede Anforderung aus Ihrer Suche ausschließt.',
+ 'Lege fest, was zählt, und sieh genau, wie viele unpassende Postleitzahlen jede Anforderung aus deiner Suche ausschließt.',
showcaseStep1Chip1: 'Ruhige Straßen',
showcaseStep1Chip2: 'Top-Grundschulen',
showcaseStep1Chip3: 'Unter £500k',
showcaseStep1VennCenter: 'Postleitzahlen, die alle drei erfüllen',
showcaseStep2Tab: 'Abgleichen',
- showcaseStep2Title: 'Die Karte zeigt Orte, die Sie nicht eingegeben hätten',
+ showcaseStep2Title: 'Lass die Karte Orte zeigen, die du nicht eingegeben hättest',
showcaseStep2Body:
- 'Durchsuchen Sie England nach Passung, statt mit vertrauten Gebietsnamen zu beginnen. Verborgene Ecken werden sichtbar, bevor Immobilienportale Ihre Suche einengen.',
+ 'Durchsuche England nach Passung, statt mit vertrauten Gebietsnamen zu beginnen. Verborgene Ecken werden sichtbar, bevor Immobilienportale deine Suche einengen.',
showcaseStep2Region: 'Großraum London',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
- showcaseStep2ClustersLabel: 'Passende Gruppen',
+ showcaseStep2ClustersLabel: 'Passende Cluster',
showcaseStep3Tab: 'Prüfen',
showcaseStep3Title: 'Prüfen, warum eine Postleitzahl passt',
showcaseStep3Body:
- 'Öffnen Sie ein passendes Gebiet und prüfen Sie Preise, Sicherheit, Schulen, Breitband und Kompromisse in einem Bereich, bevor Sie ein Wochenende dort verbringen.',
- showcaseStep3HeaderArea: 'Ihre perfekte Postleitzahl',
- showcaseStep3HeaderFit: 'Nachbarschaftsbelege',
+ 'Öffne ein passendes Gebiet und prüfe Preise, Sicherheit, Schulen, Breitband und Kompromisse in einem Bereich, bevor du ein Wochenende dort verbringst.',
+ showcaseStep3HeaderArea: 'Deine perfekte Postleitzahl',
+ showcaseStep3HeaderFit: 'Nachbarschaftsdaten',
showcaseStep3Stat1Label: 'Verkaufspreis-Trend',
showcaseStep3Stat2Label: 'Kriminalität',
showcaseStep3Stat2Value: 'Unter dem Bezirksdurchschnitt',
@@ -997,56 +999,56 @@ const de: Translations = {
showcaseStep4Tab: 'Erkunden',
showcaseStep4Title: 'Selbst vor Ort prüfen',
showcaseStep4Body:
- 'Nehmen Sie drei fundierte Ausgangspunkte mit in die echte Welt. Laufen Sie durch die Straßen, testen Sie den Pendelweg und vergleichen Sie Besichtigungen mit Kontext.',
+ 'Nimm drei fundierte Ausgangspunkte mit in die echte Welt. Lauf durch die Straßen, teste den Pendelweg und vergleiche Besichtigungen mit Kontext.',
showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Nach Excel exportieren',
showcaseStep4ColPostcode: 'Postleitzahl',
showcaseStep4ColScore: 'Passung',
- showcaseStep4ColCommute: 'Pendeln',
- showcaseStep4ColPrice: 'Median verkauft',
- showcaseStep4Conclusion: 'Von hier aus können Sie Ihre Suche beginnen.',
+ showcaseStep4ColCommute: 'Pendelweg',
+ showcaseStep4ColPrice: 'Median-Verkaufspreis',
+ showcaseStep4Conclusion: 'Von hier aus kannst du deine Suche beginnen.',
statProperties: 'historische Verkäufe',
statFilters: 'kombinierbare Filter',
statEvery: 'Jede',
statPostcodeInEngland: 'Postleitzahl in England',
- ourPhilosophy: 'Beginnen Sie mit dem, was zählt, und finden Sie die passende Postleitzahl',
+ ourPhilosophy: 'Beginne mit dem, was zählt, und finde die passende Postleitzahl',
philosophyP1:
- 'Die meisten Immobilienseiten fragen, wo Sie wohnen möchten. In London ist das besonders schwierig, aber das gleiche Problem gibt es in ganz England: Käufer starten mit wenigen bekannten Orten und prüfen dann Pendelzeit, Schulen, Kriminalität, Street View, Breitband und Verkaufspreise in getrennten Tabs.',
+ 'Die meisten Immobilienseiten fragen, wo du wohnen möchtest. In London ist das besonders schwierig, aber dasselbe Problem gibt es in ganz England: Käufer starten mit wenigen bekannten Orten und prüfen dann Pendelzeit, Schulen, Kriminalität, Street View, Breitband und Verkaufspreise in getrennten Tabs.',
philosophyP2:
- 'Perfect Postcode dreht die Suche um. Sagen Sie der Karte, was zählt, und sie zeigt passende Postleitzahlen mit nachvollziehbaren Gründen. Erst Daten, dann vor Ort das Gefühl prüfen.',
+ 'Perfect Postcode dreht die Suche um. Sag der Karte, was zählt, und sie zeigt passende Postleitzahlen mit nachvollziehbaren Gründen. Erst Daten, dann vor Ort das Gefühl prüfen.',
streetTitle: 'Orte ändern sich von Straße zu Straße',
streetIntro:
- 'Große Gebietsnamen verdecken die Details, die zählen: Bahnhofsseite, Straßenlärm, Schulmix, genaue Pendelzeit und echte Verkaufspreise.',
- streetCard1Title: 'Finden Sie Gegenden, die Sie übersehen hätten',
+ 'Grobe Gebietsnamen verdecken die Details, die zählen: Bahnhofsseite, Straßenlärm, Schulmix, genaue Pendelzeit und echte Verkaufspreise.',
+ streetCard1Title: 'Finde Gegenden, die du übersehen hättest',
streetCard1Body:
- 'Entdecken Sie Postleitzahlen, die Ihren Anforderungen entsprechen, statt sich nur auf bekannte Namen, Empfehlungen oder Hype zu verlassen.',
- streetCard2Title: 'Sehen Sie Kompromisse vor Besichtigungen',
+ 'Entdecke Postleitzahlen, die deinen Anforderungen entsprechen, statt dich nur auf bekannte Namen, Empfehlungen oder Hype zu verlassen.',
+ streetCard2Title: 'Sieh Kompromisse vor Besichtigungen',
streetCard2Body:
- 'Vergleichen Sie Preis, Platz, Pendelzeit, Sicherheit, Schulen, Breitband, Lärm und Energieeffizienz, bevor Sie Wochenenden mit Besichtigungen verbringen.',
- othersVs: 'Andere vs',
+ 'Vergleiche Preis, Platz, Pendelzeit, Sicherheit, Schulen, Breitband, Lärm und Energieeffizienz, bevor du Wochenenden mit Besichtigungen verbringst.',
+ othersVs: 'Andere vs.',
checkMyPostcode: 'Immobilienportale',
areaGuides: 'Postleitzahl-Berichte',
- compSearchWithout: 'Gegenden entdecken, bevor Sie die Namen kennen',
+ compSearchWithout: 'Gegenden entdecken, bevor du die Namen kennst',
compSearchWithoutSub: '(erst Anforderungen, dann Ort)',
compAreaData: 'Nachbarschaftsdaten auf Postleitzahl-Ebene',
- compAreaDataSub: '(Kriminalität, Schulen, Lärm, Breitband, Ausstattung)',
+ compAreaDataSub: '(Kriminalität, Schulen, Lärm, Breitband, Infrastruktur)',
compPropertyData: 'Historie auf Immobilienebene',
compPropertyDataSub: '(Verkaufspreise, EPC, Wohnfläche, Schätzwert)',
compFilters: '56 Filter, die zusammenarbeiten',
compFiltersSub: '(nicht eine Postleitzahl oder ein Inserat nach dem anderen)',
- ctaTitle: 'Hören Sie auf zu raten, wo Sie kaufen sollen.',
+ ctaTitle: 'Hör auf zu raten, wo du kaufen sollst.',
ctaDescription:
- 'Erstellen Sie eine Auswahlliste von Postleitzahlen, die zu Ihrem echten Leben passen, und prüfen Sie sie dann vor Ort.',
+ 'Erstelle eine Auswahlliste von Postleitzahlen, die zu deinem echten Leben passen, und prüfe sie dann vor Ort.',
},
// ── Pricing Page ───────────────────────────────────
pricingPage: {
title: 'Kaufen mit einem besseren Suchgebiet',
subtitle:
- 'Lebenslanger Zugang zu der Karte, die zeigt, wo Sie suchen sollten, bevor Sie Besichtigungen buchen.',
+ 'Lebenslanger Zugang zu der Karte, die zeigt, wo du suchen solltest, bevor du Besichtigungen buchst.',
costContext:
- 'Käufer verbringen oft Abende damit, Inserate, Pendelzeiten, Schulberichte, Kriminalitätskarten, Street View und Verkaufspreise zusammenzuführen. In London ist das besonders mühsam, aber dasselbe Rechercheproblem gibt es in ganz England. Perfect Postcode bringt die Gebietsrecherche auf eine Karte, bevor Sie Wochenenden, Gebühren und Aufmerksamkeit investieren.',
- lessThanSurvey: 'Weniger als ein Gutachten. Deutlich wirksamer, um Ihre Auswahl zu steuern.',
+ 'Käufer verbringen oft Abende damit, Inserate, Pendelzeiten, Schulberichte, Kriminalitätskarten, Street View und Verkaufspreise zusammenzuführen. In London ist das besonders mühsam, aber dasselbe Rechercheproblem gibt es in ganz England. Perfect Postcode bringt die Gebietsrecherche auf eine Karte, bevor du Wochenenden, Gebühren und Aufmerksamkeit investierst.',
+ lessThanSurvey: 'Weniger als ein Gutachten. Deutlich wirksamer, um deine Auswahl zu steuern.',
currentTier: 'Aktuelle Stufe',
firstNUsers: 'Erste {{count}} Nutzer',
everyoneAfter: 'Alle danach',
@@ -1064,7 +1066,7 @@ const de: Translations = {
upcoming: 'Demnächst',
failedToLoad: 'Preise konnten nicht geladen werden. Bitte später erneut versuchen.',
feat1: '56 Filter in ganz England',
- feat2: 'Jede Postleitzahl anhand Ihrer Bedürfnisse durchsuchbar',
+ feat2: 'Jede Postleitzahl anhand deiner Bedürfnisse durchsuchbar',
feat3: 'Unbegrenztes Erkunden der Karte, gespeicherte Suchen und Exporte',
feat4: '13 Mio. historische Transaktionen und Preiskontext',
feat5: 'Pendelzeit, Schulen, Kriminalität, Lärm, Breitband und mehr',
@@ -1080,17 +1082,16 @@ const de: Translations = {
dataSourcesIntro:
'Diese Anwendung kombiniert {{count}} offene Datensätze zu Immobilienpreisen, Energieeffizienz, Verkehr, Demografie, Kriminalität, Umwelt und mehr.',
faqIntro:
- 'Ob Sie eine Erstkäufersuche eingrenzen, eine unbekannte Postleitzahl prüfen oder eine Besichtigungsliste erstellen: So hilft Perfect Postcode dabei herauszufinden, wo Sie suchen sollten.',
+ 'Ob du eine Erstkäufersuche eingrenzt, eine unbekannte Postleitzahl prüfst oder eine Besichtigungsliste erstellst: So hilft Perfect Postcode dabei herauszufinden, wo du suchen solltest.',
articlesIntro:
- 'Durchsuchen Sie die öffentlichen Leitfäden zu Immobiliensuche, Pendeln, Schulen, Postleitzahlprüfungen, regionalen Vergleichen, Datenabdeckung, Methodik und Datenschutz.',
- supportIntro:
- 'Haben Sie eine Frage? Schauen Sie in unsere FAQ oder kontaktieren Sie uns direkt.',
+ 'Durchsuche die öffentlichen Leitfäden zu Immobiliensuche, Pendeln, Schulen, Postleitzahlprüfungen, regionalen Vergleichen, Datenabdeckung, Methodik und Datenschutz.',
+ supportIntro: 'Hast du eine Frage? Schau in unsere FAQ oder kontaktiere uns direkt.',
source: 'Quelle:',
optOut: 'Widerspruch gegen öffentliche Offenlegung',
attribution: 'Quellenangaben',
attrLandRegistry:
'Enthält Daten des HM Land Registry © Crown copyright and database right 2025.',
- attrOgl: 'Enthält öffentliche Informationen lizenziert unter der',
+ attrOgl: 'Enthält öffentliche Informationen, lizenziert unter der',
attrOglLink: 'Open Government Licence v3.0',
attrOs: 'Enthält OS-Daten © Crown copyright and database rights 2025.',
attrTfl: 'Betrieben mit TfL Open Data.',
@@ -1101,11 +1102,11 @@ const de: Translations = {
// Data source names & descriptions
dsPricePaidName: 'Verkaufspreisdaten',
dsPricePaidOrigin: 'HM Land Registry',
- dsPricePaidUse: 'Vollständige historische Immobilien-Verkaufspreise für England.',
+ dsPricePaidUse: 'Vollständige historische Immobilienverkaufspreise für England.',
dsEpcName: 'Energieausweise (EPC)',
dsEpcOrigin: 'Ministry of Housing, Communities & Local Government',
dsEpcUse:
- 'Energieausweise für Wohngebäude mit Angaben zu Wohnfläche, Zimmeranzahl, Baujahr, Energiebewertungen, Immobilientyp und Bauform. Über Adresse innerhalb jeder Postleitzahl mit Price-Paid-Daten verknüpft. Eigentümer können der öffentlichen Offenlegung widersprechen.',
+ 'Energieausweise für Wohngebäude mit Angaben zu Wohnfläche, Zimmeranzahl, Baujahr, Energieeffizienzklassen, Immobilientyp und Bauform. Über die Adresse innerhalb jeder Postleitzahl mit Price-Paid-Daten verknüpft. Eigentümer können der öffentlichen Offenlegung widersprechen.',
dsNsplName: 'Nationales Postleitzahlenverzeichnis (NSPL)',
dsNsplOrigin: 'ONS / ArcGIS',
dsNsplUse:
@@ -1125,11 +1126,11 @@ const de: Translations = {
dsOsmName: 'OpenStreetMap-POIs',
dsOsmOrigin: 'OpenStreetMap contributors / Geofabrik',
dsOsmUse:
- 'Sehenswürdigkeiten und Einrichtungen wie Geschäfte, Restaurants, Gesundheitseinrichtungen, Freizeit, Tourismus und mehr in ganz Großbritannien.',
+ 'Interessante Orte wie Geschäfte, Restaurants, Gesundheitseinrichtungen, Freizeitangebote, Tourismus und mehr in ganz Großbritannien.',
dsGeolytixRetailName: 'GEOLYTIX-Lebensmittelhandelsstandorte',
dsGeolytixRetailOrigin: 'GEOLYTIX',
dsGeolytixRetailUse:
- 'Supermarkt- und Convenience-Store-Standorte im Vereinigten Königreich, darunter Ketten wie Waitrose, Tesco, Sainsbury’s, Asda, Morrisons, Aldi, Lidl, Co-op, M&S, Iceland und Spar.',
+ 'Supermarkt- und Nahversorgerstandorte im Vereinigten Königreich, darunter Ketten wie Waitrose, Tesco, Sainsbury’s, Asda, Morrisons, Aldi, Lidl, Co-op, M&S, Iceland und Spar.',
dsGreenspaceName: 'OS-Open-Greenspace-Daten',
dsGreenspaceOrigin: 'Ordnance Survey',
dsGreenspaceUse:
@@ -1138,10 +1139,10 @@ const de: Translations = {
dsTowOrigin: 'Forest Research / Defra NCEA',
dsTowUse:
'Baumkronen-Polygone für Einzelbäume, Baumgruppen und kleine Gehölze in England. Hier verwendet, um Baumdeckungs-Perzentile rund um Postleitzahlen-Zentroide zu schätzen.',
- dsConservationAreasName: 'Historic England Erhaltungsgebiete',
+ dsConservationAreasName: 'Historic England Conservation Areas (Denkmalschutzgebiete)',
dsConservationAreasOrigin: 'Historic England und lokale Planungsbehörden',
dsConservationAreasUse:
- 'Grenzen ausgewiesener Conservation Areas in England. Wird genutzt, um zu kennzeichnen, ob der repräsentative Punkt einer Postleitzahl innerhalb eines solchen Gebiets liegt.',
+ 'Grenzen ausgewiesener Conservation Areas in England. Wird genutzt, um zu kennzeichnen, ob der repräsentative Punkt einer Postleitzahl innerhalb eines solchen Denkmalschutzgebiets liegt.',
dsListedBuildingsName: 'Historic England denkmalgeschützte Gebäude',
dsListedBuildingsOrigin: 'Historic England National Heritage List for England',
dsListedBuildingsUse:
@@ -1157,7 +1158,7 @@ const de: Translations = {
dsOfstedName: 'Ofsted-Schulinspektionen',
dsOfstedOrigin: 'Ofsted',
dsOfstedUse:
- 'Neueste Inspektionsergebnisse für staatlich finanzierte Schulen (Stand April 2025). Pro Postleitzahl gemittelt für einen lokalen Schulqualitätswert (1=Hervorragend bis 4=Unzureichend).',
+ 'Neueste Inspektionsergebnisse für staatlich finanzierte Schulen (Stand April 2025). Pro Postleitzahl gemittelt zu einem lokalen Schulqualitätswert (1=Hervorragend bis 4=Unzureichend).',
dsBroadbandName: 'Ofcom-Breitbandleistung',
dsBroadbandOrigin: 'Ofcom',
dsBroadbandUse:
@@ -1176,7 +1177,7 @@ const de: Translations = {
'Ergebnisse auf Kandidatenebene der britischen Parlamentswahl vom Juli 2024. Aggregiert auf Wahlkreisebene: Wahlbeteiligung (%) und Parteistimmenanteile (%). Über den Wahlkreiscode (pcon) aus dem NSPL-Postleitzahlenverzeichnis mit Immobilien verknüpft.',
// FAQ section titles
faqFindingTitle: 'Wo suchen',
- faqCommuteTitle: 'Reisezeiten',
+ faqCommuteTitle: 'Fahrzeiten',
faqBudgetTitle: 'Geschätzte Preise',
faqSafetyTitle: 'Sicherheit und Nachbarschaft',
faqFamiliesTitle: 'Familien und Schulen',
@@ -1190,104 +1191,104 @@ const de: Translations = {
// FAQ items — Finding Your Area
faqFinding1Q: 'Wo soll ich suchen, wenn die offensichtlichen Gebiete zu teuer sind?',
faqFinding1A:
- 'Beginnen Sie mit dem, worauf Sie nicht verzichten können: Budget, Haustyp, Platz, Pendelzeit, Schulen, Sicherheit, Lärm, Breitband, Parks und alles Weitere, was wichtig ist. Die Karte blendet Orte aus, die nicht passen, sodass weniger offensichtliche Gebiete sichtbar werden, bevor Sie Inserate durchsehen.',
+ 'Beginne mit dem, worauf du nicht verzichten kannst: Budget, Haustyp, Platz, Pendelzeit, Schulen, Sicherheit, Lärm, Breitband, Parks und alles Weitere, was wichtig ist. Die Karte blendet Orte aus, die nicht passen, sodass weniger offensichtliche Gebiete sichtbar werden, bevor du Inserate durchsuchst.',
faqFinding2Q: 'Wie finde ich gute Postleitzahlen in Gegenden, die ich kaum kenne?',
faqFinding2A:
- 'Setzen Sie Ihre Muss-Anforderungen auf der ganzen Karte und prüfen Sie dann die verbleibenden Gruppen. Unbekannte Postleitzahlen lassen sich nach Pendelzeit, Verkaufspreisen, Schulen, Kriminalität, Breitband, Lärm sowie Läden oder Parks in der Nähe vergleichen, statt sich auf den Ruf eines Gebiets zu verlassen.',
+ 'Setze deine Muss-Anforderungen auf der ganzen Karte und prüfe dann die verbleibenden Gruppen. Unbekannte Postleitzahlen lassen sich nach Pendelzeit, Verkaufspreisen, Schulen, Kriminalität, Breitband, Lärm sowie Läden oder Parks in der Nähe vergleichen, statt sich auf den Ruf eines Gebiets zu verlassen.',
faqFinding3Q: 'Was mache ich, wenn die Suche zu viele oder zu wenige Gebiete zeigt?',
faqFinding3A:
- 'Lassen Sie Ihre Muss-Anforderungen aktiv und färben Sie die Karte nach einer Sache ein, die Sie vergleichen möchten, etwa Preis pro m², Straßenlärm, Schulscore oder Reisezeit. Wenn fast nichts übrig bleibt, lockern Sie einen Regler und sehen, welche Änderung neue Optionen öffnet.',
+ 'Lass deine Muss-Anforderungen aktiv und färbe die Karte nach einer Sache ein, die du vergleichen möchtest, etwa Preis pro m², Straßenlärm, Schulbewertung oder Fahrzeit. Wenn fast nichts übrig bleibt, lockere einen Regler und sieh, welche Änderung neue Optionen öffnet.',
// FAQ items — Commute and Travel
- faqCommute1Q: 'Wie werden die Reisezeiten berechnet?',
+ faqCommute1Q: 'Wie werden die Fahrzeiten berechnet?',
faqCommute1A:
- 'Die Reisezeiten werden im Voraus für jedes gespeicherte Ziel berechnet. Wir prüfen, welche Postleitzahlen dieses Ziel per Auto, Fahrrad, zu Fuß oder mit öffentlichen Verkehrsmitteln erreichen können, und speichern diese Ergebnisse, damit die Karte beim Filtern schnell reagiert.',
- faqCommute2Q: 'Was sollte ich über die Reisezeitwerte wissen?',
+ 'Die Fahrzeiten werden im Voraus für jedes gespeicherte Ziel berechnet. Wir prüfen, welche Postleitzahlen dieses Ziel per Auto, Fahrrad, zu Fuß oder mit öffentlichen Verkehrsmitteln erreichen können, und speichern diese Ergebnisse, damit die Karte beim Filtern schnell reagiert.',
+ faqCommute2Q: 'Was sollte ich über die Fahrzeitwerte wissen?',
faqCommute2A:
'Zeiten für öffentliche Verkehrsmittel basieren auf einem Pendelweg an Wochentagen morgens, mit Abfahrten zwischen 07:30 und 08:30. Die normale Einstellung zeigt eine typische Fahrt in diesem Zeitraum. Es sind Planungswerte, keine Echtzeitverspätungen, Verkehrsmeldungen oder kurzfristigen Gleiswechsel.',
- faqCommute3Q: 'Wann sollte ich die Bestfall-Schaltfläche nutzen?',
+ faqCommute3Q: 'Wann sollte ich die Bestwert-Schaltfläche nutzen?',
faqCommute3A:
- 'Nutzen Sie die Bestfall-Schaltfläche bei ÖPNV-Suchen, wenn Sie die Fahrt mit gut gewählter Abfahrt und guten Anschlüssen sehen möchten. Lassen Sie sie für den Alltagsvergleich ausgeschaltet, da die normale Einstellung näher daran liegt, was Sie an den meisten Tagen erwarten sollten.',
+ 'Nutze die Bestwert-Schaltfläche bei ÖPNV-Suchen, wenn du die Fahrt mit gut gewählter Abfahrt und guten Anschlüssen sehen möchtest. Lass sie für den Alltagsvergleich ausgeschaltet, da die normale Einstellung näher an dem liegt, was du an den meisten Tagen erwarten solltest.',
// FAQ items — Budget and Value
- faqBudget1Q: 'Wie schätzen Sie aktuelle Immobilienpreise?',
+ faqBudget1Q: 'Wie schätzt ihr aktuelle Immobilienpreise?',
faqBudget1A:
- 'Die Schätzung beginnt mit dem letzten bei HM Land Registry erfassten Verkaufspreis. Wir bringen diesen Verkauf näher an den heutigen Markt, indem wir betrachten, wie sich ähnliche Häuser entwickelt haben, besonders Häuser desselben Typs in der Nähe. Wenn es nur wenige lokale Verkäufe gibt, stützt sich die Schätzung stärker auf weiterreichende Gebietstrends. Anschließend wird sie mit nahegelegenen jüngeren Verkäufen und der Wohnfläche abgeglichen, damit das Ergebnis für Vergleiche nützlich ist.',
+ 'Die Schätzung beginnt mit dem letzten bei HM Land Registry erfassten Verkaufspreis. Wir bringen diesen Verkauf näher an den heutigen Markt, indem wir betrachten, wie sich ähnliche Immobilien entwickelt haben, besonders Immobilien desselben Typs in der Nähe. Wenn es nur wenige lokale Verkäufe gibt, stützt sich die Schätzung stärker auf weiter gefasste Gebietstrends. Anschließend wird sie mit nahegelegenen jüngeren Verkäufen und der Wohnfläche abgeglichen, damit das Ergebnis für Vergleiche nützlich ist.',
faqBudget2Q: 'Warum den geschätzten aktuellen Preis statt des letzten Verkaufspreises nutzen?',
faqBudget2A:
- 'Der letzte Verkaufspreis kann Jahre oder Jahrzehnte alt sein, und Angebotspreise zeigen nur, was heute zum Verkauf steht. Der geschätzte aktuelle Preis bringt ältere Verkäufe näher an den heutigen Markt, damit Sie mehr Häuser vergleichen und Gebiete mit möglichem Wert erkennen können, bevor passende Inserate erscheinen. Nutzen Sie ihn als Orientierung für Ihre Auswahlliste, nicht als Bankbewertung.',
+ 'Der letzte Verkaufspreis kann Jahre oder Jahrzehnte alt sein, und Angebotspreise zeigen nur, was heute zum Verkauf steht. Der geschätzte aktuelle Preis bringt ältere Verkäufe näher an den heutigen Markt, damit du mehr Immobilien vergleichen und Gebiete mit möglichem Wert erkennen kannst, bevor passende Inserate erscheinen. Nutze ihn als Orientierung für deine Auswahlliste, nicht als Bankbewertung.',
// FAQ items — Safety and Neighbourhood
faqSafety1Q: 'Welche Art von Kriminalität ist rund um diese Postleitzahl häufig?',
faqSafety1A:
- 'Kriminalität ist nach Art aufgeschlüsselt, etwa Gewalt, Einbruch, Raub, Fahrzeugkriminalität, antisoziales Verhalten, Ladendiebstahl, Drogen und öffentliche Ordnung. Sie können sich auf die Risiken konzentrieren, die Ihnen wichtig sind, statt sich auf einen vagen Sicherheitswert zu verlassen.',
+ 'Kriminalität ist nach Art aufgeschlüsselt, etwa Gewalt, Einbruch, Raub, Fahrzeugkriminalität, antisoziales Verhalten, Ladendiebstahl, Drogen und öffentliche Ordnung. Du kannst dich auf die Risiken konzentrieren, die dir wichtig sind, statt dich auf einen vagen Sicherheitswert zu verlassen.',
faqSafety2Q: 'Was sollte ich vor einer Besichtigung in einer unbekannten Straße prüfen?',
faqSafety2A:
- 'Prüfen Sie Kriminalität, Straßenlärm, Breitband, Parks, Lebensmittelgeschäfte, Schulen und Pendelzeit, bevor Sie buchen. Inseratsfotos können nützlich sein, sollten aber nicht das Erste sein, woraus Sie erfahren, wie die Straße ist.',
+ 'Prüfe Kriminalität, Straßenlärm, Breitband, Parks, Lebensmittelgeschäfte, Schulen und Pendelzeit, bevor du buchst. Inseratsfotos können nützlich sein, sollten aber nicht das Erste sein, woraus du erfährst, wie die Straße ist.',
// FAQ items — Families and Schools
faqFamilies1Q:
'Welche Gebiete haben die richtige Mischung aus Schulen, Platz, Sicherheit und Pendelzeit?',
faqFamilies1A:
- 'Legen Sie Schulbewertungen, Kriminalität, Parks, Pendelzeit, Platz, Haustyp und Budget auf eine Karte. Das Ergebnis ist eine praktische Familien-Auswahlliste statt vieler getrennter Suchen.',
+ 'Lege Schulbewertungen, Kriminalität, Parks, Pendelzeit, Platz, Haustyp und Budget auf eine Karte. Das Ergebnis ist eine praktische Familien-Auswahlliste statt vieler einzelner Suchen.',
faqFamilies2Q: 'Beweist das, dass ich im Einzugsgebiet einer Schule liege?',
faqFamilies2A:
- 'Nein. Wir zeigen nahegelegene Schulqualität und lokale Bildungsinformationen, aber Aufnahmegebiete und Prioritätsregeln können sich ändern. Nutzen Sie Perfect Postcode zur Auswahl und prüfen Sie Einzugsgebiete anschließend bei der Schule oder Gemeinde.',
+ 'Nein. Wir zeigen nahegelegene Schulqualität und lokale Bildungsinformationen, aber Aufnahmegebiete und Prioritätsregeln können sich ändern. Nutze Perfect Postcode für die Vorauswahl und prüfe Einzugsgebiete anschließend bei der Schule oder Gemeinde.',
// FAQ items — Environment and Quality of Life
faqEnv1Q:
'Wie vermeide ich eine laute Straße, ohne Pendelzeit oder Breitbandqualität zu verlieren?',
faqEnv1A:
- 'Filtern Sie nach Straßenlärm und lassen Sie Pendelzeit, Breitband, Preis und Hausfilter aktiv. Sie können die Karte nach einem Merkmal einfärben, während die anderen Filter die Auswahlliste realistisch halten.',
+ 'Filtere nach Straßenlärm und lass Pendelzeit, Breitband, Preis und Immobilienfilter aktiv. Du kannst die Karte nach einem Merkmal einfärben, während die anderen Filter die Auswahlliste realistisch halten.',
faqEnv2Q: 'Zeigt es Hochwasserrisiko, Bodensenkungen oder Gutachterprobleme?',
faqEnv2A:
'Nicht heute. Wir zeigen Straßenlärm, Energieklasse, Baualter und die lokale Umgebung rund um die Postleitzahl. Hochwasserrisiko, rechtliche Fragen, bauliche Mängel, Finanzierungsthemen und Gutachten müssen vor dem Kauf separat geprüft werden.',
faqEnv3Q: 'Welche laufenden Kosten kann ich vor einer Besichtigung prüfen?',
faqEnv3A:
- 'Sie können vor der Besichtigung Energieklasse, Wohnfläche, Baualter, Council-Tax-Gebiet, Breitband und Lärm prüfen. Das sagt Ihre genauen Rechnungen nicht voraus, hilft aber, offensichtliche Fehlgriffe früh zu vermeiden.',
+ 'Du kannst vor der Besichtigung Energieklasse, Wohnfläche, Baualter, Council-Tax-Gebiet, Breitband und Lärm prüfen. Das sagt deine genauen Rechnungen nicht voraus, hilft aber, offensichtliche Fehlgriffe früh zu vermeiden.',
// FAQ items — Listing Portals and Due Diligence
faqDueDiligence1Q: 'Sollte ich das vor oder nach Rightmove nutzen?',
faqDueDiligence1A:
- 'Nutzen Sie Perfect Postcode vor und parallel zu Inseratsseiten. Rightmove, Zoopla und OnTheMarket bleiben die Orte für aktuell verfügbare Häuser, Fotos, Makler, Besichtigungen und Benachrichtigungen. Perfect Postcode hilft zu entscheiden, welche Postleitzahlen die Suche wert sind.',
+ 'Nutze Perfect Postcode vor und parallel zu Inseratsseiten. Rightmove, Zoopla und OnTheMarket bleiben die Orte für aktuell verfügbare Immobilien, Fotos, Makler, Besichtigungen und Benachrichtigungen. Perfect Postcode hilft zu entscheiden, welche Postleitzahlen die Suche wert sind.',
faqDueDiligence2Q: 'Warum kann ich nicht nach Garten, Garage oder Grundriss filtern?',
faqDueDiligence2A:
- 'Diese Details sind nicht für jedes Haus zuverlässig verfügbar. Perfect Postcode kann nach Wohnfläche, Haustyp, Eigentumsform, Energieklasse, Verkaufspreisen und lokalen Informationen filtern. Gärten, Garagen, Ausrichtung, Raumaufteilung und Maklerformulierungen müssen weiterhin in der Anzeige und bei der Besichtigung geprüft werden.',
+ 'Diese Details sind nicht für jede Immobilie zuverlässig verfügbar. Perfect Postcode kann nach Wohnfläche, Immobilientyp, Eigentumsform, Energieklasse, Verkaufspreisen und lokalen Informationen filtern. Gärten, Garagen, Ausrichtung, Raumaufteilung und Maklerformulierungen müssen weiterhin im Inserat und bei der Besichtigung geprüft werden.',
faqDueDiligence3Q: 'Kann ich Preisreduzierungen oder die Online-Dauer eines Inserats sehen?',
faqDueDiligence3A:
- 'Derzeit nicht. Perfect Postcode basiert auf Verkaufspreisen, Energieklassen, Postleitzahlen, Reisezeiten und Nachbarschaftsinformationen, nicht auf Echtzeitänderungen in Inseraten. Sie können aber Verkaufshistorie, geschätzten aktuellen Wert und Preis pro m² nutzen, um einzuschätzen, ob ein Angebotspreis hoch wirkt.',
+ 'Derzeit nicht. Perfect Postcode basiert auf Verkaufspreisen, Energieklassen, Postleitzahlen, Fahrzeiten und Nachbarschaftsinformationen, nicht auf Echtzeitänderungen in Inseraten. Du kannst aber Verkaufshistorie, geschätzten aktuellen Wert und Preis pro m² nutzen, um einzuschätzen, ob ein Angebotspreis hoch wirkt.',
faqDueDiligence4Q: 'Was sollte ich vor einem Angebot trotzdem prüfen?',
faqDueDiligence4A:
- 'Nutzen Sie Perfect Postcode, um Gebiet und wahrscheinlichen Wert zu prüfen, und bestätigen Sie dann die Inseratsdetails vor einem Angebot. Prüfen Sie außerdem die Eigentumsform, Details zum Erbbaurecht, Nebenkosten, Planungshistorie, Hochwasserrisiko, rechtliche Fragen, Hypothekenanforderungen und Gutachten.',
+ 'Nutze Perfect Postcode, um Gebiet und wahrscheinlichen Wert zu prüfen, und bestätige dann die Inseratsdetails vor einem Angebot. Prüfe außerdem die Eigentumsform, Details zum Erbbaurecht, Nebenkosten, Planungshistorie, Hochwasserrisiko, rechtliche Fragen, Hypothekenanforderungen und Gutachten.',
// FAQ items — Privacy and Data Protection
- faqPrivacy1Q: 'Speichern Sie personenbezogene Daten über mich?',
+ faqPrivacy1Q: 'Speichert ihr personenbezogene Daten über mich?',
faqPrivacy1A:
- 'Die Immobilien- und Nachbarschaftsinformationen enthalten keine persönlichen Angaben über Sie. Wenn Sie ein Konto erstellen, speichern wir nur, was für den Dienst nötig ist, etwa E-Mail-Adresse, Zugangsstatus, Newsletter-Auswahl, gespeicherte Suchen, geteilte Links und von Stripe verwaltete Zahlungsdaten. Diese Kontodaten behandeln wir nach britischem Datenschutzrecht.',
+ 'Die Immobilien- und Nachbarschaftsinformationen enthalten keine persönlichen Angaben über dich. Wenn du ein Konto erstellst, speichern wir nur, was für den Dienst nötig ist, etwa E-Mail-Adresse, Zugangsstatus, Newsletter-Auswahl, gespeicherte Suchen, geteilte Links und von Stripe verwaltete Zahlungsdaten. Diese Kontodaten behandeln wir nach britischem Datenschutzrecht.',
// FAQ items — Why Perfect Postcode
faqWhy1Q: 'Was zeigt das, was Immobilienportale normalerweise nicht zeigen?',
faqWhy1A:
- 'Inseratsseiten beginnen mit Häusern, die gerade zum Verkauf stehen. Perfect Postcode beginnt mit Orten, die zu Ihrem Leben und Budget passen, mit Verkaufspreisen, Platz, Pendelzeit, Schulen, Kriminalität, Lärm, Breitband, Energieklasse, Eigentumsform und Ausstattung, bevor Sie Inserate öffnen.',
+ 'Inseratsseiten beginnen mit Immobilien, die gerade zum Verkauf stehen. Perfect Postcode beginnt mit Orten, die zu deinem Leben und Budget passen, mit Verkaufspreisen, Platz, Pendelzeit, Schulen, Kriminalität, Lärm, Breitband, Energieklasse, Eigentumsform und Infrastruktur, bevor du Inserate öffnest.',
faqWhy2Q: 'Wie viel manuelle Recherche spart das?',
faqWhy2A:
- 'Sie könnten das selbst tun, aber dann müssten Sie Verkaufspreise, Energieklassen, Kriminalität, Schulen, Breitband, lokale Fakten, Umwelt, Reisezeiten und Karten Postleitzahl für Postleitzahl prüfen. Perfect Postcode bringt diese Quellen in einer durchsuchbaren Karte für England zusammen.',
+ 'Du könntest das selbst tun, aber dann müsstest du Verkaufspreise, Energieklassen, Kriminalität, Schulen, Breitband, lokale Fakten, Umwelt, Fahrzeiten und Karten Postleitzahl für Postleitzahl prüfen. Perfect Postcode bringt diese Quellen in einer durchsuchbaren Karte für England zusammen.',
faqWhy3Q: 'Wie verlässlich sind die Daten?',
faqWhy3A:
'Die wichtigsten Quellen sind offizielle oder weit genutzte öffentliche Daten: Verkaufspreise, Energieklassen, lokale Fakten, Schulbewertungen, Breitband, Kriminalität, Umwelt, Karten und Straßendaten. Sie sind nützlich für Auswahllisten und Vergleiche, aber jede Kaufentscheidung braucht aktuelle Prüfungen und bei Bedarf fachlichen Rat.',
// FAQ items — Pricing and Access
faqPricing1Q: 'Warum bezahlen, wenn Postleitzahlberichte kostenlos sind?',
faqPricing1A:
- 'Kostenlose Postleitzahltools sind nützlich, wenn Sie schon wissen, was Sie prüfen wollen. Perfect Postcode durchsucht jede Postleitzahl in England nach Ihren Bedürfnissen, kombiniert Filter, vergleicht Optionen, speichert Suchen und exportiert eine Auswahlliste, bevor Sie Wochenenden für Besichtigungen einplanen.',
+ 'Kostenlose Postleitzahltools sind nützlich, wenn du schon weißt, was du prüfen willst. Perfect Postcode durchsucht jede Postleitzahl in England nach deinen Bedürfnissen, kombiniert Filter, vergleicht Optionen, speichert Suchen und exportiert eine Auswahlliste, bevor du Wochenenden für Besichtigungen einplanst.',
faqPricing2Q: 'Was bedeutet lebenslanger Zugang?',
faqPricing2A:
- 'Lebenslanger Zugang bedeutet, dass eine Zahlung Ihrem Konto laufenden Zugriff auf die kostenpflichtige Perfect-Postcode-Karte für die Lebensdauer des Dienstes gibt. Es ist kein Monats- oder Jahresabo, und normale Datenaktualisierungen sind enthalten. Sie können es während dieser Suche nutzen, später zurückkommen und weiterhin Zugriff haben, wenn Sie erneut umziehen.',
+ 'Lebenslanger Zugang bedeutet, dass eine Zahlung deinem Konto laufenden Zugriff auf die kostenpflichtige Perfect-Postcode-Karte für die Lebensdauer des Dienstes gibt. Es ist kein Monats- oder Jahresabo, und normale Datenaktualisierungen sind enthalten. Du kannst es während dieser Suche nutzen, später zurückkommen und weiterhin Zugriff haben, wenn du erneut umziehst.',
faqPricing3Q: 'Was kann ich mit der kostenlosen Version nutzen?',
faqPricing3A:
- 'Kostenlose Nutzer können alle Funktionen im Demogebiet erkunden (Innenstadt London, ungefähr Zonen 1 bis 2). Für den Zugang zu Daten für den Rest Englands benötigen Sie den lebenslangen Zugang.',
+ 'Kostenlose Nutzer können alle Funktionen im Demogebiet erkunden (Innenstadt London, ungefähr Zonen 1 bis 2). Für den Zugang zu Daten für den Rest Englands benötigst du den lebenslangen Zugang.',
// FAQ items — Tips and Tricks
faqTips1Q: 'Wie sehe ich eine Filtervorschau auf der Karte?',
faqTips1A:
- 'Klicken Sie auf „Färben“ neben einem Filter oder Merkmal, um die Karte nach diesem Punkt einzufärben. Ihre aktiven Filter bleiben bestehen, sodass Sie schnell eine Sache wie Preis, Pendelzeit, Schulen, Kriminalität oder Lärm vergleichen können, ohne die Auswahlliste zu ändern.',
+ 'Klicke auf „Färben“ neben einem Filter oder Merkmal, um die Karte nach diesem Punkt einzufärben. Deine aktiven Filter bleiben bestehen, sodass du schnell eine Sache wie Preis, Pendelzeit, Schulen, Kriminalität oder Lärm vergleichen kannst, ohne die Auswahlliste zu ändern.',
faqTips2Q: 'Wie erfahre ich, was ein Filter bedeutet?',
faqTips2A:
- 'Klicken Sie auf „Info“ neben einem Filter oder Merkmal, um eine kurze Erklärung zu sehen, was es bedeutet und wie Sie es lesen. Einige Teile der Karte, etwa Reisezeitkarten, haben ebenfalls eine eigene Datenerklärung.',
+ 'Klicke auf „Info“ neben einem Filter oder Merkmal, um eine kurze Erklärung zu sehen, was es bedeutet und wie du es liest. Einige Teile der Karte, etwa Fahrzeitkarten, haben ebenfalls eine eigene Datenerklärung.',
faqTips3Q: 'Wie aktualisiere ich die Kartenfarben?',
faqTips3A:
- 'Wenn ein Merkmal die Karte einfärbt, nutzen Sie „Farbskala zurücksetzen“ in der Kartenlegende, um die Farben für die aktuell angezeigten Ergebnisse zu aktualisieren. Das ist nach Verschieben, Zoomen oder geänderten Filtern nützlich.',
+ 'Wenn ein Merkmal die Karte einfärbt, nutze „Farbskala zurücksetzen“ in der Kartenlegende, um die Farben für die aktuell angezeigten Ergebnisse zu aktualisieren. Das ist nach Verschieben, Zoomen oder geänderten Filtern nützlich.',
// FAQ items — Behind The Data
faqBehindData1Q: 'Warum wirkt ein Flughafen manchmal leiser als die Straßen drumherum?',
@@ -1302,24 +1303,24 @@ const de: Translations = {
'Polizeilich erfasste Kriminalität auf Straßenebene wird auf LSOA-Ebene veröffentlicht — kleine Nachbarschaftsgebiete mit etwa 1.500 Einwohnern. Jede Postleitzahl innerhalb derselben LSOA übernimmt dieselben Jahreszahlen, sodass eine ruhige Wohnstraße und eine Hauptstraße einen Block entfernt identische Werte zeigen können, wenn sie auf derselben Seite der Grenze liegen. Die Pro-Kopf-Rate kann in Postleitzahlen mit Krankenhäusern, Universitätsgeländen oder Industriegebieten ungewöhnlich hoch wirken, weil dort viele Vorfälle gezählt werden, aber wenige Einwohner gemeldet sind.',
faqBehindData4Q: 'Bedeutet „Gute Schulen in 2 km Umkreis“, dass mein Kind dorthin gehen kann?',
faqBehindData4A:
- 'Nein. Die Zählung sucht staatliche Schulen, deren eigene Postleitzahl in einem Kreis um Ihren Postleitzahl-Mittelpunkt liegt. Einzugsgebiete, konfessionelle oder selektive Aufnahmekriterien, Geschwisterregelungen und Anmeldebedingungen werden nicht modelliert — eine nahegelegene Gute oder Hervorragende Schule kann von Ihrer Adresse aus unerreichbar sein. Nutzen Sie die Zahl, um Gebiete zu vergleichen, und prüfen Sie tatsächliche Aufnahmebedingungen bei der Schule oder Gemeinde, bevor Sie sich darauf verlassen.',
+ 'Nein. Die Zählung sucht staatliche Schulen, deren eigene Postleitzahl in einem Kreis um deinen Postleitzahl-Mittelpunkt liegt. Einzugsgebiete, konfessionelle oder selektive Aufnahmekriterien, Geschwisterregelungen und Anmeldebedingungen werden nicht modelliert — eine nahegelegene Gute oder Hervorragende Schule kann von deiner Adresse aus unerreichbar sein. Nutze die Zahl, um Gebiete zu vergleichen, und prüfe tatsächliche Aufnahmebedingungen bei der Schule oder Gemeinde, bevor du dich darauf verlässt.',
faqBehindData5Q:
'Warum zeigt eine Postleitzahl „Gigabit“, wenn nicht jedes Haus Glasfaser hat?',
faqBehindData5A:
- 'Breitbandabdeckung aus Ofcom Connected Nations wird pro Postleitzahl als Prozentsatz der Wohnungen ausgewiesen, die jede Geschwindigkeitsstufe erreichen können. Wir zeigen die höchste Stufe mit irgendeiner Verfügbarkeit, also liest sich eine Postleitzahl als „Gigabit verfügbar“, wenn auch nur ein einziges Zuhause es bekommen kann. Das ist die richtige Antwort auf „gibt es überhaupt Glasfaser auf dieser Straße?“, aber keine Garantie, dass jede Wohnung im Block heute bestellbar ist. Prüfen Sie immer mit den Anbietern für Ihre konkrete Adresse, bevor Sie unterschreiben.',
+ 'Breitbandabdeckung aus Ofcom Connected Nations wird pro Postleitzahl als Prozentsatz der Wohnungen ausgewiesen, die jede Geschwindigkeitsstufe erreichen können. Wir zeigen die höchste Stufe mit irgendeiner Verfügbarkeit, also liest sich eine Postleitzahl als „Gigabit verfügbar“, wenn auch nur ein einziges Zuhause es bekommen kann. Das ist die richtige Antwort auf „gibt es überhaupt Glasfaser auf dieser Straße?“, aber keine Garantie, dass jede Wohnung im Block heute bestellbar ist. Prüfe immer mit den Anbietern für deine konkrete Adresse, bevor du unterschreibst.',
faqBehindData6Q: 'Warum ändern sich die ÖPNV-Zeiten nicht für Abende oder Wochenenden?',
faqBehindData6A:
- 'ÖPNV-Zeiten werden pro Ziel einmal für ein Dienstag-Morgen-Zeitfenster (07:30–08:30) anhand vollständiger GTFS-Fahrpläne berechnet. Der „normale“ Wert ist die Median-Fahrt in diesem Fenster, der „Bestfall“ das 5. Perzentil. Nebenzeiten, Spätabende und Wochenenden werden nicht modelliert, sodass eine Postleitzahl mit nur einem Hauptzeit-Bus auf der Karte trotzdem gut angebunden aussehen kann. Verstehen Sie die Zahlen als wochentägliche Pendel-Schätzung, nicht als Tagesdurchschnitt.',
+ 'ÖPNV-Zeiten werden pro Ziel einmal für ein Dienstagmorgen-Zeitfenster (07:30–08:30) anhand vollständiger GTFS-Fahrpläne berechnet. Der „normale“ Wert ist die Median-Fahrt in diesem Fenster, der „Bestwert“ das 5. Perzentil. Nebenzeiten, Spätabende und Wochenenden werden nicht modelliert, sodass eine Postleitzahl mit nur einem Bus zur Hauptverkehrszeit auf der Karte trotzdem gut angebunden aussehen kann. Verstehe die Zahlen als wochentägliche Pendelschätzung, nicht als Tagesdurchschnitt.',
},
// ── Account Page ───────────────────────────────────
accountPage: {
emailLabel: 'E-Mail',
subscriptionLabel: 'Abonnement',
- upgrade: 'Upgraden',
+ upgrade: 'Upgrade durchführen',
redirecting: 'Weiterleitung…',
receiveNewsletter: 'Newsletter-E-Mails erhalten',
- needHelp: 'Brauchen Sie Hilfe? Schreiben Sie uns an',
+ needHelp: 'Brauchst du Hilfe? Schreib uns an',
responseTime: 'Wir antworten in der Regel innerhalb von 24 Stunden.',
shareLinksTitle: 'Geteilte Links',
noShareLinksYet: 'Noch keine geteilten Links',
@@ -1332,14 +1333,14 @@ const de: Translations = {
searches: 'Suchen',
noSavedSearches: 'Noch keine gespeicherten Suchen',
noSavedSearchesDesc:
- 'Speichern Sie Ihre Filter und Kartenansicht, um genau dort weiterzumachen, wo Sie aufgehört haben.',
+ 'Speichere deine Filter und Kartenansicht, um genau dort weiterzumachen, wo du aufgehört hast.',
clickToRename: 'Klicken zum Umbenennen',
- notesPlaceholder: 'Notieren Sie Ihre Gedanken...',
+ notesPlaceholder: 'Notiere deine Gedanken...',
deleteSearch: 'Suche löschen',
deleteSearchConfirm:
- 'Möchten Sie diese gespeicherte Suche wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
+ 'Möchtest du diese gespeicherte Suche wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
isBeingUpdated: '{{name}} wird aktualisiert',
- updating: 'Aktualisiere...',
+ updating: 'Wird aktualisiert...',
},
// ── Invites Page ───────────────────────────────────
@@ -1352,7 +1353,7 @@ const de: Translations = {
copyInviteLink: 'Einladungslink kopieren',
adminInvitesTitle: 'Admin-Einladungen (100% Rabatt)',
referralInvitesTitle: 'Empfehlungseinladungen (30% Rabatt)',
- yourInviteLinks: 'Ihre Einladungslinks',
+ yourInviteLinks: 'Deine Einladungslinks',
noInvitesYet: 'Noch keine Einladungen erstellt',
link: 'Link',
status: 'Status',
@@ -1363,13 +1364,13 @@ const de: Translations = {
// ── Invite Page ────────────────────────────────────
invitePage: {
- youreInvited: 'Sie sind eingeladen!',
+ youreInvited: 'Du bist eingeladen!',
specialOffer: 'Sonderangebot!',
- invitedByFree: '{{name}} hat Sie eingeladen, kostenlosen lebenslangen Zugang zu erhalten.',
- invitedByDiscount: '{{name}} hat 30% Rabatt auf lebenslangen Zugang mit Ihnen geteilt.',
- genericFreeInvite: 'Sie wurden eingeladen, kostenlosen lebenslangen Zugang zu erhalten.',
- genericDiscount: 'Ein Freund hat 30% Rabatt auf lebenslangen Zugang mit Ihnen geteilt.',
- exploreEvery: 'Finden Sie Postleitzahlen, die zu Ihrem Leben passen',
+ invitedByFree: '{{name}} hat dich eingeladen, kostenlosen lebenslangen Zugang zu erhalten.',
+ invitedByDiscount: '{{name}} hat 30% Rabatt auf lebenslangen Zugang mit dir geteilt.',
+ genericFreeInvite: 'Du wurdest eingeladen, kostenlosen lebenslangen Zugang zu erhalten.',
+ genericDiscount: 'Ein Freund hat 30% Rabatt auf lebenslangen Zugang mit dir geteilt.',
+ exploreEvery: 'Finde Postleitzahlen, die zu deinem Leben passen',
propertyInfo: 'Preise, Pendelzeit, Schulen, Kriminalität, Lärm, Breitband, EPC und mehr',
invalidInvite: 'Ungültige Einladung',
inviteAlreadyUsed: 'Einladung bereits verwendet',
@@ -1377,14 +1378,14 @@ const de: Translations = {
invalidInviteLink: 'Ungültiger Einladungslink',
invalidInviteLinkDesc: 'Dieser Einladungslink ist ungültig oder abgelaufen.',
licenseActivated: 'Lizenz aktiviert!',
- fullAccessGranted: 'Sie haben jetzt vollen Zugang zu Perfect Postcode.',
+ fullAccessGranted: 'Du hast jetzt vollen Zugang zu Perfect Postcode.',
activating: 'Wird aktiviert...',
activateLicense: 'Lizenz aktivieren',
claimDiscount: 'Rabatt einlösen',
- registerToClaim: 'Registrieren zum Einlösen',
- youAlreadyHaveLicense: 'Sie haben bereits eine Lizenz',
- accountHasFullAccess: 'Ihr Konto hat bereits vollen Zugang.',
- failedToValidate: 'Einladungslink konnte nicht validiert werden',
+ registerToClaim: 'Zum Einlösen registrieren',
+ youAlreadyHaveLicense: 'Du hast bereits eine Lizenz',
+ accountHasFullAccess: 'Dein Konto hat bereits vollen Zugang.',
+ failedToValidate: 'Einladungslink konnte nicht geprüft werden',
},
// ── Format / Time ──────────────────────────────────
@@ -1397,9 +1398,9 @@ const de: Translations = {
noFilters: 'Keine Filter',
poiCategory: '{{count}} POI-Kategorie',
poiCategories: '{{count}} POI-Kategorien',
- travelDestination: '{{count}} Fahrziel',
- travelDestinations: '{{count}} Fahrziele',
- propertiesMatch: '{{count}} Immobilien stimmen überein',
+ travelDestination: '{{count}} Fahrzeit-Ziel',
+ travelDestinations: '{{count}} Fahrzeit-Ziele',
+ propertiesMatch: '{{count}} Immobilien passen',
setFilters: '{{count}} Filter setzen: {{list}}',
noFiltersSet: 'Keine Filter gesetzt',
toDestination: '{{mode}} nach {{label}} {{bounds}}',
@@ -1409,24 +1410,23 @@ const de: Translations = {
// ── Tutorial ──────────────────────────────────────
tutorial: {
- step1Title: 'Sagen Sie der Karte, was zählt',
+ step1Title: 'Sag der Karte, was zählt',
step1Content:
- 'Legen Sie Budget, Pendelzeitlimit, Schulqualität, Kriminalitätsschwelle, Lärmtoleranz, Breitbandbedarf oder alles fest, was Ihnen wichtig ist. Nur passende Gebiete bleiben hervorgehoben. Nutzen Sie „Färben“, um die Karte nach einem beliebigen Merkmal einzufärben.',
+ 'Lege Budget, Pendelzeitlimit, Schulqualität, Kriminalitätsschwelle, Lärmtoleranz, Breitbandbedarf oder alles fest, was dir wichtig ist. Nur passende Gebiete bleiben hervorgehoben. Nutze „Färben“, um die Karte nach einem beliebigen Merkmal einzufärben.',
step2Title: 'Oder einfach beschreiben',
step2Content:
- 'Beschreiben Sie in Alltagssprache, was Sie möchten, zum Beispiel „ruhige Gegend nahe guter Schulen unter £400k“, und wir richten die Filter für Sie ein.',
- step3Title: 'Erkunden Sie, was es gibt',
+ 'Beschreibe in Alltagssprache, was du möchtest, zum Beispiel „ruhige Gegend nahe guter Schulen unter £400k“, und wir richten die Filter für dich ein.',
+ step3Title: 'Erkunde, was es gibt',
step3Content:
- 'Schwenken und zoomen Sie durch England. Klicken Sie auf ein beliebiges farbiges Gebiet, um zu sehen, warum es passt: Kriminalität, Schulen, Preise, Breitband, Lärm und mehr.',
+ 'Schwenke und zoome durch England. Klicke auf ein beliebiges farbiges Gebiet, um zu sehen, warum es passt: Kriminalität, Schulen, Preise, Breitband, Lärm und mehr.',
step4Title: 'Direkt zu einem Ort springen',
- step4Content:
- 'Suchen Sie nach einem Ort oder einer Postleitzahl, um sofort dorthin zu gelangen.',
+ step4Content: 'Suche nach einem Ort oder einer Postleitzahl, um sofort dorthin zu gelangen.',
step5Title: 'Ins Detail gehen',
step5Content:
- 'Sehen Sie Gebietsstatistiken, Histogramme und einzelne Immobiliendaten: Preise, Wohnfläche, Energiebewertungen und mehr.',
+ 'Sieh Gebietsstatistiken, Histogramme und einzelne Immobiliendaten: Preise, Wohnfläche, Energiebewertungen und mehr.',
step6Title: 'Was ist in der Nähe?',
step6Content:
- 'Blenden Sie Schulen, Geschäfte, Bahnhöfe, Parks und Restaurants auf der Karte ein, um zu sehen, was erreichbar ist.',
+ 'Blende Schulen, Geschäfte, Bahnhöfe, Parks und Restaurants auf der Karte ein, um zu sehen, was erreichbar ist.',
},
// ── Server-derived values ──────────────────────────
@@ -1447,23 +1447,23 @@ const de: Translations = {
// ─ Feature names (Properties) ─
'Property type': 'Immobilientyp',
- 'Leasehold/Freehold': 'Erbbaurecht/Volleigentum',
+ 'Leasehold/Freehold': 'Leasehold/Freehold',
'Last known price': 'Letzter bekannter Preis',
'Estimated price': 'Geschätzter Preis',
- 'Estimated current price': 'Geschätzter aktueller Preis',
+ 'Estimated current price': 'Geschätzter heutiger Preis',
'Price per sqm': 'Preis pro m²',
'Est. price per sqm': 'Gesch. Preis pro m²',
'Estimated monthly rent': 'Geschätzte Monatsmiete',
'Total floor area (sqm)': 'Gesamtwohnfläche (m²)',
- 'Number of bedrooms & living rooms': 'Anzahl Schlaf- & Wohnzimmer',
+ 'Number of bedrooms & living rooms': 'Anzahl Schlaf- und Wohnzimmer',
'Construction year': 'Baujahr',
- 'Date of last transaction': 'Datum der letzten Transaktion',
- 'Former council house': 'Ehemaliger Sozialbau',
- 'Current energy rating': 'Aktuelle Energiebewertung',
- 'Potential energy rating': 'Potenzielle Energiebewertung',
+ 'Date of last transaction': 'Datum des letzten Verkaufs',
+ 'Former council house': 'Ehemaliger kommunaler Wohnungsbau',
+ 'Current energy rating': 'Aktuelle Energieeffizienzklasse',
+ 'Potential energy rating': 'Mögliche Energieeffizienzklasse',
'Interior height (m)': 'Raumhöhe (m)',
'Street tree density percentile': 'Perzentil der Straßenbaumdichte',
- 'Within conservation area': 'In Erhaltungsgebiet',
+ 'Within conservation area': 'In Denkmalschutzgebiet',
'Listed building': 'Denkmalgeschütztes Gebäude',
// ─ Feature names (Transport) ─
@@ -1481,44 +1481,43 @@ const de: Translations = {
'Outstanding primary schools within 5km': 'Hervorragende Grundschulen im Umkreis von 5 km',
'Outstanding secondary schools within 5km':
'Hervorragende weiterführende Schulen im Umkreis von 5 km',
- 'Education, Skills and Training Score': 'Score für Bildung, Kompetenzen und Ausbildung',
+ 'Education, Skills and Training Score': 'Wert für Bildung, Kompetenzen und Ausbildung',
// ─ Feature names (Area development) ─
- 'Income Score': 'Einkommensscore',
- 'Employment Score': 'Beschäftigungsscore',
- 'Health Deprivation and Disability Score': 'Score für Gesundheit und Behinderung',
- 'Housing Conditions Score': 'Score der Wohnbedingungen',
- 'Air Quality and Road Safety Score': 'Score für Luftqualität und Verkehrssicherheit',
+ 'Income Score': 'Einkommenswert',
+ 'Employment Score': 'Beschäftigungswert',
+ 'Health Deprivation and Disability Score':
+ 'Wert für gesundheitliche Benachteiligung und Behinderung',
+ 'Housing Conditions Score': 'Wert der Wohnbedingungen',
+ 'Air Quality and Road Safety Score': 'Wert für Luftqualität und Verkehrssicherheit',
// ─ Feature names (Crime) ─
- 'Serious crime per 1k residents (avg/yr)':
- 'Schwere Straftaten pro 1k Einwohner (Durchschn./Jahr)',
- 'Minor crime per 1k residents (avg/yr)':
- 'Leichte Straftaten pro 1k Einwohner (Durchschn./Jahr)',
- 'Serious crime (avg/yr)': 'Schwere Straftaten (Durchschn./Jahr)',
- 'Minor crime (avg/yr)': 'Leichte Straftaten (Durchschn./Jahr)',
- 'Violence and sexual offences (avg/yr)': 'Gewalt- und Sexualdelikte (Durchschn./Jahr)',
- 'Burglary (avg/yr)': 'Einbrüche (Durchschn./Jahr)',
- 'Robbery (avg/yr)': 'Raubüberfälle (Durchschn./Jahr)',
- 'Vehicle crime (avg/yr)': 'Fahrzeugkriminalität (Durchschn./Jahr)',
- 'Anti-social behaviour (avg/yr)': 'Antisoziales Verhalten (Durchschn./Jahr)',
- 'Criminal damage and arson (avg/yr)': 'Sachbeschädigung und Brandstiftung (Durchschn./Jahr)',
- 'Other theft (avg/yr)': 'Sonstiger Diebstahl (Durchschn./Jahr)',
- 'Theft from the person (avg/yr)': 'Taschendiebstahl (Durchschn./Jahr)',
- 'Shoplifting (avg/yr)': 'Ladendiebstahl (Durchschn./Jahr)',
- 'Bicycle theft (avg/yr)': 'Fahrraddiebstahl (Durchschn./Jahr)',
- 'Drugs (avg/yr)': 'Drogendelikte (Durchschn./Jahr)',
- 'Possession of weapons (avg/yr)': 'Waffenbesitz (Durchschn./Jahr)',
- 'Public order (avg/yr)': 'Störung der öffentlichen Ordnung (Durchschn./Jahr)',
- 'Other crime (avg/yr)': 'Sonstige Straftaten (Durchschn./Jahr)',
+ 'Serious crime per 1k residents (avg/yr)': 'Schwere Straftaten pro 1.000 Einwohner (Ø/Jahr)',
+ 'Minor crime per 1k residents (avg/yr)': 'Leichte Straftaten pro 1.000 Einwohner (Ø/Jahr)',
+ 'Serious crime (avg/yr)': 'Schwere Straftaten (Ø/Jahr)',
+ 'Minor crime (avg/yr)': 'Leichte Straftaten (Ø/Jahr)',
+ 'Violence and sexual offences (avg/yr)': 'Gewalt- und Sexualdelikte (Ø/Jahr)',
+ 'Burglary (avg/yr)': 'Einbrüche (Ø/Jahr)',
+ 'Robbery (avg/yr)': 'Raubüberfälle (Ø/Jahr)',
+ 'Vehicle crime (avg/yr)': 'Fahrzeugkriminalität (Ø/Jahr)',
+ 'Anti-social behaviour (avg/yr)': 'Antisoziales Verhalten (Ø/Jahr)',
+ 'Criminal damage and arson (avg/yr)': 'Sachbeschädigung und Brandstiftung (Ø/Jahr)',
+ 'Other theft (avg/yr)': 'Sonstiger Diebstahl (Ø/Jahr)',
+ 'Theft from the person (avg/yr)': 'Diebstahl von der Person (Ø/Jahr)',
+ 'Shoplifting (avg/yr)': 'Ladendiebstahl (Ø/Jahr)',
+ 'Bicycle theft (avg/yr)': 'Fahrraddiebstahl (Ø/Jahr)',
+ 'Drugs (avg/yr)': 'Drogendelikte (Ø/Jahr)',
+ 'Possession of weapons (avg/yr)': 'Waffenbesitz (Ø/Jahr)',
+ 'Public order (avg/yr)': 'Störung der öffentlichen Ordnung (Ø/Jahr)',
+ 'Other crime (avg/yr)': 'Sonstige Straftaten (Ø/Jahr)',
// ─ Feature names (Neighbours) ─
'Median age': 'Medianalter',
- '% White': '% Weiß',
- '% South Asian': '% Südasiatisch',
- '% Black': '% Schwarz',
- '% East Asian': '% Ostasiatisch',
- '% Mixed': '% Gemischt',
+ '% White': '% weiß',
+ '% South Asian': '% südasiatisch',
+ '% Black': '% schwarz',
+ '% East Asian': '% ostasiatisch',
+ '% Mixed': '% gemischt',
'% Other': '% Sonstige',
'Voter turnout (%)': 'Wahlbeteiligung (%)',
@@ -1537,11 +1536,11 @@ const de: Translations = {
// ─ Client-side aggregate filter names ─
Schools: 'Schulen',
'Specific crimes': 'Einzelne Delikte',
- Ethnicities: 'Ethnien',
- 'Amenity distance': 'Entfernung zu Infrastruktur',
+ Ethnicities: 'Ethnische Gruppen',
+ 'Amenity distance': 'Entfernung zu Angeboten',
'Closest transport option': 'Nächste Verkehrsoption',
- 'Amenities within 2km': 'Infrastruktur im Umkreis von 2 km',
- 'Amenities within 5km': 'Infrastruktur im Umkreis von 5 km',
+ 'Amenities within 2km': 'Angebote im Umkreis von 2 km',
+ 'Amenities within 5km': 'Angebote im Umkreis von 5 km',
// ─ Enum values ─
Detached: 'Freistehend',
@@ -1558,8 +1557,8 @@ const de: Translations = {
'Serious crime': 'Schwere Straftaten',
'Minor crime': 'Leichte Straftaten',
'Ethnic composition': 'Ethnische Zusammensetzung',
- 'Political vote share': 'Stimmenverteilung',
- 'Anti-social': 'Antisozial',
+ 'Political vote share': 'Politischer Stimmenanteil',
+ 'Anti-social': 'Antisoziales Verhalten',
Vehicle: 'Fahrzeug',
Burglary: 'Einbruch',
@@ -1571,7 +1570,7 @@ const de: Translations = {
Health: 'Gesundheit',
'Emergency Services': 'Rettungsdienste',
Groceries: 'Lebensmittel',
- 'Local Businesses': 'Lokale Geschäfte',
+ 'Local Businesses': 'Lokale Unternehmen',
Culture: 'Kultur',
Services: 'Dienstleistungen',
Practical: 'Praktisches',
@@ -1589,7 +1588,7 @@ const de: Translations = {
Restaurant: 'Restaurant',
Pub: 'Pub',
Bar: 'Bar',
- 'Fast Food': 'Fast Food',
+ 'Fast Food': 'Schnellrestaurant',
Nightclub: 'Nachtclub',
Cinema: 'Kino',
Theatre: 'Theater',
@@ -1599,15 +1598,15 @@ const de: Translations = {
'Sports Centre': 'Sportzentrum',
Entertainment: 'Unterhaltung',
Supermarket: 'Supermarkt',
- 'Convenience Store': 'Spätkauf',
+ 'Convenience Store': 'Minimarkt',
Bakery: 'Bäckerei',
- 'Butcher & Fishmonger': 'Metzgerei & Fischhändler',
- Greengrocer: 'Gemüsehändler',
- 'Off-Licence': 'Getränkeladen',
+ 'Butcher & Fishmonger': 'Metzgerei & Fischgeschäft',
+ Greengrocer: 'Obst- und Gemüsehändler',
+ 'Off-Licence': 'Getränkemarkt',
'Deli & Specialty': 'Feinkost & Spezialitäten',
'Fashion & Clothing': 'Mode & Bekleidung',
Electronics: 'Elektronik',
- 'Charity Shop': 'Secondhand-Laden',
+ 'Charity Shop': 'Wohltätigkeitsladen',
'DIY & Hardware': 'Baumarkt & Eisenwaren',
'Home & Garden': 'Haus & Garten',
Bookshop: 'Buchhandlung',
@@ -1645,6 +1644,14 @@ const de: Translations = {
Zoo: 'Zoo',
'Tourist Attraction': 'Touristenattraktion',
School: 'Schule',
+ 'Nursery school': 'Kindergarten',
+ 'Primary school': 'Grundschule',
+ 'Secondary school': 'Weiterführende Schule',
+ 'All-through school': 'Durchgehende Schule',
+ 'Sixth form': 'Oberstufe',
+ 'Further education college': 'Weiterbildungskolleg',
+ University: 'Universität',
+ 'Special school': 'Förderschule',
Hotel: 'Hotel',
'Local Business': 'Lokales Geschäft',
Offices: 'Büros',
diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts
index 3983697..a58ddaf 100644
--- a/frontend/src/i18n/locales/en.ts
+++ b/frontend/src/i18n/locales/en.ts
@@ -70,6 +70,21 @@ const en = {
closeMenu: 'Close menu',
},
+ // ── Export Menu ────────────────────────────────────
+ export: {
+ title: 'Export',
+ modeFilters: 'Postcodes matching filters',
+ modeFiltersHint: 'Export every postcode visible on the map that matches your current filters.',
+ modeList: 'List of postcodes',
+ modeListHint: 'Add your own postcodes one by one — spacing and casing are fixed for you.',
+ listLabel: 'Postcodes',
+ listPlaceholder: 'e.g. SW1A 1AA',
+ addRow: 'Add postcode',
+ removeRow: 'Remove postcode',
+ listCount: '{{count}} postcode',
+ listCount_other: '{{count}} postcodes',
+ },
+
// ── User Menu ──────────────────────────────────────
userMenu: {
fullAccess: 'Full Access',
@@ -796,7 +811,8 @@ const en = {
rooms: 'Rooms:',
built: 'Built:',
formerCouncil: 'Ex-council:',
- exCouncilBadge: 'Ex-council',
+ exCouncilBadge: 'Maybe ex-council house',
+ listedBuildingBadge: 'Maybe listed',
epcRating: 'EPC rating:',
epcPotential: 'EPC potential:',
renovations: 'Renovations',
@@ -849,16 +865,6 @@ const en = {
nationalAvg: 'National avg',
},
- // ── Histogram Legend ───────────────────────────────
- histogramLegend: {
- tealBars: 'Teal bars',
- tealBarsDesc: 'show the distribution in this selected area',
- greyBars: 'Grey bars',
- greyBarsDesc: 'show the overall distribution across all areas',
- dashedLine: 'Dashed line',
- dashedLineDesc: 'indicates the national average',
- },
-
// ── Street View ────────────────────────────────────
streetView: {
title: 'Street View',
@@ -1604,6 +1610,14 @@ const en = {
Zoo: 'Zoo',
'Tourist Attraction': 'Tourist Attraction',
School: 'School',
+ 'Nursery school': 'Nursery school',
+ 'Primary school': 'Primary school',
+ 'Secondary school': 'Secondary school',
+ 'All-through school': 'All-through school',
+ 'Sixth form': 'Sixth form',
+ 'Further education college': 'Further education college',
+ University: 'University',
+ 'Special school': 'Special school',
Hotel: 'Hotel',
'Local Business': 'Local Business',
Offices: 'Offices',
diff --git a/frontend/src/i18n/locales/fr.ts b/frontend/src/i18n/locales/fr.ts
index c933fb1..576d097 100644
--- a/frontend/src/i18n/locales/fr.ts
+++ b/frontend/src/i18n/locales/fr.ts
@@ -28,14 +28,14 @@ const fr: Translations = {
minute: 'min',
or: 'ou',
area: 'Zone',
- properties: 'Propriétés',
+ properties: 'Biens',
postcode: 'Code postal',
noAreaSelected: 'Aucune zone sélectionnée',
noAreaSelectedDesc:
'Cliquez sur une zone colorée de la carte pour voir la criminalité, les écoles, les prix et plus encore',
- clickForDetails: 'Cliquez pour les détails',
- property: 'propriété',
- propertiesPlural: 'propriétés',
+ clickForDetails: 'Cliquez pour voir les détails',
+ property: 'bien',
+ propertiesPlural: 'biens',
bedsCount: '{{count}} ch.',
bedsCount_other: '{{count}} ch.',
bathsCount: '{{count}} sdb',
@@ -72,6 +72,23 @@ const fr: Translations = {
closeMenu: 'Fermer le menu',
},
+ // ── Export Menu ────────────────────────────────────
+ export: {
+ title: 'Exporter',
+ modeFilters: 'Codes postaux correspondant aux filtres',
+ modeFiltersHint:
+ 'Exportez tous les codes postaux visibles sur la carte qui correspondent à 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.',
+ listLabel: 'Codes postaux',
+ listPlaceholder: 'ex. SW1A 1AA',
+ addRow: 'Ajouter un code postal',
+ removeRow: 'Supprimer le code postal',
+ listCount: '{{count}} code postal',
+ listCount_other: '{{count}} codes postaux',
+ },
+
// ── User Menu ──────────────────────────────────────
userMenu: {
fullAccess: 'Accès complet',
@@ -110,47 +127,47 @@ const fr: Translations = {
relatedPagesDesc:
'Suivez ces liens internes pour comparer le même parcours de recherche immobilière sous un autre angle.',
pages: {
- 'Property price map': "Carte des prix de l'immobilier",
+ 'Property price map': 'Carte des prix de l’immobilier',
'Compare property prices across every postcode in England':
'Comparez les prix de l’immobilier pour chaque code postal en Angleterre',
'Property price map for England - Compare postcodes before viewing':
- "Carte des prix de l'immobilier en Angleterre - Comparez les codes postaux avant de consulter",
+ 'Carte des prix de l’immobilier 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 propriété, la superficie, le mode d'occupation et le contexte local afin que les acheteurs puissent trouver des zones de recherche réalistes avant d'ouvrir les portails d’annonces.",
+ '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 d’ouvrir les portails d’annonces.',
'Screen historical sale prices and current-value estimates by postcode.':
'Consultez l’historique 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 les déplacements domicile-travail, les écoles, le haut débit, la criminalité, le bruit et les commodités.',
+ 'Comparez la valeur avec le trajet, les écoles, le haut débit, la criminalité, le bruit et les services de proximité.',
'Build a shortlist before spending weekends on viewings.':
- 'Créez une liste restreinte avant de passer vos week-ends en visites.',
+ 'Créez une 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 n'apparaissent",
+ 'Trouvez les codes postaux qui correspondent au budget avant que les annonces n’apparaissent',
'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 propriété, puis coloriez la carte par prix au mètre carré ou prix actuel estimé. Cela permet de révéler les zones où des maisons similaires ont historiquement été négociées à portée de main, même s'il n'y a pas d’annonces en cours aujourd'hui.",
+ '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 lorsqu’il n’y a aucune annonce en cours aujourd’hui.',
'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 propriété, mode d'occupation et superficie.",
+ 'Filtrez par dernier prix de vente connu, valeur actuelle estimée, type de bien, statut de propriété 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.',
'Use the results as a shortlist for listing alerts, local research, and viewings.':
- 'Utilisez les résultats comme liste restreinte pour les alertes d’annonces, les recherches locales et les visites.',
+ 'Utilisez les résultats comme sélection pour les alertes d’annonces, 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 isn’t automatically treated as the best option.':
- 'Un prix inférieur peut refléter des logements plus petits, des transports plus faibles, plus de bruit ou moins de services locaux. La carte garde ces compromis visibles, de sorte que le code postal le moins cher n’est pas automatiquement traité comme la meilleure 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',
'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 d’annonces affichent uniquement les maisons à vendre aujourd’hui. Une carte des prix immobiliers au niveau du code postal vous permet de comparer des zones plus larges, de comprendre les modèles de prix locaux et d'éviter de manquer des endroits où la prochaine annonce appropriée pourrait apparaître.",
+ 'Les portails d’annonces affichent uniquement les biens à vendre aujourd’hui. 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',
'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é de l'école, la taille de la propriété, la performance énergétique, l'environnement local et les services afin que votre liste restreinte reflète la façon dont vous souhaitez réellement vivre.",
+ '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, l’environnement local et les services afin que votre sélection reflète la façon dont vous souhaitez réellement vivre.',
'What the price data is for': 'À quoi servent les données de prix',
'Use the map to compare areas and spot search candidates. It isn’t a valuation, mortgage decision, survey, legal search, or live listing feed.':
- 'Utilisez la carte pour comparer les zones et repérer les candidats à la recherche. Il ne s’agit pas d’une évaluation, d’une décision hypothécaire, d’une enquête, d’une recherche juridique ou d’un flux d’annonces en direct.',
+ 'Utilisez la carte pour comparer les zones et repérer des pistes de recherche. Il ne s’agit pas d’une estimation officielle, d’une décision de prêt immobilier, d’une expertise, d’une recherche juridique ou d’un flux d’annonces en direct.',
'How to validate a promising area': 'Comment valider une zone prometteuse',
'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 qu'un code postal semble prometteur, vérifiez les annonces actuelles, les prix de vente comparables, les détails de l'agent, les recherches d'inondations, les dossiers juridiques, les enquêtes et les informations des autorités locales avant de prendre une décision.",
+ 'Une fois qu’un code postal semble prometteur, vérifiez les annonces actuelles, les ventes comparables, les informations de l’agent, les risques d’inondation, les dossiers juridiques, les expertises et les informations des autorités locales avant de prendre une décision.',
'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 what’s currently for sale.':
@@ -158,32 +175,32 @@ const fr: Translations = {
'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.':
- "Oui. Les filtres de prix peuvent être combinés avec des filtres sur le temps de trajet, les écoles, la criminalité, le haut débit, le bruit de la route, les commodités et l'environnement.",
+ 'Oui. Les filtres de prix peuvent être combinés avec des filtres sur le temps de trajet, les écoles, la criminalité, le haut débit, le bruit routier, les services de proximité et l’environnement.',
'Does the map cover all of the UK?': 'La carte couvre-t-elle tout le Royaume-Uni ?',
'The current product focuses on England because several core property and postcode datasets are England-specific.':
- "Le produit actuel se concentre sur l'Angleterre, car plusieurs ensembles de données de propriétés et de codes postaux de base sont spécifiques à l'Angleterre.",
- 'Birmingham property search guide': 'Guide de recherche de propriétés à Birmingham',
+ 'Le produit actuel se concentre sur l’Angleterre, car plusieurs jeux de données clés sur l’immobilier et les codes postaux sont propres à l’Angleterre.',
+ 'Birmingham property search guide': 'Guide de recherche immobilière à Birmingham',
'A worked example for balancing price, commute, and family trade-offs.':
- 'Un exemple concret pour équilibrer les compromis en matière de prix, de déplacement et de famille.',
+ 'Un exemple concret pour arbitrer entre prix, trajet et contraintes familiales.',
'Data sources and coverage': 'Sources de données et couverture',
'See which datasets sit behind the postcode filters and where they have limits.':
- 'Découvrez quels ensembles de données se trouvent derrière les filtres de code postal et où ils ont des limites.',
+ '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 est destinée à soutenir la présélection et non à remplacer la diligence raisonnable.',
+ 'Comprenez comment la carte aide à présélectionner des zones sans remplacer les vérifications préalables.',
'Postcode checker': 'Vérificateur 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 de propriété par code postal',
+ '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 de propriété',
+ 'Trouvez les codes postaux qui correspondent à vos critères de recherche immobilière',
'Postcode property search - Find areas that match your criteria':
- 'Recherche de propriété par code postal - Trouvez les zones qui correspondent à vos critères',
+ 'Recherche immobilière par code postal - Trouvez les zones qui correspondent à 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 propriété, superficie, mode d'occupation, déplacements domicile-travail, écoles, criminalité, haut débit, bruit, parcs et commodités locales.",
+ '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é.',
'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 propriété, taille, mode d'occupation, déplacements domicile-travail, écoles, criminalité, haut débit, bruit, parcs et commodités locales au lieu de vérifier les zones une par une.",
+ '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.',
'Filter England-wide postcode data from one map.':
'Filtrez les données des codes postaux de toute l’Angleterre à partir d’une seule carte.',
'Shortlist unfamiliar areas with comparable evidence.':
@@ -193,36 +210,36 @@ const fr: Translations = {
'Turn a broad brief into postcode candidates':
'Transformez un cahier des charges général en codes postaux candidats',
'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 d'abord les contraintes pratiques : budget, taille de la propriété, mode d'occupation, temps de trajet, besoins scolaires, haut débit et tolérance au bruit routier ou aux niveaux de criminalité. La carte supprime les endroits qui ne respectent pas ces contraintes et conserve les options restantes comparables.",
+ 'Saisissez d’abord 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.',
'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 s’appuyer sur des conjectures.',
+ '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 s’appuyer sur l’intuition.',
'Turn vague areas into specific postcodes':
'Transformez des zones vagues en codes postaux spécifiques',
'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 à grande échelle dans les villes ou les arrondissements cachent de grandes différences entre les rues. Perfect Postcode vous aide à passer d'une zone générale à des codes postaux qui répondent à vos exigences strictes.",
+ 'Les recherches larges par ville ou arrondissement masquent de grandes différences entre les rues. Perfect Postcode vous aide à passer d’une zone générale à des codes postaux qui répondent à vos exigences strictes.',
'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.':
- "Lorsqu'il y a trop ou pas assez de correspondances, ajustez une contrainte à la fois et voyez exactement quels codes postaux réapparaissent. Cela rend les compromis explicites au lieu de s’appuyer sur des conjectures.",
+ 'Lorsqu’il 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 s’appuyer sur l’intuition.',
'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 en termes d'écoles, de bruit routier, d'accès aux transports, de composition immobilière et de prix. La comparaison au niveau du code postal réduit la probabilité de traiter une ville entière comme un seul marché uniforme.",
+ 'Deux codes postaux proches peuvent différer par les écoles, le bruit routier, l’accè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 file d'attente de recherche : vérifiez les annonces en cours, visitez les rues, confirmez les écoles et les admissions et consultez les sources officielles actuelles.",
+ '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.',
'Can I save a postcode property search?':
- 'Puis-je enregistrer une recherche de propriété par code postal ?',
+ '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 listes restreintes et les notes de comparaison.',
+ '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 ?',
'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à.',
'Are the results live property listings?':
- 'Les résultats sont-ils des annonces immobilières en direct ?',
+ '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.':
- 'Non. L’outil compare les données de code postal et les signaux de propriété historiques/contextuels. Vous avez toujours besoin de portails d’annonces pour connaître la disponibilité actuelle.',
- 'Manchester property search guide': 'Guide de recherche de propriétés à Manchester',
+ 'Non. L’outil compare des données de codes postaux et des indicateurs immobiliers historiques ou contextuels. Les portails d’annonces restent nécessaires pour connaître les biens actuellement disponibles.',
+ 'Manchester property search guide': 'Guide de recherche immobilière à Manchester',
'A regional guide for narrowing a broad search around Greater Manchester.':
'Un guide régional pour affiner une recherche large autour du Grand Manchester.',
'Start a postcode search': 'Lancer une recherche de code postal',
@@ -232,62 +249,62 @@ const fr: Translations = {
'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',
'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 données sur les prix, les écoles, la sécurité, le haut débit, le bruit routier, les parcs et les propriétés sur une seule carte.',
+ '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.':
- "Filtrez les codes postaux par temps de trajet modélisés en voiture, en vélo, à pied et en transports en commun, puis superposez le prix de l'immobilier, les écoles, la criminalité, le haut débit, le bruit et les commodités locales.",
+ 'Filtrez les codes postaux selon les temps de trajet modélisés en voiture, à vélo, à pied et en transports en commun, puis ajoutez les prix immobiliers, les écoles, la criminalité, le haut débit, le bruit et les services de proximité.',
'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 d'abord par destination, puis filtrez en fonction de l'adéquation de la propriété et du quartier.",
+ 'Recherchez d’abord par destination, puis filtrez selon l’adéquation du bien et du quartier.',
'Avoid areas that look close on a map but fail the daily journey.':
- 'Évitez les zones qui semblent proches sur une carte mais qui échouent au trajet quotidien.',
+ 'Évitez les zones qui semblent proches sur une carte mais ne conviennent pas au 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 doesn’t work.':
- 'Choisissez une destination de trajet, un mode de transport et une plage horaire, puis ajoutez les filtres de propriétés. Cela évite qu’une zone d’apparence bon marché ne figure sur la liste restreinte si le trajet quotidien ne fonctionne pas.',
+ 'Choisissez une destination de trajet, un mode de transport et une plage horaire, puis ajoutez les filtres immobiliers. Cela évite qu’une zone apparemment bon marché n’entre dans la sélection si le trajet quotidien ne convient pas.',
'Compare the commute against the rest of daily life':
'Comparez les déplacements avec le reste de la vie quotidienne',
'A fast commute isn’t enough if the property size, school context, safety threshold, broadband, or road-noise exposure don’t fit. The map keeps those signals side by side.':
- 'Un trajet rapide ne suffit pas si la taille de la propriété, le contexte scolaire, le seuil de sécurité, le haut débit ou l’exposition au bruit de la route ne conviennent pas. La carte conserve ces signaux côte à côte.',
+ 'Un trajet rapide ne suffit pas si la taille du bien, le contexte scolaire, le seuil de sécurité, le haut débit ou l’exposition au bruit routier ne conviennent pas. La carte garde ces indicateurs côte à côte.',
'Commute from postcodes, not just place names':
- 'Déplacez-vous à partir des codes postaux, pas seulement des noms de lieux',
+ 'É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.':
- 'Deux rues d’une même ville peuvent avoir des accès à la gare, des itinéraires routiers et des options de transports publics très différents. Le filtrage du temps de trajet au niveau du code postal maintient cette différence visible.',
+ 'Deux rues d’une même ville peuvent avoir un accès à la gare, des itinéraires routiers et des options de transports publics très différents. Le filtrage du temps de trajet au niveau du code postal rend cette différence visible.',
'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 n'est utile que si la zone correspond également à votre budget, à vos besoins en matière de logement, à vos préférences scolaires, à votre seuil de sécurité, à vos exigences en matière de haut débit et à votre tolérance au bruit de la route.",
+ 'Un trajet rapide n’est 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.',
'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 schémas de perturbations, le stationnement, les conditions cyclables et les itinéraires pédestres.',
+ '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.',
'Why commute filters are combined with property data':
- 'Pourquoi les filtres de trajet domicile-travail sont combinés avec les données de propriété',
+ '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 plus utile lorsqu'elle é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 lorsqu’elle élimine les zones impossibles tout en indiquant si les options restantes sont abordables et agréables à vivre.',
'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.':
'Le produit prend en charge plusieurs modes de déplacement pour lesquels des données de destination précalculées sont disponibles.',
'Are travel times exact?': 'Les temps de trajet sont-ils exacts ?',
'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 le véritable itinéraire avant de prendre une décision de visualisation ou d'achat.",
+ 'Non. Traitez-les comme un modèle de comparaison cohérent, puis vérifiez l’itinéraire réel avant de prendre une décision de visite ou d’achat.',
'Can I combine commute filters with schools and price?':
'Puis-je combiner les filtres de trajet domicile-travail 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 des déplacements domicile-travail peut être superposé au prix de l’immobilier, à la taille, aux écoles, au haut débit, à la criminalité, aux commodités et aux signaux environnementaux.',
- 'Bristol property search guide': 'Guide de recherche de propriétés à Bristol',
+ '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 l'accès à la ville, le prix et le contexte local.",
+ 'Un exemple concret pour équilibrer l’accès à la ville, le prix et le contexte local.',
'Search by commute time': 'Rechercher par temps de trajet',
- 'Schools and property search': "Recherche d'écoles et de propriétés",
+ 'Schools and property search': 'Recherche immobilière avec écoles',
'Find property search areas with schools and family trade-offs in view':
- 'Trouvez des zones de recherche de propriété avec des compromis scolaires et familiaux en vue',
+ 'Trouvez des zones de recherche immobilière en gardant visibles les compromis scolaires et familiaux',
'School property search - Compare postcodes for family moves':
- 'Recherche de propriété scolaire - Comparez les codes postaux pour les déménagements familiaux',
+ 'Recherche immobilière par écoles - Comparez les codes postaux pour un déménagement familial',
'Compare nearby schools, property size, prices, parks, safety, commute and local amenities before building a viewing shortlist.':
- 'Comparez les écoles à proximité, la taille de la propriété, les prix, les parcs, la sécurité, les déplacements et les commodités locales avant de créer une liste restreinte de visites.',
+ '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.':
- 'Comparez les évaluations Ofsted à proximité, le contexte éducatif, la taille de la propriété, le budget, la sécurité, les parcs, les déplacements domicile-travail et les commodités locales avant de réduire votre liste restreinte de visualisation.',
+ 'Comparez les évaluations Ofsted à proximité, le contexte éducatif, la taille du bien, le budget, la sécurité, les parcs, le trajet et les services de proximité avant de resserrer votre sélection de visites.',
'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.':
@@ -297,46 +314,46 @@ const fr: Translations = {
'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 de la propriété, le budget et les contraintes de déplacement, puis ajoutez la qualité des écoles à proximité et le contexte local. Cela empêche les recherches menées par l'école de cacher des problèmes d'abordabilité ou de la vie quotidienne.",
+ '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 qu’une recherche guidée par l’école masque des problèmes d’accessibilité 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 d’admission et les secteurs scolaires peuvent changer. Confirmez les arrangements actuels avec les écoles et les autorités locales.',
'School quality is one part of the shortlist':
- "La qualité de l'école fait partie de la liste restreinte",
+ 'La qualité des écoles n’est qu’une 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 qui façonnent un déménagement familial : espace, prix, déplacements domicile-travail, parcs, sécurité et services locaux.',
+ 'Perfect Postcode vous aide à comparer les données des écoles à proximité avec les autres contraintes pratiques d’un 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',
'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 d'admission 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 d’admission 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.',
'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é à l’admission. Les notes, la distance, les critères d'admission et la capacité de l'école doivent tous être vérifiés auprès des sources officielles actuelles.",
+ 'Utilisez les filtres scolaires pour affiner la recherche, et non pour supposer l’éligibilité à l’admission. Les notes, la distance, les critères d’admission et la capacité de l’école doivent tous ê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 de la route, la criminalité, la taille de la propriété, les déplacements domicile-travail, le haut débit et le prix afin que la liste restreinte reflète l'ensemble du déménagement.",
+ '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 l’ensemble du déménagement.',
'Does this show school catchment guarantees?':
'Cela garantit-il l’appartenance à 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 d'identifier 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 permet d’identifier 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.',
'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.':
- "Oui. La recherche adaptée à l'école peut être combinée avec la criminalité, les parcs, les déplacements domicile-travail, le prix, la taille de la propriété et les services locaux.",
+ 'Oui. La recherche tenant compte des écoles peut être combinée avec la criminalité, les parcs, le trajet, le prix, la taille du bien et les services locaux.',
'Is Ofsted the only school signal?': 'Ofsted est-il le seul signal scolaire ?',
'No single score should decide a move. Use the map as a starting point, then review current school information in detail.':
'Aucun score isolé ne devrait décider d’un déménagement. Utilisez la carte comme point de départ, puis examinez en détail les informations actuelles sur l’école.',
'See where education, property, transport, and environment data comes from.':
- "Découvrez d'où proviennent les données sur l'éducation, l'immobilier, les transports et l'environnement.",
- 'Explore school-aware searches': "Explorez les recherches adaptées à l'école",
+ 'Découvrez d’où proviennent les données sur l’éducation, l’immobilier, les transports et l’environnement.',
+ 'Explore school-aware searches': 'Explorez les recherches tenant compte des écoles',
'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 - Propriété, criminalité, haut débit, bruit et écoles',
+ 'Vérificateur 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 de l'immobilier au niveau du code postal, les données EPC, la criminalité, le haut débit, le bruit de la route, les écoles, la taxe d'habitation, les commodités et le contexte du temps de trajet.",
+ '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.':
- "Examinez les prix de l'immobilier, le contexte EPC, la criminalité, le haut débit, le bruit de la route, les commodités locales, les écoles, la défavorisation, la taxe d'habitation et les données sur le temps de trajet à partir d'une seule carte indiquant le code postal.",
+ 'Examinez les prix immobiliers, le contexte EPC, la criminalité, le haut débit, le bruit routier, les services de proximité, les écoles, la défavorisation, la council tax et les données de temps de trajet à partir d’une seule carte centrée sur le code postal.',
'Check multiple local signals before visiting a street.':
'Vérifiez plusieurs signaux locaux avant de visiter une rue.',
'Use official and open datasets rather than reputation alone.':
@@ -346,31 +363,31 @@ const fr: Translations = {
'Check the street before spending a viewing slot':
'Vérifiez la rue avant d’y 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 l'historique des prix, le contexte local, les commodités, les écoles et les signaux environnementaux avant de consacrer du temps à votre visite.",
+ 'Utilisez le vérificateur de code postal pour examiner l’historique 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 d’un schéma plus large.',
'Useful before and alongside listing portals':
'Utile avant et parallèlement aux portails d’annonces',
'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 de la liste vous en disent rarement assez sur la rue environnante. Perfect Postcode vous offre une vérification du code postal fondée sur des preuves avant de consacrer du temps à une visite.',
+ 'Les photos d’annonce 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.',
'A screening tool, not professional advice':
- 'Un outil de dépistage, pas un conseil professionnel',
+ 'Un outil de tri préalable, 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 des vérifications des annonces actuelles, une diligence raisonnable juridique, des recherches d'inondations, des exigences des prêteurs et des résultats d'enquêtes.",
- 'What a postcode check can catch': "Ce qu'une vérification du code postal peut détecter",
+ '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 d’inondation, les exigences du prêteur et les rapports d’expertise.',
+ 'What a postcode check can catch': 'Ce qu’une 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 signaux environnementaux, les commodités à proximité et d'autres indicateurs locaux faciles à manquer dans une annonce.",
+ 'Une vérification du code postal peut faire apparaître le contexte des prix, les indicateurs environnementaux, les services de proximité et d’autres indicateurs locaux faciles à manquer dans une annonce.',
'What a postcode check can’t prove':
- "Ce qu'une vérification du code postal ne peut pas prouver",
+ 'Ce qu’une vérification du code postal ne peut pas prouver',
'It can’t 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 d’une maison, le développement futur, le titre légal, les exigences du prêteur ou l’expérience actuelle au niveau de la rue. Ceux-ci ont encore besoin de contrôles directs.',
+ 'Il ne peut pas confirmer l’état d’un logement, les futurs aménagements, le titre juridique, les exigences du prêteur ou l’expérience réelle dans la rue. Ces points nécessitent encore des vérifications directes.',
'Can I use the checker before a viewing?':
'Puis-je utiliser le vérificateur avant une visite ?',
'Yes. That’s one of the main use cases: screen the postcode first, then decide whether the viewing is worth the time.':
- 'Oui. C’est l’un des principaux cas d’utilisation : examinez d’abord le code postal, puis décidez si le visionnage en vaut la peine.',
+ 'Oui. C’est l’un des principaux cas d’utilisation : examinez d’abord 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 de la propriété ?',
+ 'Le vérificateur inclut-il l’état exact du bien ?',
'No. Property condition requires listing details, surveys, and direct inspection.':
'Non. L’état d’un bien nécessite les détails de l’annonce, des expertises et une inspection directe.',
'Can I compare multiple postcodes?': 'Puis-je comparer plusieurs codes postaux ?',
@@ -379,108 +396,108 @@ const fr: Translations = {
'Check postcodes on the map': 'Vérifiez les codes postaux sur la carte',
'Regional guide': 'Guide régional',
'How to compare Birmingham postcodes before a property search':
- 'Comment comparer les codes postaux de Birmingham avant une recherche de propriété',
+ 'Comment comparer les codes postaux de Birmingham avant une recherche immobilière',
'Birmingham property search - Compare postcodes by price and commute':
- 'Recherche de propriété à Birmingham - Comparez les codes postaux par prix et trajet',
+ '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 de l'immobilier à Birmingham, les compromis pour les déplacements domicile-travail, les écoles, la criminalité, le haut débit et les commodités locales avant les visites.",
+ '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.',
'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 d'une rue à l'autre. Utilisez des preuves au niveau du code postal pour comparer le budget, les déplacements domicile-travail, les écoles, le bruit, la criminalité et les services locaux avant de décider où regarder les annonces.",
- 'Start with commute corridors': 'Commencez par les couloirs de déplacement',
+ 'Les recherches à Birmingham peuvent changer rapidement d’une rue à l’autre. 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.',
+ '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 horaire de trajet.',
+ '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.',
'Use commute time as a hard filter before judging price.':
- 'Utilisez le temps de trajet comme filtre dur avant de juger le prix.',
+ 'Utilisez le temps de trajet comme filtre strict avant de juger le prix.',
'Compare public transport with car, cycling, or walking where available.':
- "Comparez les transports publics avec la voiture, le vélo ou la marche lorsqu'ils sont disponibles.",
+ 'Comparez les transports publics avec la voiture, le vélo ou la marche lorsque ces options sont disponibles.',
'Check the route manually before booking viewings.':
- "Vérifiez l'itinéraire manuellement avant de réserver des visites.",
- 'Compare price with property type': 'Comparez le prix avec le type de propriété',
+ 'Vérifiez l’itiné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 à eux seuls peuvent être trompeurs si la composition immobilière locale change. Ajoutez des filtres de type de propriété, d’occupation, de superficie et de prix afin que les zones similaires soient comparées équitablement.',
+ '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.',
'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.':
- 'Superposez le contexte scolaire, les parcs, le bruit de la route, le haut débit et les signaux de criminalité au-dessus des filtres de propriété. Il est ainsi plus facile de décider quels compromis sont acceptables.',
+ 'Ajoutez le contexte scolaire, les parcs, le bruit routier, le haut débit et les indicateurs de criminalité aux filtres immobiliers. Il est ainsi plus facile de décider quels compromis sont acceptables.',
'Can Perfect Postcode tell me the best area in Birmingham?':
- "Perfect Postcode peut-il m'indiquer le meilleur quartier de Birmingham ?",
+ 'Perfect Postcode peut-il m’indiquer 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 permet de comparer les codes postaux avec vos propres contraintes afin que vous puissiez créer une meilleure liste restreinte.',
+ '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.',
'Should I use this instead of local knowledge?':
- 'Dois-je utiliser cela à la place des connaissances locales ?',
+ 'Dois-je l’utiliser à 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 rechercher et comparer des candidats, puis validez-les avec des visites, des conseils locaux, des listings et des contrôles officiels.',
+ '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.',
'Compare price patterns before looking at live listings.':
- 'Comparez les modèles de prix avant de consulter les annonces en direct.',
+ '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 superposez les exigences de propriété.',
+ 'Recherchez 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',
'How to compare Manchester postcodes for a property search':
- 'Comment comparer les codes postaux de Manchester pour une recherche de propriété',
+ 'Comment comparer les codes postaux de Manchester pour une recherche immobilière',
'Manchester property search - Compare postcodes before viewing':
- 'Recherche de propriété à Manchester - Comparez les codes postaux avant de visiter',
+ 'Recherche immobilière à Manchester - Comparez les codes postaux avant de visiter',
'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 domicile-travail, type de propriété, écoles, haut débit, criminalité, bruit et commodités avant de réserver des visites.',
+ '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 les options du centre-ville, de la banlieue et des navetteurs. Perfect Postcode permet de garder chaque code postal comparable par rapport aux mêmes contraintes de propriété et de vie quotidienne.',
+ '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.',
'Use travel time to define the real search area':
'Utiliser le temps de trajet pour définir la véritable zone 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 à proximité propose le même trajet pratique.',
+ '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 propriété, superficie, mode d'occupation et prix avant de juger des équipements. Cela maintient la liste restreinte des maisons qui pourraient fonctionner de manière réaliste.",
+ '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.',
'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 de la route, les parcs, les écoles et les commodités comme signaux comparables. Validez ensuite les candidats les plus forts avec les contrôles locaux en cours.',
+ '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.',
'Can I compare Manchester suburbs with city-centre postcodes?':
'Puis-je comparer la banlieue de Manchester avec les codes postaux du centre-ville ?',
'Yes. Use the same budget, property, commute, and local-context filters across both so trade-offs remain visible.':
- 'Oui. Utilisez les mêmes filtres de budget, de propriété, de trajet domicile-travail et de contexte local dans les deux cas afin que les compromis restent visibles.',
- 'Does this include live listings?': 'Cela inclut-il les annonces en direct ?',
+ 'Oui. Utilisez les mêmes filtres de budget, de bien, de trajet et de contexte local dans les deux cas afin que les compromis restent visibles.',
+ 'Does this include live listings?': 'Cela inclut-il les annonces en cours ?',
'No. Use it to decide where to search, then use listing portals for current homes for sale.':
- 'Non. Utilisez-le pour décider où rechercher, puis utilisez les portails d’annonces pour les maisons actuellement à vendre.',
+ 'Non. Utilisez-le pour décider où chercher, puis utilisez les portails d’annonces pour les biens actuellement à vendre.',
'Move from a broad search brief to specific postcode candidates.':
- "Passez d'une recherche générale à des candidats de code postal spécifiques.",
+ 'Passez d’une recherche générale à des codes postaux candidats précis.',
'Data sources': 'Sources de données',
'Review the datasets used for property and local-context comparison.':
- 'Examinez les ensembles de données utilisés pour la comparaison des propriétés et du contexte local.',
+ 'Examinez les jeux de données utilisés pour la comparaison immobilière et le contexte local.',
'Check a single postcode before arranging a viewing.':
- "Vérifiez un seul code postal avant d'organiser une visite.",
+ 'Vérifiez un seul code postal avant d’organiser une visite.',
'Compare Manchester postcodes': 'Comparez les codes postaux de Manchester',
'How to compare Bristol postcodes before a property search':
- 'Comment comparer les codes postaux de Bristol avant une recherche de propriété',
+ 'Comment comparer les codes postaux de Bristol avant une recherche immobilière',
'Bristol property search - Compare postcodes by commute and price':
- 'Recherche de propriété à Bristol - Comparez les codes postaux par trajet et par prix',
+ 'Recherche immobilière à Bristol - Comparez les codes postaux par trajet et prix',
'Compare Bristol postcodes by price, commute, property size, schools, broadband, crime, road noise, parks and amenities before viewings.':
- 'Comparez les codes postaux de Bristol par prix, trajet domicile-travail, taille de la propriété, écoles, haut débit, criminalité, bruit de la route, parcs et commodités avant les visites.',
+ 'Comparez les codes postaux de Bristol par prix, trajet, taille du bien, écoles, haut débit, criminalité, bruit routier, parcs et services de proximité avant les visites.',
'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.':
- 'Les recherches à Bristol impliquent souvent des compromis pointus entre le prix, la durée du trajet, la taille de la propriété et le contexte du quartier. Une comparaison basée sur le code postal permet de garder ces compromis visibles.',
+ 'Les recherches à Bristol impliquent souvent des compromis marqués entre le prix, la durée du trajet, la taille du bien et le contexte du quartier. Une comparaison centrée sur le code postal garde ces compromis visibles.',
'Make commute constraints explicit': 'Rendre explicites les contraintes de déplacement',
'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.':
- "Si l'accès au centre, à une gare, à un hôpital, à une université ou à un parc d'activités est important, utilisez d'abord des filtres de temps de trajet, puis comparez les codes postaux restants en fonction des données de propriété.",
- 'Compare value, not just headline price': 'Comparez la valeur, pas seulement le prix global',
+ 'Si l’accès au centre, à une gare, à un hôpital, à une université ou à un parc d’activités est important, utilisez d’abord 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 propriété et de superficie. Cela permet de distinguer les zones à moindre coût des zones qui contiennent simplement des maisons plus petites ou différentes.',
+ '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.',
'Screen environmental and local-service signals':
- 'Filtrer les signaux environnementaux et de service local',
+ 'Filtrer les indicateurs environnementaux et les 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 de la route, les parcs, le haut débit, la criminalité et les commodités peuvent affecter le fonctionnement quotidien d'une propriété. Utilisez-les comme critères de sélection avant de réserver des visites.",
+ '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 l'utiliser pour les villages de banlieue autour de Bristol ?",
+ 'Puis-je l’utiliser pour les villages de navetteurs 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 relatives au code postal et à la durée du trajet sont disponibles. Vérifiez toujours les itinéraires et les services manuellement avant de prendre une décision.',
+ '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 ?',
'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 régional, mais une annonce spécifique nécessite toujours des ventes comparables, des vérifications de l'état, des résultats d'enquête et des conseils professionnels, le cas échéant.",
+ '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 d’expertise et des conseils professionnels le cas échéant.',
'Search by reachable postcodes before refining by budget and local context.':
- "Recherchez par codes postaux accessibles avant d'affiner par budget et contexte local.",
+ 'Recherchez par codes postaux accessibles avant d’affiner par budget et contexte local.',
'Understand price patterns before setting listing alerts.':
- 'Comprenez les modèles de prix avant de définir des alertes d’annonces.',
+ 'Comprenez les tendances de prix avant de définir des alertes d’annonces.',
'Privacy and security': 'Confidentialité et sécurité',
'How account and saved-search data is handled in the product.':
'Comment les données de compte et de recherche enregistrées sont gérées dans le produit.',
@@ -489,29 +506,29 @@ const fr: Translations = {
'Perfect Postcode data sources and coverage':
'Perfect Postcode — sources de données et couverture',
'Perfect Postcode data sources - Property, schools, commute and local context':
- 'Sources de données Perfect Postcode – Propriété, écoles, déplacements domicile-travail et contexte local',
+ 'Sources de données Perfect Postcode – Immobilier, écoles, trajet et contexte local',
'Review the public and official datasets used by Perfect Postcode, including property prices, EPC, schools, crime, broadband, noise and travel-time context.':
- "Examinez les ensembles de données publiques et officielles utilisées par Perfect Postcode, notamment les prix de l'immobilier, l'EPC, les écoles, la criminalité, le haut débit, le bruit et le contexte du temps de trajet.",
+ 'Examinez les jeux de données publics et officiels utilisés par Perfect Postcode, notamment les prix immobiliers, l’EPC, les écoles, la criminalité, le haut débit, le bruit et le contexte du temps de trajet.',
'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 combine des ensembles de données sur la propriété, les transports, l'éducation, l'environnement 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.",
+ 'Perfect Postcode combine des jeux de données sur l’immobilier, les transports, l’éducation, l’environnement 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 ensembles de données sur les transactions immobilières et le contexte du logement pour prendre en charge des filtres tels que le prix de vente, le type de propriété, le mode d'occupation, la superficie, 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 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.',
'Use these fields to compare areas, not as a formal valuation.':
'Utilisez ces champs pour comparer des zones, et non comme une évaluation formelle.',
'Check current listings, title information, lender requirements, and survey results before buying.':
- "Vérifiez les annonces actuelles, les informations sur le titre, les exigences du prêteur et les résultats de l'enquête avant d'acheter.",
+ 'Vérifiez les annonces à jour, les informations de titre, les exigences du prêteur et les rapports d’expertise avant d’acheter.',
'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 sur des signaux qui affectent la vie quotidienne. Elles doivent être traitées comme des données de sélection et vérifiées par rapport aux sources officielles actuelles pour les décisions.',
+ '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, l'accès à pied et les détails des horaires doivent être vérifiés avant de s'engager dans une zone.",
+ '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, l’accès à pied et les détails des horaires doivent être vérifiés avant de s’engager dans une zone.',
'Why does coverage focus on England?':
'Pourquoi la couverture se concentre-t-elle sur l’Angleterre ?',
'Several core property, education, and local-context datasets are jurisdiction-specific. England coverage keeps comparisons more consistent.':
- 'Plusieurs ensembles de données de base sur la propriété, l’éducation et le contexte local sont spécifiques à une juridiction. La couverture de l’Angleterre rend les comparaisons plus cohérentes.',
+ 'Plusieurs jeux de données clés sur l’immobilier, l’éducation et le contexte local sont propres à une juridiction. La couverture de l’Angleterre rend les comparaisons plus cohérentes.',
'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.':
@@ -519,74 +536,74 @@ const fr: Translations = {
'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.':
- 'Examinez le contexte au niveau du code postal avant une visualisation.',
+ 'Examinez le contexte au niveau du code postal avant une visite.',
'How saved searches and account data are handled.':
'Comment les recherches enregistrées et les données du compte sont traitées.',
'How to use the map': 'Comment utiliser la carte',
'Methodology for postcode property research':
- 'Méthodologie de recherche de propriété de code postal',
+ 'Méthodologie de recherche immobilière par code postal',
'Perfect Postcode methodology - How to interpret postcode property data':
- 'Méthodologie Perfect Postcode - Comment interpréter les données de propriété du code postal',
+ 'Méthodologie Perfect Postcode - Comment interpréter les données immobilières par code postal',
'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 de propriété, les données de temps de trajet, le contexte scolaire et les signaux locaux comme outil de liste restreinte pour l'achat d'une maison.",
+ '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 doesn’t replace estate agents, surveyors, conveyancers, lenders, school admissions teams, or local authority checks.':
- 'Perfect Postcode est conçu pour que la présélection de zones soit davantage fondée sur des preuves. Il ne remplace pas les agents immobiliers, les géomètres, les agents de transfert de biens, les prêteurs, les équipes d’admission scolaire ou les contrôles des autorités locales.',
+ '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 d’admission scolaire ni les contrôles des autorités locales.',
'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 tels que le budget, le type de propriété, la superficie, le temps de trajet et les services essentiels. Cela supprime les codes postaux impossibles avant que des préférences plus douces ne soient prises en compte.',
+ '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.',
'Use colour layers for trade-offs': 'Utilisez des calques de couleur pour les compromis',
'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.':
- "Après filtrage, coloriez la carte restante en fonction d'un signal à la fois : prix au mètre carré, bruit de la route, contexte scolaire, temps de trajet, haut débit ou criminalité. Cela rend les compromis plus faciles à discuter.",
+ 'Après filtrage, colorez la carte restante selon un indicateur à la fois : prix au mètre carré, bruit routier, contexte scolaire, temps de trajet, haut débit ou criminalité. Les compromis deviennent ainsi plus faciles à discuter.',
'Measure what’s working': 'Mesurez ce qui fonctionne',
'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.':
- 'Utilisez la Search Console et les analyses pour suivre quelles pages publiques sont indexées, quelles requêtes produisent des impressions et quelles pages convertissent les visiteurs en exploration de tableau de bord. Passez en revue Core Web Vitals après chaque modification substantielle du frontend.',
+ 'Utilisez Search Console et les analyses pour suivre quelles pages publiques sont indexées, quelles requêtes produisent des impressions et quelles pages amènent les visiteurs à explorer le tableau de bord. Passez en revue les Core Web Vitals après chaque modification importante du front-end.',
'Can the tool choose the right postcode for me?':
- "L'outil peut-il choisir le bon code postal pour moi ?",
+ 'L’outil 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. Cela permet de comparer les preuves et de réduire la zone de recherche. La décision finale nécessite des visites directes, des inscriptions à jour, des contrôles juridiques, des enquêtes et un jugement personnel.',
+ '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.',
'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 d'achat.",
- 'Understand where key filters come from.': "Comprenez d'où viennent les filtres clés.",
+ 'Utilisez les estimations comme signaux de comparaison, et non comme évaluations professionnelles ou conseils d’achat.',
+ 'Understand where key filters come from.': 'Comprenez d’où 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.',
'Apply the methodology to destination-led search.':
'Appliquez la méthodologie à la recherche basée sur la destination.',
Trust: 'Confiance',
'Privacy and security for saved property searches':
- 'Confidentialité et sécurité pour les recherches de propriétés enregistrées',
+ 'Confidentialité et sécurité des recherches immobilières enregistrées',
'Perfect Postcode privacy and security - Saved searches and account data':
'Perfect Postcode — confidentialité et sécurité : recherches enregistrées et données de compte',
'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 flux de recherche de propriété en gardant à l'esprit la confidentialité et la sécurité.",
+ '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 de référencement publiques des zones réservées aux comptes et marque les itinéraires privés du tableau de bord/compte comme 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.',
'Public pages and private areas are separated':
'Les pages publiques et les zones privées sont séparées',
'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 itinéraires d'invitation sont marqués noindex ou bloqués à l’accès des robots d’indexation, le cas échéant.",
+ '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 d’invitation sont marqués noindex ou bloqués à l’accès des robots d’indexation, le cas échéant.',
'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 aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
- 'Les recherches enregistrées et les liens partagés sont destinés à une utilisation connectée. Ils ne sont pas inclus dans le plan du site public et ne doivent pas être explorables en tant que contenu public.',
+ '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.',
'Search measurement without exposing private data':
- 'Rechercher des mesures sans exposer de données privées',
+ '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 shouldn’t become indexable landing pages.':
- "La mesure du référencement doit avoir lieu sur les pages publiques à l'aide d'analyses agrégées et de données de la 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 à l’aide d’analyses 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.',
'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 de référencement publiques sont répertoriées ; le compte et les itinéraires de recherche enregistrés sont intentionnellement exclus.',
+ 'Non. Les pages SEO publiques sont répertoriées ; les routes de compte et de recherches enregistrées sont intentionnellement exclues.',
'Can private dashboard URLs appear in search?':
- 'Les URL de tableaux de bord privés peuvent-elles apparaître dans la recherche ?',
+ 'Les URL privées du tableau de bord peuvent-elles apparaître dans les résultats de recherche ?',
'They shouldn’t be indexed. The server marks private routes noindex and the sitemap only lists public pages.':
- 'Ils ne devraient pas être indexés. 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 routes privées en noindex et le plan du site ne répertorie 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.':
'Quelles données alimentent les comparaisons publiques.',
'Explore public postcode-search workflows.':
- 'Explorez les workflows publics de recherche de codes postaux.',
+ 'Explorez les parcours publics de recherche par code postal.',
},
},
@@ -661,12 +678,12 @@ const fr: Translations = {
// ── Filters ────────────────────────────────────────
filters: {
activeFilters: 'Filtres actifs',
- addFilter: 'Ajouter un filtre',
- findingPerfectPostcode: 'Trouver le code postal idéal',
+ 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',
upgradePrompt:
- 'Trouvez des codes postaux correspondants avec la criminalité, les écoles, le bruit, le débit internet, les prix et plus de 50 autres filtres dans toute l’Angleterre.',
+ '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 l’Angleterre.',
oneTimeLifetime: 'Paiement unique, accès à vie.',
upgradeToFullMap: 'Passer à la carte complète',
chooseFilters:
@@ -680,7 +697,7 @@ const fr: Translations = {
aboutData: 'À propos de ces données',
aboutDataShort: 'À propos',
colourMap: 'Colorer la carte',
- colourMapShort: 'Colorer carte',
+ colourMapShort: 'Colorer',
clearColourMap: 'Effacer la couleur de la carte',
addFilterAction: 'Ajouter',
addFilterLabel: 'Ajouter un filtre',
@@ -707,10 +724,10 @@ const fr: Translations = {
distance: 'Distance',
crimeType: 'Type de crime',
ethnicity: 'Origine ethnique',
- poiType: 'Type de POI',
+ poiType: 'Type de point d’intérêt',
party: 'Parti',
travelTimeKeywords:
- 'temps trajet déplacement navette domicile-travail voiture vélo bicyclette cyclisme marche à pied piéton transports en commun public station gare train métro tramway bus RER itinéraire route travel time journey commute car bicycle bike walking transit transport station tube train',
+ 'temps trajet durée déplacement domicile travail navette voiture vélo bicyclette cyclisme marche à pied piéton transports en commun public station gare train métro tramway bus RER itinéraire route rail',
},
// ── Philosophy Popup ───────────────────────────────
@@ -726,7 +743,7 @@ const fr: Translations = {
step4Title: 'Écoles',
step4Desc: '(proximité d’écoles notées Bien ou Excellent par Ofsted)',
step5Title: 'Cadre de vie',
- step5Desc: '(restaurants, parcs, débit internet)',
+ step5Desc: '(restaurants, parcs, haut débit)',
step6Title: 'Énergie',
step6Desc: '(classements DPE, isolation, coûts de chauffage)',
tip: 'Astuce : si rien ne correspond, assouplissez un critère à la fois pour voir quel compromis ouvre le plus d’options.',
@@ -744,11 +761,11 @@ const fr: Translations = {
noChange: 'Sans correspondance',
noChangeTitle: 'Trajets directs uniquement',
noChangeDesc:
- 'Limite aux trajets sans correspondance —marche, un seul service de transport, marche jusqu’à destination.',
+ 'Limite aux trajets sans correspondance : marche, un seul service de transport, puis marche jusqu’à destination.',
noBuses: 'Sans bus',
noBusesTitle: 'Exclure les bus',
noBusesDesc:
- 'Exclut les bus —uniquement train, métro, tram et ferry. Pratique pour éviter les retards liés au trafic.',
+ 'Exclut les bus : uniquement train, métro, tram et ferry. Pratique pour éviter les retards liés au trafic.',
previewOnMap: 'Aperçu sur la carte',
stopPreviewing: 'Arrêter l’aperçu',
removeTravelTime: 'Supprimer le temps de trajet',
@@ -759,8 +776,8 @@ const fr: Translations = {
modeCar: 'Voiture',
modeBicycle: 'Vélo',
modeWalking: 'Marche',
- modeTransit: 'Transports',
- modeCarDesc: 'Temps de conduite via l’itinéraire routier le plus rapide',
+ modeTransit: 'Transports en commun',
+ modeCarDesc: 'Temps de trajet en voiture par l’itiné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',
modeTransitDesc: 'Temps de trajet en train, métro et bus',
@@ -773,8 +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 nécessaire pour aller de la destination sélectionnée vers chaque zone.',
+ mainDesc: 'Affiche le temps de trajet entre la destination sélectionnée et chaque zone.',
sliderHint: 'Utilisez le curseur pour définir votre temps de trajet maximum.',
},
@@ -800,7 +816,7 @@ const fr: Translations = {
clearColourView: 'Effacer la vue en couleur',
resetColourScale: 'Réinitialiser l’échelle de couleur',
historicalMatches: 'Correspondances immobilières historiques',
- numberOfProperties: 'Nombre de propriétés',
+ numberOfProperties: 'Nombre de biens',
previewing: 'Aperçu de \u201c{{name}}\u201d',
},
@@ -821,13 +837,14 @@ const fr: Translations = {
type: 'Type :',
builtForm: 'Forme du bâti :',
tenure: 'Régime foncier :',
- withinConservationArea: 'Dans une zone protégée :',
+ withinConservationArea: 'Dans une zone de conservation :',
floorArea: 'Surface :',
rooms: 'Pièces :',
built: 'Construction :',
formerCouncil: 'Ancien logement social :',
- exCouncilBadge: 'Ex-social',
- epcRating: 'Classement DPE :',
+ exCouncilBadge: 'Peut-être ancien logement social',
+ listedBuildingBadge: 'Peut-être classé',
+ epcRating: 'Classe DPE :',
epcPotential: 'Potentiel DPE :',
renovations: 'Rénovations',
perSqm: '/m²',
@@ -837,40 +854,39 @@ 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 classements énergétiques, l’anné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 classes énergétiques, l’anné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.',
},
// ── Area Pane ──────────────────────────────────────
areaPane: {
areaStatistics: 'Statistiques de la zone',
areaOverview: 'Vue d’ensemble',
- statsFor: 'Statistiques pour toutes les propriétés dans ce/cette {{type}}',
+ statsFor: 'Statistiques de tous les biens ({{type}})',
matchingFilters: ' correspondant à tous les filtres actifs',
statsBasis: 'Base des statistiques',
matchingFiltersOption: 'Filtres actifs',
- allPropertiesOption: 'Toutes les propriétés',
+ allPropertiesOption: 'Tous les biens',
filtersAffectStats: 'Les statistiques de ce panneau utilisent les {{count}} filtres actifs.',
- filtersIgnoredForStats:
- 'Affiche les statistiques de toutes les propriétés de la zone sélectionnée.',
+ filtersIgnoredForStats: 'Affiche les statistiques de tous les biens de la zone sélectionnée.',
noFiltersAffectStats:
- 'Aucun filtre actif ; les statistiques couvrent toutes les propriétés de cette zone.',
+ 'Aucun filtre actif ; les statistiques couvrent tous les biens de cette zone.',
filteredStatsEmpty: 'Les statistiques filtrées sont vides',
showAllStatsHint:
- '{{count}} propriétés existent avant les filtres. Passez à toutes les propriétés pour inspecter cette zone.',
+ '{{count}} biens existent avant les filtres. Passez à tous les biens pour inspecter cette zone.',
showAllStatsFallback:
- 'Passez à toutes les propriétés pour inspecter cette zone sans les filtres actifs.',
- showAllStats: 'Afficher toutes les propriétés',
- closestStations: 'Stations les plus proches',
+ 'Passez à tous les biens pour inspecter cette zone 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: 'Modifications les plus proches pour inclure cette zone',
+ closestBlockingFilters: 'Ajustements les plus proches pour inclure cette zone',
lowerMinTo: 'Abaisser le minimum à {{value}}',
raiseMaxTo: 'Augmenter le maximum à {{value}}',
allowCategory: 'Autoriser {{value}}',
missingFilterValue: 'Aucune valeur pour ce filtre ; supprimez-le',
noFilterDataShort: 'Aucune donnée',
travelTo: 'Trajet vers {{destination}}',
- viewProperties: 'Voir {{count}} propriétés',
- viewPropertiesShort: 'Voir les propriétés',
+ viewProperties: 'Voir {{count}} biens',
+ viewPropertiesShort: 'Voir les biens',
priceHistory: 'Historique des prix',
journeysFrom: 'Temps de trajet pour {{label}}',
to: 'Vers {{destination}}',
@@ -881,16 +897,6 @@ const fr: Translations = {
nationalAvg: 'Moyenne nationale',
},
- // ── Histogram Legend ───────────────────────────────
- histogramLegend: {
- tealBars: 'Barres turquoise',
- tealBarsDesc: 'montrent la distribution dans cette zone sélectionnée',
- greyBars: 'Barres grises',
- greyBarsDesc: 'montrent la distribution globale dans toutes les zones',
- dashedLine: 'Ligne pointillée',
- dashedLineDesc: 'indique la moyenne nationale',
- },
-
// ── Street View ────────────────────────────────────
streetView: {
title: 'Street View',
@@ -900,17 +906,17 @@ const fr: Translations = {
// ── POI Pane ───────────────────────────────────────
poiPane: {
- pois: 'POI',
+ pois: 'Points d’intérêt',
pointsOfInterest: 'Points d’intérêt',
poiDescription:
'Données issues d’OpenStreetMap, de NaPTAN et de GEOLYTIX Grocery Retail Points. Couvre les arrêts de transport, commerces, chaînes de supermarchés, restaurants, services de santé, loisirs et plus encore.',
searchCategories: 'Rechercher des catégories...',
- dataSourceInfo: 'Informations sur la source',
+ dataSourceInfo: 'Informations sur la source de données',
},
// ── External Search Links ──────────────────────────
externalSearch: {
- searchOn: 'Rechercher {{radius}} sur',
+ searchOn: 'Rechercher dans un rayon de {{radius}} sur',
exact: 'exact',
outcodeNotRecognised: 'Code postal non reconnu',
},
@@ -921,7 +927,7 @@ const fr: Translations = {
postcodeNotFound: 'Code postal introuvable',
lookupFailed: 'Échec de la recherche',
searchLabel: 'Rechercher des lieux ou codes postaux',
- locateMe: 'Aller à ma position',
+ locateMe: 'Me localiser',
geolocationUnsupported: 'La géolocalisation n’est pas prise en charge par votre navigateur',
geolocationFailed: 'Impossible de déterminer votre position',
},
@@ -938,13 +944,13 @@ const fr: Translations = {
heroTitle2: 'qui correspondent à votre vie',
heroTitle3: 'Pas seulement les quartiers que vous connaissez déjà.',
heroSubtitle:
- 'Des quartiers londoniens aux villes de banlieue et aux villes régionales, l’Angleterre compte trop de lieux pour les rechercher un par un.',
+ 'Des quartiers londoniens aux communes de navetteurs et aux villes régionales, l’Angleterre compte trop de lieux pour les rechercher un par un.',
heroDescription:
- 'Définissez votre budget, trajet, écoles, sécurité, bruit, débit internet et style de vie. Perfect Postcode analyse les codes postaux d’Angleterre et révèle les lieux qui correspondent vraiment, y compris ceux que vous n’auriez jamais cherchés sur un portail immobilier.',
+ 'Définissez votre budget, trajet, écoles, sécurité, bruit, haut débit et style de vie. Perfect Postcode analyse les codes postaux d’Angleterre et révèle les lieux qui correspondent vraiment, y compris ceux que vous n’auriez jamais cherchés sur un portail immobilier.',
exploreTheMap: 'Trouver mes codes postaux',
seeTheDifference: 'Voir comment ça marche',
productDemoLabel: 'Démo produit Perfect Postcode',
- playProductDemo: 'Lire la démo produit Perfect Postcode',
+ playProductDemo: 'Lancer la démo produit Perfect Postcode',
scrollToProductDemo: 'Faire défiler jusqu’à la démo produit',
showcaseHeader: 'Comment ça marche',
showcaseContext: 'Comment fonctionne Perfect Postcode',
@@ -969,7 +975,7 @@ const fr: Translations = {
'Parcourez les rues avant que la recherche d’annonces ne réduise vos options.',
showcaseScoutBullet2:
'Testez le trajet depuis une vraie porte d’entrée, pas seulement depuis un nom d’arrondissement.',
- showcaseScoutBullet3: 'Comparez les visites avec des preuves déjà en main.',
+ showcaseScoutBullet3: 'Comparez les visites avec des données déjà en main.',
showcaseStep1Tab: 'Filtrer',
showcaseStep1Title: 'Transformez des besoins vagues en recherche précise',
showcaseStep1Body:
@@ -978,19 +984,19 @@ const fr: Translations = {
showcaseStep1Chip2: 'Écoles primaires bien notées',
showcaseStep1Chip3: 'Moins de £500k',
showcaseStep1VennCenter: 'Codes postaux qui cochent les trois',
- showcaseStep2Tab: 'Comparer',
+ showcaseStep2Tab: 'Correspondances',
showcaseStep2Title: 'Laissez la carte révéler des lieux que vous n’auriez pas tapés',
showcaseStep2Body:
'Parcourez l’Angleterre par adéquation au lieu de partir de noms de quartiers familiers. Des poches méconnues deviennent visibles avant que les portails d’annonces ne réduisent votre horizon.',
showcaseStep2Region: 'Grand Londres',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
- showcaseStep2ClustersLabel: 'Grappes correspondantes',
+ showcaseStep2ClustersLabel: 'Groupes correspondants',
showcaseStep3Tab: 'Inspecter',
showcaseStep3Title: 'Comprenez pourquoi un code postal correspond',
showcaseStep3Body:
- 'Ouvrez n’importe quelle zone correspondante et vérifiez prix, sécurité, écoles, débit internet et compromis dans un seul panneau avant d’y passer un week-end.',
+ 'Ouvrez n’importe quelle zone correspondante et vérifiez prix, sécurité, écoles, haut débit et compromis dans un seul panneau avant d’y passer un week-end.',
showcaseStep3HeaderArea: 'Votre code postal idéal',
- showcaseStep3HeaderFit: 'Éléments sur le quartier',
+ showcaseStep3HeaderFit: 'Indicateurs du quartier',
showcaseStep3Stat1Label: 'Tendance des prix vendus',
showcaseStep3Stat2Label: 'Criminalité',
showcaseStep3Stat2Value: 'Sous la moyenne de l’arrondissement',
@@ -1006,9 +1012,9 @@ const fr: Translations = {
showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Exporter vers Excel',
showcaseStep4ColPostcode: 'Code postal',
- showcaseStep4ColScore: 'Ajust.',
+ showcaseStep4ColScore: 'Adéquation',
showcaseStep4ColCommute: 'Trajet',
- showcaseStep4ColPrice: 'Prix médian',
+ showcaseStep4ColPrice: 'Prix vendu médian',
showcaseStep4Conclusion: 'Vous pouvez commencer votre recherche ici.',
statProperties: 'ventes historiques',
statFilters: 'filtres combinables',
@@ -1016,26 +1022,26 @@ const fr: Translations = {
statPostcodeInEngland: 'code postal d’Angleterre',
ourPhilosophy: 'Commencez par ce qui compte, puis trouvez le bon code postal',
philosophyP1:
- 'La plupart des sites immobiliers demandent où vous voulez vivre. À Londres, c’est particulièrement difficile, mais le même problème existe partout en Angleterre : les acheteurs partent des quelques lieux qu’ils connaissent, puis vérifient séparément trajets, écoles, criminalité, Street View, débit internet et prix vendus.',
+ 'La plupart des sites immobiliers demandent où vous voulez vivre. À Londres, c’est particulièrement difficile, mais le même problème existe partout en Angleterre : les acheteurs partent des quelques lieux qu’ils 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 d’abord, puis allez tester l’ambiance.',
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 de la route, les écoles, le trajet exact et les vrais prix de vente.',
+ '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',
streetCard1Body:
'Faites ressortir les codes postaux qui correspondent à 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, débit internet, bruit et énergie avant de passer vos week-ends à courir les visites.',
- othersVs: 'Les autres vs',
+ '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 d’annonces',
areaGuides: 'Rapports de code postal',
compSearchWithout: 'Découvrir des zones avant d’en connaître le nom',
compSearchWithoutSub: '(besoins d’abord, lieu ensuite)',
- compAreaData: 'Preuves au niveau du code postal',
- compAreaDataSub: '(criminalité, écoles, bruit, débit internet, services)',
- compPropertyData: 'Historique par propriété',
+ 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)',
compFilters: '56 filtres qui fonctionnent ensemble',
compFiltersSub: '(pas un code postal ou une annonce à la fois)',
@@ -1052,9 +1058,9 @@ const fr: Translations = {
costContext:
'Les acheteurs passent souvent leurs soirées à recouper annonces, trajets, rapports scolaires, cartes de criminalité, Street View et prix vendus. À Londres, c’est incessant, mais le même problème existe dans toute l’Angleterre. Perfect Postcode rassemble la recherche de zone sur une seule carte avant que vous n’engagiez vos week-ends, vos frais et votre attention.',
lessThanSurvey: 'Moins qu’une expertise immobilière. Bien plus utile pour guider vos choix.',
- currentTier: 'Palier actuel',
+ currentTier: 'Offre actuelle',
firstNUsers: '{{count}} premiers utilisateurs',
- everyoneAfter: 'Tous les suivants',
+ everyoneAfter: 'Utilisateurs suivants',
nextNUsers: '{{count}} utilisateurs suivants',
lifetime: '/à vie',
spotsRemaining: '{{count}} place restante',
@@ -1069,10 +1075,10 @@ const fr: Translations = {
upcoming: 'À venir',
failedToLoad: 'Échec du chargement des tarifs. Veuillez réessayer plus tard.',
feat1: '56 filtres dans toute l’Angleterre',
- feat2: 'Chaque code postal consultable à partir de vos besoins',
- feat3: 'Exploration illimitée de la carte, recherches enregistrées et exports',
+ 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',
- feat5: 'Trajets, écoles, criminalité, bruit, débit internet et plus',
+ feat5: 'Trajets, écoles, criminalité, bruit, haut débit et plus',
feat6: 'Toutes les futures mises à jour de données incluses',
},
@@ -1090,7 +1096,7 @@ const fr: Translations = {
'Parcourez les guides publics sur la recherche immobilière, les trajets, les écoles, les codes postaux, les comparaisons régionales, la couverture des données, la méthodologie et la confidentialité.',
supportIntro: 'Vous avez une question ? Consultez notre FAQ ou contactez-nous directement.',
source: 'Source :',
- optOut: 'Retrait de la divulgation publique',
+ optOut: 'Refus de la publication publique',
attribution: 'Attribution',
attrLandRegistry:
'Contient des données du HM Land Registry © Crown copyright and database right 2025.',
@@ -1103,17 +1109,17 @@ const fr: Translations = {
attrOsmLicense: 'disponibles sous la',
attrOsmLicenseLink: 'Open Data Commons Open Database License (ODbL)',
// Data source names & descriptions
- dsPricePaidName: 'Données des prix payés',
+ dsPricePaidName: 'Données sur les prix payés',
dsPricePaidOrigin: 'HM Land Registry',
dsPricePaidUse: 'Historique complet des prix de vente immobiliers en Angleterre.',
dsEpcName: 'Certificats de performance énergétique (EPC)',
dsEpcOrigin: 'Ministry of Housing, Communities & Local Government',
dsEpcUse:
- 'Certificats de performance énergétique domestiques fournissant la surface, le nombre de pièces, l’année de construction, les classements énergétiques, le type de bien et la forme du bâti. Associés aux données Price Paid par adresse au sein de chaque code postal. Les propriétaires peuvent demander le retrait de la divulgation publique.',
+ 'Certificats de performance énergétique domestiques fournissant la surface, le nombre de pièces, l’année de construction, les classes énergétiques, le type de bien et la forme du bâti. Associés aux données Price Paid par adresse au sein de chaque code postal. Les propriétaires peuvent demander le refus de la publication publique.',
dsNsplName: 'Répertoire national des codes postaux (NSPL)',
dsNsplOrigin: 'ONS / ArcGIS',
dsNsplUse:
- 'Associe les codes postaux aux coordonnées et aux codes de zones statistiques, utilisé pour relier tous les jeux de données au niveau de la zone aux propriétés individuelles.',
+ 'Associe les codes postaux aux coordonnées et aux codes de zones statistiques, utilisé pour relier tous les jeux de données au niveau de la zone aux biens individuels.',
dsIodName: 'Indices de défavorisation en Angleterre 2025',
dsIodOrigin: 'Ministry of Housing, Communities & Local Government',
dsIodUse:
@@ -1122,15 +1128,15 @@ const fr: Translations = {
dsEthnicityOrigin: 'ONS',
dsEthnicityUse:
'Pourcentages de population par groupe ethnique (sud-asiatique, est-asiatique, noir, mixte, blanc, autre) par autorité locale.',
- dsCrimeName: 'Données de criminalité de proximité',
+ dsCrimeName: 'Données de criminalité au niveau rue',
dsCrimeOrigin: 'data.police.uk',
dsCrimeUse:
- 'Données de criminalité de proximité agrégées en moyennes annuelles par LSOA et type d’infraction (violences, cambriolages, troubles à l’ordre public, stupéfiants, vols de véhicules, etc.).',
+ 'Données de criminalité au niveau rue agrégées en moyennes annuelles par LSOA et type d’infraction (violences, cambriolages, comportements antisociaux, stupéfiants, vols de véhicules, etc.).',
dsOsmName: 'Points d’intérêt OpenStreetMap',
dsOsmOrigin: 'OpenStreetMap contributors / Geofabrik',
dsOsmUse:
'Points d’intérêt couvrant commerces, restaurants, santé, loisirs, tourisme et plus à travers la Grande-Bretagne.',
- dsGeolytixRetailName: 'Points de vente alimentaire GEOLYTIX',
+ dsGeolytixRetailName: 'Points de vente alimentaires GEOLYTIX',
dsGeolytixRetailOrigin: 'GEOLYTIX',
dsGeolytixRetailUse:
'Emplacements de supermarchés et magasins de proximité au Royaume-Uni, incluant des chaînes comme Waitrose, Tesco, Sainsbury’s, Asda, Morrisons, Aldi, Lidl, Co-op, M&S, Iceland et Spar.',
@@ -1169,15 +1175,15 @@ const fr: Translations = {
dsCouncilTaxName: 'Niveaux de council tax 2025-2026',
dsCouncilTaxOrigin: 'Ministry of Housing, Communities & Local Government',
dsCouncilTaxUse:
- 'Taux annuels de taxe d’habitation pour les tranches A à H pour les 296 autorités de facturation d’Angleterre, pour un logement occupé par deux adultes. Reliés aux propriétés via le code d’autorité locale du répertoire de codes postaux NSPL.',
+ 'Taux annuels de council tax pour les tranches A à H des 296 autorités de facturation d’Angleterre, pour un logement occupé par deux adultes. Reliés aux biens via le code de district d’autorité locale du répertoire de codes postaux NSPL.',
dsRentalName: 'Statistiques du marché locatif privé',
dsRentalOrigin: 'ONS / Valuation Office Agency',
dsRentalUse:
- 'Loyers mensuels médians du marché locatif privé par autorité locale et catégorie de chambres (oct. 2022 - sept. 2023). Reliés aux propriétés via le code d’autorité locale et le nombre estimé de chambres.',
+ 'Loyers mensuels médians du marché locatif privé par autorité locale et catégorie de chambres (oct. 2022 - sept. 2023). Reliés aux biens via le code d’autorité locale et le nombre estimé de chambres.',
dsElectionName: 'Résultats des élections générales 2024',
dsElectionOrigin: 'Parlement britannique',
dsElectionUse:
- 'Résultats par candidat des élections générales britanniques de juillet 2024. Agrégés au niveau de la circonscription : participation électorale (%) et parts des voix par parti (%). Reliés aux propriétés via le code de circonscription parlementaire (pcon) du répertoire de codes postaux NSPL.',
+ 'Résultats par candidat des élections générales britanniques de juillet 2024. Agrégés au niveau de la circonscription : participation électorale (%) et parts des voix par parti (%). Reliés aux biens via le code de circonscription parlementaire (pcon) du répertoire de codes postaux NSPL.',
// FAQ section titles
faqFindingTitle: 'Où chercher',
faqCommuteTitle: 'Temps de trajet',
@@ -1194,23 +1200,23 @@ const fr: Translations = {
// FAQ items — Finding Your Area
faqFinding1Q: 'Où chercher quand les zones évidentes sont trop chères ?',
faqFinding1A:
- 'Commencez par ce qui est non négociable : budget, type de logement, espace, trajet, écoles, sécurité, bruit, internet, parcs et tout ce qui compte pour vous. La carte masque les lieux qui ne correspondent pas, afin de faire apparaître des zones moins évidentes avant de parcourir les annonces.',
+ 'Commencez par ce qui est non négociable : budget, type de logement, espace, trajet, écoles, sécurité, bruit, haut débit, parcs et tout ce qui compte pour vous. La carte masque les lieux qui ne correspondent pas, afin de faire apparaître des zones moins évidentes avant de parcourir les annonces.',
faqFinding2Q: 'Comment trouver de bons codes postaux dans des lieux que je connais mal ?',
faqFinding2A:
- 'Appliquez vos indispensables sur toute la carte, puis regardez de près les groupes de lieux restants. Vous pouvez comparer des codes postaux inconnus par trajet, prix vendus, écoles, criminalité, internet, bruit, commerces ou parcs à proximité, au lieu de vous fier à leur réputation.',
+ 'Appliquez vos indispensables sur toute la carte, puis regardez de près les groupes de lieux restants. Vous pouvez comparer des codes postaux inconnus par trajet, prix vendus, écoles, criminalité, haut débit, bruit, commerces ou parcs à proximité, au lieu de vous fier à leur réputation.',
faqFinding3Q: 'Que faire si ma recherche renvoie trop ou trop peu de zones ?',
faqFinding3A:
'Gardez vos indispensables, puis colorez la carte selon une chose à comparer, comme le prix au m², le bruit routier, le score des écoles ou le temps de trajet. S’il ne reste presque rien, relâchez un curseur et voyez quel changement ouvre de nouvelles options.',
// FAQ items — Commute and Travel
faqCommute1Q: 'Comment les temps de trajet sont-ils calculés ?',
faqCommute1A:
- 'Les temps de trajet sont calculés à l’avance pour chaque destination enregistrée. Nous déterminons quels codes postaux peuvent atteindre cette destination en voiture, à vélo, à pied ou en transports publics, puis nous conservons ces résultats pour que la carte réponde vite pendant vos filtres.',
+ 'Les temps de trajet sont calculés à l’avance pour chaque destination enregistrée. Nous déterminons quels codes postaux peuvent atteindre cette destination en voiture, à vélo, à pied ou en transports en commun, puis nous conservons ces résultats pour que la carte réponde vite pendant que vous filtrez.',
faqCommute2Q: 'Que faut-il savoir sur ces temps de trajet ?',
faqCommute2A:
- 'Les temps en transports publics sont basés sur un trajet du matin en semaine, avec des départs entre 07:30 et 08:30. Le réglage normal montre un trajet typique sur cette période. Ce sont des estimations de planification, sans retards en direct, trafic ou changements de quai de dernière minute.',
+ 'Les temps en transports en commun sont basés sur un trajet du matin en semaine, avec des départs entre 07:30 et 08:30. Le réglage normal montre un trajet typique sur cette période. Ce sont des estimations de planification, sans retards en temps réel, trafic ou changements de quai de dernière minute.',
faqCommute3Q: 'Quand utiliser le bouton Meilleur cas ?',
faqCommute3A:
- 'Utilisez le bouton Meilleur cas pour les trajets en transports publics lorsque vous voulez voir le résultat avec un départ bien choisi et de bonnes correspondances. Laissez-le désactivé pour une comparaison de tous les jours.',
+ 'Utilisez le bouton Meilleur cas pour les trajets en transports en commun lorsque vous voulez voir le résultat avec un départ bien choisi et de bonnes correspondances. Laissez-le désactivé pour la comparaison quotidienne, car le réglage normal est plus proche de ce à quoi vous attendre la plupart des jours.',
// FAQ items — Budget and Value
faqBudget1Q: 'Comment estimez-vous les prix actuels ?',
faqBudget1A:
@@ -1224,7 +1230,7 @@ const fr: Translations = {
'La criminalité enregistrée par la police est ventilée par type, notamment violences, cambriolages, vols avec violence, infractions liées aux véhicules, comportements antisociaux, vols à l’étalage, stupéfiants et ordre public. Vous pouvez filtrer les risques précis qui vous importent au lieu de dépendre d’un score de sécurité vague.',
faqSafety2Q: 'Que vérifier avant de visiter une rue que je ne connais pas ?',
faqSafety2A:
- 'Vérifiez criminalité, bruit routier, internet, parcs, commerces alimentaires, écoles et trajet avant de réserver. Les photos d’annonce peuvent être utiles, mais elles ne devraient pas être votre première source sur la rue.',
+ 'Vérifiez criminalité, bruit routier, haut débit, parcs, commerces alimentaires, écoles et trajet avant de réserver. Les photos d’annonce peuvent être utiles, mais elles ne devraient pas être votre première source sur la rue.',
// FAQ items — Families and Schools
faqFamilies1Q:
'Quelles zones offrent le bon équilibre entre écoles, espace, sécurité et trajet ?',
@@ -1235,44 +1241,44 @@ const fr: Translations = {
'Non. Nous montrons la qualité des écoles proches et les informations locales sur l’éducation, mais les secteurs d’admission et règles de priorité peuvent changer. Utilisez Perfect Postcode pour sélectionner des lieux, puis vérifiez les admissions auprès de l’école ou de la mairie.',
// FAQ items — Environment and Quality of Life
faqEnv1Q:
- 'Comment éviter une route bruyante sans perdre en qualité de trajet ou de débit internet ?',
+ 'Comment éviter une route bruyante sans perdre en qualité de trajet ou de haut débit ?',
faqEnv1A:
- 'Filtrez par bruit routier, puis gardez actifs les filtres de trajet, internet, prix et logement. Vous pouvez colorer la carte selon un critère pendant que les autres gardent la sélection réaliste.',
+ 'Filtrez par bruit routier, puis gardez actifs les filtres de trajet, de haut débit, de prix et de logement. Vous pouvez colorer la carte selon un critère pendant que les autres gardent la sélection réaliste.',
faqEnv2Q:
'Affichez-vous le risque d’inondation, d’affaissement ou les problèmes relevés par une expertise ?',
faqEnv2A:
'Pas aujourd’hui. Nous affichons le bruit routier, la note énergétique, l’âge du bâtiment et l’environnement local autour du code postal. Le risque d’inondation, les questions juridiques, les problèmes de structure, le prêt immobilier et l’expertise doivent encore être vérifiés séparément avant d’acheter.',
faqEnv3Q: 'Quels coûts d’usage puis-je vérifier avant une visite ?',
faqEnv3A:
- 'Vous pouvez vérifier la note énergétique, la surface, l’âge du bâtiment, la zone de taxe locale, internet et le bruit avant la visite. Cela ne prédit pas vos factures exactes, mais aide à éviter tôt les incompatibilités évidentes.',
+ 'Vous pouvez vérifier la note énergétique, la surface, l’âge du bâtiment, la zone de council tax, le haut débit et le bruit avant la visite. Cela ne prédit pas vos factures exactes, mais aide à éviter tôt les incompatibilités évidentes.',
// FAQ items — Listing Portals and Due Diligence
faqDueDiligence1Q: 'Faut-il l’utiliser avant ou après Rightmove ?',
faqDueDiligence1A:
'Utilisez Perfect Postcode avant et en parallèle des sites d’annonces. Rightmove, Zoopla et OnTheMarket restent les endroits où vérifier ce qui est en vente maintenant, les photos, les agents, les visites et les alertes. Perfect Postcode vous aide à décider quels codes postaux valent la peine d’être cherchés.',
- faqDueDiligence2Q: 'Puis-je filtrer par jardin, garage, agencement ou texte d’annonce ?',
+ faqDueDiligence2Q: 'Pourquoi ne puis-je pas filtrer par jardin, garage ou agencement ?',
faqDueDiligence2A:
- 'Ces détails ne sont pas disponibles de façon fiable pour chaque logement. Perfect Postcode peut filtrer la surface, le type de logement, le type de propriété, la note énergétique, les prix vendus et les informations locales. Les jardins, garages, orientation, agencements et formulations d’agent doivent encore être vérifiés dans l’annonce et lors de la visite.',
+ 'Ces détails ne sont pas disponibles de façon fiable pour chaque logement. Perfect Postcode peut filtrer la surface, le type de logement, le statut de propriété, la note énergétique, les prix vendus et les données locales. Les jardins, garages, orientation, agencement des pièces et formulations d’agent doivent encore être vérifiés dans l’annonce et lors de la visite.',
faqDueDiligence3Q:
'Puis-je voir l’historique des baisses de prix ou la durée de mise en ligne ?',
faqDueDiligence3A:
- 'Pas actuellement. Perfect Postcode s’appuie sur les prix vendus, les notes énergétiques, les codes postaux, les temps de trajet et les informations de quartier plutôt que sur les changements d’annonces en direct. Vous pouvez tout de même utiliser l’historique des ventes, la valeur actuelle estimée et le prix au m² pour juger si un prix demandé semble élevé.',
+ 'Pas actuellement. Perfect Postcode s’appuie sur les prix vendus, les notes énergétiques, les codes postaux, les temps de trajet et les données de quartier plutôt que sur les changements d’annonces en cours. Vous pouvez tout de même utiliser l’historique des ventes, la valeur actuelle estimée et le prix au m² pour juger si un prix demandé semble élevé.',
faqDueDiligence4Q: 'Que dois-je encore vérifier avant de faire une offre ?',
faqDueDiligence4A:
- 'Utilisez Perfect Postcode pour vérifier la zone et la valeur probable, puis confirmez les détails de l’annonce avant de faire une offre. Vérifiez aussi le type de propriété, les conditions du bail, les charges, l’historique d’urbanisme, le risque d’inondation, les questions juridiques, les exigences du prêt et l’expertise.',
+ 'Utilisez Perfect Postcode pour vérifier la zone et la valeur probable, puis confirmez les détails de l’annonce avant de faire une offre. Vérifiez aussi le statut de propriété, les conditions du bail, les charges, l’historique d’urbanisme, le risque d’inondation, les questions juridiques, les exigences du prêt et les rapports d’expertise.',
// FAQ items — Privacy and Data Protection
faqPrivacy1Q: 'Stockez-vous des données personnelles me concernant ?',
faqPrivacy1A:
- 'Les informations immobilières et de quartier ne contiennent pas vos données personnelles. Si vous créez un compte, nous stockons seulement ce qui est nécessaire au service, comme votre adresse e-mail, votre statut d’accès, votre choix de newsletter, vos recherches enregistrées, vos biens enregistrés et les paiements gérés par Stripe. Ces données de compte sont traitées selon la loi britannique sur la confidentialité.',
+ 'Les informations immobilières et de quartier ne contiennent pas vos données personnelles. Si vous créez un compte, nous stockons seulement ce qui est nécessaire au service, comme votre adresse e-mail, votre statut d’accès, votre choix de newsletter, vos recherches enregistrées, vos liens partagés et les enregistrements de paiement gérés par Stripe. Ces données de compte sont traitées selon la loi britannique sur la confidentialité.',
// FAQ items — Why Perfect Postcode
faqWhy1Q: 'Que montre cet outil que les portails d’annonces ne montrent généralement pas ?',
faqWhy1A:
- 'Les sites d’annonces partent des logements à vendre aujourd’hui. Perfect Postcode part des lieux qui correspondent à votre vie et votre budget, avec prix vendus, espace, trajet, écoles, criminalité, bruit, internet, note énergétique, type de propriété et services avant d’ouvrir les annonces.',
+ 'Les sites d’annonces partent des logements à vendre aujourd’hui. Perfect Postcode part des lieux qui correspondent à votre vie et à votre budget, avec prix vendus, espace, trajet, écoles, criminalité, bruit, haut débit, note énergétique, statut de propriété et services avant d’ouvrir les annonces.',
faqWhy2Q: 'Combien de recherche manuelle cela économise-t-il ?',
faqWhy2A:
- 'Vous pourriez le faire vous-même, mais il faudrait vérifier prix vendus, notes énergétiques, criminalité, écoles, internet, informations locales, environnement, trajets et cartes code postal par code postal. Perfect Postcode rassemble ces sources dans une carte consultable pour l’Angleterre.',
+ 'Vous pourriez le faire vous-même, mais il faudrait vérifier prix vendus, notes énergétiques, criminalité, écoles, haut débit, informations locales, environnement, trajets et cartes code postal par code postal. Perfect Postcode rassemble ces sources dans une carte consultable pour l’Angleterre.',
faqWhy3Q: 'Quelle est la fiabilité des données ?',
faqWhy3A:
- 'Les principales sources sont officielles ou largement utilisées : prix vendus, notes énergétiques, informations locales, écoles, internet, criminalité, environnement, cartes et rues. Elles sont utiles pour sélectionner et comparer, mais toute décision d’achat demande encore des vérifications à jour et, si besoin, un avis expert.',
+ 'Les principales sources sont officielles ou largement utilisées : prix vendus, notes énergétiques, informations locales, écoles, haut débit, criminalité, environnement, données cartographiques et données de rue. Elles sont utiles pour sélectionner et comparer, mais toute décision d’achat demande encore des vérifications à jour et, si besoin, un avis expert.',
// FAQ items — Pricing and Access
faqPricing1Q: 'Pourquoi payer alors que les rapports de code postal sont gratuits ?',
faqPricing1A:
@@ -1298,7 +1304,7 @@ const fr: Translations = {
// FAQ items — Behind The Data
faqBehindData1Q: 'Pourquoi un aéroport peut-il sembler plus calme que les rues alentour ?',
faqBehindData1A:
- 'Le niveau de bruit affiché pour un code postal est le plus fort des trois sources Defra — route, rail et avion — modélisé à 4 m du sol comme une moyenne pondérée sur 24 h (Lden). Dans une rue résidentielle passante, le bruit routier domine, généralement 65–75 dB. À l’intérieur du périmètre d’un aéroport, il n’y a pas de grands axes publics, le terme routier chute et il ne reste que la moyenne aérienne. London City Airport, par exemple, a un couvre-feu et un trafic limité, donc son Lden aérien sur 24 h reste modéré (environ 60–66 dB près de la piste) — l’aéroport apparaît donc plus calme que les axes A qui le bordent. On retrouve le même effet à Heathrow. C’est un artefact réel de la mesure du bruit des transports à hauteur de récepteur résidentiel, pas un bug.',
+ 'Le niveau de bruit affiché pour un code postal est le plus fort des trois sources Defra — route, rail et avion — modélisé à 4 m du sol comme une moyenne pondérée sur 24 h (Lden). Dans une rue résidentielle passante, le bruit routier domine, généralement 65–75 dB. À l’intérieur du périmètre d’un aéroport, il n’y a pas de grands axes publics, donc la composante routière disparaît et il ne reste que la moyenne aérienne. London City Airport, par exemple, a un couvre-feu et un trafic limité, donc son Lden aérien sur 24 h reste modéré (environ 60–66 dB près de la piste) — l’aéroport apparaît donc plus calme que les axes A qui le bordent. On retrouve le même effet à Heathrow. C’est un artefact réel de la mesure du bruit des transports à hauteur de récepteur résidentiel, pas un bug.',
faqBehindData2Q:
'Pourquoi l’aéroport, l’autoroute ou un parc apparaît-il comme une grande forme ?',
faqBehindData2A:
@@ -1354,13 +1360,13 @@ const fr: Translations = {
invitesPage: {
inviteLinksLicensed:
'Les liens d’invitation sont disponibles pour les utilisateurs sous licence.',
- inviteAdminLabel: 'Inviter des amis (100% de réduction)',
- inviteReferralLabel: 'Inviter des amis (30% de réduction)',
+ inviteAdminLabel: 'Inviter des amis (100 % de réduction)',
+ inviteReferralLabel: 'Inviter des amis (30 % de réduction)',
generateFreeInvite: 'Générer un lien d’invitation gratuit',
generateReferralLink: 'Générer un lien de parrainage',
copyInviteLink: 'Copier le lien d’invitation',
- adminInvitesTitle: 'Invitations admin (100% de réduction)',
- referralInvitesTitle: 'Invitations de parrainage (30% de réduction)',
+ adminInvitesTitle: 'Invitations administrateur (100 % de réduction)',
+ referralInvitesTitle: 'Invitations de parrainage (30 % de réduction)',
yourInviteLinks: 'Vos liens d’invitation',
noInvitesYet: 'Aucune invitation générée pour l’instant',
link: 'Lien',
@@ -1375,11 +1381,11 @@ const fr: Translations = {
youreInvited: 'Vous êtes invité !',
specialOffer: 'Offre spéciale !',
invitedByFree: '{{name}} vous invite à obtenir un accès à vie gratuit.',
- invitedByDiscount: '{{name}} vous fait bénéficier d’une réduction de 30% sur l’accès à vie.',
+ invitedByDiscount: '{{name}} vous fait bénéficier d’une réduction de 30 % sur l’accès à vie.',
genericFreeInvite: 'Vous avez été invité à obtenir un accès à vie gratuit.',
- genericDiscount: 'Un ami vous fait bénéficier d’une réduction de 30% sur l’accès à vie.',
+ genericDiscount: 'Un ami vous fait bénéficier d’une réduction de 30 % sur l’accès à vie.',
exploreEvery: 'Trouvez les codes postaux adaptés à votre vie',
- propertyInfo: 'Prix, trajet, écoles, criminalité, bruit, débit internet, DPE et plus encore',
+ propertyInfo: 'Prix, trajet, écoles, criminalité, bruit, haut débit, DPE et plus encore',
invalidInvite: 'Invitation invalide',
inviteAlreadyUsed: 'Invitation déjà utilisée',
inviteAlreadyUsedDesc: 'Ce lien d’invitation a déjà été utilisé.',
@@ -1404,11 +1410,11 @@ const fr: Translations = {
daysAgo: 'il y a {{count}} j',
nFilters: '{{count}} filtres',
noFilters: 'Aucun filtre',
- poiCategory: '{{count}} catégorie de POI',
- poiCategories: '{{count}} catégories de POI',
- travelDestination: '{{count}} destination de temps de trajet',
- travelDestinations: '{{count}} destinations de temps de trajet',
- propertiesMatch: '{{count}} propriétés correspondent',
+ poiCategory: '{{count}} catégorie de point d’intérêt',
+ poiCategories: '{{count}} catégories de points d’intérêt',
+ travelDestination: '{{count}} destination de trajet',
+ travelDestinations: '{{count}} destinations de trajet',
+ propertiesMatch: '{{count}} biens correspondent',
setFilters: 'Définir {{count}} filtre(s) : {{list}}',
noFiltersSet: 'Aucun filtre défini',
toDestination: '{{mode}} vers {{label}} {{bounds}}',
@@ -1420,13 +1426,13 @@ const fr: Translations = {
tutorial: {
step1Title: 'Dites à la carte ce qui compte',
step1Content:
- 'Définissez votre budget, limite de trajet, qualité des écoles, seuil de criminalité, tolérance au bruit, besoins en débit internet ou tout ce qui compte pour vous. Seules les zones correspondantes restent éclairées. Utilisez Colorer pour ombrer la carte selon n’importe quel critère.',
+ 'Définissez votre budget, limite de trajet, qualité des écoles, seuil de criminalité, tolérance au bruit, besoins en haut débit ou tout ce qui compte pour vous. Seules les zones correspondantes restent éclairées. Utilisez Colorer pour colorer la carte selon n’importe quel critère.',
step2Title: 'Ou décrivez simplement',
step2Content:
- 'Tapez ce que vous voulez en langage courant, par exemple « quartier calme près de bonnes écoles sous £400k », et nous configurerons les filtres pour vous.',
+ 'Tapez ce que vous voulez en langage courant, par exemple « quartier calme près de bonnes écoles à moins de £400k », et nous configurerons les filtres pour vous.',
step3Title: 'Explorez ce qui existe',
step3Content:
- 'Naviguez et zoomez à travers l’Angleterre. Cliquez sur n’importe quelle zone colorée pour voir pourquoi elle correspond : criminalité, écoles, prix, débit internet, bruit et plus encore.',
+ 'Parcourez l’Angleterre et zoomez. Cliquez sur n’importe quelle zone colorée pour voir pourquoi elle correspond : criminalité, écoles, prix, haut débit, bruit et plus encore.',
step4Title: 'Allez directement à un lieu',
step4Content:
'Recherchez n’importe quel lieu ou code postal pour vous y rendre instantanément.',
@@ -1443,20 +1449,20 @@ const fr: Translations = {
// The English keys MUST match exactly what the API returns.
server: {
// ─ Feature group names ─
- Properties: 'Propriétés',
+ Properties: 'Biens',
'Property prices': 'Prix immobiliers',
Transport: 'Transports',
Education: 'Éducation',
'Defining characteristics': 'Caractéristiques déterminantes',
'Area development': 'Développement du quartier',
Crime: 'Criminalité',
- Neighbours: 'Voisins',
- Amenities: 'Commodités',
+ Neighbours: 'Voisinage',
+ Amenities: 'Services de proximité',
Environment: 'Environnement',
// ─ Feature names (Properties) ─
'Property type': 'Type de bien',
- 'Leasehold/Freehold': 'Bail/Pleine propriété',
+ 'Leasehold/Freehold': 'Bail / pleine propriété',
'Last known price': 'Dernier prix connu',
'Estimated price': 'Prix estimé',
'Estimated current price': 'Prix actuel estimé',
@@ -1464,15 +1470,15 @@ const fr: Translations = {
'Est. price per sqm': 'Prix estimé au m²',
'Estimated monthly rent': 'Loyer mensuel estimé',
'Total floor area (sqm)': 'Surface totale (m²)',
- 'Number of bedrooms & living rooms': 'Nombre de chambres et séjours',
+ 'Number of bedrooms & living rooms': 'Nombre de chambres et pièces de séjour',
'Construction year': 'Année de construction',
'Date of last transaction': 'Date de la dernière transaction',
'Former council house': 'Ancien logement social',
- 'Current energy rating': 'Classement énergétique actuel',
- 'Potential energy rating': 'Classement énergétique potentiel',
+ 'Current energy rating': 'Classe énergétique actuelle',
+ 'Potential energy rating': 'Classe énergétique potentielle',
'Interior height (m)': 'Hauteur intérieure (m)',
'Street tree density percentile': 'Percentile de densité arborée de la rue',
- 'Within conservation area': 'Dans une zone protégée',
+ 'Within conservation area': 'Dans une zone de conservation',
'Listed building': 'Bâtiment classé',
// ─ Feature names (Transport) ─
@@ -1498,14 +1504,14 @@ const fr: Translations = {
'Air Quality and Road Safety Score': 'Score qualité de l’air et sécurité routière',
// ─ Feature names (Crime) ─
- 'Serious crime per 1k residents (avg/yr)': 'Crimes graves pour 1k habitants (moy./an)',
- 'Minor crime per 1k residents (avg/yr)': 'Délits mineurs pour 1k habitants (moy./an)',
- 'Serious crime (avg/yr)': 'Crimes graves (moy./an)',
- 'Minor crime (avg/yr)': 'Délits mineurs (moy./an)',
+ '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)',
'Burglary (avg/yr)': 'Cambriolages (moy./an)',
'Robbery (avg/yr)': 'Vols avec violence (moy./an)',
- 'Vehicle crime (avg/yr)': 'Crimes liés aux véhicules (moy./an)',
+ 'Vehicle crime (avg/yr)': 'Infractions liées aux véhicules (moy./an)',
'Anti-social behaviour (avg/yr)': 'Comportements antisociaux (moy./an)',
'Criminal damage and arson (avg/yr)': 'Dégradations et incendies criminels (moy./an)',
'Other theft (avg/yr)': 'Autres vols (moy./an)',
@@ -1515,7 +1521,7 @@ const fr: Translations = {
'Drugs (avg/yr)': 'Infractions liées aux stupéfiants (moy./an)',
'Possession of weapons (avg/yr)': 'Possession d’armes (moy./an)',
'Public order (avg/yr)': 'Troubles à l’ordre public (moy./an)',
- 'Other crime (avg/yr)': 'Autres crimes (moy./an)',
+ 'Other crime (avg/yr)': 'Autres infractions (moy./an)',
// ─ Feature names (Neighbours) ─
'Median age': 'Âge médian',
@@ -1543,10 +1549,10 @@ const fr: Translations = {
Schools: 'Écoles',
'Specific crimes': 'Crimes spécifiques',
Ethnicities: 'Origines ethniques',
- 'Amenity distance': 'Distance aux commodités',
+ 'Amenity distance': 'Distance aux services',
'Closest transport option': 'Transport le plus proche',
- 'Amenities within 2km': 'Commodités à moins de 2 km',
- 'Amenities within 5km': 'Commodités à moins de 5 km',
+ 'Amenities within 2km': 'Services à moins de 2 km',
+ 'Amenities within 5km': 'Services à moins de 5 km',
// ─ Enum values ─
Detached: 'Individuelle',
@@ -1555,13 +1561,13 @@ const fr: Translations = {
'Flats/Maisonettes': 'Appartements/Duplex',
Other: 'Autre',
Freehold: 'Pleine propriété',
- Leasehold: 'Bail emphytéotique',
+ Leasehold: 'Bail de longue durée',
Yes: 'Oui',
No: 'Non',
// ─ Stacked chart labels ─
- 'Serious crime': 'Crimes graves',
- 'Minor crime': 'Délits mineurs',
+ 'Serious crime': 'Infractions graves',
+ 'Minor crime': 'Infractions mineures',
'Ethnic composition': 'Composition ethnique',
'Political vote share': 'Répartition des voix',
'Anti-social': 'Antisocial',
@@ -1580,7 +1586,7 @@ const fr: Translations = {
Culture: 'Culture',
Services: 'Services',
Practical: 'Services pratiques',
- Shops: 'Boutiques',
+ Shops: 'Commerces',
// ─ POI categories ─
Airport: 'Aéroport',
@@ -1639,7 +1645,7 @@ const fr: Translations = {
'Hospital & Clinic': 'Hôpital et clinique',
Optician: 'Opticien',
Physiotherapy: 'Kinésithérapie',
- 'Counselling & Therapy': 'Conseil et thérapie',
+ 'Counselling & Therapy': 'Soutien psychologique et thérapie',
'Care Home': 'Maison de retraite',
'Medical & Mobility': 'Matériel médical et mobilité',
Museum: 'Musée',
@@ -1650,6 +1656,14 @@ const fr: Translations = {
Zoo: 'Zoo',
'Tourist Attraction': 'Attraction touristique',
School: 'École',
+ 'Nursery school': 'École maternelle',
+ 'Primary school': 'École primaire',
+ 'Secondary school': 'École secondaire',
+ 'All-through school': 'École tous niveaux',
+ 'Sixth form': 'Lycée (post-16)',
+ 'Further education college': 'Établissement de formation post-16',
+ University: 'Université',
+ 'Special school': 'École spécialisée',
Hotel: 'Hôtel',
'Local Business': 'Commerce local',
Offices: 'Bureaux',
diff --git a/frontend/src/i18n/locales/hi.ts b/frontend/src/i18n/locales/hi.ts
index d266a0e..42707f5 100644
--- a/frontend/src/i18n/locales/hi.ts
+++ b/frontend/src/i18n/locales/hi.ts
@@ -6,8 +6,8 @@ const hi: Translations = {
update: 'अपडेट करें',
cancel: 'रद्द करें',
close: 'बंद करें',
- delete: 'हटाएं',
- finish: 'समाप्त',
+ delete: 'हटाएँ',
+ finish: 'पूरा करें',
language: 'भाषा',
open: 'खोलें',
share: 'साझा करें',
@@ -31,17 +31,17 @@ const hi: Translations = {
postcode: 'पोस्टकोड',
noAreaSelected: 'कोई क्षेत्र चुना नहीं गया',
noAreaSelectedDesc:
- 'अपराध, स्कूल, कीमतें और अधिक देखने के लिए मानचित्र पर किसी भी रंगीन क्षेत्र पर क्लिक करें',
+ 'अपराध, स्कूल, कीमतें और बाकी जानकारी देखने के लिए मानचित्र पर किसी भी रंगीन क्षेत्र पर क्लिक करें',
clickForDetails: 'विवरण के लिए क्लिक करें',
property: 'संपत्ति',
propertiesPlural: 'संपत्तियां',
- bedsCount: '{{count}} बेड',
- bedsCount_other: '{{count}} बेड',
- bathsCount: '{{count}} बाथ',
- bathsCount_other: '{{count}} बाथ',
+ bedsCount: '{{count}} बेडरूम',
+ bedsCount_other: '{{count}} बेडरूम',
+ bathsCount: '{{count}} बाथरूम',
+ bathsCount_other: '{{count}} बाथरूम',
places: 'स्थान',
noData: 'कोई डेटा नहीं',
- allLow: 'सभी कम',
+ allLow: 'सब कम',
connectingToServer: 'सर्वर से कनेक्ट हो रहा है...',
closePane: 'पैन बंद करें',
yes: 'हाँ',
@@ -61,17 +61,33 @@ const hi: Translations = {
exportLabel: 'निर्यात',
exporting: 'निर्यात हो रहा है...',
exportToExcel: 'Excel में निर्यात करें',
- exportReady: 'निर्यात तैयार है. डाउनलोड शुरू होना चाहिए.',
+ exportReady: 'निर्यात तैयार है. आपका डाउनलोड शुरू हो जाना चाहिए.',
exportFailed: 'निर्यात विफल रहा.',
- exportTimedOut: 'निर्यात का समय समाप्त हो गया. फिर कोशिश करें.',
- exportUnavailable: 'मैप अभी लोड हो रहा है. थोड़ी देर में फिर कोशिश करें.',
+ exportTimedOut: 'निर्यात की समय सीमा समाप्त हो गई. फिर कोशिश करें.',
+ exportUnavailable: 'मानचित्र अभी लोड हो रहा है. थोड़ी देर में फिर कोशिश करें.',
exportEmpty: 'निर्यात पूरा हुआ, लेकिन फ़ाइल खाली है.',
openMenu: 'मेनू खोलें',
closeMenu: 'मेनू बंद करें',
},
+ export: {
+ title: 'निर्यात',
+ modeFilters: 'फ़िल्टर से मेल खाते पोस्टकोड',
+ modeFiltersHint:
+ 'मानचित्र पर दिखने वाले उन सभी पोस्टकोड का निर्यात करें जो आपके मौजूदा फ़िल्टर से मेल खाते हैं.',
+ modeList: 'पोस्टकोड की सूची',
+ modeListHint:
+ 'अपने पोस्टकोड एक-एक करके जोड़ें — स्पेसिंग और अक्षरों का रूप अपने आप ठीक हो जाएगा.',
+ listLabel: 'पोस्टकोड',
+ listPlaceholder: 'जैसे SW1A 1AA',
+ addRow: 'पोस्टकोड जोड़ें',
+ removeRow: 'पोस्टकोड हटाएँ',
+ listCount: '{{count}} पोस्टकोड',
+ listCount_other: '{{count}} पोस्टकोड',
+ },
+
userMenu: {
- fullAccess: 'पूर्ण एक्सेस',
+ fullAccess: 'पूरी पहुँच',
demo: 'डेमो',
themeLight: 'थीम: हल्की',
themeDark: 'थीम: गहरी',
@@ -81,27 +97,27 @@ const hi: Translations = {
mobileMenu: {
menu: 'मेनू',
- home: 'होम',
+ home: 'मुख्य पृष्ठ',
},
seo: {
- breadcrumb: 'ब्रेडक्रम्ब',
- reviewDataSources: 'डेटा स्रोत देखें',
+ breadcrumb: 'नेविगेशन पथ',
+ reviewDataSources: 'डेटा स्रोतों की समीक्षा करें',
whatYouCanCompare: 'आप क्या तुलना कर सकते हैं',
whatYouCanCompareDesc:
- 'हर पेज असली शॉर्टलिस्टिंग काम के लिए बना है: असंभव जगहें हटाना, बचे हुए पोस्टकोड की तुलना करना और अगली जांच तय करना.',
+ 'हर पेज असली शॉर्टलिस्टिंग के काम पर केंद्रित है: अनुपयुक्त जगहें हटाना, बचे हुए पोस्टकोड की तुलना करना और अगली जांच तय करना.',
howToUseIt: 'इसे कैसे इस्तेमाल करें',
howToUseItDesc:
- 'लिस्टिंग पोर्टल खोलने या मकान देखने की बुकिंग करने से पहले पेज को उपयोगी बनाने के लिए ये वर्कफ़्लो इस्तेमाल करें.',
+ 'लिस्टिंग पोर्टल खोलने या मकान देखने की बुकिंग करने से पहले इन तरीकों से पेज को उपयोगी बनाएं.',
methodAndLimitations: 'तरीका और सीमाएं',
methodAndLimitationsDesc:
- 'डेटा तुलना और शॉर्टलिस्टिंग के लिए है. महत्वपूर्ण निर्णयों के लिए अब भी ताजा लिस्टिंग, पेशेवर जांच और स्थानीय सत्यापन जरूरी है.',
+ 'डेटा तुलना और शॉर्टलिस्टिंग के लिए है. महत्वपूर्ण निर्णयों के लिए फिर भी ताजा लिस्टिंग, पेशेवर जांच और सीधे स्थानीय सत्यापन की जरूरत होती है.',
questionsBuyersAsk: 'खरीदारों के सवाल',
relatedGuides: 'संबंधित गाइड',
- relatedGuidesDesc: 'कैनोनिकल आंतरिक लिंक से इंडेक्स किए गए सार्वजनिक पेजों पर आगे बढ़ें.',
+ relatedGuidesDesc: 'मानक आंतरिक लिंक से इंडेक्स किए गए सार्वजनिक पेजों पर आगे बढ़ें.',
frequentlyAskedQuestions: 'अक्सर पूछे जाने वाले सवाल',
relatedPages: 'संबंधित पेज',
- relatedPagesDesc: 'इन्हीं आंतरिक लिंक से उसी संपत्ति-खोज वर्कफ़्लो को दूसरे कोण से तुलना करें.',
+ relatedPagesDesc: 'इन आंतरिक लिंक से उसी संपत्ति-खोज प्रक्रिया को दूसरे कोण से देखें.',
pages: {
'Property price map': 'संपत्ति मूल्य मानचित्र',
'Compare property prices across every postcode in England':
@@ -109,108 +125,107 @@ const hi: Translations = {
'Property price map for England - Compare postcodes before viewing':
'इंग्लैंड के लिए संपत्ति मूल्य मानचित्र - देखने से पहले पोस्टकोड की तुलना करें',
'Compare sold prices, estimated current value, price per square metre and local context across English postcodes before searching listings.':
- 'लिस्टिंग खोजने से पहले बेची गई कीमतों, अनुमानित वर्तमान मूल्य, प्रति वर्ग मीटर कीमत और अंग्रेजी पोस्टकोड में स्थानीय संदर्भ की तुलना करें।',
+ 'लिस्टिंग खोजने से पहले इंग्लैंड के पोस्टकोडों में बेची गई कीमतों, अनुमानित मौजूदा कीमत, प्रति वर्ग मीटर कीमत और स्थानीय संदर्भ की तुलना करें।',
'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 बेची गई कीमतें, अनुमानित मौजूदा कीमत, प्रति वर्ग मीटर कीमत, संपत्ति का प्रकार, फर्श क्षेत्रफल, स्वामित्व प्रकार और स्थानीय संदर्भ दिखाता है, ताकि खरीदार लिस्टिंग पोर्टल खोलने से पहले व्यावहारिक खोज क्षेत्र पहचान सकें।',
'Screen historical sale prices and current-value estimates by postcode.':
- 'पोस्टकोड द्वारा ऐतिहासिक बिक्री मूल्य और वर्तमान-मूल्य अनुमान स्क्रीन करें।',
+ 'पोस्टकोड के हिसाब से ऐतिहासिक बिक्री कीमतें और मौजूदा कीमत के अनुमान जांचें।',
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
'मूल्य की तुलना आवागमन, स्कूल, ब्रॉडबैंड, अपराध, शोर और सुविधाओं से करें।',
'Build a shortlist before spending weekends on 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.':
- 'अधिकतम कीमत और संपत्ति के प्रकार से शुरू करें, फिर प्रति वर्ग मीटर कीमत या अनुमानित वर्तमान कीमत के आधार पर मानचित्र को रंग दें। इससे उन क्षेत्रों को उजागर करने में मदद मिलती है जहां समान घरों का ऐतिहासिक रूप से पहुंच के भीतर कारोबार होता रहा है, तब भी जब आज कोई लाइव लिस्टिंग नहीं है।',
+ 'अधिकतम कीमत और संपत्ति के प्रकार से शुरू करें, फिर प्रति वर्ग मीटर कीमत या अनुमानित मौजूदा कीमत के आधार पर मानचित्र को रंगें। इससे वे क्षेत्र सामने आते हैं जहां समान घर पहले आपकी पहुंच वाली कीमतों पर बिके हैं, भले ही आज वहां कोई लाइव लिस्टिंग न हो।',
'Filter by last known sale price, estimated current value, property type, tenure, and floor area.':
- 'अंतिम ज्ञात बिक्री मूल्य, अनुमानित वर्तमान मूल्य, संपत्ति का प्रकार, कार्यकाल और फर्श क्षेत्र के आधार पर फ़िल्टर करें।',
+ 'अंतिम ज्ञात बिक्री कीमत, अनुमानित मौजूदा कीमत, संपत्ति का प्रकार, स्वामित्व प्रकार और फर्श क्षेत्रफल के आधार पर फ़िल्टर करें।',
'Compare nearby postcodes using the same criteria instead of relying on area reputation.':
'क्षेत्र की प्रतिष्ठा पर निर्भर रहने के बजाय समान मानदंड का उपयोग करके आस-पास के पोस्टकोड की तुलना करें।',
'Use the results as a shortlist for listing alerts, local research, and viewings.':
- 'अलर्ट, स्थानीय शोध और देखने की सूची के लिए शॉर्टलिस्ट के रूप में परिणामों का उपयोग करें।',
+ 'लिस्टिंग अलर्ट, स्थानीय शोध और मकान देखने की योजना के लिए परिणामों को शॉर्टलिस्ट की तरह इस्तेमाल करें।',
'Separate cheap from 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 isn’t automatically treated as the best option.':
- 'कम कीमत छोटे घरों, कमजोर परिवहन, अधिक शोर या कम स्थानीय सेवाओं को प्रतिबिंबित कर सकती है। मानचित्र उन ट्रेड-ऑफ़ को दृश्यमान रखता है इसलिए सबसे सस्ते पोस्टकोड को स्वचालित रूप से सर्वोत्तम विकल्प के रूप में नहीं माना जाता है।',
+ 'कम कीमत छोटे घरों, कमजोर परिवहन, अधिक शोर या कम स्थानीय सेवाओं की ओर इशारा कर सकती है। मानचित्र ये समझौते सामने रखता है, इसलिए सबसे सस्ता पोस्टकोड अपने आप सबसे अच्छा विकल्प नहीं मान लिया जाता।',
'Start from area value, not 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': 'वास्तविक बाधाओं के साथ-साथ कीमतों का उपयोग करें',
'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 यात्रा के समय, स्कूल की गुणवत्ता, संपत्ति के आकार, ऊर्जा प्रदर्शन, स्थानीय वातावरण और सेवाओं के साथ मूल्य फ़िल्टर को जोड़ता है ताकि आपकी शॉर्टलिस्ट यह दर्शाए कि आप वास्तव में कैसे रहना चाहते हैं।',
+ 'बजट अकेले शायद ही पर्याप्त होता है। Perfect Postcode कीमत फ़िल्टर को यात्रा समय, स्कूल गुणवत्ता, संपत्ति के आकार, ऊर्जा प्रदर्शन, स्थानीय वातावरण और सेवाओं से जोड़ता है, ताकि आपकी शॉर्टलिस्ट आपके रहने के असली तरीके को दिखाए।',
'What the price data is for': 'मूल्य डेटा किस लिए है',
'Use the map to compare areas and spot search candidates. It isn’t a valuation, mortgage decision, survey, legal search, or 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.':
- 'एक बार जब कोई पोस्टकोड आशाजनक लगे, तो निर्णय लेने से पहले वर्तमान लिस्टिंग, बिक्री-मूल्य तुलनीय, एजेंट विवरण, बाढ़ खोज, कानूनी पैक, सर्वेक्षण और स्थानीय प्राधिकारी जानकारी की जांच करें।',
+ 'जब कोई पोस्टकोड अच्छा लगे, तो निर्णय लेने से पहले मौजूदा लिस्टिंग, मिलती-जुलती बिक्री कीमतें, एजेंट विवरण, बाढ़ खोज, कानूनी कागजात, सर्वेक्षण और स्थानीय प्राधिकरण की जानकारी जांचें।',
'Is this a replacement for Rightmove or Zoopla?':
'क्या यह राइटमूव या ज़ूप्ला का प्रतिस्थापन है?',
'No. Use it before and alongside listing portals. Perfect Postcode helps decide where to look; listing portals show what’s currently for sale.':
- 'नहीं, इसे लिस्टिंग पोर्टल से पहले और साथ में उपयोग करें। Perfect Postcode यह तय करने में मदद करता है कि कहां देखना है; लिस्टिंग पोर्टल दिखाते हैं कि वर्तमान में बिक्री के लिए क्या है।',
+ 'नहीं. इसे लिस्टिंग पोर्टल से पहले और उनके साथ इस्तेमाल करें। Perfect Postcode तय करने में मदद करता है कि कहां देखना है; लिस्टिंग पोर्टल दिखाते हैं कि अभी बिक्री के लिए क्या है।',
'Can I compare price with schools or commute time?':
'क्या मैं कीमत की तुलना स्कूलों या आवागमन के समय से कर सकता हूँ?',
'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?': 'क्या मानचित्र पूरे ब्रिटेन को कवर करता है?',
'The current product focuses on England because several core property and postcode datasets are England-specific.':
'वर्तमान उत्पाद इंग्लैंड पर केंद्रित है क्योंकि कई मुख्य संपत्ति और पोस्टकोड डेटासेट इंग्लैंड-विशिष्ट हैं।',
'Birmingham property search guide': 'बर्मिंघम संपत्ति खोज गाइड',
'A worked example for balancing price, commute, and family trade-offs.':
- 'मूल्य, आवागमन और पारिवारिक व्यापार-बंद को संतुलित करने के लिए एक कारगर उदाहरण।',
+ 'कीमत, आवागमन और परिवार से जुड़े समझौतों को संतुलित करने का एक उदाहरण।',
'Data sources and coverage': 'डेटा स्रोत और कवरेज',
'See which datasets sit behind the postcode filters and where they have limits.':
- 'देखें कि कौन से डेटासेट पोस्टकोड फ़िल्टर के पीछे बैठते हैं और उनकी सीमाएँ कहाँ हैं।',
+ 'देखें कि पोस्टकोड फ़िल्टर के पीछे कौन से डेटासेट हैं और उनकी सीमाएँ कहाँ हैं।',
Methodology: 'क्रियाविधि',
'Understand how the map is intended to support shortlisting, not replace due diligence.':
- 'समझें कि मानचित्र का उद्देश्य शॉर्टलिस्टिंग का समर्थन करना है, न कि उचित परिश्रम को प्रतिस्थापित करना।',
- 'Postcode checker': 'पोस्टकोड चेकर',
+ 'समझें कि मानचित्र शॉर्टलिस्टिंग में मदद करने के लिए है, जरूरी जांच की जगह लेने के लिए नहीं।',
+ 'Postcode checker': 'पोस्टकोड जांचक',
'Check one postcode before you spend time on a viewing.':
- 'देखने में समय बर्बाद करने से पहले एक पोस्टकोड जांच लें।',
- 'Explore the property map': 'संपत्ति मानचित्र का अन्वेषण करें',
+ 'मकान देखने में समय लगाने से पहले एक पोस्टकोड जांच लें।',
+ 'Explore the property map': 'संपत्ति मानचित्र देखें',
'Postcode property search': 'पोस्टकोड संपत्ति खोज',
'Find postcodes that match your property search criteria':
- 'ऐसे पोस्टकोड ढूंढें जो आपकी संपत्ति खोज मानदंडों से मेल खाते हों',
+ 'ऐसे पोस्टकोड खोजें जो आपकी संपत्ति खोज की शर्तों से मेल खाते हों',
'Postcode property search - Find areas that match your criteria':
- 'पोस्टकोड संपत्ति खोज - ऐसे क्षेत्र खोजें जो आपके मानदंडों से मेल खाते हों',
+ 'पोस्टकोड संपत्ति खोज - आपकी शर्तों से मेल खाते क्षेत्र खोजें',
'Search every postcode by budget, property type, floor area, tenure, commute, schools, crime, broadband, noise, parks and local amenities.':
- 'प्रत्येक पोस्टकोड को बजट, संपत्ति के प्रकार, फर्श क्षेत्र, कार्यकाल, आवागमन, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं के आधार पर खोजें।',
+ 'हर पोस्टकोड को बजट, संपत्ति के प्रकार, फर्श क्षेत्रफल, स्वामित्व प्रकार, आवागमन, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं के आधार पर खोजें।',
'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.':
- 'एक-एक करके क्षेत्रों की जाँच करने के बजाय प्रत्येक पोस्टकोड को बजट, संपत्ति के प्रकार, आकार, कार्यकाल, आवागमन, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं के आधार पर खोजें।',
+ 'एक-एक क्षेत्र जांचने के बजाय हर पोस्टकोड को बजट, संपत्ति के प्रकार, आकार, स्वामित्व प्रकार, आवागमन, स्कूल, अपराध, ब्रॉडबैंड, शोर, पार्क और स्थानीय सुविधाओं के आधार पर खोजें।',
'Filter England-wide postcode data from one map.':
- 'एक मानचित्र से इंग्लैंड-व्यापी पोस्टकोड डेटा फ़िल्टर करें।',
+ 'एक ही मानचित्र से पूरे इंग्लैंड का पोस्टकोड डेटा फ़िल्टर करें।',
'Shortlist unfamiliar areas with comparable evidence.':
- 'तुलनीय साक्ष्यों के साथ अपरिचित क्षेत्रों को संक्षिप्त करें।',
+ 'तुलनीय प्रमाण के साथ अनजान क्षेत्रों को शॉर्टलिस्ट करें।',
'Save and share search areas before booking viewings.':
- 'बुकिंग देखने से पहले खोज क्षेत्रों को सहेजें और साझा करें।',
- 'Turn a broad brief into postcode candidates':
- 'एक व्यापक संक्षिप्त विवरण को पोस्टकोड उम्मीदवारों में बदलें',
+ 'मकान देखने की बुकिंग से पहले खोज क्षेत्र सहेजें और साझा करें।',
+ 'Turn a broad brief into 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': 'एक समय में एक बाधा में ढील दें',
'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': 'अस्पष्ट क्षेत्रों को विशिष्ट पोस्टकोड में बदलें',
'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': 'ट्रेड-ऑफ़ को दृश्यमान रखें',
+ 'व्यापक शहर या बरो की खोजें सड़कों के बीच बड़े अंतर छिपा देती हैं। Perfect Postcode आपको सामान्य क्षेत्र से उन पोस्टकोड तक ले जाता है जो आपकी अनिवार्य शर्तों को पूरा करते हैं।',
+ 'Keep trade-offs visible': 'समझौते साफ दिखाई दें',
'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.':
- 'जब बहुत अधिक या बहुत कम मिलान हों, तो एक समय में एक बाधा को समायोजित करें और देखें कि कौन से पोस्टकोड फिर से दिखाई देते हैं। यह अनुमान पर भरोसा करने के बजाय समझौतों को स्पष्ट करता है।',
+ 'जब मिलान बहुत ज्यादा या बहुत कम हों, तो एक बार में एक शर्त बदलें और देखें कि कौन से पोस्टकोड फिर दिखाई देते हैं। इससे अंदाजे के बजाय समझौते साफ हो जाते हैं।',
'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.':
- 'पास के दो पोस्टकोड स्कूलों, सड़क के शोर, परिवहन पहुंच, संपत्ति मिश्रण और कीमत पर भिन्न हो सकते हैं। पोस्टकोड स्तर पर तुलना करने से पूरे शहर को एक समान बाज़ार मानने की संभावना कम हो जाती है।',
+ 'पास के दो पोस्टकोड स्कूलों, सड़क के शोर, परिवहन पहुंच, संपत्ति प्रकारों और कीमत में अलग हो सकते हैं। पोस्टकोड स्तर पर तुलना करने से पूरे शहर को एक जैसा बाजार मानने की गलती कम होती है।',
'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?': 'क्या मैं पोस्टकोड संपत्ति खोज सहेज सकता हूँ?',
'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?': 'क्या मैं क्षेत्र जाने बिना खोज कर सकता हूँ?',
'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?': 'क्या परिणाम लाइव संपत्ति सूची हैं?',
'No. The tool compares postcode data and historical/contextual property signals. You still need listing portals for current availability.':
- 'नहीं, टूल पोस्टकोड डेटा और ऐतिहासिक/प्रासंगिक संपत्ति संकेतों की तुलना करता है। वर्तमान उपलब्धता के लिए आपको अभी भी लिस्टिंग पोर्टल की आवश्यकता है।',
+ 'नहीं. यह साधन पोस्टकोड डेटा और ऐतिहासिक/संदर्भ संपत्ति संकेतों की तुलना करता है। मौजूदा उपलब्धता के लिए आपको अब भी लिस्टिंग पोर्टल देखने होंगे।',
'Manchester property search guide': 'मैनचेस्टर संपत्ति खोज गाइड',
'A regional guide for narrowing a broad search around Greater Manchester.':
'ग्रेटर मैनचेस्टर के आसपास व्यापक खोज को सीमित करने के लिए एक क्षेत्रीय मार्गदर्शिका।',
@@ -219,113 +234,112 @@ const hi: Translations = {
'Search for places to live by commute time':
'आवागमन के समय के अनुसार रहने के लिए स्थान खोजें',
'Commute property search - Find places to live by travel time':
- 'यात्रा संपत्ति की खोज - यात्रा के समय के अनुसार रहने के लिए स्थान खोजें',
+ 'आवागमन आधारित संपत्ति खोज - यात्रा समय से रहने की जगहें खोजें',
'Filter postcodes by commute time, then compare price, schools, safety, broadband, road noise, parks and property data on one map.':
'आवागमन के समय के अनुसार पोस्टकोड फ़िल्टर करें, फिर एक मानचित्र पर कीमत, स्कूल, सुरक्षा, ब्रॉडबैंड, सड़क शोर, पार्क और संपत्ति डेटा की तुलना करें।',
'Filter postcodes by modelled car, cycling, walking, and public transport travel times, then layer on property price, schools, crime, broadband, noise, and local amenities.':
- 'मॉडल की गई कार, साइकिल चलाना, पैदल चलना और सार्वजनिक परिवहन यात्रा के समय के आधार पर पोस्टकोड फ़िल्टर करें, फिर संपत्ति की कीमत, स्कूल, अपराध, ब्रॉडबैंड, शोर और स्थानीय सुविधाओं पर परत लगाएं।',
+ 'कार, साइकिल, पैदल और सार्वजनिक परिवहन के मॉडल किए गए यात्रा समय से पोस्टकोड फ़िल्टर करें, फिर संपत्ति की कीमत, स्कूल, अपराध, ब्रॉडबैंड, शोर और स्थानीय सुविधाएं जोड़ें।',
'Compare reachable postcodes by realistic travel-time bands.':
- 'यथार्थवादी यात्रा-समय बैंड द्वारा पहुंच योग्य पोस्टकोड की तुलना करें।',
+ 'व्यावहारिक यात्रा-समय बैंड के अनुसार पहुंच वाले पोस्टकोड की तुलना करें।',
'Search by destination first, then filter for property and neighbourhood fit.':
- 'पहले गंतव्य के आधार पर खोजें, फिर संपत्ति और पड़ोस के अनुसार फ़िल्टर करें।',
+ 'पहले गंतव्य से खोजें, फिर संपत्ति और पड़ोस की उपयुक्तता से फ़िल्टर करें।',
'Avoid areas that look close on a map but fail the daily journey.':
- 'उन क्षेत्रों से बचें जो मानचित्र पर नज़दीक दिखते हैं लेकिन दैनिक यात्रा में विफल होते हैं।',
+ 'उन क्षेत्रों से बचें जो मानचित्र पर पास लगते हैं लेकिन रोज की यात्रा में काम नहीं आते।',
'Start with the destination that matters': 'उस गंतव्य से शुरुआत करें जो मायने रखता है',
'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 doesn’t work.':
- 'आवागमन गंतव्य, परिवहन मोड और समय सीमा चुनें, फिर संपत्ति फ़िल्टर जोड़ें। यदि दैनिक यात्रा काम नहीं करती है तो यह सस्ते दिखने वाले क्षेत्र को शॉर्टलिस्ट तक पहुंचने से रोकता है।',
+ 'आवागमन का गंतव्य, यात्रा का तरीका और समय सीमा चुनें, फिर संपत्ति फ़िल्टर जोड़ें। अगर रोज की यात्रा काम नहीं आती, तो सस्ता दिखने वाला क्षेत्र शॉर्टलिस्ट में नहीं पहुंचेगा।',
'Compare the commute against the rest of daily life':
- 'दैनिक जीवन के बाकी हिस्सों से आवागमन की तुलना करें',
+ 'आवागमन की तुलना रोजमर्रा की बाकी जरूरतों से करें',
'A fast commute isn’t enough if the property size, school context, safety threshold, broadband, or road-noise exposure don’t fit. The map keeps those signals side by side.':
- 'यदि संपत्ति का आकार, स्कूल का संदर्भ, सुरक्षा सीमा, ब्रॉडबैंड, या सड़क-शोर जोखिम फिट नहीं बैठता है तो तेज़ आवागमन पर्याप्त नहीं है। मानचित्र उन संकेतों को एक साथ रखता है।',
+ 'अगर संपत्ति का आकार, स्कूल संदर्भ, सुरक्षा सीमा, ब्रॉडबैंड या सड़क-शोर का असर मेल नहीं खाता, तो तेज आवागमन काफी नहीं है। मानचित्र इन संकेतों को साथ-साथ रखता है।',
'Commute from postcodes, not just place names':
- 'केवल स्थान के नाम से नहीं, बल्कि पोस्टकोड से यात्रा करें',
+ 'सिर्फ जगह के नाम से नहीं, पोस्टकोड से आवागमन देखें',
'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.':
- 'एक ही शहर की दो सड़कों पर स्टेशन पहुंच, सड़क मार्ग और सार्वजनिक परिवहन विकल्प बहुत भिन्न हो सकते हैं। पोस्टकोड-स्तरीय यात्रा-समय फ़िल्टरिंग उस अंतर को दृश्यमान रखता है।',
+ 'एक ही शहर की दो सड़कों में स्टेशन तक पहुंच, सड़क मार्ग और सार्वजनिक परिवहन विकल्प बहुत अलग हो सकते हैं। पोस्टकोड-स्तरीय यात्रा-समय फ़िल्टरिंग यह अंतर सामने रखती है।',
'Balance journey time with the rest of the move':
- 'यात्रा के समय को शेष चाल के साथ संतुलित करें',
+ 'यात्रा समय को घर बदलने की बाकी जरूरतों से संतुलित करें',
'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.':
- 'तेज़ आवागमन तभी सहायक होता है जब क्षेत्र आपके बजट, आवास आवश्यकताओं, स्कूल की प्राथमिकताओं, सुरक्षा सीमा, ब्रॉडबैंड आवश्यकता और सड़क शोर के प्रति सहनशीलता के अनुरूप हो।',
+ 'तेज आवागमन तभी मदद करता है जब क्षेत्र आपके बजट, आवास जरूरतों, स्कूल प्राथमिकताओं, सुरक्षा सीमा, ब्रॉडबैंड जरूरत और सड़क शोर की सहनशीलता से भी मेल खाता हो।',
'How travel-time filters should be interpreted':
'यात्रा-समय फ़िल्टर की व्याख्या कैसे की जानी चाहिए',
'Travel-time modelling is useful for comparing areas consistently. Before committing, check current timetables, disruption patterns, parking, cycling conditions, and walking routes.':
- 'यात्रा-समय मॉडलिंग लगातार क्षेत्रों की तुलना करने के लिए उपयोगी है। प्रतिबद्ध होने से पहले, वर्तमान समय सारिणी, व्यवधान पैटर्न, पार्किंग, साइकिल चलाने की स्थिति और पैदल चलने के मार्गों की जांच करें।',
+ 'यात्रा-समय मॉडलिंग क्षेत्रों की लगातार तुलना के लिए उपयोगी है। निर्णय लेने से पहले मौजूदा समय-सारिणी, व्यवधान पैटर्न, पार्किंग, साइकिल की स्थिति और पैदल रास्ते जांचें।',
'Why commute filters are combined with property data':
'आवागमन फ़िल्टर को संपत्ति डेटा के साथ क्यों जोड़ा जाता है?',
'Commute search is most useful when it removes impossible areas while still showing whether the remaining options are affordable and liveable.':
- 'यात्रा खोज तब सबसे उपयोगी होती है जब यह असंभव क्षेत्रों को हटा देती है और साथ ही यह भी दिखाती है कि क्या शेष विकल्प किफायती और रहने योग्य हैं।',
+ 'आवागमन खोज तब सबसे उपयोगी होती है जब यह अनुपयुक्त क्षेत्रों को हटाती है और साथ ही दिखाती है कि बचे विकल्प किफायती और रहने लायक हैं या नहीं।',
'Can I compare car, cycling, walking, and public transport?':
'क्या मैं कार, साइकिल चलाना, पैदल चलना और सार्वजनिक परिवहन की तुलना कर सकता हूँ?',
'The product supports multiple travel modes where precomputed destination data is available.':
- 'उत्पाद कई यात्रा मोड का समर्थन करता है जहां पूर्व-गणना गंतव्य डेटा उपलब्ध है।',
+ 'जहां पहले से गणना किया गया गंतव्य डेटा उपलब्ध है, वहां उत्पाद कई यात्रा तरीकों का समर्थन करता है।',
'Are travel times exact?': 'क्या यात्रा का समय सटीक है?',
'No. Treat them as a consistent comparison model, then verify the real route before making viewing or purchase decisions.':
- 'नहीं, उन्हें एक सुसंगत तुलना मॉडल के रूप में मानें, फिर देखने या खरीदारी का निर्णय लेने से पहले वास्तविक मार्ग को सत्यापित करें।',
+ 'नहीं. इन्हें तुलना के लिए एक समान मॉडल मानें, फिर मकान देखने या खरीद का निर्णय लेने से पहले असली मार्ग की पुष्टि करें।',
'Can I combine commute filters with schools and price?':
'क्या मैं स्कूलों और कीमत के साथ आवागमन फ़िल्टर जोड़ सकता हूँ?',
'Yes. The commute filter can be layered with property price, size, schools, broadband, crime, amenities, and environmental signals.':
- 'हाँ। आवागमन फ़िल्टर को संपत्ति की कीमत, आकार, स्कूल, ब्रॉडबैंड, अपराध, सुविधाओं और पर्यावरण संकेतों के साथ स्तरित किया जा सकता है।',
+ 'हाँ। आवागमन फ़िल्टर को संपत्ति की कीमत, आकार, स्कूल, ब्रॉडबैंड, अपराध, सुविधाओं और पर्यावरण संकेतों के साथ जोड़ा जा सकता है।',
'Bristol property search guide': 'ब्रिस्टल संपत्ति खोज गाइड',
'A worked example for balancing city access, price, and local context.':
'शहर की पहुंच, कीमत और स्थानीय संदर्भ को संतुलित करने के लिए एक कारगर उदाहरण।',
'Search by commute time': 'आवागमन समय के आधार पर खोजें',
'Schools and property search': 'स्कूल और संपत्ति खोज',
'Find property search areas with schools and family trade-offs in view':
- 'स्कूलों और पारिवारिक लेन-देन को ध्यान में रखते हुए संपत्ति खोज क्षेत्र खोजें',
+ 'स्कूलों और परिवार से जुड़े समझौतों को ध्यान में रखकर संपत्ति खोज क्षेत्र खोजें',
'School property search - Compare postcodes for family moves':
'स्कूल संपत्ति खोज - पारिवारिक स्थानांतरण के लिए पोस्टकोड की तुलना करें',
'Compare nearby schools, property size, prices, parks, safety, commute and local amenities before building a viewing shortlist.':
'देखने के लिए शॉर्टलिस्ट बनाने से पहले आस-पास के स्कूलों, संपत्ति के आकार, कीमतों, पार्कों, सुरक्षा, आवागमन और स्थानीय सुविधाओं की तुलना करें।',
'Compare nearby Ofsted ratings, education context, property size, budget, safety, parks, commute, and local amenities before narrowing your viewing shortlist.':
- 'अपनी देखने की सूची को सीमित करने से पहले आस-पास की ऑफस्टेड रेटिंग, शिक्षा संदर्भ, संपत्ति का आकार, बजट, सुरक्षा, पार्क, आवागमन और स्थानीय सुविधाओं की तुलना करें।',
+ 'मकान देखने की शॉर्टलिस्ट घटाने से पहले आस-पास की Ofsted रेटिंग, शिक्षा संदर्भ, संपत्ति का आकार, बजट, सुरक्षा, पार्क, आवागमन और स्थानीय सुविधाओं की तुलना करें।',
'Filter for nearby school quality alongside housing requirements.':
'आवास आवश्यकताओं के साथ-साथ नजदीकी स्कूल की गुणवत्ता के लिए फ़िल्टर करें।',
'Compare family-friendly trade-offs across unfamiliar postcodes.':
- 'अपरिचित पोस्टकोड में परिवार-अनुकूल व्यापार-बंदों की तुलना करें।',
+ 'अनजान पोस्टकोडों में परिवार-अनुकूल समझौतों की तुलना करें।',
'Use the map as a shortlist tool before checking admissions and catchments.':
- 'प्रवेश और कैचमेंट की जांच करने से पहले मानचित्र को शॉर्टलिस्ट टूल के रूप में उपयोग करें।',
+ 'दाखिले और प्रवेश क्षेत्रों की जांच से पहले मानचित्र को शॉर्टलिस्ट बनाने के साधन की तरह इस्तेमाल करें।',
'Use school context without ignoring the home':
'घर को नज़रअंदाज़ किए बिना स्कूल के संदर्भ का उपयोग करें',
'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': 'निर्णय लेने से पहले प्रवेश सत्यापित करें',
'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': 'स्कूल की गुणवत्ता शॉर्टलिस्ट का एक हिस्सा है',
'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 आपको आस-पास के स्कूल डेटा की तुलना उन व्यावहारिक शर्तों से करने में मदद करता है जो परिवार के स्थानांतरण को प्रभावित करती हैं: जगह, कीमत, आवागमन, पार्क, सुरक्षा और स्थानीय सेवाएं।',
+ 'Check catchments before making decisions': 'निर्णय लेने से पहले प्रवेश क्षेत्र जांचें',
'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.':
- 'प्रवेश नियम और जलग्रहण सीमाएँ बदल सकती हैं। आशाजनक क्षेत्रों को खोजने के लिए पोस्टकोड-स्तरीय स्कूल डेटा का उपयोग करें, फिर स्कूल या स्थानीय प्राधिकरण के साथ वर्तमान प्रवेश विवरण सत्यापित करें।',
- 'How to treat school filters': 'स्कूल फ़िल्टर का इलाज कैसे करें',
+ 'दाखिला नियम और प्रवेश क्षेत्र बदल सकते हैं। अच्छे लगने वाले क्षेत्र खोजने के लिए पोस्टकोड-स्तरीय स्कूल डेटा का उपयोग करें, फिर स्कूल या स्थानीय प्राधिकरण से मौजूदा दाखिला विवरण सत्यापित करें।',
+ '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': 'तुलना करने के लिए पारिवारिक व्यापार-बंद',
+ 'शोध को सीमित करने के लिए स्कूल फ़िल्टर का उपयोग करें, प्रवेश पात्रता मानने के लिए नहीं। रेटिंग, दूरी, दाखिला मानदंड और स्कूल क्षमता सभी मौजूदा आधिकारिक स्रोतों से जांचें।',
+ 'Family trade-offs to compare': 'तुलना करने लायक पारिवारिक समझौते',
'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?': 'क्या यह स्कूल कैचमेंट गारंटी दिखाता है?',
'No. It helps identify promising areas, but catchments and admissions must be verified with the school or local authority.':
- 'नहीं, यह आशाजनक क्षेत्रों की पहचान करने में मदद करता है, लेकिन कैचमेंट और प्रवेश को स्कूल या स्थानीय प्राधिकरण से सत्यापित किया जाना चाहिए।',
+ 'नहीं. यह अच्छे लगने वाले क्षेत्रों की पहचान में मदद करता है, लेकिन प्रवेश क्षेत्र और दाखिला स्कूल या स्थानीय प्राधिकरण से सत्यापित करने होंगे।',
'Can I combine school filters with parks and safety?':
'क्या मैं स्कूल फ़िल्टर को पार्क और सुरक्षा के साथ जोड़ सकता हूँ?',
'Yes. School-aware search can be combined with crime, parks, commute, price, property size, and local services.':
- 'हाँ। स्कूल-जागरूक खोज को अपराध, पार्क, आवागमन, कीमत, संपत्ति का आकार और स्थानीय सेवाओं के साथ जोड़ा जा सकता है।',
- 'Is Ofsted the only school signal?': 'क्या ऑफस्टेड एकमात्र स्कूल सिग्नल है?',
+ 'हाँ। स्कूल-केंद्रित खोज को अपराध, पार्क, आवागमन, कीमत, संपत्ति के आकार और स्थानीय सेवाओं के साथ जोड़ा जा सकता है।',
+ '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.':
- 'किसी एक अंक से किसी चाल का निर्णय नहीं होना चाहिए। शुरुआती बिंदु के रूप में मानचित्र का उपयोग करें, फिर वर्तमान स्कूल जानकारी की विस्तार से समीक्षा करें।',
+ 'घर बदलने का निर्णय किसी एक अंक से नहीं होना चाहिए। मानचित्र को शुरुआती बिंदु की तरह इस्तेमाल करें, फिर मौजूदा स्कूल जानकारी विस्तार से देखें।',
'See where education, property, transport, and environment data comes from.':
'देखें कि शिक्षा, संपत्ति, परिवहन और पर्यावरण डेटा कहाँ से आता है।',
- 'Explore school-aware searches': 'स्कूल-जागरूक खोजों का अन्वेषण करें',
+ 'Explore school-aware searches': 'स्कूल-केंद्रित खोजें देखें',
'Check postcode data before you book a viewing':
'देखने की बुकिंग करने से पहले पोस्टकोड डेटा की जाँच करें',
'Postcode checker - Property, crime, broadband, noise and schools':
'पोस्टकोड चेकर - संपत्ति, अपराध, ब्रॉडबैंड, शोर और स्कूल',
'Check postcode-level property prices, EPC data, crime, broadband, road noise, schools, council tax, amenities and travel-time context.':
- 'पोस्टकोड-स्तरीय संपत्ति की कीमतें, ईपीसी डेटा, अपराध, ब्रॉडबैंड, सड़क शोर, स्कूल, परिषद कर, सुविधाएं और यात्रा-समय संदर्भ की जांच करें।',
+ 'पोस्टकोड-स्तरीय संपत्ति कीमतें, EPC डेटा, अपराध, ब्रॉडबैंड, सड़क शोर, स्कूल, काउंसिल टैक्स, सुविधाएं और यात्रा-समय संदर्भ जांचें।',
'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 संदर्भ, अपराध, ब्रॉडबैंड, सड़क शोर, स्थानीय सुविधाएं, स्कूल, वंचना, काउंसिल टैक्स और यात्रा-समय डेटा की समीक्षा करें।',
'Check multiple local signals before visiting a street.':
- 'किसी सड़क पर जाने से पहले कई स्थानीय सिग्नलों की जाँच करें।',
+ 'किसी सड़क पर जाने से पहले कई स्थानीय संकेत जांचें।',
'Use official and open datasets rather than reputation alone.':
'केवल प्रतिष्ठा के बजाय आधिकारिक और खुले डेटासेट का उपयोग करें।',
'Compare postcodes consistently across England.':
@@ -333,33 +347,33 @@ const hi: Translations = {
'Check the street before spending a viewing slot':
'देखने का स्लॉट खर्च करने से पहले सड़क की जाँच करें',
'Use the postcode checker to review price history, local context, amenities, schools, and environment signals before you commit time to visiting.':
- 'यात्रा के लिए समय निर्धारित करने से पहले मूल्य इतिहास, स्थानीय संदर्भ, सुविधाओं, स्कूलों और पर्यावरण संकेतों की समीक्षा करने के लिए पोस्टकोड चेकर का उपयोग करें।',
+ 'मकान देखने में समय लगाने से पहले कीमत इतिहास, स्थानीय संदर्भ, सुविधाएं, स्कूल और पर्यावरण संकेत देखने के लिए पोस्टकोड जांचक का उपयोग करें।',
'Compare neighbouring postcodes': 'पड़ोसी पोस्टकोड की तुलना करें',
'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': 'लिस्टिंग पोर्टल से पहले और साथ में उपयोगी',
'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': 'एक स्क्रीनिंग टूल, पेशेवर सलाह नहीं',
+ 'लिस्टिंग फ़ोटो आसपास की सड़क के बारे में शायद ही पर्याप्त बताती हैं। मकान देखने का समय देने से पहले Perfect Postcode आपको प्रमाण-आधारित पोस्टकोड जांच देता है।',
+ 'A screening tool, not 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': 'एक पोस्टकोड जांच क्या पकड़ सकती है',
+ 'डेटा शॉर्टलिस्टिंग और तुलना के लिए बनाया गया है। किसी भी खरीद के लिए अब भी मौजूदा लिस्टिंग जांच, कानूनी जांच, बाढ़ खोज, ऋणदाता की शर्तें और सर्वेक्षण निष्कर्ष जरूरी हैं।',
+ 'What a postcode check can catch': 'पोस्टकोड जांच क्या दिखा सकती है',
'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 can’t prove': 'पोस्टकोड जांच क्या साबित नहीं कर सकती',
'It can’t confirm the condition of a home, future development, legal title, lender requirements, or current street-level experience. Those still need direct checks.':
- 'यह घर की स्थिति, भविष्य के विकास, कानूनी स्वामित्व, ऋणदाता आवश्यकताओं या वर्तमान सड़क-स्तरीय अनुभव की पुष्टि नहीं कर सकता है। उन्हें अभी भी सीधी जांच की जरूरत है।',
+ 'यह घर की स्थिति, भविष्य के विकास, कानूनी स्वामित्व, ऋणदाता शर्तों या मौजूदा सड़क-स्तर अनुभव की पुष्टि नहीं कर सकती। इनके लिए अब भी सीधी जांच चाहिए।',
'Can I use the checker before a viewing?':
'क्या मैं देखने से पहले चेकर का उपयोग कर सकता हूँ?',
'Yes. That’s one of the main use cases: screen the postcode first, then decide whether the viewing is worth the time.':
- 'हाँ। यह मुख्य उपयोग मामलों में से एक है: पहले पोस्टकोड को स्क्रीन करें, फिर तय करें कि देखना समय के लायक है या नहीं।',
+ 'हाँ। यही इसका एक मुख्य उपयोग है: पहले पोस्टकोड जांचें, फिर तय करें कि मकान देखने जाना समय के लायक है या नहीं।',
'Does the checker include exact property condition?':
'क्या चेकर में संपत्ति की सटीक स्थिति शामिल है?',
'No. Property condition requires listing details, surveys, and direct inspection.':
'नहीं, संपत्ति की स्थिति के लिए लिस्टिंग विवरण, सर्वेक्षण और प्रत्यक्ष निरीक्षण की आवश्यकता होती है।',
'Can I compare multiple postcodes?': 'क्या मैं अनेक पोस्टकोड की तुलना कर सकता हूँ?',
'Yes. The map is designed for consistent comparison across postcodes.':
- 'हाँ। मानचित्र को सभी पोस्टकोडों में लगातार तुलना के लिए डिज़ाइन किया गया है।',
+ 'हाँ। मानचित्र पोस्टकोडों के बीच लगातार तुलना के लिए बनाया गया है।',
'Check postcodes on the map': 'मानचित्र पर पोस्टकोड जांचें',
'Regional guide': 'क्षेत्रीय मार्गदर्शक',
'How to compare Birmingham postcodes before a property search':
@@ -367,37 +381,37 @@ const hi: Translations = {
'Birmingham property search - Compare postcodes by price and commute':
'बर्मिंघम संपत्ति खोज - कीमत और आवागमन के आधार पर पोस्टकोड की तुलना करें',
'Use postcode-level data to compare Birmingham property prices, commute trade-offs, schools, crime, broadband and local amenities before viewings.':
- 'देखने से पहले बर्मिंघम संपत्ति की कीमतों, आवागमन व्यापार-बंद, स्कूलों, अपराध, ब्रॉडबैंड और स्थानीय सुविधाओं की तुलना करने के लिए पोस्टकोड-स्तरीय डेटा का उपयोग करें।',
+ 'मकान देखने से पहले बर्मिंघम की संपत्ति कीमतों, आवागमन से जुड़े समझौतों, स्कूलों, अपराध, ब्रॉडबैंड और स्थानीय सुविधाओं की तुलना के लिए पोस्टकोड-स्तरीय डेटा इस्तेमाल करें।',
'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': 'आवागमन गलियारों से शुरुआत करें',
'Choose the destination that matters, such as a workplace, station, university, or hospital, then compare reachable postcodes by transport mode and travel-time band.':
- 'वह गंतव्य चुनें जो महत्वपूर्ण हो, जैसे कार्यस्थल, स्टेशन, विश्वविद्यालय, या अस्पताल, फिर परिवहन मोड और यात्रा-समय बैंड द्वारा पहुंच योग्य पोस्टकोड की तुलना करें।',
+ 'वह गंतव्य चुनें जो मायने रखता है, जैसे कार्यस्थल, स्टेशन, विश्वविद्यालय या अस्पताल, फिर यात्रा के तरीके और यात्रा-समय बैंड से पहुंच वाले पोस्टकोड की तुलना करें।',
'Use commute time as a hard filter before judging price.':
- 'कीमत तय करने से पहले आवागमन के समय को एक कठिन फिल्टर के रूप में उपयोग करें।',
+ 'कीमत का आकलन करने से पहले आवागमन समय को अनिवार्य फ़िल्टर की तरह इस्तेमाल करें।',
'Compare public transport with car, cycling, or walking where available.':
'जहां उपलब्ध हो वहां सार्वजनिक परिवहन की तुलना कार, साइकिल या पैदल चलने से करें।',
'Check the route manually before booking viewings.':
- 'बुकिंग देखने से पहले मैन्युअल रूप से मार्ग की जाँच करें।',
+ 'मकान देखने की बुकिंग से पहले मार्ग खुद जांचें।',
'Compare price with property type': 'संपत्ति के प्रकार के साथ कीमत की तुलना करें',
'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.':
- 'यदि स्थानीय संपत्ति मिश्रण बदलता है तो औसत कीमतें अकेले भ्रामक हो सकती हैं। संपत्ति का प्रकार, कार्यकाल, फर्श क्षेत्र और मूल्य फ़िल्टर जोड़ें ताकि समान क्षेत्रों की तुलना निष्पक्ष रूप से की जा सके।',
+ 'अगर स्थानीय संपत्ति प्रकारों का मिश्रण बदलता है, तो सिर्फ मध्यिका कीमतें भटका सकती हैं। समान क्षेत्रों की निष्पक्ष तुलना के लिए संपत्ति का प्रकार, स्वामित्व प्रकार, फर्श क्षेत्रफल और कीमत फ़िल्टर जोड़ें।',
'Keep family and environment trade-offs visible':
- 'परिवार और पर्यावरण के बीच के संबंधों को स्पष्ट रखें',
+ 'परिवार और पर्यावरण से जुड़े समझौते साफ रखें',
'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.':
- 'संपत्ति फ़िल्टर के शीर्ष पर स्कूल संदर्भ, पार्क, सड़क शोर, ब्रॉडबैंड और अपराध सिग्नल परत करें। इससे यह तय करना आसान हो जाता है कि कौन से समझौते स्वीकार्य हैं।',
+ 'संपत्ति फ़िल्टर के साथ स्कूल संदर्भ, पार्क, सड़क शोर, ब्रॉडबैंड और अपराध संकेत जोड़ें। इससे तय करना आसान होता है कि कौन से समझौते स्वीकार्य हैं।',
'Can Perfect Postcode tell me the best area in Birmingham?':
'क्या Perfect Postcode मुझे बर्मिंघम में सबसे अच्छा क्षेत्र बता सकता है?',
'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.':
- 'कोई भी उपकरण प्रत्येक खरीदार के लिए सर्वोत्तम क्षेत्र का निर्णय नहीं कर सकता। यह आपकी अपनी बाधाओं के विरुद्ध पोस्टकोड की तुलना करने में मदद करता है ताकि आप एक बेहतर शॉर्टलिस्ट बना सकें।',
+ 'कोई भी साधन हर खरीदार के लिए सबसे अच्छा क्षेत्र तय नहीं कर सकता। यह आपकी अपनी शर्तों के आधार पर पोस्टकोड की तुलना करने में मदद करता है, ताकि आप बेहतर शॉर्टलिस्ट बना सकें।',
'Should I use this instead of local knowledge?':
'क्या मुझे स्थानीय ज्ञान के स्थान पर इसका उपयोग करना चाहिए?',
'No. Use it to find and compare candidates, then validate them with visits, local advice, listings, and official checks.':
- 'नहीं, इसका उपयोग उम्मीदवारों को खोजने और तुलना करने के लिए करें, फिर उन्हें विजिट, स्थानीय सलाह, लिस्टिंग और आधिकारिक जांच के साथ मान्य करें।',
+ 'नहीं. इसका उपयोग संभावित विकल्प खोजने और उनकी तुलना करने के लिए करें, फिर जाकर देखकर, स्थानीय सलाह, लिस्टिंग और आधिकारिक जांच से उनकी पुष्टि करें।',
'Compare price patterns before looking at live listings.':
'लाइव लिस्टिंग देखने से पहले मूल्य पैटर्न की तुलना करें।',
'Search by travel time and then layer on property requirements.':
- 'यात्रा के समय के आधार पर खोजें और फिर संपत्ति की आवश्यकताओं के आधार पर खोजें।',
+ 'यात्रा समय से खोजें और फिर संपत्ति की जरूरतें जोड़ें।',
'Understand how to interpret filters and limitations.':
'समझें कि फ़िल्टर और सीमाओं की व्याख्या कैसे करें।',
'Compare Birmingham postcodes': 'बर्मिंघम पोस्टकोड की तुलना करें',
@@ -408,98 +422,99 @@ const hi: Translations = {
'Compare Manchester-area postcodes by budget, commute, property type, schools, broadband, crime, noise and amenities before booking viewings.':
'बुकिंग देखने से पहले बजट, आवागमन, संपत्ति के प्रकार, स्कूल, ब्रॉडबैंड, अपराध, शोर और सुविधाओं के आधार पर मैनचेस्टर-क्षेत्र के पोस्टकोड की तुलना करें।',
'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 प्रत्येक पोस्टकोड को समान संपत्ति और दैनिक जीवन की बाधाओं के मुकाबले तुलनीय रखने में मदद करता है।',
+ 'मैनचेस्टर क्षेत्र की खोज शहर-केंद्र, उपनगर और आवागमन-आधारित विकल्पों तक फैल सकती है। Perfect Postcode हर पोस्टकोड को समान संपत्ति और रोजमर्रा की शर्तों पर तुलनीय रखता है।',
'Use travel time to define the real search area':
'वास्तविक खोज क्षेत्र को परिभाषित करने के लिए यात्रा समय का उपयोग करें',
'Start from the destinations that matter, then compare reachable postcodes rather than assuming every nearby place has the same practical journey.':
- 'उन गंतव्यों से शुरू करें जो मायने रखते हैं, फिर यह मानने के बजाय कि हर नजदीकी स्थान की व्यावहारिक यात्रा समान है, पहुंच योग्य पोस्टकोड की तुलना करें।',
+ 'जो गंतव्य मायने रखते हैं उनसे शुरू करें, फिर यह मानने के बजाय कि हर पास की जगह की यात्रा समान होगी, पहुंच वाले पोस्टकोड की तुलना करें।',
'Compare housing requirements before lifestyle preferences':
'जीवनशैली प्राथमिकताओं से पहले आवास आवश्यकताओं की तुलना करें',
'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': 'स्थानीय संदर्भ की लगातार जाँच करें',
'Use broadband, crime, road noise, parks, schools, and amenities as comparable signals. Then validate the strongest candidates with current local checks.':
- 'ब्रॉडबैंड, अपराध, सड़क शोर, पार्क, स्कूल और सुविधाओं को तुलनीय सिग्नल के रूप में उपयोग करें। फिर वर्तमान स्थानीय जांच के साथ सबसे मजबूत उम्मीदवारों को मान्य करें।',
+ 'ब्रॉडबैंड, अपराध, सड़क शोर, पार्क, स्कूल और सुविधाओं को तुलनीय संकेतों की तरह इस्तेमाल करें। फिर सबसे मजबूत विकल्पों की मौजूदा स्थानीय जांच से पुष्टि करें।',
'Can I compare Manchester suburbs with city-centre postcodes?':
'क्या मैं मैनचेस्टर उपनगरों की तुलना सिटी-सेंटर पोस्टकोड से कर सकता हूँ?',
'Yes. Use the same budget, property, commute, and local-context filters across both so trade-offs remain visible.':
- 'हाँ। दोनों में समान बजट, संपत्ति, आवागमन और स्थानीय-संदर्भ फ़िल्टर का उपयोग करें ताकि ट्रेड-ऑफ़ दिखाई देता रहे।',
- 'Does this include live listings?': 'क्या इसमें लाइव लिस्टिंग शामिल है?',
+ 'हाँ। दोनों में वही बजट, संपत्ति, आवागमन और स्थानीय-संदर्भ फ़िल्टर लगाएं, ताकि समझौते साफ दिखते रहें।',
+ 'Does this include live listings?': 'क्या इसमें मौजूदा लिस्टिंग शामिल हैं?',
'No. Use it to decide where to search, then use listing portals for current homes for sale.':
- 'नहीं, इसका उपयोग यह तय करने के लिए करें कि कहां खोजना है, फिर बिक्री के लिए वर्तमान घरों के लिए लिस्टिंग पोर्टल का उपयोग करें।',
+ 'नहीं. इसका उपयोग यह तय करने के लिए करें कि कहां खोज करनी है, फिर अभी बिक्री पर मौजूद घरों के लिए लिस्टिंग पोर्टल देखें।',
'Move from a broad search brief to specific postcode candidates.':
- 'व्यापक खोज संक्षिप्त से विशिष्ट पोस्टकोड उम्मीदवारों की ओर बढ़ें।',
+ 'व्यापक खोज जरूरतों से विशिष्ट संभावित पोस्टकोड तक जाएं।',
'Data sources': 'डेटा स्रोत',
'Review the datasets used for property and local-context comparison.':
'संपत्ति और स्थानीय-संदर्भ तुलना के लिए उपयोग किए गए डेटासेट की समीक्षा करें।',
'Check a single postcode before arranging a viewing.':
- 'देखने की व्यवस्था करने से पहले एक पोस्टकोड की जाँच करें।',
+ 'मकान देखने की व्यवस्था करने से पहले एक पोस्टकोड जांचें।',
'Compare Manchester postcodes': 'मैनचेस्टर पोस्टकोड की तुलना करें',
'How to compare Bristol postcodes before a property search':
'संपत्ति खोज से पहले ब्रिस्टल पोस्टकोड की तुलना कैसे करें',
'Bristol property search - Compare postcodes by commute and price':
- 'ब्रिस्टल संपत्ति खोज - यात्रा और कीमत के आधार पर पोस्टकोड की तुलना करें',
+ 'ब्रिस्टल संपत्ति खोज - आवागमन और कीमत से पोस्टकोड की तुलना करें',
'Compare Bristol postcodes by price, commute, property size, schools, broadband, crime, road noise, parks and amenities before viewings.':
- 'देखने से पहले कीमत, आवागमन, संपत्ति के आकार, स्कूल, ब्रॉडबैंड, अपराध, सड़क शोर, पार्क और सुविधाओं के आधार पर ब्रिस्टल पोस्टकोड की तुलना करें।',
+ 'मकान देखने से पहले कीमत, आवागमन, संपत्ति के आकार, स्कूल, ब्रॉडबैंड, अपराध, सड़क शोर, पार्क और सुविधाओं से ब्रिस्टल पोस्टकोड की तुलना करें।',
'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': 'आवागमन संबंधी बाधाओं को स्पष्ट करें',
'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.':
- 'यदि केंद्र, स्टेशन, अस्पताल, विश्वविद्यालय या बिजनेस पार्क तक पहुंच मायने रखती है, तो पहले यात्रा-समय फ़िल्टर का उपयोग करें और फिर संपत्ति डेटा द्वारा शेष पोस्टकोड की तुलना करें।',
- 'Compare value, not just headline price': 'मूल्य की तुलना करें, न कि केवल मुख्य मूल्य की',
+ 'अगर केंद्र, स्टेशन, अस्पताल, विश्वविद्यालय या बिजनेस पार्क तक पहुंच मायने रखती है, तो पहले यात्रा-समय फ़िल्टर लगाएं और फिर बचे पोस्टकोड की संपत्ति डेटा से तुलना करें।',
+ 'Compare value, not just headline price':
+ 'सिर्फ दिखती कीमत नहीं, वास्तविक मूल्य की तुलना करें',
'Use price, property type, and floor-area filters together. This helps distinguish lower-cost areas from areas that simply contain smaller or different homes.':
- 'मूल्य, संपत्ति प्रकार और फर्श-क्षेत्र फ़िल्टर का एक साथ उपयोग करें। इससे कम लागत वाले क्षेत्रों को उन क्षेत्रों से अलग करने में मदद मिलती है जिनमें छोटे या अलग-अलग घर होते हैं।',
+ 'कीमत, संपत्ति प्रकार और फर्श क्षेत्रफल फ़िल्टर साथ इस्तेमाल करें। इससे सचमुच कम लागत वाले क्षेत्रों को उन क्षेत्रों से अलग करना आसान होता है जहां बस छोटे या अलग तरह के घर हैं।',
'Screen environmental and local-service signals':
- 'पर्यावरण और स्थानीय-सेवा संकेतों को स्क्रीन करें',
+ 'पर्यावरण और स्थानीय सेवाओं के संकेत छांटें',
'Road noise, parks, broadband, crime, and amenities can affect whether a property works day to day. Use them as screening criteria before booking viewings.':
- 'सड़क का शोर, पार्क, ब्रॉडबैंड, अपराध और सुविधाएं प्रभावित कर सकती हैं कि कोई संपत्ति दिन-प्रतिदिन काम करती है या नहीं। बुकिंग देखने से पहले उन्हें स्क्रीनिंग मानदंड के रूप में उपयोग करें।',
+ 'सड़क शोर, पार्क, ब्रॉडबैंड, अपराध और सुविधाएं तय कर सकती हैं कि कोई संपत्ति रोजमर्रा की जिंदगी में ठीक बैठेगी या नहीं। मकान देखने की बुकिंग से पहले इन्हें छांटने की शर्तों की तरह इस्तेमाल करें।',
'Can I use this for commuter villages around Bristol?':
- 'क्या मैं इसका उपयोग ब्रिस्टल के आसपास के कम्यूटर गांवों के लिए कर सकता हूं?',
+ 'क्या मैं इसका उपयोग ब्रिस्टल के आसपास आने-जाने वाले गांवों के लिए कर सकता हूं?',
'Yes, where the relevant postcode and travel-time data is available. Always verify routes and services manually before deciding.':
- 'हां, जहां प्रासंगिक पोस्टकोड और यात्रा-समय डेटा उपलब्ध है। निर्णय लेने से पहले हमेशा मार्गों और सेवाओं को मैन्युअल रूप से सत्यापित करें।',
+ 'हाँ, जहां संबंधित पोस्टकोड और यात्रा-समय डेटा उपलब्ध है। निर्णय लेने से पहले मार्गों और सेवाओं की खुद पुष्टि करें।',
'Can this tell me whether a listing is good value?':
- 'क्या यह मुझे बता सकता है कि क्या कोई सूची अच्छा मूल्य है?',
+ 'क्या यह बता सकता है कि कोई लिस्टिंग अच्छा सौदा है या नहीं?',
'It can provide area context, but a specific listing still needs comparable sales, condition checks, survey findings, and professional advice where appropriate.':
- 'यह क्षेत्र का संदर्भ प्रदान कर सकता है, लेकिन एक विशिष्ट सूची को अभी भी तुलनीय बिक्री, स्थिति जांच, सर्वेक्षण निष्कर्ष और जहां उपयुक्त हो, पेशेवर सलाह की आवश्यकता होती है।',
+ 'यह क्षेत्र का संदर्भ दे सकता है, लेकिन किसी खास लिस्टिंग के लिए अब भी तुलनीय बिक्री, स्थिति जांच, सर्वेक्षण निष्कर्ष और जहां जरूरी हो पेशेवर सलाह चाहिए।',
'Search by reachable postcodes before refining by budget and local context.':
- 'बजट और स्थानीय संदर्भ के अनुसार परिष्कृत करने से पहले पहुंच योग्य पोस्टकोड द्वारा खोजें।',
+ 'बजट और स्थानीय संदर्भ से और सीमित करने से पहले पहुंच वाले पोस्टकोड से खोजें।',
'Understand price patterns before setting listing alerts.':
- 'लिस्टिंग अलर्ट सेट करने से पहले मूल्य पैटर्न को समझें।',
+ 'लिस्टिंग अलर्ट सेट करने से पहले कीमत पैटर्न समझें।',
'Privacy and security': 'गोपनीयता और सुरक्षा',
'How account and saved-search data is handled in the product.':
- 'उत्पाद में खाता और सहेजा गया-खोज डेटा कैसे प्रबंधित किया जाता है।',
+ 'उत्पाद में खाता और सहेजी गई खोजों का डेटा कैसे संभाला जाता है।',
'Compare Bristol postcodes': 'ब्रिस्टल पोस्टकोड की तुलना करें',
'Trust and coverage': 'भरोसा और कवरेज',
'Perfect Postcode data sources and coverage': 'Perfect Postcode डेटा स्रोत और कवरेज',
'Perfect Postcode data sources - Property, schools, commute and local context':
'Perfect Postcode डेटा स्रोत - संपत्ति, स्कूल, आवागमन और स्थानीय संदर्भ',
'Review the public and official datasets used by Perfect Postcode, including property prices, EPC, schools, crime, broadband, noise and travel-time context.':
- 'प्रॉपर्टी की कीमतें, ईपीसी, स्कूल, अपराध, ब्रॉडबैंड, शोर और यात्रा-समय के संदर्भ सहित, Perfect Postcode द्वारा उपयोग किए गए सार्वजनिक और आधिकारिक डेटासेट की समीक्षा करें।',
+ 'संपत्ति कीमतों, EPC, स्कूल, अपराध, ब्रॉडबैंड, शोर और यात्रा-समय संदर्भ सहित Perfect Postcode में उपयोग किए गए सार्वजनिक और आधिकारिक डेटासेट की समीक्षा करें।',
'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 संपत्ति, परिवहन, शिक्षा, पर्यावरण और स्थानीय-सेवा डेटासेट को जोड़ता है ताकि खरीदार लगातार पोस्टकोड की तुलना कर सकें। यह पृष्ठ बताता है कि डेटा किस लिए है और इसे कहां सत्यापित किया जाना चाहिए।',
+ 'Perfect Postcode संपत्ति, परिवहन, शिक्षा, पर्यावरण और स्थानीय-सेवा डेटासेट जोड़ता है, ताकि खरीदार पोस्टकोडों की लगातार तुलना कर सकें। यह पेज बताता है कि डेटा किस काम के लिए है और इसकी पुष्टि कहां करनी चाहिए।',
'Property and 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.':
- 'उत्पाद बिक्री मूल्य, संपत्ति प्रकार, कार्यकाल, फर्श क्षेत्र, ऊर्जा प्रदर्शन और अनुमानित वर्तमान मूल्य जैसे फिल्टर का समर्थन करने के लिए संपत्ति लेनदेन और आवास-संदर्भ डेटासेट का उपयोग करता है।',
+ 'उत्पाद बिक्री कीमत, संपत्ति प्रकार, स्वामित्व प्रकार, फर्श क्षेत्रफल, ऊर्जा प्रदर्शन और अनुमानित मौजूदा कीमत जैसे फ़िल्टरों के लिए संपत्ति लेनदेन और आवास-संदर्भ डेटासेट इस्तेमाल करता है।',
'Use these fields to compare areas, not as a formal valuation.':
- 'इन क्षेत्रों का उपयोग क्षेत्रों की तुलना करने के लिए करें, औपचारिक मूल्यांकन के रूप में नहीं।',
+ 'इन फ़ील्ड का उपयोग क्षेत्रों की तुलना के लिए करें, औपचारिक मूल्यांकन की तरह नहीं।',
'Check current listings, title information, lender requirements, and survey results before buying.':
- 'खरीदने से पहले वर्तमान लिस्टिंग, शीर्षक जानकारी, ऋणदाता आवश्यकताओं और सर्वेक्षण परिणामों की जांच करें।',
+ 'खरीदने से पहले मौजूदा लिस्टिंग, स्वामित्व रिकॉर्ड, ऋणदाता की शर्तें और सर्वेक्षण परिणाम जांचें।',
'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.':
- 'स्थानीय-संदर्भ फ़िल्टर दैनिक जीवन को प्रभावित करने वाले संकेतों पर पोस्टकोड की तुलना करने में मदद करते हैं। उन्हें स्क्रीनिंग डेटा के रूप में माना जाना चाहिए और निर्णयों के लिए वर्तमान आधिकारिक स्रोतों के विरुद्ध जांच की जानी चाहिए।',
+ 'स्थानीय-संदर्भ फ़िल्टर रोजमर्रा की जिंदगी को प्रभावित करने वाले संकेतों पर पोस्टकोड की तुलना में मदद करते हैं। इन्हें छांटने वाला डेटा मानें और निर्णयों के लिए मौजूदा आधिकारिक स्रोतों से जांचें।',
'Travel-time data': 'यात्रा-समय डेटा',
'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.':
- 'यात्रा-समय फ़िल्टर सुसंगत क्षेत्र तुलना के लिए डिज़ाइन किए गए हैं। किसी क्षेत्र में जाने से पहले मार्ग की उपलब्धता, व्यवधान, पार्किंग, पैदल पहुंच और समय सारिणी विवरण सत्यापित किया जाना चाहिए।',
+ 'यात्रा-समय फ़िल्टर क्षेत्रों की लगातार तुलना के लिए बनाए गए हैं। किसी क्षेत्र पर निर्णय लेने से पहले मार्ग उपलब्धता, व्यवधान, पार्किंग, पैदल पहुंच और समय-सारिणी की पुष्टि करें।',
'Why does coverage focus on England?': 'कवरेज इंग्लैंड पर केंद्रित क्यों है?',
'Several core property, education, and local-context datasets are jurisdiction-specific. England coverage keeps comparisons more consistent.':
'कई मुख्य संपत्ति, शिक्षा और स्थानीय-संदर्भ डेटासेट क्षेत्राधिकार-विशिष्ट हैं। इंग्लैंड का कवरेज तुलनाओं को अधिक सुसंगत रखता है।',
- 'How should I handle stale or missing data?': 'मुझे बासी या गुम डेटा को कैसे संभालना चाहिए?',
+ 'How should I handle stale or missing data?': 'पुराने या अनुपलब्ध डेटा को कैसे संभालूं?',
'Use the map as a shortlist tool. If a postcode matters, verify the latest details with current official sources and direct local checks.':
- 'मानचित्र को शॉर्टलिस्ट टूल के रूप में उपयोग करें। यदि कोई पोस्टकोड मायने रखता है, तो वर्तमान आधिकारिक स्रोतों और सीधे स्थानीय जांच से नवीनतम विवरण सत्यापित करें।',
+ 'मानचित्र को शॉर्टलिस्ट बनाने के साधन की तरह इस्तेमाल करें। अगर कोई पोस्टकोड मायने रखता है, तो मौजूदा आधिकारिक स्रोतों और सीधे स्थानीय जांच से नवीनतम विवरण की पुष्टि करें।',
'How filters and comparisons should be interpreted.':
- 'फ़िल्टर और तुलनाओं की व्याख्या कैसे की जानी चाहिए.',
+ 'फ़िल्टर और तुलनाओं को कैसे समझना चाहिए.',
'Review postcode-level context before a viewing.':
- 'देखने से पहले पोस्टकोड-स्तरीय संदर्भ की समीक्षा करें।',
+ 'मकान देखने से पहले पोस्टकोड-स्तरीय संदर्भ की समीक्षा करें।',
'How saved searches and account data are handled.':
'सहेजी गई खोजों और खाता डेटा को कैसे प्रबंधित किया जाता है।',
'How to use the map': 'मानचित्र का उपयोग कैसे करें',
@@ -507,25 +522,25 @@ const hi: Translations = {
'Perfect Postcode methodology - How to interpret postcode property data':
'Perfect Postcode पद्धति - पोस्टकोड संपत्ति डेटा की व्याख्या कैसे करें',
'Understand how to use postcode filters, property estimates, travel-time data, school context and local signals as a home-buying shortlist tool.':
- 'घर-खरीद शॉर्टलिस्ट टूल के रूप में पोस्टकोड फ़िल्टर, संपत्ति अनुमान, यात्रा-समय डेटा, स्कूल संदर्भ और स्थानीय संकेतों का उपयोग करने का तरीका समझें।',
+ 'घर खरीदने की शॉर्टलिस्ट बनाने के लिए पोस्टकोड फ़िल्टर, संपत्ति अनुमान, यात्रा-समय डेटा, स्कूल संदर्भ और स्थानीय संकेतों का उपयोग समझें।',
'Perfect Postcode is designed to make area shortlisting more evidence-led. It doesn’t replace estate agents, surveyors, conveyancers, lenders, school admissions teams, or local authority checks.':
- 'Perfect Postcode को क्षेत्र की शॉर्टलिस्टिंग को अधिक साक्ष्य आधारित बनाने के लिए डिज़ाइन किया गया है। यह संपत्ति एजेंटों, सर्वेक्षणकर्ताओं, वाहकों, ऋणदाताओं, स्कूल प्रवेश टीमों या स्थानीय प्राधिकरण जांचों को प्रतिस्थापित नहीं करता है।',
- 'Start with hard constraints': 'कठिन बाधाओं से शुरुआत करें',
+ 'Perfect Postcode क्षेत्र शॉर्टलिस्टिंग को अधिक प्रमाण-आधारित बनाने के लिए बनाया गया है। यह संपत्ति एजेंटों, सर्वेयरों, कानूनी हस्तांतरण विशेषज्ञों, ऋणदाताओं, स्कूल दाखिला टीमों या स्थानीय प्राधिकरण जांचों की जगह नहीं लेता।',
+ 'Start with hard constraints': 'अनिवार्य शर्तों से शुरुआत करें',
'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.':
- 'बजट, संपत्ति का प्रकार, फर्श क्षेत्र, आवागमन का समय और आवश्यक सेवाओं जैसे गैर-परक्राम्य मुद्दों से शुरुआत करें। नरम प्राथमिकताओं पर विचार करने से पहले यह असंभव पोस्टकोड को हटा देता है।',
- 'Use colour layers for trade-offs': 'ट्रेड-ऑफ़ के लिए रंग परतों का उपयोग करें',
+ 'बजट, संपत्ति का प्रकार, फर्श क्षेत्रफल, आवागमन समय और जरूरी सेवाओं जैसी गैर-समझौतावाली बातों से शुरुआत करें। नरम पसंदों पर विचार करने से पहले इससे अनुपयुक्त पोस्टकोड हट जाते हैं।',
+ 'Use colour layers for trade-offs': 'समझौते देखने के लिए रंग परतें इस्तेमाल करें',
'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.':
- 'फ़िल्टर करने के बाद, शेष मानचित्र को एक समय में एक सिग्नल से रंगें: प्रति वर्ग मीटर कीमत, सड़क का शोर, स्कूल का संदर्भ, आवागमन का समय, ब्रॉडबैंड, या अपराध। इससे ट्रेड-ऑफ़ पर चर्चा करना आसान हो जाता है।',
+ 'फ़िल्टर करने के बाद बचे मानचित्र को एक बार में एक संकेत से रंगें: प्रति वर्ग मीटर कीमत, सड़क शोर, स्कूल संदर्भ, आवागमन समय, ब्रॉडबैंड या अपराध। इससे समझौतों पर बात करना आसान होता है।',
'Measure what’s working': 'मापें कि क्या काम कर रहा है',
'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.':
- 'यह ट्रैक करने के लिए सर्च कंसोल और एनालिटिक्स का उपयोग करें कि कौन से सार्वजनिक पृष्ठ अनुक्रमित हैं, कौन सी क्वेरीज़ इंप्रेशन उत्पन्न करती हैं, और कौन से पृष्ठ आगंतुकों को डैशबोर्ड अन्वेषण में परिवर्तित करते हैं। प्रत्येक महत्वपूर्ण फ्रंटएंड परिवर्तन के बाद कोर वेब वाइटल्स की समीक्षा करें।',
+ 'Search Console और analytics से देखें कि कौन से सार्वजनिक पेज इंडेक्स हैं, किन क्वेरी से impressions मिलते हैं और कौन से पेज विज़िटर को डैशबोर्ड देखने तक लाते हैं। हर बड़े frontend बदलाव के बाद Core Web Vitals की समीक्षा करें।',
'Can the tool choose the right postcode for me?':
- 'क्या टूल मेरे लिए सही पोस्टकोड चुन सकता है?',
+ 'क्या यह साधन मेरे लिए सही पोस्टकोड चुन सकता है?',
'No. It helps compare evidence and reduce the search area. The final decision needs direct visits, current listings, legal checks, surveys, and personal judgement.':
- 'नहीं, यह साक्ष्यों की तुलना करने और खोज क्षेत्र को कम करने में मदद करता है। अंतिम निर्णय के लिए प्रत्यक्ष दौरे, वर्तमान लिस्टिंग, कानूनी जांच, सर्वेक्षण और व्यक्तिगत निर्णय की आवश्यकता होती है।',
+ 'नहीं. यह प्रमाणों की तुलना करने और खोज क्षेत्र घटाने में मदद करता है। अंतिम निर्णय के लिए खुद जाकर देखना, मौजूदा लिस्टिंग, कानूनी जांच, सर्वेक्षण और निजी निर्णय जरूरी हैं।',
'How should I use estimates?': 'मुझे अनुमानों का उपयोग कैसे करना चाहिए?',
'Use estimates as comparison signals, not as professional valuations or purchase advice.':
- 'अनुमानों का उपयोग तुलना संकेतों के रूप में करें, न कि पेशेवर मूल्यांकन या खरीदारी सलाह के रूप में।',
+ 'अनुमानों का उपयोग तुलना संकेतों की तरह करें, पेशेवर मूल्यांकन या खरीद सलाह की तरह नहीं।',
'Understand where key filters come from.': 'समझें कि मुख्य फ़िल्टर कहाँ से आते हैं।',
'Apply the methodology to price-led area comparison.':
'मूल्य-आधारित क्षेत्र तुलना के लिए कार्यप्रणाली लागू करें।',
@@ -537,31 +552,29 @@ const hi: Translations = {
'Perfect Postcode privacy and security - Saved searches and account data':
'Perfect Postcode गोपनीयता और सुरक्षा - सहेजी गई खोजें और खाता डेटा',
'Learn how Perfect Postcode treats saved searches, account data and property research workflows with privacy and security in mind.':
- 'जानें कि कैसे Perfect Postcode गोपनीयता और सुरक्षा को ध्यान में रखते हुए सहेजी गई खोजों, खाता डेटा और संपत्ति अनुसंधान वर्कफ़्लो का इलाज करता है।',
+ 'जानें कि Perfect Postcode गोपनीयता और सुरक्षा को ध्यान में रखते हुए सहेजी गई खोजों, खाता डेटा और संपत्ति शोध प्रक्रियाओं को कैसे संभालता है।',
'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.':
- 'संपत्ति अनुसंधान व्यक्तिगत प्राथमिकताओं, बजट और स्थानों को प्रकट कर सकता है। उत्पाद सार्वजनिक एसईओ पृष्ठों को केवल खाता क्षेत्रों से अलग रखता है और निजी डैशबोर्ड/खाता मार्गों को नोइंडेक्स के रूप में चिह्नित करता है।',
+ 'संपत्ति शोध व्यक्तिगत प्राथमिकताएं, बजट और स्थान दिखा सकता है। उत्पाद सार्वजनिक SEO पेजों को केवल-खाता क्षेत्रों से अलग रखता है और निजी डैशबोर्ड/खाता मार्गों को noindex चिह्नित करता है।',
'Public pages and private areas are separated': 'सार्वजनिक पृष्ठ और निजी क्षेत्र अलग-अलग हैं',
'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.':
- 'मार्केटिंग, कार्यप्रणाली, मार्गदर्शिका और सहायता पृष्ठ अनुक्रमित किए जा सकते हैं। डैशबोर्ड, खाता, सहेजी गई खोजें, आमंत्रण और आमंत्रण मार्गों को नोइंडेक्स के रूप में चिह्नित किया जाता है या जहां उपयुक्त हो क्रॉलर पहुंच से अवरुद्ध कर दिया जाता है।',
- 'Saved search data is account-scoped': 'सहेजा गया खोज डेटा खाता-क्षेत्र है',
+ 'मार्केटिंग, कार्यप्रणाली, गाइड और सहायता पेज इंडेक्स किए जा सकते हैं। डैशबोर्ड, खाता, सहेजी गई खोजें, आमंत्रण और आमंत्रण मार्गों को जहां उपयुक्त हो noindex चिह्नित किया जाता है या क्रॉलर पहुंच से रोका जाता है।',
+ 'Saved search data is account-scoped': 'सहेजी गई खोज का डेटा खाते तक सीमित है',
'Saved searches and shared links are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
'सहेजी गई खोजें और साझा लिंक साइन-इन उपयोग के लिए हैं। वे सार्वजनिक साइटमैप में शामिल नहीं हैं और उन्हें सार्वजनिक सामग्री के रूप में क्रॉल नहीं किया जाना चाहिए।',
- 'Search measurement without exposing private data': 'निजी डेटा को उजागर किए बिना माप खोजें',
+ 'Search measurement without exposing private data': 'निजी डेटा दिखाए बिना खोज प्रदर्शन मापना',
'SEO measurement should happen on public pages using aggregated analytics and Search Console data. Private query parameters and account views shouldn’t become indexable landing pages.':
- 'समग्र विश्लेषण और खोज कंसोल डेटा का उपयोग करके सार्वजनिक पृष्ठों पर एसईओ माप होना चाहिए। निजी क्वेरी पैरामीटर और खाता दृश्य अनुक्रमणीय लैंडिंग पृष्ठ नहीं बनने चाहिए।',
+ 'SEO मापन सार्वजनिक पेजों पर समेकित analytics और Search Console डेटा से होना चाहिए। निजी क्वेरी पैरामीटर और खाता दृश्य इंडेक्स होने वाले लैंडिंग पेज नहीं बनने चाहिए।',
'Are saved searches listed in the sitemap?': 'क्या सहेजी गई खोजें साइटमैप में सूचीबद्ध हैं?',
'No. Public SEO pages are listed; account and saved-search routes are intentionally excluded.':
- 'नहीं, सार्वजनिक एसईओ पृष्ठ सूचीबद्ध हैं; खाता और सहेजे गए-खोज मार्गों को जानबूझकर बाहर रखा गया है।',
+ 'नहीं. सार्वजनिक SEO पेज सूचीबद्ध हैं; खाता और सहेजी-खोज मार्ग जानबूझकर बाहर रखे गए हैं।',
'Can private dashboard URLs appear in search?':
'क्या निजी डैशबोर्ड URL खोज में दिखाई दे सकते हैं?',
'They shouldn’t be indexed. The server marks private routes noindex and the sitemap only lists public pages.':
- 'उन्हें अनुक्रमित नहीं किया जाना चाहिए. सर्वर निजी मार्गों को नोइंडेक्स चिह्नित करता है और साइटमैप केवल सार्वजनिक पृष्ठों को सूचीबद्ध करता है।',
+ 'उन्हें इंडेक्स नहीं होना चाहिए. सर्वर निजी मार्गों को noindex चिह्नित करता है और साइटमैप केवल सार्वजनिक पेज सूचीबद्ध करता है।',
'How to use public postcode data responsibly.':
'सार्वजनिक पोस्टकोड डेटा का जिम्मेदारीपूर्वक उपयोग कैसे करें।',
- 'What data powers the public comparisons.':
- 'कौन सा डेटा सार्वजनिक तुलनाओं को शक्ति प्रदान करता है।',
- 'Explore public postcode-search workflows.':
- 'सार्वजनिक पोस्टकोड-खोज वर्कफ़्लोज़ का अन्वेषण करें।',
+ 'What data powers the public comparisons.': 'सार्वजनिक तुलनाओं के पीछे कौन सा डेटा है।',
+ 'Explore public postcode-search workflows.': 'सार्वजनिक पोस्टकोड-खोज प्रक्रियाएं देखें।',
},
},
@@ -587,19 +600,19 @@ const hi: Translations = {
upgrade: {
title: 'हर मेल खाने वाला पोस्टकोड खोजें',
description:
- 'आप अभी डेमो क्षेत्र देख रहे हैं. इंग्लैंड के हर पोस्टकोड, हर फिल्टर और हर पड़ोस का लाइफटाइम एक्सेस पाएं. एक भुगतान, हमेशा के लिए.',
+ 'आप अभी डेमो क्षेत्र देख रहे हैं. इंग्लैंड के हर पोस्टकोड, हर फ़िल्टर और हर पड़ोस की आजीवन पहुँच पाएं. एक भुगतान, हमेशा के लिए.',
free: 'मुफ्त',
freeForEarly: 'शुरुआती उपयोगकर्ताओं के लिए मुफ्त. क्रेडिट कार्ड की जरूरत नहीं.',
- oneTimePayment: 'एक बार भुगतान. लाइफटाइम एक्सेस.',
+ oneTimePayment: 'एक बार भुगतान. आजीवन पहुँच.',
redirecting: 'रीडायरेक्ट किया जा रहा है...',
- claimFreeAccess: 'मुफ्त एक्सेस लें',
+ claimFreeAccess: 'मुफ्त पहुँच लें',
upgradeFor: '{{price}} में अपग्रेड करें',
- registerAndUpgrade: 'रजिस्टर करें और अपग्रेड करें',
+ registerAndUpgrade: 'पंजीकरण करें और अपग्रेड करें',
alreadyHaveAccount: 'पहले से खाता है? लॉग इन करें',
continueWithDemo: 'डेमो जारी रखें',
backToSharedArea: 'साझा क्षेत्र पर वापस जाएं',
sharedAreaDescription:
- 'आप एक साझा क्षेत्र देख रहे हैं. इससे आगे देखने के लिए इंग्लैंड के हर पोस्टकोड, हर फिल्टर और हर पड़ोस का लाइफटाइम एक्सेस लें.',
+ 'आप एक साझा क्षेत्र देख रहे हैं. इससे आगे देखने के लिए इंग्लैंड के हर पोस्टकोड, हर फ़िल्टर और हर पड़ोस की आजीवन पहुँच लें.',
checkoutFailed: 'चेकआउट विफल रहा',
},
@@ -614,36 +627,36 @@ const hi: Translations = {
},
licenseSuccess: {
- verifyingTitle: 'एक्सेस सत्यापित हो रहा है',
+ verifyingTitle: 'पहुँच सत्यापित हो रही है',
verifyingSubtitle: 'मानचित्र खोलने से पहले हम आपका खाता जांच रहे हैं.',
verifyingDescription: 'चेकआउट के बाद इसमें आम तौर पर कुछ सेकंड लगते हैं.',
activationDelayedTitle: 'भुगतान प्राप्त हुआ',
- activationDelayedSubtitle: 'एक्सेस अभी सक्रिय हो रहा है.',
+ activationDelayedSubtitle: 'पहुँच अभी सक्रिय हो रही है.',
activationDelayedDescription:
- 'हम अभी खाते का अपडेट पुष्टि नहीं कर पाए. थोड़ी देर में रिफ्रेश करें, या एक्सेस न दिखे तो सपोर्ट से संपर्क करें.',
+ 'हम अभी खाते का अपडेट पुष्टि नहीं कर पाए. थोड़ी देर में रिफ्रेश करें, या पहुँच न दिखे तो सहायता से संपर्क करें.',
stayOnPricing: 'मूल्य पेज पर रहें',
title: 'आप अंदर हैं.',
- subtitle: 'आपका लाइफटाइम एक्सेस अब सक्रिय है.',
- description: 'पूरे इंग्लैंड में हर फीचर और हर पोस्टकोड का पूरा एक्सेस.',
+ subtitle: 'आपकी आजीवन पहुँच अब सक्रिय है.',
+ description: 'पूरे इंग्लैंड में हर सुविधा और हर पोस्टकोड की पूरी पहुँच.',
startExploring: 'खोजना शुरू करें',
},
filters: {
- activeFilters: 'सक्रिय फिल्टर',
- addFilter: 'फिल्टर जोड़ें',
+ activeFilters: 'सक्रिय फ़िल्टर',
+ addFilter: 'फ़िल्टर जोड़ें',
findingPerfectPostcode: 'Perfect Postcode खोजा जा रहा है',
- addFiltersHint: 'अपनी शर्तों से मेल खाने वाले क्षेत्र पाने के लिए नीचे फिल्टर जोड़ें',
+ addFiltersHint: 'अपनी शर्तों से मेल खाने वाले क्षेत्र पाने के लिए नीचे फ़िल्टर जोड़ें',
upgradePrompt:
- 'इंग्लैंड भर में अपराध, स्कूल, शोर, ब्रॉडबैंड, कीमतें और 50+ अन्य फिल्टर से मेल खाने वाले पोस्टकोड खोजें.',
- oneTimeLifetime: 'एक बार भुगतान, लाइफटाइम एक्सेस.',
- upgradeToFullMap: 'पूरा मानचित्र अपग्रेड करें',
+ 'इंग्लैंड भर में अपराध, स्कूल, शोर, ब्रॉडबैंड, कीमतें और 50+ अन्य फ़िल्टर से मेल खाने वाले पोस्टकोड खोजें.',
+ oneTimeLifetime: 'एक बार भुगतान, आजीवन पहुँच.',
+ upgradeToFullMap: 'पूरे मानचित्र पर अपग्रेड करें',
chooseFilters:
- 'फिल्टर लगाने के लिए जोड़ें पर क्लिक करें. छोटे बटन डेटा विवरण दिखाते हैं या मानचित्र को रंगते हैं.',
- searchFeatures: 'फीचर खोजें...',
- noMatchingFeatures: 'कोई मेल खाता फीचर नहीं',
+ 'फ़िल्टर लगाने के लिए जोड़ें पर क्लिक करें. छोटे बटन डेटा विवरण दिखाते हैं या मानचित्र को रंगते हैं.',
+ searchFeatures: 'सुविधाएं खोजें...',
+ noMatchingFeatures: 'कोई मेल खाती सुविधा नहीं',
tryDifferentSearch: 'कोई दूसरा खोज शब्द आजमाएं',
- allFeaturesActive: 'सभी फीचर सक्रिय हैं',
- removeFilterHint: 'उपलब्ध फीचर देखने के लिए कोई फिल्टर हटाएं',
+ allFeaturesActive: 'सभी सुविधाएं सक्रिय हैं',
+ removeFilterHint: 'उपलब्ध सुविधाएं देखने के लिए कोई फ़िल्टर हटाएं',
featureInfo: 'इस डेटा के बारे में',
aboutData: 'इस डेटा के बारे में',
aboutDataShort: 'जानकारी',
@@ -651,19 +664,19 @@ const hi: Translations = {
colourMapShort: 'मानचित्र रंगें',
clearColourMap: 'मानचित्र का रंग हटाएं',
addFilterAction: 'जोड़ें',
- addFilterLabel: 'फिल्टर जोड़ें',
- removeFilter: 'फिल्टर हटाएं',
+ addFilterLabel: 'फ़िल्टर जोड़ें',
+ removeFilter: 'फ़िल्टर हटाएं',
replayTutorial: 'इंटरैक्टिव ट्यूटोरियल फिर चलाएं',
clearAll: 'सभी साफ करें',
- clearAllTitle: 'सभी फिल्टर साफ करें?',
- clearAllSavePrompt: 'क्या साफ करने से पहले आप अपने मौजूदा फिल्टर सहेजना चाहेंगे?',
+ clearAllTitle: 'सभी फ़िल्टर साफ करें?',
+ clearAllSavePrompt: 'क्या साफ करने से पहले आप अपने मौजूदा फ़िल्टर सहेजना चाहेंगे?',
clearAllUpdatePrompt:
- 'साफ करने से पहले {{name}} को अपने मौजूदा फिल्टर के साथ अपडेट करें?',
+ 'साफ करने से पहले {{name}} को अपने मौजूदा फ़िल्टर के साथ अपडेट करें?',
saveAndClear: 'सहेजें और साफ करें',
updateAndClear: 'अपडेट करें और साफ करें',
clearWithoutSaving: 'बिना सहेजे साफ करें',
clearWithoutUpdating: 'बिना अपडेट किए साफ करें',
- filtersOut: '{{value}} को फिल्टर करता है',
+ filtersOut: '{{value}} को बाहर करता है',
schoolType: 'स्कूल प्रकार',
schoolRating: 'स्कूल रेटिंग',
schoolDistance: 'स्कूल दूरी',
@@ -675,7 +688,7 @@ const hi: Translations = {
distance: 'दूरी',
crimeType: 'अपराध प्रकार',
ethnicity: 'जातीय समूह',
- poiType: 'POI प्रकार',
+ poiType: 'रुचि-स्थल प्रकार',
party: 'पार्टी',
travelTimeKeywords:
'यात्रा यात्रा समय सफर आवागमन कार गाड़ी साइकिल बाइक पैदल चलना सार्वजनिक परिवहन परिवहन यातायात स्टेशन ट्रेन रेल मेट्रो ट्यूब बस मार्ग travel time journey commute car bicycle bike walking transit transport station tube train',
@@ -683,9 +696,9 @@ const hi: Translations = {
philosophy: {
intro:
- 'अपनी अनिवार्य जरूरतों से शुरू करें, फिर अच्छी लगने वाली चीजें जोड़ें. जैसे-जैसे आप फिल्टर जोड़ते हैं, मानचित्र संकरा होता जाता है. बचे हुए क्षेत्र आपके सबसे अच्छे मेल हैं.',
+ 'अपनी अनिवार्य जरूरतों से शुरू करें, फिर अच्छी लगने वाली चीजें जोड़ें. जैसे-जैसे आप फ़िल्टर जोड़ते हैं, मानचित्र संकरा होता जाता है. बचे हुए क्षेत्र आपके सबसे अच्छे मेल हैं.',
step1Title: 'बजट और मूल बातें',
- step1Desc: '(कीमत सीमा, फर्श क्षेत्र, संपत्ति प्रकार)',
+ step1Desc: '(कीमत सीमा, फर्श क्षेत्रफल, संपत्ति प्रकार)',
step2Title: 'आवागमन',
step2Desc: '(कार, साइकिल या सार्वजनिक परिवहन से कार्यस्थल तक यात्रा समय)',
step3Title: 'सुरक्षा',
@@ -693,7 +706,7 @@ const hi: Translations = {
step4Title: 'स्कूल',
step4Desc: '(नजदीकी Ofsted द्वारा अच्छी या उत्कृष्ट रेटिंग वाले स्कूल)',
step5Title: 'जीवनशैली',
- step5Desc: '(रेस्तरां, पार्क, ब्रॉडबैंड स्पीड)',
+ step5Desc: '(रेस्तरां, पार्क, ब्रॉडबैंड गति)',
step6Title: 'ऊर्जा',
step6Desc: '(EPC रेटिंग, इंसुलेशन, हीटिंग लागत)',
tip: 'टिप: अगर कुछ भी मेल नहीं खाता, तो एक समय में एक शर्त ढीली करें और देखें कौन सा समझौता सबसे अधिक विकल्प खोलता है.',
@@ -706,21 +719,21 @@ const hi: Translations = {
bestCase: 'सर्वश्रेष्ठ स्थिति',
bestCaseTitle: 'सर्वश्रेष्ठ स्थिति यात्रा समय',
bestCaseDesc:
- 'सबसे तेज यथार्थवादी यात्रा समय का उपयोग करता है (अगर आप प्रस्थान का समय सही रखें और अच्छे कनेक्शन मिलें). डिफॉल्ट मीडियन का उपयोग करता है, जो आपके निकलने के समय से स्वतंत्र एक सामान्य यात्रा दिखाता है.',
+ 'सबसे तेज व्यावहारिक यात्रा समय का उपयोग करता है (अगर आप प्रस्थान का समय सही रखें और अच्छे कनेक्शन मिलें). डिफ़ॉल्ट मध्यिका का उपयोग करता है, जो आपके निकलने के समय से अलग एक सामान्य यात्रा दिखाता है.',
noChange: 'बिना बदलाव',
noChangeTitle: 'केवल सीधी यात्राएँ',
noChangeDesc:
- 'बिना ट्रांसफर वाली यात्राओं तक सीमित — पैदल, एक परिवहन सेवा, फिर पैदल गंतव्य तक.',
- noBuses: 'बिना बसें',
+ 'बिना बदलाव वाली यात्राओं तक सीमित — पैदल चलें, एक सार्वजनिक परिवहन सेवा लें, फिर गंतव्य तक पैदल जाएं. सीधे आवागमन के लिए उपयोगी.',
+ noBuses: 'बसों के बिना',
noBusesTitle: 'बसों को बाहर रखें',
noBusesDesc:
- 'बस सेवाओं को छोड़ देता है — केवल ट्रेन, ट्यूब, ट्राम और फ़ेरी. ट्रैफिक देरी से बचने वाली यात्राओं को छानने के लिए उपयोगी.',
+ 'बस सेवाओं को हटा देता है — केवल रेल, ट्यूब, ट्राम और फ़ेरी. ट्रैफिक देरी से बचने वाली यात्राओं को छांटने में उपयोगी.',
previewOnMap: 'मानचित्र पर पूर्वावलोकन',
stopPreviewing: 'पूर्वावलोकन रोकें',
removeTravelTime: 'यात्रा समय हटाएं',
addTravelTime: '{{mode}} यात्रा समय जोड़ें',
clearDestination: 'गंतव्य साफ करें',
- typeToFilter: 'फिल्टर करने के लिए टाइप करें...',
+ typeToFilter: 'छांटने के लिए टाइप करें...',
noDestinations: 'कोई गंतव्य नहीं मिला',
modeCar: 'कार',
modeBicycle: 'साइकिल',
@@ -734,7 +747,7 @@ const hi: Translations = {
travelInfo: {
transitDesc:
- ' सार्वजनिक परिवहन से (बस, रेल, ट्यूब). समय सामान्य कार्यदिवस सुबह की अवधि में गणना किया जाता है.',
+ ' सार्वजनिक परिवहन से (बस, रेल, ट्यूब). समय सामान्य कार्यदिवस की सुबह की अवधि में निकाला जाता है.',
carDesc: ' कार से, सामान्य सड़क गति और सड़क नेटवर्क के आधार पर.',
bicycleDesc: ' साइकिल से, साइकिल-अनुकूल मार्गों का उपयोग करके.',
walkingDesc: ' पैदल, पैदल रास्तों और फुटपाथों का उपयोग करके.',
@@ -752,10 +765,10 @@ const hi: Translations = {
example3: 'समझदारी वाले आवागमन के साथ ज्यादा जगह',
analysing: 'आपकी क्वेरी का विश्लेषण हो रहा है...',
searchingDestinations: 'गंतव्य खोजे जा रहे हैं...',
- generatingFilters: 'फिल्टर बनाए जा रहे हैं...',
+ generatingFilters: 'फ़िल्टर बनाए जा रहे हैं...',
refiningResults: 'परिणाम सुधारे जा रहे हैं...',
weeklyLimitReached:
- 'आप साप्ताहिक AI उपयोग सीमा तक पहुंच गए हैं. यह अगले सप्ताह अपने आप रीसेट हो जाएगी.',
+ 'आप साप्ताहिक AI उपयोग सीमा तक पहुंच गए हैं. यह अगले सप्ताह अपने आप फिर से शुरू हो जाएगी.',
},
mapLegend: {
@@ -779,16 +792,17 @@ const hi: Translations = {
unknownAddress: 'अज्ञात पता',
estValue: 'अनु. मूल्य:',
type: 'प्रकार:',
- builtForm: 'निर्माण रूप:',
- tenure: 'कार्यकाल:',
+ builtForm: 'निर्माण स्वरूप:',
+ tenure: 'स्वामित्व:',
withinConservationArea: 'संरक्षण क्षेत्र में:',
- floorArea: 'फर्श क्षेत्र:',
+ floorArea: 'फर्श क्षेत्रफल:',
rooms: 'कमरे:',
built: 'निर्माण:',
formerCouncil: 'पूर्व काउंसिल:',
- exCouncilBadge: 'पूर्व काउंसिल',
+ exCouncilBadge: 'शायद पूर्व काउंसिल',
+ listedBuildingBadge: 'शायद सूचीबद्ध',
epcRating: 'EPC रेटिंग:',
- epcPotential: 'EPC संभावित:',
+ epcPotential: 'संभावित EPC:',
renovations: 'नवीनीकरण',
perSqm: '/वर्ग मी',
historyTitle: 'इतिहास',
@@ -797,26 +811,26 @@ const hi: Translations = {
searchPlaceholder: 'पते या पोस्टकोड से खोजें...',
propertyData: 'संपत्ति डेटा',
propertyDataDesc:
- 'कीमतें HM Land Registry से आती हैं (खरीदारों ने वास्तव में क्या भुगतान किया). फर्श क्षेत्र, ऊर्जा रेटिंग, निर्माण वर्ष और कार्यकाल आधिकारिक EPC सर्वेक्षणों से आते हैं. दोनों स्रोत हर पोस्टकोड के अंदर पते से मिलाए जाते हैं.',
+ 'कीमतें HM Land Registry से आती हैं (खरीदारों ने वास्तव में क्या भुगतान किया). फर्श क्षेत्रफल, ऊर्जा रेटिंग, निर्माण वर्ष और स्वामित्व प्रकार आधिकारिक EPC सर्वेक्षणों से आते हैं. दोनों स्रोत हर पोस्टकोड के अंदर पते से मिलाए जाते हैं.',
},
areaPane: {
areaStatistics: 'क्षेत्र आंकड़े',
areaOverview: 'अवलोकन',
statsFor: 'इस {{type}} की सभी संपत्तियों के आंकड़े',
- matchingFilters: ' सभी सक्रिय फिल्टर से मेल खाते हुए',
+ matchingFilters: ' सभी सक्रिय फ़िल्टर से मेल खाते हुए',
statsBasis: 'आंकड़ों का आधार',
- matchingFiltersOption: 'मेल खाते फिल्टर',
+ matchingFiltersOption: 'मेल खाते फ़िल्टर',
allPropertiesOption: 'सभी संपत्तियां',
- filtersAffectStats: 'इस पेन के आंकड़े {{count}} सक्रिय फिल्टर का उपयोग कर रहे हैं.',
+ filtersAffectStats: 'इस पैनल के आँकड़ों में {{count}} सक्रिय फ़िल्टर लागू हैं.',
filtersIgnoredForStats: 'चुने गए क्षेत्र की सभी संपत्तियों के आंकड़े दिखाए जा रहे हैं.',
noFiltersAffectStats:
- 'कोई सक्रिय फिल्टर नहीं; आंकड़े इस क्षेत्र की सभी संपत्तियों को शामिल करते हैं.',
- filteredStatsEmpty: 'फिल्टर किए गए आंकड़े खाली हैं',
+ 'कोई सक्रिय फ़िल्टर नहीं; आँकड़ों में इस क्षेत्र की सभी संपत्तियां शामिल हैं.',
+ filteredStatsEmpty: 'फ़िल्टर किए गए आँकड़े खाली हैं',
showAllStatsHint:
- 'फिल्टर से पहले यहां {{count}} संपत्तियां हैं. इस क्षेत्र को देखने के लिए सभी संपत्तियों पर जाएं.',
+ 'फ़िल्टर से पहले यहां {{count}} संपत्तियां हैं. इस क्षेत्र को देखने के लिए सभी संपत्तियों पर जाएं.',
showAllStatsFallback:
- 'सक्रिय फिल्टर के बिना इस क्षेत्र को देखने के लिए सभी संपत्तियों पर जाएं.',
+ 'सक्रिय फ़िल्टर के बिना इस क्षेत्र को देखने के लिए सभी संपत्तियों पर जाएं.',
showAllStats: 'सभी संपत्तियां दिखाएं',
closestStations: 'निकटतम स्टेशन',
noNearbyStations: '2 किमी के भीतर कोई ट्रेन या ट्यूब स्टेशन नहीं',
@@ -824,7 +838,7 @@ const hi: Translations = {
lowerMinTo: 'न्यूनतम को {{value}} तक घटाएं',
raiseMaxTo: 'अधिकतम को {{value}} तक बढ़ाएं',
allowCategory: '{{value}} की अनुमति दें',
- missingFilterValue: 'इस फिल्टर के लिए कोई मान नहीं है; इसे हटाएं',
+ missingFilterValue: 'इस फ़िल्टर के लिए कोई मान नहीं है; इसे हटाएं',
noFilterDataShort: 'कोई डेटा नहीं',
travelTo: '{{destination}} तक यात्रा',
viewProperties: '{{count}} संपत्तियां देखें',
@@ -839,15 +853,6 @@ const hi: Translations = {
nationalAvg: 'राष्ट्रीय औसत',
},
- histogramLegend: {
- tealBars: 'टील बार',
- tealBarsDesc: 'इस चुने गए क्षेत्र का वितरण दिखाते हैं',
- greyBars: 'ग्रे बार',
- greyBarsDesc: 'सभी क्षेत्रों का कुल वितरण दिखाते हैं',
- dashedLine: 'डैश्ड लाइन',
- dashedLineDesc: 'राष्ट्रीय औसत दर्शाती है',
- },
-
streetView: {
title: 'Street View',
openLarge: 'Street View बड़ा खोलें',
@@ -855,16 +860,16 @@ const hi: Translations = {
},
poiPane: {
- pois: 'POI',
+ pois: 'रुचि-स्थल',
pointsOfInterest: 'रुचि के स्थान',
poiDescription:
- 'OpenStreetMap, NaPTAN और GEOLYTIX Grocery Retail Points से स्रोतित. परिवहन स्टॉप, दुकानें, चेन सुपरमार्केट, रेस्तरां, स्वास्थ्य सेवा, अवकाश और अधिक शामिल हैं.',
+ 'OpenStreetMap, NaPTAN और GEOLYTIX Grocery Retail Points से लिया गया. इसमें परिवहन स्टॉप, दुकानें, चेन सुपरमार्केट, रेस्तरां, स्वास्थ्य सेवा, अवकाश और बहुत कुछ शामिल है.',
searchCategories: 'श्रेणियां खोजें...',
dataSourceInfo: 'डेटा स्रोत जानकारी',
},
externalSearch: {
- searchOn: '{{radius}} को इन पर खोजें:',
+ searchOn: 'इन पर {{radius}} खोजें:',
exact: 'सटीक',
outcodeNotRecognised: 'आउटकोड पहचाना नहीं गया',
},
@@ -872,10 +877,10 @@ const hi: Translations = {
locationSearch: {
placeholder: 'स्थान या पोस्टकोड खोजें...',
postcodeNotFound: 'पोस्टकोड नहीं मिला',
- lookupFailed: 'लुकअप विफल रहा',
+ lookupFailed: 'खोज विफल रही',
searchLabel: 'स्थान या पोस्टकोड खोजें',
locateMe: 'मेरे स्थान पर जाएं',
- geolocationUnsupported: 'आपका ब्राउजर जियोलोकेशन का समर्थन नहीं करता',
+ geolocationUnsupported: 'आपका ब्राउज़र स्थान-साझाकरण का समर्थन नहीं करता',
geolocationFailed: 'आपका स्थान निर्धारित नहीं किया जा सका',
},
@@ -889,9 +894,9 @@ const hi: Translations = {
heroTitle2: 'आपकी जिंदगी से मेल खाते हैं',
heroTitle3: 'सिर्फ वे क्षेत्र नहीं जिन्हें आप पहले से जानते हैं.',
heroSubtitle:
- 'लंदन बरो से लेकर कम्यूटर टाउन और क्षेत्रीय शहरों तक, इंग्लैंड में एक-एक जगह रिसर्च करने के लिए बहुत अधिक स्थान हैं.',
+ 'लंदन के बरो से लेकर आवागमन वाले कस्बों और क्षेत्रीय शहरों तक, इंग्लैंड में एक-एक जगह अलग से शोध करने के लिए बहुत अधिक स्थान हैं.',
heroDescription:
- 'अपना बजट, आवागमन, स्कूल, सुरक्षा, शोर, ब्रॉडबैंड और जीवनशैली की जरूरतें सेट करें. Perfect Postcode इंग्लैंड के पोस्टकोड स्कैन करता है और वे जगहें दिखाता है जो सच में मेल खाती हैं, उन क्षेत्रों सहित जिन्हें आप किसी प्रॉपर्टी पोर्टल में कभी नहीं खोजते.',
+ 'अपना बजट, आवागमन, स्कूल, सुरक्षा, शोर, ब्रॉडबैंड और जीवनशैली की जरूरतें सेट करें. Perfect Postcode इंग्लैंड के पोस्टकोड स्कैन करता है और वे जगहें दिखाता है जो सच में मेल खाती हैं, उन क्षेत्रों सहित जिन्हें आप किसी लिस्टिंग पोर्टल में कभी टाइप नहीं करते.',
exploreTheMap: 'मेरे मेल खाते पोस्टकोड खोजें',
seeTheDifference: 'देखें यह कैसे काम करता है',
productDemoLabel: 'Perfect Postcode उत्पाद डेमो',
@@ -907,7 +912,7 @@ const hi: Translations = {
showcaseWithinRail: 'रेल से {{count}} मिनट के भीतर',
showcaseMatchingHomesLabel: 'मेल खाते घर',
showcaseMatchingHomes: '{{value}} मेल खाते घर',
- showcaseMedianPrice: '{{value}} मीडियन',
+ showcaseMedianPrice: '{{value}} मध्यिका',
showcaseJourneyRoutes: 'यात्रा मार्ग',
showcaseNearby: '{{value}} पास में',
showcasePoliticalVoteShare: 'राजनीतिक वोट हिस्सेदारी',
@@ -916,13 +921,13 @@ const hi: Translations = {
showcaseSendShortlist: 'शॉर्टलिस्ट भेजें',
showcaseDownloadXlsx: '.xlsx डाउनलोड करें',
showcaseTopThree: 'शीर्ष 3',
- showcaseScoutBullet1: 'लिस्टिंग खोज आपके विकल्प घटाए, उससे पहले सड़कें चलकर देखें.',
- showcaseScoutBullet2: 'आवागमन किसी असली दरवाजे से जांचें, सिर्फ बरो नाम से नहीं.',
+ showcaseScoutBullet1: 'लिस्टिंग खोज आपके विकल्प घटाए, उससे पहले सड़कों पर जाकर देखें.',
+ showcaseScoutBullet2: 'आवागमन किसी असली पते से जांचें, सिर्फ बरो नाम से नहीं.',
showcaseScoutBullet3: 'पहले से मौजूद प्रमाण के साथ मकान देखने की तुलना करें.',
- showcaseStep1Tab: 'फिल्टर',
+ showcaseStep1Tab: 'फ़िल्टर',
showcaseStep1Title: 'अस्पष्ट जरूरतों को सटीक खोज में बदलें',
showcaseStep1Body:
- 'जो मायने रखता है उसे सेट करें और देखें कि हर जरूरत कितने गलत-फिट पोस्टकोड को आपकी खोज से बाहर रखती है.',
+ 'जो मायने रखता है उसे सेट करें और देखें कि हर जरूरत कितने अनुपयुक्त पोस्टकोड को आपकी खोज से बाहर रखती है.',
showcaseStep1Chip1: 'शांत सड़कें',
showcaseStep1Chip2: 'शीर्ष-रेटेड प्राइमरी',
showcaseStep1Chip3: '£500,000 से कम',
@@ -930,7 +935,7 @@ const hi: Translations = {
showcaseStep2Tab: 'मिलान',
showcaseStep2Title: 'मानचित्र को वे जगहें दिखाने दें जिन्हें आप टाइप नहीं करते',
showcaseStep2Body:
- 'परिचित इलाकों के नामों से शुरू करने के बजाय अपनी जरूरतों से मेल के आधार पर इंग्लैंड देखें. प्रॉपर्टी पोर्टल आपकी सोच सीमित करें, उससे पहले छिपे हुए अच्छे इलाके सामने आ जाते हैं.',
+ 'परिचित इलाकों के नामों से शुरू करने के बजाय अपनी जरूरतों से मेल के आधार पर इंग्लैंड देखें. लिस्टिंग पोर्टल आपकी सोच सीमित करें, उससे पहले छिपे हुए अच्छे इलाके सामने आ जाते हैं.',
showcaseStep2Region: 'ग्रेटर लंदन',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
showcaseStep2ClustersLabel: 'मेल खाते क्लस्टर',
@@ -943,29 +948,29 @@ const hi: Translations = {
showcaseStep3Stat1Label: 'बेची गई कीमत का रुझान',
showcaseStep3Stat2Label: 'अपराध दर',
showcaseStep3Stat2Value: 'बरो औसत से कम',
- showcaseStep3Stat3Label: 'मीडियन आयु',
+ showcaseStep3Stat3Label: 'मध्य आयु',
showcaseStep3Stat4Label: 'ब्रॉडबैंड',
showcaseStep3Stat4Value: '1 Gbps उपलब्ध',
showcaseStep3Stat5Label: 'प्राइमरी स्कूल',
showcaseStep3Stat5Value: '1 मील के अंदर 3 उत्कृष्ट',
- showcaseStep4Tab: 'स्काउट',
- showcaseStep4Title: 'खुद जाकर देखें',
+ showcaseStep4Tab: 'जाकर देखें',
+ showcaseStep4Title: 'खुद जाकर परखें',
showcaseStep4Body:
- 'तीन ठोस शुरुआती बिंदुओं को वास्तविक दुनिया में ले जाएं. सड़कें चलकर देखें, आवागमन आजमाएं और संदर्भ के साथ मकानों की देखने-समझने की यात्राओं की तुलना करें.',
+ 'तीन ठोस शुरुआती बिंदुओं को वास्तविक दुनिया में ले जाएं. सड़कें पैदल देखें, आवागमन आजमाएं और संदर्भ के साथ मकान देखने के अनुभवों की तुलना करें.',
showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Excel में निर्यात करें',
showcaseStep4ColPostcode: 'पोस्टकोड',
showcaseStep4ColScore: 'फिट',
showcaseStep4ColCommute: 'आवागमन',
- showcaseStep4ColPrice: 'मीडियन बिक्री',
+ showcaseStep4ColPrice: 'मध्यिका बिक्री',
showcaseStep4Conclusion: 'आप अपनी यात्रा यहां से शुरू कर सकते हैं.',
statProperties: 'ऐतिहासिक बिक्री',
- statFilters: 'जोड़े जा सकने वाले फिल्टर',
- statEvery: 'हर',
- statPostcodeInEngland: 'इंग्लैंड का पोस्टकोड',
+ statFilters: 'जोड़े जा सकने वाले फ़िल्टर',
+ statEvery: 'इंग्लैंड का हर',
+ statPostcodeInEngland: 'पोस्टकोड',
ourPhilosophy: 'जो मायने रखता है उससे शुरू करें, फिर सही पोस्टकोड खोजें',
philosophyP1:
- 'अधिकांश संपत्ति साइटें पूछती हैं कि आप कहां रहना चाहते हैं. लंदन में यह बहुत कठिन है, लेकिन यही समस्या पूरे इंग्लैंड में आती है: खरीदार उन कुछ जगहों में से चुनते हैं जिन्हें वे जानते हैं, फिर आवागमन टूल, Ofsted, पुलिस डेटा, Street View, ब्रॉडबैंड जांच और बेचे गए दामों को अलग-अलग टैब में मिलाते हैं.',
+ 'अधिकांश संपत्ति साइटें पूछती हैं कि आप कहां रहना चाहते हैं. लंदन में यह बहुत मुश्किल है, लेकिन यही समस्या पूरे इंग्लैंड में आती है: खरीदार उन कुछ जगहों में से चुनते हैं जिन्हें वे जानते हैं, फिर आवागमन साधन, Ofsted, पुलिस डेटा, Street View, ब्रॉडबैंड जांच और बेचे गए दामों को अलग-अलग टैब में मिलाते हैं.',
philosophyP2:
'Perfect Postcode खोज को उलट देता है. मानचित्र को बताएं कि क्या मायने रखता है और यह वे पोस्टकोड दिखाता है जो योग्य हैं, साथ में प्रमाण भी कि वे देखने लायक क्यों हैं. पहले डेटा, फिर माहौल खुद परखें.',
streetTitle: 'जगहें सड़क-दर-सड़क बदलती हैं',
@@ -977,16 +982,16 @@ const hi: Translations = {
streetCard2Title: 'मकान देखने से पहले समझौते समझें',
streetCard2Body:
'सप्ताहांत मकान देखने में बिताने से पहले कीमत, जगह, आवागमन, सुरक्षा, स्कूल, ब्रॉडबैंड, शोर और ऊर्जा रेटिंग की तुलना करें.',
- othersVs: 'दूसरे बनाम',
- checkMyPostcode: 'प्रॉपर्टी पोर्टल',
+ othersVs: 'अन्य बनाम',
+ checkMyPostcode: 'लिस्टिंग पोर्टल',
areaGuides: 'पोस्टकोड रिपोर्ट',
compSearchWithout: 'नाम जाने बिना क्षेत्र खोजें',
compSearchWithoutSub: '(पहले जरूरतें, बाद में स्थान)',
compAreaData: 'पोस्टकोड-स्तर पड़ोस प्रमाण',
compAreaDataSub: '(अपराध, स्कूल, शोर, ब्रॉडबैंड, सुविधाएं)',
compPropertyData: 'संपत्ति-स्तर इतिहास',
- compPropertyDataSub: '(बेची कीमतें, EPC, फर्श क्षेत्र, अनुमानित मूल्य)',
- compFilters: '56 फिल्टर साथ काम करते हुए',
+ compPropertyDataSub: '(बेची कीमतें, EPC, फर्श क्षेत्रफल, अनुमानित मूल्य)',
+ compFilters: '56 फ़िल्टर साथ काम करते हुए',
compFiltersSub: '(एक समय में केवल एक पोस्टकोड या एक लिस्टिंग नहीं)',
ctaTitle: 'कहां खरीदना है, इसका अनुमान लगाना बंद करें.',
ctaDescription:
@@ -996,15 +1001,15 @@ const hi: Translations = {
pricingPage: {
title: 'बेहतर खोज क्षेत्र के साथ खरीदें',
subtitle:
- 'उस मानचित्र का लाइफटाइम एक्सेस जो मकान देखने की बुकिंग से पहले यह पता लगाने में मदद करता है कि कहां देखना है.',
+ 'उस मानचित्र की आजीवन पहुँच जो मकान देखने की बुकिंग से पहले यह तय करने में मदद करता है कि कहां देखना है.',
costContext:
- 'खरीदार अक्सर शामें लिस्टिंग, आवागमन जांच, स्कूल रिपोर्ट, अपराध मानचित्र, Street View और बेचे गए दामों को जोड़ने में बिताते हैं. लंदन में यह लगातार होता है, लेकिन यही शोध-समस्या पूरे इंग्लैंड में दिखाई देती है. Perfect Postcode आपके सप्ताहांत, फीस और ध्यान लगाने से पहले क्षेत्र-शोध को एक मानचित्र पर रखता है.',
+ 'खरीदार अक्सर शामें लिस्टिंग, आवागमन जांच, स्कूल रिपोर्ट, अपराध मानचित्र, Street View और बेचे गए दामों को जोड़ने में बिताते हैं. लंदन में यह लगातार होता है, लेकिन यही शोध समस्या पूरे इंग्लैंड में दिखती है. Perfect Postcode आपके सप्ताहांत, फीस और ध्यान लगाने से पहले क्षेत्र शोध को एक मानचित्र पर रखता है.',
lessThanSurvey: 'एक मकान सर्वेक्षण से कम खर्च. आपके चुनावों को दिशा देने में कहीं अधिक असरदार.',
currentTier: 'मौजूदा स्तर',
firstNUsers: 'पहले {{count}} उपयोगकर्ता',
everyoneAfter: 'उसके बाद सभी',
nextNUsers: 'अगले {{count}} उपयोगकर्ता',
- lifetime: '/लाइफटाइम',
+ lifetime: '/आजीवन',
spotsRemaining: '{{count}} स्थान बाकी',
spotsRemainingPlural: '{{count}} स्थान बाकी',
filled: 'भरा हुआ',
@@ -1015,7 +1020,7 @@ const hi: Translations = {
soldOut: 'बिक गया',
upcoming: 'आने वाला',
failedToLoad: 'कीमतें लोड नहीं हो सकीं. कृपया बाद में फिर कोशिश करें.',
- feat1: 'इंग्लैंड भर में 56 फिल्टर',
+ feat1: 'इंग्लैंड भर में 56 फ़िल्टर',
feat2: 'आपकी जरूरतों से हर पोस्टकोड खोजने योग्य',
feat3: 'असीमित मानचित्र खोज, सहेजी गई खोजें और निर्यात',
feat4: '1.3 करोड़ ऐतिहासिक लेनदेन और कीमत संदर्भ',
@@ -1024,17 +1029,17 @@ const hi: Translations = {
},
learnPage: {
- faq: 'अक्सर पूछे जाने वाले प्रश्न',
+ faq: 'प्रश्नोत्तर',
dataSources: 'डेटा स्रोत',
articles: 'लेख',
support: 'सहायता',
dataSourcesIntro:
- 'यह एप्लिकेशन संपत्ति कीमतों, ऊर्जा प्रदर्शन, परिवहन, जनसांख्यिकी, अपराध, पर्यावरण और अधिक को कवर करने वाले {{count}} खुले डेटासेट को जोड़ता है.',
+ 'यह ऐप संपत्ति कीमतों, ऊर्जा प्रदर्शन, परिवहन, जनसांख्यिकी, अपराध, पर्यावरण और बहुत कुछ कवर करने वाले {{count}} खुले डेटासेट जोड़ता है.',
faqIntro:
'चाहे आप पहली बार खरीदारी की खोज संकरी कर रहे हों, किसी अनजान पोस्टकोड की जांच कर रहे हों या देखने के लिए चुने गए विकल्पों की सूची बना रहे हों, यहां बताया गया है कि Perfect Postcode आपको कहां देखना है यह तय करने में कैसे मदद करता है.',
articlesIntro:
- 'संपत्ति खोज, आवागमन, स्कूल, पोस्टकोड जांच, क्षेत्रीय तुलना, डेटा कवरेज, कार्यप्रणाली और गोपनीयता पर सार्वजनिक गाइड ब्राउज करें.',
- supportIntro: 'कोई सवाल है? हमारा FAQ देखें या सीधे संपर्क करें.',
+ 'संपत्ति खोज, आवागमन, स्कूल, पोस्टकोड जांच, क्षेत्रीय तुलना, डेटा कवरेज, कार्यप्रणाली और गोपनीयता पर सार्वजनिक गाइड देखें.',
+ supportIntro: 'कोई सवाल है? हमारे प्रश्नोत्तर देखें या सीधे संपर्क करें.',
source: 'स्रोत:',
optOut: 'सार्वजनिक प्रकटीकरण से बाहर निकलें',
attribution: 'श्रेय',
@@ -1053,11 +1058,11 @@ const hi: Translations = {
dsEpcName: 'ऊर्जा प्रदर्शन प्रमाणपत्र (EPC)',
dsEpcOrigin: 'Ministry of Housing, Communities & Local Government',
dsEpcUse:
- 'घरेलू ऊर्जा प्रदर्शन प्रमाणपत्र फर्श क्षेत्र, कमरों की संख्या, निर्माण वर्ष, ऊर्जा रेटिंग, संपत्ति प्रकार और निर्माण स्वरूप देते हैं. उन्हें हर पोस्टकोड के अंदर पते के आधार पर Price Paid रिकॉर्ड से मिलाया गया है. संपत्ति मालिक सार्वजनिक प्रकटीकरण से बाहर रहने का विकल्प चुन सकते हैं.',
+ 'घरेलू ऊर्जा प्रदर्शन प्रमाणपत्र फर्श क्षेत्रफल, कमरों की संख्या, निर्माण वर्ष, ऊर्जा रेटिंग, संपत्ति प्रकार और निर्माण स्वरूप देते हैं. उन्हें हर पोस्टकोड के अंदर पते के आधार पर Price Paid रिकॉर्ड से मिलाया गया है. संपत्ति मालिक सार्वजनिक प्रकटीकरण से बाहर रहने का विकल्प चुन सकते हैं.',
dsNsplName: 'राष्ट्रीय सांख्यिकी पोस्टकोड लुकअप (NSPL)',
dsNsplOrigin: 'ONS / ArcGIS',
dsNsplUse:
- 'पोस्टकोड को निर्देशांकों और सांख्यिकीय क्षेत्र कोड से जोड़ता है, जिससे सभी क्षेत्र-स्तरीय डेटासेट को अलग-अलग संपत्तियों से जोड़ा जाता है.',
+ 'पोस्टकोड को निर्देशांकों और सांख्यिकीय क्षेत्र कोड से जोड़ता है, ताकि सभी क्षेत्र-स्तरीय डेटासेट अलग-अलग संपत्तियों से जोड़े जा सकें.',
dsIodName: 'इंग्लैंड वंचना सूचकांक 2025',
dsIodOrigin: 'Ministry of Housing, Communities & Local Government',
dsIodUse:
@@ -1098,10 +1103,10 @@ const hi: Translations = {
dsNaptanOrigin: 'Department for Transport',
dsNaptanUse:
'इंग्लैंड भर में रेल, बस, मेट्रो/ट्राम, फेरी और हवाई अड्डों के स्टेशन और स्टॉप स्थान.',
- dsNoiseName: 'Defra शोर मैपिंग',
+ dsNoiseName: 'Defra शोर मानचित्रण',
dsNoiseOrigin: 'Defra / Environment Agency',
dsNoiseUse:
- '2022 की रणनीतिक शोर मैपिंग से सड़क शोर स्तर (24-घंटे भारित औसत), उच्च विभेदन पर मॉडल किए गए और हर पोस्टकोड पर नमूना लिए गए.',
+ '2022 के रणनीतिक शोर मानचित्रण से सड़क शोर स्तर (24-घंटे भारित औसत), उच्च विभेदन पर मॉडल किए गए और हर पोस्टकोड पर नमूना लिए गए.',
dsOfstedName: 'Ofsted स्कूल निरीक्षण',
dsOfstedOrigin: 'Ofsted',
dsOfstedUse:
@@ -1121,7 +1126,7 @@ const hi: Translations = {
dsElectionName: '2024 आम चुनाव परिणाम',
dsElectionOrigin: 'UK Parliament',
dsElectionUse:
- 'जुलाई 2024 के यूके आम चुनाव के उम्मीदवार-स्तर परिणाम. निर्वाचन क्षेत्र स्तर पर संकलित: मतदान प्रतिशत (%) और पार्टी वोट शेयर (%). NSPL पोस्टकोड लुकअप से संसदीय निर्वाचन क्षेत्र कोड (pcon) के जरिए संपत्तियों से जोड़ा गया.',
+ 'जुलाई 2024 के यूके आम चुनाव के उम्मीदवार-स्तर परिणाम. निर्वाचन क्षेत्र स्तर पर संकलित: मतदान प्रतिशत (%) और पार्टी मत हिस्सेदारी (%). NSPL पोस्टकोड लुकअप से संसदीय निर्वाचन क्षेत्र कोड (pcon) के जरिए संपत्तियों से जोड़ा गया.',
faqFindingTitle: 'कहां देखें',
faqCommuteTitle: 'यात्रा समय',
faqBudgetTitle: 'अनुमानित कीमतें',
@@ -1131,39 +1136,39 @@ const hi: Translations = {
faqDueDiligenceTitle: 'क्या जांचें',
faqPrivacyTitle: 'गोपनीयता',
faqWhyTitle: 'Perfect Postcode क्यों',
- faqPricingTitle: 'एक्सेस',
+ faqPricingTitle: 'पहुँच',
faqTipsTitle: 'मानचित्र टिप्स',
faqBehindDataTitle: 'डेटा के पीछे',
faqFinding1Q: 'जब स्पष्ट क्षेत्र बहुत महंगे हों तो मुझे कहां देखना चाहिए?',
faqFinding1A:
- 'जिन बातों पर आप समझौता नहीं कर सकते उनसे शुरू करें: बजट, घर का प्रकार, जगह, आवागमन, स्कूल, सुरक्षा, शोर, इंटरनेट, पार्क और बाकी जरूरी बातें. मानचित्र वे जगहें छिपा देता है जो फिट नहीं बैठतीं, ताकि लिस्टिंग देखने से पहले कम स्पष्ट विकल्प सामने आ सकें.',
+ 'जिन बातों पर आप समझौता नहीं कर सकते उनसे शुरू करें: बजट, घर का प्रकार, जगह, आवागमन, स्कूल, सुरक्षा, शोर, ब्रॉडबैंड, पार्क और बाकी जरूरी बातें. मानचित्र वे जगहें छिपा देता है जो फिट नहीं बैठतीं, ताकि लिस्टिंग देखने से पहले कम स्पष्ट विकल्प सामने आ सकें.',
faqFinding2Q: 'जिन जगहों को मैं अच्छी तरह नहीं जानता, वहां अच्छे पोस्टकोड कैसे खोजूं?',
faqFinding2A:
- 'पूरे मानचित्र पर अपनी जरूरी शर्तें लगाएं, फिर बचे हुए क्षेत्रों को करीब से देखें. आप अनजान पोस्टकोड की तुलना आवागमन, बेचे गए दाम, स्कूल, अपराध, इंटरनेट, शोर और पास की दुकानों या पार्कों से कर सकते हैं, सिर्फ प्रतिष्ठा से नहीं.',
+ 'पूरे मानचित्र पर अपनी जरूरी शर्तें लगाएं, फिर बचे हुए क्षेत्रों को करीब से देखें. आप अनजान पोस्टकोड की तुलना आवागमन, बेचे गए दाम, स्कूल, अपराध, ब्रॉडबैंड, शोर और पास की दुकानों या पार्कों से कर सकते हैं, सिर्फ प्रतिष्ठा से नहीं.',
faqFinding3Q: 'जब मेरी खोज बहुत ज्यादा या बहुत कम क्षेत्र लौटाए तो क्या करूं?',
faqFinding3A:
'अपनी जरूरी शर्तें रखें, फिर मानचित्र को उस एक चीज से रंगें जिसकी तुलना करनी है, जैसे प्रति वर्ग मी कीमत, सड़क शोर, स्कूल स्कोर या आवागमन समय. अगर लगभग कुछ नहीं बचता, एक स्लाइडर ढीला करें और देखें कौन सा बदलाव नए विकल्प खोलता है.',
faqCommute1Q: 'यात्रा समय कैसे गणना किए जाते हैं?',
faqCommute1A:
- 'यात्रा समय हर सहेजे गए गंतव्य के लिए पहले से निकाले जाते हैं. हम देखते हैं कि कौन से पोस्टकोड कार, साइकिल, पैदल या सार्वजनिक परिवहन से उस गंतव्य तक पहुंच सकते हैं, फिर परिणाम सहेजते हैं ताकि फिल्टर करते समय मानचित्र तेजी से जवाब दे.',
+ 'यात्रा समय हर सहेजे गए गंतव्य के लिए पहले से निकाले जाते हैं. हम देखते हैं कि कौन से पोस्टकोड कार, साइकिल, पैदल या सार्वजनिक परिवहन से उस गंतव्य तक पहुंच सकते हैं, फिर परिणाम सहेजते हैं ताकि फ़िल्टर करते समय मानचित्र तेजी से जवाब दे.',
faqCommute2Q: 'यात्रा-समय के आंकड़ों के बारे में क्या जानना चाहिए?',
faqCommute2A:
- 'सार्वजनिक परिवहन समय सप्ताह के दिन सुबह के आवागमन पर आधारित हैं, 07:30 से 08:30 के बीच निकलने पर. सामान्य सेटिंग उस समय की आम यात्रा दिखाती है. ये योजना बनाने के अनुमान हैं, लाइव देरी, ट्रैफिक या आखिरी समय के प्लेटफॉर्म बदलाव नहीं.',
+ 'सार्वजनिक परिवहन समय कार्यदिवस की सुबह के आवागमन पर आधारित हैं, 07:30 से 08:30 के बीच निकलने पर. सामान्य सेटिंग उस समय की आम यात्रा दिखाती है. ये योजना बनाने के अनुमान हैं; इनमें लाइव देरी, ट्रैफिक या आखिरी समय के प्लेटफॉर्म बदलाव शामिल नहीं हैं.',
faqCommute3Q: 'सर्वश्रेष्ठ स्थिति बटन कब उपयोग करें?',
faqCommute3A:
'सार्वजनिक परिवहन के लिए सर्वश्रेष्ठ स्थिति बटन तब उपयोग करें जब आप अच्छे समय और अच्छे कनेक्शन वाली यात्रा देखना चाहते हैं. रोजमर्रा की तुलना के लिए इसे बंद रखें.',
faqBudget1Q: 'आप मौजूदा संपत्ति कीमतों का अनुमान कैसे लगाते हैं?',
faqBudget1A:
- 'अनुमान घर की HM Land Registry में दर्ज आखिरी बिक्री कीमत से शुरू होता है. हम उसे आज के बाजार के करीब लाते हैं, यह देखकर कि इसी तरह के घरों की कीमत समय के साथ कैसे बदली है, खासकर पास के उसी प्रकार के घरों की. जहां स्थानीय बिक्री कम है, अनुमान बड़े क्षेत्र के रुझानों पर ज्यादा भरोसा करता है. फिर इसे पास की हाल की बिक्री और फर्श क्षेत्र से मिलाकर जांचा जाता है.',
+ 'अनुमान घर की HM Land Registry में दर्ज आखिरी बिक्री कीमत से शुरू होता है. हम उसे आज के बाजार के करीब लाते हैं, यह देखकर कि इसी तरह के घरों की कीमत समय के साथ कैसे बदली है, खासकर पास के उसी प्रकार के घरों की. जहां स्थानीय बिक्री कम है, अनुमान बड़े क्षेत्र के रुझानों पर ज्यादा भरोसा करता है. फिर इसे पास की हाल की बिक्री और फर्श क्षेत्रफल से मिलाकर जांचा जाता है.',
faqBudget2Q: 'अंतिम बिक्री कीमत के बजाय अनुमानित मौजूदा कीमत क्यों उपयोग करें?',
faqBudget2A:
'अंतिम बिक्री कीमत कई साल या दशकों पुरानी हो सकती है, जबकि मांग कीमतें केवल आज सूचीबद्ध घरों को दिखाती हैं. अनुमानित मौजूदा कीमत पुराने सौदों को आज के बाजार के करीब लाती है, ताकि आप अधिक घरों की तुलना कर सकें और बेहतर मूल्य वाले क्षेत्र पहचान सकें. इसे सूची बनाने की मार्गदर्शिका मानें, बैंक मूल्यांकन नहीं.',
faqSafety1Q: 'इस पोस्टकोड के आसपास किस तरह का अपराध आम है?',
faqSafety1A:
- 'पुलिस-रिकॉर्ड अपराध प्रकार के अनुसार बंटा होता है, जिसमें हिंसा, सेंधमारी, लूट, वाहन अपराध, असामाजिक व्यवहार, दुकान से चोरी, ड्रग्स और सार्वजनिक व्यवस्था शामिल हैं. आप अस्पष्ट सुरक्षा स्कोर पर निर्भर रहने के बजाय खास जोखिमों से फिल्टर कर सकते हैं.',
+ 'पुलिस-रिकॉर्ड अपराध प्रकार के अनुसार बंटा होता है, जिसमें हिंसा, सेंधमारी, लूट, वाहन अपराध, असामाजिक व्यवहार, दुकान से चोरी, ड्रग्स और सार्वजनिक व्यवस्था शामिल हैं. आप अस्पष्ट सुरक्षा स्कोर पर निर्भर रहने के बजाय खास जोखिमों से फ़िल्टर कर सकते हैं.',
faqSafety2Q: 'किसी अनजान सड़क पर मकान देखने से पहले क्या जांचना चाहिए?',
faqSafety2A:
- 'मकान देखने की बुकिंग से पहले अपराध, सड़क शोर, इंटरनेट, पार्क, किराना, स्कूल और आवागमन जांचें. लिस्टिंग फोटो उपयोगी हो सकती हैं, पर सड़क कैसी है यह पहली बार उनसे नहीं पता चलना चाहिए.',
+ 'मकान देखने की बुकिंग से पहले अपराध, सड़क शोर, ब्रॉडबैंड, पार्क, किराना, स्कूल और आवागमन जांचें. लिस्टिंग फोटो उपयोगी हो सकती हैं, पर सड़क कैसी है यह पहली बार उनसे नहीं पता चलना चाहिए.',
faqFamilies1Q: 'किन क्षेत्रों में स्कूल, जगह, सुरक्षा और आवागमन का सही मिश्रण है?',
faqFamilies1A:
'स्कूल रेटिंग, अपराध, पार्क, आवागमन, जगह, घर का प्रकार और बजट को एक मानचित्र पर रखें. परिणाम अलग-अलग स्कूल, अपराध, लिस्टिंग और परिवहन खोजों के ढेर के बजाय व्यावहारिक पारिवारिक सूची है.',
@@ -1172,19 +1177,19 @@ const hi: Translations = {
'नहीं. हम नजदीकी स्कूल गुणवत्ता और स्थानीय शिक्षा जानकारी दिखाते हैं, लेकिन प्रवेश सीमाएं और प्राथमिकता नियम बदल सकते हैं. Perfect Postcode से जगहें चुनें, फिर स्कूल या स्थानीय काउंसिल से प्रवेश क्षेत्र और दाखिला नियम जांचें.',
faqEnv1Q: 'आवागमन या ब्रॉडबैंड गुणवत्ता खोए बिना शोरगुल वाली सड़क से कैसे बचूं?',
faqEnv1A:
- 'सड़क शोर से फिल्टर करें, फिर आवागमन, इंटरनेट, कीमत और घर के फिल्टर चालू रखें. आप एक फीचर से मानचित्र रंग सकते हैं जबकि बाकी चुनी हुई सूची को उपयोगी बनाए रखते हैं.',
+ 'सड़क शोर से फ़िल्टर करें, फिर आवागमन, ब्रॉडबैंड, कीमत और घर के फ़िल्टर चालू रखें. आप एक सुविधा से मानचित्र रंग सकते हैं जबकि बाकी चुनी हुई सूची को उपयोगी बनाए रखते हैं.',
faqEnv2Q: 'क्या आप बाढ़ जोखिम, धंसाव या सर्वेक्षण समस्याएं दिखाते हैं?',
faqEnv2A:
'अभी नहीं. हम सड़क शोर, ऊर्जा रेटिंग, निर्माण आयु और पोस्टकोड के आसपास का स्थानीय वातावरण दिखाते हैं. बाढ़ जोखिम, कानूनी मुद्दे, संरचनात्मक समस्याएं, बंधक संबंधी चिंताएं और सर्वेक्षण निष्कर्ष खरीदने से पहले अलग से जांचने होंगे.',
faqEnv3Q: 'मकान देखने से पहले चालू खर्च की कौन सी जांच कर सकता हूं?',
faqEnv3A:
- 'आप मकान देखने से पहले ऊर्जा रेटिंग, फर्श क्षेत्र, निर्माण आयु, काउंसिल टैक्स क्षेत्र, इंटरनेट और शोर देख सकते हैं. यह आपके सटीक बिलों की भविष्यवाणी नहीं करेगा, पर साफ तौर पर गलत विकल्पों से जल्दी बचने में मदद करेगा.',
+ 'आप मकान देखने से पहले ऊर्जा रेटिंग, फर्श क्षेत्रफल, निर्माण आयु, काउंसिल टैक्स क्षेत्र, ब्रॉडबैंड और शोर देख सकते हैं. यह आपके सटीक बिलों की भविष्यवाणी नहीं करेगा, पर साफ तौर पर गलत विकल्पों से जल्दी बचने में मदद करेगा.',
faqDueDiligence1Q: 'क्या मुझे Rightmove देखने से पहले या बाद में इसका उपयोग करना चाहिए?',
faqDueDiligence1A:
'Perfect Postcode का उपयोग लिस्टिंग साइटों से पहले और साथ-साथ करें. Rightmove, Zoopla और OnTheMarket अभी भी अभी बिक रहे घर, फोटो, एजेंट, मकान देखने और अलर्ट देखने की जगह हैं. Perfect Postcode आपको तय करने में मदद करता है कि किन पोस्टकोड में खोज करनी है.',
- faqDueDiligence2Q: 'मैं बगीचे, गैरेज या लेआउट से फिल्टर क्यों नहीं कर सकता?',
+ faqDueDiligence2Q: 'मैं बगीचे, गैरेज या लेआउट से फ़िल्टर क्यों नहीं कर सकता?',
faqDueDiligence2A:
- 'ये विवरण हर घर के लिए भरोसेमंद तरीके से उपलब्ध नहीं होते. Perfect Postcode फर्श क्षेत्र, घर का प्रकार, मालिकाना प्रकार, ऊर्जा रेटिंग, बेची कीमतें और स्थानीय जानकारी से फिल्टर कर सकता है. बगीचे, गैरेज, दिशा, कमरे और एजेंट की भाषा अभी भी लिस्टिंग और मकान देखने में जांचनी होगी.',
+ 'ये विवरण हर घर के लिए भरोसेमंद तरीके से उपलब्ध नहीं होते. Perfect Postcode फर्श क्षेत्रफल, घर का प्रकार, स्वामित्व प्रकार, ऊर्जा रेटिंग, बेची कीमतें और स्थानीय जानकारी से फ़िल्टर कर सकता है. बगीचे, गैरेज, दिशा, कमरों का लेआउट और एजेंट की भाषा अभी भी लिस्टिंग और मकान देखने में जांचनी होगी.',
faqDueDiligence3Q: 'क्या आप लिस्टिंग की कीमत कटौती और बाजार में बिताया समय ट्रैक करते हैं?',
faqDueDiligence3A:
'अभी नहीं. Perfect Postcode बेची कीमतों, ऊर्जा रेटिंग, पोस्टकोड डेटा, यात्रा समय और पड़ोस जानकारी पर बना है, लाइव लिस्टिंग बदलाव पर नहीं. आप फिर भी बिक्री इतिहास, अनुमानित मौजूदा मूल्य और प्रति वर्ग मीटर कीमत से अंदाजा लगा सकते हैं कि मांग कीमत ज्यादा तो नहीं लगती.',
@@ -1193,34 +1198,34 @@ const hi: Translations = {
'क्षेत्र और संभावित मूल्य जांचने के लिए Perfect Postcode उपयोग करें, फिर प्रस्ताव देने से पहले लिस्टिंग विवरण पुष्टि करें. मालिकाना प्रकार, लीज विवरण, सेवा शुल्क, योजना इतिहास, बाढ़ जोखिम, कानूनी मुद्दे, बंधक संबंधी शर्तें और सर्वेक्षण परिणाम भी जांचें.',
faqPrivacy1Q: 'क्या आप मेरे बारे में व्यक्तिगत डेटा संग्रहीत करते हैं?',
faqPrivacy1A:
- 'संपत्ति और पड़ोस जानकारी में आपके व्यक्तिगत विवरण नहीं होते. अगर आप खाता बनाते हैं, तो हम सेवा चलाने के लिए जरूरी चीजें रखते हैं, जैसे ईमेल पता, एक्सेस स्थिति, न्यूज़लेटर चयन, सहेजी गई खोजें, साझा लिंक और Stripe द्वारा संभाले गए भुगतान रिकॉर्ड. खाते का डेटा यूके गोपनीयता कानून के तहत संभाला जाता है.',
+ 'संपत्ति और पड़ोस जानकारी में आपके व्यक्तिगत विवरण नहीं होते. अगर आप खाता बनाते हैं, तो हम सेवा चलाने के लिए जरूरी चीजें रखते हैं, जैसे ईमेल पता, पहुँच स्थिति, न्यूज़लेटर चयन, सहेजी गई खोजें, साझा लिंक और Stripe द्वारा संभाले गए भुगतान रिकॉर्ड. खाते का डेटा यूके गोपनीयता कानून के तहत संभाला जाता है.',
faqWhy1Q: 'यह क्या दिखाता है जो लिस्टिंग पोर्टल आमतौर पर नहीं दिखाते?',
faqWhy1A:
- 'लिस्टिंग साइटें आज बिक रहे घरों से शुरू करती हैं. Perfect Postcode उन जगहों से शुरू करता है जो आपके जीवन और बजट से मेल खाती हैं, बेची कीमतों, जगह, आवागमन, स्कूल, अपराध, शोर, इंटरनेट, ऊर्जा रेटिंग, मालिकाना प्रकार और सुविधाओं के साथ, लिस्टिंग खोलने से पहले.',
+ 'लिस्टिंग साइटें आज बिक्री पर मौजूद घरों से शुरू करती हैं. Perfect Postcode उन जगहों से शुरू करता है जो आपके जीवन और बजट से मेल खाती हैं, और लिस्टिंग खोलने से पहले बेची कीमतें, जगह, आवागमन, स्कूल, अपराध, शोर, ब्रॉडबैंड, ऊर्जा रेटिंग, स्वामित्व प्रकार और स्थानीय सुविधाएं दिखाता है.',
faqWhy2Q: 'यह हाथ से की जाने वाली कितनी खोजबीन बचाता है?',
faqWhy2A:
- 'आप खुद कर सकते हैं, लेकिन तब बेची कीमतें, ऊर्जा रेटिंग, अपराध, स्कूल, इंटरनेट, स्थानीय तथ्य, पर्यावरण, यात्रा समय और मानचित्रों को एक-एक पोस्टकोड से जांचना होगा. Perfect Postcode इन्हें इंग्लैंड के खोज योग्य मानचित्र में साथ रखता है.',
+ 'आप खुद कर सकते हैं, लेकिन तब बेची कीमतें, ऊर्जा रेटिंग, अपराध, स्कूल, ब्रॉडबैंड, स्थानीय तथ्य, पर्यावरण, यात्रा समय और मानचित्रों को एक-एक पोस्टकोड से जांचना होगा. Perfect Postcode इन्हें इंग्लैंड के खोज योग्य मानचित्र में साथ रखता है.',
faqWhy3Q: 'डेटा कितना भरोसेमंद है?',
faqWhy3A:
- 'मुख्य स्रोत आधिकारिक या व्यापक रूप से उपयोग किए जाने वाले सार्वजनिक डेटा हैं: बेची कीमतें, ऊर्जा रेटिंग, स्थानीय तथ्य, स्कूल रेटिंग, इंटरनेट, अपराध, पर्यावरण, मानचित्र और सड़क डेटा. ये सूची बनाने और तुलना के लिए उपयोगी हैं, लेकिन खरीद निर्णय से पहले वर्तमान जांच और जरूरत हो तो विशेषज्ञ सलाह जरूरी है.',
+ 'मुख्य स्रोत आधिकारिक या व्यापक रूप से उपयोग किए जाने वाले सार्वजनिक डेटा हैं: बेची कीमतें, ऊर्जा रेटिंग, स्थानीय तथ्य, स्कूल रेटिंग, ब्रॉडबैंड, अपराध, पर्यावरण, मानचित्र और सड़क डेटा. ये शॉर्टलिस्ट और तुलना के लिए उपयोगी हैं, लेकिन खरीद निर्णय से पहले मौजूदा जांच और जरूरत हो तो विशेषज्ञ सलाह जरूरी है.',
faqPricing1Q: 'जब पोस्टकोड रिपोर्ट मुफ्त हैं तो भुगतान क्यों करें?',
faqPricing1A:
- 'मुफ्त पोस्टकोड टूल तब उपयोगी हैं जब आप पहले से जानते हैं कि क्या जांचना है. Perfect Postcode इंग्लैंड के हर पोस्टकोड को आपकी जरूरतों के हिसाब से देखने, फिल्टर जोड़ने, विकल्पों की तुलना करने, खोजें सहेजने और मकान देखने से पहले सूची निर्यात करने के लिए है.',
+ 'मुफ्त पोस्टकोड साधन तब उपयोगी हैं जब आप पहले से जानते हैं कि क्या जांचना है. Perfect Postcode इंग्लैंड के हर पोस्टकोड को आपकी जरूरतों के हिसाब से देखने, फ़िल्टर जोड़ने, विकल्पों की तुलना करने, खोजें सहेजने और मकान देखने से पहले शॉर्टलिस्ट निर्यात करने के लिए है.',
faqPricing2Q: 'आजीवन पहुंच का क्या मतलब है?',
faqPricing2A:
- 'आजीवन पहुंच का मतलब है कि एक भुगतान आपके खाते को सेवा की अवधि तक सशुल्क Perfect Postcode मानचित्र का लगातार एक्सेस देता है. यह मासिक या वार्षिक सदस्यता नहीं है, और सामान्य डेटा अपडेट शामिल हैं. आप इसे इस खोज में उपयोग कर सकते हैं, बाद में लौट सकते हैं और फिर भी एक्सेस रहेगा अगर आप फिर स्थान बदलते हैं.',
+ 'आजीवन पहुँच का मतलब है कि एक भुगतान आपके खाते को सेवा चलने तक सशुल्क Perfect Postcode मानचित्र की लगातार पहुँच देता है. यह मासिक या वार्षिक सदस्यता नहीं है, और सामान्य डेटा अपडेट शामिल हैं. आप इसे इस खोज में उपयोग कर सकते हैं, बाद में लौट सकते हैं और फिर स्थान बदलने पर भी पहुँच रहेगी.',
faqPricing3Q: 'मुफ्त स्तर पर मैं क्या उपयोग कर सकता हूं?',
faqPricing3A:
- 'मुफ्त उपयोगकर्ता डेमो क्षेत्र (इनर लंदन, लगभग जोन 1 से 2) के अंदर सभी फीचर देख सकते हैं. इंग्लैंड के बाकी डेटा के लिए आजीवन पहुंच चाहिए.',
- faqTips1Q: 'मानचित्र पर फिल्टर पूर्वावलोकन कैसे करें?',
+ 'मुफ्त उपयोगकर्ता डेमो क्षेत्र (इनर लंदन, लगभग जोन 1 से 2) के अंदर सभी सुविधाएं देख सकते हैं. इंग्लैंड के बाकी डेटा के लिए आजीवन पहुँच चाहिए.',
+ faqTips1Q: 'मानचित्र पर फ़िल्टर पूर्वावलोकन कैसे करें?',
faqTips1A:
- 'किसी फिल्टर या फीचर के पास रंगें पर क्लिक करें ताकि मानचित्र उसी मद से रंग जाए. आपके सक्रिय फिल्टर वैसे ही रहते हैं, इसलिए आप कीमत, आवागमन समय, स्कूल, अपराध या शोर जैसी एक चीज सूची बदले बिना तुलना कर सकते हैं.',
- faqTips2Q: 'किसी फिल्टर का मतलब कैसे जानूं?',
+ 'किसी फ़िल्टर या सुविधा के पास रंगें पर क्लिक करें ताकि मानचित्र उसी मद से रंग जाए. आपके सक्रिय फ़िल्टर वैसे ही रहते हैं, इसलिए आप कीमत, आवागमन समय, स्कूल, अपराध या शोर जैसी एक चीज सूची बदले बिना तुलना कर सकते हैं.',
+ faqTips2Q: 'किसी फ़िल्टर का मतलब कैसे जानूं?',
faqTips2A:
- 'किसी फिल्टर या फीचर के पास जानकारी पर क्लिक करें ताकि छोटा स्पष्टीकरण खुले कि उसका मतलब क्या है और उसे कैसे पढ़ें. मानचित्र के कुछ हिस्सों, जैसे यात्रा-समय कार्ड, की अपनी डेटा जानकारी भी होती है.',
+ 'किसी फ़िल्टर या सुविधा के पास जानकारी पर क्लिक करें ताकि छोटा स्पष्टीकरण खुले कि उसका मतलब क्या है और उसे कैसे पढ़ें. मानचित्र के कुछ हिस्सों, जैसे यात्रा-समय कार्ड, की अपनी डेटा जानकारी भी होती है.',
faqTips3Q: 'मानचित्र के रंग कैसे ताज़ा करें?',
faqTips3A:
- 'जब कोई फीचर मानचित्र को रंग रहा हो, तो मानचित्र संकेतक में रंग स्केल रीसेट करें उपयोग करें ताकि अभी दिख रहे परिणामों के रंग ताज़ा हों. मानचित्र खिसकाने, ज़ूम करने या फिल्टर बदलने के बाद यह उपयोगी है.',
+ 'जब कोई सुविधा मानचित्र को रंग रही हो, तो मानचित्र संकेतक में रंग स्केल रीसेट करें उपयोग करें ताकि अभी दिख रहे परिणामों के रंग ताजा हों. मानचित्र खिसकाने, ज़ूम करने या फ़िल्टर बदलने के बाद यह उपयोगी है.',
// FAQ items — Behind The Data
faqBehindData1Q: 'कभी-कभी एयरपोर्ट आसपास की सड़कों से शांत क्यों दिखता है?',
@@ -1228,19 +1233,19 @@ const hi: Translations = {
'किसी पोस्टकोड के लिए दिखाया गया शोर स्तर Defra के तीन स्रोतों — सड़क, रेल और विमान — में से सबसे ऊँचा होता है, जो ज़मीन से 4 मीटर ऊपर 24-घंटे के भारित औसत (Lden) के रूप में मॉडल किया जाता है. व्यस्त आवासीय सड़क पर सड़क शोर हावी रहता है, आमतौर पर 65–75 dB. एयरपोर्ट की सीमा के भीतर कोई बड़ी सार्वजनिक सड़कें नहीं होतीं, इसलिए सड़क घटक गिर जाता है और केवल विमान औसत बचता है. उदाहरण के लिए, London City Airport में कर्फ्यू है और सीमित उड़ानें हैं, इसलिए इसका 24-घंटे विमान Lden मध्यम रहता है (रनवे पर लगभग 60–66 dB) — और एयरपोर्ट का भीतरी हिस्सा उसके आसपास की A-सड़कों से शांत दिखता है. यही प्रभाव Heathrow में भी दिखाई देता है. यह आवासीय रिसेप्टर ऊँचाई पर परिवहन शोर मापने का वास्तविक परिणाम है, बग नहीं.',
faqBehindData2Q: 'एयरपोर्ट, हाईवे या पार्क एक बड़े आकार के रूप में क्यों दिखता है?',
faqBehindData2A:
- 'यूके में पोस्टकोड्स की आधिकारिक सीमाएँ नहीं होतीं — Royal Mail पोस्टकोड को डिलीवरी पतों की सूची के रूप में परिभाषित करता है, क्षेत्र के रूप में नहीं. Perfect Postcode प्रत्येक पते को आसपास की भूमि का उसका हिस्सा देकर बहुभुजों का संश्लेषण करता है. बिना पतों वाली जगहों (रनवे, हाईवे लेन, पार्क, जलाशय) को निकटतम आवासीय पोस्टकोड भर देता है. इसलिए एयरपोर्ट या खुला क्षेत्र अक्सर एकल बड़े बहुभुज के रूप में दिखता है, और उसका मान सीमा के भीतर मौजूद कुछ पोस्टकोड्स से आता है.',
- faqBehindData3Q: 'पास के पोस्टकोड्स में अपराध संख्या समान क्यों होती है?',
+ 'यूके में पोस्टकोड की आधिकारिक सीमाएँ नहीं होतीं — Royal Mail पोस्टकोड को डिलीवरी पतों की सूची के रूप में परिभाषित करता है, क्षेत्र के रूप में नहीं. Perfect Postcode प्रत्येक पते को आसपास की भूमि का हिस्सा देकर बहुभुज बनाता है. बिना पतों वाली जगहें (रनवे, मोटरवे कैरिजवे, पार्क, जलाशय) निकटतम आवासीय पोस्टकोड में शामिल हो जाती हैं. इसलिए एयरपोर्ट या खुला क्षेत्र अक्सर कई छोटे आकारों के बजाय एक बड़े बहुभुज की तरह दिखता है, और उसका मान सीमा के भीतर मौजूद कुछ पोस्टकोड से आता है.',
+ faqBehindData3Q: 'पास के पोस्टकोड में अपराध संख्या समान क्यों होती है?',
faqBehindData3A:
- 'पुलिस द्वारा दर्ज सड़क-स्तरीय अपराध डेटा LSOA स्तर पर प्रकाशित होता है — लगभग 1,500 निवासियों वाले छोटे पड़ोस क्षेत्र. एक ही LSOA के सभी पोस्टकोड्स को समान वार्षिक संख्याएँ मिलती हैं, इसलिए एक शांत आवासीय सड़क और एक ब्लॉक दूर मुख्य सड़क समान आँकड़े दिखा सकती हैं अगर वे सीमा के एक ही ओर हों. अस्पतालों, विश्वविद्यालय परिसरों या औद्योगिक क्षेत्रों को कवर करने वाले पोस्टकोड्स में प्रति-व्यक्ति दर असामान्य रूप से ऊँची लग सकती है, क्योंकि वहाँ घटनाएँ सामान्य रूप से दर्ज होती हैं पर कागज़ पर निवासी कम होते हैं.',
+ 'पुलिस द्वारा दर्ज सड़क-स्तरीय अपराध डेटा LSOA स्तर पर प्रकाशित होता है — लगभग 1,500 निवासियों वाले छोटे पड़ोस क्षेत्र. एक ही LSOA के सभी पोस्टकोड को समान वार्षिक संख्याएँ मिलती हैं, इसलिए एक शांत आवासीय सड़क और एक ब्लॉक दूर मुख्य सड़क समान आँकड़े दिखा सकती हैं अगर वे सीमा के एक ही ओर हों. अस्पतालों, विश्वविद्यालय परिसरों या औद्योगिक क्षेत्रों को कवर करने वाले पोस्टकोड में प्रति-व्यक्ति दर असामान्य रूप से ऊँची लग सकती है, क्योंकि वहाँ घटनाएँ सामान्य रूप से दर्ज होती हैं पर कागज़ पर निवासी कम होते हैं.',
faqBehindData4Q: '"2 किमी के भीतर अच्छे स्कूल" का मतलब क्या मेरा बच्चा वहाँ जा सकता है?',
faqBehindData4A:
- 'नहीं. यह गणना उन सरकारी स्कूलों को खोजती है जिनका अपना पोस्टकोड आपके पोस्टकोड के केंद्र के चारों ओर एक वृत्त के भीतर आता है. कैचमेंट क्षेत्र, धार्मिक या चयन मानदंड, भाई-बहन प्राथमिकता और प्रवेश नियम मॉडल नहीं किए जाते — पास का अच्छा या उत्कृष्ट स्कूल आपके पते से अप्राप्य भी हो सकता है. क्षेत्रों की तुलना के लिए इस संख्या का उपयोग करें, फिर निर्णय से पहले स्कूल या स्थानीय प्राधिकरण से वास्तविक प्रवेश की पुष्टि करें.',
+ 'नहीं. यह गणना उन सरकारी स्कूलों को खोजती है जिनका अपना पोस्टकोड आपके पोस्टकोड के केंद्र के चारों ओर एक वृत्त के भीतर आता है. प्रवेश क्षेत्र, धार्मिक या चयन मानदंड, भाई-बहन प्राथमिकता और दाखिला नियम मॉडल नहीं किए जाते — पास का अच्छा या उत्कृष्ट स्कूल आपके पते से पहुंच से बाहर भी हो सकता है. क्षेत्रों की तुलना के लिए इस संख्या का उपयोग करें, फिर निर्णय से पहले स्कूल या स्थानीय प्राधिकरण से वास्तविक दाखिले की पुष्टि करें.',
faqBehindData5Q: 'जब हर घर में फ़ाइबर नहीं है, तो पोस्टकोड "Gigabit" क्यों दिखाता है?',
faqBehindData5A:
- 'Ofcom Connected Nations का ब्रॉडबैंड कवरेज प्रति पोस्टकोड उस प्रतिशत के रूप में दिया जाता है जो प्रत्येक गति स्तर प्राप्त कर सकते हैं. हम किसी भी उपलब्धता वाले सर्वोच्च स्तर को दिखाते हैं, इसलिए जिस पोस्टकोड में सिर्फ एक घर Gigabit प्राप्त कर सकता है वह "Gigabit उपलब्ध" दिखाता है. "क्या इस सड़क पर बिल्कुल फ़ाइबर है?" का यह सही उत्तर है, पर इसकी गारंटी नहीं कि ब्लॉक के हर फ्लैट को आज ऑर्डर किया जा सके. हस्ताक्षर से पहले अपने सटीक पते के लिए हमेशा प्रदाताओं से जाँच करें.',
+ 'Ofcom Connected Nations का ब्रॉडबैंड कवरेज प्रति पोस्टकोड इस प्रतिशत के रूप में दिया जाता है कि कितने परिसर हर गति स्तर पा सकते हैं. हम किसी भी उपलब्धता वाला सर्वोच्च स्तर दिखाते हैं, इसलिए जिस पोस्टकोड में सिर्फ एक घर Gigabit पा सकता है वह "Gigabit उपलब्ध" दिखाता है. "क्या इस सड़क पर कहीं भी फुल-फ़ाइबर है?" के लिए यह सही उत्तर है, पर इससे यह गारंटी नहीं मिलती कि ब्लॉक के हर फ्लैट में आज सेवा लगवाई जा सकती है. अनुबंध करने से पहले अपने सटीक पते के लिए हमेशा प्रदाताओं से जाँच करें.',
faqBehindData6Q: 'सार्वजनिक परिवहन के समय शाम या सप्ताहांत में क्यों नहीं बदलते?',
faqBehindData6A:
- 'परिवहन समय प्रति गंतव्य एक मंगलवार सुबह की प्रस्थान विंडो (07:30–08:30) के लिए पूर्ण GTFS समय-सारणी से एक बार गणित किए जाते हैं. "सामान्य" मान उस विंडो में यात्राओं का माध्यिका है, और "सर्वोत्तम केस" 5वाँ प्रतिशतक है. ऑफ-पीक, देर रात और सप्ताहांत सेवाएँ मॉडल नहीं की गईं, इसलिए केवल पीक-समय बस वाला पोस्टकोड भी मानचित्र पर अच्छा-कनेक्टेड दिख सकता है. इन्हें कार्यदिवस यात्रा अनुमान के रूप में लें, पूरे दिन के औसत के रूप में नहीं.',
+ 'परिवहन समय हर गंतव्य के लिए मंगलवार सुबह की प्रस्थान अवधि (07:30–08:30) में पूर्ण GTFS समय-सारिणी से एक बार गणना किए जाते हैं. "सामान्य" मान उस अवधि की यात्राओं की मध्यिका है, और "सर्वश्रेष्ठ स्थिति" 5वाँ प्रतिशतक है. ऑफ-पीक, देर रात और सप्ताहांत सेवाएँ मॉडल नहीं की गईं, इसलिए केवल पीक-समय बस वाला पोस्टकोड भी मानचित्र पर परिवहन-अनुकूल दिख सकता है. इन्हें कार्यदिवस आवागमन का अनुमान मानें, पूरे दिन का औसत नहीं.',
},
accountPage: {
@@ -1261,7 +1266,7 @@ const hi: Translations = {
searches: 'खोजें',
noSavedSearches: 'अभी कोई सहेजी गई खोज नहीं',
noSavedSearchesDesc:
- 'अपने फिल्टर और मानचित्र दृश्य सहेजें ताकि आप ठीक वहीं से फिर शुरू कर सकें जहां छोड़ा था.',
+ 'अपने फ़िल्टर और मानचित्र दृश्य सहेजें ताकि आप ठीक वहीं से फिर शुरू कर सकें जहां छोड़ा था.',
clickToRename: 'नाम बदलने के लिए क्लिक करें',
notesPlaceholder: 'अपने विचार लिखें...',
deleteSearch: 'खोज हटाएं',
@@ -1292,25 +1297,25 @@ const hi: Translations = {
invitePage: {
youreInvited: 'आप आमंत्रित हैं!',
specialOffer: 'विशेष ऑफर!',
- invitedByFree: '{{name}} ने आपको मुफ्त लाइफटाइम एक्सेस लेने के लिए आमंत्रित किया है.',
- invitedByDiscount: '{{name}} ने लाइफटाइम एक्सेस पर 30% छूट साझा की है.',
- genericFreeInvite: 'आपको मुफ्त लाइफटाइम एक्सेस लेने के लिए आमंत्रित किया गया है.',
- genericDiscount: 'किसी दोस्त ने लाइफटाइम एक्सेस पर 30% छूट साझा की है.',
+ invitedByFree: '{{name}} ने आपको मुफ्त आजीवन पहुँच लेने के लिए आमंत्रित किया है.',
+ invitedByDiscount: '{{name}} ने आजीवन पहुँच पर 30% छूट साझा की है.',
+ genericFreeInvite: 'आपको मुफ्त आजीवन पहुँच लेने के लिए आमंत्रित किया गया है.',
+ genericDiscount: 'किसी दोस्त ने आजीवन पहुँच पर 30% छूट साझा की है.',
exploreEvery: 'वे पोस्टकोड खोजें जो आपकी जिंदगी से मेल खाते हैं',
- propertyInfo: 'कीमतें, आवागमन, स्कूल, अपराध, शोर, ब्रॉडबैंड, EPC और अधिक',
+ propertyInfo: 'कीमतें, आवागमन, स्कूल, अपराध, शोर, ब्रॉडबैंड, EPC और बहुत कुछ',
invalidInvite: 'अमान्य आमंत्रण',
inviteAlreadyUsed: 'आमंत्रण पहले ही उपयोग हो चुका है',
inviteAlreadyUsedDesc: 'यह आमंत्रण लिंक पहले ही भुनाया जा चुका है.',
invalidInviteLink: 'अमान्य आमंत्रण लिंक',
invalidInviteLinkDesc: 'यह आमंत्रण लिंक अमान्य है या समाप्त हो चुका है.',
licenseActivated: 'लाइसेंस सक्रिय हो गया!',
- fullAccessGranted: 'अब आपके पास Perfect Postcode का पूरा एक्सेस है.',
+ fullAccessGranted: 'अब आपके पास Perfect Postcode की पूरी पहुँच है.',
activating: 'सक्रिय किया जा रहा है...',
activateLicense: 'लाइसेंस सक्रिय करें',
claimDiscount: 'छूट लें',
- registerToClaim: 'लेने के लिए रजिस्टर करें',
+ registerToClaim: 'लेने के लिए पंजीकरण करें',
youAlreadyHaveLicense: 'आपके पास पहले से लाइसेंस है',
- accountHasFullAccess: 'आपके खाते में पहले से पूरा एक्सेस है.',
+ accountHasFullAccess: 'आपके खाते में पहले से पूरी पहुँच है.',
failedToValidate: 'आमंत्रण लिंक सत्यापित नहीं हो सका',
},
@@ -1319,15 +1324,15 @@ const hi: Translations = {
minutesAgo: '{{count}} मिनट पहले',
hoursAgo: '{{count}} घंटे पहले',
daysAgo: '{{count}} दिन पहले',
- nFilters: '{{count}} फिल्टर',
- noFilters: 'कोई फिल्टर नहीं',
- poiCategory: '{{count}} POI श्रेणी',
- poiCategories: '{{count}} POI श्रेणियां',
+ nFilters: '{{count}} फ़िल्टर',
+ noFilters: 'कोई फ़िल्टर नहीं',
+ poiCategory: '{{count}} रुचि-स्थल श्रेणी',
+ poiCategories: '{{count}} रुचि-स्थल श्रेणियां',
travelDestination: '{{count}} यात्रा-समय गंतव्य',
travelDestinations: '{{count}} यात्रा-समय गंतव्य',
propertiesMatch: '{{count}} संपत्तियां मेल खाती हैं',
- setFilters: '{{count}} फिल्टर सेट करें: {{list}}',
- noFiltersSet: 'कोई फिल्टर सेट नहीं',
+ setFilters: '{{count}} फ़िल्टर सेट करें: {{list}}',
+ noFiltersSet: 'कोई फ़िल्टर सेट नहीं',
toDestination: '{{mode}} से {{label}} तक {{bounds}}',
lessThanMin: '< {{max}} मिनट',
moreThanMin: '> {{min}} मिनट',
@@ -1336,10 +1341,10 @@ const hi: Translations = {
tutorial: {
step1Title: 'मानचित्र को बताएं क्या मायने रखता है',
step1Content:
- 'अपना बजट, आवागमन सीमा, स्कूल गुणवत्ता, अपराध सीमा, शोर सहनशीलता, ब्रॉडबैंड जरूरतें या जो भी आपके लिए मायने रखता है सेट करें. केवल मेल खाते क्षेत्र रोशन रहते हैं. किसी भी फीचर से रंगने के लिए आंख वाले आइकन का उपयोग करें.',
+ 'अपना बजट, आवागमन सीमा, स्कूल गुणवत्ता, अपराध सीमा, शोर सहनशीलता, ब्रॉडबैंड जरूरतें या जो भी आपके लिए मायने रखता है सेट करें. केवल मेल खाते क्षेत्र रोशन रहते हैं. किसी भी सुविधा से रंगने के लिए रंग विकल्प का उपयोग करें.',
step2Title: 'या बस वर्णन करें',
step2Content:
- 'साधारण भाषा में लिखें, जैसे "अच्छे स्कूलों के पास शांत इलाका £400,000 से कम", और हम आपके लिए फिल्टर सेट कर देंगे.',
+ 'साधारण भाषा में लिखें, जैसे "अच्छे स्कूलों के पास शांत इलाका £400,000 से कम", और हम आपके लिए फ़िल्टर सेट कर देंगे.',
step3Title: 'देखें क्या उपलब्ध है',
step3Content:
'इंग्लैंड भर में पैन और जूम करें. किसी भी रंगीन क्षेत्र पर क्लिक करें और देखें यह क्यों मेल खाता है: अपराध, स्कूल, कीमतें, ब्रॉडबैंड, शोर और अधिक.',
@@ -1347,7 +1352,7 @@ const hi: Translations = {
step4Content: 'सीधे वहां जाने के लिए कोई भी जगह या पोस्टकोड खोजें.',
step5Title: 'विवरण में जाएं',
step5Content:
- 'क्षेत्रीय आंकड़े, हिस्टोग्राम और अलग-अलग संपत्ति रिकॉर्ड देखें: कीमतें, फर्श क्षेत्र, ऊर्जा रेटिंग और अधिक.',
+ 'क्षेत्रीय आँकड़े, हिस्टोग्राम और अलग-अलग संपत्ति रिकॉर्ड देखें: कीमतें, फर्श क्षेत्रफल, ऊर्जा रेटिंग और बहुत कुछ.',
step6Title: 'पास में क्या है?',
step6Content:
'मानचित्र पर स्कूल, दुकानें, स्टेशन, पार्क और रेस्तरां चालू करें और देखें क्या पहुंच में है.',
@@ -1369,17 +1374,17 @@ const hi: Translations = {
'Last known price': 'अंतिम ज्ञात कीमत',
'Estimated price': 'अनुमानित कीमत',
'Estimated current price': 'अनुमानित मौजूदा कीमत',
- 'Price per sqm': 'प्रति वर्ग मी कीमत',
- 'Est. price per sqm': 'अनु. प्रति वर्ग मी कीमत',
+ 'Price per sqm': 'प्रति वर्ग मीटर कीमत',
+ 'Est. price per sqm': 'अनुमानित प्रति वर्ग मीटर कीमत',
'Estimated monthly rent': 'अनुमानित मासिक किराया',
- 'Total floor area (sqm)': 'कुल फर्श क्षेत्र (वर्ग मी)',
- 'Number of bedrooms & living rooms': 'बेडरूम और लिविंग रूम की संख्या',
+ 'Total floor area (sqm)': 'कुल फर्श क्षेत्रफल (वर्ग मी)',
+ 'Number of bedrooms & living rooms': 'बेडरूम और बैठक कमरों की संख्या',
'Construction year': 'निर्माण वर्ष',
'Date of last transaction': 'अंतिम लेनदेन की तारीख',
- 'Former council house': 'पूर्व काउंसिल घर',
+ 'Former council house': 'पूर्व काउंसिल मकान',
'Current energy rating': 'मौजूदा ऊर्जा रेटिंग',
'Potential energy rating': 'संभावित ऊर्जा रेटिंग',
- 'Interior height (m)': 'भीतरी ऊंचाई (मी)',
+ 'Interior height (m)': 'भीतरी ऊँचाई (मी)',
'Street tree density percentile': 'सड़क वृक्ष घनत्व प्रतिशतक',
'Within conservation area': 'संरक्षण क्षेत्र में',
'Listed building': 'सूचीबद्ध भवन',
@@ -1419,7 +1424,7 @@ const hi: Translations = {
'Possession of weapons (avg/yr)': 'हथियार रखने के अपराध (औसत/वर्ष)',
'Public order (avg/yr)': 'सार्वजनिक व्यवस्था अपराध (औसत/वर्ष)',
'Other crime (avg/yr)': 'अन्य अपराध (औसत/वर्ष)',
- 'Median age': 'मीडियन आयु',
+ 'Median age': 'मध्य आयु',
'% White': '% श्वेत',
'% South Asian': '% दक्षिण एशियाई',
'% Black': '% अश्वेत',
@@ -1443,7 +1448,7 @@ const hi: Translations = {
'Closest transport option': 'निकटतम परिवहन विकल्प',
'Amenities within 2km': '2 किमी के अंदर सुविधाएं',
'Amenities within 5km': '5 किमी के अंदर सुविधाएं',
- Detached: 'अलग मकान',
+ Detached: 'स्वतंत्र मकान',
'Semi-Detached': 'अर्ध-स्वतंत्र मकान',
Terraced: 'कतारबद्ध मकान',
'Flats/Maisonettes': 'फ्लैट/मेज़ोनेट',
@@ -1455,7 +1460,7 @@ const hi: Translations = {
'Serious crime': 'गंभीर अपराध',
'Minor crime': 'मामूली अपराध',
'Ethnic composition': 'जातीय संरचना',
- 'Political vote share': 'राजनीतिक वोट शेयर',
+ 'Political vote share': 'राजनीतिक मत हिस्सेदारी',
'Anti-social': 'असामाजिक',
Vehicle: 'वाहन',
Burglary: 'सेंधमारी',
@@ -1492,25 +1497,25 @@ const hi: Translations = {
'Sports Centre': 'खेल केंद्र',
Entertainment: 'मनोरंजन',
Supermarket: 'सुपरमार्केट',
- 'Convenience Store': 'कन्वीनियंस स्टोर',
+ 'Convenience Store': 'दैनिक जरूरत की दुकान',
Bakery: 'बेकरी',
'Butcher & Fishmonger': 'कसाई और मछली विक्रेता',
Greengrocer: 'सब्जी-फल विक्रेता',
'Off-Licence': 'शराब की दुकान',
- 'Deli & Specialty': 'डेली और विशेष खाद्य',
+ 'Deli & Specialty': 'विशेष खाद्य दुकान',
'Fashion & Clothing': 'फैशन और कपड़े',
Electronics: 'इलेक्ट्रॉनिक्स',
- 'Charity Shop': 'चैरिटी दुकान',
+ 'Charity Shop': 'चैरिटी की दुकान',
'DIY & Hardware': 'DIY और हार्डवेयर',
'Home & Garden': 'घर और बगीचा',
Bookshop: 'किताबों की दुकान',
- 'Pet Shop': 'पालतू पशु दुकान',
+ 'Pet Shop': 'पालतू पशु की दुकान',
'Sports & Outdoor': 'खेल और आउटडोर',
- Newsagent: 'अखबार विक्रेता',
+ Newsagent: 'अखबार की दुकान',
'Department Store': 'डिपार्टमेंट स्टोर',
'Gift & Hobby': 'उपहार और शौक',
- 'Specialist Shop': 'विशेषज्ञ दुकान',
- 'Hairdresser & Beauty': 'हेयरड्रेसर और सौंदर्य',
+ 'Specialist Shop': 'विशेष दुकान',
+ 'Hairdresser & Beauty': 'बाल कटाई और सौंदर्य',
'Gym & Fitness': 'जिम और फिटनेस',
'Dry Cleaner & Laundry': 'ड्राई क्लीनर और लॉन्ड्री',
'Car Services': 'कार सेवाएं',
@@ -1519,11 +1524,11 @@ const hi: Translations = {
Bank: 'बैंक',
'Travel Agent': 'ट्रैवल एजेंट',
Police: 'पुलिस',
- 'Fire Station': 'फायर स्टेशन',
+ 'Fire Station': 'अग्निशमन केंद्र',
'Ambulance Station': 'एम्बुलेंस स्टेशन',
'GP Surgery': 'GP क्लिनिक',
Dentist: 'दंत चिकित्सक',
- Pharmacy: 'फार्मेसी',
+ Pharmacy: 'दवा दुकान',
'Hospital & Clinic': 'अस्पताल और क्लिनिक',
Optician: 'ऑप्टिशियन',
Physiotherapy: 'फिजियोथेरेपी',
@@ -1532,12 +1537,20 @@ const hi: Translations = {
'Medical & Mobility': 'चिकित्सा और गतिशीलता उपकरण',
Museum: 'संग्रहालय',
Gallery: 'गैलरी',
- Library: 'लाइब्रेरी',
+ Library: 'पुस्तकालय',
'Place of Worship': 'पूजा स्थल',
'Arts Centre': 'कला केंद्र',
Zoo: 'चिड़ियाघर',
'Tourist Attraction': 'पर्यटक आकर्षण',
School: 'स्कूल',
+ 'Nursery school': 'नर्सरी स्कूल',
+ 'Primary school': 'प्राथमिक स्कूल',
+ 'Secondary school': 'माध्यमिक स्कूल',
+ 'All-through school': 'सभी कक्षाओं वाला स्कूल',
+ 'Sixth form': 'सिक्स्थ फॉर्म',
+ 'Further education college': 'उच्च शिक्षा कॉलेज',
+ University: 'विश्वविद्यालय',
+ 'Special school': 'विशेष स्कूल',
Hotel: 'होटल',
'Local Business': 'स्थानीय व्यवसाय',
Offices: 'कार्यालय',
diff --git a/frontend/src/i18n/locales/hu.ts b/frontend/src/i18n/locales/hu.ts
index 963a8f8..d5e51d7 100644
--- a/frontend/src/i18n/locales/hu.ts
+++ b/frontend/src/i18n/locales/hu.ts
@@ -36,10 +36,10 @@ const hu: Translations = {
clickForDetails: 'Kattints a részletekhez',
property: 'ingatlan',
propertiesPlural: 'ingatlanok',
- bedsCount: '{{count}} hsz.',
- bedsCount_other: '{{count}} hsz.',
- bathsCount: '{{count}} fsz.',
- bathsCount_other: '{{count}} fsz.',
+ bedsCount: '{{count}} hálószoba',
+ bedsCount_other: '{{count}} hálószoba',
+ bathsCount: '{{count}} fürdő',
+ bathsCount_other: '{{count}} fürdő',
places: 'helyek',
noData: 'Nincs adat',
allLow: 'Mind alacsony',
@@ -63,7 +63,7 @@ const hu: Translations = {
exportLabel: 'Exportálás',
exporting: 'Exportálás...',
exportToExcel: 'Exportálás Excelbe',
- exportReady: 'Export kész. A letöltésnek el kell indulnia.',
+ exportReady: 'Az exportálás kész. A letöltésnek el kell indulnia.',
exportFailed: 'Az exportálás sikertelen.',
exportTimedOut: 'Az exportálás időtúllépés miatt leállt. Próbáld újra.',
exportUnavailable: 'A térkép még tölt. Próbáld újra hamarosan.',
@@ -72,6 +72,23 @@ const hu: Translations = {
closeMenu: 'Menü bezárása',
},
+ // ── Export Menu ────────────────────────────────────
+ export: {
+ title: 'Exportálás',
+ modeFilters: '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.',
+ 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.',
+ listLabel: 'Irányítószámok',
+ listPlaceholder: 'pl. SW1A 1AA',
+ addRow: 'Irányítószám hozzáadása',
+ removeRow: 'Irányítószám eltávolítása',
+ listCount: '{{count}} irányítószám',
+ listCount_other: '{{count}} irányítószám',
+ },
+
// ── User Menu ──────────────────────────────────────
userMenu: {
fullAccess: 'Teljes hozzáférés',
@@ -100,271 +117,272 @@ const hu: Translations = {
'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 validálás szükséges.',
+ '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',
relatedGuides: 'Kapcsolódó útmutatók',
- relatedGuidesDesc: 'Folytasd az indexelt nyilvános oldalakon kanonikus belső hivatkozásokkal.',
+ relatedGuidesDesc:
+ 'Folytasd az indexelt nyilvános oldalakon, kanonikus 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 hasonlíthatod össze.',
+ 'Ezekkel a belső linkekkel ugyanazt az ingatlankeresési folyamatot más nézőpontból nézheted meg.',
pages: {
- 'Property price map': 'Ingatlan ártérkép',
+ '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',
'Property price map for England - Compare postcodes before viewing':
- 'Ingatlan ártérkép Angliában - Hasonlítsa össze az irányítószámokat a megtekintés előtt',
+ '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éterenkénti árat és a helyi kontextust az angliai irányítószámok között, mielőtt hirdetéseket keresne.',
+ '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.',
'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 feltérképezi az eladási árakat, a becsült jelenlegi értéket, a négyzetméterenkénti árat, az ingatlan típusát, az alapterületet, a tulajdonjogot és a helyi környezetet, így a vásárlók reális keresési területeket találhatnak, mielőtt megnyitnák a hirdetési portálokat.',
+ '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.':
- 'A korábbi eladási árak és a becsült aktuális érték megjelenítése irányítószám szerint.',
+ 'Korábbi eladási árak és becsült jelenlegi értékek áttekintése irányítószám szerint.',
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
- 'Hasonlítsa össze az értéket az ingázás, az iskolák, a szélessáv, a bűnözés, a zaj és a szolgáltatások értékével.',
+ '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 egy szűkített listát, mielőtt a hétvégét nézegetéssel tölti.',
+ 'Állítson össze szűkített listát, mielőtt a hétvégéit megtekintésekre szánná.',
'Find postcodes that fit the budget before listings appear':
- 'A listák megjelenése előtt keresse meg a költségvetésnek megfelelő irányítószámokat',
+ 'Még a hirdetések megjelenése előtt találja meg a költségvetésnek megfelelő irányítószámokat',
'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 ki 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 hasonló otthonokkal kereskedtek elérhető közelségben, még akkor is, ha ma még nincsenek élő listák.',
+ '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.',
'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 kritériumokkal ahelyett, hogy a terület hírnevére hagyatkozna.',
+ '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.',
'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': 'Különítse el az olcsót a jó értéktől',
+ 'Separate cheap from good value': 'Válassza szét az olcsót a jó ár-é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 isn’t automatically treated as the best option.':
- 'Az alacsonyabb ár kisebb lakásokat, gyengébb közlekedést, nagyobb zajt vagy kevesebb helyi szolgáltatást tükrözhet. A térkép láthatóan tartja ezeket a kompromisszumokat, így a legolcsóbb irányítószámot nem kezeli automatikusan a legjobb megoldásként.',
+ '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.',
'Start from area value, not listing availability':
- 'Kezdje a terület értékével, ne a rendelkezésre állás felsorolásával',
+ 'A terület értékéből induljon ki, ne a hirdetéskínálatbó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ó lakásokat 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 elkerülheti, hogy lemaradjon olyan helyekről, ahol a következő megfelelő hirdetés megjelenhet.',
+ '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',
'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 kombinálja az utazási idővel, az iskola minőségével, az ingatlan méretével, az energiahatékonysággal, a helyi környezettel és a szolgáltatásokkal, így a szűkített lista tükrözi, hogyan szeretne ténylegesen élni.',
+ '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.',
'What the price data is for': 'Mire szolgálnak az áradatok',
'Use the map to compare areas and spot search candidates. It isn’t a valuation, mortgage decision, survey, legal search, or live listing feed.':
- 'Használja a térképet a területek összehasonlítására és a kereséshez szóba jövő helyek megtalálására. Ez nem értékbecslés, jelzáloghitel-döntés, felmérés, jogi keresés vagy élő hirdetésforrás.',
- 'How to validate a promising area': 'Hogyan érvényesítsünk egy ígéretes területet',
+ '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',
'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, a döntés meghozatala előtt ellenőrizze az aktuális listákat, az eladási árak összehasonlító adatait, az ügynökök adatait, az árvízkereséseket, a jogi csomagokat, a felméréseket és a helyi hatóságok adatait.',
+ '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.',
'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 what’s 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ó.',
'Can I compare price with schools or commute time?':
- 'Összehasonlíthatom az árat az iskolák árával vagy az ingázási idővel?',
+ 'Ö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.':
'Igen. Az árszűrők kombinálhatók az utazási idő, az iskolák, a bűnözés, a szélessáv, az útzaj, a szolgáltatások és a környezet szűrőivel.',
'Does the map cover all of the UK?': 'A térkép lefedi az egész Egyesült Királyságot?',
'The current product focuses on England because several core property and postcode datasets are England-specific.':
- 'A jelenlegi termék Angliára összpontosít, mivel számos alapvető tulajdon- és irányítószám-adatkészlet Anglia-specifikus.',
+ 'A jelenlegi termék Angliára összpontosít, mivel több alapvető ingatlan- és irányítószám-adatkészlet kifejezetten Angliára vonatkozik.',
'Birmingham property search guide': 'Birmingham ingatlankeresési útmutató',
'A worked example for balancing price, commute, and family trade-offs.':
- 'Működő példa az ár, az ingázás és a családi kompromisszumok kiegyensúlyozására.',
+ '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 ülnek az irányítószám-szűrők mögött, és hol vannak korlátai.',
+ 'Tekintse 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.':
- 'Értse meg, hogy a térkép hogyan támogatja a szűkített listák felvételét, és nem helyettesíti a kellő gondosságot.',
+ '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.',
'Postcode checker': 'Irányítószám-ellenőrző',
'Check one postcode before you spend time on a viewing.':
- 'Ellenőrizze az egyik irányítószámot, mielőtt a megtekintéssel töltene időt.',
+ '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',
'Postcode property search': 'Irányítószám-alapú ingatlankeresés',
'Find postcodes that match your property search criteria':
- 'Keresse az ingatlankeresési kritériumoknak megfelelő irányítószámokat',
+ 'Keressen az ingatlankeresési feltételeinek megfelelő irányítószámokat',
'Postcode property search - Find areas that match your criteria':
- 'Irányítószámú ingatlankeresés – Keresse meg a kritériumainak megfelelő területeket',
+ 'Irányítószám-alapú ingatlankeresés – Találja meg a feltételeinek megfelelő területeket',
'Search every postcode by budget, property type, floor area, tenure, commute, schools, crime, broadband, noise, parks and local amenities.':
- 'Keressen minden irányítószámot költségvetés, ingatlantípus, alapterület, birtokviszony, ingázás, iskolák, bűnözés, szélessáv, zaj, parkok és helyi szolgáltatások alapján.',
+ '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.',
'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 minden irányítószámon 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.',
+ '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.',
'Filter England-wide postcode data from one map.':
- 'Szűrje le az angliai irányítószámadatokat egyetlen térképről.',
+ 'Szűrje az Anglia-szerte elérhető irányítószámadatokat egyetlen térképen.',
'Shortlist unfamiliar areas with comparable evidence.':
- 'Szűkítse listára az ismeretlen területeket összehasonlítható adatok alapján.',
+ 'Válogasson 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.',
'Turn a broad brief into postcode candidates':
- 'Változtassa meg a széles tájékoztatót irányítószám jelöltekké',
+ 'Alakítsa a tág keresési igényt 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 korlátokat: költségvetés, ingatlan mérete, tulajdonforma, utazási idő, iskolai igények, szélessáv, valamint a közúti zaj és a bűnözési szint elviselhetősége. A térkép eltávolítja azokat a helyeket, amelyek nem felelnek meg ezeknek a korlátoknak, és a fennmaradó lehetőségeket összehasonlíthatóvá teszi.',
- 'Relax one constraint at a time': 'Egyszerre lazítson egy kényszert',
+ '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',
'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 meg egyetlen szűrőt, és figyelje, mely irányítószámok jelennek meg újra. Ez egyértelművé teszi a kompromisszumot ahelyett, hogy a találgatásokra hagyatkozna.',
+ '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.',
'Turn vague areas into specific postcodes':
- 'A homályos területeket konkrét irányítószámokká alakíthatja',
+ 'Alakítsa 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 nagyvárosi vagy kerületi keresések nagy különbségeket rejtenek az utcák között. A Perfect Postcode segítségével az általános területről a szigorú követelményeknek megfelelő irányítószámok felé léphet.',
- 'Keep trade-offs visible': 'Tartsa láthatóan a kompromisszumokat',
+ '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',
'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 az egyezés, állítson be egyszerre egy kényszert, és nézze meg, hogy pontosan mely irányítószámok jelennek meg újra. Ez egyértelművé teszi a kompromisszumokat ahelyett, hogy a találgatásokra hagyatkozna.',
+ '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.',
'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 különbözhet az iskoláktól, az út zajától, a közlekedési lehetőségektől, az ingatlanösszetételtől és az ártól függően. 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 kezeljenek.',
+ '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ő listákat, látogasson el az utcákra, erősítse meg az iskolákat és a felvételiket, és tekintse át az aktuális hivatalos forrásokat.',
+ '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.',
'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. Az engedéllyel 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ó megjegyzésekhez készültek.',
+ '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.',
'Can I search without knowing the area?': 'Kereshetek a környék ismerete nélkül?',
'Yes. The map is designed to surface unfamiliar areas that match practical constraints, not just places you already know.':
- 'Igen. A térképet úgy tervezték, hogy a gyakorlati korlátoknak megfelelő, ismeretlen területeket is felszínre hozzon, nem csak a már ismert helyeket.',
+ '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 az irányítószám-adatokat és a történeti/kontextuális ingatlanjeleket hasonlítja össze. Az aktuális elérhetőséghez 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 környezeti ingatlanjelzéseket hasonlít össze. Az aktuális kínálathoz továbbra is hirdetési portálokra van szüksége.',
'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': 'Indítsa el az irányítószám-keresést',
+ '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 az ingázási idő szerint',
+ 'Search for places to live by commute time': 'Keressen lakóhelyeket ingázási idő alapján',
'Commute property search - Find places to live by travel time':
- 'Ingatlankeresés – Keressen lakóhelyeket az utazási idő alapján',
+ '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 az ingázási idő szerint, majd hasonlítsa össze az árakat, az iskolákat, a biztonságot, a szélessávot, az útzajokat, a parkokat és az ingatlanadatokat egy térképen.',
+ '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.',
'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 a modellezett autók, kerékpározás, gyaloglás és tömegközlekedési eszközök utazási ideje alapján, majd rétegezze az ingatlanárakat, az iskolákat, a bűnözést, a szélessávot, a zajt és a helyi létesítményeket.',
+ '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.',
'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.',
'Search by destination first, then filter for property and neighbourhood fit.':
- 'Először keressen cél szerint, majd szűrjön az ingatlanra és a környékre.',
+ 'Először úti cél szerint keressen, majd szűrjön ingatlan- és környékilleszkedésre.',
'Avoid areas that look close on a map but fail the daily journey.':
- 'Kerülje el azokat a területeket, amelyek a térképen közelinek tűnnek, de nem teszik lehetővé a napi utazást.',
+ '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',
'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 doesn’t work.':
- 'Válasszon egy ingázási célt, közlekedési módot és időtartományt, majd adja hozzá a tulajdonságszűrőket. Ez megakadályozza, hogy egy olcsónak tűnő terület kerüljön a szűkített listára, ha a napi utazás nem működik.',
+ '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.',
'Compare the commute against the rest of daily life':
'Hasonlítsa össze az ingázást a mindennapi élet többi részével',
'A fast commute isn’t enough if the property size, school context, safety threshold, broadband, or road-noise exposure don’t fit. The map keeps those signals side by side.':
- 'A gyors ingázás nem elég, ha az ingatlan mérete, iskolai környezet, biztonsági küszöb, szélessáv vagy közúti zajnak való kitettség nem felel meg. A térkép egymás mellett tartja ezeket a jeleket.',
+ '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.',
'Commute from postcodes, not just place names':
- 'Ingázzon irányítószámok alapján, nem csak helynevek alapján',
+ '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ás megközelítése, útvonala és tömegközlekedési lehetőségei. Az irányítószám-szintű utazási idő szűrés ezt a különbséget láthatóvá teszi.',
+ '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.',
'Balance journey time with the rest of the move':
- 'Egyensúlyozza az utazási időt a mozgás többi részével',
+ 'Hangolja ö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 megfelel az Ön költségvetésének, lakhatási igényeinek, iskolai preferenciáinak, biztonsági küszöbének, szélessávú követelményeinek és az útzaj toleranciájának.',
+ '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.',
'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. Mielőtt elkötelezné magát, ellenőrizze az aktuális menetrendeket, a zavarási mintákat, a parkolást, a kerékpározási feltételeket és a gyalogos útvonalakat.',
+ '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.',
'Why commute filters are combined with property data':
- 'Miért kombinálják az ingázási szűrőket a tulajdonságadatokkal?',
+ '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.':
- 'Az ingázási keresés akkor a leghasznosabb, ha eltávolítja a lehetetlen területeket, miközben továbbra is megmutatja, hogy a fennmaradó lehetőségek megfizethetőek és élhetőek-e.',
+ 'Az ingázási keresés akkor a leghasznosabb, ha kizárja a szóba sem jövő területeket, miközben továbbra is megmutatja, hogy a fennmaradó lehetőségek megfizethetők és élhetők-e.',
'Can I compare car, cycling, walking, and public transport?':
'Összehasonlíthatom az autót, a kerékpározást, a gyaloglást és a tömegközlekedést?',
'The product supports multiple travel modes where precomputed destination data is available.':
- 'A termék többféle utazási módot támogat, ahol előre kiszámított céladatok állnak rendelkezésre.',
+ '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 konzisztens ö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. 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.',
'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.':
- 'Igen. Az ingázási szűrő rétegezhető az ingatlanárral, a mérettel, az iskolákkal, a szélessávú internettel, a bűnözéssel, a szolgáltatásokkal és a környezeti jelekkel.',
+ 'Igen. Az ingázási szűrő egymásra építhető ingatlanárral, mérettel, iskolákkal, szélessávval, bűnözéssel, szolgáltatásokkal és környezeti jelzésekkel.',
'Bristol property search guide': 'Bristol ingatlankeresési útmutató',
'A worked example for balancing city access, price, and local context.':
- 'Működő példa a városi hozzáférés, az ár és a helyi környezet egyensúlyának megteremtésére.',
+ 'Kidolgozott példa a városi elérés, az ár és a helyi környezet egyensúlyozására.',
'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 ingatlankeresési területeket iskolákkal és családi kompromisszumokkal',
+ 'Keressen olyan ingatlankeresési területeket, ahol az iskolák és a családi kompromisszumok is látszanak',
'School property search - Compare postcodes for family moves':
- 'Iskolai ingatlankeresés – Hasonlítsa össze a családi költözés irányítószámait',
+ '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 ingatlanok méretét, az árakat, a parkokat, a biztonságot, az ingázást és a helyi szolgáltatásokat, mielőtt összeállít egy megtekintési listát.',
+ '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.',
'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 értékeléseket, az oktatási környezetet, az ingatlan méretét, 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í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.',
'Filter for nearby school quality alongside housing requirements.':
- 'Szűrje a közeli iskola minőségét a lakhatási követelmények mellett.',
+ 'Szűrjön közeli iskolaminőségre a lakhatási követelmé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.',
'Use the map as a shortlist tool before checking admissions and catchments.':
- 'Használja a térképet szűkített lista eszközeként, mielőtt ellenőrizné a befogadásokat és a vízgyűjtőket.',
+ '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.',
'Use school context without ignoring the home':
'Használja az iskolai környezetet anélkül, hogy figyelmen kívül hagyná az otthont',
'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 ingatlan méretével, költségvetésével és ingázási korlátaival, majd rétegezzen a közeli iskola minőségét és a helyi környezetet. Ez megakadályozza, hogy az iskola által vezetett keresések elrejtse a megfizethetőséget vagy a mindennapi élet problémáit.',
- 'Verify admissions before deciding': 'A döntés előtt ellenőrizze a felvételt',
+ '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',
'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 a vonzáskörzetek változhatnak. Erősítse meg a jelenlegi megállapodásokat az iskolákkal és a helyi hatóságokkal.',
+ '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 iskolai minőség a szűkített lista egyik része',
+ '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 összehasonlíthatja a közeli iskola adatait a családi költözést meghatározó egyéb gyakorlati korlátokkal: hely, ár, ingázás, parkok, biztonság és helyi szolgáltatások.',
- 'Check catchments before making decisions': 'Döntéshozatal előtt ellenőrizze a vízgyűjtőket',
+ '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',
'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 a vízgyűjtő hatá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 adatokat az iskolával vagy a helyi hatóságokkal.',
+ '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.',
'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 pedig a felvételi jogosultság feltételezésére. A minősítéseket, a távolságot, a felvételi kritériumokat és az iskolai kapacitást ellenőrizni kell az aktuális hivatalos forrásokból.',
+ '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.',
'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 a parkokkal, az útzajjal, a bűnözéssel, az ingatlan méretével, az ingázással, a szélessávval és az árakkal, hogy a szűkített lista tükrözze az egész költözést.',
+ '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.',
'Does this show school catchment guarantees?':
- 'Ez mutatja az iskolai vonzáskörzeti garanciákat?',
+ '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.':
- 'Nem. Segít azonosítani az ígéretes területeket, de a vonzáskörzeteket és a befogadásokat ellenőrizni kell az iskolával vagy a helyi hatósággal.',
+ 'Nem. Segít azonosítani az ígéretes területeket, de az iskolai körzeteket és a felvételi szabályokat az iskolával vagy a helyi hatósággal kell ellenőrizni.',
'Can I combine school filters with parks and safety?':
'Kombinálhatom az iskolai szűrőket parkokkal és biztonsággal?',
'Yes. School-aware search can be combined with crime, parks, commute, price, property size, and local services.':
- 'Igen. Az iskolatudatos 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 jelzés?',
+ '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 a lépé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álja a térképet kiindulási pontként, majd tekintse á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.',
- 'Explore school-aware searches': 'Fedezze fel az iskolatudatos kereséseket',
+ '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 kényelmi szolgáltatásokat és az utazási időt.',
+ '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.',
'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-környezetet, a bűnözést, a szélessávot, az utak zaját, a helyi szolgáltatásokat, az iskolákat, a nélkülözést, az önkormányzati adót és az utazási időre vonatkozó adatokat egyetlen, irányítószám-központú térképen.',
+ '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.',
'Check multiple local signals before visiting a street.':
- 'Ellenőrizze több helyi jelet, mielőtt felkeres egy utcát.',
+ 'Ellenőrizzen több helyi mutatót, mielőtt felkeres egy utcát.',
'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.',
'Check the street before spending a viewing slot':
- 'Nézze meg az utcát, mielőtt megtekintési időt tölt el',
+ 'Ellenőrizze az utcát, mielőtt megtekintési időpontot szánna 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 jelek áttekintésére, mielőtt időt szánna a látogatásra.',
+ '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',
'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.',
'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 mondanak eleget a környező utcáról. A Perfect Postcode bizonyítékokon alapuló irányítószám-ellenőrzést tesz lehetővé, 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ánna 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 szűkítésre és összehasonlításra készültek. Bármely vásárláshoz továbbra is szükség van az aktuális listázási ellenőrzésekre, a jogi átvilágításra, az árvízkutatásokra, a hitelezői követelményekre és a felmérések eredményeire.',
- 'What a postcode check can catch': 'Amit egy irányítószám-ellenőrzés elkaphat',
+ '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.',
+ '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árhatja az árkontextust, a környezeti jelzéseket, a közeli létesítményeket és más olyan helyi mutatókat, amelyeket egy hirdetésben könnyen át lehet siklani.',
+ '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 can’t prove': 'Amit az irányítószám-ellenőrzés nem tud bizonyítani',
'It can’t 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őbeni fejlesztést, a jogcímet, a hitelezői követelményeket vagy a jelenlegi utcai szintű tapasztalatot. Még mindig közvetlen ellenőrzésre van szükségük.',
+ '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.',
'Can I use the checker before a viewing?': 'Használhatom az ellenőrzőt megtekintés előtt?',
'Yes. That’s 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 le az irányítószámot, majd döntse el, hogy megéri-e a megtekintése.',
+ '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.',
'Does the checker include exact property condition?':
'Az ellenőrző pontos ingatlanállapotot tartalmaz?',
'No. Property condition requires listing details, surveys, and direct inspection.':
- 'Nem. Az ingatlan állapota megköveteli a részleteket, felméréseket és közvetlen ellenőrzést.',
+ 'Nem. Az ingatlan állapotához hirdetési részletek, műszaki felmérések és közvetlen ellenőrzés szükséges.',
'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.',
@@ -375,47 +393,47 @@ const hu: Translations = {
'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',
'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, az ingázási kompromisszumok, az iskolák, a bűnözés, a szélessáv és a helyi szolgáltatások összehasonlítására a megtekintés előtt.',
+ '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.',
'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ések gyorsan változhatnak utcáról utcára. Használjon irányítószám-szintű bizonyítékokat 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 kövesse a hirdetéseket.',
+ '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',
'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.',
'Use commute time as a hard filter before judging price.':
- 'Használja az ingázási időt kemény szűrőként az ár megítélése előtt.',
+ 'Használja az ingázási időt szigorú szűrőként, mielőtt az árat mérlegelné.',
'Compare public transport with car, cycling, or walking where available.':
- 'Hasonlítsa össze a tömegközlekedést autóval, kerékpározással vagy gyalogos közlekedéssel, ahol lehetséges.',
+ 'Hasonlítsa össze a tömegközlekedést autóval, kerékpárral vagy gyaloglással, ahol lehetséges.',
'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',
'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őek lehetnek, ha a helyi ingatlanösszetétel megváltozik. Adjon hozzá ingatlantípust, birtoklási időt, alapterületet és árszűrőt, hogy a hasonló területeket tisztességesen hasonlítsa össze.',
+ '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.',
'Keep family and environment trade-offs visible':
- 'A család és a környezet közötti kompromisszumok láthatóak legyenek',
+ '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 iskolai környezetet, a parkokat, az útzajt, a szélessávot és a bűnözési jelzéseket rétegezze az ingatlanszűrők fölé. Ez megkönnyíti annak eldöntését, hogy mely kompromisszumok elfogadhatók.',
+ '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.',
'Can Perfect Postcode tell me the best area in Birmingham?':
- 'Meg tudja mondani a Perfect Postcode Birmingham legjobb környékét?',
+ '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 a legjobb területet minden vásárló számára. Segít összehasonlítani az irányítószámokat saját korlátaival, így jobb szűkített listát készíthet.',
+ '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.',
'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 a jelöltek megkeresésére és összehasonlítására, majd érvényesítse őket látogatásokkal, helyi tanácsokkal, listákkal és hatósági ellenőrzésekkel.',
+ '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.',
'Compare price patterns before looking at live listings.':
- 'Hasonlítsa össze az ármintákat, mielőtt megnézné az élő listákat.',
+ 'Hasonlítsa össze az ármintákat, mielőtt élő hirdetéseket nézne.',
'Search by travel time and then layer on property requirements.':
- 'Keressen utazási idő szerint, majd rétegezzen az ingatlanigényeket.',
+ 'Keressen utazási idő szerint, majd adja 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',
'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 - Hasonlítsa össze az irányítószámokat a megtekintés előtt',
+ '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.',
'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 a városközpontra, a külvárosra és az ingázási lehetőségekre. A Perfect Postcode segítségével az egyes irányítószámok összehasonlíthatók ugyanazokkal az ingatlan- és mindennapi élet-korlátokkal.',
+ '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.',
'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',
'Start from the destinations that matter, then compare reachable postcodes rather than assuming every nearby place has the same practical journey.':
@@ -423,22 +441,22 @@ const hu: Translations = {
'Compare housing requirements before lifestyle preferences':
'Hasonlítsa össze a lakhatási igényeket 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űrje az ingatlan típusa, alapterülete, birtoklási ideje és ár alapján, mielőtt megítélné a felszereltséget. Ezáltal a szűkített lista olyan otthonokra épül, amelyek reálisan működhetnek.',
+ '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',
'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, iskolákat és létesítményeket összehasonlítható mutatókként. Ezután érvényesítse a legerősebb jelölteket az aktuális helyi ellenőrzésekkel.',
+ '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.',
'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. Ugyanazt a költségkeret-, tulajdon-, ingázási és helyi kontextusszűrőt használja mindkettőben, így a kompromisszumok láthatóak maradnak.',
- 'Does this include live listings?': 'Ez magában foglalja az élő listákat?',
+ '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.',
+ '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, hogy hol keressen, majd a jelenleg eladó otthonokhoz használja a hirdetési portálokat.',
+ 'Nem. Használja annak eldöntésére, hol keressen, majd a jelenleg eladó otthonokhoz használja a hirdetési portálokat.',
'Move from a broad search brief to specific postcode candidates.':
- 'Térjen át a széles körű keresési összefoglalóról a konkrét irányítószám jelöltekre.',
+ 'Lépjen 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 a tulajdonságok és a helyi kontextus összehasonlításához használt adatkészleteket.',
+ 'Tekintse á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',
@@ -449,30 +467,30 @@ const hu: Translations = {
'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.',
'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 kompromisszumot foglalnak magukban az ár, az utazási idő, az ingatlan mérete és a környék kontextusa között. Az irányítószám-első összehasonlítás láthatóvá teszi ezeket a kompromisszumokat.',
+ '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',
'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.',
'Compare value, not just headline price':
- 'Hasonlítsa össze az értéket, ne csak a kiinduló árat',
+ 'Az értéket hasonlítsa össze, 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 alacsonyabb költségű területeket azoktól a területektől, amelyek egyszerűen kisebb vagy eltérő otthonokat tartalmaznak.',
+ '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.',
'Screen environmental and local-service signals':
- 'Környezeti és helyi szolgáltatási jelek képernyője',
+ '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 az ingatlan napi működését. Használja őket szűrési kritériumké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álja őket szűrési feltételként a megtekintések lefoglalása előtt.',
'Can I use this for commuter villages around Bristol?':
- 'Használhatom ezt a Bristol környéki ingázó falvakban?',
+ '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 a vonatkozó irányítószám és utazási idő rendelkezésre áll. 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őrizze manuálisan az útvonalakat és a szolgáltatásokat.',
'Can this tell me whether a listing is good value?':
- 'Ez meg tudja mondani, hogy egy hirdetés jó érték-e?',
+ '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.':
- 'Megadhatja a területi kontextust, de egy adott hirdetéshez továbbra is szükség van összehasonlítható eladásokra, állapotellenőrzésekre, felmérési eredményekre és adott esetben szakmai tanácsra.',
+ '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 finomítaná a költségvetés és a helyi kontextus alapján.',
+ 'Keressen elérhető irányítószámok alapján, mielőtt költségvetés és helyi környezet szerint finomítana.',
'Understand price patterns before setting listing alerts.':
- 'Ismerje meg az ármintákat, mielőtt beállítja a hirdetési értesítéseket.',
+ 'Ismerje meg az ármintákat, mielőtt hirdetési értesítéseket állít 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.',
@@ -482,59 +500,60 @@ const hu: Translations = {
'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, beleértve az ingatlanárakat, az EPC-t, az iskolákat, a bűnözést, a szélessávot, a zajt és az utazási időt.',
+ '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.',
'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 egyesíti az ingatlanokat, a közlekedést, az oktatást, a környezetet és a helyi szolgáltatási adatkészleteket, így a vásárlók következetesen összehasonlíthatják az irányítószámokat. Ez az oldal elmagyarázza, hogy mire szolgálnak az adatok, és hol kell azokat ellenőrizni.',
- 'Property and housing context': 'Ingatlan és lakáskörnyezet',
+ '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.',
+ '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ókat és lakáskontextusú adatkészleteket használ az olyan szűrők támogatására, mint az eladási ár, az ingatlan típusa, a birtoklás, az alapterület, az energiateljesítmény és a becsült aktuális érték.',
+ '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 formális értékelésként.',
+ 'Ezeket a mezőket területek összehasonlítására használja, 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 listákat, a címadatokat, a hitelezői követelményeket és a felmérés eredményeit.',
+ '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.',
'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 kontextusszűrők segítenek összehasonlítani a mindennapi életet befolyásoló jelek irányítószámait. Ezeket szűrési adatokként kell kezelni, és a döntések meghozatalához össze kell hasonlítani a jelenlegi hivatalos forrásokkal.',
- 'Travel-time data': 'Utazási idő adatok',
+ '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ási idő szűrőit a területek következetes összehasonlítására tervezték. Az útvonal elérhetőségét, a fennakadásokat, a parkolást, a gyalogos hozzáférést és a menetrend részleteit ellenőrizni kell, mielőtt elkötelezné magát egy adott területen.',
+ '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.',
'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.':
- 'Számos alapvető tulajdon, oktatás és helyi kontextusú adatkészlet joghatóság-specifikus. Az angol lefedettség következetesebbé teszi az összehasonlításokat.',
+ '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 szűkített lista eszközeként. Ha az irányítószám számít, ellenőrizze a legfrissebb adatokat aktuális hivatalos forrásokból, és közvetlen helyi ellenőrzéseket végezzen.',
+ '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.',
'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ű kontextust.',
+ 'Megtekintés előtt tekintse á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',
- 'Methodology for postcode property research': 'Az irányítószám-tulajdonkutatás módszertana',
+ '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 – Hogyan értelmezzük az irányítószám tulajdoni adatokat',
+ '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ási időre vonatkozó adatokat, az iskolai környezetet és a helyi jelzéseket lakásvásárlási szűkített eszközként.',
+ '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.',
'Perfect Postcode is designed to make area shortlisting more evidence-led. It doesn’t replace estate agents, surveyors, conveyancers, lenders, school admissions teams, or local authority checks.':
- 'A Perfect Postcode célja, hogy a területek szűkített listáját bizonyítékokra alapozza. Nem helyettesíti az ingatlanügynököket, a földmérőket, az ingatlanjogászokat, a hitelezőket, az iskolai felvételi csoportokat vagy a helyi hatóságok ellenőrzéseit.',
- 'Start with hard constraints': 'Kezdje kemény korlátokkal',
+ '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',
'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 a nem alku tárgyát képező dolgokkal, mint például a költségvetés, az ingatlan típusa, az alapterület, az ingázási idő és az alapvető szolgáltatások. Ez eltávolítja a lehetetlen irányítószámokat, mielőtt a lágyabb beállításokat figyelembe venné.',
+ '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',
'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 színezze ki a fennmaradó térképet egy-egy jellel: négyzetméterár, útzaj, iskolai környezet, ingázási idő, szélessáv vagy bűnözés. Ez megkönnyíti a kompromisszumok megvitatását.',
+ '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 what’s working': 'Mérje meg, 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 Analytics szolgáltatást annak nyomon követésére, hogy mely nyilvános oldalak kerülnek indexelésre, mely lekérdezések eredményeznek megjelenítéseket, és mely oldalak váltják át a látogatókat irányítópult-felfedezéssé. Minden lényeges kezelőfelület-módosítás után tekintse át a Core Web Vitals-t.',
+ '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.',
'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 a bizonyítékokat és csökkenteni a keresési területet. A végső döntéshez közvetlen látogatásokra, aktuális listákra, jogi ellenőrzésekre, felmérésekre és személyes ítéletekre van szükség.',
+ '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áljon becsléseket összehasonlító jelként, ne pedig szakmai értékelésként vagy vásárlási tanácsként.',
+ '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.',
'Apply the methodology to price-led area comparison.':
'Alkalmazza a módszertant az árvezérelt terület-összehasonlításra.',
@@ -546,28 +565,28 @@ const hu: Translations = {
'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 a tulajdonkutatási munkafolyamatokat az adatvédelem és a biztonság szem előtt tartásával.',
+ '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.',
'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árhatja a személyes prioritásokat, a költségvetést és a helyszíneket. A termék elkülöníti a nyilvános keresőoptimalizálási oldalakat a csak fiókot tartalmazó területektől, és a privát irányítópult/fiókútvonalakat noindexként jelöli meg.',
+ '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':
'A nyilvános oldalak és a privát területek el vannak választva',
'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.':
- 'A marketing, a módszertan, az útmutató és a támogatási oldalak indexelhetők. Az irányítópult, a fiók, a mentett keresések, a meghívók és a meghívási útvonalak noindex-szel vannak megjelölve, vagy adott esetben blokkolva vannak a feltérképező robot számára.',
+ 'A marketing-, módszertani, útmutató- és támogatási oldalak indexelhetők. A térkép, a fiók, a mentett keresések, a meghívók és a meghívási útvonalak noindex jelölést kapnak, vagy ahol indokolt, blokkolva vannak a keresőrobotok elől.',
'Saved search data is account-scoped': 'A mentett keresési adatok fiókra vonatkoznak',
'Saved searches and shared links are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
'A mentett keresések és megosztott hivatkozások bejelentkezett használatra szolgálnak. Nem szerepelnek a nyilvános webhelytérképen, és nyilvános tartalomként nem térképezhetők fel.',
'Search measurement without exposing private data':
- 'Keresésmérés a személyes adatok felfedése nélkül',
+ 'Keresési mérés privát adatok felfedése nélkül',
'SEO measurement should happen on public pages using aggregated analytics and Search Console data. Private query parameters and account views shouldn’t become indexable landing pages.':
- 'A keresőoptimalizálás mérésének nyilvános oldalakon kell történnie, összesített elemzési és Search Console-adatok felhasználásával. A privát lekérdezési paraméterek és a fióknézetek nem válhatnak indexelhető céloldalakká.',
+ 'A SEO-mérést nyilvános oldalakon, összesített analitikai és Search Console-adatokkal kell végezni. A privát lekérdezési paraméterek és fióknézetek nem válhatnak indexelhető céloldalakká.',
'Are saved searches listed in the sitemap?':
'A mentett keresések szerepelnek az oldaltérképen?',
'No. Public SEO pages are listed; account and saved-search routes are intentionally excluded.':
- 'Nem. A nyilvános SEO oldalak felsorolva vannak; a fiók és a mentett keresési útvonalak szándékosan ki vannak zárva.',
+ 'Nem. A nyilvános SEO-oldalak szerepelnek benne; a fiók- és mentett keresési útvonalak szándékosan ki vannak zárva.',
'Can private dashboard URLs appear in search?':
- 'Megjelenhetnek a privát irányítópult-URL-ek a keresésben?',
+ 'Megjelenhetnek privát térkép-URL-ek a keresésben?',
'They shouldn’t be indexed. The server marks private routes noindex and the sitemap only lists public pages.':
- 'Nem szabad indexelni őket. A szerver a noindex privát útvonalakat jelöli meg, a webhelytérkép pedig csak a nyilvános oldalakat sorolja fel.',
+ 'Nem kellene indexelődniük. A szerver noindex jelölést ad a privát útvonalaknak, a webhelytérkép pedig csak nyilvános oldalakat sorol fel.',
'How to use public postcode data responsibly.':
'A nyilvános irányítószámadatok felelősségteljes használata.',
'What data powers the public comparisons.':
@@ -636,7 +655,7 @@ 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 a supportnak, 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.',
@@ -729,11 +748,11 @@ const hu: Translations = {
noChange: 'Átszállás nélkül',
noChangeTitle: 'Csak közvetlen járatok',
noChangeDesc:
- 'Átszállás nélküli utazásokra korlátoz —gyaloglás, egy közlekedési eszköz, gyaloglás a célig.',
+ 'Átszállás nélküli utazásokra korlátoz: gyaloglás, egy közlekedési eszköz, majd gyaloglás a célig.',
noBuses: 'Busz nélkül',
noBusesTitle: 'Buszok kizárása',
noBusesDesc:
- 'Kihagyja a buszokat —csak vonat, metró, villamos és komp. Hasznos a forgalmi késések elkerüléséhez.',
+ 'Kihagyja a buszokat: csak vonat, metró, villamos és komp. Hasznos a forgalmi késések elkerüléséhez.',
previewOnMap: 'Előnézet a térképen',
stopPreviewing: 'Előnézet leállítása',
removeTravelTime: 'Utazási idő eltávolítása',
@@ -765,7 +784,7 @@ const hu: Translations = {
// ── AI Filter ──────────────────────────────────────
aiFilter: {
describeIdealArea: 'Írd le, hol szeretnél élni',
- aiSearch: 'AI keresés',
+ aiSearch: 'AI-keresés',
describeHint: 'Írd le, mit keresel',
placeholder: 'pl. 2 hálószoba £525k alatt, 45 perc munkába, csendes...',
example1: '2 hálószoba £525k alatt, 45 perc munkába',
@@ -775,14 +794,14 @@ const hu: Translations = {
searchingDestinations: 'Úticélok keresése...',
generatingFilters: 'Szűrők létrehozása...',
refiningResults: 'Eredmények finomhangolása...',
- weeklyLimitReached: 'Elérted a heti AI használati limitet. Automatikusan visszaáll jövő héten.',
+ weeklyLimitReached: 'Elérted a heti AI-használati limitet. Automatikusan visszaáll jövő héten.',
},
// ── Map Legend ─────────────────────────────────────
mapLegend: {
clearColourView: 'Színezés törlése',
resetColourScale: 'Színskála visszaállítása',
- historicalMatches: 'Korábbi ingatlan találatok',
+ historicalMatches: 'Korábbi ingatlantalálatok',
numberOfProperties: 'Ingatlanok száma',
previewing: '\u201c{{name}}\u201d előnézete',
},
@@ -791,7 +810,7 @@ const hu: Translations = {
map: {
ogTitle: 'A te tökéletes irányítószámod',
ogPropertyPrices: 'Ingatlanárak',
- ogEnergyRatings: 'Energiaértékelések',
+ ogEnergyRatings: 'Energetikai besorolások',
ogSchools: 'Iskolák',
ogCrimeStats: 'Bűnözési adatok',
ogTransport: 'Közlekedés',
@@ -808,10 +827,11 @@ const hu: Translations = {
floorArea: 'Alapterület:',
rooms: 'Szobák:',
built: 'Építve:',
- formerCouncil: 'Volt önk. lakás:',
- exCouncilBadge: 'Volt önk.',
+ formerCouncil: 'Volt önkormányzati lakás:',
+ exCouncilBadge: 'Lehet, hogy volt önkormányzati lakás',
+ listedBuildingBadge: 'Talán műemlék',
epcRating: 'EPC minősítés:',
- epcPotential: 'EPC potenciál:',
+ epcPotential: 'Lehetséges EPC-minősítés:',
renovations: 'Felújítások',
perSqm: '/m²',
historyTitle: 'Előzmények',
@@ -820,7 +840,7 @@ const hu: Translations = {
searchPlaceholder: 'Keresés cím vagy irányítószám alapján...',
propertyData: 'Ingatlanadatok',
propertyDataDesc:
- 'Az árak a HM Land Registry-ből származnak (a vevők által ténylegesen fizetett összeg). Az alapterület, energetikai minősítések, építési év és tulajdonforma a hivatalos EPC felmérésekből származnak. Mindkét forrás cím alapján van összepárosítva az egyes irányítószámokon belül.',
+ 'Az árak a HM Land Registry-ből származnak (a vevők által ténylegesen fizetett összeg). Az alapterület, energetikai minősítések, építési év és tulajdonforma a hivatalos EPC-felmérésekből származnak. Mindkét forrás cím alapján van párosítva az egyes irányítószámokon belül.',
},
// ── Area Pane ──────────────────────────────────────
@@ -830,7 +850,7 @@ const hu: Translations = {
statsFor: 'Statisztikák a(z) {{type}} összes ingatlanáról',
matchingFilters: ' az összes aktív szűrőnek megfelelően',
statsBasis: 'Statisztika alapja',
- matchingFiltersOption: 'Illeszkedő szűrők',
+ matchingFiltersOption: 'Szűrőknek megfelelő',
allPropertiesOption: 'Összes ingatlan',
filtersAffectStats: 'A panel statisztikái a(z) {{count}} aktív szűrőt használják.',
filtersIgnoredForStats: 'A kiválasztott terület összes ingatlanának statisztikái láthatók.',
@@ -848,8 +868,7 @@ const hu: Translations = {
lowerMinTo: 'Minimum csökkentése erre: {{value}}',
raiseMaxTo: 'Maximum növelése erre: {{value}}',
allowCategory: '{{value}} engedélyezése',
- missingFilterValue:
- 'Ehhez a szűrőhöz nincs érték; távolítsa el, vagy engedélyezze a hiányzó értékeket',
+ missingFilterValue: 'Ehhez a szűrőhöz nincs érték; távolítsa el',
noFilterDataShort: 'Nincs adat',
travelTo: 'Utazás ide: {{destination}}',
viewProperties: '{{count}} ingatlan megtekintése',
@@ -858,22 +877,12 @@ const hu: Translations = {
journeysFrom: 'Utazási idők ehhez: {{label}}',
to: 'Ide: {{destination}}',
noJourneyData: 'Nincs elérhető utazási adat',
- viewOnGoogleMaps: 'Megtekintés a Google Maps-en',
+ viewOnGoogleMaps: 'Megtekintés a Google Térképen',
walk: 'Gyalog',
cycle: 'Kerékpár',
nationalAvg: 'Országos átlag',
},
- // ── Histogram Legend ───────────────────────────────
- histogramLegend: {
- tealBars: 'Zöldeskék oszlopok',
- tealBarsDesc: 'a kiválasztott terület eloszlását mutatják',
- greyBars: 'Szürke oszlopok',
- greyBarsDesc: 'az összes terület általános eloszlását mutatják',
- dashedLine: 'Szaggatott vonal',
- dashedLineDesc: 'az országos átlagot jelöli',
- },
-
// ── Street View ────────────────────────────────────
streetView: {
title: 'Utcakép',
@@ -884,18 +893,18 @@ const hu: Translations = {
// ── POI Pane ───────────────────────────────────────
poiPane: {
pois: 'POI-k',
- pointsOfInterest: 'Érdekes pontok',
+ pointsOfInterest: 'Érdekes helyek',
poiDescription:
'Forrás: OpenStreetMap, NaPTAN és GEOLYTIX Grocery Retail Points. Tartalmazza a közlekedési megállókat, üzleteket, áruházláncokat, éttermeket, egészségügyi szolgáltatásokat, szabadidős helyeket és még sok mást.',
searchCategories: 'Kategóriák keresése...',
- dataSourceInfo: 'Adatforrás információ',
+ dataSourceInfo: 'Adatforrás-információ',
},
// ── External Search Links ──────────────────────────
externalSearch: {
searchOn: 'Keresés {{radius}} sugárban ezen:',
exact: 'pontos',
- outcodeNotRecognised: 'Nem felismert körzeti kód',
+ outcodeNotRecognised: 'Ismeretlen irányítószám-körzet',
},
// ── Location Search ────────────────────────────────
@@ -936,9 +945,9 @@ const hu: Translations = {
showcaseFeatureSchoolsShort: 'Iskolák',
showcaseFeatureTravelShort: 'Utazás',
showcaseGoodPrimariesNearby: '{{count}}+ jó általános iskola a közelben',
- showcaseWithinRail: '{{count}} percen belül vasúthoz',
- showcaseMatchingHomesLabel: 'Illeszkedő otthonok',
- showcaseMatchingHomes: '{{value}} illeszkedő otthon',
+ showcaseWithinRail: 'Vasút {{count}} percen belül',
+ showcaseMatchingHomesLabel: 'Megfelelő otthonok',
+ showcaseMatchingHomes: '{{value}} megfelelő otthon',
showcaseMedianPrice: '{{value}} medián',
showcaseJourneyRoutes: 'Útvonalak',
showcaseNearby: '{{value}} a közelben',
@@ -947,7 +956,7 @@ const hu: Translations = {
showcaseMinutes: '{{count}} perc',
showcaseSendShortlist: 'Küldd el a szűkített listát',
showcaseDownloadXlsx: '.xlsx letöltése',
- showcaseTopThree: 'Top 3',
+ showcaseTopThree: 'Legjobb 3',
showcaseScoutBullet1:
'Járd be az utcákat, mielőtt a hirdetéskeresés leszűkíti a lehetőségeidet.',
showcaseScoutBullet2: 'Valódi bejárati ajtótól teszteld az ingázást, ne csak városrésznévből.',
@@ -960,13 +969,13 @@ const hu: Translations = {
showcaseStep1Chip2: 'Kiváló általános iskolák',
showcaseStep1Chip3: '£500k alatt',
showcaseStep1VennCenter: 'Mindhárom feltételt teljesítő irányítószámok',
- showcaseStep2Tab: 'Egyeztetés',
+ showcaseStep2Tab: 'Találat',
showcaseStep2Title: 'A térkép olyan helyeket hoz felszínre, amelyeket be sem írtál volna',
showcaseStep2Body:
'Ismert területnevek helyett illeszkedés alapján pásztázd végig Angliát. A rejtett, jó lehetőségek láthatóvá válnak, mielőtt a hirdetési portálok leszűkítenék a gondolkodásodat.',
showcaseStep2Region: 'Nagy-London',
showcaseStep2Sources: 'Land Registry · ONS · Ofsted · DfT',
- showcaseStep2ClustersLabel: 'Találati klaszterek',
+ showcaseStep2ClustersLabel: 'Találati csoportok',
showcaseStep3Tab: 'Vizsgálat',
showcaseStep3Title: 'Nézd meg, miért került be egy irányítószám',
showcaseStep3Body:
@@ -975,16 +984,16 @@ const hu: Translations = {
showcaseStep3HeaderFit: 'Környékadatok',
showcaseStep3Stat1Label: 'Eladási ár trend',
showcaseStep3Stat2Label: 'Bűnözési ráta',
- showcaseStep3Stat2Value: 'Borough-átlag alatt',
+ showcaseStep3Stat2Value: 'Kerületi átlag alatt',
showcaseStep3Stat3Label: 'Medián életkor',
showcaseStep3Stat4Label: 'Internet',
showcaseStep3Stat4Value: '1 Gbps elérhető',
showcaseStep3Stat5Label: 'Általános iskolák',
- showcaseStep3Stat5Value: '3 „outstanding” 1 mérföldön belül',
+ showcaseStep3Stat5Value: '3 kiváló iskola 1 mérföldön belül',
showcaseStep4Tab: 'Felderítés',
showcaseStep4Title: 'Nézd meg személyesen',
showcaseStep4Body:
- 'Vigyél magaddal három megalapozott kiindulópontot a való világba. Sétáld be az utcákat, próbáld ki az ingázást, és kontextussal hasonlítsd össze a megtekintéseket.',
+ 'Vigyél magaddal három megalapozott kiindulópontot a való világba. Sétáld be az utcákat, próbáld ki az ingázást, és háttéradatokkal a kezedben hasonlítsd össze a megtekintéseket.',
showcaseStep4FileName: 'areas-to-scout.xlsx',
showcaseStep4ExportLabel: 'Exportálás Excelbe',
showcaseStep4ColPostcode: 'Irányítószám',
@@ -1012,7 +1021,7 @@ const hu: Translations = {
'Hasonlítsd össze az árat, méretet, ingázást, biztonságot, iskolákat, internetet, zajt és energiahatékonyságot, mielőtt hétvégéket töltesz megtekintésekkel.',
othersVs: 'Mások vs.',
checkMyPostcode: 'Ingatlanportálok',
- areaGuides: 'Irányítószám-riportok',
+ areaGuides: 'Irányítószám-jelentések',
compSearchWithout: 'Területek felfedezése a nevük ismerete előtt',
compSearchWithoutSub: '(előbb igények, aztán helyszín)',
compAreaData: 'Irányítószám-szintű környékadatok',
@@ -1020,7 +1029,7 @@ const hu: Translations = {
compPropertyData: 'Ingatlanszintű előzmények',
compPropertyDataSub: '(eladási árak, EPC, alapterület, becsült érték)',
compFilters: '56 együtt működő szűrő',
- compFiltersSub: '(nem egy irányítószám vagy hirdetés egyszerre)',
+ compFiltersSub: '(nem egyenkénti irányítószám- vagy hirdetésellenőrzés)',
ctaTitle: 'Ne találgasd, hol vegyél.',
ctaDescription:
'Készíts listát olyan irányítószámokból, amelyek illenek a valós életedhez, majd nézd meg őket személyesen.',
@@ -1028,12 +1037,13 @@ const hu: Translations = {
// ── Pricing Page ───────────────────────────────────
pricingPage: {
- title: 'Vásárolj jobb keresési területtel',
+ title: 'Vásárolj jobb keresési területből kiindulva',
subtitle:
'Élethosszig tartó hozzáférés a térképhez, amely segít eldönteni, hol érdemes keresni, mielőtt megtekintéseket foglalnál.',
costContext:
'A vevők gyakran estéket töltenek hirdetések, ingázási ellenőrzések, iskolai jelentések, bűnözési térképek, Street View és eladási árak összeillesztésével. Londonban ez kimerítő, de ugyanez a kutatási probléma egész Angliában megjelenik. A Perfect Postcode egy térképre teszi a területkutatást, mielőtt a hétvégéidet, díjaidat és figyelmedet rászánnád.',
- lessThanSurvey: 'Kevesebb, mint egy felmérés. Sokkal többet segít a döntés irányításában.',
+ lessThanSurvey:
+ 'Kevesebb, mint egy műszaki felmérés. Sokkal többet segít a döntések irányításában.',
currentTier: 'Jelenlegi szint',
firstNUsers: 'Első {{count}} felhasználó',
everyoneAfter: 'Mindenki más utána',
@@ -1052,8 +1062,8 @@ const hu: Translations = {
failedToLoad: 'Nem sikerült betölteni az árakat. Kérjük, próbáld újra később.',
feat1: '56 szűrő egész Angliában',
feat2: 'Minden irányítószám kereshető a saját igényeid alapján',
- feat3: 'Korlátlan térképfelfedezés, mentett keresések és exportok',
- feat4: '13M korábbi tranzakció és árkörnyezet',
+ feat3: 'Korlátlan térképfelfedezés, mentett keresések és exportálás',
+ feat4: '13 millió korábbi tranzakció és árkörnyezet',
feat5: 'Ingázás, iskolák, bűnözés, zaj, szélessáv és még sok más',
feat6: 'Minden jövőbeli adatfrissítés benne van',
},
@@ -1065,9 +1075,9 @@ const hu: Translations = {
articles: 'Cikkek',
support: 'Támogatás',
dataSourcesIntro:
- 'Ez az alkalmazás {{count}} nyilvános adatkészletet kombinál, amelyek ingatlanárakat, energetikai teljesítményt, közlekedést, demográfiát, bűnözést, környezetet és még sok mást fednek le.',
+ 'Ez az alkalmazás {{count}} nyílt adatkészletet egyesít, amelyek ingatlanárakat, energetikai teljesítményt, közlekedést, demográfiát, bűnözést, környezetet és még sok mást fednek le.',
faqIntro:
- 'Akár első vásárlóként szűkíted a keresést, akár ismeretlen irányítószámot ellenőrzöl, akár megtekintési listát építesz, így segít a Perfect Postcode eldönteni, hol érdemes keresni.',
+ 'Akár első vásárlóként szűkíted a keresést, akár ismeretlen irányítószámot ellenőrzöl, akár megtekintési listát állítasz össze, így segít a Perfect Postcode eldönteni, hol érdemes keresni.',
articlesIntro:
'Böngészd a nyilvános útmutatókat ingatlankeresésről, ingázásról, iskolákról, irányítószám-ellenőrzésről, regionális összehasonlításokról, adatlefedettségről, módszertanról és adatvédelemről.',
supportIntro: 'Kérdésed van? Nézd meg a GYIK-et, vagy írj nekünk közvetlenül.',
@@ -1085,18 +1095,18 @@ const hu: Translations = {
attrOsmLicense: 'elérhető a következő alatt:',
attrOsmLicenseLink: 'Open Data Commons Open Database License (ODbL)',
// Data source names & descriptions
- dsPricePaidName: 'Eladásiár-adatok',
+ dsPricePaidName: 'Fizetett árak adatai',
dsPricePaidOrigin: 'HM Land Registry',
dsPricePaidUse: 'Teljes történeti ingatlaneladási árak Angliában.',
dsEpcName: 'Energetikai tanúsítványok (EPC)',
dsEpcOrigin: 'Ministry of Housing, Communities & Local Government',
dsEpcUse:
- 'Lakóingatlan energetikai tanúsítványok, amelyek tartalmazzák az alapterületet, szobaszámot, építési évet, energetikai minősítéseket, ingatlantípust és épületformát. Az eladásiár-nyilvántartásokkal cím alapján párosítva az egyes irányítószámokon belül. Az ingatlantulajdonosok visszautasíthatják a nyilvános közzétételt.',
- dsNsplName: 'Nemzeti Statisztikai Irányítószám Kereső (NSPL)',
+ 'Lakóingatlanok energetikai tanúsítványai, amelyek tartalmazzák az alapterületet, a szobaszámot, az építési évet, az energetikai minősítéseket, az ingatlantípust és az épületformát. A fizetett árak nyilvántartásával cím alapján párosítva az egyes irányítószámokon belül. Az ingatlantulajdonosok visszautasíthatják a nyilvános közzétételt.',
+ dsNsplName: 'Nemzeti statisztikai irányítószám-kereső (NSPL)',
dsNsplOrigin: 'ONS / ArcGIS',
dsNsplUse:
- 'Irányítószámokat koordinátákhoz és statisztikai területkódokhoz rendeli, amelyekkel az összes területi szintű adatkészletet az egyes ingatlanokhoz kapcsoljuk.',
- dsIodName: 'Angol Deprivációs Mutatók 2025',
+ 'Az irányítószámokat koordinátákhoz és statisztikai területkódokhoz rendeli, amelyekkel az összes területi szintű adatkészletet az egyes ingatlanokhoz kapcsoljuk.',
+ dsIodName: 'Angliai deprivációs mutatók 2025',
dsIodOrigin: 'Ministry of Housing, Communities & Local Government',
dsIodUse:
'Országos deprivációs percentilisek jövedelem, foglalkoztatottság, oktatás, egészség, bűnözés és lakókörnyezet területén Anglia minden lakókörzetére.',
@@ -1107,11 +1117,11 @@ const hu: Translations = {
dsCrimeName: 'Utcaszintű bűnözési adatok',
dsCrimeOrigin: 'data.police.uk',
dsCrimeUse:
- 'Utcaszintű bűnözési adatok éves átlagokba összegezve LSOA-nként és bűncselekménytípusonként (erőszak, betörés, közösségellenes magatartás, kábítószer, járműbűnözés stb.).',
+ 'Utcaszintű bűnözési adatok éves átlagokba összegezve LSOA-nként és bűncselekménytípusonként (erőszak, betörés, közösségellenes magatartás, kábítószer, járművel kapcsolatos bűncselekmények stb.).',
dsOsmName: 'OpenStreetMap POI-k',
dsOsmOrigin: 'OpenStreetMap contributors / Geofabrik',
dsOsmUse:
- 'Érdekes pontok, beleértve üzleteket, éttermeket, egészségügyet, szabadidőt, turizmust és még sok mást Nagy-Britanniában.',
+ 'Érdekes helyek Nagy-Britanniában, beleértve üzleteket, éttermeket, egészségügyi szolgáltatásokat, szabadidős és turisztikai helyeket, valamint még sok mást.',
dsGeolytixRetailName: 'GEOLYTIX élelmiszer-kiskereskedelmi pontok',
dsGeolytixRetailOrigin: 'GEOLYTIX',
dsGeolytixRetailUse:
@@ -1119,23 +1129,23 @@ const hu: Translations = {
dsGreenspaceName: 'OS nyílt zöldterületek',
dsGreenspaceOrigin: 'Ordnance Survey',
dsGreenspaceUse:
- 'Hivatalos zöldterületi határok Nagy-Britanniában, beleértve a közparkokat, kerteket, sportterületeket és játszótereket. A poligon középpontjait használjuk a park közelségi számláláshoz és a legközelebbi park távolságának számításához.',
+ 'Hivatalos zöldterületi határok Nagy-Britanniában, beleértve a közparkokat, kerteket, sportterületeket és játszótereket. A poligonok középpontjait használjuk a közeli parkok számlálásához és a legközelebbi park távolságának számításához.',
dsTowName: 'Országos, erdőn kívüli fák térképe',
dsTowOrigin: 'Forest Research / Defra NCEA',
dsTowUse:
- 'Fa lombkorona-poligonok 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.',
- dsConservationAreasName: 'Historic England műemléki területek',
+ '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.',
+ dsConservationAreasName: 'Historic England műemlékvédelmi területek',
dsConservationAreasOrigin: 'Historic England és helyi tervezési hatóságok',
dsConservationAreasUse:
- 'Anglia kijelölt conservation area határai. Annak jelzésére használjuk, hogy egy irányítószám reprezentatív pontja ilyen területre esik-e.',
+ 'Anglia kijelölt műemlékvédelmi területeinek határai. Annak jelzésére használjuk, hogy egy irányítószám reprezentatív pontja ilyen területre esik-e.',
dsListedBuildingsName: 'Historic England műemlék épületek',
dsListedBuildingsOrigin: 'Historic England National Heritage List for England',
dsListedBuildingsUse:
- 'Anglia műemlék épületeinek pontadatai. Annak jelzésére használjuk, ha egy ingatlan címe egy közeli listabejegyzéshez illeszkedni látszik.',
+ 'Anglia műemlék épületeinek pontadatai. Annak jelzésére használjuk, ha egy ingatlan címe egy közeli műemlék-bejegyzéshez illeszkedni látszik.',
dsNaptanName: 'NaPTAN (Tömegközlekedési megállók)',
dsNaptanOrigin: 'Department for Transport',
dsNaptanUse:
- 'Állomás- és megállóhelyek vasút, busz, metró/villamos, komp és repülőtér számára Angliában.',
+ 'Állomás- és megállóhelyek vasúthoz, buszhoz, metróhoz/villamoshoz, komphoz és repülőterekhez Angliában.',
dsNoiseName: 'Defra zajtérképezés',
dsNoiseOrigin: 'Defra / Environment Agency',
dsNoiseUse:
@@ -1143,15 +1153,15 @@ const hu: Translations = {
dsOfstedName: 'Ofsted iskolai vizsgálatok',
dsOfstedOrigin: 'Ofsted',
dsOfstedUse:
- 'Legfrissebb vizsgálati eredmények az állami fenntartású iskolákról (2025 áprilisáig). Irányítószámonként átlagolva a helyi iskolai minőség pontozásához (1=Kiváló-tól 4=Elégtelenig).',
+ 'Legfrissebb vizsgálati eredmények az állami fenntartású iskolákról (2025 áprilisáig). Irányítószámonként átlagolva a helyi iskolai minőség pontozásához (1=Kiváló, 4=Elégtelen).',
dsBroadbandName: 'Ofcom szélessávú teljesítmény',
dsBroadbandOrigin: 'Ofcom',
dsBroadbandUse:
'Vezetékes szélessávú lefedettség és maximális letöltési sebességek területenként az Ofcom Connected Nations 2025 jelentésből.',
- dsCouncilTaxName: 'Helyi adószintek 2025-26',
+ dsCouncilTaxName: 'Önkormányzati adószintek 2025-26',
dsCouncilTaxOrigin: 'Ministry of Housing, Communities & Local Government',
dsCouncilTaxUse:
- 'Éves helyi adó díjszabások A-H sávokra Anglia mind a 296 számlázó hatóságánál, két felnőtt által lakott ingatlanra. Az ingatlanokhoz a helyi önkormányzati kerületi kódon keresztül csatolva az NSPL irányítószám keresőből.',
+ 'Éves önkormányzatiadó-összegek A-H sávokra Anglia mind a 296 számlázó hatóságánál, két felnőtt által lakott ingatlanra. Az ingatlanokhoz a helyi önkormányzati kerületi kódon keresztül csatolva az NSPL irányítószám-keresőből.',
dsRentalName: 'Magánbérleti piaci statisztikák',
dsRentalOrigin: 'ONS / Valuation Office Agency',
dsRentalUse:
@@ -1159,7 +1169,7 @@ const hu: Translations = {
dsElectionName: '2024-es parlamenti választási eredmények',
dsElectionOrigin: 'Egyesült Királyság Parlamentje',
dsElectionUse:
- 'Jelöltszintű eredmények a 2024. júliusi brit parlamenti választásról. Választókerületi szintre aggregálva: részvételi arány (%) és pártszavazatarányok (%). Az ingatlanokhoz az NSPL irányítószám-keresőből származó parlamenti választókerületi kódon (pcon) keresztül csatolva.',
+ 'Jelöltszintű eredmények a 2024. júliusi brit parlamenti választásról. Választókerületi szintre összesítve: részvételi arány (%) és pártszavazatarányok (%). Az ingatlanokhoz az NSPL irányítószám-keresőből származó parlamenti választókerületi kódon (pcon) keresztül csatolva.',
// FAQ section titles
faqFindingTitle: 'Hol keress',
faqCommuteTitle: 'Utazási idők',
@@ -1176,7 +1186,7 @@ const hu: Translations = {
// FAQ items — Finding Your Area
faqFinding1Q: 'Hol keressek, ha a nyilvánvaló környékek túl drágák?',
faqFinding1A:
- 'Kezdd azokkal, amikből nem engedsz: költségvetés, otthontípus, tér, ingázás, iskolák, biztonság, zaj, internet, parkok és minden más fontos szempont. A térkép elrejti a nem illő helyeket, így kevésbé nyilvánvaló területek is előkerülhetnek a hirdetések böngészése előtt.',
+ 'Kezdd azokkal, amikből nem engedsz: költségvetés, otthontípus, alapterület, ingázás, iskolák, biztonság, zaj, internet, parkok és minden más fontos szempont. A térkép elrejti a nem illő helyeket, így kevésbé nyilvánvaló területek is előkerülhetnek a hirdetések böngészése előtt.',
faqFinding2Q: 'Hogyan találok jó irányítószámokat kevéssé ismert helyeken?',
faqFinding2A:
'Állítsd be a kötelező feltételeket az egész térképen, majd nézd meg közelebbről a megmaradó helycsoportokat. Ismeretlen irányítószámokat hasonlíthatsz össze ingázás, eladási árak, iskolák, bűnözés, internet, zaj, közeli boltok vagy parkok alapján, nem csak hírnév szerint.',
@@ -1199,7 +1209,7 @@ const hu: Translations = {
'A becslés a HM Land Registryben rögzített legutóbbi eladási árból indul. Ezt közelebb hozzuk a mai piachoz azzal, hogy megnézzük, hogyan változott hasonló otthonok értéke, különösen azonos típusú közeli otthonoké. Ha kevés a helyi eladás, a becslés nagyobb terület trendjeire támaszkodik. Végül összevetjük közeli friss eladásokkal és az alapterülettel.',
faqBudget2Q: 'Miért használjam a becsült jelenlegi árat a legutóbbi eladási ár helyett?',
faqBudget2A:
- 'A legutóbbi eladási ár akár évekkel vagy évtizedekkel korábbi lehet, az aktuális irányárak pedig csak a ma hirdetett otthonokat fedik le. A becsült jelenlegi ár a régebbi eladásokat közelebb hozza a mai piachoz, így több otthont hasonlíthatsz össze és jobb értékűnek tűnő területeket találhatsz. Shortlisthez való iránymutatás, nem banki értékbecslés.',
+ 'A legutóbbi eladási ár akár évekkel vagy évtizedekkel korábbi lehet, az aktuális irányárak pedig csak a ma hirdetett otthonokat fedik le. A becsült jelenlegi ár a régebbi eladásokat közelebb hozza a mai piachoz, így több otthont hasonlíthatsz össze és jobb értékűnek tűnő területeket találhatsz. Előválogatáshoz való iránymutatás, nem banki értékbecslés.',
// FAQ items — Safety and Neighbourhood
faqSafety1Q: 'Milyen bűncselekmények gyakoriak az irányítószám környékén?',
faqSafety1A:
@@ -1210,35 +1220,35 @@ const hu: Translations = {
// FAQ items — Families and Schools
faqFamilies1Q: 'Mely területeken jó az iskolák, tér, biztonság és ingázás keveréke?',
faqFamilies1A:
- 'Tedd egy térképre az iskolaminősítéseket, bűnözést, parkokat, ingázást, teret, otthontípust és költségvetést. Az eredmény gyakorlati családi lista, nem sok külön keresés halmaza.',
- faqFamilies2Q: 'Ez bizonyítja, hogy iskola-felvételi körzeten belül vagyok?',
+ 'Tedd egy térképre az iskolaminősítéseket, bűnözést, parkokat, ingázást, alapterületet, otthontípust és költségvetést. Az eredmény gyakorlati családi szűkített lista, nem sok külön keresés halmaza.',
+ faqFamilies2Q: 'Ez bizonyítja, hogy iskolai körzeten belül vagyok?',
faqFamilies2A:
- 'Nem. Közeli iskolaminőséget és helyi oktatási információkat mutatunk, de a felvételi határok és elsőbbségi szabályok változhatnak. A Perfect Postcode-dal válogass helyeket, majd ellenőrizd a körzeteket és felvételit az iskolánál vagy a helyi önkormányzatnál.',
+ 'Nem. Közeli iskolaminőséget és helyi oktatási információkat mutatunk, de a felvételi körzetek és elsőbbségi szabályok változhatnak. A Perfect Postcode-dal válogass helyeket, majd ellenőrizd a körzeteket és a felvételi szabályokat az iskolánál vagy a helyi önkormányzatnál.',
// FAQ items — Environment and Quality of Life
faqEnv1Q:
'Hogyan kerülhetek el zajos utat az ingázás vagy internet minőségének elvesztése nélkül?',
faqEnv1A:
- 'Szűrj közúti zajra, miközben az ingázás, internet, ár és otthonszűrők aktívak maradnak. Egy jellemző szerint színezheted a térképet, a többi pedig reálisan tartja a listát.',
- faqEnv2Q: 'Mutat árvíz-, süllyedés- vagy felmérési kockázatot?',
+ 'Szűrj közúti zajra, miközben az ingázási, internet-, ár- és otthonszűrők aktívak maradnak. Egy jellemző szerint színezheted a térképet, a többi pedig reálisan tartja a listát.',
+ faqEnv2Q: 'Mutat árvíz-, süllyedés- vagy műszaki felmérési kockázatot?',
faqEnv2A:
- 'Ma még nem. Mutatunk például közúti zajt, energiaértékelést, építési kort és az irányítószám környezetét. Árvízkockázatot, jogi kérdéseket, szerkezeti problémákat, hitellel kapcsolatos ügyeket és felmérési eredményeket továbbra is külön kell ellenőrizni vásárlás előtt.',
+ 'Ma még nem. Mutatunk például közúti zajt, energiaértékelést, építési kort és az irányítószám környezetét. Árvízkockázatot, jogi kérdéseket, szerkezeti problémákat, hitellel kapcsolatos ügyeket és műszaki felmérési eredményeket továbbra is külön kell ellenőrizni vásárlás előtt.',
faqEnv3Q: 'Milyen fenntartási költségeket ellenőrizhetek megtekintés előtt?',
faqEnv3A:
- 'Megtekintés előtt ellenőrizhetsz energiaértékelést, alapterületet, építési kort, helyi adó területét, internetet és zajt. Ez nem jósolja meg a pontos számláidat, de segít korán elkerülni a nyilvánvalóan rossz illeszkedéseket.',
+ 'Megtekintés előtt ellenőrizhetsz energiaértékelést, alapterületet, építési kort, önkormányzati adót, internetet és zajt. Ez nem jósolja meg a pontos számláidat, de segít korán elkerülni a nyilvánvalóan rossz illeszkedéseket.',
// FAQ items — Listing Portals and Due Diligence
faqDueDiligence1Q: 'Rightmove előtt vagy után használjam?',
faqDueDiligence1A:
- 'Használd a Perfect Postcode-ot a hirdetési oldalak előtt és mellett. A Rightmove, Zoopla és OnTheMarket továbbra is az aktuálisan eladó otthonok, fotók, ügynökök, megtekintések és értesítések helye. A Perfect Postcode abban segít, hogy mely irányítószámokat érdemes keresni.',
- faqDueDiligence2Q: 'Szűrhetek kertre, garázsra, alaprajzra vagy hirdetésszövegre?',
+ 'Használd a Perfect Postcode-ot a hirdetési oldalak előtt és mellett. A Rightmove, Zoopla és OnTheMarket továbbra is az aktuálisan eladó otthonok, fotók, ingatlanközvetítők, megtekintések és értesítések helye. A Perfect Postcode abban segít, hogy mely irányítószámokat érdemes keresni.',
+ faqDueDiligence2Q: 'Miért nem szűrhetek kertre, garázsra vagy alaprajzra?',
faqDueDiligence2A:
- 'Ezek a részletek nem érhetők el megbízhatóan minden otthonról. A Perfect Postcode tud szűrni alapterületre, otthontípusra, tulajdonformára, energiaértékelésre, eladási árakra és helyi információkra. A kertet, garázst, tájolást, szobaelrendezést és ügynöki megfogalmazást továbbra is a hirdetésben és a megtekintésen kell ellenőrizni.',
+ 'Ezek a részletek nem érhetők el megbízhatóan minden otthonról. A Perfect Postcode tud szűrni alapterületre, otthontípusra, tulajdonformára, energiaértékelésre, eladási árakra és helyi információkra. A kertet, garázst, tájolást, szobaelrendezést és ingatlanközvetítői megfogalmazást továbbra is a hirdetésben és a megtekintésen kell ellenőrizni.',
faqDueDiligence3Q:
'Láthatom az árcsökkentések történetét vagy hogy mióta van fent egy hirdetés?',
faqDueDiligence3A:
- 'Jelenleg nem. A Perfect Postcode eladási árakra, energiaértékelésekre, irányítószámokra, utazási időkre és környékinformációkra épül, nem élő hirdetésváltozásokra. Az eladási előzményeket, becsült aktuális értéket és négyzetméterárat viszont használhatod annak megítélésére, hogy egy irányár magasnak tűnik-e.',
+ 'Jelenleg nem. A Perfect Postcode eladási árakra, energiaértékelésekre, irányítószámokra, utazási időkre és környékinformációkra épül, nem élő hirdetésváltozásokra. Az eladási előzményeket, a becsült aktuális értéket és a négyzetméterárat viszont használhatod annak megítélésére, hogy egy irányár túl magasnak tűnik-e.',
faqDueDiligence4Q: 'Mit kell még ellenőriznem ajánlattétel előtt?',
faqDueDiligence4A:
- 'A Perfect Postcode-dal ellenőrizd a környéket és a valószínű értéket, majd ajánlattétel előtt erősítsd meg a hirdetés részleteit. Ellenőrizd a tulajdonformát, a bérleti jog részleteit, a szolgáltatási díjakat, a tervezési előzményeket, az árvízkockázatot, a jogi kérdéseket, a hitelfeltételeket és a felmérési eredményeket is.',
+ 'A Perfect Postcode-dal ellenőrizd a környéket és a valószínű értéket, majd ajánlattétel előtt erősítsd meg a hirdetés részleteit. Ellenőrizd a tulajdonformát, a bérleti jog részleteit, a szolgáltatási díjakat, a tervezési előzményeket, az árvízkockázatot, a jogi kérdéseket, a hitelfeltételeket és a műszaki felmérési eredményeket is.',
// FAQ items — Privacy and Data Protection
faqPrivacy1Q: 'Tároltok rólam személyes adatokat?',
faqPrivacy1A:
@@ -1246,17 +1256,17 @@ const hu: Translations = {
// FAQ items — Why Perfect Postcode
faqWhy1Q: 'Mit mutat ez, amit a hirdetési portálok általában nem?',
faqWhy1A:
- 'A hirdetési oldalak a most eladó otthonokból indulnak ki. A Perfect Postcode azokból a helyekből indul, amelyek illenek az életedhez és költségvetésedhez, eladási árakkal, térrel, ingázással, iskolákkal, bűnözéssel, zajjal, internettel, energiaértékeléssel, tulajdonformával és szolgáltatásokkal, még a hirdetések megnyitása előtt.',
+ 'A hirdetési oldalak a most eladó otthonokból indulnak ki. A Perfect Postcode azokból a helyekből indul, amelyek illenek az életedhez és költségvetésedhez, eladási árakkal, alapterülettel, ingázással, iskolákkal, bűnözéssel, zajjal, internettel, energiaértékeléssel, tulajdonformával és szolgáltatásokkal, még a hirdetések megnyitása előtt.',
faqWhy2Q: 'Mennyi kézi kutatást takarít meg?',
faqWhy2A:
- 'Megtehetnéd egyedül is, de akkor eladási árakat, energiaértékeléseket, bűnözést, iskolákat, internetet, helyi tényeket, környezetet, utazási időket és térképeket kellene ellenőrizned irányítószámonként. A Perfect Postcode ezeket egy kereshető angliai térképbe rendezi.',
+ 'Megtehetnéd egyedül is, de akkor eladási árakat, energiaértékeléseket, bűnözést, iskolákat, internetet, helyi adatokat, környezetet, utazási időket és térképeket kellene ellenőrizned irányítószámonként. A Perfect Postcode ezeket egy kereshető angliai térképbe rendezi.',
faqWhy3Q: 'Mennyire megbízhatóak az adatok?',
faqWhy3A:
- 'A fő források hivatalos vagy széles körben használt nyilvános adatok: eladási árak, energiaértékelések, helyi tények, iskolaminősítések, internet, bűnözés, környezet, térképek és utcai adatok. Hasznosak rövid lista készítéséhez és összehasonlításhoz, de minden vásárlási döntéshez aktuális ellenőrzések és szükség esetén szakértői tanács kell.',
+ 'A fő források hivatalos vagy széles körben használt nyilvános adatok: eladási árak, energiaértékelések, helyi tények, iskolaminősítések, internet, bűnözés, környezet, térképek és utcai adatok. Hasznosak előválogatáshoz és összehasonlításhoz, de minden vásárlási döntéshez aktuális ellenőrzések és szükség esetén szakértői tanács kell.',
// FAQ items — Pricing and Access
faqPricing1Q: 'Miért fizessek, ha vannak ingyenes irányítószám-jelentések?',
faqPricing1A:
- 'Az ingyenes irányítószám-eszközök hasznosak, ha már tudod, mit kell ellenőrizni. A Perfect Postcode arra való, hogy Anglia minden irányítószámát végignézd az igényeid alapján, szűrőket kombinálj, lehetőségeket hasonlíts össze, kereséseket ments és listát exportálj, mielőtt hétvégéket kötnél le megtekintésekre.',
+ 'Az ingyenes irányítószám-eszközök hasznosak, ha már tudod, mit kell ellenőrizni. A Perfect Postcode arra való, hogy Anglia minden irányítószámát végignézd az igényeid alapján, szűrőket kombinálj, lehetőségeket hasonlíts össze, kereséseket ments és szűkített listát exportálj, mielőtt hétvégéket kötnél le megtekintésekre.',
faqPricing2Q: 'Mit jelent az élethosszig tartó hozzáférés?',
faqPricing2A:
'Az élethosszig tartó hozzáférés azt jelenti, hogy egy fizetéssel a fiókod folyamatos hozzáférést kap a fizetős Perfect Postcode térképhez a szolgáltatás élettartamára. Ez nem havi vagy éves előfizetés, és a szokásos adatfrissítések benne vannak. Használhatod a mostani kereséshez, később visszatérhetsz, és akkor is hozzáférsz, ha újra költözöl.',
@@ -1281,7 +1291,7 @@ const hu: Translations = {
'Egy irányítószámhoz tartozó zajérték a Defra három forrásának (közút, vasút, repülő) közül a leghangosabb, 4 méter magasságban modellezve, 24 órás súlyozott átlagként (Lden). Egy forgalmas lakóutcán a közúti komponens dominál, jellemzően 65–75 dB. A repülőtér kerítésén belül nincsenek főutak, ezért a közúti tag leesik, és csak a repülőzaj átlaga marad. A London City repülőtér például éjszakai zárva tartással és korlátozott forgalommal üzemel, így a 24 órás repülő-átlag mérsékelt (a futópálya mellett kb. 60–66 dB), a repülőtér belseje pedig csendesebbnek látszik, mint a mellette húzódó főutak. Ugyanez figyelhető meg a Heathrow-nál is. Nem hiba, hanem a lakossági receptormagasságon mért közlekedési zaj természetes velejárója.',
faqBehindData2Q: 'Miért látszik a repülőtér, autópálya vagy park egyetlen nagy foltként?',
faqBehindData2A:
- 'Az Egyesült Királyságban az irányítószámoknak hivatalosan nincs határa — a Royal Mail az irányítószámot kézbesítési címek listájaként definiálja, nem területként. A Perfect Postcode úgy állítja elő a poligonokat, hogy minden címhez hozzárendeli a körülötte lévő terület arányos részét. A címek nélküli helyeket (futópálya, autópálya, park, víztározó) a legközelebbi lakott irányítószám tölti ki. Ezért jelenik meg a repülőtér vagy nyílt terület gyakran egyetlen nagy poligonként, és az értéke a perimetren belül lévő néhány irányítószámból származik.',
+ 'Az Egyesült Királyságban az irányítószámoknak hivatalosan nincs határa — a Royal Mail az irányítószámot kézbesítési címek listájaként definiálja, nem területként. A Perfect Postcode úgy állítja elő a poligonokat, hogy minden címhez hozzárendeli a körülötte lévő terület arányos részét. A címek nélküli helyeket (futópálya, autópálya, park, víztározó) a legközelebbi lakott irányítószám tölti ki. Ezért jelenik meg a repülőtér vagy nyílt terület gyakran egyetlen nagy poligonként, és az értéke a határain belül lévő néhány irányítószámból származik.',
faqBehindData3Q: 'Miért egyezik meg több közeli irányítószám bűnözési száma?',
faqBehindData3A:
'A rendőrségi utcaszintű bűnözési adatok LSOA-szinten kerülnek közzétételre — ezek kb. 1500 lakosú kis környékek. Az ugyanazon LSOA-ban lévő minden irányítószám ugyanazokat az éves számokat kapja, így egy csendes lakóutca és egy egy háztömbnyire lévő főutca azonos értékeket mutathat, ha ugyanazon az oldalon vannak a határnak. Az egy főre jutó ráta szokatlanul magasnak tűnhet kórházakat, egyetemi kampuszokat vagy ipari területeket lefedő irányítószámoknál, mert ott normál mennyiségű incidens történik, de papíron kevés a lakos.',
@@ -1291,7 +1301,7 @@ const hu: Translations = {
'Nem. A számláló azokat az állami iskolákat keresi, amelyek saját irányítószáma az irányítószámod középpontja körüli körben van. A körzethatárokat, vallási vagy felvételi kritériumokat, testvérprioritást és felvételi szabályokat nem modellezzük — egy közeli Jó vagy Kiváló iskola lehet, hogy a te címedről mégsem elérhető. Használd a számot területek összehasonlítására, majd a tényleges felvételi feltételeket egyeztesd az iskolával vagy az önkormányzattal, mielőtt erre alapoznál.',
faqBehindData5Q: 'Miért mutat „Gigabit”-et egy irányítószám, ha nem minden otthon kapja?',
faqBehindData5A:
- 'Az Ofcom Connected Nations szélessáv-lefedettsége irányítószámonként az egyes sebességszinteket elérni képes helyiségek százalékát adja meg. Mi a legmagasabb elérhető szintet jelenítjük meg, így ha akár egyetlen otthon eléri a Gigabit-et, az irányítószám „Gigabit elérhető”-ként jelenik meg. Ez jól válaszol arra, hogy „van-e egyáltalán üvegszál ezen az utcán?”, de nem garantálja, hogy a tömbben minden lakásba megrendelhető. Mindig ellenőrizd a szolgáltatóknál a saját címedre vonatkozóan, mielőtt szerződnél.',
+ 'Az Ofcom Connected Nations szélessáv-lefedettsége irányítószámonként az egyes sebességszinteket elérni képes ingatlanok százalékát adja meg. Mi a legmagasabb elérhető szintet jelenítjük meg, így ha akár egyetlen otthon eléri a gigabites sebességet, az irányítószám „Gigabit elérhető”-ként jelenik meg. Ez jól válaszol arra, hogy „van-e egyáltalán optikai internet ezen az utcán?”, de nem garantálja, hogy a tömbben minden lakásba megrendelhető. Mindig ellenőrizd a szolgáltatóknál a saját címedre vonatkozóan, mielőtt szerződnél.',
faqBehindData6Q: 'Miért nem változnak az utazási idők estére vagy hétvégére?',
faqBehindData6A:
'A tömegközlekedési időket célállomásonként egyszer számoljuk ki, egy keddi reggeli indulási ablakra (07:30–08:30) a teljes GTFS menetrendek alapján. A „normál” érték az ablakon belüli utak mediánja, a „legjobb eset” pedig az 5. percentilis. A csúcsidőn kívüli, késő esti és hétvégi járatokat nem modellezzük, így egy irányítószám, amelyhez csak csúcsidőben jár busz, a térképen ettől függetlenül jó közlekedésűnek tűnhet. Tekintsd a számokat munkanapi ingázási becslésnek, nem egész napos átlagnak.',
@@ -1384,8 +1394,8 @@ const hu: Translations = {
noFilters: 'Nincs szűrő',
poiCategory: '{{count}} POI-kategória',
poiCategories: '{{count}} POI-kategória',
- travelDestination: '{{count}} utazási cél',
- travelDestinations: '{{count}} utazási cél',
+ travelDestination: '{{count}} utazási célpont',
+ travelDestinations: '{{count}} utazási célpont',
propertiesMatch: '{{count}} ingatlan megfelel',
setFilters: '{{count}} szűrő beállítása: {{list}}',
noFiltersSet: 'Nincs szűrő beállítva',
@@ -1398,7 +1408,7 @@ const hu: Translations = {
tutorial: {
step1Title: 'Mondja el a térképnek, mi fontos',
step1Content:
- 'Állítsa be a költségvetést, maximális ingázási időt, iskolaminőséget, bűnözési küszöböt, zajtűrést, szélessávigényt vagy bármit, ami fontos. Csak a megfelelő területek maradnak kiemelve. Használja a szem ikont bármely jellemző szerinti színezéshez.',
+ 'Állítsa be a költségvetést, maximális ingázási időt, iskolaminőséget, bűnözési küszöböt, zajtűrést, szélessávigényt vagy bármit, ami fontos. Csak a megfelelő területek maradnak kiemelve. A Színezés gombbal bármely jellemző szerint színezheti a térképet.',
step2Title: 'Vagy egyszerűen írja le',
step2Content:
'Írja le hétköznapi nyelven, mit keres, például „csendes terület jó iskolák közelében £400k alatt”, és beállítjuk a szűrőket Önnek.',
@@ -1409,7 +1419,7 @@ const hu: Translations = {
step4Content: 'Keressen rá bármely helyre vagy irányítószámra, hogy azonnal odajusson.',
step5Title: 'Merüljön el a részletekben',
step5Content:
- 'Tekintse meg a területi statisztikákat, hisztogramokat és az egyes ingatlanadatokat: árak, alapterület, energetikai besorolás és több.',
+ 'Tekintse meg a területi statisztikákat, hisztogramokat és az egyes ingatlanadatokat: árak, alapterület, energetikai besorolás és további adatok.',
step6Title: 'Mi van a közelben?',
step6Content:
'Kapcsolja be az iskolákat, üzleteket, állomásokat, parkokat és éttermeket a térképen, hogy lássa, mi érhető el.',
@@ -1425,31 +1435,31 @@ const hu: Translations = {
Transport: 'Közlekedés',
Education: 'Oktatás',
'Defining characteristics': 'Meghatározó jellemzők',
- 'Area development': 'Területi fejlődés',
+ 'Area development': 'Területi fejlettség',
Crime: 'Bűnözés',
- Neighbours: 'Szomszédok',
+ Neighbours: 'Környék lakói',
Amenities: 'Szolgáltatások',
Environment: 'Környezet',
// ─ Feature names (Properties) ─
'Property type': 'Ingatlantípus',
- 'Leasehold/Freehold': 'Bérleti/Tulajdonjog',
+ 'Leasehold/Freehold': 'Bérleti jog / teljes tulajdonjog',
'Last known price': 'Utolsó ismert ár',
'Estimated price': 'Becsült ár',
'Estimated current price': 'Becsült jelenlegi ár',
- 'Price per sqm': 'Ár per nm',
- 'Est. price per sqm': 'Becsült ár per nm',
+ 'Price per sqm': 'Négyzetméterár',
+ 'Est. price per sqm': 'Becsült négyzetméterár',
'Estimated monthly rent': 'Becsült havi bérleti díj',
'Total floor area (sqm)': 'Teljes alapterület (nm)',
- 'Number of bedrooms & living rooms': 'Háló- és nappalik száma',
+ 'Number of bedrooms & living rooms': 'Hálószobák és nappalik száma',
'Construction year': 'Építési év',
'Date of last transaction': 'Utolsó tranzakció dátuma',
'Former council house': 'Volt önkormányzati lakás',
- 'Current energy rating': 'Jelenlegi energetikai minősítés',
- 'Potential energy rating': 'Potenciális energetikai minősítés',
+ 'Current energy rating': 'Jelenlegi energetikai besorolás',
+ 'Potential energy rating': 'Lehetséges energetikai besorolás',
'Interior height (m)': 'Belmagasság (m)',
'Street tree density percentile': 'Utcai fasűrűségi percentilis',
- 'Within conservation area': 'Védett területen',
+ 'Within conservation area': 'Műemlékvédelmi területen',
'Listed building': 'Műemlék épület',
// ─ Feature names (Transport) ─
@@ -1461,10 +1471,10 @@ const hu: Translations = {
'Good+ secondary schools within 2km': 'Jó+ középiskolák 2 km-en belül',
'Good+ primary schools within 5km': 'Jó+ általános iskolák 5 km-en belül',
'Good+ secondary schools within 5km': 'Jó+ középiskolák 5 km-en belül',
- 'Outstanding primary schools within 2km': 'Kiemelkedő általános iskolák 2 km-en belül',
- 'Outstanding secondary schools within 2km': 'Kiemelkedő középiskolák 2 km-en belül',
- 'Outstanding primary schools within 5km': 'Kiemelkedő általános iskolák 5 km-en belül',
- 'Outstanding secondary schools within 5km': 'Kiemelkedő középiskolák 5 km-en belül',
+ 'Outstanding primary schools within 2km': 'Kiváló általános iskolák 2 km-en belül',
+ 'Outstanding secondary schools within 2km': 'Kiváló középiskolák 2 km-en belül',
+ 'Outstanding primary schools within 5km': 'Kiváló általános iskolák 5 km-en belül',
+ 'Outstanding secondary schools within 5km': 'Kiváló középiskolák 5 km-en belül',
'Education, Skills and Training Score': 'Oktatás, készségek és képzés pontszám',
// ─ Feature names (Area development) ─
@@ -1482,15 +1492,15 @@ const hu: Translations = {
'Violence and sexual offences (avg/yr)': 'Erőszak és szexuális bűncselekmények (éves átlag)',
'Burglary (avg/yr)': 'Betörés (éves átlag)',
'Robbery (avg/yr)': 'Rablás (éves átlag)',
- 'Vehicle crime (avg/yr)': 'Járműbűnözés (éves átlag)',
+ 'Vehicle crime (avg/yr)': 'Járművel kapcsolatos bűncselekmények (éves átlag)',
'Anti-social behaviour (avg/yr)': 'Közösségellenes magatartás (éves átlag)',
'Criminal damage and arson (avg/yr)': 'Rongálás és gyújtogatás (éves átlag)',
'Other theft (avg/yr)': 'Egyéb lopás (éves átlag)',
- 'Theft from the person (avg/yr)': 'Személy elleni lopás (éves átlag)',
+ 'Theft from the person (avg/yr)': 'Személytől történő lopás (éves átlag)',
'Shoplifting (avg/yr)': 'Bolti lopás (éves átlag)',
'Bicycle theft (avg/yr)': 'Kerékpárlopás (éves átlag)',
'Drugs (avg/yr)': 'Kábítószer (éves átlag)',
- 'Possession of weapons (avg/yr)': 'Fegyvertartás (éves átlag)',
+ 'Possession of weapons (avg/yr)': 'Fegyverbirtoklás (éves átlag)',
'Public order (avg/yr)': 'Közrend (éves átlag)',
'Other crime (avg/yr)': 'Egyéb bűncselekmény (éves átlag)',
@@ -1514,24 +1524,24 @@ const hu: Translations = {
// ─ Feature names (Amenities) ─
'Distance to nearest park (km)': 'Távolság a legközelebbi parktól (km)',
'Noise (dB)': 'Zaj (dB)',
- 'Max available download speed (Mbps)': 'Max elérhető letöltési sebesség (Mbps)',
+ 'Max available download speed (Mbps)': 'Maximális elérhető letöltési sebesség (Mbps)',
// ─ Client-side aggregate filter names ─
Schools: 'Iskolák',
'Specific crimes': 'Konkrét bűncselekmények',
Ethnicities: 'Etnikai csoportok',
- 'Amenity distance': 'Szolgáltatás-távolság',
+ 'Amenity distance': 'Szolgáltatások távolsága',
'Closest transport option': 'Legközelebbi közlekedési lehetőség',
'Amenities within 2km': 'Szolgáltatások 2 km-en belül',
'Amenities within 5km': 'Szolgáltatások 5 km-en belül',
// ─ Enum values ─
- Detached: 'Különálló',
+ Detached: 'Különálló ház',
'Semi-Detached': 'Ikerház',
Terraced: 'Sorház',
- 'Flats/Maisonettes': 'Lakások/Maisonette-ek',
+ 'Flats/Maisonettes': 'Lakások/kétszintes lakások',
Other: 'Egyéb',
- Freehold: 'Tulajdonjog',
+ Freehold: 'Teljes tulajdonjog',
Leasehold: 'Bérleti jog',
Yes: 'Igen',
No: 'Nem',
@@ -1556,7 +1566,7 @@ const hu: Translations = {
'Local Businesses': 'Helyi vállalkozások',
Culture: 'Kultúra',
Services: 'Szolgáltatások',
- Practical: 'Praktikus',
+ Practical: 'Mindennapi',
Shops: 'Üzletek',
// ─ POI categories ─
@@ -1585,7 +1595,7 @@ const hu: Translations = {
Bakery: 'Pékség',
'Butcher & Fishmonger': 'Hentes és halas',
Greengrocer: 'Zöldséges',
- 'Off-Licence': 'Italozó',
+ 'Off-Licence': 'Italbolt',
'Deli & Specialty': 'Csemege és különleges',
'Fashion & Clothing': 'Divat és ruházat',
Electronics: 'Elektronika',
@@ -1594,7 +1604,7 @@ const hu: Translations = {
'Home & Garden': 'Otthon és kert',
Bookshop: 'Könyvesbolt',
'Pet Shop': 'Állatkereskedés',
- 'Sports & Outdoor': 'Sport és szabadtér',
+ 'Sports & Outdoor': 'Sport és szabadtéri',
Newsagent: 'Újságárus',
'Department Store': 'Áruház',
'Gift & Hobby': 'Ajándék és hobbi',
@@ -1617,7 +1627,7 @@ const hu: Translations = {
Optician: 'Optikus',
Physiotherapy: 'Fizioterápia',
'Counselling & Therapy': 'Tanácsadás és terápia',
- 'Care Home': 'Gondozóház',
+ 'Care Home': 'Idősek otthona',
'Medical & Mobility': 'Egészségügyi és mobilitási eszközök',
Museum: 'Múzeum',
Gallery: 'Galéria',
@@ -1627,6 +1637,14 @@ const hu: Translations = {
Zoo: 'Állatkert',
'Tourist Attraction': 'Turisztikai látványosság',
School: 'Iskola',
+ 'Nursery school': 'Óvoda',
+ 'Primary school': 'Általános iskola',
+ 'Secondary school': 'Középiskola',
+ 'All-through school': 'Egységes iskola',
+ 'Sixth form': 'Sixth form',
+ 'Further education college': 'Továbbképző intézmény',
+ University: 'Egyetem',
+ 'Special school': 'Speciális iskola',
Hotel: 'Szálloda',
'Local Business': 'Helyi vállalkozás',
Offices: 'Irodák',
diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts
index e200f3a..aea7fcf 100644
--- a/frontend/src/i18n/locales/zh.ts
+++ b/frontend/src/i18n/locales/zh.ts
@@ -53,7 +53,7 @@ const zh: Translations = {
appName: 'Perfect Postcode',
dashboard: '地图面板',
learn: '了解更多',
- pricing: '价格',
+ pricing: '定价',
inviteFriends: '邀请好友',
saved: '已保存',
logIn: '登录',
@@ -62,7 +62,7 @@ const zh: Translations = {
exportLabel: '导出',
exporting: '导出中...',
exportToExcel: '导出为 Excel',
- exportReady: '导出已就绪。下载应会开始。',
+ exportReady: '导出已就绪。下载应会自动开始。',
exportFailed: '导出失败。',
exportTimedOut: '导出超时。请重试。',
exportUnavailable: '地图仍在加载。请稍后重试。',
@@ -71,9 +71,24 @@ const zh: Translations = {
closeMenu: '关闭菜单',
},
+ // ── Export Menu ────────────────────────────────────
+ export: {
+ title: '导出',
+ modeFilters: '符合筛选条件的邮编',
+ modeFiltersHint: '导出地图上所有符合当前筛选条件的邮编。',
+ modeList: '邮编列表',
+ modeListHint: '逐个添加您自己的邮编,系统会自动规范空格和大小写。',
+ listLabel: '邮编',
+ listPlaceholder: '例如 SW1A 1AA',
+ addRow: '添加邮编',
+ removeRow: '删除邮编',
+ listCount: '{{count}} 个邮编',
+ listCount_other: '{{count}} 个邮编',
+ },
+
// ── User Menu ──────────────────────────────────────
userMenu: {
- fullAccess: '完整访问',
+ fullAccess: '完整访问权限',
demo: '演示版',
themeLight: '主题:浅色',
themeDark: '主题:深色',
@@ -118,8 +133,7 @@ const zh: Translations = {
'按邮编筛选历史成交价与当前估值。',
'Compare value with commute, schools, broadband, crime, noise, and amenities.':
'把房价与通勤、学校、宽带、治安、噪音、便利设施放在一起比较。',
- 'Build a shortlist before spending weekends on viewings.':
- '别急着用周末跑看房,先建好候选名单。',
+ 'Build a shortlist before spending weekends on 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.':
@@ -144,7 +158,7 @@ const zh: Translations = {
'地图用于横向比较区域、圈出候选范围,并不代替估价、按揭决策、验房、法律检索或实时房源信息。',
'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.':
- '某个邮编看起来有戏,决定之前请先核对当前房源、可比成交价、中介信息、洪水风险查询、法律资料包、验房报告以及地方政府信息。',
+ '某个邮编看起来有潜力时,做决定前请先核对当前房源、可比成交价、中介信息、洪水风险查询、法律资料包、验房报告以及地方政府信息。',
'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 what’s currently for sale.':
'不能,它应当配合房源平台使用:Perfect Postcode 帮您决定该去哪儿找,房源平台告诉您当下哪些房子在售。',
@@ -203,7 +217,7 @@ const zh: Translations = {
'可以。已授权用户可以保存搜索,随时回来接着用。保存的搜索专为整理候选名单和比对笔记而设计。',
'Can I search without knowing the area?': '不熟悉当地,也能搜索吗?',
'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?': '搜索结果是实时房源吗?',
'No. The tool compares postcode data and historical/contextual property signals. You still need listing portals for current availability.':
'不是。本工具比较的是邮编数据,以及历史与背景类的房产信号。当下哪些房子在售,仍需去房源平台查看。',
@@ -321,8 +335,8 @@ const zh: Translations = {
'动身看房前,用邮编速查把价格走势、周边背景、便利设施、学校与环境信号先过一遍。',
'Compare neighbouring postcodes': '比较相邻邮编',
'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': '搭配房源平台使用,事半功倍',
+ '某个邮编看起来有潜力时,就用同一套筛选条件查看相邻区域。这往往能看出某个问题是这条街的特例,还是更大范围内的共性。',
+ 'Useful before and alongside 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': '是初筛工具,不是专业建议',
@@ -636,15 +650,15 @@ const zh: Translations = {
primary: '小学',
secondary: '中学',
rating: '评级',
- goodPlus: '良好+',
+ goodPlus: '良好及以上',
outstanding: '优秀',
distance: '距离',
crimeType: '犯罪类型',
ethnicity: '族裔',
- poiType: 'POI 类型',
+ poiType: '兴趣点类型',
party: '政党',
travelTimeKeywords:
- '通勤 通勤时间 出行 出行时间 旅行 旅行时间 路程 行程 驾车 开车 汽车 自行车 单车 骑行 骑车 步行 走路 公共交通 公交 交通 运输 车站 地铁 火车 公共汽车 巴士 路线 travel time journey commute car bicycle bike walking transit transport station tube train',
+ '通勤 通勤时间 出行 出行时间 旅行 旅行时间 路程 行程 驾车 开车 汽车 自行车 单车 骑行 骑车 步行 走路 公共交通 公交 交通 运输 车站 地铁 火车 公共汽车 巴士 路线',
},
// ── Philosophy Popup ───────────────────────────────
@@ -658,7 +672,7 @@ const zh: Translations = {
step3Title: '安全',
step3Desc: '(犯罪率、噪音水平、地面稳定性)',
step4Title: '学校',
- step4Desc: '(附近 Ofsted 评级为"良好"或"优秀"的学校)',
+ step4Desc: '(附近 Ofsted 评级为“良好”或“优秀”的学校)',
step5Title: '生活方式',
step5Desc: '(餐厅、公园、宽带速度)',
step6Title: '能源',
@@ -678,11 +692,11 @@ const zh: Translations = {
noChange: '无换乘',
noChangeTitle: '仅直达行程',
noChangeDesc:
- '仅限无换乘行程 —步行、乘坐一次公共交通、再步行到目的地。',
+ '仅限无换乘行程:步行、乘坐一次公共交通,再步行到目的地。适合希望一路直达的通勤。',
noBuses: '不含公交',
noBusesTitle: '排除公交',
noBusesDesc:
- '排除公交服务 —仅 火车、地铁、有轨电车和渡轮。便于筛选避开交通拥堵的行程。',
+ '从允许的公共交通方式中排除公交车,只保留火车、地铁、有轨电车和渡轮。适合筛选更少受道路拥堵影响的行程。',
previewOnMap: '在地图上预览',
stopPreviewing: '停止预览',
removeTravelTime: '移除通勤时间',
@@ -729,7 +743,7 @@ const zh: Translations = {
// ── Map Legend ─────────────────────────────────────
mapLegend: {
clearColourView: '清除颜色视图',
- resetColourScale: '重置颜色比例',
+ resetColourScale: '重置颜色刻度',
historicalMatches: '历史房产匹配',
numberOfProperties: '房产数量',
previewing: '预览\u201c{{name}}\u201d',
@@ -757,7 +771,8 @@ const zh: Translations = {
rooms: '房间:',
built: '建造年份:',
formerCouncil: '原公房:',
- exCouncilBadge: '原公房',
+ exCouncilBadge: '可能原公房',
+ listedBuildingBadge: '可能为登录建筑',
epcRating: '能源评级:',
epcPotential: '潜在能源评级:',
renovations: '翻新记录',
@@ -793,7 +808,7 @@ const zh: Translations = {
lowerMinTo: '将最小值降至 {{value}}',
raiseMaxTo: '将最大值提高至 {{value}}',
allowCategory: '允许 {{value}}',
- missingFilterValue: '此筛选条件没有值;请移除它或允许缺失值',
+ missingFilterValue: '此筛选条件没有值;请移除它',
noFilterDataShort: '无数据',
travelTo: '前往 {{destination}} 的出行',
viewProperties: '查看 {{count}} 处房产',
@@ -808,16 +823,6 @@ const zh: Translations = {
nationalAvg: '全国平均',
},
- // ── Histogram Legend ───────────────────────────────
- histogramLegend: {
- tealBars: '青色柱状图',
- tealBarsDesc: '显示所选区域内的分布情况',
- greyBars: '灰色柱状图',
- greyBarsDesc: '显示所有区域的整体分布情况',
- dashedLine: '虚线',
- dashedLineDesc: '表示全国平均值',
- },
-
// ── Street View ────────────────────────────────────
streetView: {
title: '街景视图',
@@ -860,7 +865,7 @@ const zh: Translations = {
// ── Home Page ──────────────────────────────────────
home: {
- heroEyebrow: '献给那些正在问"我到底该去哪儿找"的买家',
+ heroEyebrow: '献给那些正在问“我到底该去哪儿找?”的买家',
heroTitle1: '找到真正',
heroTitle2: '适合您生活的邮编',
heroTitle3: '不只局限于您已经熟悉的区域。',
@@ -879,11 +884,11 @@ const zh: Translations = {
showcaseFeatureNoiseShort: '噪声',
showcaseFeatureSchoolsShort: '学校',
showcaseFeatureTravelShort: '出行',
- showcaseGoodPrimariesNearby: '附近 {{count}}+ 所良好小学',
- showcaseWithinRail: '{{count}} 分钟内到达铁路',
+ showcaseGoodPrimariesNearby: '附近 {{count}}+ 所良好及以上小学',
+ showcaseWithinRail: '距铁路 {{count}} 分钟内',
showcaseMatchingHomesLabel: '匹配房源',
showcaseMatchingHomes: '{{value}} 个匹配房源',
- showcaseMedianPrice: '{{value}} 中位数',
+ showcaseMedianPrice: '中位数 {{value}}',
showcaseJourneyRoutes: '出行路线',
showcaseNearby: '附近 {{value}} 个',
showcasePoliticalVoteShare: '政党得票份额',
@@ -922,7 +927,7 @@ const zh: Translations = {
showcaseStep3Stat4Label: '宽带',
showcaseStep3Stat4Value: '可用 1 Gbps',
showcaseStep3Stat5Label: '小学',
- showcaseStep3Stat5Value: '1英里内3所「优秀」',
+ showcaseStep3Stat5Value: '1 英里内有 3 所“优秀”学校',
showcaseStep4Tab: '踏勘',
showcaseStep4Title: '亲自去看一看',
showcaseStep4Body:
@@ -947,7 +952,7 @@ const zh: Translations = {
streetIntro:
'笼统的区域名容易掩盖关键差异:在车站哪一侧、道路噪音、学校组合、真实通勤时间,以及同类房产的实际成交价。',
streetCard1Title: '发现您可能错过的区域',
- streetCard1Body: '根据您的条件找出匹配的邮编,不再只凭熟悉的地名、朋友推荐或"潜力区域"的宣传。',
+ streetCard1Body: '根据您的条件找出匹配的邮编,不再只凭熟悉的地名、朋友推荐或“潜力区域”的宣传。',
streetCard2Title: '看房前先看清取舍',
streetCard2Body:
'把周末花在看房之前,先把价格、空间、通勤、治安、学校、宽带、噪音和能源评级一并对比。',
@@ -983,7 +988,7 @@ const zh: Translations = {
filled: '已满',
openDashboard: '打开地图面板',
getStarted: '立即开始',
- getStartedPrice: '立即开始 - {{price}}',
+ getStartedPrice: '立即开始:{{price}}',
noCreditCard: '无需信用卡',
soldOut: '已售罄',
@@ -1011,7 +1016,7 @@ const zh: Translations = {
'浏览关于房产搜索、通勤、学校、邮编速查、区域对比、数据覆盖、方法论和隐私的公开指南。',
supportIntro: '还有疑问?欢迎查看常见问题,或直接与我们联系。',
source: '来源:',
- optOut: '退出公开披露',
+ optOut: '选择不公开',
attribution: '数据引用声明',
attrLandRegistry: '包含 HM Land Registry 数据 © Crown copyright and database right 2025。',
attrOgl: '包含根据以下许可证授权的公共部门信息:',
@@ -1029,7 +1034,7 @@ const zh: Translations = {
dsEpcName: '能源性能证书(EPC)',
dsEpcOrigin: 'Ministry of Housing, Communities & Local Government',
dsEpcUse:
- '住宅能源性能证书,提供建筑面积、房间数量、建造年份、能源评级、房产类型和建筑形式等信息。通过每个邮编内的地址与成交价格数据进行匹配。业主可以退出公开披露。',
+ '住宅能源性能证书,提供建筑面积、房间数量、建造年份、能源评级、房产类型和建筑形式等信息。通过每个邮编内的地址与成交价格数据进行匹配。业主可以选择不公开。',
dsNsplName: '国家统计邮编查询(NSPL)',
dsNsplOrigin: 'ONS / ArcGIS',
dsNsplUse: '将邮编映射到坐标和统计区域代码,用于将所有区域级数据集关联到各个房产。',
@@ -1064,8 +1069,7 @@ const zh: Translations = {
dsConservationAreasUse: '英格兰指定保护区边界。用于标记邮编代表点是否位于保护区内。',
dsListedBuildingsName: 'Historic England 登录建筑',
dsListedBuildingsOrigin: 'Historic England 英格兰国家遗产名录',
- dsListedBuildingsUse:
- '英格兰登录建筑点位记录。用于标记地址似乎与附近登录建筑条目匹配的房产。',
+ dsListedBuildingsUse: '英格兰登录建筑点位记录。用于标记地址似乎与附近登录建筑条目匹配的房产。',
dsNaptanName: 'NaPTAN(公共交通站点)',
dsNaptanOrigin: 'Department for Transport',
dsNaptanUse: '英格兰各地铁路、公交、地铁/有轨电车、渡轮和机场的站点位置。',
@@ -1122,9 +1126,9 @@ const zh: Translations = {
faqCommute2Q: '这些出行时间数字有什么局限?',
faqCommute2A:
'公共交通时间基于工作日早晨通勤,出发时间在 07:30 到 08:30 之间,默认显示该时段的典型行程。这些是用于规划的估算,不包含实时延误、交通状况或临时改月台。',
- faqCommute3Q: '什么时候用"最佳情况"按钮?',
+ faqCommute3Q: '什么时候用“最佳情况”按钮?',
faqCommute3A:
- '在公共交通模式下,若想查看出发时间踩得准、换乘也顺利时的通勤表现,就开"最佳情况"。日常比较时关掉即可。',
+ '在公共交通模式下,若想查看出发时间踩得准、换乘也顺利时的通勤表现,就开启“最佳情况”。日常比较时请保持关闭,因为默认设置更接近大多数日子的预期。',
// FAQ items — Budget and Value
faqBudget1Q: '你们如何估算当前房价?',
faqBudget1A:
@@ -1172,7 +1176,7 @@ const zh: Translations = {
// FAQ items — Privacy and Data Protection
faqPrivacy1Q: '你们会存储关于我的个人数据吗?',
faqPrivacy1A:
- '房产与社区信息本身不含您的个人资料。若您创建账户,我们只存储运行服务所必需的信息:邮箱地址、访问状态、新闻邮件订阅选择、已保存的搜索、已保存的房产,以及由 Stripe 处理的付款。账户数据按英国隐私法律处理。',
+ '房产与社区信息本身不含您的个人资料。若您创建账户,我们只存储运行服务所必需的信息:邮箱地址、访问状态、新闻邮件订阅选择、已保存的搜索、分享链接,以及由 Stripe 处理的付款记录。账户数据按英国隐私法律处理。',
// FAQ items — Why Perfect Postcode
faqWhy1Q: '它展示了哪些房源门户通常看不到的信息?',
faqWhy1A:
@@ -1197,13 +1201,13 @@ const zh: Translations = {
// FAQ items — Tips and Tricks
faqTips1Q: '如何在地图上预览筛选条件?',
faqTips1A:
- '点击筛选条件或数据项旁的眼睛图标,就能按该项给地图着色。当前的筛选保持不变,因此可以快速对比价格、出行时间、学校、治安或噪音等单项,候选范围不会改变。',
+ '点击筛选条件或数据项旁的“地图着色”,就能按该项给地图着色。当前的筛选保持不变,因此可以快速对比价格、出行时间、学校、治安或噪音等单项,候选范围不会改变。',
faqTips2Q: '如何了解某个筛选条件的含义?',
faqTips2A:
- '点击筛选条件或数据项旁的信息按钮,会有一段简短说明,告诉您它是什么、该怎么读。地图中的一些部分——例如出行时间卡片——也有各自的信息按钮。',
+ '点击筛选条件或数据项旁的“关于”,会有一段简短说明,告诉您它是什么、该怎么读。地图中的一些部分——例如出行时间卡片——也有各自的数据说明。',
faqTips3Q: '如何刷新地图颜色?',
faqTips3A:
- '当眼睛预览正在给地图着色时,在地图图例里点"重置颜色比例"即可按当前结果重新配色。平移、缩放或调整筛选之后,特别管用。',
+ '当某个数据项正在给地图着色时,在地图图例里点“重置颜色刻度”即可按当前结果重新配色。平移、缩放或调整筛选之后,特别管用。',
// FAQ items — Behind The Data
faqBehindData1Q: '为什么机场有时看起来比周围的街道更安静?',
@@ -1215,15 +1219,15 @@ const zh: Translations = {
faqBehindData3Q: '为什么相邻邮编的犯罪数字相同?',
faqBehindData3A:
'警方街道级犯罪数据按 LSOA 发布——大约 1,500 居民的小型社区单元。同一 LSOA 内每个邮编都继承同一年度总数,因此一条安静的住宅街和一个街区外的繁华街道,如果在同一边界内,可能显示完全相同的数据。覆盖医院、大学校园或工业园区的邮编,人均率可能异常偏高,因为那里事件数正常但纸面居民很少。',
- faqBehindData4Q: '"2 公里内的好学校"是否意味着我孩子可以入读?',
+ faqBehindData4Q: '“2 公里内的好学校”是否意味着我孩子可以入读?',
faqBehindData4A:
- '不一定。统计查找的是自身邮编落在您邮编中心点周围圆形范围内的公立学校。学区、宗教或选拔标准、兄弟姐妹优先以及录取规则都没有建模——附近的"好"或"杰出"学校可能从您家其实无法入读。请用此数字对比区域,决策前向学校或地方政府确认实际录取条件。',
- faqBehindData5Q: '为什么并非每户都有光纤的邮编也显示"Gigabit"?',
+ '不一定。统计查找的是自身邮编落在您邮编中心点周围圆形范围内的公立学校。学区、宗教或选拔标准、兄弟姐妹优先以及录取规则都没有建模——附近的“良好”或“优秀”学校可能从您家其实无法入读。请用此数字对比区域,决策前向学校或地方政府确认实际录取条件。',
+ faqBehindData5Q: '为什么并非每户都有光纤的邮编也显示“Gigabit”?',
faqBehindData5A:
- 'Ofcom Connected Nations 的宽带覆盖按邮编给出可达到每个速度档的物业百分比。我们显示有任何可用性的最高档,因此只要邮编内有一户能达到 Gigabit,就会显示"Gigabit 可用"。这正确回答了"这条街上到底有没有光纤?",但并不保证楼里每一套今天都能下单。签约前,请始终就您的具体地址向运营商核实。',
+ 'Ofcom Connected Nations 的宽带覆盖按邮编给出可达到每个速度档的物业百分比。我们显示有任何可用性的最高档,因此只要邮编内有一户能达到 Gigabit,就会显示“Gigabit 可用”。这正确回答了“这条街上到底有没有光纤?”,但并不保证楼里每一套今天都能下单。签约前,请始终就您的具体地址向运营商核实。',
faqBehindData6Q: '为什么公共交通时间在晚上或周末不变?',
faqBehindData6A:
- '每个目的地的公交时间是基于完整 GTFS 时刻表,按一个周二早上的出发窗口(07:30–08:30)一次性计算的。"普通"值是该窗口内行程的中位数,"最佳情况"是第 5 百分位。非高峰、深夜和周末班次没有建模,因此只有早高峰公交的邮编在地图上仍可能显示交通便利。请把这些数字当作工作日通勤估算,而不是全天平均。',
+ '每个目的地的公共交通时间是基于完整 GTFS 时刻表,按一个周二早上的出发窗口(07:30–08:30)一次性计算的。“普通”值是该窗口内行程的中位数,“最佳情况”是第 5 百分位。非高峰、深夜和周末班次没有建模,因此只有早高峰公交的邮编在地图上仍可能显示交通便利。请把这些数字当作工作日通勤估算,而不是全天平均。',
},
// ── Account Page ───────────────────────────────────
@@ -1258,12 +1262,12 @@ const zh: Translations = {
invitesPage: {
inviteLinksLicensed: '邀请链接仅对已授权用户开放。',
inviteAdminLabel: '邀请好友(100% 折扣)',
- inviteReferralLabel: '邀请好友(7折优惠)',
+ inviteReferralLabel: '邀请好友(七折优惠)',
generateFreeInvite: '生成免费邀请链接',
generateReferralLink: '生成推荐链接',
copyInviteLink: '复制邀请链接',
adminInvitesTitle: '管理员邀请(100% 折扣)',
- referralInvitesTitle: '推荐邀请(7折优惠)',
+ referralInvitesTitle: '推荐邀请(七折优惠)',
yourInviteLinks: '您的邀请链接',
noInvitesYet: '暂无已生成的邀请',
link: '链接',
@@ -1278,9 +1282,9 @@ const zh: Translations = {
youreInvited: '您收到了邀请!',
specialOffer: '特别优惠!',
invitedByFree: '{{name}} 邀请您获取免费终身访问权限。',
- invitedByDiscount: '{{name}} 与您分享了终身访问的7折优惠。',
+ invitedByDiscount: '{{name}} 与您分享了终身访问的七折优惠。',
genericFreeInvite: '您已被邀请获取免费终身访问权限。',
- genericDiscount: '一位朋友与您分享了终身访问的7折优惠。',
+ genericDiscount: '一位朋友与您分享了终身访问的七折优惠。',
exploreEvery: '找到适合您生活的邮编',
propertyInfo: '价格、通勤、学校、犯罪率、噪音、宽带、EPC 等',
invalidInvite: '无效的邀请',
@@ -1311,10 +1315,10 @@ const zh: Translations = {
poiCategories: '{{count}} 个兴趣点类别',
travelDestination: '{{count}} 个出行目的地',
travelDestinations: '{{count}} 个出行目的地',
- propertiesMatch: '{{count}} 套房产符合',
+ propertiesMatch: '匹配 {{count}} 套房产',
setFilters: '设置 {{count}} 个筛选:{{list}}',
noFiltersSet: '未设置筛选',
- toDestination: '{{mode}}到 {{label}} {{bounds}}',
+ toDestination: '{{mode}}前往 {{label}} {{bounds}}',
lessThanMin: '< {{max}} 分钟',
moreThanMin: '> {{min}} 分钟',
},
@@ -1323,7 +1327,7 @@ const zh: Translations = {
tutorial: {
step1Title: '告诉地图什么重要',
step1Content:
- '设置预算、通勤上限、学校质量、犯罪门槛、噪音容忍度、宽带需求,或任何您关心的条件。只有匹配区域会保持高亮。使用眼睛图标可按任意指标着色。',
+ '设置预算、通勤上限、学校质量、犯罪门槛、噪音容忍度、宽带需求,或任何您关心的条件。只有匹配区域会保持高亮。使用“地图着色”可按任意指标给地图着色。',
step2Title: '或者直接描述',
step2Content:
'用自然语言输入您的需求,例如“安静的地区,靠近好学校,£400,000 以下”,我们会为您设置筛选。',
@@ -1367,7 +1371,7 @@ const zh: Translations = {
'Number of bedrooms & living rooms': '卧室和客厅数量',
'Construction year': '建造年份',
'Date of last transaction': '上次交易日期',
- 'Former council house': '原公共住房',
+ 'Former council house': '原公房',
'Current energy rating': '当前能源评级',
'Potential energy rating': '潜在能源评级',
'Interior height (m)': '室内层高(米)',
@@ -1379,20 +1383,20 @@ const zh: Translations = {
'Travel time to nearest train or tube station (min)': '到最近火车或地铁站的出行时间(分钟)',
// ─ Feature names (Education) ─
- 'Good+ primary schools within 2km': '2公里内良好+小学数量',
- 'Good+ secondary schools within 2km': '2公里内良好+中学数量',
- 'Good+ primary schools within 5km': '5公里内良好+小学数量',
- 'Good+ secondary schools within 5km': '5公里内良好+中学数量',
- 'Outstanding primary schools within 2km': '2公里内优秀小学数量',
- 'Outstanding secondary schools within 2km': '2公里内优秀中学数量',
- 'Outstanding primary schools within 5km': '5公里内优秀小学数量',
- 'Outstanding secondary schools within 5km': '5公里内优秀中学数量',
- 'Education, Skills and Training Score': '教育、技能和培训得分',
+ 'Good+ primary schools within 2km': '2 公里内良好及以上小学数量',
+ 'Good+ secondary schools within 2km': '2 公里内良好及以上中学数量',
+ 'Good+ primary schools within 5km': '5 公里内良好及以上小学数量',
+ 'Good+ secondary schools within 5km': '5 公里内良好及以上中学数量',
+ 'Outstanding primary schools within 2km': '2 公里内优秀小学数量',
+ 'Outstanding secondary schools within 2km': '2 公里内优秀中学数量',
+ 'Outstanding primary schools within 5km': '5 公里内优秀小学数量',
+ 'Outstanding secondary schools within 5km': '5 公里内优秀中学数量',
+ 'Education, Skills and Training Score': '教育、技能与培训得分',
// ─ Feature names (Area development) ─
'Income Score': '收入得分',
'Employment Score': '就业得分',
- 'Health Deprivation and Disability Score': '健康与残障得分',
+ 'Health Deprivation and Disability Score': '健康剥夺与残障得分',
'Housing Conditions Score': '住房状况得分',
'Air Quality and Road Safety Score': '空气质量与道路安全得分',
@@ -1507,8 +1511,8 @@ const zh: Translations = {
Bakery: '面包店',
'Butcher & Fishmonger': '肉铺与鱼铺',
Greengrocer: '果蔬店',
- 'Off-Licence': '酒类商店',
- 'Deli & Specialty': '熟食与特产店',
+ 'Off-Licence': '酒类专卖店',
+ 'Deli & Specialty': '熟食与特色食品店',
'Fashion & Clothing': '时装服饰',
Electronics: '电子产品',
'Charity Shop': '慈善商店',
@@ -1529,7 +1533,7 @@ const zh: Translations = {
'Vet & Pet Care': '宠物医院与护理',
Bank: '银行',
'Travel Agent': '旅行社',
- Police: '警察',
+ Police: '警察局',
'Fire Station': '消防站',
'Ambulance Station': '急救站',
'GP Surgery': '全科诊所',
@@ -1540,7 +1544,7 @@ const zh: Translations = {
Physiotherapy: '理疗',
'Counselling & Therapy': '心理咨询与治疗',
'Care Home': '养老院',
- 'Medical & Mobility': '医疗器械与辅助设备',
+ 'Medical & Mobility': '医疗用品与行动辅助设备',
Museum: '博物馆',
Gallery: '美术馆',
Library: '图书馆',
@@ -1549,6 +1553,14 @@ const zh: Translations = {
Zoo: '动物园',
'Tourist Attraction': '旅游景点',
School: '学校',
+ 'Nursery school': '幼儿园',
+ 'Primary school': '小学',
+ 'Secondary school': '中学',
+ 'All-through school': '一贯制学校',
+ 'Sixth form': '高中(16+)',
+ 'Further education college': '继续教育学院',
+ University: '大学',
+ 'Special school': '特殊学校',
Hotel: '酒店',
'Local Business': '本地商业',
Offices: '写字楼',
diff --git a/frontend/src/lib/consts.ts b/frontend/src/lib/consts.ts
index 3d66190..538a5bc 100644
--- a/frontend/src/lib/consts.ts
+++ b/frontend/src/lib/consts.ts
@@ -171,6 +171,15 @@ export const POI_CATEGORY_LOGOS: Record = {
'Off-Licence': '/assets/twemoji/1f377.png',
'Planet Organic': '/assets/poi-icons/logos/planet_organic.svg',
'Rail station': '/assets/twemoji/1f686.png',
+ School: '/assets/twemoji/1f3eb.png',
+ 'Nursery school': '/assets/twemoji/1f9f8.png',
+ 'Primary school': '/assets/twemoji/1f392.png',
+ 'Secondary school': '/assets/twemoji/1f3eb.png',
+ 'All-through school': '/assets/twemoji/1f3eb.png',
+ 'Sixth form': '/assets/twemoji/1f4da.png',
+ 'Further education college': '/assets/twemoji/1f4da.png',
+ University: '/assets/twemoji/1f393.png',
+ 'Special school': '/assets/twemoji/1f91d.png',
"Sainsbury's": '/assets/poi-icons/logos/sainsburys.svg',
"Sainsbury's Local": '/assets/poi-icons/brands_2024/sainsburys_local.svg',
Spar: '/assets/poi-icons/logos/spar.svg',
@@ -198,6 +207,9 @@ export const POI_CLUSTER_RADIUS = 50;
/** Zoom level at which supercluster stops clustering */
export const POI_CLUSTER_MAX_ZOOM = 15;
+/** Zoom level at which individual POI cards are shown without hovering */
+export const POI_AUTO_CARD_ZOOM_THRESHOLD = POI_CLUSTER_MAX_ZOOM + 1;
+
/**
* Groups whose features should be collapsed into stacked bar charts.
* Keyed by feature group name. Each entry defines one stacked chart.
diff --git a/frontend/src/types.ts b/frontend/src/types.ts
index 8399321..f606ab8 100644
--- a/frontend/src/types.ts
+++ b/frontend/src/types.ts
@@ -119,6 +119,7 @@ export interface SchoolMetadata {
website?: string;
telephone?: string;
head_name?: string;
+ ofsted_rating?: string;
}
export interface POI {
diff --git a/output/recording-de-mobile/narration-script.json b/output/recording-de-mobile/narration-script.json
new file mode 100644
index 0000000..cba8971
--- /dev/null
+++ b/output/recording-de-mobile/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-de-mobile",
+ "voice": {
+ "instruct": "Calm and cheerful German male narrator with clear standard German pronunciation and a friendly, practical delivery.",
+ "language": "German",
+ "referenceText": "Willkommen zur Demonstration. Diese Sprecherstimme hören Sie im gesamten Video.",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "Wählen Sie kein Zuhause durch endloses Scrollen.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "Beschreiben Sie, was Ihnen wichtig ist. Budget, Pendelzeit, Schulen, alles.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "Die Karte zeigt jede passende Postleitzahl in ganz England.",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "Ein Regler bewegt sich. Die Karte antwortet sofort.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "Öffnen Sie eine Postleitzahl. Preise. Schulen. Kriminalität. Lärm. Alles auf einer Karte.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "Mit dieser Auswahl zu den Inseraten. Sie wissen jetzt, wo Sie suchen sollen.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. Wissen, wo Sie suchen sollten, bevor Inserate Ihre Suche bestimmen.",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording-de/narration-script.json b/output/recording-de/narration-script.json
new file mode 100644
index 0000000..69369d3
--- /dev/null
+++ b/output/recording-de/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-de",
+ "voice": {
+ "instruct": "Calm and cheerful German male narrator with clear standard German pronunciation and a friendly, practical delivery.",
+ "language": "German",
+ "referenceText": "Willkommen zur Demonstration. Diese Sprecherstimme hören Sie im gesamten Video.",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "Wählen Sie kein Zuhause durch endloses Scrollen.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "Beschreiben Sie, was Ihnen wichtig ist. Budget, Pendelzeit, Schulen, alles.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "Die Karte zeigt jede passende Postleitzahl in ganz England.",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "Ein Regler bewegt sich. Die Karte antwortet sofort.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "Öffnen Sie eine Postleitzahl. Preise. Schulen. Kriminalität. Lärm. Alles auf einer Karte.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "Mit dieser Auswahl zu den Inseraten. Sie wissen jetzt, wo Sie suchen sollen.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. Wissen, wo Sie suchen sollten, bevor Inserate Ihre Suche bestimmen.",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording-hi-mobile/narration-script.json b/output/recording-hi-mobile/narration-script.json
new file mode 100644
index 0000000..b18de27
--- /dev/null
+++ b/output/recording-hi-mobile/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-hi-mobile",
+ "voice": {
+ "instruct": "Calm and cheerful Indian male narrator speaking English with a strong Indian accent and a friendly, practical delivery.",
+ "language": "English",
+ "referenceText": "Welcome to the demonstration. This is the narrator voice you'll hear throughout the video.",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "Don't pick a home by scrolling listings.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "Describe what you want. Budget, commute, schools, whatever matters.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "The map lights up with every postcode in England that fits.",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "Move one slider. The map answers instantly.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "Open any postcode. Sold prices. Schools. Crime. Noise. All on one screen.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "Take your shortlist to the listings. Now you know where to search.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. Know where to look before listings take over.",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording-hi/narration-script.json b/output/recording-hi/narration-script.json
new file mode 100644
index 0000000..ea1c31a
--- /dev/null
+++ b/output/recording-hi/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-hi",
+ "voice": {
+ "instruct": "Calm and cheerful Indian male narrator speaking English with a strong Indian accent and a friendly, practical delivery.",
+ "language": "English",
+ "referenceText": "Welcome to the demonstration. This is the narrator voice you'll hear throughout the video.",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "Don't pick a home by scrolling listings.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "Describe what you want. Budget, commute, schools, whatever matters.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "The map lights up with every postcode in England that fits.",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "Move one slider. The map answers instantly.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "Open any postcode. Sold prices. Schools. Crime. Noise. All on one screen.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "Take your shortlist to the listings. Now you know where to search.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. Know where to look before listings take over.",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording-mobile/narration-script.json b/output/recording-mobile/narration-script.json
new file mode 100644
index 0000000..fd1156e
--- /dev/null
+++ b/output/recording-mobile/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-mobile",
+ "voice": {
+ "instruct": "Calm and cheerful young British male narrator from the North of England with a strong Manchester accent.",
+ "language": "English",
+ "referenceText": "Welcome to the demonstration. This is the narrator voice you'll hear throughout the video.",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "Don't pick a home by scrolling listings.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "Describe what you want. Budget, commute, schools, whatever matters.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "The map lights up with every postcode in England that fits.",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "Move one slider. The map answers instantly.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "Open any postcode. Sold prices. Schools. Crime. Noise. All on one screen.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "Take your shortlist to the listings. Now you know where to search.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. Know where to look before listings take over.",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording-zh-mobile/narration-script.json b/output/recording-zh-mobile/narration-script.json
new file mode 100644
index 0000000..25cc948
--- /dev/null
+++ b/output/recording-zh-mobile/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-zh-mobile",
+ "voice": {
+ "instruct": "Calm and cheerful Mandarin Chinese male narrator with clear standard Mandarin pronunciation and a friendly, practical delivery.",
+ "language": "Chinese",
+ "referenceText": "欢迎观看演示。整段视频都会使用这位旁白的声音。",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "别再靠刷房源挑家了。",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "用日常话告诉地图你想要的家。预算、通勤、学校,什么都行。",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "地图点亮每一个符合条件的英格兰邮编。",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "动一个滑块,地图立刻给答案。",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "打开任意邮编。成交价、学校、犯罪率、噪音,一目了然。",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "带着这份清单去房源网站。现在你知道该在哪儿找了。",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. 先知道该看哪里,再让房源牵着你走。",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording-zh/narration-script.json b/output/recording-zh/narration-script.json
new file mode 100644
index 0000000..a980608
--- /dev/null
+++ b/output/recording-zh/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording-zh",
+ "voice": {
+ "instruct": "Calm and cheerful Mandarin Chinese male narrator with clear standard Mandarin pronunciation and a friendly, practical delivery.",
+ "language": "Chinese",
+ "referenceText": "欢迎观看演示。整段视频都会使用这位旁白的声音。",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "别再靠刷房源挑家了。",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "用日常话告诉地图你想要的家。预算、通勤、学校,什么都行。",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "地图点亮每一个符合条件的英格兰邮编。",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "动一个滑块,地图立刻给答案。",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "打开任意邮编。成交价、学校、犯罪率、噪音,一目了然。",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "带着这份清单去房源网站。现在你知道该在哪儿找了。",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. 先知道该看哪里,再让房源牵着你走。",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/recording/narration-script.json b/output/recording/narration-script.json
new file mode 100644
index 0000000..358122a
--- /dev/null
+++ b/output/recording/narration-script.json
@@ -0,0 +1,48 @@
+{
+ "storyboard": "recording",
+ "voice": {
+ "instruct": "Calm and cheerful young British male narrator from the North of England with a strong Manchester accent.",
+ "language": "English",
+ "referenceText": "Welcome to the demonstration. This is the narrator voice you'll hear throughout the video.",
+ "temperature": 0.6,
+ "topP": 0.9,
+ "seed": 42
+ },
+ "items": [
+ {
+ "cueIndex": 0,
+ "text": "Don't pick a home by scrolling listings.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 1,
+ "text": "Describe what you want. Budget, commute, schools, whatever matters.",
+ "gapBeforeMs": 0
+ },
+ {
+ "cueIndex": 2,
+ "text": "The map lights up with every postcode in England that fits.",
+ "gapBeforeMs": 300
+ },
+ {
+ "cueIndex": 3,
+ "text": "Move one slider. The map answers instantly.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 4,
+ "text": "Open any postcode. Sold prices. Schools. Crime. Noise. All on one screen.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 5,
+ "text": "Take your shortlist to the listings. Now you know where to search.",
+ "gapBeforeMs": 500
+ },
+ {
+ "cueIndex": 6,
+ "text": "Perfect Postcode. Know where to look before listings take over.",
+ "gapBeforeMs": 600
+ }
+ ]
+}
\ No newline at end of file
diff --git a/output/storyboards.json b/output/storyboards.json
new file mode 100644
index 0000000..3335356
--- /dev/null
+++ b/output/storyboards.json
@@ -0,0 +1,108 @@
+{
+ "storyboards": [
+ {
+ "name": "recording",
+ "locale": "en",
+ "aspect": "16x9",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 16,
+ "publishedSize": {
+ "width": 1920,
+ "height": 1080
+ }
+ },
+ {
+ "name": "recording-mobile",
+ "locale": "en-mobile",
+ "aspect": "9x16",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 12,
+ "publishedSize": {
+ "width": 1080,
+ "height": 1920
+ }
+ },
+ {
+ "name": "recording-de",
+ "locale": "de",
+ "aspect": "16x9",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 16,
+ "publishedSize": {
+ "width": 1920,
+ "height": 1080
+ }
+ },
+ {
+ "name": "recording-de-mobile",
+ "locale": "de-mobile",
+ "aspect": "9x16",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 12,
+ "publishedSize": {
+ "width": 1080,
+ "height": 1920
+ }
+ },
+ {
+ "name": "recording-zh",
+ "locale": "zh",
+ "aspect": "16x9",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 16,
+ "publishedSize": {
+ "width": 1920,
+ "height": 1080
+ }
+ },
+ {
+ "name": "recording-zh-mobile",
+ "locale": "zh-mobile",
+ "aspect": "9x16",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 12,
+ "publishedSize": {
+ "width": 1080,
+ "height": 1920
+ }
+ },
+ {
+ "name": "recording-hi",
+ "locale": "hi",
+ "aspect": "16x9",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 16,
+ "publishedSize": {
+ "width": 1920,
+ "height": 1080
+ }
+ },
+ {
+ "name": "recording-hi-mobile",
+ "locale": "hi-mobile",
+ "aspect": "9x16",
+ "outputFps": 50,
+ "minDurationS": 10,
+ "maxDurationS": 75,
+ "posterTimeS": 12,
+ "publishedSize": {
+ "width": 1080,
+ "height": 1920
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/pipeline/download/map_assets.py b/pipeline/download/map_assets.py
index 9456177..89497ff 100644
--- a/pipeline/download/map_assets.py
+++ b/pipeline/download/map_assets.py
@@ -10,7 +10,11 @@ from pathlib import Path
from PIL import Image, ImageDraw
-from pipeline.transform.transform_poi import NAPTAN_EMOJIS, _CATEGORIES
+from pipeline.transform.transform_poi import (
+ NAPTAN_EMOJIS,
+ SCHOOL_ICON_CATEGORIES,
+ _CATEGORIES,
+)
GLYPHS_BASE = "https://protomaps.github.io/basemaps-assets/fonts"
SPRITES_BASE = "https://protomaps.github.io/basemaps-assets/sprites/v4"
@@ -109,6 +113,9 @@ def collect_twemoji_codes() -> list[str]:
for emoji in NAPTAN_EMOJIS.values():
emojis.add(emoji)
+ for emoji in SCHOOL_ICON_CATEGORIES.values():
+ emojis.add(emoji)
+
# First codepoint hex, matching frontend logic
return sorted({f"{ord(e[0]):x}" for e in emojis})
diff --git a/pipeline/transform/crime_hotspot_tiles.py b/pipeline/transform/crime_hotspot_tiles.py
index ab8faac..36aebce 100644
--- a/pipeline/transform/crime_hotspot_tiles.py
+++ b/pipeline/transform/crime_hotspot_tiles.py
@@ -124,6 +124,8 @@ def build_crime_hotspot_tiles(
str(max_zoom),
"--drop-densest-as-needed",
"--extend-zooms-if-still-dropping",
+ "--temporary-directory",
+ tmp,
str(ndjson_path),
],
check=True,
diff --git a/pipeline/transform/enrich_actual_listings.py b/pipeline/transform/enrich_actual_listings.py
new file mode 100644
index 0000000..cb6bdae
--- /dev/null
+++ b/pipeline/transform/enrich_actual_listings.py
@@ -0,0 +1,960 @@
+import argparse
+import re
+import tempfile
+from pathlib import Path
+
+import polars as pl
+from thefuzz import fuzz
+from tqdm import tqdm
+
+from pipeline.local_temp import local_tmp_dir
+from pipeline.transform.join_epc_pp import _scan_epc_certificates
+from pipeline.utils.fuzzy_join import normalize_address_key, normalize_postcode_key
+from pipeline.utils.postcode_mapping import build_postcode_mapping
+
+MIN_FLOOR_AREA_M2 = 10.0
+PROPERTY_MATCH_MIN_SCORE_WITH_NUMBERS = 82.0
+PROPERTY_MATCH_MIN_SCORE_WITHOUT_NUMBERS = 96.0
+PROPERTY_MATCH_MIN_MARGIN = 4.0
+EPC_MATCH_MIN_SCORE_WITH_NUMBERS = 82.0
+EPC_MATCH_MIN_SCORE_WITHOUT_NUMBERS = 96.0
+EPC_MATCH_MIN_MARGIN = 4.0
+ENRICHMENT_VERSION = 1
+
+_NUMBER_RE = re.compile(r"\d+")
+
+LISTING_REQUIRED_COLUMNS = [
+ "Bedrooms",
+ "Bathrooms",
+ "Number of bedrooms & living rooms",
+ "lon",
+ "lat",
+ "Postcode",
+ "Address per Property Register",
+ "Leasehold/Freehold",
+ "Property type",
+ "Property sub-type",
+ "Price qualifier",
+ "Total floor area (sqm)",
+ "Listing URL",
+ "Listing features",
+ "Listing date",
+ "Listing status",
+ "Asking price",
+ "Asking price per sqm",
+]
+
+PROPERTY_CANDIDATE_COLUMNS = [
+ "Address per Property Register",
+ "Postcode",
+ "Leasehold/Freehold",
+ "Last known price",
+ "Date of last transaction",
+ "Address per EPC",
+ "Current energy rating",
+ "Potential energy rating",
+ "Total floor area (sqm)",
+ "Number of bedrooms & living rooms",
+ "Interior height (m)",
+ "Construction year",
+ "Former council house",
+ "Is construction date approximate",
+ "Listed building",
+ "Estimated monthly rent",
+ "Street tree density percentile",
+ "Property type",
+ "Price per sqm",
+ "Estimated current price",
+ "Est. price per sqm",
+]
+
+PROPERTY_ENRICHMENT_COLUMNS = [
+ "Address per EPC",
+ "Current energy rating",
+ "Potential energy rating",
+ "Interior height (m)",
+ "Construction year",
+ "Former council house",
+ "Is construction date approximate",
+ "Listed building",
+ "Estimated monthly rent",
+ "Street tree density percentile",
+ "Date of last transaction",
+]
+
+EPC_ENRICHMENT_COLUMNS = [
+ "Address per EPC",
+ "Current energy rating",
+ "Potential energy rating",
+ "Total floor area (sqm)",
+ "Number of bedrooms & living rooms",
+ "Interior height (m)",
+ "Construction year",
+ "Former council house",
+]
+
+EPC_RATING_VALUES = ["A", "B", "C", "D", "E", "F", "G"]
+TENURE_VALUES = ["Freehold", "Leasehold"]
+PROPERTY_TYPE_VALUES = [
+ "Detached",
+ "Semi-Detached",
+ "Terraced",
+ "Flats/Maisonettes",
+ "Other",
+]
+
+COLUMN_DTYPES = {
+ "Address per EPC": pl.Utf8,
+ "Current energy rating": pl.Utf8,
+ "Potential energy rating": pl.Utf8,
+ "Total floor area (sqm)": pl.Float64,
+ "Number of bedrooms & living rooms": pl.Int32,
+ "Interior height (m)": pl.Float64,
+ "Construction year": pl.UInt16,
+ "Former council house": pl.Utf8,
+ "Is construction date approximate": pl.UInt8,
+ "Listed building": pl.Utf8,
+ "Estimated monthly rent": pl.Float32,
+ "Street tree density percentile": pl.Float32,
+ "Date of last transaction": pl.Datetime("us"),
+ "Property type": pl.Utf8,
+ "Leasehold/Freehold": pl.Utf8,
+}
+
+
+def _canonical_postcode_expr(column: str) -> pl.Expr:
+ compact = (
+ pl.col(column)
+ .cast(pl.Utf8)
+ .str.to_uppercase()
+ .str.replace_all(r"[^A-Z0-9]+", "")
+ .str.strip_chars()
+ )
+ return (
+ pl.when(compact.str.contains(r"^[A-Z]{1,2}\d[A-Z\d]?\d[A-Z]{2}$"))
+ .then(compact.str.replace(r"^(.+)([0-9][A-Z]{2})$", "${1} ${2}"))
+ .otherwise(None)
+ )
+
+
+def _clean_string_expr(column: str) -> pl.Expr:
+ stripped = pl.col(column).cast(pl.Utf8).str.strip_chars()
+ return pl.when(stripped == "").then(None).otherwise(stripped)
+
+
+def _coalesce_non_empty(*columns: str) -> pl.Expr:
+ return pl.coalesce(
+ [
+ pl.when(pl.col(column).cast(pl.Utf8).str.strip_chars() == "")
+ .then(None)
+ .otherwise(pl.col(column).cast(pl.Utf8))
+ for column in columns
+ ]
+ )
+
+
+def _valid_number_expr(column: str) -> pl.Expr:
+ return pl.when(pl.col(column).is_finite()).then(pl.col(column)).otherwise(None)
+
+
+def _read_listings(listings_path: Path, arcgis_path: Path) -> pl.DataFrame:
+ schema = pl.scan_parquet(listings_path).collect_schema()
+ missing = sorted(set(LISTING_REQUIRED_COLUMNS) - set(schema.names()))
+ if missing:
+ raise ValueError(f"{listings_path} is missing listing columns: {missing}")
+
+ listings = (
+ pl.scan_parquet(listings_path)
+ .with_row_index("_listing_idx")
+ .with_columns(
+ _canonical_postcode_expr("Postcode").alias("_original_postcode"),
+ normalize_address_key(pl.col("Address per Property Register")).alias(
+ "_listing_match_address"
+ ),
+ normalize_postcode_key(pl.col("Postcode")).alias("_listing_match_postcode"),
+ )
+ .collect(engine="streaming")
+ )
+
+ postcode_mapping = build_postcode_mapping(arcgis_path)
+ listings = (
+ listings.join(
+ postcode_mapping,
+ left_on="_original_postcode",
+ right_on="old_postcode",
+ how="left",
+ )
+ .with_columns(
+ pl.coalesce("new_postcode", "_original_postcode", "Postcode").alias(
+ "Postcode"
+ ),
+ )
+ .drop("new_postcode", strict=False)
+ .with_columns(
+ normalize_postcode_key(pl.col("Postcode")).alias("_listing_match_postcode"),
+ )
+ )
+ return listings
+
+
+def _load_property_candidates(
+ properties_path: Path, listing_postcodes: list[str]
+) -> pl.DataFrame:
+ schema = pl.scan_parquet(properties_path).collect_schema()
+ columns = [
+ column for column in PROPERTY_CANDIDATE_COLUMNS if column in schema.names()
+ ]
+ missing = sorted(
+ set(
+ [
+ "Address per Property Register",
+ "Postcode",
+ "Property type",
+ "Total floor area (sqm)",
+ ]
+ )
+ - set(columns)
+ )
+ if missing:
+ raise ValueError(f"{properties_path} is missing property columns: {missing}")
+
+ return (
+ pl.scan_parquet(properties_path)
+ .select(columns)
+ .with_columns(
+ normalize_postcode_key(pl.col("Postcode")).alias("_match_postcode")
+ )
+ .filter(pl.col("_match_postcode").is_in(listing_postcodes))
+ .with_columns(
+ normalize_address_key(pl.col("Address per Property Register")).alias(
+ "_match_register_address"
+ ),
+ normalize_address_key(pl.col("Address per EPC")).alias("_match_epc_address")
+ if "Address per EPC" in columns
+ else pl.lit(None, dtype=pl.Utf8).alias("_match_epc_address"),
+ )
+ .filter(
+ pl.col("_match_register_address").is_not_null()
+ | pl.col("_match_epc_address").is_not_null()
+ )
+ .with_row_index("_property_row")
+ .collect(engine="streaming")
+ )
+
+
+def _property_candidates_by_postcode(
+ candidates: pl.DataFrame,
+) -> dict[str, list[dict]]:
+ buckets: dict[str, list[dict]] = {}
+ for row in candidates.iter_rows(named=True):
+ postcode = row.get("_match_postcode")
+ if postcode:
+ buckets.setdefault(postcode, []).append(row)
+ return buckets
+
+
+def _numbers_compatible(left: str | None, right: str | None) -> bool:
+ if not left or not right:
+ return False
+ left_nums = set(_NUMBER_RE.findall(left))
+ right_nums = set(_NUMBER_RE.findall(right))
+ smaller, larger = (
+ (left_nums, right_nums)
+ if len(left_nums) <= len(right_nums)
+ else (right_nums, left_nums)
+ )
+ if not smaller and larger:
+ return False
+ return smaller.issubset(larger)
+
+
+def _has_number(address: str | None) -> bool:
+ return bool(address and _NUMBER_RE.search(address))
+
+
+def _ratio_bonus(
+ left: float | int | None, right: float | int | None, pct: float, cap: float
+) -> float:
+ if left is None or right is None:
+ return 0.0
+ try:
+ left_f = float(left)
+ right_f = float(right)
+ except (TypeError, ValueError):
+ return 0.0
+ if left_f <= 0 or right_f <= 0:
+ return 0.0
+ rel = abs(left_f - right_f) / max(left_f, right_f)
+ if rel > pct:
+ return 0.0
+ return cap * (1.0 - rel / pct)
+
+
+def _rooms_bonus(left: int | None, right: int | None) -> float:
+ if left is None or right is None:
+ return 0.0
+ try:
+ diff = abs(int(left) - int(right))
+ except (TypeError, ValueError):
+ return 0.0
+ if diff == 0:
+ return 4.0
+ if diff == 1:
+ return 2.0
+ return 0.0
+
+
+def _enum_bonus(
+ left: str | None, right: str | None, *, exact: float, mismatch: float
+) -> float:
+ if not left or not right:
+ return 0.0
+ return exact if left == right else mismatch
+
+
+def _address_score(query: str, candidate: str | None) -> int:
+ if not candidate:
+ return 0
+ return max(
+ fuzz.token_set_ratio(query, candidate),
+ fuzz.token_sort_ratio(query, candidate),
+ )
+
+
+def _best_property_candidate(listing: dict, candidates: list[dict]) -> dict | None:
+ query = listing.get("_listing_match_address")
+ if not query:
+ return None
+
+ listing_has_numbers = _has_number(query)
+ scored: list[tuple[float, int, dict, str]] = []
+ for candidate in candidates:
+ register_address = candidate.get("_match_register_address")
+ epc_address = candidate.get("_match_epc_address")
+ if listing_has_numbers and not (
+ _numbers_compatible(query, register_address)
+ or _numbers_compatible(query, epc_address)
+ ):
+ continue
+
+ register_score = _address_score(query, register_address)
+ epc_score = _address_score(query, epc_address)
+ base_score = max(register_score, epc_score)
+ if base_score == 0:
+ continue
+
+ score = float(base_score)
+ score += _enum_bonus(
+ listing.get("Property type"),
+ candidate.get("Property type"),
+ exact=7.0,
+ mismatch=-8.0,
+ )
+ score += _enum_bonus(
+ listing.get("Leasehold/Freehold"),
+ candidate.get("Leasehold/Freehold"),
+ exact=3.0,
+ mismatch=-3.0,
+ )
+ score += _ratio_bonus(
+ listing.get("Total floor area (sqm)"),
+ candidate.get("Total floor area (sqm)"),
+ pct=0.15,
+ cap=8.0,
+ )
+ score += _rooms_bonus(
+ listing.get("Number of bedrooms & living rooms"),
+ candidate.get("Number of bedrooms & living rooms"),
+ )
+ score += _ratio_bonus(
+ listing.get("Asking price"),
+ candidate.get("Estimated current price")
+ or candidate.get("Last known price"),
+ pct=0.25,
+ cap=3.0,
+ )
+ matched_address = (
+ "Address per Property Register"
+ if register_score >= epc_score
+ else "Address per EPC"
+ )
+ scored.append((score, base_score, candidate, matched_address))
+
+ if not scored:
+ return None
+ scored.sort(key=lambda item: item[0], reverse=True)
+ top = scored[0]
+ runner_up = scored[1][0] if len(scored) > 1 else None
+ margin = top[0] - runner_up if runner_up is not None else top[0]
+ threshold = (
+ PROPERTY_MATCH_MIN_SCORE_WITH_NUMBERS
+ if listing_has_numbers
+ else PROPERTY_MATCH_MIN_SCORE_WITHOUT_NUMBERS
+ )
+ if top[0] < threshold or margin < PROPERTY_MATCH_MIN_MARGIN:
+ return None
+
+ return {
+ "_listing_idx": listing["_listing_idx"],
+ "_property_row": top[2]["_property_row"],
+ "Historical property match score": round(top[0], 1),
+ "Historical property address score": top[1],
+ "Historical property match margin": round(margin, 1),
+ "Historical property match field": top[3],
+ "Historical property match status": "matched",
+ }
+
+
+def _match_properties(listings: pl.DataFrame, candidates: pl.DataFrame) -> pl.DataFrame:
+ schema = {
+ "_listing_idx": pl.UInt32,
+ "_property_row": pl.UInt32,
+ "Historical property match score": pl.Float32,
+ "Historical property address score": pl.Int32,
+ "Historical property match margin": pl.Float32,
+ "Historical property match field": pl.Utf8,
+ "Historical property match status": pl.Utf8,
+ }
+ if candidates.is_empty():
+ return pl.DataFrame(schema=schema)
+
+ buckets = _property_candidates_by_postcode(candidates)
+ matches = []
+ for listing in tqdm(
+ listings.iter_rows(named=True),
+ total=listings.height,
+ desc="Matching historical properties",
+ ):
+ postcode = listing.get("_listing_match_postcode")
+ if not postcode:
+ continue
+ match = _best_property_candidate(listing, buckets.get(postcode, []))
+ if match is not None:
+ matches.append(match)
+
+ if not matches:
+ return pl.DataFrame(schema=schema)
+ return pl.DataFrame(matches, schema=schema)
+
+
+def _prefix_columns(df: pl.DataFrame, columns: list[str], prefix: str) -> pl.DataFrame:
+ rename = {column: f"{prefix}{column}" for column in columns if column in df.columns}
+ return df.rename(rename)
+
+
+def _ensure_prefixed_columns(
+ df: pl.DataFrame, columns: list[str], prefix: str
+) -> pl.DataFrame:
+ missing_exprs = [
+ pl.lit(None, dtype=COLUMN_DTYPES.get(column, pl.Utf8)).alias(
+ f"{prefix}{column}"
+ )
+ for column in columns
+ if f"{prefix}{column}" not in df.columns
+ ]
+ if not missing_exprs:
+ return df
+ return df.with_columns(missing_exprs)
+
+
+def _property_match_frame(
+ matches: pl.DataFrame, candidates: pl.DataFrame
+) -> pl.DataFrame:
+ if matches.is_empty():
+ return matches
+ selected_columns = [
+ "_property_row",
+ *[
+ column
+ for column in PROPERTY_CANDIDATE_COLUMNS
+ if column in candidates.columns
+ ],
+ ]
+ matched = matches.join(
+ candidates.select(selected_columns), on="_property_row", how="left"
+ )
+ return _prefix_columns(
+ matched,
+ [column for column in PROPERTY_CANDIDATE_COLUMNS if column in matched.columns],
+ "_property_",
+ )
+
+
+def _canonical_epc_property_type_expr() -> pl.Expr:
+ bad_built_form = pl.col("built_form").is_null() | pl.col("built_form").is_in(
+ ["NO DATA!", "Not Recorded"]
+ )
+ has_epc = pl.col("epc_property_type").is_not_null()
+ is_house = pl.col("epc_property_type") == "House"
+ return (
+ pl.when(has_epc & is_house & ~bad_built_form)
+ .then(pl.col("built_form"))
+ .when(has_epc)
+ .then(pl.col("epc_property_type"))
+ .otherwise(None)
+ .replace(
+ {
+ "Flat": "Flats/Maisonettes",
+ "Maisonette": "Flats/Maisonettes",
+ "End-Terrace": "Terraced",
+ "Mid-Terrace": "Terraced",
+ "Enclosed End-Terrace": "Terraced",
+ "Enclosed Mid-Terrace": "Terraced",
+ "Bungalow": "Other",
+ "Park home": "Other",
+ "House": "Other",
+ }
+ )
+ )
+
+
+def _construction_year_expr(column: str = "construction_age_band") -> pl.Expr:
+ return (
+ pl.col(column)
+ .cast(pl.Utf8)
+ .str.replace("England and Wales: ", "")
+ .str.replace(" onwards", "")
+ .str.extract(r"(\d{4})", 1)
+ .cast(pl.UInt16, strict=False)
+ )
+
+
+def _fractional_year_expr(column: str) -> pl.Expr:
+ return (
+ pl.col(column).dt.year().cast(pl.Float32)
+ + (pl.col(column).dt.month().cast(pl.Float32) - 1.0) / 12.0
+ )
+
+
+def _load_epc_candidates(
+ epc_path: Path, listing_postcodes: list[str], temp_dir: Path
+) -> pl.DataFrame:
+ epc_base = _scan_epc_certificates(epc_path, temp_dir).with_columns(
+ normalize_address_key(pl.col("epc_address")).alias("_epc_match_address"),
+ normalize_postcode_key(pl.col("epc_postcode")).alias("_epc_match_postcode"),
+ )
+
+ epc = (
+ epc_base.filter(pl.col("_epc_match_postcode").is_in(listing_postcodes))
+ .sort("inspection_date", descending=True)
+ .group_by("_epc_match_address", "_epc_match_postcode")
+ .first()
+ .with_columns(
+ _canonical_epc_property_type_expr().alias("_epc_canonical_property_type"),
+ _construction_year_expr().alias("Construction year"),
+ pl.when(pl.col("current_energy_rating").is_in(EPC_RATING_VALUES))
+ .then(pl.col("current_energy_rating"))
+ .otherwise(None)
+ .alias("Current energy rating"),
+ pl.when(pl.col("potential_energy_rating").is_in(EPC_RATING_VALUES))
+ .then(pl.col("potential_energy_rating"))
+ .otherwise(None)
+ .alias("Potential energy rating"),
+ pl.col("total_floor_area").alias("Total floor area (sqm)"),
+ pl.col("number_habitable_rooms").alias("Number of bedrooms & living rooms"),
+ pl.col("floor_height").alias("Interior height (m)"),
+ pl.col("epc_address").alias("Address per EPC"),
+ )
+ .drop("tenure", strict=False)
+ )
+
+ social_tenure = (
+ epc_base.filter(pl.col("_epc_match_postcode").is_in(listing_postcodes))
+ .filter(pl.col("tenure").str.to_lowercase().str.contains("social"))
+ .select("_epc_match_address", "_epc_match_postcode")
+ .unique()
+ .with_columns(pl.lit("Yes").alias("Former council house"))
+ )
+
+ return (
+ epc.join(
+ social_tenure,
+ on=["_epc_match_address", "_epc_match_postcode"],
+ how="left",
+ )
+ .with_columns(pl.col("Former council house").fill_null("No"))
+ .filter(pl.col("_epc_match_address").is_not_null())
+ .with_row_index("_epc_row")
+ .select(
+ "_epc_row",
+ "_epc_match_address",
+ "_epc_match_postcode",
+ "_epc_canonical_property_type",
+ *EPC_ENRICHMENT_COLUMNS,
+ )
+ .collect(engine="streaming")
+ )
+
+
+def _epc_candidates_by_postcode(candidates: pl.DataFrame) -> dict[str, list[dict]]:
+ buckets: dict[str, list[dict]] = {}
+ for row in candidates.iter_rows(named=True):
+ postcode = row.get("_epc_match_postcode")
+ if postcode:
+ buckets.setdefault(postcode, []).append(row)
+ return buckets
+
+
+def _best_epc_candidate(listing: dict, candidates: list[dict]) -> dict | None:
+ query = listing.get("_listing_match_address")
+ if not query:
+ return None
+
+ listing_has_numbers = _has_number(query)
+ scored: list[tuple[float, int, dict]] = []
+ for candidate in candidates:
+ address = candidate.get("_epc_match_address")
+ if listing_has_numbers and not _numbers_compatible(query, address):
+ continue
+ base_score = _address_score(query, address)
+ if base_score == 0:
+ continue
+ score = float(base_score)
+ score += _enum_bonus(
+ listing.get("Property type"),
+ candidate.get("_epc_canonical_property_type"),
+ exact=6.0,
+ mismatch=-6.0,
+ )
+ score += _ratio_bonus(
+ listing.get("Total floor area (sqm)"),
+ candidate.get("Total floor area (sqm)"),
+ pct=0.12,
+ cap=8.0,
+ )
+ score += _rooms_bonus(
+ listing.get("Number of bedrooms & living rooms"),
+ candidate.get("Number of bedrooms & living rooms"),
+ )
+ scored.append((score, base_score, candidate))
+
+ if not scored:
+ return None
+ scored.sort(key=lambda item: item[0], reverse=True)
+ top = scored[0]
+ runner_up = scored[1][0] if len(scored) > 1 else None
+ margin = top[0] - runner_up if runner_up is not None else top[0]
+ threshold = (
+ EPC_MATCH_MIN_SCORE_WITH_NUMBERS
+ if listing_has_numbers
+ else EPC_MATCH_MIN_SCORE_WITHOUT_NUMBERS
+ )
+ if top[0] < threshold or margin < EPC_MATCH_MIN_MARGIN:
+ return None
+ return {
+ "_listing_idx": listing["_listing_idx"],
+ "_epc_row": top[2]["_epc_row"],
+ "EPC match score": round(top[0], 1),
+ "EPC address score": top[1],
+ "EPC match margin": round(margin, 1),
+ "EPC match status": "matched",
+ }
+
+
+def _match_epc(listings: pl.DataFrame, candidates: pl.DataFrame) -> pl.DataFrame:
+ schema = {
+ "_listing_idx": pl.UInt32,
+ "_epc_row": pl.UInt32,
+ "EPC match score": pl.Float32,
+ "EPC address score": pl.Int32,
+ "EPC match margin": pl.Float32,
+ "EPC match status": pl.Utf8,
+ }
+ if candidates.is_empty():
+ return pl.DataFrame(schema=schema)
+
+ buckets = _epc_candidates_by_postcode(candidates)
+ matches = []
+ for listing in tqdm(
+ listings.iter_rows(named=True),
+ total=listings.height,
+ desc="Matching EPC certificates",
+ ):
+ postcode = listing.get("_listing_match_postcode")
+ if not postcode:
+ continue
+ match = _best_epc_candidate(listing, buckets.get(postcode, []))
+ if match is not None:
+ matches.append(match)
+
+ if not matches:
+ return pl.DataFrame(schema=schema)
+ return pl.DataFrame(matches, schema=schema)
+
+
+def _epc_match_frame(matches: pl.DataFrame, candidates: pl.DataFrame) -> pl.DataFrame:
+ if matches.is_empty():
+ return matches
+ matched = matches.join(
+ candidates.select("_epc_row", *EPC_ENRICHMENT_COLUMNS),
+ on="_epc_row",
+ how="left",
+ )
+ return _prefix_columns(
+ matched,
+ [column for column in EPC_ENRICHMENT_COLUMNS if column in matched.columns],
+ "_epc_",
+ )
+
+
+def _join_postcode_features(
+ listings: pl.DataFrame, postcode_features_path: Path
+) -> pl.DataFrame:
+ postcode_features = pl.scan_parquet(postcode_features_path).collect(
+ engine="streaming"
+ )
+ return listings.join(
+ postcode_features, on="Postcode", how="left", suffix="_postcode"
+ )
+
+
+def _coalesce_feature_columns(df: pl.DataFrame) -> pl.DataFrame:
+ with_columns: list[pl.Expr] = [
+ pl.lit(ENRICHMENT_VERSION, dtype=pl.UInt16).alias(
+ "Actual listing enrichment version"
+ ),
+ _coalesce_non_empty(
+ "_epc_Address per EPC",
+ "_property_Address per EPC",
+ ).alias("Address per EPC"),
+ pl.when(pl.col("Property type").is_in(PROPERTY_TYPE_VALUES))
+ .then(pl.col("Property type"))
+ .otherwise(pl.col("_property_Property type"))
+ .alias("Property type"),
+ pl.when(pl.col("Leasehold/Freehold").is_in(TENURE_VALUES))
+ .then(pl.col("Leasehold/Freehold"))
+ .otherwise(pl.col("_property_Leasehold/Freehold"))
+ .alias("Leasehold/Freehold"),
+ pl.coalesce(
+ _valid_number_expr("Total floor area (sqm)"),
+ _valid_number_expr("_epc_Total floor area (sqm)"),
+ _valid_number_expr("_property_Total floor area (sqm)"),
+ ).alias("Total floor area (sqm)"),
+ pl.when(pl.col("Number of bedrooms & living rooms") > 0)
+ .then(pl.col("Number of bedrooms & living rooms"))
+ .otherwise(
+ pl.coalesce(
+ pl.col("_epc_Number of bedrooms & living rooms"),
+ pl.col("_property_Number of bedrooms & living rooms"),
+ )
+ )
+ .cast(pl.Int32, strict=False)
+ .alias("Number of bedrooms & living rooms"),
+ pl.col("Asking price").alias("Estimated current price"),
+ pl.col("Asking price").alias("Last known price"),
+ _coalesce_non_empty(
+ "_epc_Current energy rating",
+ "_property_Current energy rating",
+ ).alias("Current energy rating"),
+ _coalesce_non_empty(
+ "_epc_Potential energy rating",
+ "_property_Potential energy rating",
+ ).alias("Potential energy rating"),
+ pl.coalesce(
+ _valid_number_expr("_epc_Interior height (m)"),
+ _valid_number_expr("_property_Interior height (m)"),
+ ).alias("Interior height (m)"),
+ pl.coalesce(
+ pl.col("_epc_Construction year"),
+ pl.col("_property_Construction year"),
+ )
+ .cast(pl.UInt16, strict=False)
+ .alias("Construction year"),
+ _coalesce_non_empty(
+ "_epc_Former council house",
+ "_property_Former council house",
+ )
+ .fill_null("No")
+ .alias("Former council house"),
+ pl.col("_property_Is construction date approximate").alias(
+ "Is construction date approximate"
+ ),
+ pl.col("_property_Listed building").fill_null("No").alias("Listed building"),
+ pl.col("_property_Estimated monthly rent").alias("Estimated monthly rent"),
+ pl.col("_property_Street tree density percentile").alias(
+ "Street tree density percentile"
+ ),
+ _fractional_year_expr("_property_Date of last transaction").alias(
+ "Date of last transaction"
+ ),
+ ]
+
+ df = df.with_columns(with_columns)
+ df = df.with_columns(
+ pl.when(
+ pl.col("Asking price").is_not_null()
+ & pl.col("Total floor area (sqm)").is_not_null()
+ & (pl.col("Total floor area (sqm)") > 0)
+ )
+ .then((pl.col("Asking price") / pl.col("Total floor area (sqm)")).round(0))
+ .otherwise(None)
+ .cast(pl.Int32, strict=False)
+ .alias("Asking price per sqm"),
+ ).with_columns(
+ pl.col("Asking price per sqm").alias("Est. price per sqm"),
+ pl.col("Asking price per sqm").alias("Price per sqm"),
+ )
+
+ return df
+
+
+def _drop_internal_columns(df: pl.DataFrame) -> pl.DataFrame:
+ internal_prefixes = ("_property_", "_epc_")
+ internal_exact = {
+ "_listing_idx",
+ "_listing_match_address",
+ "_listing_match_postcode",
+ "_original_postcode",
+ "_property_row",
+ "_epc_row",
+ "lat_postcode",
+ "lon_postcode",
+ }
+ drop_cols = [
+ column
+ for column in df.columns
+ if column in internal_exact or column.startswith(internal_prefixes)
+ ]
+ return df.drop(drop_cols, strict=False)
+
+
+def build_enriched_actual_listings(
+ listings_path: Path,
+ properties_path: Path,
+ postcode_features_path: Path,
+ arcgis_path: Path,
+ output_path: Path,
+ *,
+ epc_path: Path | None = None,
+) -> pl.DataFrame:
+ print(f"Loading listings from {listings_path}...")
+ listings = _read_listings(listings_path, arcgis_path)
+ listing_postcodes = (
+ listings.select("_listing_match_postcode")
+ .drop_nulls()
+ .unique()
+ .to_series()
+ .to_list()
+ )
+ print(f"Listings: {listings.height}; unique postcodes: {len(listing_postcodes)}")
+
+ print(f"Loading property candidates from {properties_path}...")
+ property_candidates = _load_property_candidates(properties_path, listing_postcodes)
+ print(f"Property candidates: {property_candidates.height}")
+ property_matches = _match_properties(listings, property_candidates)
+ print(f"Historical property matches: {property_matches.height}")
+ property_match_frame = _property_match_frame(property_matches, property_candidates)
+
+ enriched = _join_postcode_features(listings, postcode_features_path)
+ if not property_match_frame.is_empty():
+ enriched = enriched.join(property_match_frame, on="_listing_idx", how="left")
+ else:
+ enriched = enriched.with_columns(
+ pl.lit(None, dtype=pl.Utf8).alias("Historical property match status")
+ )
+
+ if epc_path is not None:
+ with tempfile.TemporaryDirectory(
+ prefix="actual_listing_epc_", dir=local_tmp_dir()
+ ) as tmpdir:
+ print(f"Loading EPC candidates from {epc_path}...")
+ epc_candidates = _load_epc_candidates(
+ epc_path, listing_postcodes, Path(tmpdir)
+ )
+ print(f"EPC candidates: {epc_candidates.height}")
+ epc_matches = _match_epc(listings, epc_candidates)
+ print(f"EPC matches: {epc_matches.height}")
+ epc_match_frame = _epc_match_frame(epc_matches, epc_candidates)
+ if not epc_match_frame.is_empty():
+ enriched = enriched.join(epc_match_frame, on="_listing_idx", how="left")
+ else:
+ enriched = enriched.with_columns(
+ pl.lit(None, dtype=pl.Utf8).alias("EPC match status")
+ )
+ else:
+ enriched = enriched.with_columns(
+ pl.lit(None, dtype=pl.Utf8).alias("EPC match status")
+ )
+
+ enriched = _ensure_prefixed_columns(
+ enriched, PROPERTY_CANDIDATE_COLUMNS, "_property_"
+ )
+ enriched = _ensure_prefixed_columns(enriched, EPC_ENRICHMENT_COLUMNS, "_epc_")
+ enriched = _coalesce_feature_columns(enriched)
+ enriched = _drop_internal_columns(enriched)
+
+ output_path.parent.mkdir(parents=True, exist_ok=True)
+ enriched.write_parquet(output_path)
+ size_mb = output_path.stat().st_size / (1024 * 1024)
+ print(
+ f"Wrote {enriched.height} enriched listings to {output_path} ({size_mb:.1f} MB)"
+ )
+ return enriched
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(
+ description="Build a pre-enriched actual-listings parquet for the server"
+ )
+ parser.add_argument(
+ "--listings",
+ type=Path,
+ default=Path("finder/data/online_listings_buy.parquet"),
+ help="Input scraped listings parquet",
+ )
+ parser.add_argument(
+ "--properties",
+ type=Path,
+ default=Path("property-data/properties.parquet"),
+ help="Historical properties parquet",
+ )
+ parser.add_argument(
+ "--postcode-features",
+ type=Path,
+ default=Path("property-data/postcode.parquet"),
+ help="Postcode feature parquet",
+ )
+ parser.add_argument(
+ "--arcgis",
+ type=Path,
+ default=Path("property-data/arcgis_data.parquet"),
+ help="ArcGIS/NSPL postcode parquet used for terminated-postcode remapping",
+ )
+ parser.add_argument(
+ "--epc",
+ type=Path,
+ default=Path("manual-data/domestic-csv.zip"),
+ help="Optional EPC certificates CSV/zip for direct listing-to-EPC fuzzy matching",
+ )
+ parser.add_argument(
+ "--no-epc",
+ action="store_true",
+ help="Skip direct EPC matching even when --epc exists",
+ )
+ parser.add_argument(
+ "--output",
+ type=Path,
+ default=Path("finder/data/online_listings_buy_enriched.parquet"),
+ help="Output enriched listings parquet",
+ )
+ args = parser.parse_args()
+
+ epc_path = None if args.no_epc else args.epc
+ if epc_path is not None and not epc_path.exists():
+ print(
+ f"EPC source not found at {epc_path}; continuing without direct EPC matching"
+ )
+ epc_path = None
+
+ build_enriched_actual_listings(
+ listings_path=args.listings,
+ properties_path=args.properties,
+ postcode_features_path=args.postcode_features,
+ arcgis_path=args.arcgis,
+ epc_path=epc_path,
+ output_path=args.output,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/pipeline/transform/merge.py b/pipeline/transform/merge.py
index 06d23b3..b2baf85 100644
--- a/pipeline/transform/merge.py
+++ b/pipeline/transform/merge.py
@@ -22,6 +22,7 @@ LISTED_BUILDING_FEATURE = "Listed building"
LISTED_BUILDING_MATCH_RADIUS_M = 250.0
LISTED_BUILDING_NEAREST_POSTCODES = 3
LISTED_BUILDING_MIN_MATCH_SCORE = 95
+_UNPUBLISHED_CONSERVATION_AREA_PREFIX = "no data available for publication"
_IOD_PERCENTILE_COLUMNS = [
"Education, Skills and Training Score",
@@ -429,19 +430,38 @@ def _normalise_crs(crs: object | None) -> str:
return str(crs) if crs else "EPSG:4326"
+def _is_unpublished_conservation_area_record(name: object) -> bool:
+ return (
+ isinstance(name, str)
+ and name.strip().casefold().startswith(_UNPUBLISHED_CONSERVATION_AREA_PREFIX)
+ )
+
+
def _load_conservation_area_geometries(
conservation_areas_path: Path,
) -> tuple[list[BaseGeometry], str]:
- metadata, table = pyogrio.read_arrow(conservation_areas_path, columns=[])
+ metadata, table = pyogrio.read_arrow(conservation_areas_path, columns=["NAME"])
geometry_name = metadata.get("geometry_name") or table.column_names[-1]
+ names = table["NAME"].combine_chunks().to_pylist()
geometries = []
- for geom in from_wkb(table[geometry_name].combine_chunks().to_pylist()):
- if geom is not None and not geom.is_empty:
+ skipped_unpublished = 0
+ for name, geom in zip(
+ names, from_wkb(table[geometry_name].combine_chunks().to_pylist()), strict=True
+ ):
+ if _is_unpublished_conservation_area_record(name):
+ skipped_unpublished += 1
+ elif geom is not None and not geom.is_empty:
geometries.append(geom)
if not geometries:
raise ValueError(
f"{conservation_areas_path} does not contain any usable polygon geometries"
)
+ if skipped_unpublished:
+ print(
+ "Skipped "
+ f"{skipped_unpublished} Historic England unpublished conservation-area "
+ "placeholder polygons"
+ )
return geometries, _normalise_crs(metadata.get("crs"))
diff --git a/pipeline/transform/poi_proximity.py b/pipeline/transform/poi_proximity.py
index 06a25ac..8d970fb 100644
--- a/pipeline/transform/poi_proximity.py
+++ b/pipeline/transform/poi_proximity.py
@@ -25,7 +25,7 @@ GREENSPACE_PARK_FUNCTIONS = {
}
GROCERY_DYNAMIC_FILTER_MIN_POIS = 100
-DYNAMIC_FILTER_ALL_GROUPS = {"Public Transport", "Leisure"}
+DYNAMIC_FILTER_ALL_GROUPS = {"Public Transport", "Leisure", "Health"}
DYNAMIC_FILTER_COUNT_THRESHOLD_GROUPS = {"Groceries"}
DYNAMIC_FILTER_EXCLUDED_CATEGORIES = {"Park"}
diff --git a/pipeline/transform/test_enrich_actual_listings.py b/pipeline/transform/test_enrich_actual_listings.py
new file mode 100644
index 0000000..86eeca4
--- /dev/null
+++ b/pipeline/transform/test_enrich_actual_listings.py
@@ -0,0 +1,143 @@
+from pathlib import Path
+
+import polars as pl
+
+from pipeline.transform.enrich_actual_listings import build_enriched_actual_listings
+
+
+def test_build_enriched_actual_listings_joins_postcode_and_property_features(
+ tmp_path: Path,
+) -> None:
+ listings_path = tmp_path / "listings.parquet"
+ properties_path = tmp_path / "properties.parquet"
+ postcode_path = tmp_path / "postcode.parquet"
+ arcgis_path = tmp_path / "arcgis.parquet"
+ output_path = tmp_path / "online_listings_buy_enriched.parquet"
+
+ pl.DataFrame(
+ {
+ "Bedrooms": [2],
+ "Bathrooms": [1],
+ "Number of bedrooms & living rooms": [3],
+ "lon": [-0.1],
+ "lat": [51.5],
+ "Postcode": ["AA1 1AB"],
+ "Address per Property Register": ["1 High Street"],
+ "Leasehold/Freehold": [None],
+ "Property type": ["Terraced"],
+ "Property sub-type": ["Terraced"],
+ "Price qualifier": [""],
+ "Total floor area (sqm)": [None],
+ "Listing URL": ["https://example.test/listing"],
+ "Listing features": [["Garden"]],
+ "Listing date": [None],
+ "Listing status": ["For sale"],
+ "Asking price": [300_000],
+ "Asking price per sqm": [None],
+ },
+ schema={
+ "Bedrooms": pl.Int32,
+ "Bathrooms": pl.Int32,
+ "Number of bedrooms & living rooms": pl.Int32,
+ "lon": pl.Float64,
+ "lat": pl.Float64,
+ "Postcode": pl.Utf8,
+ "Address per Property Register": pl.Utf8,
+ "Leasehold/Freehold": pl.Utf8,
+ "Property type": pl.Utf8,
+ "Property sub-type": pl.Utf8,
+ "Price qualifier": pl.Utf8,
+ "Total floor area (sqm)": pl.Float64,
+ "Listing URL": pl.Utf8,
+ "Listing features": pl.List(pl.Utf8),
+ "Listing date": pl.Datetime("us"),
+ "Listing status": pl.Utf8,
+ "Asking price": pl.Int64,
+ "Asking price per sqm": pl.Int32,
+ },
+ ).write_parquet(listings_path)
+
+ pl.DataFrame(
+ {
+ "Address per Property Register": ["1 HIGH STREET"],
+ "Postcode": ["AA1 1AA"],
+ "Leasehold/Freehold": ["Freehold"],
+ "Address per EPC": ["1 High Street"],
+ "Current energy rating": ["C"],
+ "Potential energy rating": ["B"],
+ "Total floor area (sqm)": [80.0],
+ "Number of bedrooms & living rooms": [4],
+ "Interior height (m)": [2.4],
+ "Construction year": [1935],
+ "Former council house": ["No"],
+ "Listed building": ["No"],
+ "Estimated monthly rent": [1200.0],
+ "Street tree density percentile": [75.0],
+ "Property type": ["Terraced"],
+ "Estimated current price": [310_000.0],
+ },
+ schema={
+ "Address per Property Register": pl.Utf8,
+ "Postcode": pl.Utf8,
+ "Leasehold/Freehold": pl.Utf8,
+ "Address per EPC": pl.Utf8,
+ "Current energy rating": pl.Utf8,
+ "Potential energy rating": pl.Utf8,
+ "Total floor area (sqm)": pl.Float64,
+ "Number of bedrooms & living rooms": pl.Int32,
+ "Interior height (m)": pl.Float64,
+ "Construction year": pl.UInt16,
+ "Former council house": pl.Utf8,
+ "Listed building": pl.Utf8,
+ "Estimated monthly rent": pl.Float32,
+ "Street tree density percentile": pl.Float32,
+ "Property type": pl.Utf8,
+ "Estimated current price": pl.Float64,
+ },
+ ).write_parquet(properties_path)
+
+ pl.DataFrame(
+ {
+ "Postcode": ["AA1 1AA"],
+ "Income Score": [82.5],
+ "Within conservation area": ["Yes"],
+ }
+ ).write_parquet(postcode_path)
+
+ pl.DataFrame(
+ {
+ "pcds": ["AA1 1AA", "AA1 1AB"],
+ "ctry25cd": ["E92000001", "E92000001"],
+ "doterm": [None, "202401"],
+ "east1m": [100.0, 105.0],
+ "north1m": [100.0, 105.0],
+ },
+ schema={
+ "pcds": pl.Utf8,
+ "ctry25cd": pl.Utf8,
+ "doterm": pl.Utf8,
+ "east1m": pl.Float64,
+ "north1m": pl.Float64,
+ },
+ ).write_parquet(arcgis_path)
+
+ result = build_enriched_actual_listings(
+ listings_path=listings_path,
+ properties_path=properties_path,
+ postcode_features_path=postcode_path,
+ arcgis_path=arcgis_path,
+ output_path=output_path,
+ epc_path=None,
+ )
+
+ row = result.row(0, named=True)
+ assert output_path.exists()
+ assert row["Postcode"] == "AA1 1AA"
+ assert row["Historical property match status"] == "matched"
+ assert row["Income Score"] == 82.5
+ assert row["Within conservation area"] == "Yes"
+ assert row["Leasehold/Freehold"] == "Freehold"
+ assert row["Total floor area (sqm)"] == 80.0
+ assert row["Asking price per sqm"] == 3750
+ assert row["Estimated current price"] == 300_000
+ assert row["Current energy rating"] == "C"
diff --git a/pipeline/transform/test_merge.py b/pipeline/transform/test_merge.py
index 4ee7d88..e2cfa89 100644
--- a/pipeline/transform/test_merge.py
+++ b/pipeline/transform/test_merge.py
@@ -1,14 +1,17 @@
import polars as pl
+import pyarrow as pa
import pytest
-from shapely import box
+from shapely import box, to_wkb
from pipeline.transform.merge import (
_AREA_COLUMNS,
CONSERVATION_AREA_FEATURE,
LISTED_BUILDING_FEATURE,
TREE_DENSITY_FEATURE,
+ _is_unpublished_conservation_area_record,
_is_dynamic_poi_metric_column,
_less_deprived_percentile_expr,
+ _load_conservation_area_geometries,
_matched_listed_building_flags,
_postcode_conservation_area_flags,
_postcode_listed_building_candidates,
@@ -82,6 +85,45 @@ def test_postcode_conservation_area_flags_marks_point_membership() -> None:
]
+def test_unpublished_conservation_area_records_are_identified() -> None:
+ assert _is_unpublished_conservation_area_record(
+ "No data available for publication by HE"
+ )
+ assert not _is_unpublished_conservation_area_record("Bloomsbury")
+ assert not _is_unpublished_conservation_area_record(None)
+
+
+def test_load_conservation_area_geometries_skips_unpublished_placeholders(
+ monkeypatch: pytest.MonkeyPatch,
+ tmp_path,
+) -> None:
+ real_area = box(0, 0, 1, 1)
+ placeholder_area = box(-100, -100, 100, 100)
+
+ def fake_read_arrow(path, columns):
+ assert path == tmp_path / "conservation_areas.gpkg"
+ assert columns == ["NAME"]
+ table = pa.table(
+ {
+ "NAME": [
+ "Central Village",
+ "No data available for publication by HE",
+ ],
+ "SHAPE": to_wkb([real_area, placeholder_area]),
+ }
+ )
+ return {"geometry_name": "SHAPE", "crs": "EPSG:4326"}, table
+
+ monkeypatch.setattr("pipeline.transform.merge.pyogrio.read_arrow", fake_read_arrow)
+
+ geometries, crs = _load_conservation_area_geometries(
+ tmp_path / "conservation_areas.gpkg"
+ )
+
+ assert crs == "EPSG:4326"
+ assert geometries == [real_area]
+
+
def test_postcode_listed_building_candidates_uses_nearby_postcodes() -> None:
listed_points = pl.DataFrame(
{
diff --git a/pipeline/transform/test_poi_proximity.py b/pipeline/transform/test_poi_proximity.py
index 10aee24..e584d18 100644
--- a/pipeline/transform/test_poi_proximity.py
+++ b/pipeline/transform/test_poi_proximity.py
@@ -37,6 +37,7 @@ def test_dynamic_poi_groups_include_requested_categories_only() -> None:
assert set(display_names.values()) == {
"Bus stop",
"Café",
+ "Pharmacy",
"Rail station",
"Restaurant",
"Tesco",
@@ -44,7 +45,6 @@ def test_dynamic_poi_groups_include_requested_categories_only() -> None:
assert "poi_waitrose" not in groups
assert "poi_park" not in groups
assert "poi_school" not in groups
- assert "poi_pharmacy" not in groups
def test_dynamic_poi_metric_renames_support_park_count_options() -> None:
diff --git a/pipeline/transform/transform_poi.py b/pipeline/transform/transform_poi.py
index b43a2a5..72703aa 100644
--- a/pipeline/transform/transform_poi.py
+++ b/pipeline/transform/transform_poi.py
@@ -1316,17 +1316,122 @@ def transform_grocery_retail_points(
).select("id", "name", "category", "icon_category", "group", "lat", "lng", "emoji")
-def transform_gias_schools(gias_path: Path) -> pl.LazyFrame:
- """Convert the GIAS register parquet into POI rows with school metadata."""
- return pl.scan_parquet(gias_path).select(
+SCHOOL_ICON_CATEGORIES: dict[str, str] = {
+ "Nursery school": "🧸",
+ "Primary school": "🎒",
+ "Secondary school": "🏫",
+ "All-through school": "🏫",
+ "Sixth form": "📚",
+ "Further education college": "📚",
+ "University": "🎓",
+ "Special school": "🤝",
+ "School": "🏫",
+}
+
+
+def _school_icon_category_expr() -> pl.Expr:
+ """Pick an icon category from GIAS phase/type_group/age_range. type_group
+ wins for universities, FE colleges and special schools (which span multiple
+ phases); otherwise phase determines the bucket. For independent and other
+ non-statutory schools where GIAS leaves phase null, fall back to the
+ age_range bounds so they still split into the right pill."""
+ # GIAS phase mixes casing ("Middle deemed Primary" vs "Middle deemed
+ # primary") so we normalise before matching.
+ phase = pl.col("phase").str.to_lowercase()
+ # age_range is "–" using an em-dash; both ends may be missing.
+ age_parts = pl.col("age_range").str.split_exact("–", 1)
+ min_age = age_parts.struct.field("field_0").cast(pl.Int32, strict=False)
+ max_age = age_parts.struct.field("field_1").cast(pl.Int32, strict=False)
+ return (
+ pl.when(pl.col("type_group") == "Universities")
+ .then(pl.lit("University"))
+ .when(pl.col("type_group") == "Special schools")
+ .then(pl.lit("Special school"))
+ .when(pl.col("type_group") == "Colleges")
+ .then(pl.lit("Further education college"))
+ .when(phase == "nursery")
+ .then(pl.lit("Nursery school"))
+ .when(phase.is_in(["primary", "middle deemed primary"]))
+ .then(pl.lit("Primary school"))
+ .when(phase.is_in(["secondary", "middle deemed secondary"]))
+ .then(pl.lit("Secondary school"))
+ .when(phase == "all-through")
+ .then(pl.lit("All-through school"))
+ .when(phase.is_in(["16 plus", "sixth form"]))
+ .then(pl.lit("Sixth form"))
+ # Age-range fallback for null-phase rows (≈3k Independents + Academies
+ # GIAS doesn't classify by phase).
+ .when(max_age <= 5)
+ .then(pl.lit("Nursery school"))
+ .when(min_age >= 16)
+ .then(pl.lit("Sixth form"))
+ .when((min_age <= 6) & (max_age >= 16))
+ .then(pl.lit("All-through school"))
+ .when(max_age <= 11)
+ .then(pl.lit("Primary school"))
+ .when(min_age >= 10)
+ .then(pl.lit("Secondary school"))
+ .otherwise(pl.lit("School"))
+ )
+
+
+OFSTED_OEIF_LABELS = {
+ "1": "Outstanding",
+ "2": "Good",
+ "3": "Requires improvement",
+ "4": "Inadequate",
+}
+
+
+def _load_ofsted_ratings(ofsted_path: Path) -> pl.LazyFrame:
+ """Project the latest OEIF effectiveness grade to a human-readable label,
+ keyed by URN so it can be joined onto the GIAS register. Grades 1-4 map to
+ the conventional Ofsted labels; "Not judged" (post-2025 reform schools that
+ only have a report card) is preserved verbatim; null grades drop out."""
+ grade_col = pl.col("Latest OEIF overall effectiveness")
+ label = (
+ pl.when(grade_col == "1")
+ .then(pl.lit(OFSTED_OEIF_LABELS["1"]))
+ .when(grade_col == "2")
+ .then(pl.lit(OFSTED_OEIF_LABELS["2"]))
+ .when(grade_col == "3")
+ .then(pl.lit(OFSTED_OEIF_LABELS["3"]))
+ .when(grade_col == "4")
+ .then(pl.lit(OFSTED_OEIF_LABELS["4"]))
+ .when(grade_col == "Not judged")
+ .then(pl.lit("Not judged"))
+ .otherwise(None)
+ )
+ return (
+ pl.scan_parquet(ofsted_path)
+ .select(
+ pl.col("URN").cast(pl.Int64).alias("urn"),
+ label.alias("ofsted_rating"),
+ )
+ .filter(pl.col("ofsted_rating").is_not_null())
+ )
+
+
+def transform_gias_schools(gias_path: Path, ofsted_path: Path) -> pl.LazyFrame:
+ """Convert the GIAS register parquet into POI rows with school metadata.
+ Ofsted ratings are joined by URN so each school carries its latest OEIF
+ overall effectiveness grade (Outstanding/Good/Requires improvement/
+ Inadequate/Not judged), surfaced in the map popup."""
+ icon_category_expr = _school_icon_category_expr()
+ emoji_expr = icon_category_expr.replace_strict(SCHOOL_ICON_CATEGORIES)
+ ofsted = _load_ofsted_ratings(ofsted_path)
+ # category mirrors icon_category so the dashboard renders one toggle per
+ # school type (Nursery / Primary / Secondary / Sixth form / University /…)
+ # instead of bundling every GIAS row under a single "School" pill.
+ return pl.scan_parquet(gias_path).join(ofsted, on="urn", how="left").select(
pl.concat_str([pl.lit("gias-"), pl.col("urn").cast(pl.String)]).alias("id"),
pl.col("name"),
- pl.lit("School").alias("category"),
- pl.lit("School").alias("icon_category"),
+ icon_category_expr.alias("category"),
+ icon_category_expr.alias("icon_category"),
pl.lit("Education").alias("group"),
pl.col("lat").cast(pl.Float64),
pl.col("lng").cast(pl.Float64),
- pl.lit("🏫").alias("emoji"),
+ emoji_expr.alias("emoji"),
pl.col("phase").alias("school_phase"),
pl.col("type").alias("school_type"),
pl.col("type_group").alias("school_type_group"),
@@ -1346,6 +1451,7 @@ def transform_gias_schools(gias_path: Path) -> pl.LazyFrame:
pl.col("website").alias("school_website"),
pl.col("telephone").cast(pl.String, strict=False).alias("school_telephone"),
pl.col("head_name").alias("school_head_name"),
+ pl.col("ofsted_rating").alias("school_ofsted_rating"),
)
@@ -1355,6 +1461,7 @@ def transform(
boundary_path: Path,
grocery_retail_points_path: Path,
gias_path: Path,
+ ofsted_path: Path,
) -> pl.LazyFrame:
lf = pl.scan_parquet(input_path)
@@ -1420,7 +1527,12 @@ def transform(
grocery_df = pl.read_parquet(grocery_retail_points_path)
grocery_pois = transform_grocery_retail_points(grocery_df, boundary_path)
- frames = [lf, naptan, grocery_pois.lazy(), transform_gias_schools(gias_path)]
+ frames = [
+ lf,
+ naptan,
+ grocery_pois.lazy(),
+ transform_gias_schools(gias_path, ofsted_path),
+ ]
return pl.concat(frames, how="diagonal_relaxed")
@@ -1453,6 +1565,12 @@ def main():
required=True,
help="GIAS schools register parquet (replaces OSM schools)",
)
+ parser.add_argument(
+ "--ofsted",
+ type=Path,
+ required=True,
+ help="Ofsted latest-inspections parquet (provides per-URN ratings)",
+ )
parser.add_argument(
"--output", type=Path, required=True, help="Output filtered POIs parquet file"
)
@@ -1464,6 +1582,7 @@ def main():
args.boundary,
args.grocery_retail_points,
args.gias,
+ args.ofsted,
).collect(engine="streaming")
df.write_parquet(args.output)
diff --git a/pipeline/transform/tree_overlay_tiles.py b/pipeline/transform/tree_overlay_tiles.py
index d879bab..56ef6ee 100644
--- a/pipeline/transform/tree_overlay_tiles.py
+++ b/pipeline/transform/tree_overlay_tiles.py
@@ -219,6 +219,8 @@ def build_tree_overlay_tiles(
str(max_zoom),
"--drop-smallest-as-needed",
"--extend-zooms-if-still-dropping",
+ "--temporary-directory",
+ tmp,
str(ndjson_path),
],
check=True,
diff --git a/r5-java/run.sh b/r5-java/run.sh
index a6b77ff..37a118c 100755
--- a/r5-java/run.sh
+++ b/r5-java/run.sh
@@ -17,8 +17,10 @@ set -euo pipefail
# - places_ref.parquet: place order reference
#
# Usage:
-# ./r5-java/run.sh [--demo]
-# --demo only compute Bank + TCR, transit only (quick test)
+# ./r5-java/run.sh [--demo] [--cache-warmers]
+# --demo only compute Bank + TCR, transit only (quick test)
+# --cache-warmers only compute Bank + Tower Gateway DLR, all modes (LinkageCache warmup);
+# skips origins whose output parquet already exists
# --- Defaults ---
THREADS=12
@@ -32,16 +34,18 @@ NETWORK_DIR=property-data/r5-network
OUTPUT_BASE=property-data/travel-times
R5_DIR=r5-java
DEMO_FLAG=""
+CACHE_WARMERS_FLAG=""
# --- Parse args ---
while [[ $# -gt 0 ]]; do
case $1 in
- --threads) THREADS="$2"; shift 2 ;;
- --heap) HEAP="$2"; shift 2 ;;
- --network-dir) NETWORK_DIR="$2"; shift 2 ;;
- --output-dir) OUTPUT_BASE="$2"; shift 2 ;;
- --demo) DEMO_FLAG="--demo"; shift ;;
- --demo-cars=*) DEMO_FLAG="--demo-cars ${1#--demo-cars=}"; shift ;;
+ --threads) THREADS="$2"; shift 2 ;;
+ --heap) HEAP="$2"; shift 2 ;;
+ --network-dir) NETWORK_DIR="$2"; shift 2 ;;
+ --output-dir) OUTPUT_BASE="$2"; shift 2 ;;
+ --demo) DEMO_FLAG="--demo"; shift ;;
+ --demo-cars=*) DEMO_FLAG="--demo-cars ${1#--demo-cars=}"; shift ;;
+ --cache-warmers) CACHE_WARMERS_FLAG="--cache-warmers"; shift ;;
*) echo "Unknown: $1"; exit 1 ;;
esac
done
@@ -165,7 +169,7 @@ java -Xmx"$HEAP" \
--places property-data/places.parquet \
--output-dir "$OUTPUT_BASE" \
--threads "$THREADS" \
- $DEMO_FLAG
+ $DEMO_FLAG $CACHE_WARMERS_FLAG
echo ""
echo "=== Complete ==="
diff --git a/r5-java/src/main/java/propertymap/App.java b/r5-java/src/main/java/propertymap/App.java
index 753c261..a9935d1 100644
--- a/r5-java/src/main/java/propertymap/App.java
+++ b/r5-java/src/main/java/propertymap/App.java
@@ -63,15 +63,12 @@ public class App {
private static final Set DEMO_PLACES = Set.of(
"Bank tube station", "Tottenham Court Road tube station");
/**
- * Always-first origins (per-mode). The cache-warmest London core: these origins
- * each touch ~100 unique global tiles, so running them up front builds the
- * LinkageCache that every subsequent London-ish origin reuses.
- * Order within this list is preserved in submission order.
+ * Origins computed by the {@code --cache-warmers} flag. The cache-warmest
+ * London core: these origins each touch ~100 unique global tiles, so running
+ * them populates the LinkageCache that every later London-ish origin reuses.
*/
- private static final List PRIORITY_PLACES = List.of(
- "Bank tube station",
- "Tower Gateway DLR station",
- "Tottenham Court Road tube station");
+ private static final Set CACHE_WARMER_PLACES = Set.of(
+ "Bank tube station", "Tower Gateway DLR station");
private static final int MAX_RETRIES = 2;
/** Writer pool size. Holds one DuckDB connection per thread. */
@@ -122,6 +119,7 @@ public class App {
int threads = Integer.parseInt(optionalArg(args, "--threads", "4"));
boolean enablePaths = true;
boolean demo = hasFlag(args, "--demo");
+ boolean cacheWarmersOnly = hasFlag(args, "--cache-warmers");
Path outDir = Paths.get(outputDirStr);
Files.createDirectories(outDir);
@@ -190,6 +188,15 @@ public class App {
modes = DEMO_MODES;
System.err.printf("DEMO MODE: %d places (transit only)%n", originIndices.length);
for (int i : originIndices) System.err.printf(" - %s%n", originNames[i]);
+ } else if (cacheWarmersOnly) {
+ List warmerIdx = new ArrayList<>();
+ for (int i = 0; i < nOrigins; i++) {
+ if (CACHE_WARMER_PLACES.contains(originNames[i])) warmerIdx.add(i);
+ }
+ originIndices = warmerIdx.stream().mapToInt(Integer::intValue).toArray();
+ modes = MODES;
+ System.err.printf("CACHE-WARMERS MODE: %d places (all modes)%n", originIndices.length);
+ for (int i : originIndices) System.err.printf(" - %s%n", originNames[i]);
} else {
// Normal mode: use all travel-eligible England places
originIndices = englandIndices.stream().sorted()
@@ -327,21 +334,12 @@ public class App {
return;
}
- // Ordering policy:
- // 1. PRIORITY_PLACES first, in the literal order they're listed (Bank, Tower
- // Gateway DLR, TCR). These dense London origins are the best LinkageCache
- // warmers — every later origin in the SE benefits.
- // 2. Then LPT (longest-processing-time-first): dense urban origins do far
- // more work than rural ones. Submitting them first prevents a long tail
- // where a few London origins finish after everything else drains.
+ // Ordering policy: LPT (longest-processing-time-first). Dense urban origins
+ // do far more work than rural ones; submitting them first prevents a long
+ // tail where a few London origins finish after everything else drains.
double modeRadius = Router.maxRadiusKm(mode);
- remaining.sort(Comparator.comparing(
- idx -> {
- int prio = PRIORITY_PLACES.indexOf(originNames[idx]);
- return prio < 0 ? Integer.MAX_VALUE : prio;
- })
- .thenComparing(Comparator.comparingInt((Integer idx) ->
- Router.estimateWorkload(postcodeIndex, originLats[idx], originLons[idx], modeRadius)).reversed()));
+ remaining.sort(Comparator.comparingInt((Integer idx) ->
+ Router.estimateWorkload(postcodeIndex, originLats[idx], originLons[idx], modeRadius)).reversed());
long startMs = System.currentTimeMillis();
int total = remaining.size();
@@ -527,7 +525,7 @@ public class App {
if (args[i].equals(name)) return args[i + 1];
}
System.err.println("Missing required argument: " + name);
- System.err.println("Usage: App --postcodes FILE --places FILE --output-dir DIR [--threads N] [--demo]");
+ System.err.println("Usage: App --postcodes FILE --places FILE --output-dir DIR [--threads N] [--demo] [--cache-warmers]");
System.exit(1);
return null; // unreachable
}
diff --git a/server-rs/src/data/actual_listings.rs b/server-rs/src/data/actual_listings.rs
index 4b3289f..937b73d 100644
--- a/server-rs/src/data/actual_listings.rs
+++ b/server-rs/src/data/actual_listings.rs
@@ -61,6 +61,9 @@ pub struct ActualListingData {
/// overlaid where available. This lets the listings endpoint use the same filter
/// execution path as the property endpoints.
pub filter_feature_data: Vec,
+ /// Row-major dynamic postcode POI metrics aligned with
+ /// PropertyData::poi_metrics.feature_names.
+ pub poi_filter_feature_data: Vec,
pub grid: GridIndex,
}
@@ -109,16 +112,16 @@ impl ActualListingData {
let listing_status = InternedColumn::build(&opt_to_string(&listing_status_raw));
let filter_feature_data = build_filter_feature_data(
+ &df,
property_data,
- &postcode,
- &address,
&property_type_raw,
&leasehold_freehold_raw,
&rooms_total,
&floor_area_sqm,
&asking_price,
&asking_price_per_sqm,
- );
+ )?;
+ let poi_filter_feature_data = build_poi_filter_feature_data(&df, property_data)?;
let grid = GridIndex::build(&lat, &lon, GRID_CELL_SIZE);
@@ -144,6 +147,7 @@ impl ActualListingData {
listing_date_iso,
features,
filter_feature_data,
+ poi_filter_feature_data,
grid,
})
}
@@ -174,49 +178,37 @@ impl ActualListingData {
#[allow(clippy::too_many_arguments)]
fn build_filter_feature_data(
+ df: &DataFrame,
property_data: Option<&PropertyData>,
- postcode: &[String],
- address: &[Option],
property_type: &[Option],
leasehold_freehold: &[Option],
rooms_total: &[Option],
floor_area_sqm: &[Option],
asking_price: &[Option],
asking_price_per_sqm: &[Option],
-) -> Vec {
+) -> Result> {
let Some(property_data) = property_data else {
- return Vec::new();
+ return Ok(Vec::new());
};
let num_features = property_data.num_features;
- let mut feature_data = vec![NAN_U16; postcode.len() * num_features];
- let mut joined_rows = 0usize;
+ let row_count = df.height();
+ let mut feature_data = vec![NAN_U16; row_count * num_features];
+ let quant = property_data.quant_ref();
+ let mut encoded_columns = 0usize;
- for (row, postcode_value) in postcode.iter().enumerate() {
- let Some(address_value) = address[row]
- .as_deref()
- .map(str::trim)
- .filter(|v| !v.is_empty())
- else {
- continue;
- };
-
- let query = format!("{address_value} {postcode_value}");
- let Some(&property_row) = property_data.search_addresses(&query, 1).first() else {
- continue;
- };
- if property_data.postcode(property_row) != postcode_value {
- continue;
+ for (feat_idx, name) in property_data.feature_names.iter().enumerate() {
+ if feat_idx < property_data.num_numeric {
+ if let Some(values) = extract_optional_feature_f32(df, name)? {
+ encode_numeric_feature(&mut feature_data, property_data, &quant, feat_idx, values);
+ encoded_columns += 1;
+ }
+ } else if let Some(values) = extract_optional_feature_str(df, name)? {
+ encode_enum_feature(&mut feature_data, property_data, feat_idx, values);
+ encoded_columns += 1;
}
-
- let dst = row * num_features;
- let src = property_row * num_features;
- feature_data[dst..dst + num_features]
- .copy_from_slice(&property_data.feature_data[src..src + num_features]);
- joined_rows += 1;
}
- let quant = property_data.quant_ref();
overlay_numeric_feature(
&mut feature_data,
property_data,
@@ -281,11 +273,50 @@ fn build_filter_feature_data(
);
info!(
- rows = postcode.len(),
- joined_rows, "Actual listings joined to property feature matrix"
+ rows = row_count,
+ encoded_columns, "Actual listings feature matrix read from enriched parquet"
);
- feature_data
+ Ok(feature_data)
+}
+
+fn build_poi_filter_feature_data(
+ df: &DataFrame,
+ property_data: Option<&PropertyData>,
+) -> Result> {
+ let Some(property_data) = property_data else {
+ return Ok(Vec::new());
+ };
+ let poi_metrics = &property_data.poi_metrics;
+ let num_features = poi_metrics.num_features();
+ if num_features == 0 {
+ return Ok(Vec::new());
+ }
+
+ let row_count = df.height();
+ let mut feature_data = vec![NAN_U16; row_count * num_features];
+ let quant = poi_metrics.quant_ref();
+ let mut encoded_columns = 0usize;
+
+ for (metric_idx, name) in poi_metrics.feature_names.iter().enumerate() {
+ let Some(values) = extract_optional_feature_f32(df, name)? else {
+ continue;
+ };
+ for (row, value) in values.into_iter().enumerate() {
+ let dst = row * num_features + metric_idx;
+ feature_data[dst] = value
+ .map(|value| encode_numeric_value(&quant, metric_idx, value))
+ .unwrap_or(NAN_U16);
+ }
+ encoded_columns += 1;
+ }
+
+ info!(
+ rows = row_count,
+ encoded_columns, "Actual listings POI metrics read from enriched parquet"
+ );
+
+ Ok(feature_data)
}
fn feature_index(property_data: &PropertyData, name: &str) -> Option {
@@ -323,6 +354,53 @@ fn overlay_numeric_feature(
}
}
+fn encode_numeric_feature(
+ feature_data: &mut [u16],
+ property_data: &PropertyData,
+ quant: &QuantRef<'_>,
+ feat_idx: usize,
+ values: I,
+) where
+ I: IntoIterator- >,
+{
+ let num_features = property_data.num_features;
+ for (row, value) in values.into_iter().enumerate() {
+ let dst = row * num_features + feat_idx;
+ feature_data[dst] = value
+ .map(|value| encode_numeric_value(quant, feat_idx, value))
+ .unwrap_or(NAN_U16);
+ }
+}
+
+fn extract_optional_feature_f32(df: &DataFrame, name: &str) -> Result