Read misc.territory, timezone, useragent and car as tables, and state the data rules behind them #23
+17
-5
@@ -11,7 +11,7 @@ replacement, and each removed path, column or flag.
|
||||
- First release: the CLI, the library and the shipped data set.
|
||||
- Table categories: a category JSON naming a `rows` TSV beside it, with the options
|
||||
`key`, `name`, `weight` and `parent`; a path selects a row by key or name,
|
||||
`misc.country[SE]`, and descends to a linked table by name; linked tables draw
|
||||
`misc.territory[SE]`, and descends to a linked table by name; linked tables draw
|
||||
consistently within one render and draw group. `rows` is an option, so no
|
||||
template may carry a field of that name. A `name` without a `key` resolves
|
||||
inside the table's `parent`. Refused at `New`: a `name` without a `key` or a
|
||||
@@ -21,16 +21,28 @@ replacement, and each removed path, column or flag.
|
||||
row of, or two paths pinning different rows of one table.
|
||||
- `New` refuses a root choice of templates sharing one format and one set of string
|
||||
fields, naming the rows TSV to write instead.
|
||||
- `misc.country`, `misc.currency`, `misc.language`, `misc.httpstatus` and
|
||||
`misc.mimetype` are tables. `misc.country` is every ISO 3166 country that has a
|
||||
capital, a currency and a TLD, with the columns `calling-code`, `capital`,
|
||||
`currency`, `flag`, `languages`, `numeric` and `tld` added; `misc.currency` the
|
||||
- `misc.territory`, `misc.currency`, `misc.language`, `misc.httpstatus` and
|
||||
`misc.mimetype` are tables. `misc.territory` is every ISO 3166-1 territory that has
|
||||
a capital, a currency and a TLD, with the columns `calling-code`, `capital`,
|
||||
`country`, `currency`, `flag`, `languages`, `numeric` and `tld` added, `country`
|
||||
holding the alpha-2 code of the sovereign state it belongs to and its own where it
|
||||
is one; `misc.currency` the
|
||||
current ISO 4217 currencies with a minor unit, with `decimals` and `numeric`
|
||||
added, and its symbols from CLDR; `misc.language` every ISO 639-2 entry carrying a
|
||||
639-1 code, with a `code3` column holding its 639-2/T code; `misc.httpstatus` each
|
||||
code the IANA registry lists with a plain reason phrase; and `misc.mimetype` each
|
||||
type mime-db records as IANA-registered and gives a filename extension.
|
||||
`DATA-LICENSES.md` lists each source.
|
||||
- `misc.timezone`, `misc.car` and `misc.useragent` are tables too. `misc.timezone`
|
||||
is every zone tzdb `zone.tab` gives a shipped territory, with `offset` holding the
|
||||
zone's standard UTC offset and `territory` linking to `misc.territory`, so
|
||||
`misc.territory[SE].timezone` draws `Europe/Stockholm`; zones of a territory
|
||||
`misc.territory` does not ship, Antarctica's among them, and the constant `UTC`
|
||||
are gone; spell that one as the text `"UTC"`. A `weight` column carries the
|
||||
population GeoNames records in each zone, so a draw favours the zones people live
|
||||
in. `misc.useragent` is the top-user-agents desktop and mobile lists with `browser`,
|
||||
`device` and `os` columns. `misc.car` keeps its makes and models in a `make` and a
|
||||
`model` column.
|
||||
- `geo.SE` and `geo.US`: five linked tables per country, `region`, `municipality`,
|
||||
`locality`, `postal-code` and `street`, weighted by population and address counts
|
||||
and built from SCB, GeoNames, Trafikverket NVDB and the US Census Bureau, and an
|
||||
|
||||
+5
-3
@@ -14,11 +14,13 @@ Every shipped dataset, its source, its licence and the attribution it asks for.
|
||||
| `sv_SE/first-name.tsv`, `last-name.tsv` | [SCB](https://www.scb.se/) names with at least two bearers, 31 December 2022 | CC0 1.0 | "Källa: SCB" | `data-import/names-se.py` |
|
||||
| `en_US/first-name.tsv` | [SSA](https://www.ssa.gov/oact/babynames/) baby names, births 1930 to 2020, through [hackerb9/ssa-baby-names](https://github.com/hackerb9/ssa-baby-names) | public domain | none required | `data-import/names-us.py` |
|
||||
| `en_US/last-name.tsv` | Census Bureau surnames occurring 100 or more times, 2010 | public domain | none required | `data-import/names-us.py` |
|
||||
| `sv_SE/sex.tsv`, `sv_SE/birth-number.tsv`, `sv_SE/title.tsv`, `en_US/sex.tsv`, `en_US/title.tsv` | curated (Skatteverket's test birth numbers are facts) | — | — | — |
|
||||
| `misc/country.tsv` | [datasets/country-codes](https://github.com/datasets/country-codes) | [PDDL 1.0](https://opendatacommons.org/licenses/pddl/1-0/) | none required | `data-import/country.py` |
|
||||
| `sv_SE/sex.tsv`, `sv_SE/birth-number.tsv`, `sv_SE/title.tsv`, `en_US/sex.tsv`, `en_US/title.tsv`, `misc/car.tsv` | curated; Skatteverket's test birth numbers are facts, and `car.tsv` waits for an international source (goal 10) | — | — | — |
|
||||
| `misc/currency.tsv` | [datasets/currency-codes](https://github.com/datasets/currency-codes); symbols from [Unicode CLDR](https://github.com/unicode-org/cldr) `en.xml` and `root.xml` | PDDL 1.0; [Unicode License v3](https://www.unicode.org/license.txt) | CLDR: "Copyright © 1991-2025 Unicode, Inc. Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the United States and other countries." | `data-import/currency.py` |
|
||||
| `misc/httpstatus.tsv` | [IANA HTTP Status Code Registry](https://www.iana.org/assignments/http-status-codes/) | [public domain](https://www.iana.org/help/licensing-terms) | none required | `data-import/httpstatus.py` |
|
||||
| `misc/language.tsv` | [datasets/language-codes](https://github.com/datasets/language-codes), the [Library of Congress](https://www.loc.gov/standards/iso639-2/) ISO 639-2 register | [PDDL 1.0](https://opendatacommons.org/licenses/pddl/1-0/) | none required | `data-import/language.py` |
|
||||
| `misc/mimetype.tsv` | [mime-db](https://github.com/jshttp/mime-db), the IANA media type registry with filename extensions | [MIT](https://github.com/jshttp/mime-db/blob/master/LICENSE) | "Copyright (c) 2014 Jonathan Ong, Copyright (c) 2015-2022 Douglas Christopher Wilson" | `data-import/mimetype.py` |
|
||||
| `misc/territory.tsv` | [datasets/country-codes](https://github.com/datasets/country-codes) | [PDDL 1.0](https://opendatacommons.org/licenses/pddl/1-0/) | none required | `data-import/territory.py` |
|
||||
| `misc/timezone.tsv` | [IANA tzdb](https://www.iana.org/time-zones) 2026d `zone.tab` and the standard offset of each zone; weights from [GeoNames](https://www.geonames.org/) `cities15000` populations | [public domain](https://data.iana.org/time-zones/tzdb/LICENSE); [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) | "Populations from GeoNames, www.geonames.org" | `data-import/timezone.py` |
|
||||
| `misc/useragent.tsv` | [top-user-agents](https://github.com/microlinkhq/top-user-agents) desktop and mobile lists | [MIT](https://github.com/microlinkhq/top-user-agents/blob/master/LICENSE.md) | "Copyright © 2020 Kiko Beats" | `data-import/useragent.py` |
|
||||
|
||||
Every other category is hand-written JSON under [`data/`](data), MIT like the code.
|
||||
Every other category is hand-written under [`data/`](data), MIT like the code.
|
||||
|
||||
@@ -17,7 +17,7 @@ fejkdata sv_SE.person.last # Eriksson
|
||||
fejkdata --seed 42 sv_SE.address # the same address every run
|
||||
fejkdata -n 3 --separator ', ' sv_SE.word # nät, barn, sol
|
||||
fejkdata --list # every path the data offers
|
||||
fejkdata 'misc.country[SE].capital' # Stockholm — a table's row, selected by key or name
|
||||
fejkdata 'misc.territory[SE].capital' # Stockholm — a table's row, selected by key or name
|
||||
fejkdata 'geo.SE.locality[Lund].street' # Fjelievägen — a linked table, drawn inside the row
|
||||
fejkdata --data-path ./mydata sv_SE.word # layer a directory over the shipped data
|
||||
fejkdata --no-shipped-data -d ./mydata --list # only your data
|
||||
@@ -161,15 +161,36 @@ Each locale carries `address`, `color`, `company`, `date`, `email`, `first-name`
|
||||
`ip`, `last-name`, `person`, `phone`, `price`, `sentence`, `sex`, `time`, `url`,
|
||||
`username`, `version` and `word`, formatted per locale; `sv_SE` adds
|
||||
`personnummer` and `samordningsnummer`, `en_US` adds `ssn` and `itin`. `misc`
|
||||
carries `car`, `coordinate`, `country` (ISO 3166), `creditcard` (Luhn-valid),
|
||||
`currency` (ISO 4217), `datetime` (RFC 3339), `emoji`, `httpstatus`, `language`
|
||||
(ISO 639-1, with its 639-2/T code), `mac`, `mimetype`, `objectid`, `timezone`
|
||||
carries `car`, `coordinate`, `creditcard` (Luhn-valid), `currency` (ISO 4217),
|
||||
`datetime` (RFC 3339), `emoji`, `httpstatus`, `language` (ISO 639-1, with its
|
||||
639-2/T code), `mac`, `mimetype`, `objectid`, `territory` (ISO 3166-1), `timezone`
|
||||
(IANA), `useragent` and `uuid` (v4). Many carry sub-fields — `misc.currency.symbol`,
|
||||
`misc.country.alpha2`, `misc.httpstatus.code` — which `--list` shows. `country`,
|
||||
`currency`, `httpstatus`, `language` and `mimetype` are [tables](#table), so
|
||||
`misc.country[SE].capital` and `misc.currency[Euro].symbol` select a row;
|
||||
`misc.territory.alpha2`, `misc.httpstatus.code` — which `--list` shows. `car`,
|
||||
`currency`, `httpstatus`, `language`, `mimetype`, `territory`, `timezone` and
|
||||
`useragent` are [tables](#table), so `misc.territory[SE].capital` and
|
||||
`misc.currency[Euro].symbol` select a row; `car` and `useragent` carry no key or
|
||||
name, so they are drawn from rather than selected in.
|
||||
[`DATA-LICENSES.md`](DATA-LICENSES.md) names each table's source and licence.
|
||||
|
||||
`misc.timezone` is every zone tzdb gives a shipped territory, from one apiece for most
|
||||
of them to dozens for the largest, weighted by the population GeoNames records in each,
|
||||
so `misc.territory[US].timezone` draws `America/New_York` far more often than
|
||||
`America/Nome`. It links to `misc.territory`, so `misc.territory[SE].timezone` is
|
||||
`Europe/Stockholm` and a drawn territory and zone agree. Its `offset` is the zone's
|
||||
*standard* offset, so do not pair it with a drawn `misc.datetime`: in a zone that
|
||||
observes DST it is the wrong one half the year, which is what storing a zone name
|
||||
avoids. A zone tzdb named recently — `Europe/Kyiv`, `America/Ciudad_Juarez` — is
|
||||
rejected outright by a consumer resolving it against older tzdata, so where the
|
||||
consumer validates the zone, pin one rather than draw it. There is no `UTC` row, tzdb
|
||||
giving that name no territory — spell it as the text `"UTC"`. `misc.useragent` carries
|
||||
`browser`, `device` and `os` beside the string, and `misc.car` a `make` and a `model`,
|
||||
until an international source replaces them.
|
||||
|
||||
ISO 3166-1 codes territories, not sovereign states, so that is what the table is
|
||||
called: Greenland and Åland have codes of their own, and `misc.territory.country`
|
||||
names the state each belongs to — `DK` for Greenland, `FI` for Åland, and its own
|
||||
code for a sovereign one, or for one the register names no state for.
|
||||
|
||||
`sex`, `first-name` and `last-name` are tables weighted by bearers, from SCB, the
|
||||
SSA and the Census Bureau. `first-name` links to `sex`, so `sv_SE.sex[f].first-name`
|
||||
draws a woman's name, and a name both sexes carry is a row under each, so
|
||||
@@ -447,11 +468,11 @@ inline template has no file beside it, so there it stays a choice.
|
||||
|
||||
### Row selection
|
||||
|
||||
`[key]` or `[name]` after a table's name selects one row: `misc.country[SE]` and
|
||||
`misc.country[Sweden]` name one row, and `misc.country[SE].capital` reads its column.
|
||||
`[key]` or `[name]` after a table's name selects one row: `misc.territory[SE]` and
|
||||
`misc.territory[Sweden]` name one row, and `misc.territory[SE].capital` reads its column.
|
||||
A name naming several rows is an error listing their keys, unless a row selected
|
||||
before it settles which ([Linked tables](#linked-tables)). A selector is part of the path, so it works
|
||||
wherever a path does: `Fake`, `FakeRecord`, a `{/misc.country[SE].capital}` reference
|
||||
wherever a path does: `Fake`, `FakeRecord`, a `{/misc.territory[SE].capital}` reference
|
||||
and a struct tag. A dot inside the brackets belongs to the key or name, so
|
||||
`city[St. Louis]` selects it. A path starts with a name, and `[` still opens a JSON
|
||||
array at the start of a CLI argument, so `'[SE]'` alone names nothing.
|
||||
@@ -772,6 +793,13 @@ App developers writing tests and fixtures, in Go and at a shell:
|
||||
9. **Fast enough to be free** — a value renders in about a microsecond and `New`
|
||||
parses and validates the whole set once upfront, so generating fixtures stays
|
||||
noise against a test's own runtime.
|
||||
10. **Data is sourced, or on its way there** — a shipped fact, a name, place,
|
||||
code, id or classification, is read from a register or open dataset by a
|
||||
[`data-import/`](data-import) script wherever one exists to read; where none
|
||||
does yet a small hand-written set ships and [`todo.md`](todo.md) carries the
|
||||
step that replaces it. Only non-factual copy stays authored. A sourced table
|
||||
holds the rows its source holds: none is added by hand, and one is dropped
|
||||
only by a rule the script states.
|
||||
|
||||
## Decisions
|
||||
|
||||
@@ -1025,8 +1053,7 @@ App developers writing tests and fixtures, in Go and at a shell:
|
||||
A table is a category with a TSV beside its file, so only a root choice has the
|
||||
spelling the fence names; a nested choice of same-shaped templates and an inline
|
||||
one keep loading. Fields must all be strings because a cell is a string node: a
|
||||
choice whose items carry a nested choice, as `misc.car` does, is not one table but
|
||||
two linked ones, which a later conversion writes.
|
||||
choice whose items carry a nested choice is not one table but two linked ones.
|
||||
- **A table is a record of string columns.** Its columns are the CSV header and the
|
||||
`INSERT` column list, fixed by the TSV header, so a table is a record by
|
||||
construction; every column is a string until a typed column option earns its place.
|
||||
@@ -1124,11 +1151,46 @@ App developers writing tests and fixtures, in Go and at a shell:
|
||||
tells the two apart, `sex[f].first-name[Kim]`, the ambiguity error spells each
|
||||
row inside its parent, and a name repeating inside one parent row is refused at
|
||||
load, since nothing could then select it.
|
||||
- **`misc.country` carries a currency code, it does not link to `misc.currency`.**
|
||||
- **`misc` is what every locale shares.** A category whose facts differ by country
|
||||
belongs in that country's locale, read from the register that country's own
|
||||
records use; `misc` takes only sources that are international. NHTSA vPIC and
|
||||
Mobility Sweden's registrations are national, so they build `en_US.car` and
|
||||
`sv_SE.car`; `misc.car` waits for an international source rather than take one
|
||||
of theirs.
|
||||
- **A register's canonical spelling loses to the one its domain writes.** Where a
|
||||
source offers several spellings of one fact, the shipped one is what records in
|
||||
that domain carry. `misc.timezone` reads `zone.tab` and not the `zone1970.tab`
|
||||
that supersedes it, because the latter keeps one zone per set of countries that
|
||||
have agreed since 1970: it spells Sweden `Europe/Berlin`, and no Swedish system
|
||||
writes that. For the same reason `misc.language` takes the ISO 639-2 register's
|
||||
first synonym over CLDR, which says "Chinese, Mandarin" for `zh`.
|
||||
- **`misc.territory` is the spine, and a `misc` table naming a territory links to
|
||||
it.** Where every territory row has a child the column is a `parent`, and the
|
||||
import drops the child rows whose territory the set does not ship — 17 of
|
||||
`misc.timezone`'s, Antarctica's ten among them. Agreement across a record is
|
||||
worth more than the last rows of a table. Where no such link can hold the fact
|
||||
stays a column. Layer your own `misc.territory` over the shipped one and you
|
||||
must layer `misc.timezone` too, or the link fails at load naming the row.
|
||||
- **`misc.car` is one flat table, not a make linked to its models.** A row is a make
|
||||
and a model drawn together, so no render pairs a Volvo with a RAV4. Two linked
|
||||
tables would reach the same pairs and add a selector nothing asks for; a make alone
|
||||
is `misc.car.make`.
|
||||
- **`misc.territory` names its sovereign in a column, and there is no `misc.country`
|
||||
table.** ISO 3166-1 codes territories, so `territory` is the honest name, and
|
||||
`is_independent` in the register gives each one's state. A second table of the 195
|
||||
sovereigns would hold a `DK` row beside the territory `DK` row, both carrying
|
||||
Denmark's capital, currency, flag and TLD — two owners for one fact, drifting at
|
||||
the next import. Splitting the columns to avoid that is worse: put `capital` on
|
||||
the territory alone and a country row can no longer name Copenhagen. The column
|
||||
cannot be a `parent`, since a table never reaches its own family; a test proves
|
||||
every value names a row instead. A territory the register records no state for
|
||||
stands alone, which is `EH` alone, and naming one for it would be a claim
|
||||
fejkdata has no business making.
|
||||
- **`misc.territory` carries a currency code, it does not link to `misc.currency`.**
|
||||
A `parent` demands a child for every parent row, and ISO 4217 registers codes no
|
||||
country's row can name: the funds codes (Mvdol, WIR Euro, US Dollar (Next day)),
|
||||
and VED beside VES, both Venezuela's, of which a country row names one. Linking
|
||||
would trade the register for the link, and `misc.country.currency` already pairs a
|
||||
would trade the register for the link, and `misc.territory.currency` already pairs a
|
||||
country with its currency in one draw.
|
||||
- **An extension may name two media types.** `.xml`, `.rtf`, `.sub`, `.mpp` and `.ac`
|
||||
each name two rows of `misc.mimetype`. Separating them would mean dropping a
|
||||
@@ -1207,15 +1269,17 @@ and `names-us.py` rejects a client for a while after a burst, so `--surnames` ta
|
||||
a copy of the surname file:
|
||||
|
||||
```sh
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/country.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/currency.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/geo-us.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" -e TRAFIKVERKET_API_KEY data-import data-import/geo-se.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/geo-us.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/httpstatus.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/language.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/mimetype.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/names-se.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/names-us.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/territory.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/timezone.py
|
||||
docker compose run --rm --user "$(id -u):$(id -g)" data-import data-import/useragent.py
|
||||
```
|
||||
|
||||
To release, head `CHANGELOG.md` with the version's section in place of `Unreleased`
|
||||
|
||||
@@ -24,7 +24,7 @@ import (
|
||||
const usage = `Usage: fejkdata [flags] <path|template>
|
||||
|
||||
<path> a category, or a dotted path into one (person, person.last);
|
||||
a table's row by key or name: 'misc.country[SE]', 'misc.country[Sweden].tld'
|
||||
a table's row by key or name: 'misc.territory[SE]', 'misc.territory[Sweden].tld'
|
||||
<template> a format string or JSON value to render inline, e.g.
|
||||
'name: {/sv_SE.person.last}' or '{"format":"{x}","x":["bosse","lina"]}'
|
||||
|
||||
|
||||
@@ -352,8 +352,8 @@ func TestRunSelectsATableRow(t *testing.T) {
|
||||
if code, _, errb := runOut("--no-shipped-data", "-d", dir, "[Skåne län]"); code != 2 || !strings.Contains(errb, "JSON") {
|
||||
t.Fatalf("[Skåne län] = %d, stderr=%q, want misuse: a leading bracket that is no JSON names nothing", code, errb)
|
||||
}
|
||||
if code, out, _ := runOut("--seed", "1", "--format", "csv", "misc.country[SE]"); code != 0 || !strings.HasPrefix(out, "alpha2,") || !strings.Contains(out, "\nSE,SWE,") {
|
||||
t.Fatalf("--format csv misc.country[SE] = %d, %q", code, out)
|
||||
if code, out, _ := runOut("--seed", "1", "--format", "csv", "misc.territory[SE]"); code != 0 || !strings.HasPrefix(out, "alpha2,") || !strings.Contains(out, "\nSE,SWE,") {
|
||||
t.Fatalf("--format csv misc.territory[SE] = %d, %q", code, out)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,24 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Rebuild data/misc/country.tsv from datasets/country-codes (PDDL).
|
||||
"""Rebuild data/misc/territory.tsv from datasets/country-codes (PDDL).
|
||||
|
||||
data-import/country.py [--source URL_OR_FILE] [--cache DIR] [--out FILE]
|
||||
data-import/territory.py [--source URL_OR_FILE] [--cache DIR] [--out FILE]
|
||||
"""
|
||||
import argparse
|
||||
import csv
|
||||
import io
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import source
|
||||
import tsv
|
||||
|
||||
SOURCE = "https://raw.githubusercontent.com/datasets/country-codes/main/data/country-codes.csv"
|
||||
OUT = Path(__file__).resolve().parent.parent / "data" / "misc" / "country.tsv"
|
||||
OUT = Path(__file__).resolve().parent.parent / "data" / "misc" / "territory.tsv"
|
||||
CACHE = Path(__file__).resolve().parent / "cache"
|
||||
COLUMNS = ["alpha2", "alpha3", "calling-code", "capital", "currency", "flag", "languages", "name", "numeric", "tld"]
|
||||
COLUMNS = ["alpha2", "alpha3", "calling-code", "capital", "country", "currency", "flag", "languages", "name", "numeric", "tld"]
|
||||
SOVEREIGN = re.compile(r"^(?:Part of|Territor(?:y|ies) of|Crown dependency of|Commonwealth of|Associated with) ([A-Z]{2})$")
|
||||
STANDALONE = {"In contention", "International"}
|
||||
# Gaps in the source, keyed by alpha2.
|
||||
FIXUPS = {"TR": {"currency": "TRY"}}
|
||||
|
||||
@@ -33,6 +36,16 @@ def languages(field):
|
||||
return ",".join(p for p in field.split(",") if p)
|
||||
|
||||
|
||||
def country(alpha2, independent):
|
||||
"""The sovereign state the register records; a territory it records none for stands alone."""
|
||||
m = SOVEREIGN.match(independent)
|
||||
if m:
|
||||
return m.group(1)
|
||||
if independent == "Yes" or independent in STANDALONE:
|
||||
return alpha2
|
||||
sys.exit(f"{alpha2}: is_independent {independent!r} names no sovereign this script can read")
|
||||
|
||||
|
||||
def rows(text):
|
||||
for r in csv.DictReader(io.StringIO(text)):
|
||||
alpha2 = r["ISO3166-1-Alpha-2"]
|
||||
@@ -41,6 +54,7 @@ def rows(text):
|
||||
"alpha3": r["ISO3166-1-Alpha-3"],
|
||||
"calling-code": calling_code(r["Dial"]),
|
||||
"capital": r["Capital"],
|
||||
"country": country(alpha2, r["is_independent"]),
|
||||
"currency": r["ISO4217-currency_alphabetic_code"].split(",")[0],
|
||||
"flag": flag(alpha2),
|
||||
"languages": languages(r["Languages"]),
|
||||
@@ -59,8 +73,12 @@ def main():
|
||||
p.add_argument("--source", default=SOURCE)
|
||||
p.add_argument("--out", default=str(OUT))
|
||||
a = p.parse_args()
|
||||
table = rows(source.fetch(a.source, a.cache, "country-codes.csv").decode("utf-8"))
|
||||
tsv.write(a.out, COLUMNS, sorted(table, key=lambda r: r["alpha2"]))
|
||||
table = sorted(rows(source.fetch(a.source, a.cache, "country-codes.csv").decode("utf-8")), key=lambda r: r["alpha2"])
|
||||
shipped = {r["alpha2"] for r in table}
|
||||
for r in table:
|
||||
if r["country"] not in shipped:
|
||||
sys.exit(f"{r['alpha2']}: country {r['country']} is no shipped territory; a sovereign the set drops leaves its territories unreadable")
|
||||
tsv.write(a.out, COLUMNS, table)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
@@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Rebuild data/misc/timezone.tsv from the IANA tzdb tarball (public domain) and GeoNames (CC BY 4.0).
|
||||
|
||||
data-import/timezone.py [--source URL_OR_FILE] [--cities URL_OR_FILE] [--cache DIR] [--out FILE] [--territories FILE]
|
||||
|
||||
The offset is the zone's standard offset, the first field of its Zone rule's last
|
||||
continuation line, with a Link resolved to its target. The weight is the population
|
||||
GeoNames records in the zone's cities of 15,000 or more, never below that threshold,
|
||||
so a drawn zone is one people live in.
|
||||
"""
|
||||
import argparse
|
||||
import csv
|
||||
import io
|
||||
import re
|
||||
import sys
|
||||
import tarfile
|
||||
import zipfile
|
||||
from pathlib import Path
|
||||
|
||||
import source
|
||||
import tsv
|
||||
|
||||
SOURCE = "https://data.iana.org/time-zones/tzdata-latest.tar.gz"
|
||||
CITIES = "https://download.geonames.org/export/dump/cities15000.zip"
|
||||
OUT = Path(__file__).resolve().parent.parent / "data" / "misc" / "timezone.tsv"
|
||||
TERRITORIES = Path(__file__).resolve().parent.parent / "data" / "misc" / "territory.tsv"
|
||||
CACHE = Path(__file__).resolve().parent / "cache"
|
||||
COLUMNS = ["offset", "territory", "weight", "zone"]
|
||||
REGIONS = ["africa", "antarctica", "asia", "australasia", "backward", "etcetera", "europe", "northamerica", "southamerica"]
|
||||
# GeoNames' own cutoff, so a zone it records no city in weighs less than one would.
|
||||
FLOOR = 15000
|
||||
|
||||
|
||||
def member(tar, name):
|
||||
try:
|
||||
f = tar.extractfile(name)
|
||||
except KeyError:
|
||||
f = None
|
||||
if f is None:
|
||||
sys.exit(f"{name}: the tarball no longer holds it as a file; the tzdb layout has moved")
|
||||
return f.read().decode("utf-8")
|
||||
|
||||
|
||||
def offsets(tar):
|
||||
"""Every zone's standard offset, and every link's target."""
|
||||
std, links = {}, {}
|
||||
for name in REGIONS:
|
||||
zone = None
|
||||
for raw in member(tar, name).splitlines():
|
||||
line = raw.split("#")[0].rstrip()
|
||||
if not line.strip():
|
||||
continue
|
||||
if line.startswith("Zone"):
|
||||
f = line.split()
|
||||
zone, std[f[1]] = f[1], f[2]
|
||||
elif line.startswith("Link"):
|
||||
f = line.split()
|
||||
links[f[2]], zone = f[1], None
|
||||
elif line[0] in " \t" and zone:
|
||||
std[zone] = line.split()[0]
|
||||
else:
|
||||
zone = None
|
||||
return std, links
|
||||
|
||||
|
||||
def resolve(zone, std, links):
|
||||
for _ in range(10):
|
||||
if zone in std:
|
||||
return std[zone]
|
||||
if zone not in links:
|
||||
return None
|
||||
zone = links[zone]
|
||||
return None
|
||||
|
||||
|
||||
def utc_offset(raw):
|
||||
"""±HH:MM from a tzdb STDOFF field, which writes the minutes and seconds only when it has them."""
|
||||
m = re.match(r"^(-)?(\d{1,2})(?::(\d{2})(?::(\d{2}))?)?$", raw)
|
||||
if not m or (m.group(4) or "00") != "00":
|
||||
return None
|
||||
return f"{'-' if m.group(1) else '+'}{int(m.group(2)):02d}:{m.group(3) or '00'}"
|
||||
|
||||
|
||||
def population(body):
|
||||
"""The population GeoNames records per timezone, summed over its cities."""
|
||||
with zipfile.ZipFile(io.BytesIO(body)) as z:
|
||||
text = z.read("cities15000.txt").decode("utf-8")
|
||||
per = {}
|
||||
for city in csv.reader(io.StringIO(text), delimiter="\t", quoting=csv.QUOTE_NONE):
|
||||
if len(city) > 17 and city[17] and city[14].isdigit():
|
||||
per[city[17]] = per.get(city[17], 0) + int(city[14])
|
||||
return per
|
||||
|
||||
|
||||
def rows(tar, territories, pop):
|
||||
std, links = offsets(tar)
|
||||
for line in member(tar, "zone.tab").splitlines():
|
||||
if line.startswith("#") or not line.strip():
|
||||
continue
|
||||
fields = line.split("\t")
|
||||
if len(fields) < 3:
|
||||
sys.exit(f"zone.tab: {line!r} has {len(fields)} fields; a row names a territory, a location and a zone")
|
||||
territory, zone = fields[0], fields[2]
|
||||
if territory not in territories:
|
||||
continue
|
||||
raw = resolve(zone, std, links)
|
||||
if raw is None:
|
||||
sys.exit(f"{zone}: the tarball gives it no Zone rule and no Link to one")
|
||||
offset = utc_offset(raw)
|
||||
if offset is None:
|
||||
sys.exit(f"{zone}: standard offset {raw!r} is not a ±HH:MM the table can spell")
|
||||
yield {"offset": offset, "territory": territory, "weight": max(pop.get(zone, 0), FLOOR), "zone": zone}
|
||||
|
||||
|
||||
def main():
|
||||
p = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
||||
p.add_argument("--cache", default=str(CACHE))
|
||||
p.add_argument("--source", default=SOURCE)
|
||||
p.add_argument("--out", default=str(OUT))
|
||||
p.add_argument("--cities", default=CITIES)
|
||||
p.add_argument("--territories", default=str(TERRITORIES))
|
||||
a = p.parse_args()
|
||||
shipped = {r["alpha2"] for r in csv.DictReader(io.StringIO(Path(a.territories).read_text(encoding="utf-8")), delimiter="\t")}
|
||||
pop = population(source.fetch(a.cities, a.cache, "cities15000.zip", magic=b"PK"))
|
||||
body = source.fetch(a.source, a.cache, "tzdata-latest.tar.gz", magic=b"\x1f\x8b")
|
||||
with tarfile.open(fileobj=io.BytesIO(body)) as tar:
|
||||
table = sorted(rows(tar, shipped, pop), key=lambda r: r["zone"])
|
||||
print(f"tzdb {tar.extractfile('version').read().decode('utf-8').strip()}", file=sys.stderr)
|
||||
linked = {r["territory"] for r in table}
|
||||
if missing := shipped - linked:
|
||||
sys.exit(f"no zone for {sorted(missing)}; a parent row without a child is a load error")
|
||||
if (floored := sum(1 for r in table if r["weight"] == FLOOR)) > len(table) // 2:
|
||||
sys.exit(f"{floored} of {len(table)} zones fell to the floor; GeoNames' population or timezone column has moved")
|
||||
tsv.write(a.out, COLUMNS, table)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Rebuild data/misc/useragent.tsv from microlinkhq/top-user-agents (MIT).
|
||||
|
||||
data-import/useragent.py [--source URL] [--cache DIR] [--out FILE]
|
||||
|
||||
The desktop and mobile lists partition the whole, so `device` is read rather than
|
||||
parsed. A row ships when the string names a browser and an operating system both.
|
||||
"""
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import source
|
||||
import tsv
|
||||
|
||||
SOURCE = "https://raw.githubusercontent.com/microlinkhq/top-user-agents/master/src"
|
||||
OUT = Path(__file__).resolve().parent.parent / "data" / "misc" / "useragent.tsv"
|
||||
CACHE = Path(__file__).resolve().parent / "cache"
|
||||
COLUMNS = ["browser", "device", "os", "ua"]
|
||||
# First match wins: a Chromium fork this list does not name ships as Chrome.
|
||||
BROWSERS = [("Edge", r"Edg(A|iOS)?/"), ("Opera", r"OPR/"), ("Samsung Internet", r"SamsungBrowser/"),
|
||||
("Chrome", r"(Chrome|CriOS)/"), ("Firefox", r"(Firefox|FxiOS)/"), ("Safari", r"Version/[\d.]+ .*Safari")]
|
||||
SYSTEMS = [("iOS", r"iPhone|iPad|CPU OS "), ("Android", r"Android"), ("ChromeOS", r"CrOS"),
|
||||
("Windows", r"Windows NT"), ("macOS", r"Macintosh|Mac OS X"), ("Linux", r"X11.*Linux|Ubuntu")]
|
||||
|
||||
|
||||
def named(table, ua):
|
||||
for name, pattern in table:
|
||||
if re.search(pattern, ua):
|
||||
return name
|
||||
return ""
|
||||
|
||||
|
||||
def rows(desktop, mobile):
|
||||
seen, kept = set(), []
|
||||
for device, uas in (("desktop", desktop), ("mobile", mobile)):
|
||||
for ua in uas:
|
||||
browser, os = named(BROWSERS, ua), named(SYSTEMS, ua)
|
||||
if not browser or not os:
|
||||
print(f"dropped, naming no {'browser' if not browser else 'operating system'}: {ua}", file=sys.stderr)
|
||||
continue
|
||||
if ua in seen:
|
||||
sys.exit(f"{ua}: listed twice, which would draw it twice as often")
|
||||
seen.add(ua)
|
||||
kept.append({"browser": browser, "device": device, "os": os, "ua": ua})
|
||||
if len(kept) < 0.8 * (len(desktop) + len(mobile)):
|
||||
sys.exit(f"only {len(kept)} of {len(desktop) + len(mobile)} strings named both; the tokens have moved")
|
||||
return kept
|
||||
|
||||
|
||||
def main():
|
||||
p = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
||||
p.add_argument("--cache", default=str(CACHE))
|
||||
p.add_argument("--source", default=SOURCE)
|
||||
p.add_argument("--out", default=str(OUT))
|
||||
a = p.parse_args()
|
||||
lists = [json.loads(source.fetch(f"{a.source}/{n}.json", a.cache, f"top-user-agents-{n}.json")) for n in ("desktop", "mobile")]
|
||||
tsv.write(a.out, COLUMNS, sorted(rows(*lists), key=lambda r: (r["browser"], r["os"], r["ua"])))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
+1
-10
@@ -1,10 +1 @@
|
||||
[
|
||||
{ "format": "{maker} {model}", "maker": "BMW", "model": ["3 Series", "5 Series", "X3", "X5"] },
|
||||
{ "format": "{maker} {model}", "maker": "Ford", "model": ["Fiesta", "Focus", "Mustang", "Explorer"] },
|
||||
{ "format": "{maker} {model}", "maker": "Honda", "model": ["Civic", "Accord", "CR-V", "Jazz"] },
|
||||
{ "format": "{maker} {model}", "maker": "Mercedes-Benz", "model": ["A-Class", "C-Class", "E-Class", "GLC"] },
|
||||
{ "format": "{maker} {model}", "maker": "Tesla", "model": ["Model 3", "Model S", "Model X", "Model Y"] },
|
||||
{ "format": "{maker} {model}", "maker": "Toyota", "model": ["Corolla", "Camry", "RAV4", "Yaris"] },
|
||||
{ "format": "{maker} {model}", "maker": "Volkswagen", "model": ["Golf", "Passat", "Polo", "Tiguan"] },
|
||||
{ "format": "{maker} {model}", "maker": "Volvo", "model": ["XC40", "XC60", "XC90", "V60"] }
|
||||
]
|
||||
{ "format": "{make} {model}", "rows": "car.tsv" }
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
make model
|
||||
BMW 3 Series
|
||||
BMW 5 Series
|
||||
BMW X3
|
||||
BMW X5
|
||||
Ford Explorer
|
||||
Ford Fiesta
|
||||
Ford Focus
|
||||
Ford Mustang
|
||||
Honda Accord
|
||||
Honda CR-V
|
||||
Honda Civic
|
||||
Honda Jazz
|
||||
Mercedes-Benz A-Class
|
||||
Mercedes-Benz C-Class
|
||||
Mercedes-Benz E-Class
|
||||
Mercedes-Benz GLC
|
||||
Tesla Model 3
|
||||
Tesla Model S
|
||||
Tesla Model X
|
||||
Tesla Model Y
|
||||
Toyota Camry
|
||||
Toyota Corolla
|
||||
Toyota RAV4
|
||||
Toyota Yaris
|
||||
Volkswagen Golf
|
||||
Volkswagen Passat
|
||||
Volkswagen Polo
|
||||
Volkswagen Tiguan
|
||||
Volvo V60
|
||||
Volvo XC40
|
||||
Volvo XC60
|
||||
Volvo XC90
|
||||
|
@@ -1 +0,0 @@
|
||||
{ "format": "{name}", "rows": "country.tsv", "key": "alpha2", "name": "name" }
|
||||
@@ -1,242 +0,0 @@
|
||||
alpha2 alpha3 calling-code capital currency flag languages name numeric tld
|
||||
AD AND 376 Andorra la Vella EUR 🇦🇩 ca Andorra 020 .ad
|
||||
AE ARE 971 Abu Dhabi AED 🇦🇪 ar-AE,fa,en,hi,ur United Arab Emirates 784 .ae
|
||||
AF AFG 93 Kabul AFN 🇦🇫 fa-AF,ps,uz-AF,tk Afghanistan 004 .af
|
||||
AG ATG 1-268 St. John's XCD 🇦🇬 en-AG Antigua & Barbuda 028 .ag
|
||||
AI AIA 1-264 The Valley XCD 🇦🇮 en-AI Anguilla 660 .ai
|
||||
AL ALB 355 Tirana ALL 🇦🇱 sq,el Albania 008 .al
|
||||
AM ARM 374 Yerevan AMD 🇦🇲 hy Armenia 051 .am
|
||||
AO AGO 244 Luanda AOA 🇦🇴 pt-AO Angola 024 .ao
|
||||
AR ARG 54 Buenos Aires ARS 🇦🇷 es-AR,en,it,de,fr,gn Argentina 032 .ar
|
||||
AS ASM 1-684 Pago Pago USD 🇦🇸 en-AS,sm,to American Samoa 016 .as
|
||||
AT AUT 43 Vienna EUR 🇦🇹 de-AT,hr,hu,sl Austria 040 .at
|
||||
AU AUS 61 Canberra AUD 🇦🇺 en-AU Australia 036 .au
|
||||
AW ABW 297 Oranjestad AWG 🇦🇼 nl-AW,pap,es,en Aruba 533 .aw
|
||||
AX ALA 358 Mariehamn EUR 🇦🇽 sv-AX Åland Islands 248 .ax
|
||||
AZ AZE 994 Baku AZN 🇦🇿 az,ru,hy Azerbaijan 031 .az
|
||||
BA BIH 387 Sarajevo BAM 🇧🇦 bs,hr-BA,sr-BA Bosnia 070 .ba
|
||||
BB BRB 1-246 Bridgetown BBD 🇧🇧 en-BB Barbados 052 .bb
|
||||
BD BGD 880 Dhaka BDT 🇧🇩 bn-BD,en Bangladesh 050 .bd
|
||||
BE BEL 32 Brussels EUR 🇧🇪 nl-BE,fr-BE,de-BE Belgium 056 .be
|
||||
BF BFA 226 Ouagadougou XOF 🇧🇫 fr-BF,mos Burkina Faso 854 .bf
|
||||
BG BGR 359 Sofia EUR 🇧🇬 bg,tr-BG,rom Bulgaria 100 .bg
|
||||
BH BHR 973 Manama BHD 🇧🇭 ar-BH,en,fa,ur Bahrain 048 .bh
|
||||
BI BDI 257 Gitega BIF 🇧🇮 fr-BI,rn Burundi 108 .bi
|
||||
BJ BEN 229 Porto-Novo XOF 🇧🇯 fr-BJ Benin 204 .bj
|
||||
BL BLM 590 Gustavia EUR 🇧🇱 fr St. Barthélemy 652 .gp
|
||||
BM BMU 1-441 Hamilton BMD 🇧🇲 en-BM,pt Bermuda 060 .bm
|
||||
BN BRN 673 Bandar Seri Begawan BND 🇧🇳 ms-BN,en-BN Brunei 096 .bn
|
||||
BO BOL 591 Sucre BOB 🇧🇴 es-BO,qu,ay Bolivia 068 .bo
|
||||
BR BRA 55 Brasilia BRL 🇧🇷 pt-BR,es,en,fr Brazil 076 .br
|
||||
BS BHS 1-242 Nassau BSD 🇧🇸 en-BS Bahamas 044 .bs
|
||||
BT BTN 975 Thimphu INR 🇧🇹 dz Bhutan 064 .bt
|
||||
BW BWA 267 Gaborone BWP 🇧🇼 en-BW,tn-BW Botswana 072 .bw
|
||||
BY BLR 375 Minsk BYN 🇧🇾 be,ru Belarus 112 .by
|
||||
BZ BLZ 501 Belmopan BZD 🇧🇿 en-BZ,es Belize 084 .bz
|
||||
CA CAN 1 Ottawa CAD 🇨🇦 en-CA,fr-CA,iu Canada 124 .ca
|
||||
CC CCK 61 West Island AUD 🇨🇨 ms-CC,en Cocos Islands 166 .cc
|
||||
CD COD 243 Kinshasa CDF 🇨🇩 fr-CD,ln,ktu,kg,sw,lua Congo - Kinshasa 180 .cd
|
||||
CF CAF 236 Bangui XAF 🇨🇫 fr-CF,sg,ln,kg Central African Republic 140 .cf
|
||||
CG COG 242 Brazzaville XAF 🇨🇬 fr-CG,kg,ln-CG Congo - Brazzaville 178 .cg
|
||||
CH CHE 41 Bern CHF 🇨🇭 de-CH,fr-CH,it-CH,rm Switzerland 756 .ch
|
||||
CI CIV 225 Yamoussoukro XOF 🇨🇮 fr-CI Côte d’Ivoire 384 .ci
|
||||
CK COK 682 Avarua NZD 🇨🇰 en-CK,mi Cook Islands 184 .ck
|
||||
CL CHL 56 Santiago CLP 🇨🇱 es-CL Chile 152 .cl
|
||||
CM CMR 237 Yaounde XAF 🇨🇲 en-CM,fr-CM Cameroon 120 .cm
|
||||
CN CHN 86 Beijing CNY 🇨🇳 zh-CN,yue,wuu,dta,ug,za China 156 .cn
|
||||
CO COL 57 Bogota COP 🇨🇴 es-CO Colombia 170 .co
|
||||
CR CRI 506 San Jose CRC 🇨🇷 es-CR,en Costa Rica 188 .cr
|
||||
CU CUB 53 Havana CUP 🇨🇺 es-CU,pap Cuba 192 .cu
|
||||
CV CPV 238 Praia CVE 🇨🇻 pt-CV Cape Verde 132 .cv
|
||||
CW CUW 599 Willemstad XCG 🇨🇼 nl,pap Curaçao 531 .cw
|
||||
CX CXR 61 Flying Fish Cove AUD 🇨🇽 en,zh,ms-CX Christmas Island 162 .cx
|
||||
CY CYP 357 Nicosia EUR 🇨🇾 el-CY,tr-CY,en Cyprus 196 .cy
|
||||
CZ CZE 420 Prague CZK 🇨🇿 cs,sk Czechia 203 .cz
|
||||
DE DEU 49 Berlin EUR 🇩🇪 de Germany 276 .de
|
||||
DJ DJI 253 Djibouti DJF 🇩🇯 fr-DJ,ar,so-DJ,aa Djibouti 262 .dj
|
||||
DK DNK 45 Copenhagen DKK 🇩🇰 da-DK,en,fo,de-DK Denmark 208 .dk
|
||||
DM DMA 1-767 Roseau XCD 🇩🇲 en-DM Dominica 212 .dm
|
||||
DO DOM 1-809 Santo Domingo DOP 🇩🇴 es-DO Dominican Republic 214 .do
|
||||
DZ DZA 213 Algiers DZD 🇩🇿 ar-DZ Algeria 012 .dz
|
||||
EC ECU 593 Quito USD 🇪🇨 es-EC Ecuador 218 .ec
|
||||
EE EST 372 Tallinn EUR 🇪🇪 et,ru Estonia 233 .ee
|
||||
EG EGY 20 Cairo EGP 🇪🇬 ar-EG,en,fr Egypt 818 .eg
|
||||
EH ESH 212 El-Aaiun MAD 🇪🇭 ar,mey Western Sahara 732 .eh
|
||||
ER ERI 291 Asmara ERN 🇪🇷 aa-ER,ar,tig,kun,ti-ER Eritrea 232 .er
|
||||
ES ESP 34 Madrid EUR 🇪🇸 es-ES,ca,gl,eu,oc Spain 724 .es
|
||||
ET ETH 251 Addis Ababa ETB 🇪🇹 am,en-ET,om-ET,ti-ET,so-ET,sid Ethiopia 231 .et
|
||||
FI FIN 358 Helsinki EUR 🇫🇮 fi-FI,sv-FI,smn Finland 246 .fi
|
||||
FJ FJI 679 Suva FJD 🇫🇯 en-FJ,fj Fiji 242 .fj
|
||||
FK FLK 500 Stanley FKP 🇫🇰 en-FK Falkland Islands 238 .fk
|
||||
FM FSM 691 Palikir USD 🇫🇲 en-FM,chk,pon,yap,kos,uli,woe,nkr,kpg Micronesia 583 .fm
|
||||
FO FRO 298 Torshavn DKK 🇫🇴 fo,da-FO Faroe Islands 234 .fo
|
||||
FR FRA 33 Paris EUR 🇫🇷 fr-FR,frp,br,co,ca,eu,oc France 250 .fr
|
||||
GA GAB 241 Libreville XAF 🇬🇦 fr-GA Gabon 266 .ga
|
||||
GB GBR 44 London GBP 🇬🇧 en-GB,cy-GB,gd UK 826 .uk
|
||||
GD GRD 1-473 St. George's XCD 🇬🇩 en-GD Grenada 308 .gd
|
||||
GE GEO 995 Tbilisi GEL 🇬🇪 ka,ru,hy,az Georgia 268 .ge
|
||||
GF GUF 594 Cayenne EUR 🇬🇫 fr-GF French Guiana 254 .gf
|
||||
GG GGY 44 St Peter Port GBP 🇬🇬 en,nrf Guernsey 831 .gg
|
||||
GH GHA 233 Accra GHS 🇬🇭 en-GH,ak,ee,tw Ghana 288 .gh
|
||||
GI GIB 350 Gibraltar GIP 🇬🇮 en-GI,es,it,pt Gibraltar 292 .gi
|
||||
GL GRL 299 Nuuk DKK 🇬🇱 kl,da-GL,en Greenland 304 .gl
|
||||
GM GMB 220 Banjul GMD 🇬🇲 en-GM,mnk,wof,wo,ff Gambia 270 .gm
|
||||
GN GIN 224 Conakry GNF 🇬🇳 fr-GN Guinea 324 .gn
|
||||
GP GLP 590 Basse-Terre EUR 🇬🇵 fr-GP Guadeloupe 312 .gp
|
||||
GQ GNQ 240 Ciudad de la Paz XAF 🇬🇶 es-GQ,fr,pt Equatorial Guinea 226 .gq
|
||||
GR GRC 30 Athens EUR 🇬🇷 el-GR,en,fr Greece 300 .gr
|
||||
GT GTM 502 Guatemala City GTQ 🇬🇹 es-GT Guatemala 320 .gt
|
||||
GU GUM 1-671 Hagatna USD 🇬🇺 en-GU,ch-GU Guam 316 .gu
|
||||
GW GNB 245 Bissau XOF 🇬🇼 pt-GW,pov Guinea-Bissau 624 .gw
|
||||
GY GUY 592 Georgetown GYD 🇬🇾 en-GY Guyana 328 .gy
|
||||
HK HKG 852 Hong Kong HKD 🇭🇰 zh-HK,yue,zh,en Hong Kong 344 .hk
|
||||
HN HND 504 Tegucigalpa HNL 🇭🇳 es-HN,cab,miq Honduras 340 .hn
|
||||
HR HRV 385 Zagreb EUR 🇭🇷 hr-HR,sr Croatia 191 .hr
|
||||
HT HTI 509 Port-au-Prince HTG 🇭🇹 ht,fr-HT Haiti 332 .ht
|
||||
HU HUN 36 Budapest HUF 🇭🇺 hu-HU Hungary 348 .hu
|
||||
ID IDN 62 Jakarta IDR 🇮🇩 id,en,nl,jv Indonesia 360 .id
|
||||
IE IRL 353 Dublin EUR 🇮🇪 en-IE,ga-IE Ireland 372 .ie
|
||||
IL ISR 972 Jerusalem ILS 🇮🇱 he,ar-IL,en-IL Israel 376 .il
|
||||
IM IMN 44 Douglas GBP 🇮🇲 en,gv Isle of Man 833 .im
|
||||
IN IND 91 New Delhi INR 🇮🇳 en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc India 356 .in
|
||||
IO IOT 246 Diego Garcia USD 🇮🇴 en-IO British Indian Ocean Territory 086 .io
|
||||
IQ IRQ 964 Baghdad IQD 🇮🇶 ar-IQ,ku,hy Iraq 368 .iq
|
||||
IR IRN 98 Tehran IRR 🇮🇷 fa-IR,ku Iran 364 .ir
|
||||
IS ISL 354 Reykjavik ISK 🇮🇸 is,en,de,da,sv,no Iceland 352 .is
|
||||
IT ITA 39 Rome EUR 🇮🇹 it-IT,de-IT,fr-IT,sc,ca,co,sl Italy 380 .it
|
||||
JE JEY 44 Saint Helier GBP 🇯🇪 en,fr,nrf Jersey 832 .je
|
||||
JM JAM 1-876 Kingston JMD 🇯🇲 en-JM Jamaica 388 .jm
|
||||
JO JOR 962 Amman JOD 🇯🇴 ar-JO,en Jordan 400 .jo
|
||||
JP JPN 81 Tokyo JPY 🇯🇵 ja Japan 392 .jp
|
||||
KE KEN 254 Nairobi KES 🇰🇪 en-KE,sw-KE Kenya 404 .ke
|
||||
KG KGZ 996 Bishkek KGS 🇰🇬 ky,uz,ru Kyrgyzstan 417 .kg
|
||||
KH KHM 855 Phnom Penh KHR 🇰🇭 km,fr,en Cambodia 116 .kh
|
||||
KI KIR 686 Tarawa AUD 🇰🇮 en-KI,gil Kiribati 296 .ki
|
||||
KM COM 269 Moroni KMF 🇰🇲 ar,fr-KM Comoros 174 .km
|
||||
KN KNA 1-869 Basseterre XCD 🇰🇳 en-KN St. Kitts & Nevis 659 .kn
|
||||
KP PRK 850 Pyongyang KPW 🇰🇵 ko-KP North Korea 408 .kp
|
||||
KR KOR 82 Seoul KRW 🇰🇷 ko-KR,en South Korea 410 .kr
|
||||
KW KWT 965 Kuwait City KWD 🇰🇼 ar-KW,en Kuwait 414 .kw
|
||||
KY CYM 1-345 George Town KYD 🇰🇾 en-KY Cayman Islands 136 .ky
|
||||
KZ KAZ 7 Nur-Sultan KZT 🇰🇿 kk,ru Kazakhstan 398 .kz
|
||||
LA LAO 856 Vientiane LAK 🇱🇦 lo,fr,en Laos 418 .la
|
||||
LB LBN 961 Beirut LBP 🇱🇧 ar-LB,fr-LB,en,hy Lebanon 422 .lb
|
||||
LC LCA 1-758 Castries XCD 🇱🇨 en-LC St. Lucia 662 .lc
|
||||
LI LIE 423 Vaduz CHF 🇱🇮 de-LI Liechtenstein 438 .li
|
||||
LK LKA 94 Colombo LKR 🇱🇰 si,ta,en Sri Lanka 144 .lk
|
||||
LR LBR 231 Monrovia LRD 🇱🇷 en-LR Liberia 430 .lr
|
||||
LS LSO 266 Maseru LSL 🇱🇸 en-LS,st,zu,xh Lesotho 426 .ls
|
||||
LT LTU 370 Vilnius EUR 🇱🇹 lt,ru,pl Lithuania 440 .lt
|
||||
LU LUX 352 Luxembourg EUR 🇱🇺 lb,de-LU,fr-LU Luxembourg 442 .lu
|
||||
LV LVA 371 Riga EUR 🇱🇻 lv,ru,lt Latvia 428 .lv
|
||||
LY LBY 218 Tripoli LYD 🇱🇾 ar-LY,it,en Libya 434 .ly
|
||||
MA MAR 212 Rabat MAD 🇲🇦 ar-MA,ber,fr Morocco 504 .ma
|
||||
MC MCO 377 Monaco EUR 🇲🇨 fr-MC,en,it Monaco 492 .mc
|
||||
MD MDA 373 Chisinau MDL 🇲🇩 ro,ru,gag,tr Moldova 498 .md
|
||||
ME MNE 382 Podgorica EUR 🇲🇪 sr,hu,bs,sq,hr,rom Montenegro 499 .me
|
||||
MF MAF 590 Marigot EUR 🇲🇫 fr St. Martin 663 .gp
|
||||
MG MDG 261 Antananarivo MGA 🇲🇬 fr-MG,mg Madagascar 450 .mg
|
||||
MH MHL 692 Majuro USD 🇲🇭 mh,en-MH Marshall Islands 584 .mh
|
||||
MK MKD 389 Skopje MKD 🇲🇰 mk,sq,tr,rmm,sr North Macedonia 807 .mk
|
||||
ML MLI 223 Bamako XOF 🇲🇱 fr-ML,bm Mali 466 .ml
|
||||
MM MMR 95 Nay Pyi Taw MMK 🇲🇲 my Myanmar 104 .mm
|
||||
MN MNG 976 Ulaanbaatar MNT 🇲🇳 mn,ru Mongolia 496 .mn
|
||||
MO MAC 853 Macao MOP 🇲🇴 zh,zh-MO,pt Macao 446 .mo
|
||||
MP MNP 1-670 Saipan USD 🇲🇵 fil,tl,zh,ch-MP,en-MP Northern Mariana Islands 580 .mp
|
||||
MQ MTQ 596 Fort-de-France EUR 🇲🇶 fr-MQ Martinique 474 .mq
|
||||
MR MRT 222 Nouakchott MRU 🇲🇷 ar-MR,fuc,snk,fr,mey,wo Mauritania 478 .mr
|
||||
MS MSR 1-664 Plymouth XCD 🇲🇸 en-MS Montserrat 500 .ms
|
||||
MT MLT 356 Valletta EUR 🇲🇹 mt,en-MT Malta 470 .mt
|
||||
MU MUS 230 Port Louis MUR 🇲🇺 en-MU,bho,fr Mauritius 480 .mu
|
||||
MV MDV 960 Male MVR 🇲🇻 dv,en Maldives 462 .mv
|
||||
MW MWI 265 Lilongwe MWK 🇲🇼 ny,yao,tum,swk Malawi 454 .mw
|
||||
MX MEX 52 Mexico City MXN 🇲🇽 es-MX Mexico 484 .mx
|
||||
MY MYS 60 Kuala Lumpur MYR 🇲🇾 ms-MY,en,zh,ta,te,ml,pa,th Malaysia 458 .my
|
||||
MZ MOZ 258 Maputo MZN 🇲🇿 pt-MZ,vmw Mozambique 508 .mz
|
||||
NA NAM 264 Windhoek NAD 🇳🇦 en-NA,af,de,hz,naq Namibia 516 .na
|
||||
NC NCL 687 Noumea XPF 🇳🇨 fr-NC New Caledonia 540 .nc
|
||||
NE NER 227 Niamey XOF 🇳🇪 fr-NE,ha,kr,dje Niger 562 .ne
|
||||
NF NFK 672 Kingston AUD 🇳🇫 en-NF Norfolk Island 574 .nf
|
||||
NG NGA 234 Abuja NGN 🇳🇬 en-NG,ha,yo,ig,ff Nigeria 566 .ng
|
||||
NI NIC 505 Managua NIO 🇳🇮 es-NI,en Nicaragua 558 .ni
|
||||
NL NLD 31 Amsterdam EUR 🇳🇱 nl-NL,fy-NL Netherlands 528 .nl
|
||||
NO NOR 47 Oslo NOK 🇳🇴 no,nb,nn,se,fi Norway 578 .no
|
||||
NP NPL 977 Kathmandu NPR 🇳🇵 ne,en Nepal 524 .np
|
||||
NR NRU 674 Yaren AUD 🇳🇷 na,en-NR Nauru 520 .nr
|
||||
NU NIU 683 Alofi NZD 🇳🇺 niu,en-NU Niue 570 .nu
|
||||
NZ NZL 64 Wellington NZD 🇳🇿 en-NZ,mi New Zealand 554 .nz
|
||||
OM OMN 968 Muscat OMR 🇴🇲 ar-OM,en,bal,ur Oman 512 .om
|
||||
PA PAN 507 Panama City PAB 🇵🇦 es-PA,en Panama 591 .pa
|
||||
PE PER 51 Lima PEN 🇵🇪 es-PE,qu,ay Peru 604 .pe
|
||||
PF PYF 689 Papeete XPF 🇵🇫 fr-PF,ty French Polynesia 258 .pf
|
||||
PG PNG 675 Port Moresby PGK 🇵🇬 en-PG,ho,meu,tpi Papua New Guinea 598 .pg
|
||||
PH PHL 63 Manila PHP 🇵🇭 tl,en-PH,fil,ceb,ilo,hil,war,pam,bik,bcl,pag,mrw,tsg,mdh,cbk,krj,sgd,msb,akl,ibg,yka,mta,abx Philippines 608 .ph
|
||||
PK PAK 92 Islamabad PKR 🇵🇰 ur-PK,en-PK,pa,sd,ps,brh Pakistan 586 .pk
|
||||
PL POL 48 Warsaw PLN 🇵🇱 pl Poland 616 .pl
|
||||
PM SPM 508 Saint-Pierre EUR 🇵🇲 fr-PM St. Pierre & Miquelon 666 .pm
|
||||
PN PCN 870 Adamstown NZD 🇵🇳 en-PN Pitcairn 612 .pn
|
||||
PR PRI 1 San Juan USD 🇵🇷 en-PR,es-PR Puerto Rico 630 .pr
|
||||
PT PRT 351 Lisbon EUR 🇵🇹 pt-PT,mwl Portugal 620 .pt
|
||||
PW PLW 680 Melekeok USD 🇵🇼 pau,sov,en-PW,tox,ja,fil,zh Palau 585 .pw
|
||||
PY PRY 595 Asuncion PYG 🇵🇾 es-PY,gn Paraguay 600 .py
|
||||
QA QAT 974 Doha QAR 🇶🇦 ar-QA,es Qatar 634 .qa
|
||||
RE REU 262 Saint-Denis EUR 🇷🇪 fr-RE Réunion 638 .re
|
||||
RO ROU 40 Bucharest RON 🇷🇴 ro,hu,rom Romania 642 .ro
|
||||
RS SRB 381 Belgrade RSD 🇷🇸 sr,hu,bs,rom Serbia 688 .rs
|
||||
RU RUS 7 Moscow RUB 🇷🇺 ru,tt,xal,cau,ady,kv,ce,tyv,cv,udm,tut,mns,bua,myv,mdf,chm,ba,inh,kbd,krc,av,sah,nog Russia 643 .ru
|
||||
RW RWA 250 Kigali RWF 🇷🇼 rw,en-RW,fr-RW,sw Rwanda 646 .rw
|
||||
SA SAU 966 Riyadh SAR 🇸🇦 ar-SA Saudi Arabia 682 .sa
|
||||
SB SLB 677 Honiara SBD 🇸🇧 en-SB,tpi Solomon Islands 090 .sb
|
||||
SC SYC 248 Victoria SCR 🇸🇨 en-SC,fr-SC Seychelles 690 .sc
|
||||
SD SDN 249 Khartoum SDG 🇸🇩 ar-SD,en,fia Sudan 729 .sd
|
||||
SE SWE 46 Stockholm SEK 🇸🇪 sv-SE,se,sma,fi-SE Sweden 752 .se
|
||||
SG SGP 65 Singapore SGD 🇸🇬 cmn,en-SG,ms-SG,ta-SG,zh-SG Singapore 702 .sg
|
||||
SH SHN 290 Jamestown SHP 🇸🇭 en-SH St. Helena 654 .sh
|
||||
SI SVN 386 Ljubljana EUR 🇸🇮 sl,sh Slovenia 705 .si
|
||||
SJ SJM 47 Longyearbyen NOK 🇸🇯 no,ru Svalbard & Jan Mayen 744 .sj
|
||||
SK SVK 421 Bratislava EUR 🇸🇰 sk,hu Slovakia 703 .sk
|
||||
SL SLE 232 Freetown SLE 🇸🇱 en-SL,men,tem Sierra Leone 694 .sl
|
||||
SM SMR 378 San Marino EUR 🇸🇲 it-SM San Marino 674 .sm
|
||||
SN SEN 221 Dakar XOF 🇸🇳 fr-SN,wo,fuc,mnk Senegal 686 .sn
|
||||
SO SOM 252 Mogadishu SOS 🇸🇴 so-SO,ar-SO,it,en-SO Somalia 706 .so
|
||||
SR SUR 597 Paramaribo SRD 🇸🇷 nl-SR,en,srn,hns,jv Suriname 740 .sr
|
||||
SS SSD 211 Juba SSP 🇸🇸 en South Sudan 728 .ss
|
||||
ST STP 239 Sao Tome STN 🇸🇹 pt-ST São Tomé & Príncipe 678 .st
|
||||
SV SLV 503 San Salvador SVC 🇸🇻 es-SV El Salvador 222 .sv
|
||||
SX SXM 1-721 Philipsburg XCG 🇸🇽 nl,en Sint Maarten 534 .sx
|
||||
SY SYR 963 Damascus SYP 🇸🇾 ar-SY,ku,hy,arc,fr,en Syria 760 .sy
|
||||
SZ SWZ 268 Mbabane SZL 🇸🇿 en-SZ,ss-SZ Eswatini 748 .sz
|
||||
TC TCA 1-649 Cockburn Town USD 🇹🇨 en-TC Turks & Caicos Islands 796 .tc
|
||||
TD TCD 235 N'Djamena XAF 🇹🇩 fr-TD,ar-TD,sre Chad 148 .td
|
||||
TF ATF 262 Port-aux-Francais EUR 🇹🇫 fr French Southern Territories 260 .tf
|
||||
TG TGO 228 Lome XOF 🇹🇬 fr-TG,ee,hna,kbp,dag,ha Togo 768 .tg
|
||||
TH THA 66 Bangkok THB 🇹🇭 th,en Thailand 764 .th
|
||||
TJ TJK 992 Dushanbe TJS 🇹🇯 tg,ru Tajikistan 762 .tj
|
||||
TL TLS 670 Dili USD 🇹🇱 tet,pt-TL,id,en Timor-Leste 626 .tl
|
||||
TM TKM 993 Ashgabat TMT 🇹🇲 tk,ru,uz Turkmenistan 795 .tm
|
||||
TN TUN 216 Tunis TND 🇹🇳 ar-TN,fr Tunisia 788 .tn
|
||||
TO TON 676 Nuku'alofa TOP 🇹🇴 to,en-TO Tonga 776 .to
|
||||
TR TUR 90 Ankara TRY 🇹🇷 tr-TR,ku,diq,az,av Türkiye 792 .tr
|
||||
TT TTO 1-868 Port of Spain TTD 🇹🇹 en-TT,hns,fr,es,zh Trinidad & Tobago 780 .tt
|
||||
TV TUV 688 Funafuti AUD 🇹🇻 tvl,en,sm,gil Tuvalu 798 .tv
|
||||
TW TWN 886 Taipei TWD 🇹🇼 zh-TW,zh,nan,hak Taiwan 158 .tw
|
||||
TZ TZA 255 Dodoma TZS 🇹🇿 sw-TZ,en,ar Tanzania 834 .tz
|
||||
UA UKR 380 Kyiv UAH 🇺🇦 uk,ru-UA,rom,pl,hu Ukraine 804 .ua
|
||||
UG UGA 256 Kampala UGX 🇺🇬 en-UG,lg,sw,ar Uganda 800 .ug
|
||||
US USA 1 Washington USD 🇺🇸 en-US,es-US,haw,fr US 840 .us
|
||||
UY URY 598 Montevideo UYU 🇺🇾 es-UY Uruguay 858 .uy
|
||||
UZ UZB 998 Tashkent UZS 🇺🇿 uz,ru,tg Uzbekistan 860 .uz
|
||||
VA VAT 39 Vatican City EUR 🇻🇦 la,it,fr Vatican City 336 .va
|
||||
VC VCT 1-784 Kingstown XCD 🇻🇨 en-VC,fr St. Vincent & Grenadines 670 .vc
|
||||
VE VEN 58 Caracas VES 🇻🇪 es-VE Venezuela 862 .ve
|
||||
VG VGB 1-284 Road Town USD 🇻🇬 en-VG British Virgin Islands 092 .vg
|
||||
VI VIR 1-340 Charlotte Amalie USD 🇻🇮 en-VI U.S. Virgin Islands 850 .vi
|
||||
VN VNM 84 Hanoi VND 🇻🇳 vi,en,fr,zh,km Vietnam 704 .vn
|
||||
VU VUT 678 Port Vila VUV 🇻🇺 bi,en-VU,fr-VU Vanuatu 548 .vu
|
||||
WF WLF 681 Mata Utu XPF 🇼🇫 wls,fud,fr-WF Wallis & Futuna 876 .wf
|
||||
WS WSM 685 Apia WST 🇼🇸 sm,en-WS Samoa 882 .ws
|
||||
YE YEM 967 Sanaa YER 🇾🇪 ar-YE Yemen 887 .ye
|
||||
YT MYT 262 Mamoudzou EUR 🇾🇹 fr-YT Mayotte 175 .yt
|
||||
ZA ZAF 27 Pretoria ZAR 🇿🇦 zu,xh,af,nso,en-ZA,tn,st,ts,ss,ve,nr South Africa 710 .za
|
||||
ZM ZMB 260 Lusaka ZMW 🇿🇲 en-ZM,bem,loz,lun,lue,ny,toi Zambia 894 .zm
|
||||
ZW ZWE 263 Harare ZWG 🇿🇼 en-ZW,sn,nr,nd Zimbabwe 716 .zw
|
||||
|
@@ -0,0 +1 @@
|
||||
{ "format": "{name}", "rows": "territory.tsv", "key": "alpha2", "name": "name" }
|
||||
@@ -0,0 +1,242 @@
|
||||
alpha2 alpha3 calling-code capital country currency flag languages name numeric tld
|
||||
AD AND 376 Andorra la Vella AD EUR 🇦🇩 ca Andorra 020 .ad
|
||||
AE ARE 971 Abu Dhabi AE AED 🇦🇪 ar-AE,fa,en,hi,ur United Arab Emirates 784 .ae
|
||||
AF AFG 93 Kabul AF AFN 🇦🇫 fa-AF,ps,uz-AF,tk Afghanistan 004 .af
|
||||
AG ATG 1-268 St. John's AG XCD 🇦🇬 en-AG Antigua & Barbuda 028 .ag
|
||||
AI AIA 1-264 The Valley GB XCD 🇦🇮 en-AI Anguilla 660 .ai
|
||||
AL ALB 355 Tirana AL ALL 🇦🇱 sq,el Albania 008 .al
|
||||
AM ARM 374 Yerevan AM AMD 🇦🇲 hy Armenia 051 .am
|
||||
AO AGO 244 Luanda AO AOA 🇦🇴 pt-AO Angola 024 .ao
|
||||
AR ARG 54 Buenos Aires AR ARS 🇦🇷 es-AR,en,it,de,fr,gn Argentina 032 .ar
|
||||
AS ASM 1-684 Pago Pago US USD 🇦🇸 en-AS,sm,to American Samoa 016 .as
|
||||
AT AUT 43 Vienna AT EUR 🇦🇹 de-AT,hr,hu,sl Austria 040 .at
|
||||
AU AUS 61 Canberra AU AUD 🇦🇺 en-AU Australia 036 .au
|
||||
AW ABW 297 Oranjestad NL AWG 🇦🇼 nl-AW,pap,es,en Aruba 533 .aw
|
||||
AX ALA 358 Mariehamn FI EUR 🇦🇽 sv-AX Åland Islands 248 .ax
|
||||
AZ AZE 994 Baku AZ AZN 🇦🇿 az,ru,hy Azerbaijan 031 .az
|
||||
BA BIH 387 Sarajevo BA BAM 🇧🇦 bs,hr-BA,sr-BA Bosnia 070 .ba
|
||||
BB BRB 1-246 Bridgetown BB BBD 🇧🇧 en-BB Barbados 052 .bb
|
||||
BD BGD 880 Dhaka BD BDT 🇧🇩 bn-BD,en Bangladesh 050 .bd
|
||||
BE BEL 32 Brussels BE EUR 🇧🇪 nl-BE,fr-BE,de-BE Belgium 056 .be
|
||||
BF BFA 226 Ouagadougou BF XOF 🇧🇫 fr-BF,mos Burkina Faso 854 .bf
|
||||
BG BGR 359 Sofia BG EUR 🇧🇬 bg,tr-BG,rom Bulgaria 100 .bg
|
||||
BH BHR 973 Manama BH BHD 🇧🇭 ar-BH,en,fa,ur Bahrain 048 .bh
|
||||
BI BDI 257 Gitega BI BIF 🇧🇮 fr-BI,rn Burundi 108 .bi
|
||||
BJ BEN 229 Porto-Novo BJ XOF 🇧🇯 fr-BJ Benin 204 .bj
|
||||
BL BLM 590 Gustavia FR EUR 🇧🇱 fr St. Barthélemy 652 .gp
|
||||
BM BMU 1-441 Hamilton GB BMD 🇧🇲 en-BM,pt Bermuda 060 .bm
|
||||
BN BRN 673 Bandar Seri Begawan BN BND 🇧🇳 ms-BN,en-BN Brunei 096 .bn
|
||||
BO BOL 591 Sucre BO BOB 🇧🇴 es-BO,qu,ay Bolivia 068 .bo
|
||||
BR BRA 55 Brasilia BR BRL 🇧🇷 pt-BR,es,en,fr Brazil 076 .br
|
||||
BS BHS 1-242 Nassau BS BSD 🇧🇸 en-BS Bahamas 044 .bs
|
||||
BT BTN 975 Thimphu BT INR 🇧🇹 dz Bhutan 064 .bt
|
||||
BW BWA 267 Gaborone BW BWP 🇧🇼 en-BW,tn-BW Botswana 072 .bw
|
||||
BY BLR 375 Minsk BY BYN 🇧🇾 be,ru Belarus 112 .by
|
||||
BZ BLZ 501 Belmopan BZ BZD 🇧🇿 en-BZ,es Belize 084 .bz
|
||||
CA CAN 1 Ottawa CA CAD 🇨🇦 en-CA,fr-CA,iu Canada 124 .ca
|
||||
CC CCK 61 West Island AU AUD 🇨🇨 ms-CC,en Cocos Islands 166 .cc
|
||||
CD COD 243 Kinshasa CD CDF 🇨🇩 fr-CD,ln,ktu,kg,sw,lua Congo - Kinshasa 180 .cd
|
||||
CF CAF 236 Bangui CF XAF 🇨🇫 fr-CF,sg,ln,kg Central African Republic 140 .cf
|
||||
CG COG 242 Brazzaville CG XAF 🇨🇬 fr-CG,kg,ln-CG Congo - Brazzaville 178 .cg
|
||||
CH CHE 41 Bern CH CHF 🇨🇭 de-CH,fr-CH,it-CH,rm Switzerland 756 .ch
|
||||
CI CIV 225 Yamoussoukro CI XOF 🇨🇮 fr-CI Côte d’Ivoire 384 .ci
|
||||
CK COK 682 Avarua NZ NZD 🇨🇰 en-CK,mi Cook Islands 184 .ck
|
||||
CL CHL 56 Santiago CL CLP 🇨🇱 es-CL Chile 152 .cl
|
||||
CM CMR 237 Yaounde CM XAF 🇨🇲 en-CM,fr-CM Cameroon 120 .cm
|
||||
CN CHN 86 Beijing CN CNY 🇨🇳 zh-CN,yue,wuu,dta,ug,za China 156 .cn
|
||||
CO COL 57 Bogota CO COP 🇨🇴 es-CO Colombia 170 .co
|
||||
CR CRI 506 San Jose CR CRC 🇨🇷 es-CR,en Costa Rica 188 .cr
|
||||
CU CUB 53 Havana CU CUP 🇨🇺 es-CU,pap Cuba 192 .cu
|
||||
CV CPV 238 Praia CV CVE 🇨🇻 pt-CV Cape Verde 132 .cv
|
||||
CW CUW 599 Willemstad NL XCG 🇨🇼 nl,pap Curaçao 531 .cw
|
||||
CX CXR 61 Flying Fish Cove AU AUD 🇨🇽 en,zh,ms-CX Christmas Island 162 .cx
|
||||
CY CYP 357 Nicosia CY EUR 🇨🇾 el-CY,tr-CY,en Cyprus 196 .cy
|
||||
CZ CZE 420 Prague CZ CZK 🇨🇿 cs,sk Czechia 203 .cz
|
||||
DE DEU 49 Berlin DE EUR 🇩🇪 de Germany 276 .de
|
||||
DJ DJI 253 Djibouti DJ DJF 🇩🇯 fr-DJ,ar,so-DJ,aa Djibouti 262 .dj
|
||||
DK DNK 45 Copenhagen DK DKK 🇩🇰 da-DK,en,fo,de-DK Denmark 208 .dk
|
||||
DM DMA 1-767 Roseau DM XCD 🇩🇲 en-DM Dominica 212 .dm
|
||||
DO DOM 1-809 Santo Domingo DO DOP 🇩🇴 es-DO Dominican Republic 214 .do
|
||||
DZ DZA 213 Algiers DZ DZD 🇩🇿 ar-DZ Algeria 012 .dz
|
||||
EC ECU 593 Quito EC USD 🇪🇨 es-EC Ecuador 218 .ec
|
||||
EE EST 372 Tallinn EE EUR 🇪🇪 et,ru Estonia 233 .ee
|
||||
EG EGY 20 Cairo EG EGP 🇪🇬 ar-EG,en,fr Egypt 818 .eg
|
||||
EH ESH 212 El-Aaiun EH MAD 🇪🇭 ar,mey Western Sahara 732 .eh
|
||||
ER ERI 291 Asmara ER ERN 🇪🇷 aa-ER,ar,tig,kun,ti-ER Eritrea 232 .er
|
||||
ES ESP 34 Madrid ES EUR 🇪🇸 es-ES,ca,gl,eu,oc Spain 724 .es
|
||||
ET ETH 251 Addis Ababa ET ETB 🇪🇹 am,en-ET,om-ET,ti-ET,so-ET,sid Ethiopia 231 .et
|
||||
FI FIN 358 Helsinki FI EUR 🇫🇮 fi-FI,sv-FI,smn Finland 246 .fi
|
||||
FJ FJI 679 Suva FJ FJD 🇫🇯 en-FJ,fj Fiji 242 .fj
|
||||
FK FLK 500 Stanley GB FKP 🇫🇰 en-FK Falkland Islands 238 .fk
|
||||
FM FSM 691 Palikir FM USD 🇫🇲 en-FM,chk,pon,yap,kos,uli,woe,nkr,kpg Micronesia 583 .fm
|
||||
FO FRO 298 Torshavn DK DKK 🇫🇴 fo,da-FO Faroe Islands 234 .fo
|
||||
FR FRA 33 Paris FR EUR 🇫🇷 fr-FR,frp,br,co,ca,eu,oc France 250 .fr
|
||||
GA GAB 241 Libreville GA XAF 🇬🇦 fr-GA Gabon 266 .ga
|
||||
GB GBR 44 London GB GBP 🇬🇧 en-GB,cy-GB,gd UK 826 .uk
|
||||
GD GRD 1-473 St. George's GD XCD 🇬🇩 en-GD Grenada 308 .gd
|
||||
GE GEO 995 Tbilisi GE GEL 🇬🇪 ka,ru,hy,az Georgia 268 .ge
|
||||
GF GUF 594 Cayenne FR EUR 🇬🇫 fr-GF French Guiana 254 .gf
|
||||
GG GGY 44 St Peter Port GB GBP 🇬🇬 en,nrf Guernsey 831 .gg
|
||||
GH GHA 233 Accra GH GHS 🇬🇭 en-GH,ak,ee,tw Ghana 288 .gh
|
||||
GI GIB 350 Gibraltar GB GIP 🇬🇮 en-GI,es,it,pt Gibraltar 292 .gi
|
||||
GL GRL 299 Nuuk DK DKK 🇬🇱 kl,da-GL,en Greenland 304 .gl
|
||||
GM GMB 220 Banjul GM GMD 🇬🇲 en-GM,mnk,wof,wo,ff Gambia 270 .gm
|
||||
GN GIN 224 Conakry GN GNF 🇬🇳 fr-GN Guinea 324 .gn
|
||||
GP GLP 590 Basse-Terre FR EUR 🇬🇵 fr-GP Guadeloupe 312 .gp
|
||||
GQ GNQ 240 Ciudad de la Paz GQ XAF 🇬🇶 es-GQ,fr,pt Equatorial Guinea 226 .gq
|
||||
GR GRC 30 Athens GR EUR 🇬🇷 el-GR,en,fr Greece 300 .gr
|
||||
GT GTM 502 Guatemala City GT GTQ 🇬🇹 es-GT Guatemala 320 .gt
|
||||
GU GUM 1-671 Hagatna US USD 🇬🇺 en-GU,ch-GU Guam 316 .gu
|
||||
GW GNB 245 Bissau GW XOF 🇬🇼 pt-GW,pov Guinea-Bissau 624 .gw
|
||||
GY GUY 592 Georgetown GY GYD 🇬🇾 en-GY Guyana 328 .gy
|
||||
HK HKG 852 Hong Kong CN HKD 🇭🇰 zh-HK,yue,zh,en Hong Kong 344 .hk
|
||||
HN HND 504 Tegucigalpa HN HNL 🇭🇳 es-HN,cab,miq Honduras 340 .hn
|
||||
HR HRV 385 Zagreb HR EUR 🇭🇷 hr-HR,sr Croatia 191 .hr
|
||||
HT HTI 509 Port-au-Prince HT HTG 🇭🇹 ht,fr-HT Haiti 332 .ht
|
||||
HU HUN 36 Budapest HU HUF 🇭🇺 hu-HU Hungary 348 .hu
|
||||
ID IDN 62 Jakarta ID IDR 🇮🇩 id,en,nl,jv Indonesia 360 .id
|
||||
IE IRL 353 Dublin IE EUR 🇮🇪 en-IE,ga-IE Ireland 372 .ie
|
||||
IL ISR 972 Jerusalem IL ILS 🇮🇱 he,ar-IL,en-IL Israel 376 .il
|
||||
IM IMN 44 Douglas GB GBP 🇮🇲 en,gv Isle of Man 833 .im
|
||||
IN IND 91 New Delhi IN INR 🇮🇳 en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc India 356 .in
|
||||
IO IOT 246 Diego Garcia GB USD 🇮🇴 en-IO British Indian Ocean Territory 086 .io
|
||||
IQ IRQ 964 Baghdad IQ IQD 🇮🇶 ar-IQ,ku,hy Iraq 368 .iq
|
||||
IR IRN 98 Tehran IR IRR 🇮🇷 fa-IR,ku Iran 364 .ir
|
||||
IS ISL 354 Reykjavik IS ISK 🇮🇸 is,en,de,da,sv,no Iceland 352 .is
|
||||
IT ITA 39 Rome IT EUR 🇮🇹 it-IT,de-IT,fr-IT,sc,ca,co,sl Italy 380 .it
|
||||
JE JEY 44 Saint Helier GB GBP 🇯🇪 en,fr,nrf Jersey 832 .je
|
||||
JM JAM 1-876 Kingston JM JMD 🇯🇲 en-JM Jamaica 388 .jm
|
||||
JO JOR 962 Amman JO JOD 🇯🇴 ar-JO,en Jordan 400 .jo
|
||||
JP JPN 81 Tokyo JP JPY 🇯🇵 ja Japan 392 .jp
|
||||
KE KEN 254 Nairobi KE KES 🇰🇪 en-KE,sw-KE Kenya 404 .ke
|
||||
KG KGZ 996 Bishkek KG KGS 🇰🇬 ky,uz,ru Kyrgyzstan 417 .kg
|
||||
KH KHM 855 Phnom Penh KH KHR 🇰🇭 km,fr,en Cambodia 116 .kh
|
||||
KI KIR 686 Tarawa KI AUD 🇰🇮 en-KI,gil Kiribati 296 .ki
|
||||
KM COM 269 Moroni KM KMF 🇰🇲 ar,fr-KM Comoros 174 .km
|
||||
KN KNA 1-869 Basseterre KN XCD 🇰🇳 en-KN St. Kitts & Nevis 659 .kn
|
||||
KP PRK 850 Pyongyang KP KPW 🇰🇵 ko-KP North Korea 408 .kp
|
||||
KR KOR 82 Seoul KR KRW 🇰🇷 ko-KR,en South Korea 410 .kr
|
||||
KW KWT 965 Kuwait City KW KWD 🇰🇼 ar-KW,en Kuwait 414 .kw
|
||||
KY CYM 1-345 George Town GB KYD 🇰🇾 en-KY Cayman Islands 136 .ky
|
||||
KZ KAZ 7 Nur-Sultan KZ KZT 🇰🇿 kk,ru Kazakhstan 398 .kz
|
||||
LA LAO 856 Vientiane LA LAK 🇱🇦 lo,fr,en Laos 418 .la
|
||||
LB LBN 961 Beirut LB LBP 🇱🇧 ar-LB,fr-LB,en,hy Lebanon 422 .lb
|
||||
LC LCA 1-758 Castries LC XCD 🇱🇨 en-LC St. Lucia 662 .lc
|
||||
LI LIE 423 Vaduz LI CHF 🇱🇮 de-LI Liechtenstein 438 .li
|
||||
LK LKA 94 Colombo LK LKR 🇱🇰 si,ta,en Sri Lanka 144 .lk
|
||||
LR LBR 231 Monrovia LR LRD 🇱🇷 en-LR Liberia 430 .lr
|
||||
LS LSO 266 Maseru LS LSL 🇱🇸 en-LS,st,zu,xh Lesotho 426 .ls
|
||||
LT LTU 370 Vilnius LT EUR 🇱🇹 lt,ru,pl Lithuania 440 .lt
|
||||
LU LUX 352 Luxembourg LU EUR 🇱🇺 lb,de-LU,fr-LU Luxembourg 442 .lu
|
||||
LV LVA 371 Riga LV EUR 🇱🇻 lv,ru,lt Latvia 428 .lv
|
||||
LY LBY 218 Tripoli LY LYD 🇱🇾 ar-LY,it,en Libya 434 .ly
|
||||
MA MAR 212 Rabat MA MAD 🇲🇦 ar-MA,ber,fr Morocco 504 .ma
|
||||
MC MCO 377 Monaco MC EUR 🇲🇨 fr-MC,en,it Monaco 492 .mc
|
||||
MD MDA 373 Chisinau MD MDL 🇲🇩 ro,ru,gag,tr Moldova 498 .md
|
||||
ME MNE 382 Podgorica ME EUR 🇲🇪 sr,hu,bs,sq,hr,rom Montenegro 499 .me
|
||||
MF MAF 590 Marigot FR EUR 🇲🇫 fr St. Martin 663 .gp
|
||||
MG MDG 261 Antananarivo MG MGA 🇲🇬 fr-MG,mg Madagascar 450 .mg
|
||||
MH MHL 692 Majuro MH USD 🇲🇭 mh,en-MH Marshall Islands 584 .mh
|
||||
MK MKD 389 Skopje MK MKD 🇲🇰 mk,sq,tr,rmm,sr North Macedonia 807 .mk
|
||||
ML MLI 223 Bamako ML XOF 🇲🇱 fr-ML,bm Mali 466 .ml
|
||||
MM MMR 95 Nay Pyi Taw MM MMK 🇲🇲 my Myanmar 104 .mm
|
||||
MN MNG 976 Ulaanbaatar MN MNT 🇲🇳 mn,ru Mongolia 496 .mn
|
||||
MO MAC 853 Macao CN MOP 🇲🇴 zh,zh-MO,pt Macao 446 .mo
|
||||
MP MNP 1-670 Saipan US USD 🇲🇵 fil,tl,zh,ch-MP,en-MP Northern Mariana Islands 580 .mp
|
||||
MQ MTQ 596 Fort-de-France FR EUR 🇲🇶 fr-MQ Martinique 474 .mq
|
||||
MR MRT 222 Nouakchott MR MRU 🇲🇷 ar-MR,fuc,snk,fr,mey,wo Mauritania 478 .mr
|
||||
MS MSR 1-664 Plymouth GB XCD 🇲🇸 en-MS Montserrat 500 .ms
|
||||
MT MLT 356 Valletta MT EUR 🇲🇹 mt,en-MT Malta 470 .mt
|
||||
MU MUS 230 Port Louis MU MUR 🇲🇺 en-MU,bho,fr Mauritius 480 .mu
|
||||
MV MDV 960 Male MV MVR 🇲🇻 dv,en Maldives 462 .mv
|
||||
MW MWI 265 Lilongwe MW MWK 🇲🇼 ny,yao,tum,swk Malawi 454 .mw
|
||||
MX MEX 52 Mexico City MX MXN 🇲🇽 es-MX Mexico 484 .mx
|
||||
MY MYS 60 Kuala Lumpur MY MYR 🇲🇾 ms-MY,en,zh,ta,te,ml,pa,th Malaysia 458 .my
|
||||
MZ MOZ 258 Maputo MZ MZN 🇲🇿 pt-MZ,vmw Mozambique 508 .mz
|
||||
NA NAM 264 Windhoek NA NAD 🇳🇦 en-NA,af,de,hz,naq Namibia 516 .na
|
||||
NC NCL 687 Noumea FR XPF 🇳🇨 fr-NC New Caledonia 540 .nc
|
||||
NE NER 227 Niamey NE XOF 🇳🇪 fr-NE,ha,kr,dje Niger 562 .ne
|
||||
NF NFK 672 Kingston AU AUD 🇳🇫 en-NF Norfolk Island 574 .nf
|
||||
NG NGA 234 Abuja NG NGN 🇳🇬 en-NG,ha,yo,ig,ff Nigeria 566 .ng
|
||||
NI NIC 505 Managua NI NIO 🇳🇮 es-NI,en Nicaragua 558 .ni
|
||||
NL NLD 31 Amsterdam NL EUR 🇳🇱 nl-NL,fy-NL Netherlands 528 .nl
|
||||
NO NOR 47 Oslo NO NOK 🇳🇴 no,nb,nn,se,fi Norway 578 .no
|
||||
NP NPL 977 Kathmandu NP NPR 🇳🇵 ne,en Nepal 524 .np
|
||||
NR NRU 674 Yaren NR AUD 🇳🇷 na,en-NR Nauru 520 .nr
|
||||
NU NIU 683 Alofi NZ NZD 🇳🇺 niu,en-NU Niue 570 .nu
|
||||
NZ NZL 64 Wellington NZ NZD 🇳🇿 en-NZ,mi New Zealand 554 .nz
|
||||
OM OMN 968 Muscat OM OMR 🇴🇲 ar-OM,en,bal,ur Oman 512 .om
|
||||
PA PAN 507 Panama City PA PAB 🇵🇦 es-PA,en Panama 591 .pa
|
||||
PE PER 51 Lima PE PEN 🇵🇪 es-PE,qu,ay Peru 604 .pe
|
||||
PF PYF 689 Papeete FR XPF 🇵🇫 fr-PF,ty French Polynesia 258 .pf
|
||||
PG PNG 675 Port Moresby PG PGK 🇵🇬 en-PG,ho,meu,tpi Papua New Guinea 598 .pg
|
||||
PH PHL 63 Manila PH PHP 🇵🇭 tl,en-PH,fil,ceb,ilo,hil,war,pam,bik,bcl,pag,mrw,tsg,mdh,cbk,krj,sgd,msb,akl,ibg,yka,mta,abx Philippines 608 .ph
|
||||
PK PAK 92 Islamabad PK PKR 🇵🇰 ur-PK,en-PK,pa,sd,ps,brh Pakistan 586 .pk
|
||||
PL POL 48 Warsaw PL PLN 🇵🇱 pl Poland 616 .pl
|
||||
PM SPM 508 Saint-Pierre FR EUR 🇵🇲 fr-PM St. Pierre & Miquelon 666 .pm
|
||||
PN PCN 870 Adamstown GB NZD 🇵🇳 en-PN Pitcairn 612 .pn
|
||||
PR PRI 1 San Juan US USD 🇵🇷 en-PR,es-PR Puerto Rico 630 .pr
|
||||
PT PRT 351 Lisbon PT EUR 🇵🇹 pt-PT,mwl Portugal 620 .pt
|
||||
PW PLW 680 Melekeok PW USD 🇵🇼 pau,sov,en-PW,tox,ja,fil,zh Palau 585 .pw
|
||||
PY PRY 595 Asuncion PY PYG 🇵🇾 es-PY,gn Paraguay 600 .py
|
||||
QA QAT 974 Doha QA QAR 🇶🇦 ar-QA,es Qatar 634 .qa
|
||||
RE REU 262 Saint-Denis FR EUR 🇷🇪 fr-RE Réunion 638 .re
|
||||
RO ROU 40 Bucharest RO RON 🇷🇴 ro,hu,rom Romania 642 .ro
|
||||
RS SRB 381 Belgrade RS RSD 🇷🇸 sr,hu,bs,rom Serbia 688 .rs
|
||||
RU RUS 7 Moscow RU RUB 🇷🇺 ru,tt,xal,cau,ady,kv,ce,tyv,cv,udm,tut,mns,bua,myv,mdf,chm,ba,inh,kbd,krc,av,sah,nog Russia 643 .ru
|
||||
RW RWA 250 Kigali RW RWF 🇷🇼 rw,en-RW,fr-RW,sw Rwanda 646 .rw
|
||||
SA SAU 966 Riyadh SA SAR 🇸🇦 ar-SA Saudi Arabia 682 .sa
|
||||
SB SLB 677 Honiara SB SBD 🇸🇧 en-SB,tpi Solomon Islands 090 .sb
|
||||
SC SYC 248 Victoria SC SCR 🇸🇨 en-SC,fr-SC Seychelles 690 .sc
|
||||
SD SDN 249 Khartoum SD SDG 🇸🇩 ar-SD,en,fia Sudan 729 .sd
|
||||
SE SWE 46 Stockholm SE SEK 🇸🇪 sv-SE,se,sma,fi-SE Sweden 752 .se
|
||||
SG SGP 65 Singapore SG SGD 🇸🇬 cmn,en-SG,ms-SG,ta-SG,zh-SG Singapore 702 .sg
|
||||
SH SHN 290 Jamestown GB SHP 🇸🇭 en-SH St. Helena 654 .sh
|
||||
SI SVN 386 Ljubljana SI EUR 🇸🇮 sl,sh Slovenia 705 .si
|
||||
SJ SJM 47 Longyearbyen NO NOK 🇸🇯 no,ru Svalbard & Jan Mayen 744 .sj
|
||||
SK SVK 421 Bratislava SK EUR 🇸🇰 sk,hu Slovakia 703 .sk
|
||||
SL SLE 232 Freetown SL SLE 🇸🇱 en-SL,men,tem Sierra Leone 694 .sl
|
||||
SM SMR 378 San Marino SM EUR 🇸🇲 it-SM San Marino 674 .sm
|
||||
SN SEN 221 Dakar SN XOF 🇸🇳 fr-SN,wo,fuc,mnk Senegal 686 .sn
|
||||
SO SOM 252 Mogadishu SO SOS 🇸🇴 so-SO,ar-SO,it,en-SO Somalia 706 .so
|
||||
SR SUR 597 Paramaribo SR SRD 🇸🇷 nl-SR,en,srn,hns,jv Suriname 740 .sr
|
||||
SS SSD 211 Juba SS SSP 🇸🇸 en South Sudan 728 .ss
|
||||
ST STP 239 Sao Tome ST STN 🇸🇹 pt-ST São Tomé & Príncipe 678 .st
|
||||
SV SLV 503 San Salvador SV SVC 🇸🇻 es-SV El Salvador 222 .sv
|
||||
SX SXM 1-721 Philipsburg NL XCG 🇸🇽 nl,en Sint Maarten 534 .sx
|
||||
SY SYR 963 Damascus SY SYP 🇸🇾 ar-SY,ku,hy,arc,fr,en Syria 760 .sy
|
||||
SZ SWZ 268 Mbabane SZ SZL 🇸🇿 en-SZ,ss-SZ Eswatini 748 .sz
|
||||
TC TCA 1-649 Cockburn Town GB USD 🇹🇨 en-TC Turks & Caicos Islands 796 .tc
|
||||
TD TCD 235 N'Djamena TD XAF 🇹🇩 fr-TD,ar-TD,sre Chad 148 .td
|
||||
TF ATF 262 Port-aux-Francais FR EUR 🇹🇫 fr French Southern Territories 260 .tf
|
||||
TG TGO 228 Lome TG XOF 🇹🇬 fr-TG,ee,hna,kbp,dag,ha Togo 768 .tg
|
||||
TH THA 66 Bangkok TH THB 🇹🇭 th,en Thailand 764 .th
|
||||
TJ TJK 992 Dushanbe TJ TJS 🇹🇯 tg,ru Tajikistan 762 .tj
|
||||
TL TLS 670 Dili TL USD 🇹🇱 tet,pt-TL,id,en Timor-Leste 626 .tl
|
||||
TM TKM 993 Ashgabat TM TMT 🇹🇲 tk,ru,uz Turkmenistan 795 .tm
|
||||
TN TUN 216 Tunis TN TND 🇹🇳 ar-TN,fr Tunisia 788 .tn
|
||||
TO TON 676 Nuku'alofa TO TOP 🇹🇴 to,en-TO Tonga 776 .to
|
||||
TR TUR 90 Ankara TR TRY 🇹🇷 tr-TR,ku,diq,az,av Türkiye 792 .tr
|
||||
TT TTO 1-868 Port of Spain TT TTD 🇹🇹 en-TT,hns,fr,es,zh Trinidad & Tobago 780 .tt
|
||||
TV TUV 688 Funafuti TV AUD 🇹🇻 tvl,en,sm,gil Tuvalu 798 .tv
|
||||
TW TWN 886 Taipei TW TWD 🇹🇼 zh-TW,zh,nan,hak Taiwan 158 .tw
|
||||
TZ TZA 255 Dodoma TZ TZS 🇹🇿 sw-TZ,en,ar Tanzania 834 .tz
|
||||
UA UKR 380 Kyiv UA UAH 🇺🇦 uk,ru-UA,rom,pl,hu Ukraine 804 .ua
|
||||
UG UGA 256 Kampala UG UGX 🇺🇬 en-UG,lg,sw,ar Uganda 800 .ug
|
||||
US USA 1 Washington US USD 🇺🇸 en-US,es-US,haw,fr US 840 .us
|
||||
UY URY 598 Montevideo UY UYU 🇺🇾 es-UY Uruguay 858 .uy
|
||||
UZ UZB 998 Tashkent UZ UZS 🇺🇿 uz,ru,tg Uzbekistan 860 .uz
|
||||
VA VAT 39 Vatican City VA EUR 🇻🇦 la,it,fr Vatican City 336 .va
|
||||
VC VCT 1-784 Kingstown VC XCD 🇻🇨 en-VC,fr St. Vincent & Grenadines 670 .vc
|
||||
VE VEN 58 Caracas VE VES 🇻🇪 es-VE Venezuela 862 .ve
|
||||
VG VGB 1-284 Road Town GB USD 🇻🇬 en-VG British Virgin Islands 092 .vg
|
||||
VI VIR 1-340 Charlotte Amalie US USD 🇻🇮 en-VI U.S. Virgin Islands 850 .vi
|
||||
VN VNM 84 Hanoi VN VND 🇻🇳 vi,en,fr,zh,km Vietnam 704 .vn
|
||||
VU VUT 678 Port Vila VU VUV 🇻🇺 bi,en-VU,fr-VU Vanuatu 548 .vu
|
||||
WF WLF 681 Mata Utu FR XPF 🇼🇫 wls,fud,fr-WF Wallis & Futuna 876 .wf
|
||||
WS WSM 685 Apia WS WST 🇼🇸 sm,en-WS Samoa 882 .ws
|
||||
YE YEM 967 Sanaa YE YER 🇾🇪 ar-YE Yemen 887 .ye
|
||||
YT MYT 262 Mamoudzou FR EUR 🇾🇹 fr-YT Mayotte 175 .yt
|
||||
ZA ZAF 27 Pretoria ZA ZAR 🇿🇦 zu,xh,af,nso,en-ZA,tn,st,ts,ss,ve,nr South Africa 710 .za
|
||||
ZM ZMB 260 Lusaka ZM ZMW 🇿🇲 en-ZM,bem,loz,lun,lue,ny,toi Zambia 894 .zm
|
||||
ZW ZWE 263 Harare ZW ZWG 🇿🇼 en-ZW,sn,nr,nd Zimbabwe 716 .zw
|
||||
|
@@ -1 +1 @@
|
||||
["UTC", "Africa/Cairo", "Africa/Johannesburg", "America/Chicago", "America/Denver", "America/Los_Angeles", "America/Mexico_City", "America/New_York", "America/Sao_Paulo", "America/Toronto", "Asia/Dubai", "Asia/Hong_Kong", "Asia/Kolkata", "Asia/Shanghai", "Asia/Singapore", "Asia/Tokyo", "Australia/Sydney", "Europe/Amsterdam", "Europe/Berlin", "Europe/London", "Europe/Madrid", "Europe/Moscow", "Europe/Oslo", "Europe/Paris", "Europe/Stockholm", "Europe/Warsaw", "Pacific/Auckland"]
|
||||
{ "format": "{zone}", "rows": "timezone.tsv", "key": "zone", "parent": "territory", "weight": "weight" }
|
||||
|
||||
@@ -0,0 +1,402 @@
|
||||
offset territory weight zone
|
||||
+00:00 CI 17496811 Africa/Abidjan
|
||||
+00:00 GH 11277813 Africa/Accra
|
||||
+03:00 ET 18690487 Africa/Addis_Ababa
|
||||
+01:00 DZ 20111539 Africa/Algiers
|
||||
+03:00 ER 798575 Africa/Asmara
|
||||
+00:00 ML 7673493 Africa/Bamako
|
||||
+01:00 CF 2582076 Africa/Bangui
|
||||
+00:00 GM 1305981 Africa/Banjul
|
||||
+00:00 GW 904776 Africa/Bissau
|
||||
+02:00 MW 3030905 Africa/Blantyre
|
||||
+01:00 CG 3748808 Africa/Brazzaville
|
||||
+02:00 BI 1251675 Africa/Bujumbura
|
||||
+02:00 EG 47242427 Africa/Cairo
|
||||
+00:00 MA 22808531 Africa/Casablanca
|
||||
+01:00 ES 85985 Africa/Ceuta
|
||||
+00:00 GN 6679241 Africa/Conakry
|
||||
+00:00 SN 10055356 Africa/Dakar
|
||||
+03:00 TZ 21350525 Africa/Dar_es_Salaam
|
||||
+03:00 DJ 1316108 Africa/Djibouti
|
||||
+01:00 CM 8330801 Africa/Douala
|
||||
+00:00 EH 374107 Africa/El_Aaiun
|
||||
+00:00 SL 1752243 Africa/Freetown
|
||||
+02:00 BW 1262880 Africa/Gaborone
|
||||
+02:00 ZW 4508424 Africa/Harare
|
||||
+02:00 ZA 47939803 Africa/Johannesburg
|
||||
+02:00 SS 1679674 Africa/Juba
|
||||
+03:00 UG 9664318 Africa/Kampala
|
||||
+02:00 SD 11781926 Africa/Khartoum
|
||||
+02:00 RW 2910190 Africa/Kigali
|
||||
+01:00 CD 20651243 Africa/Kinshasa
|
||||
+01:00 NG 75725576 Africa/Lagos
|
||||
+01:00 GA 1731692 Africa/Libreville
|
||||
+00:00 TG 3089219 Africa/Lome
|
||||
+01:00 AO 23567341 Africa/Luanda
|
||||
+02:00 CD 16660579 Africa/Lubumbashi
|
||||
+02:00 ZM 8422414 Africa/Lusaka
|
||||
+01:00 GQ 355840 Africa/Malabo
|
||||
+02:00 MZ 8598836 Africa/Maputo
|
||||
+02:00 LS 739682 Africa/Maseru
|
||||
+02:00 SZ 191312 Africa/Mbabane
|
||||
+03:00 SO 6165052 Africa/Mogadishu
|
||||
+00:00 LR 2127307 Africa/Monrovia
|
||||
+03:00 KE 16920989 Africa/Nairobi
|
||||
+01:00 TD 3363418 Africa/Ndjamena
|
||||
+01:00 NE 3689982 Africa/Niamey
|
||||
+00:00 MR 2157288 Africa/Nouakchott
|
||||
+00:00 BF 6125427 Africa/Ouagadougou
|
||||
+01:00 BJ 4001576 Africa/Porto-Novo
|
||||
+00:00 ST 53300 Africa/Sao_Tome
|
||||
+02:00 LY 6105792 Africa/Tripoli
|
||||
+01:00 TN 7314557 Africa/Tunis
|
||||
+02:00 NA 983097 Africa/Windhoek
|
||||
-10:00 US 15000 America/Adak
|
||||
-09:00 US 366200 America/Anchorage
|
||||
-04:00 AI 15000 America/Anguilla
|
||||
-04:00 AG 51737 America/Antigua
|
||||
-03:00 BR 858988 America/Araguaina
|
||||
-03:00 AR 11817784 America/Argentina/Buenos_Aires
|
||||
-03:00 AR 580969 America/Argentina/Catamarca
|
||||
-03:00 AR 8998034 America/Argentina/Cordoba
|
||||
-03:00 AR 413866 America/Argentina/Jujuy
|
||||
-03:00 AR 237745 America/Argentina/La_Rioja
|
||||
-03:00 AR 695484 America/Argentina/Mendoza
|
||||
-03:00 AR 241619 America/Argentina/Rio_Gallegos
|
||||
-03:00 AR 2120781 America/Argentina/Salta
|
||||
-03:00 AR 518624 America/Argentina/San_Juan
|
||||
-03:00 AR 266728 America/Argentina/San_Luis
|
||||
-03:00 AR 788916 America/Argentina/Tucuman
|
||||
-03:00 AR 109506 America/Argentina/Ushuaia
|
||||
-04:00 AW 90927 America/Aruba
|
||||
-03:00 PY 3653883 America/Asuncion
|
||||
-05:00 CA 15000 America/Atikokan
|
||||
-03:00 BR 13131907 America/Bahia
|
||||
-06:00 MX 36253 America/Bahia_Banderas
|
||||
-04:00 BB 98511 America/Barbados
|
||||
-03:00 BR 7977349 America/Belem
|
||||
-06:00 BZ 132559 America/Belize
|
||||
-04:00 CA 15000 America/Blanc-Sablon
|
||||
-04:00 BR 550434 America/Boa_Vista
|
||||
-05:00 CO 37243567 America/Bogota
|
||||
-07:00 US 748802 America/Boise
|
||||
-07:00 CA 15000 America/Cambridge_Bay
|
||||
-04:00 BR 2429053 America/Campo_Grande
|
||||
-05:00 MX 1328961 America/Cancun
|
||||
-04:00 VE 28324666 America/Caracas
|
||||
-03:00 GF 155245 America/Cayenne
|
||||
-05:00 KY 44705 America/Cayman
|
||||
-06:00 US 55510713 America/Chicago
|
||||
-06:00 MX 1533843 America/Chihuahua
|
||||
-07:00 MX 1512450 America/Ciudad_Juarez
|
||||
-06:00 CR 1458629 America/Costa_Rica
|
||||
-03:00 CL 62723 America/Coyhaique
|
||||
-07:00 CA 15000 America/Creston
|
||||
-04:00 BR 2960376 America/Cuiaba
|
||||
-04:00 CW 145838 America/Curacao
|
||||
+00:00 GL 15000 America/Danmarkshavn
|
||||
-07:00 CA 15000 America/Dawson
|
||||
-07:00 CA 21465 America/Dawson_Creek
|
||||
-07:00 US 9069711 America/Denver
|
||||
-05:00 US 4344725 America/Detroit
|
||||
-04:00 DM 16571 America/Dominica
|
||||
-06:00 CA 3518059 America/Edmonton
|
||||
-05:00 BR 142900 America/Eirunepe
|
||||
-06:00 SV 2571611 America/El_Salvador
|
||||
-07:00 CA 15000 America/Fort_Nelson
|
||||
-03:00 BR 21824546 America/Fortaleza
|
||||
-04:00 CA 122883 America/Glace_Bay
|
||||
-04:00 CA 15000 America/Goose_Bay
|
||||
-05:00 TC 27489 America/Grand_Turk
|
||||
-04:00 GD 15000 America/Grenada
|
||||
-04:00 GP 250260 America/Guadeloupe
|
||||
-06:00 GT 7302205 America/Guatemala
|
||||
-05:00 EC 11564603 America/Guayaquil
|
||||
-04:00 GY 314746 America/Guyana
|
||||
-04:00 CA 843888 America/Halifax
|
||||
-05:00 CU 11972822 America/Havana
|
||||
-07:00 MX 2215048 America/Hermosillo
|
||||
-05:00 US 2672398 America/Indiana/Indianapolis
|
||||
-06:00 US 15000 America/Indiana/Knox
|
||||
-05:00 US 15000 America/Indiana/Marengo
|
||||
-05:00 US 15000 America/Indiana/Petersburg
|
||||
-06:00 US 15000 America/Indiana/Tell_City
|
||||
-05:00 US 15000 America/Indiana/Vevay
|
||||
-05:00 US 15451 America/Indiana/Vincennes
|
||||
-05:00 US 15000 America/Indiana/Winamac
|
||||
-06:00 CA 15000 America/Inuvik
|
||||
-05:00 CA 15000 America/Iqaluit
|
||||
-05:00 JM 2069735 America/Jamaica
|
||||
-09:00 US 31555 America/Juneau
|
||||
-05:00 US 909379 America/Kentucky/Louisville
|
||||
-05:00 US 15000 America/Kentucky/Monticello
|
||||
-04:00 BO 6958595 America/La_Paz
|
||||
-05:00 PE 21406340 America/Lima
|
||||
-08:00 US 46301242 America/Los_Angeles
|
||||
-04:00 SX 15000 America/Lower_Princes
|
||||
-03:00 BR 4805317 America/Maceio
|
||||
-06:00 NI 2621115 America/Managua
|
||||
-04:00 BR 3918958 America/Manaus
|
||||
-04:00 MF 15000 America/Marigot
|
||||
-04:00 MQ 243860 America/Martinique
|
||||
-06:00 MX 1899165 America/Matamoros
|
||||
-07:00 MX 2951216 America/Mazatlan
|
||||
-06:00 US 15000 America/Menominee
|
||||
-06:00 MX 4154924 America/Merida
|
||||
-09:00 US 15000 America/Metlakatla
|
||||
-06:00 MX 61603325 America/Mexico_City
|
||||
-03:00 PM 15000 America/Miquelon
|
||||
-04:00 CA 381536 America/Moncton
|
||||
-06:00 MX 9714766 America/Monterrey
|
||||
-03:00 UY 2457462 America/Montevideo
|
||||
-04:00 MS 15000 America/Montserrat
|
||||
-05:00 BS 319054 America/Nassau
|
||||
-05:00 US 88988896 America/New_York
|
||||
-09:00 US 15000 America/Nome
|
||||
-02:00 BR 15000 America/Noronha
|
||||
-06:00 US 15000 America/North_Dakota/Beulah
|
||||
-06:00 US 15000 America/North_Dakota/Center
|
||||
-06:00 US 21382 America/North_Dakota/New_Salem
|
||||
-02:00 GL 15000 America/Nuuk
|
||||
-06:00 MX 50784 America/Ojinaga
|
||||
-05:00 PA 1692726 America/Panama
|
||||
-03:00 SR 454064 America/Paramaribo
|
||||
-07:00 US 6541994 America/Phoenix
|
||||
-05:00 HT 5328623 America/Port-au-Prince
|
||||
-04:00 TT 456832 America/Port_of_Spain
|
||||
-04:00 BR 1551818 America/Porto_Velho
|
||||
-04:00 PR 1605968 America/Puerto_Rico
|
||||
-03:00 CL 135935 America/Punta_Arenas
|
||||
-06:00 CA 15000 America/Rankin_Inlet
|
||||
-03:00 BR 8832691 America/Recife
|
||||
-06:00 CA 982810 America/Regina
|
||||
-06:00 CA 15000 America/Resolute
|
||||
-05:00 BR 794527 America/Rio_Branco
|
||||
-03:00 BR 1403419 America/Santarem
|
||||
-04:00 CL 15912038 America/Santiago
|
||||
-04:00 DO 7521391 America/Santo_Domingo
|
||||
-03:00 BR 129186469 America/Sao_Paulo
|
||||
-02:00 GL 15000 America/Scoresbysund
|
||||
-09:00 US 15000 America/Sitka
|
||||
-04:00 BL 15000 America/St_Barthelemy
|
||||
-03:30 CA 202443 America/St_Johns
|
||||
-04:00 KN 15000 America/St_Kitts
|
||||
-04:00 LC 45210 America/St_Lucia
|
||||
-04:00 VI 70601 America/St_Thomas
|
||||
-04:00 VC 48723 America/St_Vincent
|
||||
-06:00 CA 16604 America/Swift_Current
|
||||
-06:00 HN 4808928 America/Tegucigalpa
|
||||
-04:00 GL 15000 America/Thule
|
||||
-08:00 MX 3797218 America/Tijuana
|
||||
-05:00 CA 24763654 America/Toronto
|
||||
-04:00 VG 15000 America/Tortola
|
||||
-07:00 CA 6340886 America/Vancouver
|
||||
-07:00 CA 28201 America/Whitehorse
|
||||
-06:00 CA 922566 America/Winnipeg
|
||||
-09:00 US 15000 America/Yakutat
|
||||
+10:00 AU 15000 Antarctica/Macquarie
|
||||
+01:00 SJ 15000 Arctic/Longyearbyen
|
||||
+03:00 YE 6904010 Asia/Aden
|
||||
+05:00 KZ 9055499 Asia/Almaty
|
||||
+03:00 JO 4950859 Asia/Amman
|
||||
+12:00 RU 15604 Asia/Anadyr
|
||||
+05:00 KZ 282409 Asia/Aqtau
|
||||
+05:00 KZ 598827 Asia/Aqtobe
|
||||
+05:00 TM 2706037 Asia/Ashgabat
|
||||
+05:00 KZ 388248 Asia/Atyrau
|
||||
+03:00 IQ 29681856 Asia/Baghdad
|
||||
+03:00 BH 815447 Asia/Bahrain
|
||||
+04:00 AZ 5491302 Asia/Baku
|
||||
+07:00 TH 49896297 Asia/Bangkok
|
||||
+07:00 RU 1413356 Asia/Barnaul
|
||||
+02:00 LB 4467748 Asia/Beirut
|
||||
+06:00 KG 2233412 Asia/Bishkek
|
||||
+08:00 BN 230416 Asia/Brunei
|
||||
+09:00 RU 486311 Asia/Chita
|
||||
+05:30 LK 4297175 Asia/Colombo
|
||||
+03:00 SY 10939175 Asia/Damascus
|
||||
+06:00 BD 35955225 Asia/Dhaka
|
||||
+09:00 TL 311685 Asia/Dili
|
||||
+04:00 AE 12931222 Asia/Dubai
|
||||
+05:00 TJ 2578933 Asia/Dushanbe
|
||||
+02:00 CY 109959 Asia/Famagusta
|
||||
+07:00 VN 42129036 Asia/Ho_Chi_Minh
|
||||
+08:00 HK 24678261 Asia/Hong_Kong
|
||||
+07:00 MN 122174 Asia/Hovd
|
||||
+08:00 RU 2231790 Asia/Irkutsk
|
||||
+07:00 ID 68794489 Asia/Jakarta
|
||||
+09:00 ID 2512221 Asia/Jayapura
|
||||
+02:00 IL 7901151 Asia/Jerusalem
|
||||
+04:30 AF 8764027 Asia/Kabul
|
||||
+12:00 RU 247112 Asia/Kamchatka
|
||||
+05:00 PK 88744953 Asia/Karachi
|
||||
+05:45 NP 5913313 Asia/Kathmandu
|
||||
+09:00 RU 15000 Asia/Khandyga
|
||||
+05:30 IN 365373326 Asia/Kolkata
|
||||
+07:00 RU 2615869 Asia/Krasnoyarsk
|
||||
+08:00 MY 33322164 Asia/Kuala_Lumpur
|
||||
+08:00 MY 4013140 Asia/Kuching
|
||||
+03:00 KW 1662180 Asia/Kuwait
|
||||
+08:00 MO 1236695 Asia/Macau
|
||||
+11:00 RU 92782 Asia/Magadan
|
||||
+08:00 ID 12458359 Asia/Makassar
|
||||
+08:00 PH 64227523 Asia/Manila
|
||||
+04:00 OM 3290021 Asia/Muscat
|
||||
+02:00 CY 679420 Asia/Nicosia
|
||||
+07:00 RU 2355475 Asia/Novokuznetsk
|
||||
+07:00 RU 2119272 Asia/Novosibirsk
|
||||
+06:00 RU 1243165 Asia/Omsk
|
||||
+05:00 KZ 364799 Asia/Oral
|
||||
+07:00 KH 4111780 Asia/Phnom_Penh
|
||||
+07:00 ID 1819584 Asia/Pontianak
|
||||
+09:00 KP 12876883 Asia/Pyongyang
|
||||
+03:00 QA 1566088 Asia/Qatar
|
||||
+05:00 KZ 529104 Asia/Qostanay
|
||||
+05:00 KZ 511391 Asia/Qyzylorda
|
||||
+03:00 SA 23913997 Asia/Riyadh
|
||||
+11:00 RU 326982 Asia/Sakhalin
|
||||
+05:00 UZ 3864475 Asia/Samarkand
|
||||
+09:00 KR 47400555 Asia/Seoul
|
||||
+08:00 CN 861293141 Asia/Shanghai
|
||||
+08:00 SG 11621053 Asia/Singapore
|
||||
+11:00 RU 15000 Asia/Srednekolymsk
|
||||
+08:00 TW 26394699 Asia/Taipei
|
||||
+05:00 UZ 7452125 Asia/Tashkent
|
||||
+04:00 GE 1827911 Asia/Tbilisi
|
||||
+03:30 IR 50648371 Asia/Tehran
|
||||
+06:00 BT 170210 Asia/Thimphu
|
||||
+09:00 JP 141330654 Asia/Tokyo
|
||||
+07:00 RU 783576 Asia/Tomsk
|
||||
+08:00 MN 1438738 Asia/Ulaanbaatar
|
||||
+06:00 CN 12667986 Asia/Urumqi
|
||||
+10:00 RU 15000 Asia/Ust-Nera
|
||||
+07:00 LA 1561716 Asia/Vientiane
|
||||
+10:00 RU 2534711 Asia/Vladivostok
|
||||
+09:00 RU 902983 Asia/Yakutsk
|
||||
+06:30 MM 18836338 Asia/Yangon
|
||||
+05:00 RU 15407217 Asia/Yekaterinburg
|
||||
+04:00 AM 2880620 Asia/Yerevan
|
||||
-01:00 PT 20056 Atlantic/Azores
|
||||
-04:00 BM 15000 Atlantic/Bermuda
|
||||
+00:00 ES 2054431 Atlantic/Canary
|
||||
-01:00 CV 252678 Atlantic/Cape_Verde
|
||||
+00:00 FO 15000 Atlantic/Faroe
|
||||
+00:00 PT 213794 Atlantic/Madeira
|
||||
+00:00 IS 245356 Atlantic/Reykjavik
|
||||
+00:00 SH 15000 Atlantic/St_Helena
|
||||
-03:00 FK 15000 Atlantic/Stanley
|
||||
+09:30 AU 1706678 Australia/Adelaide
|
||||
+10:00 AU 5807246 Australia/Brisbane
|
||||
+09:30 AU 17456 Australia/Broken_Hill
|
||||
+09:30 AU 199509 Australia/Darwin
|
||||
+08:45 AU 15000 Australia/Eucla
|
||||
+10:00 AU 392450 Australia/Hobart
|
||||
+10:00 AU 15000 Australia/Lindeman
|
||||
+10:30 AU 15000 Australia/Lord_Howe
|
||||
+10:00 AU 9304158 Australia/Melbourne
|
||||
+08:00 AU 3086441 Australia/Perth
|
||||
+10:00 AU 9352313 Australia/Sydney
|
||||
+01:00 NL 13892513 Europe/Amsterdam
|
||||
+01:00 AD 36283 Europe/Andorra
|
||||
+04:00 RU 644812 Europe/Astrakhan
|
||||
+02:00 GR 6286690 Europe/Athens
|
||||
+01:00 RS 5756549 Europe/Belgrade
|
||||
+01:00 DE 62740682 Europe/Berlin
|
||||
+01:00 SK 2548401 Europe/Bratislava
|
||||
+01:00 BE 9038306 Europe/Brussels
|
||||
+02:00 RO 11070040 Europe/Bucharest
|
||||
+01:00 HU 9366333 Europe/Budapest
|
||||
+01:00 DE 15000 Europe/Busingen
|
||||
+02:00 MD 1460347 Europe/Chisinau
|
||||
+01:00 DK 3885672 Europe/Copenhagen
|
||||
+01:00 IE 2720758 Europe/Dublin
|
||||
+01:00 GI 26544 Europe/Gibraltar
|
||||
+00:00 GG 16488 Europe/Guernsey
|
||||
+02:00 FI 5265184 Europe/Helsinki
|
||||
+00:00 IM 26218 Europe/Isle_of_Man
|
||||
+03:00 TR 77554557 Europe/Istanbul
|
||||
+00:00 JE 28000 Europe/Jersey
|
||||
+02:00 RU 664545 Europe/Kaliningrad
|
||||
+03:00 RU 782604 Europe/Kirov
|
||||
+02:00 UA 35633582 Europe/Kyiv
|
||||
+00:00 PT 6372176 Europe/Lisbon
|
||||
+01:00 SI 552127 Europe/Ljubljana
|
||||
+00:00 GB 57817786 Europe/London
|
||||
+01:00 LU 131322 Europe/Luxembourg
|
||||
+01:00 ES 42918247 Europe/Madrid
|
||||
+01:00 MT 141714 Europe/Malta
|
||||
+02:00 AX 15000 Europe/Mariehamn
|
||||
+03:00 BY 6105410 Europe/Minsk
|
||||
+01:00 MC 48977 Europe/Monaco
|
||||
+03:00 RU 69342062 Europe/Moscow
|
||||
+01:00 NO 3296711 Europe/Oslo
|
||||
+01:00 FR 33093827 Europe/Paris
|
||||
+01:00 ME 398494 Europe/Podgorica
|
||||
+01:00 CZ 5924565 Europe/Prague
|
||||
+02:00 LV 1206422 Europe/Riga
|
||||
+01:00 IT 34033666 Europe/Rome
|
||||
+04:00 RU 3546813 Europe/Samara
|
||||
+01:00 SM 15000 Europe/San_Marino
|
||||
+01:00 BA 1905798 Europe/Sarajevo
|
||||
+04:00 RU 1705529 Europe/Saratov
|
||||
+03:00 UA 1620906 Europe/Simferopol
|
||||
+01:00 MK 1754303 Europe/Skopje
|
||||
+02:00 BG 4111057 Europe/Sofia
|
||||
+01:00 SE 7149541 Europe/Stockholm
|
||||
+02:00 EE 1106943 Europe/Tallinn
|
||||
+01:00 AL 1629643 Europe/Tirane
|
||||
+04:00 RU 814189 Europe/Ulyanovsk
|
||||
+01:00 LI 15000 Europe/Vaduz
|
||||
+01:00 VA 15000 Europe/Vatican
|
||||
+01:00 AT 5274040 Europe/Vienna
|
||||
+02:00 LT 2103133 Europe/Vilnius
|
||||
+03:00 RU 1837053 Europe/Volgograd
|
||||
+01:00 PL 22720110 Europe/Warsaw
|
||||
+01:00 HR 1650334 Europe/Zagreb
|
||||
+01:00 CH 3461664 Europe/Zurich
|
||||
+03:00 MG 6115943 Indian/Antananarivo
|
||||
+06:00 IO 15000 Indian/Chagos
|
||||
+07:00 CX 15000 Indian/Christmas
|
||||
+06:30 CC 15000 Indian/Cocos
|
||||
+03:00 KM 118353 Indian/Comoro
|
||||
+05:00 TF 15000 Indian/Kerguelen
|
||||
+04:00 SC 22881 Indian/Mahe
|
||||
+05:00 MV 103693 Indian/Maldives
|
||||
+04:00 MU 701493 Indian/Mauritius
|
||||
+03:00 YT 138967 Indian/Mayotte
|
||||
+04:00 RE 804329 Indian/Reunion
|
||||
+13:00 WS 40407 Pacific/Apia
|
||||
+12:00 NZ 5203989 Pacific/Auckland
|
||||
+11:00 PG 40266 Pacific/Bougainville
|
||||
+12:45 NZ 15000 Pacific/Chatham
|
||||
+10:00 FM 15000 Pacific/Chuuk
|
||||
-06:00 CL 15000 Pacific/Easter
|
||||
+11:00 VU 35901 Pacific/Efate
|
||||
+12:00 FJ 334403 Pacific/Fiji
|
||||
+12:00 TV 15000 Pacific/Funafuti
|
||||
-06:00 EC 15000 Pacific/Galapagos
|
||||
-09:00 PF 15000 Pacific/Gambier
|
||||
+11:00 SB 194707 Pacific/Guadalcanal
|
||||
+10:00 GU 121094 Pacific/Guam
|
||||
-10:00 US 1569453 Pacific/Honolulu
|
||||
+13:00 KI 15000 Pacific/Kanton
|
||||
+14:00 KI 15000 Pacific/Kiritimati
|
||||
+11:00 FM 15000 Pacific/Kosrae
|
||||
+12:00 MH 15000 Pacific/Kwajalein
|
||||
+12:00 MH 45701 Pacific/Majuro
|
||||
-09:30 PF 15000 Pacific/Marquesas
|
||||
+12:00 NR 15000 Pacific/Nauru
|
||||
-11:00 NU 15000 Pacific/Niue
|
||||
+11:00 NF 15000 Pacific/Norfolk
|
||||
+11:00 NC 137086 Pacific/Noumea
|
||||
-11:00 AS 15000 Pacific/Pago_Pago
|
||||
+09:00 PW 15000 Pacific/Palau
|
||||
-08:00 PN 15000 Pacific/Pitcairn
|
||||
+11:00 FM 15000 Pacific/Pohnpei
|
||||
+10:00 PG 588589 Pacific/Port_Moresby
|
||||
-10:00 CK 15000 Pacific/Rarotonga
|
||||
+10:00 MP 48220 Pacific/Saipan
|
||||
-10:00 PF 81958 Pacific/Tahiti
|
||||
+12:00 KI 40311 Pacific/Tarawa
|
||||
+13:00 TO 22400 Pacific/Tongatapu
|
||||
+12:00 WF 15000 Pacific/Wallis
|
||||
|
@@ -1 +1 @@
|
||||
["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"]
|
||||
{ "format": "{ua}", "rows": "useragent.tsv" }
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
browser device os ua
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Mobile Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Mobile Safari/537.36
|
||||
Chrome mobile Android Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36
|
||||
Chrome desktop ChromeOS Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36
|
||||
Chrome desktop Linux Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
|
||||
Chrome desktop Linux Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
|
||||
Chrome desktop Linux Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36
|
||||
Chrome desktop Linux Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36
|
||||
Chrome desktop Linux Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36
|
||||
Chrome desktop Linux Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 YaBrowser/26.8.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.34 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36
|
||||
Chrome desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
|
||||
Chrome mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/152.0.7977.64 Mobile/15E148 Safari/604.1
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36
|
||||
Chrome desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
|
||||
Edge desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0
|
||||
Edge desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0
|
||||
Edge desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36 Edg/153.0.0.0
|
||||
Edge desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0
|
||||
Firefox desktop Linux Mozilla/5.0 (X11; Linux x86_64; rv:155.0) Gecko/20100101 Firefox/155.0
|
||||
Firefox desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
|
||||
Firefox desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:154.0) Gecko/20100101 Firefox/154.0
|
||||
Firefox desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0
|
||||
Firefox desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:154.0) Gecko/20100101 Firefox/154.0
|
||||
Firefox desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:155.0) Gecko/20100101 Firefox/155.0
|
||||
Opera desktop Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 OPR/135.0.0.0
|
||||
Opera desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 OPR/134.0.0.0
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7.5 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.3 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5.2 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Mobile/15E148 Safari/604.1
|
||||
Safari mobile iOS Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Mobile/15E148 Safari/604.1
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5.2 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.1 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6.2 Safari/605.1.15
|
||||
Safari desktop macOS Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Safari/605.1.15
|
||||
Samsung Internet mobile Android Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36
|
||||
|
+12
-5
@@ -98,20 +98,27 @@ func TestShippedMiscReferenceData(t *testing.T) {
|
||||
"currency": regexp.MustCompile(`^[A-Z]{3}$`),
|
||||
"currency.name": regexp.MustCompile(`\p{L}`),
|
||||
"currency.symbol": regexp.MustCompile(`^\S+$`),
|
||||
"country": regexp.MustCompile(`\p{L}`),
|
||||
"country.alpha2": regexp.MustCompile(`^[A-Z]{2}$`),
|
||||
"country.alpha3": regexp.MustCompile(`^[A-Z]{3}$`),
|
||||
"territory": regexp.MustCompile(`\p{L}`),
|
||||
"territory.alpha2": regexp.MustCompile(`^[A-Z]{2}$`),
|
||||
"territory.alpha3": regexp.MustCompile(`^[A-Z]{3}$`),
|
||||
"territory.country": regexp.MustCompile(`^[A-Z]{2}$`),
|
||||
"language": regexp.MustCompile(`\p{L}`),
|
||||
"language.code": regexp.MustCompile(`^[a-z]{2}$`),
|
||||
"language.code3": regexp.MustCompile(`^[a-z]{3}$`),
|
||||
"timezone": regexp.MustCompile(`^([A-Za-z_]+(/[A-Za-z_]+)+|UTC)$`),
|
||||
"timezone": regexp.MustCompile(`^[A-Za-z]+(/[A-Za-z0-9_+-]+)+$`),
|
||||
"timezone.offset": regexp.MustCompile(`^[+-](0\d|1[0-4]):[0-5]\d$`),
|
||||
"timezone.territory": regexp.MustCompile(`^[A-Z]{2}$`),
|
||||
"timezone.weight": regexp.MustCompile(`^[1-9]\d*$`),
|
||||
"mimetype": regexp.MustCompile(`^[a-z]+/[a-z0-9.+-]+$`),
|
||||
"mimetype.ext": regexp.MustCompile(`^\.[a-z0-9_-]+$`),
|
||||
"httpstatus": regexp.MustCompile(`^[1-5]\d{2} \S.*$`),
|
||||
"httpstatus.code": regexp.MustCompile(`^[1-5]\d{2}$`),
|
||||
"useragent": regexp.MustCompile(`^Mozilla/5\.0 .+`),
|
||||
"useragent.browser": regexp.MustCompile(`^(Chrome|Edge|Firefox|Opera|Safari|Samsung Internet)$`),
|
||||
"useragent.device": regexp.MustCompile(`^(desktop|mobile)$`),
|
||||
"useragent.os": regexp.MustCompile(`^(Android|ChromeOS|Linux|Windows|iOS|macOS)$`),
|
||||
"car": regexp.MustCompile(`^\S.* \S`),
|
||||
"car.maker": regexp.MustCompile(`^\S`),
|
||||
"car.make": regexp.MustCompile(`^\S`),
|
||||
}
|
||||
for i := 0; i < 100; i++ {
|
||||
for p, rx := range re {
|
||||
|
||||
+3
-3
@@ -108,9 +108,9 @@ func TestFakeTemplateErrors(t *testing.T) {
|
||||
{`name: {/no.such.path}`, "no entry"},
|
||||
{`name: {..nope}`, "write {/nope}"},
|
||||
{`{"format":"x"}`, "is a string"},
|
||||
{`{/misc.country} {/misc.country.alpha2}`, "renders a level that {/misc.country.alpha2} reads a path into; name the fields you want instead, or draw them apart with a drawGroup"},
|
||||
{`{"format":"{/misc.country.alpha2} {x}","x":"{/misc.country}"}`, "reads a path into"},
|
||||
{`{"format":"{/misc.country.alpha2}","drawGroup":"g"}`, "nothing can reference"},
|
||||
{`{/misc.territory} {/misc.territory.alpha2}`, "renders a level that {/misc.territory.alpha2} reads a path into; name the fields you want instead, or draw them apart with a drawGroup"},
|
||||
{`{"format":"{/misc.territory.alpha2} {x}","x":"{/misc.territory}"}`, "reads a path into"},
|
||||
{`{"format":"{/misc.territory.alpha2}","drawGroup":"g"}`, "nothing can reference"},
|
||||
} {
|
||||
_, err := f.FakeTemplate(c.input)
|
||||
if err == nil || !strings.Contains(err.Error(), c.want) {
|
||||
|
||||
+1
-1
@@ -154,7 +154,7 @@ func TestListedPathsAllRender(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, p := range []string{"misc.car.maker", "misc.country.alpha2", "misc.country.numeric", "misc.currency.symbol", "misc.httpstatus.code", "misc.mimetype.ext"} {
|
||||
for _, p := range []string{"misc.car.make", "misc.territory.alpha2", "misc.territory.numeric", "misc.currency.symbol", "misc.httpstatus.code", "misc.mimetype.ext"} {
|
||||
if !slices.Contains(paths, p) {
|
||||
t.Errorf("List() omits %q, which the README advertises and Fake renders", p)
|
||||
}
|
||||
|
||||
+127
-22
@@ -6,6 +6,7 @@ import (
|
||||
"reflect"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
@@ -644,17 +645,17 @@ func TestTableRowsAreAlternatives(t *testing.T) {
|
||||
|
||||
func TestTableOverridesByLayering(t *testing.T) {
|
||||
mine := writeFiles(t, map[string]string{
|
||||
"misc/country.json": `{"format":"{name}","rows":"country.tsv","key":"alpha2"}`,
|
||||
"misc/country.tsv": "alpha2\tname\nXX\tNowhere\nYY\tElsewhere\n",
|
||||
"misc/language.json": `{"format":"{name}","rows":"language.tsv","key":"code"}`,
|
||||
"misc/language.tsv": "code\tname\nxx\tNowhere\nyy\tElsewhere\n",
|
||||
})
|
||||
f, err := New(WithDataPath(mine), WithSeed(1))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if v := fake(t, f, "misc.country[XX]"); v != "Nowhere" {
|
||||
t.Fatalf("misc.country[XX] = %q, want the layered table", v)
|
||||
if v := fake(t, f, "misc.language[xx]"); v != "Nowhere" {
|
||||
t.Fatalf("misc.language[xx] = %q, want the layered table", v)
|
||||
}
|
||||
if paths := f.List(); slices.Contains(paths, "misc.country.alpha3") {
|
||||
if paths := f.List(); slices.Contains(paths, "misc.language.code3") {
|
||||
t.Fatal("List() still offers the shipped table's columns under an overridden category")
|
||||
}
|
||||
}
|
||||
@@ -662,14 +663,18 @@ func TestTableOverridesByLayering(t *testing.T) {
|
||||
func TestShippedTables(t *testing.T) {
|
||||
f := newGenerator(t, "data/misc", WithSeed(1))
|
||||
for path, want := range map[string]string{
|
||||
"country[SE]": "Sweden",
|
||||
"country[Sweden].alpha3": "SWE",
|
||||
"country[SE].numeric": "752",
|
||||
"country[SE].tld": ".se",
|
||||
"country[SE].calling-code": "46",
|
||||
"country[SE].capital": "Stockholm",
|
||||
"country[SE].currency": "SEK",
|
||||
"country[SE].flag": "🇸🇪",
|
||||
"territory[SE]": "Sweden",
|
||||
"territory[Sweden].alpha3": "SWE",
|
||||
"territory[SE].numeric": "752",
|
||||
"territory[SE].tld": ".se",
|
||||
"territory[SE].calling-code": "46",
|
||||
"territory[SE].capital": "Stockholm",
|
||||
"territory[SE].currency": "SEK",
|
||||
"territory[SE].flag": "🇸🇪",
|
||||
"territory[SE].country": "SE",
|
||||
"territory[GL]": "Greenland",
|
||||
"territory[GL].country": "DK",
|
||||
"territory[Åland Islands].country": "FI",
|
||||
"currency[SEK].name": "Swedish Krona",
|
||||
"currency[SEK].symbol": "kr",
|
||||
"currency[SEK].numeric": "752",
|
||||
@@ -691,19 +696,26 @@ func TestShippedTables(t *testing.T) {
|
||||
"mimetype[.mp3]": "audio/mpeg",
|
||||
"mimetype[.mp4]": "video/mp4",
|
||||
"mimetype[.ogg]": "audio/ogg",
|
||||
"timezone[Europe/Stockholm]": "Europe/Stockholm",
|
||||
"timezone[Europe/Stockholm].offset": "+01:00",
|
||||
"timezone[Asia/Kathmandu].offset": "+05:45",
|
||||
"timezone[America/New_York].offset": "-05:00",
|
||||
"territory[SE].timezone": "Europe/Stockholm",
|
||||
"territory[NP].timezone.offset": "+05:45",
|
||||
} {
|
||||
if got := fake(t, f, path); got != want {
|
||||
t.Errorf("Fake(%q) = %q, want %q", path, got, want)
|
||||
}
|
||||
}
|
||||
re := map[string]*regexp.Regexp{
|
||||
"country.numeric": regexp.MustCompile(`^\d{3}$`),
|
||||
"country.tld": regexp.MustCompile(`^\.[a-z]{2}$`),
|
||||
"country.calling-code": regexp.MustCompile(`^\d{1,4}(-\d{3})?$`),
|
||||
"country.capital": regexp.MustCompile(`\p{L}`),
|
||||
"country.currency": regexp.MustCompile(`^[A-Z]{3}$`),
|
||||
"country.flag": regexp.MustCompile(`^[\x{1F1E6}-\x{1F1FF}]{2}$`),
|
||||
"country.languages": regexp.MustCompile(`^[a-z]{2,3}(-[A-Z]{2})?(,[a-z]{2,3}(-[A-Z]{2})?)*$`),
|
||||
"territory.numeric": regexp.MustCompile(`^\d{3}$`),
|
||||
"territory.tld": regexp.MustCompile(`^\.[a-z]{2}$`),
|
||||
"territory.calling-code": regexp.MustCompile(`^\d{1,4}(-\d{3})?$`),
|
||||
"territory.capital": regexp.MustCompile(`\p{L}`),
|
||||
"territory.country": regexp.MustCompile(`^[A-Z]{2}$`),
|
||||
"territory.currency": regexp.MustCompile(`^[A-Z]{3}$`),
|
||||
"territory.flag": regexp.MustCompile(`^[\x{1F1E6}-\x{1F1FF}]{2}$`),
|
||||
"territory.languages": regexp.MustCompile(`^[a-z]{2,3}(-[A-Z]{2})?(,[a-z]{2,3}(-[A-Z]{2})?)*$`),
|
||||
"currency.numeric": regexp.MustCompile(`^\d{3}$`),
|
||||
"currency.decimals": regexp.MustCompile(`^[0-4]$`),
|
||||
}
|
||||
@@ -716,11 +728,104 @@ func TestShippedTables(t *testing.T) {
|
||||
}
|
||||
count := map[string]bool{}
|
||||
for i := 0; i < 5000; i++ {
|
||||
count[fake(t, f, "country.alpha2")] = true
|
||||
count[fake(t, f, "territory.alpha2")] = true
|
||||
}
|
||||
if len(count) < 200 {
|
||||
t.Fatalf("country draws %d distinct rows in 5000, want the full register", len(count))
|
||||
t.Fatalf("territory draws %d distinct rows in 5000, want the full register", len(count))
|
||||
}
|
||||
for i := 0; i < 200; i++ {
|
||||
got := fakeTemplate(t, f, `{/territory.alpha2} {/timezone.territory}`)
|
||||
if drawn, zone, _ := strings.Cut(got, " "); drawn != zone {
|
||||
t.Fatalf("%q: a territory and a timezone in one render disagree on the territory", got)
|
||||
}
|
||||
}
|
||||
zones := map[string]int{}
|
||||
for i := 0; i < 2000; i++ {
|
||||
zones[fake(t, f, "territory[US].timezone")]++
|
||||
}
|
||||
if peopled := zones["America/New_York"] + zones["America/Chicago"] + zones["America/Los_Angeles"] + zones["America/Denver"]; peopled < 1600 {
|
||||
t.Fatalf("the four zones most Americans live in take %d of 2000 US draws, want the population weight to favour them", peopled)
|
||||
}
|
||||
}
|
||||
|
||||
// TestEveryTerritoryNamesAShippedCountry proves what no parent can: the sovereign a
|
||||
// territory names is a row of the same table, which a link would make a cycle.
|
||||
func TestEveryTerritoryNamesAShippedCountry(t *testing.T) {
|
||||
head, rows := shippedRows(t, "territory.tsv", "alpha2", "country")
|
||||
keys := map[string]bool{}
|
||||
for _, r := range rows {
|
||||
keys[r[head["alpha2"]]] = true
|
||||
}
|
||||
for i, r := range rows {
|
||||
if c := r[head["country"]]; !keys[c] {
|
||||
t.Errorf("territory.tsv line %d: country %q is no alpha2 of the table", i+2, c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestEveryUserAgentColumnAgreesWithItsString pins what the column regexes cannot:
|
||||
// every Chromium fork carries Chrome's token, so a mis-ordered pattern relabels a
|
||||
// row rather than dropping it.
|
||||
func TestEveryUserAgentColumnAgreesWithItsString(t *testing.T) {
|
||||
head, rows := shippedRows(t, "useragent.tsv", "browser", "device", "os", "ua")
|
||||
for _, token := range []struct{ in, browser string }{
|
||||
{"Edg", "Edge"}, {"OPR/", "Opera"}, {"SamsungBrowser/", "Samsung Internet"}, {"CriOS/", "Chrome"},
|
||||
} {
|
||||
for i, r := range rows {
|
||||
if strings.Contains(r[head["ua"]], token.in) && r[head["browser"]] != token.browser {
|
||||
t.Errorf("useragent.tsv line %d: %q carries %q but is labelled %q", i+2, r[head["ua"]], token.in, r[head["browser"]])
|
||||
}
|
||||
}
|
||||
}
|
||||
for i, r := range rows {
|
||||
if r[head["device"]] == "mobile" && r[head["os"]] != "Android" && r[head["os"]] != "iOS" {
|
||||
t.Errorf("useragent.tsv line %d: a mobile row runs %q", i+2, r[head["os"]])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestEveryTimezoneRowIsWellFormed scans the file rather than drawing: the draw is
|
||||
// population-weighted, so it samples the populous head and leaves most rows unrendered.
|
||||
func TestEveryTimezoneRowIsWellFormed(t *testing.T) {
|
||||
head, rows := shippedRows(t, "timezone.tsv", "offset", "territory", "weight", "zone")
|
||||
offset := regexp.MustCompile(`^[+-](0\d|1[0-4]):[0-5]\d$`)
|
||||
for i, r := range rows {
|
||||
if !offset.MatchString(r[head["offset"]]) {
|
||||
t.Errorf("timezone.tsv line %d: offset %q is no ±HH:MM", i+2, r[head["offset"]])
|
||||
}
|
||||
if w, err := strconv.Atoi(r[head["weight"]]); err != nil || w < 1 {
|
||||
t.Errorf("timezone.tsv line %d: weight %q is not a positive number", i+2, r[head["weight"]])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// shippedRows reads a shipped misc TSV as the loader does, proving it names the
|
||||
// columns asked for and that every row fills them.
|
||||
func shippedRows(t *testing.T, file string, want ...string) (map[string]int, [][]string) {
|
||||
t.Helper()
|
||||
data, err := os.ReadFile(filepath.Join("data", "misc", file))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
lines := strings.Split(strings.TrimSuffix(string(data), "\n"), "\n")
|
||||
head := map[string]int{}
|
||||
for i, name := range strings.Split(lines[0], "\t") {
|
||||
head[name] = i
|
||||
}
|
||||
for _, name := range want {
|
||||
if _, ok := head[name]; !ok {
|
||||
t.Fatalf("%s columns %v, want %v", file, lines[0], want)
|
||||
}
|
||||
}
|
||||
rows := make([][]string, 0, len(lines)-1)
|
||||
for i, line := range lines[1:] {
|
||||
cells := strings.Split(line, "\t")
|
||||
if len(cells) != len(head) {
|
||||
t.Fatalf("%s line %d has %d cells, want %d", file, i+2, len(cells), len(head))
|
||||
}
|
||||
rows = append(rows, cells)
|
||||
}
|
||||
return head, rows
|
||||
}
|
||||
|
||||
// TestNamedTableWithoutAKeyResolvesInsideItsParent pins a table whose rows are
|
||||
|
||||
Vendored
+30
-16
@@ -213,23 +213,12 @@ geo.US.street format "{name}" weight addresses parent locality
|
||||
geo.US.street.addresses string
|
||||
geo.US.street.locality string
|
||||
geo.US.street.name string
|
||||
misc.car
|
||||
misc.car.maker
|
||||
misc.car.model
|
||||
misc.car format "{make} {model}"
|
||||
misc.car.make string
|
||||
misc.car.model string
|
||||
misc.coordinate format "{lat}, {lon}"
|
||||
misc.coordinate.lat string
|
||||
misc.coordinate.lon string
|
||||
misc.country format "{name}" key alpha2 name name
|
||||
misc.country.alpha2 string
|
||||
misc.country.alpha3 string
|
||||
misc.country.calling-code string
|
||||
misc.country.capital string
|
||||
misc.country.currency string
|
||||
misc.country.flag string
|
||||
misc.country.languages string
|
||||
misc.country.name string
|
||||
misc.country.numeric string
|
||||
misc.country.tld string
|
||||
misc.creditcard
|
||||
misc.creditcard.d
|
||||
misc.currency format "{code}" key code name name
|
||||
@@ -252,8 +241,33 @@ misc.mimetype format "{type}" key type name ext
|
||||
misc.mimetype.ext string
|
||||
misc.mimetype.type string
|
||||
misc.objectid format "{hex(24)}"
|
||||
misc.timezone
|
||||
misc.useragent
|
||||
misc.territory format "{name}" key alpha2 name name
|
||||
misc.territory.alpha2 string
|
||||
misc.territory.alpha3 string
|
||||
misc.territory.calling-code string
|
||||
misc.territory.capital string
|
||||
misc.territory.country string
|
||||
misc.territory.currency string
|
||||
misc.territory.flag string
|
||||
misc.territory.languages string
|
||||
misc.territory.name string
|
||||
misc.territory.numeric string
|
||||
misc.territory.timezone
|
||||
misc.territory.timezone.offset
|
||||
misc.territory.timezone.territory
|
||||
misc.territory.timezone.weight
|
||||
misc.territory.timezone.zone
|
||||
misc.territory.tld string
|
||||
misc.timezone format "{zone}" key zone weight weight parent territory
|
||||
misc.timezone.offset string
|
||||
misc.timezone.territory string
|
||||
misc.timezone.weight string
|
||||
misc.timezone.zone string
|
||||
misc.useragent format "{ua}"
|
||||
misc.useragent.browser string
|
||||
misc.useragent.device string
|
||||
misc.useragent.os string
|
||||
misc.useragent.ua string
|
||||
misc.uuid format "{hex(8)}-{hex(4)}-4{hex(3)}-{variant}{hex(3)}-{hex(12)}"
|
||||
misc.uuid.variant string
|
||||
sv_SE.address format "{street} {street-number}\n{postal-code} {locality}" reads geo.SE.address
|
||||
|
||||
@@ -22,7 +22,7 @@ value is composed; TSV says which values exist.
|
||||
- In a data file, refuse a choice whose items are templates with one identical
|
||||
field set, naming the TSV to write; an inline template is exempt, having no
|
||||
file. A choice of strings stays a choice.
|
||||
- Convert `misc.timezone`, `car` and `useragent` to tables.
|
||||
- Convert `misc.timezone`, `car` and `useragent` to tables — done in step 4.
|
||||
- Let a path select a row by key or by name, `geo.SE.municipality[0180]` and
|
||||
`geo.SE.municipality[Stockholm]`, and descend to a linked table by name,
|
||||
`geo.SE.region[Skåne län].street`; a key or a linked table name may not equal
|
||||
@@ -32,7 +32,7 @@ value is composed; TSV says which values exist.
|
||||
- Draw linked tables consistently within one render and draw group: the first
|
||||
table drawn pins its ancestors, and a descendant is drawn inside them.
|
||||
- Keep country data under `geo/<alpha2>/`; a locale's `address` reads its
|
||||
country's tree by reference, and a locale's `country` table carries the
|
||||
country's tree by reference, and a locale's `territory` table carries the
|
||||
localised names keyed by alpha2.
|
||||
- Ship full registers as packs, each a Go module with its own `embed.FS` and a
|
||||
zip for `--data-path`; the default embed stays under ~1 MB per country and
|
||||
@@ -109,7 +109,7 @@ ids. Shape: T = table, t = template, c = choice.
|
||||
| `word` noun, verb, adjective, adverb; `sentence` | T+t | SALDO | CC BY 4.0 |
|
||||
| `date`, `time`, month and weekday names, `holiday` | t+T | CLDR sv, lag 1989:253 | Unicode |
|
||||
| `price` `1 234,56 kr`, `email` domains, `url` `.se`/`.nu` | t | curated | — |
|
||||
| `country` localised names keyed by alpha2 | T | CLDR sv territory names | Unicode |
|
||||
| `territory` localised names keyed by alpha2 | T | CLDR sv territory names | Unicode |
|
||||
| `address` | t | `{/geo.SE…}` | — |
|
||||
|
||||
`en_US` (`research-sources-world.md`, part1–4)
|
||||
@@ -131,13 +131,13 @@ ids. Shape: T = table, t = template, c = choice.
|
||||
|
||||
| Category | Shape | Source | Licence |
|
||||
|---|---|---|---|
|
||||
| `country` name, alpha2, alpha3, numeric, calling code, TLD, capital, currency, flag, languages | T | datasets/country-codes | PDDL |
|
||||
| `territory` name, alpha2, alpha3, numeric, calling code, TLD, capital, country, currency, flag, languages | T | datasets/country-codes | PDDL |
|
||||
| `currency` code, numeric, name, symbol, decimals | T | ISO 4217 list-one, CLDR symbols | free, Unicode |
|
||||
| `language` ISO 639-1/2 | T | LoC | public domain |
|
||||
| `timezone` zone, country, offset | T | tzdb zone1970.tab | public domain |
|
||||
| `timezone` zone, territory, offset | T | tzdb zone.tab | public domain |
|
||||
| `mimetype` type, extensions | T | IANA + mime-db | CC0, MIT |
|
||||
| `httpstatus`, `httpmethod`, `port`, `tld`, `protocol`, `loglevel` | T/c | IANA | CC0 |
|
||||
| `useragent` per browser | T | top-user-agents | MIT |
|
||||
| `useragent` browser, device, os; selection per browser once `browser` is a table | T | top-user-agents | MIT |
|
||||
| `ip` v4 documentation ranges, private, CIDR; `ipv6` `2001:db8::/32`; `mac` locally administered | t | RFC 5737, 1918, 9637 | facts |
|
||||
| `creditcard` per network: IIN, length, CVV, expiry | T+t | network rules, `{luhn()}` | facts |
|
||||
| `bic`, `iban` (exists), `isin`, `cusip` | t | structure rules | facts |
|
||||
@@ -172,11 +172,19 @@ address, phone, national id, company and date names each.
|
||||
spelling a tag takes rather than the reference spelling.
|
||||
4. `misc` conversions and the new `misc` tables. Convert `timezone`, `car` and
|
||||
`useragent`, and add the new `misc` tables.
|
||||
5. The remaining locale categories: company, phone, finance, vehicle, words.
|
||||
6. Records with building-block columns across the shipped set; shape re-pin.
|
||||
5. Give the hand-written sets a source, as goal 10 asks: read `misc.emoji` from
|
||||
the Unicode emoji-test.txt register, and `misc.car` from an international make
|
||||
and model source, vPIC and Mobility Sweden being national and so `en_US.car`'s
|
||||
and `sv_SE.car`'s.
|
||||
6. The remaining locale categories: company, phone, finance, vehicle, words.
|
||||
7. Records with building-block columns across the shipped set; shape re-pin.
|
||||
|
||||
### Release
|
||||
|
||||
- Rewrite `[Unreleased]` as what v0.1.0 holds, not as a diff against `main`: nothing
|
||||
has shipped, so "no longer paths", "where it used to fail" and "where it used to be
|
||||
an empty string" describe versions no reader can have installed.
|
||||
|
||||
- CLI without Go — investigate prebuilt binaries: GoReleaser attaching them to
|
||||
the Gitea release the tag workflow publishes, a container image, Homebrew and
|
||||
Scoop. A checkout build prints `devel` for `--version`; the binaries carry the stamped tag.
|
||||
|
||||
Reference in New Issue
Block a user