Lots of improvements
Some checks failed
CI / Python (lint + test) (push) Failing after 1m39s
CI / Frontend (lint + typecheck) (push) Failing after 1m49s
CI / Rust (lint + test) (push) Failing after 1m50s
Build and publish Docker image / build-and-push (push) Failing after 3m9s

This commit is contained in:
Andras Schmelczer 2026-04-04 10:45:48 +01:00
parent 3853b5dce7
commit b94cf17d75
33 changed files with 2587 additions and 1866 deletions

View file

@ -141,6 +141,11 @@ const zh: Translations = {
removeFilterHint: '移除一个筛选条件以查看可用的数据指标',
featureInfo: '数据指标信息',
replayTutorial: '重新播放交互教程',
clearAll: '全部清除',
clearAllTitle: '清除所有筛选条件?',
clearAllSavePrompt: '是否要在清除前保存当前的筛选条件?',
saveAndClear: '保存并清除',
clearWithoutSaving: '不保存直接清除',
},
// ── Philosophy Popup ───────────────────────────────
@ -201,9 +206,9 @@ const zh: Translations = {
describeIdealArea: '用 AI 描述您的理想区域',
aiSearch: 'AI 搜索',
describeHint: '描述您要找的区域',
placeholder: '例如:安静的区域,低于 \u00A340万靠近好学校...',
placeholder: '例如:安静的区域,低于 £40万靠近好学校...',
example1: '安全的区域,靠近好学校',
example2: '到国王十字站30分钟通勤低于 \u00A350万',
example2: '到国王十字站30分钟通勤低于 £50万',
example3: '安静的村庄3间卧室快速宽带',
analysing: '正在分析您的需求...',
searchingDestinations: '正在搜索目的地...',
@ -215,6 +220,11 @@ const zh: Translations = {
// ── Map Legend ─────────────────────────────────────
mapLegend: {
clearColourView: '清除颜色视图',
historicalMatches: '历史房产匹配',
propertiesForSale: '待售房产',
propertiesForRent: '待租房产',
numberOfProperties: '房产数量',
previewing: '预览\u201c{{name}}\u201d',
},
// ── Properties Pane ────────────────────────────────
@ -222,7 +232,7 @@ const zh: Translations = {
unknownAddress: '地址未知',
unsaveProperty: '取消收藏',
saveProperty: '收藏房产',
lastSold: '上次成交价:\u00A3{{price}}',
lastSold: '上次成交价:£{{price}}',
estValue: '估计价值:',
type: '类型:',
builtForm: '建筑形式:',
@ -239,7 +249,7 @@ const zh: Translations = {
renovations: '翻新记录',
viewExternalListing: '查看外部房源',
perMonth: '/月',
perSqm: '/m\u00B2',
perSqm: '/m²',
searchPlaceholder: '按地址或邮编搜索...',
propertyData: '房产数据',
propertyDataDesc: '价格来自英国土地注册局(买家实际支付的金额)。建筑面积、能源评级、建造年份和产权来自官方能源性能证书调查。两个数据源通过每个邮编内的地址进行匹配。',
@ -343,7 +353,7 @@ const zh: Translations = {
compPropertyDataSub: '(价格、能源性能证书、建筑面积)',
compFilters: '56 项可组合筛选条件,尽在一处',
compFiltersSub: '(所有信息,一张交互式地图)',
ctaTitle: '让您最大的投资成为最明智的\u00A0决定。',
ctaTitle: '让您最大的投资成为最明智的 决定。',
ctaDescription: '这值得用专业的工具来做,别全靠运气。',
},
@ -351,7 +361,7 @@ const zh: Translations = {
pricingPage: {
title: '早期访问价格',
subtitle: '一次付款,永久访问。越早加入,价格越优惠。',
costContext: '买房需要支付超过 \u00A310,000 的印花税、\u00A31,500 的律师费、\u00A3500 的房屋评估费。选错区域,您可能要忍受漫长的通勤、差劲的学校,或一条您事先不知道的嘈杂马路。',
costContext: '买房需要支付超过 £10,000 的印花税、£1,500 的律师费、£500 的房屋评估费。选错区域,您可能要忍受漫长的通勤、差劲的学校,或一条您事先不知道的嘈杂马路。',
lessThanSurvey: '不到一次房屋评估的费用,却有用得多。',
currentTier: '当前档位',
firstNUsers: '前 {{count}} 名用户',
@ -514,7 +524,7 @@ const zh: Translations = {
emailLabel: '邮箱',
subscriptionLabel: '订阅',
upgrade: '升级',
redirecting: '跳转中\u2026',
redirecting: '跳转中',
receiveNewsletter: '接收新闻邮件',
needHelp: '需要帮助?请发邮件至',
responseTime: '我们通常在 24 小时内回复。',
@ -592,38 +602,38 @@ const zh: Translations = {
// ── Format / Time ──────────────────────────────────
format: {
justNow: '\u521A\u521A',
minutesAgo: '{{count}}\u5206\u949F\u524D',
hoursAgo: '{{count}}\u5C0F\u65F6\u524D',
daysAgo: '{{count}}\u5929\u524D',
nFilters: '{{count}} \u4E2A\u7B5B\u9009',
noFilters: '\u65E0\u7B5B\u9009',
poiCategory: '{{count}} \u4E2A POI \u7C7B\u522B',
poiCategories: '{{count}} \u4E2A POI \u7C7B\u522B',
travelDestination: '{{count}} \u4E2A\u51FA\u884C\u76EE\u7684\u5730',
travelDestinations: '{{count}} \u4E2A\u51FA\u884C\u76EE\u7684\u5730',
propertiesMatch: '{{count}} \u5957\u623F\u4EA7\u7B26\u5408',
setFilters: '\u8BBE\u7F6E {{count}} \u4E2A\u7B5B\u9009\uFF1A{{list}}',
noFiltersSet: '\u672A\u8BBE\u7F6E\u7B5B\u9009',
toDestination: '{{mode}}\u5230 {{label}} {{bounds}}',
lessThanMin: '< {{max}} \u5206\u949F',
moreThanMin: '> {{min}} \u5206\u949F',
justNow: '刚刚',
minutesAgo: '{{count}}分钟前',
hoursAgo: '{{count}}小时前',
daysAgo: '{{count}}天前',
nFilters: '{{count}} 个筛选',
noFilters: '无筛选',
poiCategory: '{{count}} 个 POI 类别',
poiCategories: '{{count}} 个 POI 类别',
travelDestination: '{{count}} 个出行目的地',
travelDestinations: '{{count}} 个出行目的地',
propertiesMatch: '{{count}} 套房产符合',
setFilters: '设置 {{count}} 个筛选:{{list}}',
noFiltersSet: '未设置筛选',
toDestination: '{{mode}} {{label}} {{bounds}}',
lessThanMin: '< {{max}} 分钟',
moreThanMin: '> {{min}} 分钟',
},
// ── Tutorial ──────────────────────────────────────
tutorial: {
step1Title: '\u544A\u8BC9\u5730\u56FE\u4EC0\u4E48\u91CD\u8981',
step1Content: '\u8BBE\u7F6E\u9884\u7B97\u3001\u901A\u52E4\u4E0A\u9650\u3001\u5B66\u6821\u8D28\u91CF\u3001\u72AF\u7F6A\u95E8\u69DB\u3002\u60A8\u5173\u5FC3\u7684\u4E00\u5207\u3002\u53EA\u6709\u7B26\u5408\u6761\u4EF6\u7684\u533A\u57DF\u4F1A\u4FDD\u6301\u9AD8\u4EAE\u3002\u4F7F\u7528\u773C\u775B\u56FE\u6807\u6309\u4EFB\u610F\u7279\u5F81\u7740\u8272\u3002',
step2Title: '\u6216\u8005\u76F4\u63A5\u63CF\u8FF0',
step2Content: '\u7528\u4E2D\u6587\u8F93\u5165\u60A8\u7684\u9700\u6C42\uFF0C\u4F8B\u5982\u201C\u5B89\u9759\u7684\u5730\u533A\uFF0C\u9760\u8FD1\u597D\u5B66\u6821\uFF0C\u00A3400k \u4EE5\u4E0B\u201D\uFF0C\u6211\u4EEC\u4F1A\u4E3A\u60A8\u8BBE\u7F6E\u7B5B\u9009\u3002',
step3Title: '\u63A2\u7D22\u73B0\u6709\u4F4F\u5B85',
step3Content: '\u5728\u82F1\u683C\u5170\u5404\u5730\u5E73\u79FB\u548C\u7F29\u653E\u3002\u70B9\u51FB\u4EFB\u4F55\u5F69\u8272\u533A\u57DF\u67E5\u770B\u72AF\u7F6A\u3001\u5B66\u6821\u3001\u4EF7\u683C\u3001\u5BBD\u5E26\u3001\u566A\u97F3\u7B49\u4FE1\u606F\u3002',
step4Title: '\u8DF3\u8F6C\u5230\u67D0\u4E2A\u4F4D\u7F6E',
step4Content: '\u641C\u7D22\u4EFB\u4F55\u5730\u70B9\u6216\u90AE\u7F16\uFF0C\u5373\u53EF\u76F4\u63A5\u8DF3\u8F6C\u3002',
step5Title: '\u6DF1\u5165\u4E86\u89E3\u7EC6\u8282',
step5Content: '\u67E5\u770B\u533A\u57DF\u7EDF\u8BA1\u3001\u76F4\u65B9\u56FE\u548C\u5355\u4E2A\u623F\u4EA7\u8BB0\u5F55\uFF1A\u4EF7\u683C\u3001\u5EFA\u7B51\u9762\u79EF\u3001\u80FD\u6548\u8BC4\u7EA7\u7B49\u3002',
step6Title: '\u9644\u8FD1\u6709\u4EC0\u4E48\uFF1F',
step6Content: '\u5728\u5730\u56FE\u4E0A\u5F00\u542F\u5B66\u6821\u3001\u5546\u5E97\u3001\u8F66\u7AD9\u3001\u516C\u56ED\u548C\u9910\u5385\u56FE\u5C42\uFF0C\u67E5\u770B\u5468\u8FB9\u8BBE\u65BD\u3002',
step1Title: '告诉地图什么重要',
step1Content: '设置预算、通勤上限、学校质量、犯罪门槛。您关心的一切。只有符合条件的区域会保持高亮。使用眼睛图标按任意特征着色。',
step2Title: '或者直接描述',
step2Content: '用中文输入您的需求例如“安静的地区靠近好学校£400k 以下”,我们会为您设置筛选。',
step3Title: '探索现有住宅',
step3Content: '在英格兰各地平移和缩放。点击任何彩色区域查看犯罪、学校、价格、宽带、噪音等信息。',
step4Title: '跳转到某个位置',
step4Content: '搜索任何地点或邮编,即可直接跳转。',
step5Title: '深入了解细节',
step5Content: '查看区域统计、直方图和单个房产记录:价格、建筑面积、能效评级等。',
step6Title: '附近有什么?',
step6Content: '在地图上开启学校、商店、车站、公园和餐厅图层,查看周边设施。',
},
// ── Server-derived values ──────────────────────────
@ -631,209 +641,208 @@ const zh: Translations = {
// The English keys MUST match exactly what the API returns.
server: {
// ─ Feature group names ─
'Properties': '\u623F\u4EA7',
'Transport': '\u4EA4\u901A',
'Education': '\u6559\u80B2',
'Deprivation': '\u8D2B\u56F0\u6307\u6570',
'Crime': '\u72AF\u7F6A',
'Demographics': '\u4EBA\u53E3\u7EDF\u8BA1',
'Amenities': '\u914D\u5957\u8BBE\u65BD',
'Properties': '房产',
'Transport': '交通',
'Education': '教育',
'Deprivation': '贫困指数',
'Crime': '犯罪',
'Demographics': '人口统计',
'Amenities': '配套设施',
// ─ Feature names (Properties) ─
'Listing status': '\u623F\u6E90\u72B6\u6001',
'Property type': '\u623F\u4EA7\u7C7B\u578B',
'Leasehold/Freehold': '\u79DF\u8D41\u4EA7\u6743/\u6C38\u4E45\u4EA7\u6743',
'Last known price': '\u4E0A\u6B21\u6210\u4EA4\u4EF7',
'Estimated current price': '\u4F30\u8BA1\u5F53\u524D\u4EF7\u683C',
'Asking price': '\u6302\u724C\u4EF7',
'Price per sqm': '\u6BCF\u5E73\u65B9\u7C73\u4EF7\u683C',
'Est. price per sqm': '\u4F30\u8BA1\u6BCF\u5E73\u65B9\u7C73\u4EF7\u683C',
'Asking price per sqm': '\u6302\u724C\u4EF7\u6BCF\u5E73\u65B9\u7C73',
'Estimated monthly rent': '\u4F30\u8BA1\u6708\u79DF',
'Asking rent (monthly)': '\u6708\u79DF',
'Total floor area (sqm)': '\u603B\u5EFA\u7B51\u9762\u79EF\uFF08\u5E73\u65B9\u7C73\uFF09',
'Number of bedrooms & living rooms': '\u5367\u5BA4\u548C\u5BA2\u5385\u6570\u91CF',
'Bedrooms': '\u5367\u5BA4',
'Bathrooms': '\u6D74\u5BA4',
'Construction year': '\u5EFA\u9020\u5E74\u4EFD',
'Date of last transaction': '\u4E0A\u6B21\u4EA4\u6613\u65E5\u671F',
'Listing date': '\u4E0A\u5E02\u65E5\u671F',
'Former council house': '\u539F\u516C\u5171\u4F4F\u623F',
'Current energy rating': '\u5F53\u524D\u80FD\u6E90\u8BC4\u7EA7',
'Potential energy rating': '\u6F5C\u5728\u80FD\u6E90\u8BC4\u7EA7',
'Interior height (m)': '\u5BA4\u5185\u5C42\u9AD8\uFF08\u7C73\uFF09',
'Listing status': '房源状态',
'Property type': '房产类型',
'Leasehold/Freehold': '租赁产权/永久产权',
'Last known price': '上次成交价',
'Estimated current price': '估计当前价格',
'Asking price': '挂牌价',
'Price per sqm': '每平方米价格',
'Est. price per sqm': '估计每平方米价格',
'Asking price per sqm': '挂牌价每平方米',
'Estimated monthly rent': '估计月租',
'Asking rent (monthly)': '月租',
'Total floor area (sqm)': '总建筑面积(平方米)',
'Number of bedrooms & living rooms': '卧室和客厅数量',
'Bedrooms': '卧室',
'Bathrooms': '浴室',
'Construction year': '建造年份',
'Date of last transaction': '上次交易日期',
'Listing date': '上市日期',
'Former council house': '原公共住房',
'Current energy rating': '当前能源评级',
'Potential energy rating': '潜在能源评级',
'Interior height (m)': '室内层高(米)',
// ─ Feature names (Transport) ─
'Distance to nearest train or tube station (km)': '\u5230\u6700\u8FD1\u706B\u8F66\u6216\u5730\u94C1\u7AD9\u7684\u8DDD\u79BB\uFF08\u516C\u91CC\uFF09',
'Train or tube stations within 1km': '1\u516C\u91CC\u5185\u706B\u8F66\u6216\u5730\u94C1\u7AD9\u6570\u91CF',
'Distance to nearest train or tube station (km)': '到最近火车或地铁站的距离(公里)',
// ─ Feature names (Education) ─
'Good+ primary schools within 2km': '2\u516C\u91CC\u5185\u826F\u597D+\u5C0F\u5B66\u6570\u91CF',
'Good+ secondary schools within 2km': '2\u516C\u91CC\u5185\u826F\u597D+\u4E2D\u5B66\u6570\u91CF',
'Good+ primary schools within 5km': '5\u516C\u91CC\u5185\u826F\u597D+\u5C0F\u5B66\u6570\u91CF',
'Good+ secondary schools within 5km': '5\u516C\u91CC\u5185\u826F\u597D+\u4E2D\u5B66\u6570\u91CF',
'Education, Skills and Training Score': '\u6559\u80B2\u3001\u6280\u80FD\u548C\u57F9\u8BAD\u5F97\u5206',
'Good+ primary schools within 2km': '2公里内良好+小学数量',
'Good+ secondary schools within 2km': '2公里内良好+中学数量',
'Good+ primary schools within 5km': '5公里内良好+小学数量',
'Good+ secondary schools within 5km': '5公里内良好+中学数量',
'Education, Skills and Training Score': '教育、技能和培训得分',
// ─ Feature names (Deprivation) ─
'Income Score (rate)': '\u6536\u5165\u5F97\u5206\uFF08\u6BD4\u7387\uFF09',
'Employment Score (rate)': '\u5C31\u4E1A\u5F97\u5206\uFF08\u6BD4\u7387\uFF09',
'Health Deprivation and Disability Score': '\u5065\u5EB7\u4E0E\u6B8B\u969C\u5F97\u5206',
'Living Environment Score': '\u5C45\u4F4F\u73AF\u5883\u5F97\u5206',
'Indoors Sub-domain Score': '\u5BA4\u5185\u5B50\u9886\u57DF\u5F97\u5206',
'Outdoors Sub-domain Score': '\u5BA4\u5916\u5B50\u9886\u57DF\u5F97\u5206',
'Income Score (rate)': '收入得分(比率)',
'Employment Score (rate)': '就业得分(比率)',
'Health Deprivation and Disability Score': '健康与残障得分',
'Living Environment Score': '居住环境得分',
'Indoors Sub-domain Score': '室内子领域得分',
'Outdoors Sub-domain Score': '室外子领域得分',
// ─ Feature names (Crime) ─
'Serious crime per 1k residents (avg/yr)': '\u6BCF\u5343\u4EBA\u4E25\u91CD\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Minor crime per 1k residents (avg/yr)': '\u6BCF\u5343\u4EBA\u8F7B\u5FAE\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Serious crime (avg/yr)': '\u4E25\u91CD\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Minor crime (avg/yr)': '\u8F7B\u5FAE\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Violence and sexual offences (avg/yr)': '\u66B4\u529B\u548C\u6027\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Burglary (avg/yr)': '\u5165\u5BA4\u76D7\u7A83\uFF08\u5E74\u5747\uFF09',
'Robbery (avg/yr)': '\u62A2\u52AB\uFF08\u5E74\u5747\uFF09',
'Vehicle crime (avg/yr)': '\u8F66\u8F86\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Anti-social behaviour (avg/yr)': '\u53CD\u793E\u4F1A\u884C\u4E3A\uFF08\u5E74\u5747\uFF09',
'Criminal damage and arson (avg/yr)': '\u5211\u4E8B\u6BC1\u574F\u548C\u7EB5\u706B\uFF08\u5E74\u5747\uFF09',
'Other theft (avg/yr)': '\u5176\u4ED6\u76D7\u7A83\uFF08\u5E74\u5747\uFF09',
'Theft from the person (avg/yr)': '\u4EBA\u8EAB\u76D7\u7A83\uFF08\u5E74\u5747\uFF09',
'Shoplifting (avg/yr)': '\u5546\u5E97\u76D7\u7A83\uFF08\u5E74\u5747\uFF09',
'Bicycle theft (avg/yr)': '\u81EA\u884C\u8F66\u76D7\u7A83\uFF08\u5E74\u5747\uFF09',
'Drugs (avg/yr)': '\u6BD2\u54C1\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Possession of weapons (avg/yr)': '\u975E\u6CD5\u6301\u6709\u6B66\u5668\uFF08\u5E74\u5747\uFF09',
'Public order (avg/yr)': '\u6270\u4E71\u516C\u5171\u79E9\u5E8F\uFF08\u5E74\u5747\uFF09',
'Other crime (avg/yr)': '\u5176\u4ED6\u72AF\u7F6A\uFF08\u5E74\u5747\uFF09',
'Serious crime per 1k residents (avg/yr)': '每千人严重犯罪(年均)',
'Minor crime per 1k residents (avg/yr)': '每千人轻微犯罪(年均)',
'Serious crime (avg/yr)': '严重犯罪(年均)',
'Minor crime (avg/yr)': '轻微犯罪(年均)',
'Violence and sexual offences (avg/yr)': '暴力和性犯罪(年均)',
'Burglary (avg/yr)': '入室盗窃(年均)',
'Robbery (avg/yr)': '抢劫(年均)',
'Vehicle crime (avg/yr)': '车辆犯罪(年均)',
'Anti-social behaviour (avg/yr)': '反社会行为(年均)',
'Criminal damage and arson (avg/yr)': '刑事毁坏和纵火(年均)',
'Other theft (avg/yr)': '其他盗窃(年均)',
'Theft from the person (avg/yr)': '人身盗窃(年均)',
'Shoplifting (avg/yr)': '商店盗窃(年均)',
'Bicycle theft (avg/yr)': '自行车盗窃(年均)',
'Drugs (avg/yr)': '毒品犯罪(年均)',
'Possession of weapons (avg/yr)': '非法持有武器(年均)',
'Public order (avg/yr)': '扰乱公共秩序(年均)',
'Other crime (avg/yr)': '其他犯罪(年均)',
// ─ Feature names (Demographics) ─
'Median age': '\u4E2D\u4F4D\u5E74\u9F84',
'% White': '% \u767D\u4EBA',
'% South Asian': '% \u5357\u4E9A\u88D4',
'% Black': '% \u9ED1\u4EBA',
'% East Asian': '% \u4E1C\u4E9A\u88D4',
'% Mixed': '% \u6DF7\u8840',
'% Other': '% \u5176\u4ED6',
'Median age': '中位年龄',
'% White': '% 白人',
'% South Asian': '% 南亚裔',
'% Black': '% 黑人',
'% East Asian': '% 东亚裔',
'% Mixed': '% 混血',
'% Other': '% 其他',
// ─ Feature names (Amenities) ─
'Distance to nearest park (km)': '\u5230\u6700\u8FD1\u516C\u56ED\u7684\u8DDD\u79BB\uFF08\u516C\u91CC\uFF09',
'Number of parks within 2km': '2\u516C\u91CC\u5185\u516C\u56ED\u6570\u91CF',
'Number of restaurants within 2km': '2\u516C\u91CC\u5185\u9910\u5385\u6570\u91CF',
'Number of grocery shops and supermarkets within 2km': '2\u516C\u91CC\u5185\u98DF\u54C1\u5E97\u548C\u8D85\u5E02\u6570\u91CF',
'Noise (dB)': '\u566A\u97F3\uFF08\u5206\u8D1D\uFF09',
'Max available download speed (Mbps)': '\u6700\u5927\u53EF\u7528\u4E0B\u8F7D\u901F\u5EA6\uFF08Mbps\uFF09',
'Distance to nearest park (km)': '到最近公园的距离(公里)',
'Number of parks within 2km': '2公里内公园数量',
'Number of restaurants within 2km': '2公里内餐厅数量',
'Number of grocery shops and supermarkets within 2km': '2公里内食品店和超市数量',
'Noise (dB)': '噪音(分贝)',
'Max available download speed (Mbps)': '最大可用下载速度Mbps',
// ─ Enum values ─
'Historical sale': '\u5386\u53F2\u4EA4\u6613',
'For sale': '\u5728\u552E',
'For rent': '\u51FA\u79DF',
'Detached': '\u72EC\u7ACB\u5F0F\u4F4F\u5B85',
'Semi-Detached': '\u534A\u72EC\u7ACB\u5F0F\u4F4F\u5B85',
'Terraced': '\u8054\u6392\u4F4F\u5B85',
'Flats/Maisonettes': '\u516C\u5BD3/\u590D\u5F0F\u516C\u5BD3',
'Other': '\u5176\u4ED6',
'Freehold': '\u6C38\u4E45\u4EA7\u6743',
'Leasehold': '\u79DF\u8D41\u4EA7\u6743',
'Yes': '\u662F',
'No': '\u5426',
'Historical sale': '历史交易',
'For sale': '在售',
'For rent': '出租',
'Detached': '独立式住宅',
'Semi-Detached': '半独立式住宅',
'Terraced': '联排住宅',
'Flats/Maisonettes': '公寓/复式公寓',
'Other': '其他',
'Freehold': '永久产权',
'Leasehold': '租赁产权',
'Yes': '',
'No': '',
// ─ Stacked chart labels ─
'Serious crime': '\u4E25\u91CD\u72AF\u7F6A',
'Minor crime': '\u8F7B\u5FAE\u72AF\u7F6A',
'Ethnic composition': '\u65CF\u88D4\u7EC4\u6210',
'Serious crime': '严重犯罪',
'Minor crime': '轻微犯罪',
'Ethnic composition': '族裔组成',
// ─ POI group names ─
'Public Transport': '\u516C\u5171\u4EA4\u901A',
'Leisure': '\u4F11\u95F2',
'Health': '\u5065\u5EB7',
'Emergency Services': '\u7D27\u6025\u670D\u52A1',
'Groceries': '\u98DF\u54C1\u6742\u8D27',
'Local Businesses': '\u672C\u5730\u5546\u4E1A',
'Culture': '\u6587\u5316',
'Services': '\u670D\u52A1',
'Shops': '\u5546\u5E97',
'Public Transport': '公共交通',
'Leisure': '休闲',
'Health': '健康',
'Emergency Services': '紧急服务',
'Groceries': '食品杂货',
'Local Businesses': '本地商业',
'Culture': '文化',
'Services': '服务',
'Shops': '商店',
// ─ POI categories ─
'Airport': '\u673A\u573A',
'Ferry': '\u6E21\u8F6E',
'Rail station': '\u706B\u8F66\u7AD9',
'Bus stop': '\u516C\u4EA4\u7AD9',
'Bus station': '\u516C\u4EA4\u67A2\u7EBD',
'Taxi rank': '\u51FA\u79DF\u8F66\u7AD9',
'Metro or Tram stop': '\u5730\u94C1\u6216\u6709\u8F68\u7535\u8F66\u7AD9',
'Caf\u00E9': '\u5496\u5561\u9986',
'Restaurant': '\u9910\u5385',
'Pub': '\u9152\u5427',
'Bar': '\u9152\u5427',
'Fast Food': '\u5FEB\u9910',
'Nightclub': '\u591C\u5E97',
'Cinema': '\u7535\u5F71\u9662',
'Theatre': '\u5267\u9662',
'Live Music & Events': '\u73B0\u573A\u97F3\u4E50\u4E0E\u6D3B\u52A8',
'Park': '\u516C\u56ED',
'Playground': '\u6E38\u4E50\u573A',
'Sports Centre': '\u4F53\u80B2\u4E2D\u5FC3',
'Entertainment': '\u5A31\u4E50',
'Supermarket': '\u8D85\u5E02',
'Convenience Store': '\u4FBF\u5229\u5E97',
'Bakery': '\u9762\u5305\u623A',
'Butcher & Fishmonger': '\u8089\u94FA\u4E0E\u9C7C\u94FA',
'Greengrocer': '\u679C\u852C\u5E97',
'Off-Licence': '\u9152\u7C7B\u5546\u5E97',
'Deli & Specialty': '\u719F\u98DF\u4E0E\u7279\u4EA7\u5E97',
'Fashion & Clothing': '\u65F6\u88C5\u670D\u9970',
'Electronics': '\u7535\u5B50\u4EA7\u54C1',
'Charity Shop': '\u6148\u5584\u5546\u5E97',
'DIY & Hardware': '\u5EFA\u6750\u4E94\u91D1',
'Home & Garden': '\u5BB6\u5C45\u4E0E\u56ED\u827A',
'Bookshop': '\u4E66\u5E97',
'Pet Shop': '\u5BA0\u7269\u5E97',
'Sports & Outdoor': '\u4F53\u80B2\u4E0E\u6237\u5916',
'Newsagent': '\u62A5\u520A\u4EAD',
'Department Store': '\u767E\u8D27\u5546\u5E97',
'Gift & Hobby': '\u793C\u54C1\u4E0E\u7231\u597D',
'Specialist Shop': '\u4E13\u4E1A\u5546\u5E97',
'Hairdresser & Beauty': '\u7F8E\u53D1\u4E0E\u7F8E\u5BB9',
'Gym & Fitness': '\u5065\u8EAB\u623F',
'Dry Cleaner & Laundry': '\u5E72\u6D17\u4E0E\u6D17\u8863',
'Car Services': '\u6C7D\u8F66\u670D\u52A1',
'Post Office': '\u90AE\u5C40',
'Vet & Pet Care': '\u5BA0\u7269\u533B\u9662\u4E0E\u62A4\u7406',
'Bank': '\u94F6\u884C',
'Travel Agent': '\u65C5\u884C\u793E',
'Police': '\u8B66\u5BDF',
'Fire Station': '\u6D88\u9632\u7AD9',
'Ambulance Station': '\u6025\u6551\u7AD9',
'GP Surgery': '\u5168\u79D1\u8BCA\u6240',
'Dentist': '\u7259\u79D1',
'Pharmacy': '\u836F\u623F',
'Hospital & Clinic': '\u533B\u9662\u4E0E\u8BCA\u6240',
'Optician': '\u773C\u955C\u5E97',
'Physiotherapy': '\u7406\u7597',
'Counselling & Therapy': '\u5FC3\u7406\u54A8\u8BE2\u4E0E\u6CBB\u7597',
'Care Home': '\u517B\u8001\u9662',
'Medical & Mobility': '\u533B\u7597\u5668\u68B0\u4E0E\u8F85\u52A9\u8BBE\u5907',
'Museum': '\u535A\u7269\u9986',
'Gallery': '\u7F8E\u672F\u9986',
'Library': '\u56FE\u4E66\u9986',
'Place of Worship': '\u5B97\u6559\u573A\u6240',
'Arts Centre': '\u827A\u672F\u4E2D\u5FC3',
'Zoo': '\u52A8\u7269\u56ED',
'Tourist Attraction': '\u65C5\u6E38\u666F\u70B9',
'School': '\u5B66\u6821',
'Hotel': '\u9152\u5E97',
'Local Business': '\u672C\u5730\u5546\u4E1A',
'Offices': '\u5199\u5B57\u697C',
'EV Charging': '\u7535\u52A8\u8F66\u5145\u7535\u7AD9',
'Fuel Station': '\u52A0\u6CB9\u7AD9',
'Community Centre': '\u793E\u533A\u4E2D\u5FC3',
'Airport': '机场',
'Ferry': '渡轮',
'Rail station': '火车站',
'Bus stop': '公交站',
'Bus station': '公交枢纽',
'Taxi rank': '出租车站',
'Metro or Tram stop': '地铁或有轨电车站',
'Café': '咖啡馆',
'Restaurant': '餐厅',
'Pub': '酒吧',
'Bar': '酒吧',
'Fast Food': '快餐',
'Nightclub': '夜店',
'Cinema': '电影院',
'Theatre': '剧院',
'Live Music & Events': '现场音乐与活动',
'Park': '公园',
'Playground': '游乐场',
'Sports Centre': '体育中心',
'Entertainment': '娱乐',
'Supermarket': '超市',
'Convenience Store': '便利店',
'Bakery': '面包戺',
'Butcher & Fishmonger': '肉铺与鱼铺',
'Greengrocer': '果蔬店',
'Off-Licence': '酒类商店',
'Deli & Specialty': '熟食与特产店',
'Fashion & Clothing': '时装服饰',
'Electronics': '电子产品',
'Charity Shop': '慈善商店',
'DIY & Hardware': '建材五金',
'Home & Garden': '家居与园艺',
'Bookshop': '书店',
'Pet Shop': '宠物店',
'Sports & Outdoor': '体育与户外',
'Newsagent': '报刊亭',
'Department Store': '百货商店',
'Gift & Hobby': '礼品与爱好',
'Specialist Shop': '专业商店',
'Hairdresser & Beauty': '美发与美容',
'Gym & Fitness': '健身房',
'Dry Cleaner & Laundry': '干洗与洗衣',
'Car Services': '汽车服务',
'Post Office': '邮局',
'Vet & Pet Care': '宠物医院与护理',
'Bank': '银行',
'Travel Agent': '旅行社',
'Police': '警察',
'Fire Station': '消防站',
'Ambulance Station': '急救站',
'GP Surgery': '全科诊所',
'Dentist': '牙科',
'Pharmacy': '药房',
'Hospital & Clinic': '医院与诊所',
'Optician': '眼镜店',
'Physiotherapy': '理疗',
'Counselling & Therapy': '心理咨询与治疗',
'Care Home': '养老院',
'Medical & Mobility': '医疗器械与辅助设备',
'Museum': '博物馆',
'Gallery': '美术馆',
'Library': '图书馆',
'Place of Worship': '宗教场所',
'Arts Centre': '艺术中心',
'Zoo': '动物园',
'Tourist Attraction': '旅游景点',
'School': '学校',
'Hotel': '酒店',
'Local Business': '本地商业',
'Offices': '写字楼',
'EV Charging': '电动车充电站',
'Fuel Station': '加油站',
'Community Centre': '社区中心',
// ─ Suffixes (used in formatters) ─
'/mo': '/\u6708',
'/yr': '/\u5E74',
' sqm': ' \u5E73\u65B9\u7C73',
' km': ' \u516C\u91CC',
' m': ' \u7C73',
' dB': ' \u5206\u8D1D',
' years': ' \u5E74',
' rooms': ' \u95F4',
'/mo': '/',
'/yr': '/',
' sqm': ' 平方米',
' km': ' 公里',
' m': ' ',
' dB': ' 分贝',
' years': ' ',
' rooms': ' ',
},
};