lgtm
This commit is contained in:
parent
084117cea8
commit
a8de0a614d
36 changed files with 1329 additions and 522 deletions
|
|
@ -34,17 +34,31 @@ function getStoredLanguage(): LanguageCode | null {
|
|||
}
|
||||
}
|
||||
|
||||
function getUrlLanguage(): LanguageCode | null {
|
||||
try {
|
||||
if (typeof window === 'undefined') return null;
|
||||
const value = new URLSearchParams(window.location.search).get('lang');
|
||||
return value ? toSupportedLanguage(value) : null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getBrowserLanguages(): readonly string[] {
|
||||
if (typeof navigator === 'undefined') return [];
|
||||
return navigator.languages?.length ? navigator.languages : [navigator.language];
|
||||
}
|
||||
|
||||
function detectLanguage(): LanguageCode {
|
||||
// 1. Explicit user choice (persisted from the language dropdown)
|
||||
// 1. Explicit URL language, used by generated screenshot/OG image URLs.
|
||||
const urlLanguage = getUrlLanguage();
|
||||
if (urlLanguage) return urlLanguage;
|
||||
|
||||
// 2. Explicit user choice (persisted from the language dropdown)
|
||||
const stored = getStoredLanguage();
|
||||
if (stored) return stored;
|
||||
|
||||
// 2. Browser preference (navigator.languages falls back to navigator.language)
|
||||
// 3. Browser preference (navigator.languages falls back to navigator.language)
|
||||
for (const tag of getBrowserLanguages()) {
|
||||
const language = toSupportedLanguage(tag);
|
||||
if (language) return language;
|
||||
|
|
|
|||
|
|
@ -80,13 +80,6 @@ const de: Translations = {
|
|||
home: 'Startseite',
|
||||
},
|
||||
|
||||
// ── Toasts ─────────────────────────────────────────
|
||||
toasts: {
|
||||
propertySaved: 'Immobilie gespeichert!',
|
||||
viewSaved: 'Gespeicherte ansehen',
|
||||
dontShowAgain: 'Nicht erneut anzeigen',
|
||||
},
|
||||
|
||||
// ── SEO Page Chrome ────────────────────────────────
|
||||
seo: {
|
||||
breadcrumb: 'Breadcrumb',
|
||||
|
|
@ -563,8 +556,8 @@ const de: Translations = {
|
|||
'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, Einladungen und Einladungsrouten werden gegebenenfalls als „noindex“ markiert oder für den Crawler-Zugriff blockiert.',
|
||||
'Saved search data is account-scoped': 'Gespeicherte Suchdaten sind kontobezogen',
|
||||
'Saved searches and properties 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 Eigenschaften sind für die Verwendung durch angemeldete Benutzer vorgesehen. Sie sind nicht in der öffentlichen Sitemap enthalten und sollten nicht als öffentlicher Inhalt gecrawlt werden können.',
|
||||
'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.',
|
||||
'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.':
|
||||
|
|
@ -797,8 +790,6 @@ const de: Translations = {
|
|||
// ── Properties Pane ────────────────────────────────
|
||||
propertyCard: {
|
||||
unknownAddress: 'Unbekannte Adresse',
|
||||
unsaveProperty: 'Immobilie nicht mehr merken',
|
||||
saveProperty: 'Immobilie merken',
|
||||
estValue: 'Gesch. Wert:',
|
||||
type: 'Typ:',
|
||||
builtForm: 'Bauweise:',
|
||||
|
|
@ -838,6 +829,11 @@ const de: Translations = {
|
|||
showAllStatsFallback:
|
||||
'Wechseln Sie zu allen Immobilien, um dieses Gebiet ohne aktive Filter zu prüfen.',
|
||||
showAllStats: 'Alle Immobilien anzeigen',
|
||||
closestBlockingFilters: 'Nächste Filter, die dieses Gebiet ausschließen',
|
||||
lowerMinTo: 'Minimum auf {{value}} senken',
|
||||
raiseMaxTo: 'Maximum auf {{value}} erhöhen',
|
||||
allowCategory: '{{value}} zulassen',
|
||||
travelTo: 'Fahrt zu {{destination}}',
|
||||
viewProperties: '{{count}} Immobilien ansehen',
|
||||
viewPropertiesShort: 'Immobilien ansehen',
|
||||
priceHistory: 'Preisentwicklung',
|
||||
|
|
@ -1276,20 +1272,11 @@ const de: Translations = {
|
|||
noSavedSearches: 'Noch keine gespeicherten Suchen',
|
||||
noSavedSearchesDesc:
|
||||
'Speichere deine Filter und Kartenansicht, um genau dort weiterzumachen, wo du aufgehört hast.',
|
||||
noSavedProperties: 'Noch keine gespeicherten Immobilien',
|
||||
noSavedPropertiesDesc:
|
||||
'Merke dir Immobilien während du erkundest und erstelle deine Auswahlliste, ohne den Überblick zu verlieren.',
|
||||
openPostcode: 'Postleitzahl öffnen',
|
||||
clickToRename: 'Klicken zum Umbenennen',
|
||||
notesPlaceholder: 'Notiere deine Gedanken...',
|
||||
deleteSearch: 'Suche löschen',
|
||||
deleteSearchConfirm:
|
||||
'Möchtest du diese gespeicherte Suche wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
|
||||
deleteProperty: 'Immobilie löschen',
|
||||
deletePropertyConfirm:
|
||||
'Möchtest du diese gespeicherte Immobilie wirklich löschen? Dies kann nicht rückgängig gemacht werden.',
|
||||
bed: 'Schlafz.',
|
||||
epc: 'EPC',
|
||||
},
|
||||
|
||||
// ── Invites Page ───────────────────────────────────
|
||||
|
|
@ -1337,12 +1324,6 @@ const de: Translations = {
|
|||
failedToValidate: 'Einladungslink konnte nicht validiert werden',
|
||||
},
|
||||
|
||||
// ── Map Page ───────────────────────────────────────
|
||||
mapPage: {
|
||||
unsavedProperty: 'Entfernt',
|
||||
savedProperty: 'Gespeichert',
|
||||
},
|
||||
|
||||
// ── Format / Time ──────────────────────────────────
|
||||
format: {
|
||||
justNow: 'gerade eben',
|
||||
|
|
|
|||
|
|
@ -78,13 +78,6 @@ const en = {
|
|||
home: 'Home',
|
||||
},
|
||||
|
||||
// ── Toasts ─────────────────────────────────────────
|
||||
toasts: {
|
||||
propertySaved: 'Property saved!',
|
||||
viewSaved: 'View saved',
|
||||
dontShowAgain: "Don't show again",
|
||||
},
|
||||
|
||||
// ── SEO Page Chrome ────────────────────────────────
|
||||
seo: {
|
||||
breadcrumb: 'Breadcrumb',
|
||||
|
|
@ -544,8 +537,8 @@ const en = {
|
|||
'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, 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': 'Saved search data is account-scoped',
|
||||
'Saved searches and properties are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
|
||||
'Saved searches and properties are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.',
|
||||
'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.':
|
||||
'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.':
|
||||
|
|
@ -772,8 +765,6 @@ const en = {
|
|||
// ── Properties Pane ────────────────────────────────
|
||||
propertyCard: {
|
||||
unknownAddress: 'Unknown Address',
|
||||
unsaveProperty: 'Unsave property',
|
||||
saveProperty: 'Save property',
|
||||
estValue: 'Est. value:',
|
||||
type: 'Type:',
|
||||
builtForm: 'Built form:',
|
||||
|
|
@ -811,6 +802,11 @@ const en = {
|
|||
showAllStatsFallback:
|
||||
'Switch to all properties to inspect this area without the active filters.',
|
||||
showAllStats: 'Show all properties',
|
||||
closestBlockingFilters: 'Closest filters excluding this area',
|
||||
lowerMinTo: 'Lower minimum to {{value}}',
|
||||
raiseMaxTo: 'Raise maximum to {{value}}',
|
||||
allowCategory: 'Allow {{value}}',
|
||||
travelTo: 'Travel to {{destination}}',
|
||||
viewProperties: 'View {{count}} Properties',
|
||||
viewPropertiesShort: 'View properties',
|
||||
priceHistory: 'Price History',
|
||||
|
|
@ -1186,7 +1182,7 @@ const en = {
|
|||
// FAQ items — Privacy and Data Protection
|
||||
faqPrivacy1Q: 'Do you store personal data about me?',
|
||||
faqPrivacy1A:
|
||||
'The property and neighbourhood data doesn’t contain your personal details. If you create an account, we store only what’s needed to run the service, such as your email address, access status, newsletter choice, saved searches, saved properties, and payment records handled by Stripe. We handle account data under UK privacy law.',
|
||||
'The property and neighbourhood data doesn’t contain your personal details. If you create an account, we store only what’s needed to run the service, such as your email address, access status, newsletter choice, saved searches, shared links, and payment records handled by Stripe. We handle account data under UK privacy law.',
|
||||
// FAQ items — Why Perfect Postcode
|
||||
faqWhy1Q: 'What does this show that listing portals usually don’t?',
|
||||
faqWhy1A:
|
||||
|
|
@ -1241,19 +1237,10 @@ const en = {
|
|||
noSavedSearches: 'No saved searches yet',
|
||||
noSavedSearchesDesc:
|
||||
'Save your filters and map view so you can pick up exactly where you left off.',
|
||||
noSavedProperties: 'No saved properties yet',
|
||||
noSavedPropertiesDesc:
|
||||
'Bookmark properties as you explore and build your shortlist without losing track.',
|
||||
openPostcode: 'Open postcode',
|
||||
clickToRename: 'Click to rename',
|
||||
notesPlaceholder: 'Jot down your thoughts...',
|
||||
deleteSearch: 'Delete search',
|
||||
deleteSearchConfirm: 'Are you sure you want to delete this saved search? This can’t be undone.',
|
||||
deleteProperty: 'Delete property',
|
||||
deletePropertyConfirm:
|
||||
'Are you sure you want to delete this saved property? This can’t be undone.',
|
||||
bed: 'bed',
|
||||
epc: 'EPC',
|
||||
},
|
||||
|
||||
// ── Invites Page ───────────────────────────────────
|
||||
|
|
@ -1301,12 +1288,6 @@ const en = {
|
|||
failedToValidate: 'Failed to validate invite link',
|
||||
},
|
||||
|
||||
// ── Map Page ───────────────────────────────────────
|
||||
mapPage: {
|
||||
unsavedProperty: 'Unsave',
|
||||
savedProperty: 'Saved',
|
||||
},
|
||||
|
||||
// ── Format / Time ──────────────────────────────────
|
||||
format: {
|
||||
justNow: 'just now',
|
||||
|
|
|
|||
|
|
@ -80,13 +80,6 @@ const fr: Translations = {
|
|||
home: 'Accueil',
|
||||
},
|
||||
|
||||
// ── Toasts ─────────────────────────────────────────
|
||||
toasts: {
|
||||
propertySaved: 'Bien enregistré !',
|
||||
viewSaved: 'Voir l’enregistrement',
|
||||
dontShowAgain: 'Ne plus afficher',
|
||||
},
|
||||
|
||||
// ── SEO Page Chrome ────────────────────────────────
|
||||
seo: {
|
||||
breadcrumb: 'Fil d’Ariane',
|
||||
|
|
@ -566,8 +559,8 @@ const fr: Translations = {
|
|||
"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 comme non indexés ou bloqués pour l'accès du robot, 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 properties are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
|
||||
'Les recherches et propriétés enregistrées sont destinées à 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.',
|
||||
'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.',
|
||||
'Search measurement without exposing private data':
|
||||
'Rechercher des mesures 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.':
|
||||
|
|
@ -802,8 +795,6 @@ const fr: Translations = {
|
|||
// ── Properties Pane ────────────────────────────────
|
||||
propertyCard: {
|
||||
unknownAddress: 'Adresse inconnue',
|
||||
unsaveProperty: 'Retirer des favoris',
|
||||
saveProperty: 'Ajouter aux favoris',
|
||||
estValue: 'Valeur estimée :',
|
||||
type: 'Type :',
|
||||
builtForm: 'Forme du bâti :',
|
||||
|
|
@ -843,6 +834,11 @@ const fr: Translations = {
|
|||
showAllStatsFallback:
|
||||
'Passez à toutes les propriétés pour inspecter cette zone sans les filtres actifs.',
|
||||
showAllStats: 'Afficher toutes les propriétés',
|
||||
closestBlockingFilters: 'Filtres les plus proches qui excluent cette zone',
|
||||
lowerMinTo: 'Abaisser le minimum à {{value}}',
|
||||
raiseMaxTo: 'Augmenter le maximum à {{value}}',
|
||||
allowCategory: 'Autoriser {{value}}',
|
||||
travelTo: 'Trajet vers {{destination}}',
|
||||
viewProperties: 'Voir {{count}} propriétés',
|
||||
viewPropertiesShort: 'Voir les propriétés',
|
||||
priceHistory: 'Historique des prix',
|
||||
|
|
@ -1280,20 +1276,11 @@ const fr: Translations = {
|
|||
noSavedSearches: 'Aucune recherche enregistrée',
|
||||
noSavedSearchesDesc:
|
||||
'Enregistrez vos filtres et la vue de la carte pour reprendre exactement là où vous vous étiez arrêté.',
|
||||
noSavedProperties: 'Aucune propriété enregistrée',
|
||||
noSavedPropertiesDesc:
|
||||
'Ajoutez des propriétés en favoris au fil de votre exploration et constituez votre sélection sans rien perdre de vue.',
|
||||
openPostcode: 'Ouvrir le code postal',
|
||||
clickToRename: 'Cliquez pour renommer',
|
||||
notesPlaceholder: 'Notez vos impressions...',
|
||||
deleteSearch: 'Supprimer la recherche',
|
||||
deleteSearchConfirm:
|
||||
'Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ? Cette action est irréversible.',
|
||||
deleteProperty: 'Supprimer la propriété',
|
||||
deletePropertyConfirm:
|
||||
'Êtes-vous sûr de vouloir supprimer cette propriété enregistrée ? Cette action est irréversible.',
|
||||
bed: 'ch.',
|
||||
epc: 'DPE',
|
||||
},
|
||||
|
||||
// ── Invites Page ───────────────────────────────────
|
||||
|
|
@ -1341,12 +1328,6 @@ const fr: Translations = {
|
|||
failedToValidate: 'Échec de la validation du lien d’invitation',
|
||||
},
|
||||
|
||||
// ── Map Page ───────────────────────────────────────
|
||||
mapPage: {
|
||||
unsavedProperty: 'Retirer',
|
||||
savedProperty: 'Enregistré',
|
||||
},
|
||||
|
||||
// ── Format / Time ──────────────────────────────────
|
||||
format: {
|
||||
justNow: 'à l’instant',
|
||||
|
|
|
|||
|
|
@ -76,12 +76,6 @@ const hi: Translations = {
|
|||
home: 'होम',
|
||||
},
|
||||
|
||||
toasts: {
|
||||
propertySaved: 'संपत्ति सहेजी गई!',
|
||||
viewSaved: 'सहेजी हुई देखें',
|
||||
dontShowAgain: 'फिर न दिखाएं',
|
||||
},
|
||||
|
||||
seo: {
|
||||
breadcrumb: 'ब्रेडक्रम्ब',
|
||||
reviewDataSources: 'डेटा स्रोत देखें',
|
||||
|
|
@ -542,8 +536,8 @@ const hi: Translations = {
|
|||
'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': 'सहेजा गया खोज डेटा खाता-क्षेत्र है',
|
||||
'Saved searches and properties are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
|
||||
'सहेजी गई खोजें और संपत्तियां साइन-इन उपयोग के लिए हैं। वे सार्वजनिक साइटमैप में शामिल नहीं हैं और उन्हें सार्वजनिक सामग्री के रूप में क्रॉल नहीं किया जाना चाहिए।',
|
||||
'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': 'निजी डेटा को उजागर किए बिना माप खोजें',
|
||||
'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.':
|
||||
'समग्र विश्लेषण और खोज कंसोल डेटा का उपयोग करके सार्वजनिक पृष्ठों पर एसईओ माप होना चाहिए। निजी क्वेरी पैरामीटर और खाता दृश्य अनुक्रमणीय लैंडिंग पृष्ठ नहीं बनने चाहिए।',
|
||||
|
|
@ -761,8 +755,6 @@ const hi: Translations = {
|
|||
|
||||
propertyCard: {
|
||||
unknownAddress: 'अज्ञात पता',
|
||||
unsaveProperty: 'संपत्ति को असहेजें',
|
||||
saveProperty: 'संपत्ति सहेजें',
|
||||
estValue: 'अनु. मूल्य:',
|
||||
type: 'प्रकार:',
|
||||
builtForm: 'निर्माण रूप:',
|
||||
|
|
@ -800,6 +792,11 @@ const hi: Translations = {
|
|||
showAllStatsFallback:
|
||||
'सक्रिय फिल्टर के बिना इस क्षेत्र को देखने के लिए सभी संपत्तियों पर जाएं.',
|
||||
showAllStats: 'सभी संपत्तियां दिखाएं',
|
||||
closestBlockingFilters: 'इस क्षेत्र को बाहर करने वाले निकटतम फिल्टर',
|
||||
lowerMinTo: 'न्यूनतम को {{value}} तक घटाएं',
|
||||
raiseMaxTo: 'अधिकतम को {{value}} तक बढ़ाएं',
|
||||
allowCategory: '{{value}} की अनुमति दें',
|
||||
travelTo: '{{destination}} तक यात्रा',
|
||||
viewProperties: '{{count}} संपत्तियां देखें',
|
||||
viewPropertiesShort: 'संपत्तियां देखें',
|
||||
priceHistory: 'कीमत इतिहास',
|
||||
|
|
@ -1204,20 +1201,11 @@ const hi: Translations = {
|
|||
noSavedSearches: 'अभी कोई सहेजी गई खोज नहीं',
|
||||
noSavedSearchesDesc:
|
||||
'अपने फिल्टर और मानचित्र दृश्य सहेजें ताकि आप ठीक वहीं से फिर शुरू कर सकें जहां छोड़ा था.',
|
||||
noSavedProperties: 'अभी कोई सहेजी गई संपत्ति नहीं',
|
||||
noSavedPropertiesDesc:
|
||||
'खोजते समय संपत्तियां बुकमार्क करें और बिना ट्रैक खोए अपनी शॉर्टलिस्ट बनाएं.',
|
||||
openPostcode: 'पोस्टकोड खोलें',
|
||||
clickToRename: 'नाम बदलने के लिए क्लिक करें',
|
||||
notesPlaceholder: 'अपने विचार लिखें...',
|
||||
deleteSearch: 'खोज हटाएं',
|
||||
deleteSearchConfirm:
|
||||
'क्या आप वाकई यह सहेजी गई खोज हटाना चाहते हैं? इसे वापस नहीं किया जा सकता.',
|
||||
deleteProperty: 'संपत्ति हटाएं',
|
||||
deletePropertyConfirm:
|
||||
'क्या आप वाकई यह सहेजी गई संपत्ति हटाना चाहते हैं? इसे वापस नहीं किया जा सकता.',
|
||||
bed: 'बेडरूम',
|
||||
epc: 'EPC',
|
||||
},
|
||||
|
||||
invitesPage: {
|
||||
|
|
@ -1263,11 +1251,6 @@ const hi: Translations = {
|
|||
failedToValidate: 'आमंत्रण लिंक सत्यापित नहीं हो सका',
|
||||
},
|
||||
|
||||
mapPage: {
|
||||
unsavedProperty: 'असहेजें',
|
||||
savedProperty: 'सहेजा गया',
|
||||
},
|
||||
|
||||
format: {
|
||||
justNow: 'अभी',
|
||||
minutesAgo: '{{count}} मिनट पहले',
|
||||
|
|
|
|||
|
|
@ -80,13 +80,6 @@ const hu: Translations = {
|
|||
home: 'Főoldal',
|
||||
},
|
||||
|
||||
// ── Toasts ─────────────────────────────────────────
|
||||
toasts: {
|
||||
propertySaved: 'Ingatlan mentve!',
|
||||
viewSaved: 'Mentett megtekintése',
|
||||
dontShowAgain: 'Ne mutasd újra',
|
||||
},
|
||||
|
||||
// ── SEO Page Chrome ────────────────────────────────
|
||||
seo: {
|
||||
breadcrumb: 'Morzsanavigáció',
|
||||
|
|
@ -552,8 +545,8 @@ const hu: Translations = {
|
|||
'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.',
|
||||
'Saved search data is account-scoped': 'A mentett keresési adatok fiókra vonatkoznak',
|
||||
'Saved searches and properties 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 tulajdonságok bejelentkezett használatra szolgálnak. Nem szerepelnek a nyilvános webhelytérképen, és nyilvános tartalomként nem térképezhetők fel.',
|
||||
'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':
|
||||
'A mérési adatok keresése személyes 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.':
|
||||
|
|
@ -784,8 +777,6 @@ const hu: Translations = {
|
|||
// ── Properties Pane ────────────────────────────────
|
||||
propertyCard: {
|
||||
unknownAddress: 'Ismeretlen cím',
|
||||
unsaveProperty: 'Ingatlan mentésének visszavonása',
|
||||
saveProperty: 'Ingatlan mentése',
|
||||
estValue: 'Becsült érték:',
|
||||
type: 'Típus:',
|
||||
builtForm: 'Épületforma:',
|
||||
|
|
@ -824,6 +815,11 @@ const hu: Translations = {
|
|||
showAllStatsFallback:
|
||||
'Váltson az összes ingatlanra, hogy aktív szűrők nélkül tekintse át ezt a területet.',
|
||||
showAllStats: 'Összes ingatlan mutatása',
|
||||
closestBlockingFilters: 'A területet kizáró legközelebbi szűrők',
|
||||
lowerMinTo: 'Minimum csökkentése erre: {{value}}',
|
||||
raiseMaxTo: 'Maximum növelése erre: {{value}}',
|
||||
allowCategory: '{{value}} engedélyezése',
|
||||
travelTo: 'Utazás ide: {{destination}}',
|
||||
viewProperties: '{{count}} ingatlan megtekintése',
|
||||
viewPropertiesShort: 'Ingatlanok megtekintése',
|
||||
priceHistory: 'Ártörténet',
|
||||
|
|
@ -1258,20 +1254,11 @@ const hu: Translations = {
|
|||
noSavedSearches: 'Még nincsenek mentett keresések',
|
||||
noSavedSearchesDesc:
|
||||
'Mentsd el a szűrőket és a térképnézetet, hogy pontosan ott folytasd, ahol abbahagytad.',
|
||||
noSavedProperties: 'Még nincsenek mentett ingatlanok',
|
||||
noSavedPropertiesDesc:
|
||||
'Jelöld meg az ingatlanokat felfedezés közben, és építsd a rövid listádat elvesztés nélkül.',
|
||||
openPostcode: 'Irányítószám megnyitása',
|
||||
clickToRename: 'Kattints az átnevezéshez',
|
||||
notesPlaceholder: 'Írd le a gondolataidat...',
|
||||
deleteSearch: 'Keresés törlése',
|
||||
deleteSearchConfirm:
|
||||
'Biztosan törölni szeretnéd ezt a mentett keresést? Ez nem vonható vissza.',
|
||||
deleteProperty: 'Ingatlan törlése',
|
||||
deletePropertyConfirm:
|
||||
'Biztosan törölni szeretnéd ezt a mentett ingatlant? Ez nem vonható vissza.',
|
||||
bed: 'háló',
|
||||
epc: 'EPC',
|
||||
},
|
||||
|
||||
// ── Invites Page ───────────────────────────────────
|
||||
|
|
@ -1321,12 +1308,6 @@ const hu: Translations = {
|
|||
failedToValidate: 'Nem sikerült a meghívó hivatkozás érvényesítése',
|
||||
},
|
||||
|
||||
// ── Map Page ───────────────────────────────────────
|
||||
mapPage: {
|
||||
unsavedProperty: 'Eltávolítás',
|
||||
savedProperty: 'Mentve',
|
||||
},
|
||||
|
||||
// ── Format / Time ──────────────────────────────────
|
||||
format: {
|
||||
justNow: 'az imént',
|
||||
|
|
|
|||
|
|
@ -79,13 +79,6 @@ const zh: Translations = {
|
|||
home: '首页',
|
||||
},
|
||||
|
||||
// ── Toasts ─────────────────────────────────────────
|
||||
toasts: {
|
||||
propertySaved: '房产已保存!',
|
||||
viewSaved: '查看已保存',
|
||||
dontShowAgain: '不再显示',
|
||||
},
|
||||
|
||||
// ── SEO Page Chrome ────────────────────────────────
|
||||
seo: {
|
||||
breadcrumb: '面包屑导航',
|
||||
|
|
@ -511,8 +504,8 @@ const zh: Translations = {
|
|||
'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.':
|
||||
'营销、方法、指南和支持页面都是可索引的。仪表板、帐户、已保存的搜索、邀请和邀请路线被标记为 noindex 或在适当的情况下阻止爬网程序访问。',
|
||||
'Saved search data is account-scoped': '保存的搜索数据是帐户范围内的',
|
||||
'Saved searches and properties are intended for signed-in use. They aren’t included in the public sitemap and shouldn’t be crawlable as public content.':
|
||||
'保存的搜索和属性仅供登录使用。它们不包含在公共站点地图中,也不应作为公共内容进行抓取。',
|
||||
'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': '搜索测量而不暴露私人数据',
|
||||
'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 测量应该使用聚合分析和 Search Console 数据在公共页面上进行。私有查询参数和帐户视图不应成为可索引的登陆页面。',
|
||||
|
|
@ -734,8 +727,6 @@ const zh: Translations = {
|
|||
// ── Properties Pane ────────────────────────────────
|
||||
propertyCard: {
|
||||
unknownAddress: '地址未知',
|
||||
unsaveProperty: '取消收藏',
|
||||
saveProperty: '收藏房产',
|
||||
estValue: '估计价值:',
|
||||
type: '类型:',
|
||||
builtForm: '建筑形式:',
|
||||
|
|
@ -771,6 +762,11 @@ const zh: Translations = {
|
|||
showAllStatsHint: '筛选前这里有 {{count}} 处房产。切换到全部房产即可查看该区域。',
|
||||
showAllStatsFallback: '切换到全部房产即可在不应用当前筛选条件的情况下查看该区域。',
|
||||
showAllStats: '显示全部房产',
|
||||
closestBlockingFilters: '最接近的排除此区域的筛选条件',
|
||||
lowerMinTo: '将最小值降至 {{value}}',
|
||||
raiseMaxTo: '将最大值提高至 {{value}}',
|
||||
allowCategory: '允许 {{value}}',
|
||||
travelTo: '前往 {{destination}} 的出行',
|
||||
viewProperties: '查看 {{count}} 处房产',
|
||||
viewPropertiesShort: '查看房产',
|
||||
priceHistory: '价格历史',
|
||||
|
|
@ -1187,17 +1183,10 @@ const zh: Translations = {
|
|||
searches: '搜索',
|
||||
noSavedSearches: '暂无保存的搜索',
|
||||
noSavedSearchesDesc: '保存您的筛选条件和地图视图,随时从上次的位置继续浏览。',
|
||||
noSavedProperties: '暂无保存的房产',
|
||||
noSavedPropertiesDesc: '在浏览过程中收藏房产,建立您的候选名单,不会遗漏任何一处。',
|
||||
openPostcode: '打开邮编',
|
||||
clickToRename: '点击重命名',
|
||||
notesPlaceholder: '记下您的想法...',
|
||||
deleteSearch: '删除搜索',
|
||||
deleteSearchConfirm: '确定要删除这个保存的搜索吗?此操作无法撤销。',
|
||||
deleteProperty: '删除房产',
|
||||
deletePropertyConfirm: '确定要删除这个保存的房产吗?此操作无法撤销。',
|
||||
bed: '卧室',
|
||||
epc: '能源评级',
|
||||
},
|
||||
|
||||
// ── Invites Page ───────────────────────────────────
|
||||
|
|
@ -1245,12 +1234,6 @@ const zh: Translations = {
|
|||
failedToValidate: '验证邀请链接失败',
|
||||
},
|
||||
|
||||
// ── Map Page ───────────────────────────────────────
|
||||
mapPage: {
|
||||
unsavedProperty: '取消收藏',
|
||||
savedProperty: '已收藏',
|
||||
},
|
||||
|
||||
// ── Format / Time ──────────────────────────────────
|
||||
format: {
|
||||
justNow: '刚刚',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue