SPB Git forge

spb/countryatlas

Public
20commits 1branches 0releases
268.3 MBsize
maindefault branch
12 days agolast push
TypeScript 57% Python 38.6% JavaScript 3.6% CSS 0.6%
35.2 KB · 551 lines typescript
Raw Blame History
1/**2 * Strings for the Indicators / Regions / Explore / Changes / Data / Sources / Methodology / API / Admin pages.3 * Merged into `en.ts` with a single spread. Same conventions: flat dotted keys, `{name}` placeholders.4 */5export const enExplore = {6  // --- indicators directory7  'indicators.title': 'Indicators',8  'indicators.sub': '{n} indicators across 19 topics. Every one has a definition, a world map, a trend and its sources.',9  'indicators.search': 'Filter indicators…',10  'indicators.count': '{n} of {total}',11  'indicators.noMatch': 'No indicator matches.',12  'indicators.allTopics': 'All topics',13  'indicators.topics': 'Topics',14  'indicators.coverage': '{n} countries · {y0}–{y1}',15  'indicators.coverageShort': '{n} countries',16  'indicators.featured': 'Featured',17  'indicators.rankingLink': 'Ranking',18  'indicators.compareLink': 'Compare',19  'indicators.openLink': 'Open',20  'indicators.inTopic': '{n} in {topic}',21  'indicators.freshness': 'Source updated {date}',2223  // --- indicator page24  'indicator.title': '{name} by Country',25  'indicator.description': '{name} by country: world map, global trend, top and bottom countries, sources and downloads. Unit: {unit}. Data for {n} countries, {y0}–{y1}.',26  'indicator.notFound': 'Unknown indicator',27  'indicator.definition': 'Definition',28  'indicator.methodology': 'Methodology',29  'indicator.unit': 'Unit',30  'indicator.frequency': 'Frequency',31  'indicator.frequency.A': 'Annual',32  'indicator.frequency.Q': 'Quarterly',33  'indicator.frequency.M': 'Monthly',34  'indicator.freshness': 'Freshness',35  'indicator.freshness.latest': 'Latest observation',36  'indicator.freshness.source': 'Source updated',37  'indicator.freshness.refreshed': 'CountryAtlas refreshed',38  'indicator.world': 'World {kind}',39  'indicator.world.sum': 'World total',40  'indicator.world.weighted_mean': 'World average (population-weighted)',41  'indicator.world.median': 'World median',42  'indicator.world.n': 'across {n} countries, {year}',43  'indicator.coverage': '{n} of {total} countries ({pct})',44  'indicator.map.title': 'World map',45  'indicator.map.sub': 'One value per country for the selected year. Hatched = no data.',46  'indicator.map.year': 'Year',47  'indicator.map.nearest': 'Nearest year used for {n} countries',48  'indicator.map.none': 'No country has a value for {year}.',49  'indicator.map.n': '{n} countries',50  'indicator.trend.title': 'Trend',51  'indicator.trend.sub': 'Aggregate across the countries of a group, year by year. Computed by CountryAtlas from country values — no published aggregate is used.',52  'indicator.trend.group': 'Group',53  'indicator.trend.median': 'Median',54  'indicator.trend.mean': 'Mean',55  'indicator.trend.weighted_mean': 'Population-weighted mean',56  'indicator.trend.sum': 'Sum',57  'indicator.trend.n': 'countries per year: {min}–{max}',58  'indicator.trend.none': 'Not enough countries to aggregate this indicator for {group}.',59  'indicator.top.title': 'Highest and lowest',60  'indicator.top.sub': 'The five leaders and the five trailing countries, {year}.',61  'indicator.top.best': 'Top 5',62  'indicator.top.worst': 'Bottom 5',63  'indicator.top.highest': 'Highest 5',64  'indicator.top.lowest': 'Lowest 5',65  'indicator.top.fullRanking': 'Full ranking',66  'indicator.compare.title': 'Compare countries',67  'indicator.compare.sub': 'Pick up to five countries. Defaults to the three largest economies with data.',68  'indicator.compare.add': 'Add your country',69  'indicator.compare.search': 'Search a country…',70  'indicator.compare.remove': 'Remove {name}',71  'indicator.compare.max': 'Up to 5 countries',72  'indicator.compare.open': 'Open the full comparison',73  'indicator.compare.none': 'No series for the selected countries.',74  'indicator.sources.title': 'Sources & provenance',75  'indicator.sources.sub': 'Every value on this page comes from one of these series, chosen per country by priority.',76  'indicator.sources.rule':77    'Series-level selection: for each country the whole series comes from the highest-priority source that has any non-forecast value for it. If a lower-priority source is more than three years fresher, the freshest source wins instead. Non-chosen values are kept as alternatives, never discarded.',78  'indicator.sources.priority': 'Priority',79  'indicator.sources.source': 'Source',80  'indicator.sources.dataset': 'Dataset',81  'indicator.sources.series': 'Series',82  'indicator.sources.coverage': 'Coverage',83  'indicator.sources.status': 'Status',84  'indicator.sources.open': 'Open at source',85  'indicator.sources.transform': 'transform {expr}',86  'indicator.sources.restricted': 'limited to {n} countries',87  'indicator.nodata.title': 'Countries without data',88  'indicator.nodata.sub': '{n} of {total} countries have no value for {year}.',89  'indicator.nodata.none': 'Every country in the registry has a value for {year}.',90  'indicator.nodata.why':91    'Typical reasons: the source does not survey small territories or micro-states; the statistical office reports with a lag of one to three years; the series is only compiled for member countries of the source organisation (OECD, EU, Eurostat); or a value exists but failed validation and is quarantined rather than shown.',92  'indicator.nodata.more': '{n} more',93  'indicator.downloads.title': 'Downloads & API',94  'indicator.downloads.sub': 'Every observation for this indicator, all countries and years, with provenance columns.',95  'indicator.downloads.csv': 'Download CSV',96  'indicator.downloads.json': 'Download JSON',97  'indicator.downloads.api': 'API example',98  'indicator.downloads.apiHint': 'One country, full history. Replace CAN by any ISO3 code or slug.',99  'indicator.related.title': 'Related indicators',100  'indicator.related.sub': 'Same subtopic: {subtopic}.',101  'indicator.related.none': 'No other indicator in this subtopic.',102  'indicator.topic': 'Topic',103  'indicator.subtopic': 'Subtopic',104  'indicator.higherIsBetter.true': 'Higher is better',105  'indicator.higherIsBetter.false': 'Lower is better',106  'indicator.higherIsBetter.null': 'No direction',107  'indicator.aggregation': 'Aggregation',108  'indicator.bounds': 'Valid range',109  'indicator.copy': 'Copy',110  'indicator.copied': 'Copied',111  'indicator.og.alt': '{name} by country on CountryAtlas',112113  // --- regions114  'regions.title': 'Regions & groups',115  'regions.sub': 'World, World Bank regions, continents, income groups and organisations. Aggregates are computed by CountryAtlas from member countries.',116  'regions.kind.world': 'World',117  'regions.kind.region': 'Regions',118  'regions.kind.continent': 'Continents',119  'regions.kind.income': 'Income groups',120  'regions.kind.org': 'Organisations',121  'regions.kind.custom': 'Other groups',122  'regions.kindLabel.world': 'World',123  'regions.kindLabel.region': 'World Bank region',124  'regions.kindLabel.continent': 'Continent',125  'regions.kindLabel.income': 'Income group',126  'regions.kindLabel.org': 'Organisation',127  'regions.kindLabel.custom': 'Group',128  'regions.members': '{n} members',129  'regions.population': 'Population',130  'regions.gdp': 'GDP',131  'regions.lifeExpectancy': 'Life expectancy',132  'regions.sum': 'sum',133  'regions.median': 'median',134  'regions.weighted_mean': 'pop.-weighted mean',135  'region.title': '{name} — Countries & Statistics',136  'region.description': '{name}: {n} member countries with population, GDP, life expectancy and every CountryAtlas indicator; member ranking and aggregates.',137  'region.notFound': 'Unknown region or group',138  'region.aggregates.title': 'Aggregates',139  'region.aggregates.sub': 'Computed across member countries in this snapshot. The label says how: sum, median or population-weighted mean.',140  'region.aggregates.n': '{n} countries · {year}',141  'region.members.title': 'Members',142  'region.members.sub': '{n} countries and territories, latest values. Tap a column to sort.',143  'region.members.country': 'Country',144  'region.members.noValue': '—',145  'region.ranking.title': 'Member ranking',146  'region.ranking.sub': 'Members ranked on one indicator; rank 1 is the best value when the indicator has a direction, otherwise the highest.',147  'region.ranking.indicator': 'Indicator',148  'region.ranking.none': 'No member has a value for this indicator.',149  'region.ranking.worldRank': 'World rank {rank} of {n}',150  'region.ranking.full': 'Full ranking for {group}',151  'region.map.title': 'Member map',152  'region.map.sub': 'Highlighted: the {n} members of {name}.',153  'region.map.summary': 'World map highlighting the {n} members of {name}.',154  'region.compareAll': 'Compare all members',155  'region.compareFirst': 'Compare the {n} largest',156  'region.description.label': 'About',157158  // --- explore159  'explore.title': 'Explore',160  'explore.sub': 'Three ways in: a country, a topic or a question. Every shortcut opens a real view with live data.',161  'explore.country.title': 'Start from a country',162  'explore.country.sub': 'Search any of 218 countries and territories, or browse a region.',163  'explore.country.search': 'Search a country…',164  'explore.topic.title': 'Start from a topic',165  'explore.topic.sub': '19 topics, {n} indicators.',166  'explore.question.title': 'Start from a question',167  'explore.question.sub': 'Curated shortcuts, each backed by a live figure from the current snapshot.',168  'explore.question.leader': '{country} leads with {value} ({year})',169  'explore.question.open': 'Open →',170  'explore.q.age': 'Which countries are ageing fastest?',171  'explore.q.age.hint': 'Median age, highest first',172  'explore.q.energy': 'Who leads the energy transition?',173  'explore.q.energy.hint': 'Renewable share of electricity',174  'explore.q.housing': 'Where is housing least affordable?',175  'explore.q.housing.hint': 'House price to income ratio',176  'explore.q.growth': 'Which economies grow fastest?',177  'explore.q.growth.hint': 'Real GDP growth',178  'explore.q.life': 'Where do people live longest?',179  'explore.q.life.hint': 'Life expectancy at birth',180  'explore.q.inflation': 'Where is inflation highest?',181  'explore.q.inflation.hint': 'Consumer price inflation',182  'explore.q.debt': 'Who carries the most public debt?',183  'explore.q.debt.hint': 'General government gross debt, % of GDP',184  'explore.q.co2': 'Who emits the most CO₂ per person?',185  'explore.q.co2.hint': 'CO₂ emissions per capita',186  'explore.q.internet': 'Where is everyone online?',187  'explore.q.internet.hint': 'Internet users, % of population',188  'explore.q.unemployment': 'Where is unemployment lowest?',189  'explore.q.unemployment.hint': 'Unemployment rate, lowest first',190  'explore.q.fertility': 'Where are families largest?',191  'explore.q.fertility.hint': 'Fertility rate, births per woman',192  'explore.q.rd': 'Who invests most in research?',193  'explore.q.rd.hint': 'R&D expenditure, % of GDP',194  'explore.q.g7': 'Compare the G7',195  'explore.q.g7.hint': 'Seven economies side by side',196  'explore.q.brics': 'Compare the BRICS founders',197  'explore.q.brics.hint': 'Brazil, Russia, India, China, South Africa',198  'explore.q.nordic': 'Compare the Nordic countries',199  'explore.q.nordic.hint': 'Denmark, Finland, Iceland, Norway, Sweden',200  'explore.q.members': '{n} members',201  'explore.changes.title': 'Biggest recent changes',202  'explore.changes.sub': 'Detected deterministically from the data — no editorial picks.',203  'explore.changes.all': 'Full feed',204  'explore.similar.title': 'Country similarity playground',205  'explore.similar.sub': 'Pick a country and see its nearest peers on each dimension. Scores are standardised distances, 100 = identical.',206  'explore.similar.pick': 'Pick a country…',207  'explore.similar.peers': 'Peers of {name}',208  'explore.similar.none': 'Not enough data to compute peers for {name}.',209  'explore.similar.empty': 'Choose a country to start.',210  'explore.similar.score': 'Score',211212  // --- changes feed213  'changes.title': 'Recent changes',214  'changes.sub': 'Every notable movement in the latest snapshot, across all countries and indicators.',215  'changes.how':216    'Detected deterministically from the data: year-over-year moves beyond a robust threshold, record highs and lows, multi-year highs and lows, sign flips, accelerations. Severity is a computed 0–1 score. There are no editorial picks and no generated text — headlines are templates filled with the computed numbers.',217  'changes.filter.kind': 'Kind',218  'changes.filter.indicator': 'Indicator',219  'changes.filter.region': 'Region',220  'changes.filter.severity': 'Minimum severity',221  'changes.filter.severity.any': 'Any',222  'changes.filter.severity.notable': 'Notable and above',223  'changes.filter.severity.major': 'Major only',224  'changes.filter.search': 'Search an indicator…',225  'changes.filter.active': '{n} active',226  'changes.count': '{n} changes',227  'changes.none': 'No change matches these filters.',228  'changes.period': '{period}',229  'changes.series': 'Series',230  'changes.loading': 'Loading changes…',231  'changes.error': 'The change feed is unavailable right now.',232  'changes.methodology': 'How changes are detected',233234  // --- data hub235  'data.title': 'Data downloads',236  'data.sub': 'Every number on the site as CSV or JSON, with provenance columns. Free to use with attribution.',237  'data.country.title': 'Per-country dataset',238  'data.country.sub': 'All indicators, all years, for one country.',239  'data.country.search': 'Search a country…',240  'data.indicator.title': 'Per-indicator dataset',241  'data.indicator.sub': 'All countries, all years, for one indicator.',242  'data.indicator.search': 'Search an indicator…',243  'data.pick': 'Pick one to enable the downloads.',244  'data.selected': 'Selected',245  'data.bulk.title': 'Bulk data',246  'data.bulk.sub': 'How to get everything.',247  'data.bulk.text':248    'There is no single archive yet. The fastest way to the whole snapshot is the API: list indicators with /api/v1/indicators, then fetch /api/v1/indicators/{slug}/download.csv for each. Please keep to the rate limit (120 requests per minute) and cache locally; the snapshot changes once a day at most. For a full copy of the database, write to the address below.',249  'data.columns.title': 'Columns',250  'data.columns.sub': 'The same columns in every export. CSV files start with one comment line naming the snapshot.',251  'data.api.title': 'API',252  'data.api.sub': 'Programmatic access to everything on the site.',253  'data.api.text': 'Every page is built from the public JSON API. Base URL {base}. Read the endpoint list and copy examples on the API page.',254  'data.api.link': 'API documentation',255  'data.licence.title': 'Licence & attribution',256  'data.licence.sub': 'Please credit the original sources, not only CountryAtlas.',257  'data.licence.compilation': 'The CountryAtlas compilation (harmonised series, derived metrics, rankings, change detection) is released under CC BY 4.0.',258  'data.licence.sources': 'Each observation carries its source licence in the export (column licence). Check it before redistributing: most sources are CC BY 4.0, but the WHO Global Health Observatory is CC BY-NC-SA 3.0 IGO (no commercial use, share alike) and some portals apply their own terms.',259  'data.licence.example': 'Suggested attribution',260  'data.licence.exampleText': 'Data: {sources} via CountryAtlas (countryatlas.co), CC BY 4.0 compilation. Retrieved {date}.',261  'data.licence.source': 'Source',262  'data.licence.licence': 'Licence',263  'data.licence.attribution': 'Attribution',264  'data.snapshot': 'Current snapshot {run}, built {date}.',265266  // --- sources267  'sources.title': 'Sources',268  'sources.sub': '{n} data sources feed the atlas. Every value on the site names the one it came from.',269  'sources.rule':270    'How sources are combined: each indicator lists its sources in priority order (1 = preferred). For each country the whole series is taken from the highest-priority source that has any non-forecast value for it — so a country never mixes two sources within one series. If a lower-priority source is more than three years fresher, the fresher source wins instead. Values from the non-chosen sources are kept as alternatives, never merged or discarded; forecasts (IMF projections) are flagged and never enter latest values or rankings.',271  'sources.observations': '{n} observations',272  'sources.indicators': '{n} indicators',273  'sources.lastImport': 'Last import {date}',274  'sources.licence': 'Licence',275  'sources.contact': 'Questions about a source?',276  'sources.organisation': 'Organisation',277  'sources.website': 'Website',278  'sources.apiBase': 'API base',279  'sources.attribution': 'Attribution text',280  'source.title': '{name} — Data Source',281  'source.description': '{name} on CountryAtlas: {n} indicators, licence {licence}, datasets, series mapped, import history and freshness.',282  'source.notFound': 'Unknown source',283  'source.about': 'About this source',284  'source.freshness.title': 'Freshness',285  'source.freshness.sub': 'When the source last published, when CountryAtlas last fetched it, and when the current snapshot was built.',286  'source.freshness.sourceUpdated': 'Source updated',287  'source.freshness.retrieved': 'Last successful import',288  'source.freshness.built': 'Snapshot built',289  'source.datasets.title': 'Datasets',290  'source.datasets.sub': 'Datasets of this source present in the snapshot.',291  'source.datasets.dataset': 'Dataset',292  'source.datasets.observations': 'Observations',293  'source.datasets.indicators': 'Indicators',294  'source.datasets.countries': 'Countries',295  'source.datasets.years': 'Years',296  'source.series.title': 'Series mapped',297  'source.series.sub': '{n} series feed CountryAtlas indicators. Priority 1 means this source is preferred for that indicator.',298  'source.series.indicator': 'Indicator',299  'source.series.code': 'Series code',300  'source.series.priority': 'Priority',301  'source.series.coverage': 'Coverage',302  'source.series.lastYear': 'Last year',303  'source.series.status': 'Status',304  'source.runs.title': 'Import history',305  'source.runs.sub': 'Latest attempt per series ({n} shown). Status, rows kept and validation counts.',306  'source.runs.started': 'Started',307  'source.runs.dataset': 'Dataset → indicator',308  'source.runs.status': 'Status',309  'source.runs.rows': 'Rows',310  'source.runs.warnings': 'Warnings',311  'source.runs.errors': 'Errors',312  'source.runs.duration': 'Duration',313  'source.runs.none': 'No import run recorded for this source.',314  'source.open': 'Open {name}',315  'source.run.ok': 'OK',316  'source.run.partial': 'Partial',317  'source.run.failed': 'Failed',318  'source.run.quarantined': 'Quarantined',319  'source.run.skipped': 'Skipped',320321  // --- methodology322  'method.title': 'Methodology',323  'method.sub': 'How CountryAtlas builds every number: registries, source selection, validation, derived metrics and their limits.',324  'method.toc': 'On this page',325  'method.principles': 'Principles',326  'method.countries': 'Country registry',327  'method.countries.text':328    'The registry lists 218 countries and territories with ISO 3166-1 alpha-2, alpha-3 and numeric codes, a URL slug, a short display name, capital, continent, World Bank region and income classification (FY2026), currency, area, borders and languages. Every dataset is mapped to this registry before anything else happens; a row whose country code is unknown is logged and dropped, and source aggregates (World, OECD…) are never stored as countries. Groups — World Bank regions, continents, income groups and organisations — are lists of registry members, so a group aggregate always means “across these member countries”.',329  'method.indicators': 'Indicator registry & units',330  'method.indicators.text':331    'Each of the {n} indicators has a stable slug, a name, a topic and subtopic, a unit and short unit, a display format, a precision, a frequency, an aggregation rule (sum for additive quantities such as GDP or population; none otherwise), whether higher is better, whether it is eligible for rankings, optional bounds and a jump threshold for validation. Units are never converted at display time: the value stored is the value shown, in the registry unit.',332  'method.indicators.formats': 'Formats',333  'method.indicators.frequencies': 'Frequencies',334  'method.indicators.aggregations': 'Aggregations',335  'method.indicators.units': 'Most common units',336  'method.sources': 'Sources, priority and series-level selection',337  'method.sources.text2':338    'Selection is made per series, not per point: for each country and indicator the whole history comes from one source, so a line never switches vintage halfway. The chosen source is the highest-priority one with any non-forecast value for that country, unless a lower-priority source is more than three years fresher, in which case the fresher one wins. The decision is recorded on every row. The non-chosen values remain available as alternatives.',339  'method.sources.mapped': 'Series mapped per connector',340  'method.sources.urls': 'Deep-link patterns',341  'method.validation': 'Validation rules and statuses',342  'method.validation.text':343    'Every imported row passes deterministic checks. Unusual values are flagged, never deleted. A whole dataset is quarantined — and the previous good file kept — when it looks broken as a whole (duplicates, unit change, partial download).',344  'method.validation.statuses': 'Statuses',345  'method.validation.status.verified': 'Passed every check and matches a second source or a previous vintage.',346  'method.validation.status.imported': 'Passed every check; no independent confirmation.',347  'method.validation.status.warning': 'Kept, but flagged: an extreme jump versus the country’s own history.',348  'method.validation.status.stale': 'The latest observation is older than the freshness window for its frequency.',349  'method.validation.status.quarantined': 'Failed a hard check; stored for audit, excluded from every derived table.',350  'method.validation.stale': 'Freshness windows',351  'method.validation.staleText': 'A series is stale when its latest period ends more than {a} days ago (annual), {q} days (quarterly) or {m} days (monthly).',352  'method.freshness': 'Freshness',353  'method.freshness.text':354    'Three dates travel with every value. Source updated is the vintage the publisher advertises; retrieved is when the pipeline fetched the file; built is when the snapshot was assembled. Pages show all three where they matter, and the footer of every page names the snapshot. A new snapshot is built once a day; the API cache is keyed on the snapshot id, so nothing stale survives a rebuild.',355  'method.rankings': 'Rankings',356  'method.rankings.text':357    'Rankings compare countries (never territories or aggregates) for the same year. Rank 1 is the best value when the indicator declares a direction — the lowest infant mortality, the highest life expectancy — and simply the highest value when it does not. Group rankings recompute ranks within the group. Ranks are computed only for years with at least 20 countries; when a country’s latest year is more than two years behind the indicator’s latest year, its rank is flagged as stale.',358  'method.changes': 'Changes & events',359  'method.changes.text':360    'Changes are detected per country and indicator with fixed, published rules. A year-over-year move counts when it exceeds a robust threshold (twice the median absolute deviation of the series’ yearly differences) and an indicator-specific floor. Record highs and lows, 10/20/30-year highs and lows, sign flips and accelerations are detected on the whole history. Severity is min(1, |z| / 4) blended with how far the move clears the floor, then weighted by the indicator’s importance. Recent detections form the changes feed; the whole history forms each country’s timeline.',361  'method.changes.floors': 'Floors',362  'method.similarity': 'Similarity',363  'method.similarity.text':364    'Peers are computed per mode from a fixed feature list. Heavy-tailed features (GDP per capita, population, area) are log-transformed, every feature is z-scored across countries using latest values, and the weighted Euclidean distance d between two countries becomes a score 100 × exp(−d / d₀), where d₀ is the median pairwise distance of the mode. A country needs at least 70 % of a mode’s features to be scored; each peer lists which features contributed most, so every match is explainable.',365  'method.similarity.modes': 'Modes',366  'method.insights': 'Insights',367  'method.insights.text':368    'Key facts on country pages are template sentences filled with numbers computed from the data (change since a year, rank in a group, distance to the median, average growth). No language model writes or rewrites them; the raw numbers are stored next to the text.',369  'method.dna': 'Country DNA',370  'method.dna.text':371    'Nine descriptive dimensions, each the percentile rank (0–100) of the country among all countries for one representative indicator or the mean of two or three. It is a fingerprint for reading a country at a glance, not a score and not a ranking.',372  'method.limitations': 'Limitations',373  'method.limitations.text':374    'Group aggregates are computed from the countries present in the snapshot and can differ from published aggregates that use different membership, weights or imputed values. Coverage is uneven: small territories and conflict-affected countries have sparse series. Definitions differ between sources — a series is never mixed, but two countries may be served by two sources. Forecasts are shown only where the chosen source publishes them. Rankings of quarterly or monthly indicators use the last period of the year. Percentile-based fingerprints and similarity scores are sensitive to which countries report a feature.',375  'method.versioning': 'Versioning & revisions',376  'method.versioning.text':377    'Every snapshot has a run id (shown in the footer and in every API response). A rebuild never overwrites a value silently: a changed value is recorded as a revision with the previous value and both vintages. Raw source files are kept per run so any number can be traced back to the exact payload it came from. Indicator slugs, group ids and API paths are stable; deprecations are announced on the API page before removal.',378  'method.licence': 'Licence',379  'method.licence.text': 'The CountryAtlas compilation is CC BY 4.0. Each value keeps its source licence in the provenance object; see the Sources page for the exact terms per source.',380  'method.formatting': 'Display formatting',381  'method.periods': 'Periods',382  'method.rule.severity': 'Severity',383  'method.rule.code': 'Rule',384  'method.rule.effect': 'Effect',385386  // --- api landing387  'apiPage.title': 'API',388  'apiPage.sub': 'A public, read-only JSON API — the same one that builds every page of this site.',389  'apiPage.intro':390    'Every country, indicator, ranking, comparison, map and change on CountryAtlas is served by this API. Responses are plain JSON, every value carries a provenance object, and identifiers are human-readable slugs. No key is needed.',391  'apiPage.base': 'Base URL',392  'apiPage.swagger': 'Interactive docs (Swagger)',393  'apiPage.openapi': 'OpenAPI specification',394  'apiPage.endpoints.title': 'Endpoints',395  'apiPage.endpoints.sub': 'All GET, all JSON. Countries accept ISO3 or slug; indicators, topics and groups accept their slug.',396  'apiPage.endpoint': 'Endpoint',397  'apiPage.describes': 'Returns',398  'apiPage.examples.title': 'Examples',399  'apiPage.examples.sub': 'Real responses from the current snapshot, trimmed for length. Copy the command and run it.',400  'apiPage.examples.live': 'Live response (trimmed)',401  'apiPage.examples.unavailable': 'Example unavailable right now — the API did not answer.',402  'apiPage.provenance.title': 'The provenance object',403  'apiPage.provenance.sub': 'Attached to every value the API returns.',404  'apiPage.provenance.text': 'Headline metrics, series points, ranking rows, map values and change items all carry a provenance object: the source connector and display name, dataset and series code, when the pipeline retrieved it, when the source last updated it, a deep link to the source page, the transformation applied (if any) and the source licence. Series responses also list every source used with the number of values from each.',405  'apiPage.limits.title': 'Rate limits & caching',406  'apiPage.limits.text': '120 requests per minute per IP (429 with a Retry-After header beyond that). Responses are cached per snapshot; the X-CountryAtlas-Run header names the snapshot and X-Cache says whether the cache served you. Please cache on your side too — data changes at most once a day.',407  'apiPage.errors.title': 'Errors',408  'apiPage.errors.text': 'RFC 7807 problem+json: 404 for an unknown country, indicator, topic or group (with a hint in detail), 400 for a bad combination, 422 for an invalid parameter, 429 when rate-limited, 503 while the first snapshot is being built.',409  'apiPage.licence.title': 'Licence',410  'apiPage.licence.text': 'The compilation is CC BY 4.0; each value keeps its source licence in provenance.licence. Attribute the original sources and CountryAtlas.',411  'apiPage.contact': 'Questions or higher limits?',412  'apiPage.field': 'Field',413  'apiPage.meaning': 'Meaning',414  'apiPage.ep.health': 'Snapshot status, counts, version.',415  'apiPage.ep.countries': 'Country directory with filters and sort.',416  'apiPage.ep.country': 'Country overview: header, groups, coverage, headline metrics, topics.',417  'apiPage.ep.countryTopic': 'All indicators of a topic for one country, grouped by subtopic.',418  'apiPage.ep.countrySeries': 'Full history of one indicator for one country.',419  'apiPage.ep.countryChanges': 'Recent detected changes for a country.',420  'apiPage.ep.countryEvents': 'Whole-history timeline of a country.',421  'apiPage.ep.countrySimilar': 'Nearest peers per mode with contributions.',422  'apiPage.ep.countryInsights': 'Computed key facts.',423  'apiPage.ep.countryDna': 'Nine-dimension fingerprint.',424  'apiPage.ep.countryDownload': 'Per-country dataset (CSV or JSON).',425  'apiPage.ep.indicators': 'Indicator directory with topic, text and source filters.',426  'apiPage.ep.indicator': 'Definition, sources, coverage, world value, top and bottom five.',427  'apiPage.ep.indicatorMap': 'Choropleth values for one year with quantile legend.',428  'apiPage.ep.indicatorTrend': 'Aggregate trend for a group (median, mean, weighted mean, sum).',429  'apiPage.ep.indicatorDownload': 'Per-indicator dataset (CSV or JSON).',430  'apiPage.ep.series': 'Series bundle: several countries × several indicators.',431  'apiPage.ep.rankings': 'Rankable indicators.',432  'apiPage.ep.ranking': 'Ranking for one indicator, any year, any group.',433  'apiPage.ep.rankingHistory': 'Rank by year for chosen countries.',434  'apiPage.ep.compare': 'Comparison bundle with absolute, per-capita, indexed or % modes.',435  'apiPage.ep.compareSnapshot': 'Latest values table for a topic across countries.',436  'apiPage.ep.regions': 'Groups: regions, continents, income groups, organisations.',437  'apiPage.ep.region': 'Group page: members, aggregates, member ranking.',438  'apiPage.ep.search': 'Typed search across countries, indicators, topics, regions, sources.',439  'apiPage.ep.home': 'Global snapshot, curated lists, recent changes.',440  'apiPage.ep.changes': 'Global feed of detected changes with filters.',441  'apiPage.ep.sources': 'Data sources with counts, licence and freshness.',442  'apiPage.ep.source': 'Source detail: indicators mapped, datasets, import runs.',443  'apiPage.ep.methodology': 'Registry-derived methodology payload.',444  'apiPage.ex.country': 'A country overview',445  'apiPage.ex.series': 'One series with history and provenance',446  'apiPage.ex.ranking': 'A ranking, three rows',447  'apiPage.ex.map': 'Map values for one year',448  'apiPage.ex.search': 'Search',449  'apiPage.ex.changes': 'Recent changes',450451  // --- admin452  'admin.title': 'Admin',453  'admin.login.title': 'Admin sign-in',454  'admin.login.sub': 'Internal operations panel. Enter the admin token to continue.',455  'admin.login.token': 'Admin token',456  'admin.login.submit': 'Sign in',457  'admin.login.error': 'Invalid token.',458  'admin.login.notConfigured': 'CA_ADMIN_TOKEN is not configured on this web server; the panel is disabled.',459  'admin.logout': 'Sign out',460  'admin.nav.overview': 'Overview',461  'admin.nav.coverage': 'Coverage',462  'admin.nav.runs': 'Runs',463  'admin.nav.issues': 'Issues',464  'admin.nav.raw': 'Raw files',465  'admin.overview.title': 'Overview',466  'admin.snapshot': 'Snapshot',467  'admin.db': 'Database',468  'admin.db.size': 'Size',469  'admin.db.missing': 'No snapshot file',470  'admin.scheduler': 'Scheduler',471  'admin.scheduler.alive': 'Running (pid {pid})',472  'admin.scheduler.dead': 'Not running (pid {pid} not found)',473  'admin.scheduler.unknown': 'No pid file',474  'admin.scheduler.last': 'Last run',475  'admin.scheduler.next': 'Next run',476  'admin.scheduler.refreshAt': 'Daily refresh at {time}',477  'admin.cache': 'Response cache',478  'admin.counts': 'Table counts',479  'admin.statuses': 'Observation statuses',480  'admin.connectors.title': 'Connector health',481  'admin.connectors.sub': 'Latest attempt per series, aggregated by connector.',482  'admin.connectors.connector': 'Connector',483  'admin.connectors.runs': 'Runs',484  'admin.connectors.last': 'Last finished',485  'admin.connectors.status': 'Last status',486  'admin.connectors.ok': 'OK',487  'admin.connectors.failed': 'Failed',488  'admin.connectors.rows': 'Rows valid',489  'admin.connectors.warnings': 'Warnings',490  'admin.connectors.errors': 'Errors',491  'admin.stale.title': 'Sources freshness',492  'admin.stale.sub': 'Oldest source vintage first. n_stale counts observations flagged stale.',493  'admin.stale.source': 'Source',494  'admin.stale.observations': 'Observations',495  'admin.stale.updated': 'Source updated',496  'admin.stale.retrieved': 'Retrieved',497  'admin.stale.n': 'Stale',498  'admin.actions.refresh': 'Refresh now',499  'admin.actions.refreshHint': 'Sends SIGUSR1 to the scheduler.',500  'admin.actions.clearCache': 'Clear cache',501  'admin.actions.done': 'Done: {msg}',502  'admin.actions.failed': 'Failed: {msg}',503  'admin.coverage.title': 'Coverage matrix',504  'admin.coverage.sub': '{n} indicators × countries. Click a header to sort.',505  'admin.coverage.indicators': 'Indicators',506  'admin.coverage.countries': 'Countries',507  'admin.coverage.indicator': 'Indicator',508  'admin.coverage.topic': 'Topic',509  'admin.coverage.source': 'Source',510  'admin.coverage.nCountries': 'Countries',511  'admin.coverage.nObs': 'Obs.',512  'admin.coverage.years': 'Years',513  'admin.coverage.latestYear': 'Latest',514  'admin.coverage.nLatest': 'With latest',515  'admin.coverage.updated': 'Source updated',516  'admin.coverage.country': 'Country',517  'admin.coverage.pct': 'Coverage',518  'admin.runs.title': 'Import runs',519  'admin.runs.sub': 'Latest attempt per series ({n}). Filter by connector or status via the URL (?connector=&status=).',520  'admin.runs.run': 'Run',521  'admin.runs.raw': 'Raw files',522  'admin.issues.title': 'Validation issues',523  'admin.issues.sub': '{n} issues shown. Filter by severity.',524  'admin.issues.all': 'All severities',525  'admin.issues.summary': 'Summary',526  'admin.issues.severity': 'Severity',527  'admin.issues.code': 'Code',528  'admin.issues.connector': 'Connector',529  'admin.issues.indicator': 'Indicator',530  'admin.issues.country': 'Country',531  'admin.issues.period': 'Period',532  'admin.issues.message': 'Message',533  'admin.issues.value': 'Value',534  'admin.issues.none': 'No validation issue recorded.',535  'admin.raw.title': 'Raw files',536  'admin.raw.sub': 'Files stored on disk for one import run.',537  'admin.raw.runId': 'Run id',538  'admin.raw.load': 'Load',539  'admin.raw.pick': 'Enter a run id (see Runs) to list its raw files.',540  'admin.raw.file': 'File',541  'admin.raw.size': 'Size',542  'admin.raw.modified': 'Modified',543  'admin.raw.missing': 'missing',544  'admin.raw.none': 'No file recorded for this run.',545  'admin.unavailable': 'The admin API did not answer ({status}). Check CA_ADMIN_TOKEN on the API process and ADMIN_API_URL.',546  'admin.empty': 'The API is running but no snapshot exists yet.',547  'admin.na': '—',548  'admin.key': 'Key',549  'admin.value': 'Value',550} as const;551