diff --git a/.github/workflows/approve.yml b/.github/workflows/approve.yml
index 709a500f4c..91127dc4a6 100644
--- a/.github/workflows/approve.yml
+++ b/.github/workflows/approve.yml
@@ -5,19 +5,19 @@ on:
permissions:
pull-requests: write
+ checks: write
+ contents: write
+ statuses: read
jobs:
check:
runs-on: ubuntu-latest
steps:
- - uses: github/privileged-requester@1029a708aefc8cc53feef67c46df7b72c3b634b6 # v1.1.0
+ - uses: github/privileged-requester@f8d60d9344e1c10976aad5c1af0c7c977badd677 # v2.1.0
if: ${{ github.event.requested_reviewer.login == 'InReach-svc'}}
with:
- myToken: ${{ secrets.GITHUB_TOKEN }}
- robotUserToken: ${{ secrets.GH_ACT_PAT }}
+ github_token: ${{ secrets.GH_ACT_PAT }}
path: .github/autoapprove-config.yaml
- prCreator: ${{ github.event.pull_request.user.login }}
- prNumber: ${{ github.event.pull_request.number }}
checkCommits: 'false'
checkDiff: 'false'
checkLabels: 'false'
diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml
index e711536406..578a15c100 100644
--- a/.github/workflows/chromatic.yml
+++ b/.github/workflows/chromatic.yml
@@ -49,7 +49,7 @@ jobs:
# 👇 Runs Chromatic CLI in ./packages/ui
- name: Publish to Chromatic
- uses: chromaui/action@b52e14dd333579901e7099e0094b652e8284dea9 # v1
+ uses: chromaui/action@2f12dc37555ffc9ed980d883e96b6d03724a2d6a # v10
with:
workingDir: packages/ui
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 5fd81bedbb..a8e227c2af 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -21,6 +21,6 @@ jobs:
- name: ⤵️ Check out code from GitHub
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: 🏗 Initialize CodeQL
- uses: github/codeql-action/init@689fdc5193eeb735ecb2e52e819e3382876f93f4 # v2
+ uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2
- name: 🚀 Perform CodeQL Analysis
- uses: github/codeql-action/analyze@689fdc5193eeb735ecb2e52e819e3382876f93f4 # v2
+ uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2
diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml
index aa33fb82ac..08e36195ec 100644
--- a/.github/workflows/crowdin.yml
+++ b/.github/workflows/crowdin.yml
@@ -14,14 +14,14 @@ on:
- renovate/*
workflow_dispatch:
schedule:
- # ┌───────────── minute (0 - 59)
- # │ ┌───────────── hour (0 - 23)
- # │ │ ┌───────────── day of the month (1 - 31)
- # │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
- # │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
- # │ │ │ │ │
- # │ │ │ │ │
- # │ │ │ │ │
+ # ┌───────────── minute (0 - 59)
+ # │ ┌───────────── hour (0 - 23)
+ # │ │ ┌───────────── day of the month (1 - 31)
+ # │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
+ # │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
+ # │ │ │ │ │
+ # │ │ │ │ │
+ # │ │ │ │ │
- cron: 0 8 * * *
jobs:
@@ -80,15 +80,15 @@ jobs:
- name: Push sources to Crowdin
if: github.event_name != 'pull_request' && !startsWith(github.ref_name, 'l10n_')
- run: crowdin push sources -b ${{ steps.sanitizebranch.outputs.value }}
+ run: crowdin push sources -b ${{ steps.sanitizebranch.outputs.value }} --no-progress
- name: Synchronize sources to Crowdin
if: steps.sanitizebranch.outputs.value == 'main'
- run: crowdin push sources -b ${{ steps.sanitizebranch.outputs.value }}
+ run: crowdin push sources -b ${{ steps.sanitizebranch.outputs.value }} --no-progress
- name: Pull updated translations from Crowdin
if: (github.event_name != 'pull_request' && github.ref_name == 'dev') || github.event_name == 'scheduled'
- run: crowdin pull -b ${{ steps.sanitizebranch.outputs.value }}
+ run: crowdin pull -b ${{ steps.sanitizebranch.outputs.value }} --no-progress
- name: Check for updated files
if: (github.event_name != 'pull_request' && github.ref_name == 'dev') || github.event_name == 'scheduled'
@@ -110,6 +110,7 @@ jobs:
if: ((github.event_name != 'pull_request' && github.ref_name == 'dev') || github.event_name == 'scheduled') && steps.verify-changed-files.outputs.files_changed
uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38 # v5
with:
+ token: ${{ secrets.GH_ACT_PAT }}
commit-message: Updated translations from Crowdin
committer: 'InReach [bot] <108850934+InReach-svc@users.noreply.github.com>'
author: 'InReach [bot] <108850934+InReach-svc@users.noreply.github.com>'
@@ -124,4 +125,4 @@ jobs:
- name: Delete Crowdin Branch
if: github.event_name == 'pull_request' && github.ref_name != 'l10n_dev' && steps.sanitizebranch.outputs.value != 'dev' && steps.sanitizebranch.outputs.value != 'main'
- run: crowdin branch delete ${{ steps.sanitizebranch.outputs.value }}
+ run: crowdin branch delete ${{ steps.sanitizebranch.outputs.value }} --no-progress
diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
index 447cee1248..e84bcf29f7 100644
--- a/.github/workflows/lock.yml
+++ b/.github/workflows/lock.yml
@@ -11,7 +11,7 @@ jobs:
name: 🔒 Lock closed issues and PRs
runs-on: ubuntu-latest
steps:
- - uses: dessant/lock-threads@d42e5f49803f3c4e14ffee0378e31481265dda22 # v5.0.0
+ - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1
with:
github-token: ${{ github.token }}
issue-inactive-days: '30'
diff --git a/.github/workflows/nextjs_bundle_analysis.yml b/.github/workflows/nextjs_bundle_analysis.yml
index d7cbe0eea4..2d3a8faa84 100644
--- a/.github/workflows/nextjs_bundle_analysis.yml
+++ b/.github/workflows/nextjs_bundle_analysis.yml
@@ -36,7 +36,6 @@ jobs:
name: Install pnpm
id: pnpm-install
with:
- version: 8
run_install: false
- name: Install Node.js
diff --git a/.nvmrc b/.nvmrc
index 87ec8842b1..d5a159609d 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-18.18.2
+20.10.0
diff --git a/InReach.code-workspace b/InReach.code-workspace
index 9bd9efc9e8..1927e06356 100644
--- a/InReach.code-workspace
+++ b/InReach.code-workspace
@@ -178,7 +178,9 @@
},
"files.exclude": {
".next/": true,
+ ".trace/": true,
".turbo/": true,
+ ".vercel/": true,
"*.tsbuildinfo": true,
"**/.DS_Store": true,
"**/.git": true,
diff --git a/apps/app/next.config.mjs b/apps/app/next.config.mjs
index 2c030f9052..ee813f1283 100644
--- a/apps/app/next.config.mjs
+++ b/apps/app/next.config.mjs
@@ -30,14 +30,15 @@ const nextConfig = {
reactStrictMode: true,
swcMinify: true,
transpilePackages: [
- // '@weareinreach/analytics',
+ '@weareinreach/analytics',
'@weareinreach/api',
'@weareinreach/auth',
- // '@weareinreach/crowdin',
+ '@weareinreach/config',
+ '@weareinreach/crowdin',
'@weareinreach/db',
- // '@weareinreach/env',
+ '@weareinreach/env',
'@weareinreach/ui',
- // '@weareinreach/util',
+ '@weareinreach/util',
],
compiler: {
...(isVercelProd ? { removeConsole: { exclude: ['error'] } } : {}),
@@ -72,7 +73,7 @@ const nextConfig = {
tunnelRoute: '/monitoring',
// Hides source maps from generated client bundles
- hideSourceMaps: false,
+ hideSourceMaps: true,
// Automatically tree-shake Sentry logger statements to reduce bundle size
disableLogger: isVercelProd || isVercelActiveDev,
@@ -81,6 +82,9 @@ const nextConfig = {
if (isServer) {
config.plugins = [...config.plugins, new PrismaPlugin()]
}
+
+ config.devtool = 'eval-source-map'
+
if (!isLocalDev) {
config.plugins.push(
new webpack.DefinePlugin({
diff --git a/apps/app/package.json b/apps/app/package.json
index 3a93c5ee05..9f34881069 100644
--- a/apps/app/package.json
+++ b/apps/app/package.json
@@ -35,7 +35,7 @@
"@mantine/notifications": "6.0.21",
"@mantine/nprogress": "6.0.21",
"@mantine/utils": "6.0.21",
- "@next/bundle-analyzer": "14.0.2",
+ "@next/bundle-analyzer": "14.0.3",
"@opentelemetry/api": "1.7.0",
"@opentelemetry/core": "1.18.1",
"@opentelemetry/exporter-trace-otlp-http": "0.45.1",
@@ -45,18 +45,18 @@
"@opentelemetry/sdk-trace-node": "1.18.1",
"@opentelemetry/semantic-conventions": "1.18.1",
"@prisma/instrumentation": "5.6.0",
- "@sentry/browser": "7.80.1",
- "@sentry/nextjs": "7.80.1",
- "@sentry/node": "7.80.1",
- "@sentry/opentelemetry": "7.80.1",
- "@sentry/opentelemetry-node": "7.80.1",
+ "@sentry/browser": "7.85.0",
+ "@sentry/nextjs": "7.85.0",
+ "@sentry/node": "7.85.0",
+ "@sentry/opentelemetry": "7.85.0",
+ "@sentry/opentelemetry-node": "7.85.0",
"@sentry/profiling-node": "1.2.6",
"@tanstack/react-query": "4.36.1",
"@tanstack/react-table": "8.10.7",
- "@trpc/client": "10.43.2",
- "@trpc/next": "10.43.2",
- "@trpc/react-query": "10.43.2",
- "@trpc/server": "10.43.2",
+ "@trpc/client": "10.44.1",
+ "@trpc/next": "10.44.1",
+ "@trpc/react-query": "10.44.1",
+ "@trpc/server": "10.44.1",
"@vercel/analytics": "1.1.1",
"@vercel/edge-config": "0.4.1",
"@vercel/kv": "1.0.0",
@@ -68,22 +68,22 @@
"@weareinreach/env": "workspace:*",
"@weareinreach/ui": "workspace:*",
"@weareinreach/util": "workspace:*",
- "cookies-next": "4.0.0",
+ "cookies-next": "4.1.0",
"dayjs": "1.11.10",
"embla-carousel-autoplay": "7.1.0",
"embla-carousel-react": "7.1.0",
"flat": "6.0.1",
- "i18next": "23.7.6",
+ "i18next": "23.7.7",
"i18next-browser-languagedetector": "7.2.0",
"i18next-chained-backend": "4.6.2",
- "i18next-http-backend": "2.4.1",
+ "i18next-http-backend": "2.4.2",
"i18next-intervalplural-postprocessor": "3.0.0",
"i18next-multiload-backend-adapter": "2.3.0",
"just-compact": "3.2.0",
"just-compare": "2.3.0",
"luxon": "3.4.4",
"mantine-react-table": "1.3.4",
- "next": "14.0.2",
+ "next": "14.0.3",
"next-auth": "4.24.5",
"next-i18next": "15.0.0",
"next-seo": "6.4.0",
@@ -94,42 +94,42 @@
"react": "18.2.0",
"react-dom": "18.2.0",
"react-error-boundary": "4.0.11",
- "react-hook-consent": "3.5.1",
+ "react-hook-consent": "3.5.2",
"react-hook-form": "7.48.2",
"react-hook-form-mantine": "2.0.0",
- "react-i18next": "13.4.1",
+ "react-i18next": "13.5.0",
"zod": "3.22.4"
},
"devDependencies": {
"@hookform/devtools": "4.3.1",
- "@playwright/test": "1.39.0",
+ "@playwright/test": "1.40.1",
"@prisma/nextjs-monorepo-workaround-plugin": "5.6.0",
"@tanstack/react-query-devtools": "4.36.1",
"@tanstack/react-table-devtools": "8.7.6",
"@total-typescript/ts-reset": "0.5.1",
- "@types/eslint": "8.44.7",
+ "@types/eslint": "8.44.8",
"@types/gtag.js": "0.0.18",
- "@types/luxon": "3.3.4",
- "@types/node": "18.18.9",
- "@types/react": "18.2.37",
- "@types/react-dom": "18.2.15",
+ "@types/luxon": "3.3.7",
+ "@types/node": "20.10.3",
+ "@types/react": "18.2.42",
+ "@types/react-dom": "18.2.17",
"@types/umami": "0.1.5",
- "@typescript-eslint/eslint-plugin": "6.11.0",
- "@typescript-eslint/parser": "6.11.0",
+ "@typescript-eslint/eslint-plugin": "6.13.2",
+ "@typescript-eslint/parser": "6.13.2",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
"commander": "11.1.0",
"dotenv": "16.3.1",
- "eslint": "8.53.0",
+ "eslint": "8.55.0",
"eslint-plugin-i18next": "6.0.3",
- "listr2": "7.0.2",
+ "listr2": "8.0.0",
"prettier": "3.1.0",
"trpc-client-devtools-link": "0.2.1-next",
"trpc-panel": "1.3.4",
"trpc-playground": "1.0.4",
- "type-fest": "4.7.1",
- "typescript": "5.2.2",
- "webpack-bundle-analyzer": "4.10.0"
+ "type-fest": "4.8.3",
+ "typescript": "5.3.2",
+ "webpack-bundle-analyzer": "4.10.1"
},
"ct3aMetadata": {
"initVersion": "5.10.1"
diff --git a/apps/app/public/locales/de-DE/attribute.json b/apps/app/public/locales/de-DE/attribute.json
new file mode 100644
index 0000000000..97e3abcead
--- /dev/null
+++ b/apps/app/public/locales/de-DE/attribute.json
@@ -0,0 +1,164 @@
+{
+ "additional": {
+ "CATEGORYNAME": "Zusätzliche Informationen",
+ "at-capacity": "Bei Kapazität",
+ "geo-near-public-transit": "Nahe den öffentlichen Verkehrsmitteln",
+ "geo-public-transit-description": "Öffentlicher Transit / bestimmte Wegbeschreibungen",
+ "has-confidentiality-policy": "Hat eine Vertraulichkeitspolitik",
+ "offers-remote-services": "Entfernt",
+ "private-practice": "Private Praxis",
+ "religiously-affiliated": "Ist religiös verbunden",
+ "time-walk-in": "Hat eingehende Stunden",
+ "wheelchair-accessible_false": "Nicht zugänglich",
+ "wheelchair-accessible_true": "Barrierefrei"
+ },
+ "alerts": {
+ "CATEGORYNAME": "Warnungen",
+ "info": "Informations-Warnung",
+ "warn": "Warnung"
+ },
+ "community": {
+ "CATEGORYNAME": "Community",
+ "adults": "\"Erwachsene\" definiert als 18 Jahre oder älter",
+ "africa-immigrant": "Chancen, die denen aus afrikanischen Ländern dienen",
+ "african-american": "Chancen, die der afrikanischen amerikanischen Gemeinschaft dienen",
+ "api": "Chancen für die asiatische und pazifische Inselgemeinschaft",
+ "asexual": "Chancen, die der sexuellen Gemeinschaft dienen",
+ "asia-immigrant": "Chancen, die denen aus asiatischen Ländern dienen",
+ "asylee": "Chancen im Dienste von Asylees (denen, denen der Asylstatus zuerkannt wurde)",
+ "asylum-seeker": "Chancen, die Asylsuchenden von {{country}} dienen",
+ "bipoc": "Chancen, die Schwarz-, Indigenen- und Farben-Menschen dienen",
+ "bisexual": "Chancen im Dienste der Bisexuellen Gemeinschaft",
+ "black": "Chancen im Dienste der Schwarzen Gemeinschaft",
+ "citizens": "Bürger von {{country}}",
+ "conversion-therapy-survivors": "Möglichkeiten, die Überlebenden der Konversionstherapie dienen",
+ "daca-recipient-seeker": "Chancen im Dienste von Dreamern (DACA-Empfängern)",
+ "detained-immigrant": "Chancen, die inhaftierten Einwanderern dienen",
+ "disabled": "Chancen im Dienste der behinderten Gemeinschaft",
+ "gay": "Chancen im Dienste der Gay Community",
+ "gender-nonconforming": "Chancen, die der nicht konformen Gemeinschaft des Geschlechts dienen",
+ "hiv-aids": "Chancen im Dienste der HIV+ und der Risikogemeinschaft",
+ "homeless": "Chancen, die Obdachlosen dienen",
+ "human-trafficking-survivor": "Chancen im Dienste von Überlebenden des Menschenhandels",
+ "intersex": "Chancen im Dienste der Intersex-Gemeinschaft",
+ "language-speakers": "Chancen, die {{language}} Referenten dienen",
+ "latin-america-immigrant": "Chancen, die denen aus Lateinamerika dienen",
+ "latinx": "Chancen im Dienste der Latinx-Gemeinschaft",
+ "lesbian": "Chancen im Dienste der Lesben-Community",
+ "lgbtq-youth": "Chancen im Dienste von LGBTQ+",
+ "lgbtq-youth-caregivers": "Chancen im Dienste von LGBTQ+-Jugendlichen",
+ "middle-east-immigrant": "Chancen im Dienste der Menschen aus dem Nahen Osten",
+ "muslim": "Chancen im Dienste der muslimischen Gemeinschaft",
+ "native-american-two-spirit": "Chancen, die der indigenen amerikanischen Gemeinschaft dienen",
+ "nonbinary": "Chancen, die der Nicht-Binär-Gemeinschaft dienen",
+ "queer": "Chancen, die der Queer Community dienen",
+ "refugee": "Chancen für Flüchtlinge",
+ "residents-green-card-holders": "Verkaufschancen für Bewohner von Ländern, die Grüne Karten besitzen",
+ "seniors": "\"Senior\" definiert als 65 Jahre oder älter",
+ "sex-workers": "Chancen im Dienste von Sexarbeitern",
+ "teens": "\"Teen\" definiert als 12-18 Jahre alt",
+ "trans-youth": "Chancen im Dienste von Trans Jugend",
+ "trans-youth-caregivers": "Chancen im Dienste von Betreuern von Jugendlichen im Trans",
+ "transfeminine": "Chancen, die der Transfeminine Gemeinschaft dienen",
+ "transgender": "Chancen, die der Transgender-Gemeinschaft dienen (für nicht-konforme oder nicht-binäre Gemeinschaften, verwenden die geschlechterkonformen oder nicht-binären Eigenschaften)",
+ "transmasculine": "Möglichkeiten, die der Trasmaskulinen Gemeinschaft dienen",
+ "unaccompanied-minors": "Chancen für unbegleitete Minderjährige",
+ "undocumented": "Chancen für Einwanderer ohne Papiere"
+ },
+ "cost": {
+ "CATEGORYNAME": "Kosten",
+ "cost-fees": "Incurs einen Preis",
+ "cost-free": "Kostenlos"
+ },
+ "crisis-support-community": {
+ "elders": "Ältere",
+ "general-lgbtq": "Allgemeiner LGBTQ+"
+ },
+ "eligibility": {
+ "CATEGORYNAME": "Anspruchsvoraussetzungen",
+ "elig-age_max": "Unter {{max}}",
+ "elig-age_min": "{{min}} und älter",
+ "elig-age_range": "{{min}} - {{max}}",
+ "other-describe": "Andere (kostenlose Textbeschreibung)",
+ "req-medical-insurance": "ANFRAGEN Krankenversicherung",
+ "req-photo-id": "Foto-ID ANFRAGEN",
+ "req-proof-of-age": "ANFRAGEN-Altersnachweis",
+ "req-proof-of-income": "ANFRAGEN-Einkommensnachweis",
+ "req-proof-of-residence": "ANFRAGEN Wohnsitznachweis",
+ "req-referral": "ANFRAGE eine Empfehlung",
+ "time-appointment-required": "Zeitangabe erforderlich"
+ },
+ "lang": {
+ "CATEGORYNAME": "Sprachen",
+ "all-languages-by-interpreter": "Alle Sprachen per Dolmetscher",
+ "american-sign-language": "Amerikanische Gebärdensprache",
+ "lang-offered": "Spezifische Sprachen angeboten"
+ },
+ "orgleader": {
+ "CATEGORYNAME": "Organisationsführung",
+ "bipoc-led": "BIPOC-geführt",
+ "black-led": "Schwarz geführt",
+ "immigrant-led": "Migrantengeführt",
+ "trans-led": "Transgender-geführt",
+ "women-led": "Frauen geführt"
+ },
+ "serviceaccess": {
+ "CATEGORYNAME": "Anweisungen zum Zugang zum Service",
+ "accessemail": "Anleitungen für den Zugriff - E-Mail",
+ "accessfile": "Anleitungen für den Zugriff - Datei",
+ "accesslink": "Zugangsanweisungen - Link",
+ "accesslocation": "Zugangshinweise - Standort",
+ "accessphone": "Zugangsanweisungen - Telefon",
+ "accesspublictransit": "Zugangsanweisungen - Öffentlicher Transit",
+ "accesssms": "Zugangsanweisungen - SMS",
+ "accesstext": "Anleitungen für den Zugang - Text",
+ "accesswhatsapp": "Zugangsanleitung - WhatsApp"
+ },
+ "srvfocus": {
+ "CATEGORYNAME": "Service Fokus",
+ "asylum-seekers": "Asylsuchende",
+ "bipoc-comm": "BIPOC Community",
+ "caregivers": "Pflegedienst-Community",
+ "disabled": "Deaktivierte Community",
+ "elder": "Fokussiert auf Ältere",
+ "gender-nc": "Geschlecht nicht konform",
+ "hiv-comm": "HIV Community",
+ "immigrant-comm": "Migrantengemeinschaft",
+ "incarcerated": "Inhaftierte Community",
+ "lgbtq-youth-focus": "LGBTQ+ Jugend",
+ "resettled-refugees": "Neuangelegte Flüchtlinge",
+ "spanish-speakers": "Spanische Sprecher",
+ "trans-comm": "Trans Community",
+ "trans-fem": "Trans Women/Trans Feminin",
+ "trans-masc": "Trans Männer/Trans Maskulin",
+ "trans-youth-focus": "Trans Jugend",
+ "women": "Fokussiert auf Frauen"
+ },
+ "sys": {
+ "CATEGORYNAME": "System",
+ "incompatible-info": "Inkompatible Informationen"
+ },
+ "userlawpractice": {
+ "CATEGORYNAME": "Rechtspraktikoptionen",
+ "corp-law-firm": "Kanzlei",
+ "law-other": "Andere",
+ "law-school-clinic": "Juraschulklinik",
+ "legal-nonprofit": "Rechtliche Non-Profit-Organisation"
+ },
+ "userserviceprovider": {
+ "CATEGORYNAME": "Diensteanbieter-Optionen",
+ "case-mananger": "Fall Manager",
+ "community-org": "Freiwillige/Mitarbeiter einer Gemeinschaftsorganisation",
+ "friend-family": "N/A (Buchung im Namen von Freunden/Familie)",
+ "govt-agency": "Regierungsagentur",
+ "grassroots-direct": "Basiswurzel-Direkt-Service-Organisation",
+ "healthcare": "Gesundheitsdienstleister",
+ "lawyer": "Rechtsanwalt",
+ "other": "Andere (bitte angeben)",
+ "paralegal": "Paralegal oder andere juristische Hilfspersonal",
+ "social-worker": "Sozialarbeiter",
+ "student-club": "Leiter des Studentenklubs / Administrator",
+ "teacher": "Lehrer",
+ "therapist-counselor": "Therapeut/Berater"
+ }
+}
diff --git a/apps/app/public/locales/de-DE/common.json b/apps/app/public/locales/de-DE/common.json
new file mode 100644
index 0000000000..595db69bfb
--- /dev/null
+++ b/apps/app/public/locales/de-DE/common.json
@@ -0,0 +1,429 @@
+{
+ "about-us": "Über uns",
+ "access": {
+ "sms-with-body": "Text {{body}} zu {{code}}"
+ },
+ "accessible-building_false": "Dieses Gebäude ist NICHT rollstuhlgerecht",
+ "accessible-building_true": "Dieses Gebäude ist rollstuhlgerecht",
+ "account": "Konto",
+ "add": "{{item}} hinzufügen",
+ "address": "Adresse",
+ "address_physical": "Physische Adresse",
+ "adjective": {
+ "organization": "{{adjective}} Organisation"
+ },
+ "agree-disclaimer": "By clicking \"{{action}}\" you agree to InReach's Privacy Policy and Terms of Use.",
+ "alert-message": "Warnmeldung",
+ "alert-message-1": "COVID-19 Richtlinie: Mit Neuigkeiten und Best Practices für die COVID-19 Prävention ändern sich jeden Tag schnell Whitman-Walker Health aktualisiert ihre Dienstleistungen weiter, um die Präventionsempfehlungen wiederzugeben. Bitte schauen Sie auf ihrer Website nach, um die aktuellsten Informationen zu erhalten.",
+ "alert-message-instructions": "Geben Sie die Warnmeldung ein",
+ "alert-title-instructions": "Geben Sie einen Titel für die Nachricht ein...",
+ "all-service-category": "Alle {{serviceCategory}}",
+ "anti-hate": {
+ "body": "Durch die Verwendung von InReach erklären Sie sich damit einverstanden, dass Sie diese Informationen nicht für schädliche, haßbasierte, homophobe, transphobische, fremdenfeindliche und/oder rassistische Agenden oder Kommentare verwenden.",
+ "title": "Anti-Hass-Engagement"
+ },
+ "badge": {
+ "claimed-tool-tip": "Diese Organisation wurde von einem verifizierten Vertreter beansprucht.
Erfahren Sie mehr.",
+ "community-tool-tip": "Community von dieser Organisation.",
+ "national-tool-tip": "Bietet Dienstleistungen in {{country}}.",
+ "remote-tool-tip": "Entfernt verfügbar",
+ "service-tool-tip": "Dienste(n) von dieser Organisation angeboten.",
+ "unclaimed-tool-tip": "Diese Organisation wurde noch nicht von einem Vertreter beansprucht.
Fordere diese Organisation an, um Vertrauen mit unserer Community zu schaffen, aktualisiere deine eigenen Informationen und mehr."
+ },
+ "breadcrumb": {
+ "back-to-dynamic": "Zurück zu {{page}}",
+ "back-to-search": "Zurück zur Suche"
+ },
+ "cancel": "Abbrechen",
+ "claim-org-modal": {
+ "list": "🔗 Fordere die Profilseite deiner Organisation an und baue Vertrauen mit deinem Publikum auf InReach\n:writing_hand_medium dark_skin_tone: Aktualisiere die Informationen deiner Organisation über InReach\n📨 Lade andere Mitarbeiter ein, um deiner Organisation auf InReach\n\n🔑 Erhalte Zugriff auf zukünftige Features, die speziell für angeschlossene Dienstleister auf InReach erstellt wurden.",
+ "title": "🏠\nDiese Organisation wurde noch nicht von einem Dienstleister beansprucht.\nMit einem kostenlosen InReach Service Providerkonto können Sie bald folgendes tun:"
+ },
+ "claimed": "Beansprucht",
+ "clear": "Leeren",
+ "close": "Schließen",
+ "confirm-account": {
+ "click-verify": "Klicke hier, um deinen InReach Account zu bestätigen",
+ "message": "Klicken Sie auf den folgenden Link, um Ihr Konto zu bestätigen:",
+ "subject": "Bestätigen Sie Ihr Konto"
+ },
+ "connect": "Verbinden",
+ "contact": "Kontakt",
+ "contact-us": "Kontaktiere uns",
+ "cookie-consent": {
+ "approve-all": "Alle genehmigen",
+ "approve-selected": "Ausgewählte genehmigen",
+ "body": "Wir verwenden auf dieser Website Cookies und Dienste von Dritten, von denen einige wesentlich sind, andere helfen uns dabei, Ihre Browser-Erfahrung zu verbessern. Weitere Informationen finden Sie in unserer Datenschutzerklärung.",
+ "intro": "Wir verwenden notwendige Cookies, um unsere Website zum Funktionieren zu bringen. Wir möchten zusätzliche Cookies einrichten, um die Nutzung der Website zu verstehen, die Website-Verbesserungen vorzunehmen und Ihre Einstellungen zu speichern.",
+ "item-basic": "Notwendige Cookies für die Funktionalität der Website",
+ "item-ga4": "Analytik für interne InReach Verwendung",
+ "modal-title": "Cookies Einstellungen"
+ },
+ "count": {
+ "result_one": "{{count}} Ergebnis",
+ "result_other": "{{count}} Ergebnisse"
+ },
+ "country-select": "Wählen Sie ein Land",
+ "create-new-list": "Neue Liste erstellen",
+ "crisis-support": {
+ "intl-stay-safe": "📣 Bitte bleiben Sie online sicher\nBesuchen einer dieser Websites kann einen Datensatz auf Ihrem Computer oder Browserhinterlassen genau wie jede Website nach dem Besuch macht. Bitte ergreifen Sie Schritte, um unsichere Situationen in Ihrem eigenen Gebiet zu vermeiden.",
+ "intl-these-verified": "Diese überprüften Ressourcen können der LGBTQ+-Community überall auf der Welt helfen.",
+ "intl-we-recommend": "Wir empfehlen diese internationalen Ressourcen",
+ "natl-find-help-now": "Hilfe jetzt finden",
+ "natl-these-verified": "Diese überprüften Ressourcen können der LGBTQ+ Community in den Vereinigten Staaten helfen. Diese Dienste sind aus der Ferne verfügbar, vertraulich, und kostenlos.",
+ "outside-service-area": "InReach funktioniert nicht in {{country}}",
+ "who-this-serves": "wem diese Ressource dient: {{targetPop}}"
+ },
+ "current-location": "Aktueller Standort",
+ "delete-account": "Konto löschen?",
+ "delete-account-password": "Geben Sie zum Bestätigen Ihr Passwort ein.",
+ "direct": {
+ "email": "Direkte E-Mail",
+ "phone": "Direktes Telefon",
+ "website": "Direkte Webseite"
+ },
+ "disclaimer": "Haftungsausschluss",
+ "donate": {
+ "hover": "Spende heute um InReach für alle kostenlos zu halten",
+ "popup": "Hilf InReach für alle kostenlos zu halten",
+ "to-inreach": "Spende an InReach 💝"
+ },
+ "dont-have-account": "Sie haben noch kein Konto?",
+ "download-app": "App herunterladen",
+ "edit-profile": "Profil bearbeiten",
+ "email-sent": "E-Mail gesendet.",
+ "email_professional": "Professionelle E-Mail",
+ "email_student-pro": "Professionelle oder Studenten-E-Mail",
+ "enter-email-placeholder": "E-Mail-Adresse eingeben...",
+ "enter-password-placeholder": "Passwort eingeben...",
+ "enter-review": "Gib deine Bewertung ein...",
+ "errors": {
+ "401-title": "Du musst eingeloggt sein, um dies zu tun.",
+ "403-body": "Sie haben keine Berechtigung auf diese Seite zuzugreifen. Wenn Sie das Gefühl haben, dass Sie diese Seite irrtümlich erreicht haben, wenden Sie sich bitte an Ihren Supervisor.",
+ "403-title": "403: Verboten",
+ "404-body": "Es tut uns leid, die Seite, die Sie suchen, existiert nicht oder wurde verschoben. Starte eine Suche unten, um sichere, verifizierte Ressourcen für die verschiedene LGBTQ+-Gemeinschaft in deiner Nähe zu finden.",
+ "404-title": "404: Seite nicht gefunden.",
+ "500-body": "Es tut uns leid, etwas ist mit unserem Server schief gelaufen. Bitte versuchen Sie es später noch einmal, oder starten Sie eine Suche unten, um sichere, verifizierte LGBTQ+-Ressourcen in Ihrer Nähe zu finden.",
+ "500-title": "500: Etwas ist schiefgelaufen.",
+ "oh-no": "Oh no!",
+ "try-again-text": "Etwas ist schiefgelaufen! Bitte versuchen Sie es erneut."
+ },
+ "exclude": "Ausschließen",
+ "filter-by-service": "Nach Diensten filtern",
+ "find-resources": "Ressourcen finden",
+ "find-x": "{{value}} finden",
+ "footer": {
+ "anti-hate": "Anti-Hass-Engagement",
+ "digital-accessibility": "Digitale Zugänglichkeit",
+ "disclaimer": "Haftungsausschluss",
+ "privacy-statement": "Datenschutzerklärung",
+ "share-feedback": "Feedback teilen",
+ "subscribe-newsletter": "Abonnieren Sie unseren Newsletter",
+ "suggest-org": "Eine Organisation vorschlagen",
+ "tagline": "Suche LGBTQ+ Ressourcen.
\nErreiche Sicherheit.
\nSuche nach Zugehörigkeit.",
+ "vetting-process": "Vetting Prozess"
+ },
+ "forgot-password": "Passwort vergessen?",
+ "form-error-enter-valid-email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
+ "form-error-password-blank": "Passwort darf nicht leer sein.",
+ "form-error-password-req": "Ihr Passwort erfüllt nicht die Anforderungen, bitte versuchen Sie es erneut.",
+ "go-to-x": "Gehe zu {{value}}",
+ "in-reach-user": "InReach Benutzer",
+ "in-reach-verified-reviewer": "InReach geprüfter Prüfer",
+ "include": "Einschließen",
+ "inreach": "InReach",
+ "inreach-copyright": "InReach, Inc. {{year}} • Alle Rechte vorbehalten • InReach ❤️ Open Source",
+ "inreach-logo": "InReach logo",
+ "inreach-org": "InReach.org",
+ "language": "Sprache",
+ "language_all-other": "Alle anderen Sprachen",
+ "language_choose": "Bitte wählen Sie eine Sprache",
+ "language_common": "Gemeinsame Sprachen",
+ "law-practice-other": "Rechtsgebiet",
+ "law-practice-other-placeholder": "Bitte geben Sie Ihren Rechtsbereich an",
+ "link-copied": "Link in Zwischenablage kopiert",
+ "list": {
+ "added": "Ressource in Liste gespeichert: {{name}}",
+ "create-new": "Neue Liste erstellen",
+ "create-new-sub": "Ihre Listen der gespeicherten Ressourcen sind nur für Sie und für jeden sichtbar, mit dem Sie sie teilen.",
+ "create-new-sub2": "Benennen Sie Ihre Liste nach Kategorie, Wochentag oder wem diese Liste dienen soll.",
+ "created": "Neue Liste erstellt: {{name}}",
+ "error-add": "Fehler beim Speichern in Liste",
+ "error-name-not-blank": "Listenname darf nicht leer sein",
+ "error-remove": "Fehler beim Entfernen der Liste",
+ "name": "Listenname",
+ "new-list-placeholder": "Listenname eingeben...",
+ "removedMulti": "Ressource aus der Liste entfernt: {{name}}",
+ "removedSingle": "Ressource aus der Liste entfernt"
+ },
+ "loading-page": "Seite wird geladen...",
+ "log-in": "Anmelden",
+ "log-out": "Abmelden",
+ "login": {
+ "error-generic": "Etwas ist schief gelaufen, bitte versuche es erneut.",
+ "error-username-password": "Benutzername oder Passwort falsch."
+ },
+ "message_text": "Nachrichtentext",
+ "message_title": "Titel der Nachricht",
+ "modal-content": {
+ "accessibility": "\nBarrierefreiheitserklärung\nDie Open-Source-Technologie von InReach ist für die verschiedene LGBTQ+-Gemeinschaft entwickelt einschließlich Benutzer mit Behinderungen.\nDie kostenlose InReach App ist im Web (Desktop und Mobil) und nativen iOS und Android verfügbar. Mit der Einführung unserer neuesten Neugestaltung (Juni 2023) wird InReach bestrebt sein, die Kriterien der Web Content Accessibility Guidelines (WCAG) zu erfüllen.\nat InReach, Wir streben danach, unsere Technologieplattform so vielen Benutzern und Geräten wie möglich zugänglich zu machen und damit unserer Mission gerecht zu werden, allen LGBTQ+ Menschen, die Verfolgung oder Diskriminierung ausgesetzt sind, zu dienen.",
+ "disclaimer": "\nInReach Disclaimer\nDas InReach Team wird sein Bestes tun, um die Förderfähigkeit und grundlegende Fakten über Dienstleister zu bestätigen, die auf dieser Website aufgeführt sind. Wir können jedoch die Rentabilität oder die Fähigkeiten solcher Anbieter nicht garantieren. Infolgedessen InReach übernimmt keine Verantwortung für die Handlungen von auf dieser Website aufgeführten Anbietern und Benutzern, die sich mit solchen Anbietern in Verbindung setzen, geschieht dies auf eigene Gefahr.\n"
+ },
+ "modal-more-options": {
+ "exclude": "Ressourcen ausschließen, die...",
+ "include": "Ressourcen einschließen..."
+ },
+ "more": {
+ "options": "Weitere Optionen"
+ },
+ "no-reviews": "Es wurden noch keine Bewertungen für diese Organisation eingereicht. Sei der Erste, der deine Erfahrungen teilt!",
+ "none-apply": "Nichts davon gilt für mich",
+ "offices-and-locations": "Büros & Standorte",
+ "org-image": "Organisationsfoto",
+ "organization": "Organisation",
+ "other-specify": "Andere (bitte angeben)",
+ "page-title": {
+ "base": "{{- title}} - InReach",
+ "search-results": "Suchergebnisse"
+ },
+ "password": "Passwort",
+ "password-confirm": "Passwort bestätigen",
+ "password-error-match": "Passwörter müssen übereinstimmen",
+ "password-reenter-placeholder": "Passwort erneut eingeben...",
+ "password-req-length": "Enthält mindestens 8 Zeichen",
+ "password-req-lowercase": "Beinhaltet Kleinbuchstaben",
+ "password-req-number": "Beinhaltet Nummer",
+ "password-req-special": "Enthält Sonderzeichen",
+ "password-req-uppercase": "Enthält Großbuchstaben",
+ "password-reset": {
+ "email-body": "Klicken Sie auf den folgenden Link, um Ihr Passwort zurückzusetzen:",
+ "email-subject": "Passwort zurücksetzen"
+ },
+ "password-reset-success": "Bitte melden Sie sich mit Ihrem neuen Passwort an.",
+ "password-saved": "Passwort gespeichert!",
+ "photo-count_interval": "(0)[Noch keine Foto.];(1)[{{count}} Foto];(2-inf)[{{count}} Fotos]",
+ "photo_interval": "(0)[Noch keine Fotos];(2-In)[Alle {{count}} Fotos ansehen];",
+ "please-specify": "Bitte angeben",
+ "powered-by-vercel": "Unterstützt von Vercel",
+ "prefer-not-to-say": "Nicht sagen",
+ "privacy-policy": "Datenschutzerklärung",
+ "privacy-statement": "Datenschutzerklärung",
+ "privacy-statement-body": [
+ "Bei InReach erkennen wir, dass der Erhalt der Online-Anonymität für viele LGBTQ+ Menschen ein Problem des Lebens oder Todes ist. Deshalb die kostenlose InReach App (unsere Web-App, native iOS-App, und native Android App) wurde entwickelt, um die Sicherheit und Vertraulichkeit der Benutzer online zu schützen.",
+ "demographische Benutzerdaten",
+ "Wir benötigen keine persönlich identifizierbaren Informationen, um die kostenlose InReach App nutzen zu können.",
+ "Benutzer, die ein kostenloses InReach Benutzerkonto erstellen möchten, haben die Option folgende demografische Informationen über eine anonyme Online-Umfrage zu teilen:",
+ "Geburtsjahr\nHerkunftsland\n\nLGBTQ+ Identität (sexuelle Orientierung und Geschlechteridentität)\nRasse/Ethnizität\nEinwanderungsstatus\nAktueller Standort",
+ "Alle diese sensiblen Informationen werden anonym gespeichert und nicht mit einzelnen Benutzer- oder Benutzerkonten verbunden.*",
+ "(*Die einzige Ausnahme ist der lokale Community-Überprüfer-Benutzerkontotyp, , das alle demographischen Informationen nutzt, die gesammelt wurden, um die Freiwilligentätigkeit und Wirkung der lokalen Überprüfer zu verbessern. Für lokale Community-Überprüferkonten benötigen wir den Standort, und alle anderen demografischen Informationen sind optional, wären jedoch an den Nutzerdatensatz gebunden. Diese Daten wären nur außerhalb des InReach Personals sichtbar, wenn der örtliche Community-Überprüfer sie über seine Kontoeinstellungen sichtbar machen würde. Das Teilen eines öffentlich-gerichteten Profils wird anderen Benutzern helfen, sich in Ihren Bewertungen sicherer zu fühlen.)",
+ "Das Verständnis unserer Benutzerdemografie kann uns helfen, unsere Auswirkungen zu quantifizieren, Geld aufzubringen und zukünftige Produktentscheidungen zu bewerten. Wir freuen uns, dass Nutzer diese Informationen freiwillig mit uns teilen und wir diese Schritte unternehmen, um Ihre Privatsphäre und Anonymität zu schützen.",
+ "Nutzungsanalyse",
+ "InReach verwendet Google Analytics zur anonymen Analyse und Verfolgung von App-Nutzungsdaten (z.B. Benutzersuche und anderes Verhalten) im Aggregat. Google Analytics ist DPR-konform und sammelt keine persönlich identifizierbaren Informationen und anonymisiert alle gesammelten Daten. Benutzer können nicht identifiziert werden und werden niemals über Websites verfolgt.",
+ "InReach verwendet auch Vercel Analytics zur Analyse von Webvitalen und Performance. Vercel Analytics stellt Informationen zur Nutzung der Website zur Verfügung, ohne an eine einzelne Besucher- oder IP-Adresse gebunden zu sein oder mit ihnen in Verbindung zu treten. Die Aufzeichnung von Datenpunkten ist anonym und die Analytics-Funktion sammelt oder speichert keine Informationen, die Vercel erlauben würden, eine Sitzung über Seiten hinweg zu rekonstruieren oder einen Benutzer zu identifizieren."
+ ],
+ "privacy-statement-foot": "Lesen Sie unsere vollständige Datenschutzrichtlinie für weitere Informationen",
+ "privacy-statement-head": ["🔒", "Datenschutzerklärung"],
+ "privatePractice": "Private Praxis",
+ "profile": "Profil",
+ "questions": "Fragen?",
+ "quick-promo-body": "💚 Speichern und teilen Sie personalisierte Ressourcenlisten\n:speech_ballon: Verlassen Sie öffentliche Bewertungen von Organisationen\n\n🏠 Vorschläge Organisationen in Ihrer Region\n🔗 Berechnen Sie die Profilseite Ihrer Organisation (bald kommen!",
+ "quick-promo-heading": ":Regenbogen:\nSie müssen sich einloggen, um dies zu tun.\nMit einem kostenlosen InReach Account können Sie zusätzliche Funktionen freischalten:",
+ "remote-services": "Remote-Dienste verfügbar",
+ "remote-services-page-title": "Remote-Dienste",
+ "reset-password": "Passwort zurücksetzen",
+ "reset-password-message": "Wir senden Ihnen eine E-Mail zum Zurücksetzen Ihres Passworts",
+ "resource-saved": "Ressource gespeichert.",
+ "resources": "Ressourcen",
+ "retry": "Wiederholen",
+ "review-count_interval": "(0)[Noch keine Bewertung];",
+ "review-not-empty": "Überprüfung darf nicht leer sein",
+ "review-note": "Ihre Bewertung wird erst erfasst, wenn Sie eine Bewertung eingeben und auf „Absenden“ klicken.",
+ "review-resource": "Diese Ressource überprüfen",
+ "safety-exit": "Sicherheits-Ausgang",
+ "save": "Speichern",
+ "save-changes": "Änderungen speichern",
+ "saved": "Gespeichert",
+ "search": {
+ "include-remote": "Remote-Dienste einbeziehen",
+ "location-placeholder": "Stadt oder Postleitzahl eingeben...",
+ "location-placeholder-searchby": "Suche nach Stadt oder Postleitzahl ...",
+ "look-up-org": "Organisation nach Namen suchen",
+ "no-results": "Keine Ergebnisse gefunden. Bitte versuchen Sie es erneut.",
+ "no-results-adjust": "Keine Ergebnisse für Ihre Suche gefunden. Versuchen Sie, Ihren ausgewählten Standort oder Filter anzupassen.",
+ "organization-placeholder": "Organisationsname eingeben...",
+ "organization-placeholder-searchby": "Suche nach Organisationsnamen...",
+ "suggest-resource": "Sie finden es nicht? schlagen Sie eine Organisation vor, die Ihrer Meinung nach enthalten sein sollte."
+ },
+ "send-email": "E-Mail senden",
+ "service": {
+ "additional-info": "Zusätzliche Förderfähigkeitsinformationen",
+ "ages": "Anspruchsfähiges Alter",
+ "at-capacity": "Dieser Dienst kann derzeit keine neuen Kunden nehmen.",
+ "clients-served": "Kunden serviert",
+ "community-focus": "LGBTQ+ Community-Fokus",
+ "cost": "Kosten",
+ "cost-details": "Kostendetails",
+ "elig-age_max": "Unter {{max}}",
+ "elig-age_min": "{{min}} und älter",
+ "elig-age_range": "{{min}} - {{max}}",
+ "eligibility": "Voraussetzungen für die Berechtigung",
+ "extra-info": "Zusätzliche Informationen",
+ "get-help": "Hilfe erhalten",
+ "hours": "Service-Stunden",
+ "languages": "Sprachen",
+ "requirements": "Anforderungen",
+ "target-population": "Target population",
+ "transit-directions": "Öffentliche Verkehrsmittel"
+ },
+ "services": "Dienste",
+ "share-feedback": "Feedback teilen",
+ "show-less": "Weniger anzeigen",
+ "show-more": "Mehr anzeigen",
+ "sign-up": {
+ "header": "\n:Regenbogen:\n$t(Wörter). ign-up)\nWillkommen auf der weltweit ersten Technologieplattform, die LGBTQ+ mit Verfolgung oder Diskriminierung mit sicheren, verifizierten Ressourcen verbindet.\n",
+ "lcr-error1": "Leider erfüllen Sie nicht die aktuellen Voraussetzungen für eine lokale Community Überprüfung.\nKlicken Sie hier, um ein Standardkonto zu erstellen.",
+ "lcr-error2": "Sie müssen den Local Community Reviewer Seite lesen und überprüfen.",
+ "lcr-screen1": "Bitte wählen Sie alle zutreffenden",
+ "lcr-screen1a": "Ich habe persönliche Erfahrungen mit dem Zugriff auf lokale Dienste in meiner Gemeinschaft.",
+ "lcr-screen1b": "Ich habe Erfahrungen, die LGBTQ+-Kunden beim Zugriff auf lokale Dienste in meiner Community zu helfen.",
+ "lcr-screen1c": "Ich habe Erfahrungen, LGBTQ+ Lieben / Familienmitglieder beim Zugang zu lokalen Diensten in meiner Gemeinschaft zu helfen.",
+ "lcr-screen1none": "Nichts davon trifft auf mich zu.",
+ "lcr-screen2": "In welchem Land befinden Sie sich?",
+ "lcr-screen2a": "Vereinigte Staaten (einschließlich Territorien)",
+ "lcr-screen2b": "Kanada",
+ "lcr-screen2c": "Mexiko",
+ "lcr-screen2none": "Keine der oben genannten",
+ "lcr-screen3": "Ich habe den Local Community Reviewer Seite auf der Website von InReach geprüft und erfüllt die Anforderungen.",
+ "modal-body": [
+ "Welchen Kontotyp möchten Sie erstellen?",
+ "\n\n\n\n",
+ "Haben Sie bereits ein Konto?"
+ ],
+ "name-use-any": "Benutzen Sie den Namen, mit dem Sie sich wohl fühlen.",
+ "name_alias": "Name oder Alias",
+ "name_full": "Voller Name",
+ "placeholder-name_alias": "Name oder Alias eingeben...",
+ "placeholder-name_full": "Vollständigen Namen eingeben...",
+ "select-law-practice": "Wo praktizieren Sie Recht?",
+ "select-service-provider": "Wo arbeiten Sie oder ehrenamtlich?",
+ "specify-work-volunteer": "Bitte geben Sie an, wo Sie arbeiten oder freiwillig sind",
+ "success": "Sie haben sich für ein Konto registriert!",
+ "user-exists-body": "Diese E-Mail-Adresse ist bereits registriert.",
+ "user-exists-header": "Sie haben möglicherweise bereits ein Konto.",
+ "verify-email": "Bevor Sie Ihr neues Konto verwenden können, müssen Sie Ihre E-Mail-Adresse bestätigen. Überprüfen Sie Ihren Posteingang und klicken Sie auf den Link in der Nachricht."
+ },
+ "sign-up-free": "Kostenlos registrieren",
+ "social": {
+ "email": "E-Mail",
+ "facebook": "Facebook",
+ "github": "GitHub",
+ "group-header": "Soziale",
+ "instagram": "Instagram",
+ "linkedin": "LinkedIn",
+ "tiktok": "TikTok",
+ "twitter": "Twitter",
+ "youtube": "YouTube"
+ },
+ "sort": {
+ "bipoc": "BIPOC Community",
+ "by-lgbtq-focus": "Nach LGBTQ+ Community-Fokus sortieren",
+ "hiv": "HIV+ Gemeinschaft",
+ "immigrants": "Einwanderer",
+ "spanish-speakers": "Spanischsprecher",
+ "transgender": "Transgender Gemeinschaft",
+ "youth": "Jugend"
+ },
+ "step-x-y": "Schritt- {{x}} von {{y}}",
+ "submit": "Absenden",
+ "submit-review": "Bewertung absenden",
+ "subscribe-to-newsletter": "Newsletter abonnieren",
+ "suggest-a-resource": "Eine Ressource vorschlagen",
+ "support": "Unterstützung",
+ "survey": {
+ "birthyear-req-value": "Jahr muss zwischen {{year1}} und {{year2}}liegen, also 2005",
+ "finish": "Beenden",
+ "launch-item1": "Warum fragen wir? Das Verständnis unserer Benutzerdemographie kann uns helfen, unsere Auswirkungen zu quantifizieren, Geld aufzubringen und zukünftige Produktentscheidungen zu bewerten.",
+ "launch-item2": "Sicher zuerst: Ihre Antworten werden anonym gespeichert und nicht mit Ihnen als einzelner Benutzer oder mit Ihrem Benutzerkonto verbunden.",
+ "launch-title": "Bitte nehmen Sie sich ein paar Minuten Zeit, um uns in unserer anonymen Benutzerumfrage über sich selbst zu berichten.",
+ "not-right-now": "Nicht im Moment",
+ "question-1-title": "Wie würden Sie sich beschreiben?",
+ "question-2-placeholder": "Land eingeben...",
+ "question-2-title": "Was ist Ihr Herkunftsland?",
+ "question-3-title": "Wie identifizieren Sie sich?",
+ "question-4-title": "Was ist Ihre Ethnizität/Rasse?",
+ "question-5-label": "Geburtsjahr",
+ "question-5-placeholder": "Geben Sie Ihr Geburtsjahr ein...",
+ "question-5-title": "Wie alt bist du?",
+ "question-subtitle": "Deine Antworten sind anonym.",
+ "start-survey": "Umfrage starten",
+ "thank-you": "Vielen Dank!",
+ "thank-you-message": "Die Informationen, die Sie uns mitgeteilt haben, helfen uns, unser Produkt zu verbessern."
+ },
+ "take-action": "Aktion ergreifen",
+ "uncheck-all": "Alles abwählen",
+ "unclaimed": "Unbeansprucht",
+ "user-avatar": "Benutzer Avatar",
+ "verified-information": "Verifizierte Informationen",
+ "verified-information-detail": "Die Informationen auf dieser Seite wurden zuletzt aktualisiert {{dateString}}. InReach priorisiert Genauigkeit und Benutzersicherheit und aktualisiert alle Informationen regelmäßig. Für weitere Informationen zu unserem Überprüfungsprozess besuchen Sie bitte unsere Vetting Process Seite auf InReach.org.",
+ "verify-account": {
+ "verified": "Konto überprüft!",
+ "verified-body": "Ihr Konto wurde überprüft! Bitte melden Sie sich an, um weitere Funktionen von InReach zu verwenden.",
+ "verifying": "Konto wird überprüft..."
+ },
+ "view-list": "Liste anzeigen",
+ "visit": "Besuche",
+ "welcome-name": "Willkommen, {{name}}!",
+ "words": {
+ "accept": "Akzeptieren",
+ "account": "Konto",
+ "add": "Neu",
+ "and": "und",
+ "and-x-more": "und {{count}} mehr",
+ "approve": "Bestätigen",
+ "back": "Zurück",
+ "close": "Schließen",
+ "coming-soon": "Demnächst",
+ "customize": "Anpassen",
+ "decline": "Ablehnen",
+ "delete": "Löschen",
+ "distance": "Distanz",
+ "donate": "Spenden",
+ "email": "E-Mail",
+ "home": "Zuhause",
+ "hours": "Stunden",
+ "location": "Standort",
+ "more": "mehr",
+ "more-info": "Weitere Informationen",
+ "next": "Nächste",
+ "no": "Nein",
+ "organization": "Organisation",
+ "password": "Passwort",
+ "phone": "Telefon",
+ "please-wait": "Bitte warten...",
+ "prev": "Vorher",
+ "print": "Drucken",
+ "review": "Überprüfen",
+ "reviews": "Bewertungen",
+ "save": "Speichern",
+ "saved": "Gespeichert",
+ "search": "Suchen",
+ "service-hours": "Service-Stunden",
+ "settings": "Einstellungen",
+ "share": "Teilen",
+ "sign-up": "Registrieren",
+ "skip": "Überspringen",
+ "support": "Unterstützung",
+ "website": "Webseite",
+ "yes": "Ja"
+ },
+ "photo_one": "Foto",
+ "photo_other": "Fotos",
+ "review-count_one": "({{count}} Rezension)",
+ "review-count_other": "({{count}} Rezensionen)",
+ "review_one": "Überprüfen",
+ "review_other": "Bewertungen",
+ "view-x-result_one": "{{count}} Ergebnis anzeigen",
+ "view-x-result_other": "{{count}} Ergebnisse anzeigen",
+ "website_one": "Webseite",
+ "website_other": "Webseiten"
+}
diff --git a/apps/app/public/locales/de-DE/country.json b/apps/app/public/locales/de-DE/country.json
new file mode 100644
index 0000000000..904a2da6c2
--- /dev/null
+++ b/apps/app/public/locales/de-DE/country.json
@@ -0,0 +1,1244 @@
+{
+ "ABW": {
+ "name": "Aruba",
+ "demonym_one": "Aruban",
+ "demonym_other": "Arubans"
+ },
+ "AFG": {
+ "name": "Afghanistan",
+ "demonym_one": "Afghanisch",
+ "demonym_other": "Afghanen"
+ },
+ "AGO": {
+ "name": "Angola",
+ "demonym_one": "Angolanisch",
+ "demonym_other": "Angolaner"
+ },
+ "AIA": {
+ "name": "Anguilla",
+ "demonym_one": "Anguillianisch",
+ "demonym_other": "Anguillianer"
+ },
+ "ALA": {
+ "name": "A land Inseln",
+ "demonym_one": "A landisch",
+ "demonym_other": "A landers"
+ },
+ "ALB": {
+ "name": "Albanien",
+ "demonym_one": "Albanisch",
+ "demonym_other": "Albaner"
+ },
+ "AND": {
+ "name": "Andorra",
+ "demonym_one": "Andorran",
+ "demonym_other": "Andorrans"
+ },
+ "ARE": {
+ "name": "Vereinigte Arabische Emirate",
+ "demonym_one": "Emirati",
+ "demonym_other": "Emiratis"
+ },
+ "ARG": {
+ "name": "Argentinien",
+ "demonym_one": "Argentinean",
+ "demonym_other": "Argentineans"
+ },
+ "ARM": {
+ "name": "Armenien",
+ "demonym_one": "Armenisch",
+ "demonym_other": "Armenier"
+ },
+ "ASM": {
+ "name": "American Samoa",
+ "demonym_one": "Amerikanisches Samoisch",
+ "demonym_other": "Amerikanische Samoaner"
+ },
+ "ATA": {
+ "name": "Antarctica",
+ "demonym_one": "Antarktis",
+ "demonym_other": "Antarcticans"
+ },
+ "ATF": {
+ "name": "Französische Süd- und Antarktis-Länder",
+ "demonym_one": "Französisch",
+ "demonym_other": "Französisch"
+ },
+ "ATG": {
+ "name": "Antigua und Barbuda",
+ "demonym_one": "Antiguan, Barbudan",
+ "demonym_other": "Antiguanen, Barbudans"
+ },
+ "AUS": {
+ "name": "Australien",
+ "demonym_one": "Australisch",
+ "demonym_other": "Australier"
+ },
+ "AUT": {
+ "name": "Österreich",
+ "demonym_one": "Österreichisch",
+ "demonym_other": "Österreicher"
+ },
+ "AZE": {
+ "name": "Aserbaidschan",
+ "demonym_one": "Aserbaidschan",
+ "demonym_other": "Aserbaidschan"
+ },
+ "BDI": {
+ "name": "Burundi",
+ "demonym_one": "Burundian",
+ "demonym_other": "Burundians"
+ },
+ "BEL": {
+ "name": "Belgien",
+ "demonym_one": "Belgian",
+ "demonym_other": "Belgians"
+ },
+ "BEN": {
+ "name": "Benin",
+ "demonym_one": "Beninisch",
+ "demonym_other": "Beninisch"
+ },
+ "BES": {
+ "name": "Niederlande in der Karibik"
+ },
+ "BFA": {
+ "name": "Burkina Faso",
+ "demonym_one": "Burkinabe",
+ "demonym_other": "Burkinabes"
+ },
+ "BGD": {
+ "name": "Bangladesch",
+ "demonym_one": "Bangladeshi",
+ "demonym_other": "Bangladeshis"
+ },
+ "BGR": {
+ "name": "Bulgarien",
+ "demonym_one": "Bulgarisch",
+ "demonym_other": "Bulgarische"
+ },
+ "BHR": {
+ "name": "Bahrain",
+ "demonym_one": "Bahrain",
+ "demonym_other": "Bahrainis"
+ },
+ "BHS": {
+ "name": "Bahamas",
+ "demonym_one": "Bahamian",
+ "demonym_other": "Bahamians"
+ },
+ "BIH": {
+ "name": "Bosnien und Herzegowina",
+ "demonym_one": "Bosnien-Herzegowinisch",
+ "demonym_other": "Bosnier, Herzegowina"
+ },
+ "BLM": {
+ "name": "St. Barthe lemy",
+ "demonym_one": "St. Barthe lemy Islander",
+ "demonym_other": "St. Barthe lemy Islander"
+ },
+ "BLR": {
+ "name": "Weißrussland",
+ "demonym_one": "Belarussisch",
+ "demonym_other": "Belarussen"
+ },
+ "BLZ": {
+ "name": "Belize",
+ "demonym_one": "Belizean",
+ "demonym_other": "Belizeaner"
+ },
+ "BMU": {
+ "name": "Bermuda",
+ "demonym_one": "Bermudian",
+ "demonym_other": "Bermudians"
+ },
+ "BOL": {
+ "name": "Bolivia",
+ "demonym_one": "Bolivianisch",
+ "demonym_other": "Bolivianer"
+ },
+ "BRA": {
+ "name": "Brasilien",
+ "demonym_one": "Brasilianisch",
+ "demonym_other": "Brasilianer"
+ },
+ "BRB": {
+ "name": "Barbados",
+ "demonym_one": "Barbadisch",
+ "demonym_other": "Barbäer"
+ },
+ "BRN": {
+ "name": "Brunei",
+ "demonym_one": "Bruneiisch",
+ "demonym_other": "Bruneians"
+ },
+ "BTN": {
+ "name": "Bhutan",
+ "demonym_one": "Bhutanisch",
+ "demonym_other": "Bhutanisch"
+ },
+ "BVT": {
+ "name": "Bouvet-Insel"
+ },
+ "BWA": {
+ "name": "Botswana",
+ "demonym_one": "Motswana",
+ "demonym_other": "Batswana"
+ },
+ "CAF": {
+ "name": "Zentralafrikanische Republik",
+ "demonym_one": "Zentralafrikanisch",
+ "demonym_other": "Zentralafrikaner"
+ },
+ "CAN": {
+ "name": "Kanada",
+ "demonym_one": "Kanadisch",
+ "demonym_other": "Kanadier"
+ },
+ "CCK": {
+ "name": "Kokosinseln (Keeling)",
+ "demonym_one": "Cocos Islander",
+ "demonym_other": "Cocos Islanders"
+ },
+ "CHE": {
+ "name": "Schweiz",
+ "demonym_one": "Schweiz",
+ "demonym_other": "Schweiz"
+ },
+ "CHL": {
+ "name": "Chile",
+ "demonym_one": "Chilean",
+ "demonym_other": "Chilenen"
+ },
+ "CHN": {
+ "name": "China",
+ "demonym_one": "Chinesisch",
+ "demonym_other": "Chinesisch"
+ },
+ "CIV": {
+ "name": "Elfenbeinküste",
+ "demonym_one": "Ivorisch",
+ "demonym_other": "Ivorians"
+ },
+ "CMR": {
+ "name": "Kamerun",
+ "demonym_one": "Kamerunisch",
+ "demonym_other": "Kameruner"
+ },
+ "COD": {
+ "name": "DR Congo",
+ "demonym_one": "Congolese",
+ "demonym_other": "Congolese"
+ },
+ "COG": {
+ "name": "Republik Kongo",
+ "demonym_one": "Congolese",
+ "demonym_other": "Congolese"
+ },
+ "COK": {
+ "name": "Cookinseln",
+ "demonym_one": "Kochinseln",
+ "demonym_other": "Kochinseln"
+ },
+ "COL": {
+ "name": "Kolumbien",
+ "demonym_one": "Kolumbien",
+ "demonym_other": "Kolumbianer"
+ },
+ "COM": {
+ "name": "Komoren",
+ "demonym_one": "Komoren",
+ "demonym_other": "Comorans"
+ },
+ "CPV": {
+ "name": "Kap Verde",
+ "demonym_one": "Kap Verdian",
+ "demonym_other": "Kap Verdi"
+ },
+ "CRI": {
+ "name": "Costa Rica",
+ "demonym_one": "Costa Rica",
+ "demonym_other": "Costa Rica"
+ },
+ "CUB": {
+ "name": "Cuba",
+ "demonym_one": "Kubanisch",
+ "demonym_other": "Kubaner"
+ },
+ "CUW": {
+ "name": "Curaçao",
+ "demonym_one": "Niederländisch",
+ "demonym_other": "Niederländisch"
+ },
+ "CXR": {
+ "name": "Weihnachtsinsel",
+ "demonym_one": "Weihnachtsinseln",
+ "demonym_other": "Weihnachtsinseln"
+ },
+ "CYM": {
+ "name": "Cayman-Inseln",
+ "demonym_one": "Caymanian",
+ "demonym_other": "Kaymanianer"
+ },
+ "CYP": {
+ "name": "Zypern",
+ "demonym_one": "Zyprisch",
+ "demonym_other": "Zyprioten"
+ },
+ "CZE": {
+ "name": "Tschechien",
+ "demonym_one": "Tschechisch",
+ "demonym_other": "Tschechen"
+ },
+ "DEU": {
+ "name": "Deutschland",
+ "demonym_one": "Deutsch",
+ "demonym_other": "Deutsche"
+ },
+ "DJI": {
+ "name": "Djibouti",
+ "demonym_one": "Djibouti",
+ "demonym_other": "Djibouti"
+ },
+ "DMA": {
+ "name": "Dominika",
+ "demonym_one": "Dominikaner",
+ "demonym_other": "Dominikaner"
+ },
+ "DNK": {
+ "name": "Dänemark",
+ "demonym_one": "Dänisch",
+ "demonym_other": "Dänisch"
+ },
+ "DOM": {
+ "name": "Dominikanische Republik",
+ "demonym_one": "Dominikaner",
+ "demonym_other": "Dominikaner"
+ },
+ "DZA": {
+ "name": "Algeria",
+ "demonym_one": "Algerisch",
+ "demonym_other": "Algerier"
+ },
+ "ECU": {
+ "name": "Ecuador",
+ "demonym_one": "Ecuadorean",
+ "demonym_other": "Ecuadoreans"
+ },
+ "EGY": {
+ "name": "Ägypten",
+ "demonym_one": "Ägyptisch",
+ "demonym_other": "Ägypter"
+ },
+ "ERI": {
+ "name": "Eritrea",
+ "demonym_one": "Eritrean",
+ "demonym_other": "Eritreer"
+ },
+ "ESH": {
+ "name": "Westsahara",
+ "demonym_one": "Saharaui",
+ "demonym_other": "Sahrawis"
+ },
+ "ESP": {
+ "name": "Spanien",
+ "demonym_one": "Spanisch",
+ "demonym_other": "Spanisch"
+ },
+ "EST": {
+ "name": "Estland",
+ "demonym_one": "Estnisch",
+ "demonym_other": "Esten"
+ },
+ "ETH": {
+ "name": "Ethiopia",
+ "demonym_one": "Äthiopisch",
+ "demonym_other": "Äthiopier"
+ },
+ "FIN": {
+ "name": "Finnland",
+ "demonym_one": "Finnisch",
+ "demonym_other": "Finns"
+ },
+ "FJI": {
+ "name": "Fiji",
+ "demonym_one": "Fijian",
+ "demonym_other": "Fijians"
+ },
+ "FLK": {
+ "name": "Falklandinseln",
+ "demonym_one": "Falkland Islander",
+ "demonym_other": "Falkland Islanders"
+ },
+ "FRA": {
+ "name": "Frankreich",
+ "demonym_one": "Französisch",
+ "demonym_other": "Französisch"
+ },
+ "FRO": {
+ "name": "Färöer Inseln",
+ "demonym_one": "Faroese",
+ "demonym_other": "Faroese"
+ },
+ "FSM": {
+ "name": "Micronesia",
+ "demonym_one": "Mikronesisch",
+ "demonym_other": "Micronesians"
+ },
+ "GAB": {
+ "name": "Gabon",
+ "demonym_one": "Gabunesisch",
+ "demonym_other": "Gabunesisch"
+ },
+ "GBR": {
+ "name": "Großbritannien",
+ "demonym_one": "Britisch",
+ "demonym_other": "Britisch"
+ },
+ "GEO": {
+ "name": "Georgien",
+ "demonym_one": "Georgisch",
+ "demonym_other": "Georgier"
+ },
+ "GGY": {
+ "name": "Guernsey",
+ "demonym_one": "Kanalinseln",
+ "demonym_other": "Kanalinseln"
+ },
+ "GHA": {
+ "name": "Ghana",
+ "demonym_one": "Ghanaisch",
+ "demonym_other": "Ghanaisch"
+ },
+ "GIB": {
+ "name": "Gibraltar",
+ "demonym_one": "Gibraltar",
+ "demonym_other": "Gibraltar"
+ },
+ "GIN": {
+ "name": "Guinea",
+ "demonym_one": "Guinean",
+ "demonym_other": "Guineans"
+ },
+ "GLP": {
+ "name": "Guadeloupe",
+ "demonym_one": "Guadeloupian",
+ "demonym_other": "Guadeloupians"
+ },
+ "GMB": {
+ "name": "Gambia",
+ "demonym_one": "Gambia",
+ "demonym_other": "Gambien"
+ },
+ "GNB": {
+ "name": "Guinea-Bissau",
+ "demonym_one": "Guinea-Bissauan",
+ "demonym_other": "Guinea-Bissauans"
+ },
+ "GNQ": {
+ "name": "Equatorial Guinea",
+ "demonym_one": "Equatorial Guinean",
+ "demonym_other": "Äquatorialguineer"
+ },
+ "GRC": {
+ "name": "Griechenland",
+ "demonym_one": "Griechisch",
+ "demonym_other": "Greeks"
+ },
+ "GRD": {
+ "name": "Grenada",
+ "demonym_one": "Grenadisch",
+ "demonym_other": "Grenadier"
+ },
+ "GRL": {
+ "name": "Grönland",
+ "demonym_one": "Grönländisch",
+ "demonym_other": "Grönlander"
+ },
+ "GTM": {
+ "name": "Guatemala",
+ "demonym_one": "Guatemala",
+ "demonym_other": "Guatemalaner"
+ },
+ "GUF": {
+ "name": "Französisch-Guayana"
+ },
+ "GUM": {
+ "name": "Guam",
+ "demonym_one": "Guamanisch",
+ "demonym_other": "Guamanians"
+ },
+ "GUY": {
+ "name": "Guyana",
+ "demonym_one": "Guyanese",
+ "demonym_other": "Guyanese"
+ },
+ "HKG": {
+ "name": "Hongkong",
+ "demonym_one": "Hongkong",
+ "demonym_other": "Hongkong"
+ },
+ "HMD": {
+ "name": "Heard Island und McDonald Inseln",
+ "demonym_one": "Heard und McDonald Islander",
+ "demonym_other": "Heard und McDonald Islanders"
+ },
+ "HND": {
+ "name": "Honduras",
+ "demonym_one": "Honduras",
+ "demonym_other": "Hondurans"
+ },
+ "HRV": {
+ "name": "Kroatien",
+ "demonym_one": "Kroatisch",
+ "demonym_other": "Kroaten"
+ },
+ "HTI": {
+ "name": "Haiti",
+ "demonym_one": "Haitian",
+ "demonym_other": "Haitianer"
+ },
+ "HUN": {
+ "name": "Ungarn",
+ "demonym_one": "Ungarisch",
+ "demonym_other": "Ungarn"
+ },
+ "IDN": {
+ "name": "Indonesien",
+ "demonym_one": "Indonesisch",
+ "demonym_other": "Indonesier"
+ },
+ "IMN": {
+ "name": "Insel Man",
+ "demonym_one": "Manx",
+ "demonym_other": "Manx"
+ },
+ "IND": {
+ "name": "Indien",
+ "demonym_one": "Indisch",
+ "demonym_other": "Inder"
+ },
+ "IOT": {
+ "name": "Britisches Territorium im Indischen Ozean",
+ "demonym_one": "Indisch",
+ "demonym_other": "Inder"
+ },
+ "IRL": {
+ "name": "Irland",
+ "demonym_one": "Irisch",
+ "demonym_other": "Irisch"
+ },
+ "IRN": {
+ "name": "Iran",
+ "demonym_one": "Iran",
+ "demonym_other": "Iraner"
+ },
+ "IRQ": {
+ "name": "Irak",
+ "demonym_one": "Irak",
+ "demonym_other": "Iraqis"
+ },
+ "ISL": {
+ "name": "Island",
+ "demonym_one": "Isländisch",
+ "demonym_other": "Isländer"
+ },
+ "ISR": {
+ "name": "Israel",
+ "demonym_one": "Israelisch",
+ "demonym_other": "Israelis"
+ },
+ "ITA": {
+ "name": "Italien",
+ "demonym_one": "Italienisch",
+ "demonym_other": "Italiener"
+ },
+ "JAM": {
+ "name": "Jamaica",
+ "demonym_one": "Jamaikanisch",
+ "demonym_other": "Jamaicans"
+ },
+ "JEY": {
+ "name": "Trikot",
+ "demonym_one": "Kanalinseln",
+ "demonym_other": "Kanalinseln"
+ },
+ "JOR": {
+ "name": "Jordanien",
+ "demonym_one": "Jordanisch",
+ "demonym_other": "Jordanisch"
+ },
+ "JPN": {
+ "name": "Japan",
+ "demonym_one": "Japanisch",
+ "demonym_other": "Japanisch"
+ },
+ "KAZ": {
+ "name": "Kasachstan",
+ "demonym_one": "Kasachstan",
+ "demonym_other": "Kasachstan"
+ },
+ "KEN": {
+ "name": "Kenia",
+ "demonym_one": "Kenia",
+ "demonym_other": "Kenianer"
+ },
+ "KGZ": {
+ "name": "Kyrgyzstan",
+ "demonym_one": "Kirghiz",
+ "demonym_other": "Kirghiz"
+ },
+ "KHM": {
+ "name": "Kambodscha",
+ "demonym_one": "Kambodschanisch",
+ "demonym_other": "Kambodschaner"
+ },
+ "KIR": {
+ "name": "Kiribati",
+ "demonym_one": "I-Kiribati",
+ "demonym_other": "I-Kiribatis"
+ },
+ "KNA": {
+ "name": "St. Kitts und Nevis",
+ "demonym_one": "Kittisch oder Nevisisch",
+ "demonym_other": "Kittianer oder Nevisaner"
+ },
+ "KOR": {
+ "name": "Südkorea",
+ "demonym_one": "Südkoreanische",
+ "demonym_other": "Südkoreaner"
+ },
+ "KWT": {
+ "name": "Kuwait",
+ "demonym_one": "Kuwaiti",
+ "demonym_other": "Kuwaitis"
+ },
+ "LAO": {
+ "name": "Laos",
+ "demonym_one": "Laotisch",
+ "demonym_other": "Laoten"
+ },
+ "LBN": {
+ "name": "Lebanon",
+ "demonym_one": "Libanesisch",
+ "demonym_other": "Libanesisch"
+ },
+ "LBR": {
+ "name": "Liberia",
+ "demonym_one": "Liberisch",
+ "demonym_other": "Liberianer"
+ },
+ "LBY": {
+ "name": "Libyen",
+ "demonym_one": "Libysch",
+ "demonym_other": "Libyer"
+ },
+ "LCA": {
+ "name": "St. Lucia",
+ "demonym_one": "St. Lucian",
+ "demonym_other": "St. Lucians"
+ },
+ "LIE": {
+ "name": "Liechtenstein",
+ "demonym_one": "Liechtensteiner",
+ "demonym_other": "Liechtensteiners"
+ },
+ "LKA": {
+ "name": "Sri-Lanka",
+ "demonym_one": "Sri Lanka",
+ "demonym_other": "Sri Lankaner"
+ },
+ "LSO": {
+ "name": "Lesotho",
+ "demonym_one": "Mosotho",
+ "demonym_other": "Basotho"
+ },
+ "LTU": {
+ "name": "Litauen",
+ "demonym_one": "Litauisch",
+ "demonym_other": "Litauer"
+ },
+ "LUX": {
+ "name": "Luxembourg",
+ "demonym_one": "Luxembourger",
+ "demonym_other": "Luxembourgers"
+ },
+ "LVA": {
+ "name": "Lettland",
+ "demonym_one": "Lettisch",
+ "demonym_other": "Letten"
+ },
+ "MAC": {
+ "name": "Macau",
+ "demonym_one": "Chinesisch",
+ "demonym_other": "Chinesisch"
+ },
+ "MAF": {
+ "name": "St. Martin",
+ "demonym_one": "Insel St. Martin",
+ "demonym_other": "Islander von St. Martin"
+ },
+ "MAR": {
+ "name": "Marokko",
+ "demonym_one": "Marokkanisch",
+ "demonym_other": "Marokkaner"
+ },
+ "MCO": {
+ "name": "Monaco",
+ "demonym_one": "Monegasque",
+ "demonym_other": "Monegasken"
+ },
+ "MDA": {
+ "name": "Moldova",
+ "demonym_one": "Moldovan",
+ "demonym_other": "Moldovans"
+ },
+ "MDG": {
+ "name": "Madagascar",
+ "demonym_one": "Malagasy",
+ "demonym_other": "Malagasy"
+ },
+ "MDV": {
+ "name": "Malediven",
+ "demonym_one": "Maldivan",
+ "demonym_other": "Maldivans"
+ },
+ "MEX": {
+ "name": "Mexiko",
+ "demonym_one": "Mexikanisch",
+ "demonym_other": "Mexicans"
+ },
+ "MHL": {
+ "name": "Marshall-Inseln",
+ "demonym_one": "Marshallesisch",
+ "demonym_other": "Marshallesisch"
+ },
+ "MKD": {
+ "name": "Nordmazedonien",
+ "demonym_one": "Makedonisch",
+ "demonym_other": "Mazedonier"
+ },
+ "MLI": {
+ "name": "Mali",
+ "demonym_one": "Malisch",
+ "demonym_other": "Malik"
+ },
+ "MLT": {
+ "name": "Malta",
+ "demonym_one": "Maltese",
+ "demonym_other": "Maltese"
+ },
+ "MMR": {
+ "name": "Myanmar",
+ "demonym_one": "Bamar",
+ "demonym_other": "Bamars"
+ },
+ "MNE": {
+ "name": "Montenegro",
+ "demonym_one": "Montenegro",
+ "demonym_other": "Montenegrins"
+ },
+ "MNG": {
+ "name": "Mongolia",
+ "demonym_one": "Mongolisch",
+ "demonym_other": "Mongolen"
+ },
+ "MNP": {
+ "name": "Nördliche Mariana-Inseln",
+ "demonym_one": "Amerikanisch",
+ "demonym_other": "Amerikaner"
+ },
+ "MOZ": {
+ "name": "Mosambik",
+ "demonym_one": "Mozambican",
+ "demonym_other": "Mozambicans"
+ },
+ "MRT": {
+ "name": "Mauritania",
+ "demonym_one": "Mauritanian",
+ "demonym_other": "Mauretanisch"
+ },
+ "MSR": {
+ "name": "Montserrat",
+ "demonym_one": "Montserratian",
+ "demonym_other": "Montserratians"
+ },
+ "MTQ": {
+ "name": "Martinique",
+ "demonym_one": "Französisch",
+ "demonym_other": "Französisch"
+ },
+ "MUS": {
+ "name": "Mauritius",
+ "demonym_one": "Mauritius",
+ "demonym_other": "Mauritius"
+ },
+ "MWI": {
+ "name": "Malawi",
+ "demonym_one": "Malawian",
+ "demonym_other": "Malawians"
+ },
+ "MYS": {
+ "name": "Malaysia",
+ "demonym_one": "Malaysisch",
+ "demonym_other": "Malaysier"
+ },
+ "MYT": {
+ "name": "Mayotte",
+ "demonym_one": "Mahoran",
+ "demonym_other": "Mahorans"
+ },
+ "NAM": {
+ "name": "Namibia",
+ "demonym_one": "Namibian",
+ "demonym_other": "Namibier"
+ },
+ "NCL": {
+ "name": "Neukaledonien",
+ "demonym_one": "Neukaledonien",
+ "demonym_other": "Neue Kaledonier"
+ },
+ "NER": {
+ "name": "Niger",
+ "demonym_one": "Nigerien",
+ "demonym_other": "Nigeriens"
+ },
+ "NFK": {
+ "name": "Norfolk-Insel",
+ "demonym_one": "Norfolkinseln",
+ "demonym_other": "Norfolkinseln"
+ },
+ "NGA": {
+ "name": "Nigeria",
+ "demonym_one": "Nigerian",
+ "demonym_other": "Nigerianer"
+ },
+ "NIC": {
+ "name": "Nicaragua",
+ "demonym_one": "Nicaraguan",
+ "demonym_other": "Nicaraguans"
+ },
+ "NIU": {
+ "name": "Niue",
+ "demonym_one": "Niuesisch",
+ "demonym_other": "Niueen"
+ },
+ "NLD": {
+ "name": "Neuseeland",
+ "demonym_one": "Niederländisch",
+ "demonym_other": "Niederländisch"
+ },
+ "NOR": {
+ "name": "Norwegen",
+ "demonym_one": "Norwegisch",
+ "demonym_other": "Norwegisch"
+ },
+ "NPL": {
+ "name": "Nepal",
+ "demonym_one": "Nepalese",
+ "demonym_other": "Nepalese"
+ },
+ "NRU": {
+ "name": "Nauru",
+ "demonym_one": "Nauruan",
+ "demonym_other": "Nauruans"
+ },
+ "NZL": {
+ "name": "Neuseeland",
+ "demonym_one": "Neuseeland",
+ "demonym_other": "Neuseeland"
+ },
+ "OMN": {
+ "name": "Oman",
+ "demonym_one": "Omani",
+ "demonym_other": "Omanis"
+ },
+ "PAK": {
+ "name": "Pakistan",
+ "demonym_one": "Pakistani",
+ "demonym_other": "Pakistanis"
+ },
+ "PAN": {
+ "name": "Panama",
+ "demonym_one": "Panamanisch",
+ "demonym_other": "Panamanisch"
+ },
+ "PCN": {
+ "name": "Pitcairn Inseln",
+ "demonym_one": "Pitcairn Islander",
+ "demonym_other": "Pitcairn Islanders"
+ },
+ "PER": {
+ "name": "Peru",
+ "demonym_one": "Peruvian",
+ "demonym_other": "Peruaner"
+ },
+ "PHL": {
+ "name": "Philippinen",
+ "demonym_one": "Philippinisch",
+ "demonym_other": "Philippinen"
+ },
+ "PLW": {
+ "name": "Palau",
+ "demonym_one": "Palauan",
+ "demonym_other": "Palauans"
+ },
+ "PNG": {
+ "name": "Papua New Guinea",
+ "demonym_one": "Papua New Guinean",
+ "demonym_other": "Papua New Guineans"
+ },
+ "POL": {
+ "name": "Polen",
+ "demonym_one": "Polnisch",
+ "demonym_other": "Polnisch"
+ },
+ "PRI": {
+ "name": "Puerto Rico",
+ "demonym_one": "Puerto Rico",
+ "demonym_other": "Puerto Rico"
+ },
+ "PRK": {
+ "name": "Nordkorea",
+ "demonym_one": "Nordkoreanisch",
+ "demonym_other": "Nordkoreaner"
+ },
+ "PRT": {
+ "name": "Portugal",
+ "demonym_one": "Portugiesisch",
+ "demonym_other": "Portugiesisch"
+ },
+ "PRY": {
+ "name": "Paraguay",
+ "demonym_one": "Paraguayan",
+ "demonym_other": "Paraguayans"
+ },
+ "PSE": {
+ "name": "Palestine",
+ "demonym_one": "Palestinian",
+ "demonym_other": "Palestinians"
+ },
+ "PYF": {
+ "name": "Französische Polynesien",
+ "demonym_one": "Französisch-Polynesisch",
+ "demonym_other": "Französische Polynesier"
+ },
+ "QAT": {
+ "name": "Qatar",
+ "demonym_one": "Qatari",
+ "demonym_other": "Kataris"
+ },
+ "REU": {
+ "name": "Réunion",
+ "demonym_one": "Französisch",
+ "demonym_other": "Französisch"
+ },
+ "ROU": {
+ "name": "Rumänien",
+ "demonym_one": "Rumänisch",
+ "demonym_other": "Rumänen"
+ },
+ "RUS": {
+ "name": "Russland",
+ "demonym_one": "Russisch",
+ "demonym_other": "Russen"
+ },
+ "RWA": {
+ "name": "Rwanda",
+ "demonym_one": "Rwandan",
+ "demonym_other": "Rwandans"
+ },
+ "SAU": {
+ "name": "Saudi-Arabien",
+ "demonym_one": "Saudi-Arabien",
+ "demonym_other": "Saudi-Arabien"
+ },
+ "SDN": {
+ "name": "Sudan",
+ "demonym_one": "Sudanese",
+ "demonym_other": "Sudanese"
+ },
+ "SEN": {
+ "name": "Senegal",
+ "demonym_one": "Senegalese",
+ "demonym_other": "Senegalese"
+ },
+ "SGP": {
+ "name": "Singapur",
+ "demonym_one": "Singapur",
+ "demonym_other": "Singapur"
+ },
+ "SGS": {
+ "name": "Südasien",
+ "demonym_one": "Südgeorgianische Süd-Sandwichinseln",
+ "demonym_other": "Südgeorgianische Süd-Sandwich-Inseln"
+ },
+ "SHN": {
+ "name": "St. Helena, Ascension und Tristan da Cunha"
+ },
+ "SJM": {
+ "name": "Spitzbergen und Jan Mayen",
+ "demonym_one": "Norwegisch",
+ "demonym_other": "Norwegisch"
+ },
+ "SLB": {
+ "name": "Salomonen",
+ "demonym_one": "Salomoninseln",
+ "demonym_other": "Salomonische Inseln"
+ },
+ "SLE": {
+ "name": "Sierra Leone",
+ "demonym_one": "Sierra Leonean",
+ "demonym_other": "Sierra Leoneans"
+ },
+ "SLV": {
+ "name": "El Salvador",
+ "demonym_one": "Salvadorisch",
+ "demonym_other": "Salvadorans"
+ },
+ "SMR": {
+ "name": "San Marino",
+ "demonym_one": "Sammarinese",
+ "demonym_other": "Sammarinese"
+ },
+ "SOM": {
+ "name": "Somalia",
+ "demonym_one": "Somali",
+ "demonym_other": "Somalis"
+ },
+ "SPM": {
+ "name": "St. Pierre und Miquelon",
+ "demonym_one": "Französisch",
+ "demonym_other": "Französisch"
+ },
+ "SRB": {
+ "name": "Serbien",
+ "demonym_one": "Serbisch",
+ "demonym_other": "Serbische"
+ },
+ "SSD": {
+ "name": "Südsudan",
+ "demonym_one": "Südsudanesen",
+ "demonym_other": "Südsudanesen"
+ },
+ "STP": {
+ "name": "Sa o Tome und Pri ncipe",
+ "demonym_one": "Sao Tomean",
+ "demonym_other": "Sao Tomeans"
+ },
+ "SUR": {
+ "name": "Suriname",
+ "demonym_one": "Surinamer",
+ "demonym_other": "Surinamer"
+ },
+ "SVK": {
+ "name": "Slowakei",
+ "demonym_one": "Slowakisch",
+ "demonym_other": "Slovaks"
+ },
+ "SVN": {
+ "name": "Slovenia",
+ "demonym_one": "Slovene",
+ "demonym_other": "Slovenes"
+ },
+ "SWE": {
+ "name": "Schweden",
+ "demonym_one": "Schwedisch",
+ "demonym_other": "Schwedisch"
+ },
+ "SWZ": {
+ "name": "Eswatini",
+ "demonym_one": "Swazi",
+ "demonym_other": "Swazis"
+ },
+ "SXM": {
+ "name": "Sint Maarten",
+ "demonym_one": "St. Maartener",
+ "demonym_other": "St. Maarteners"
+ },
+ "SYC": {
+ "name": "Seychelles",
+ "demonym_one": "Seychellois",
+ "demonym_other": "Seychellois"
+ },
+ "SYR": {
+ "name": "Syrien",
+ "demonym_one": "Syrisch",
+ "demonym_other": "Syrer"
+ },
+ "TCA": {
+ "name": "Turks und Caicos Inseln",
+ "demonym_one": "Türken und Caicos Islander",
+ "demonym_other": "Türken und Caicos Islander"
+ },
+ "TCD": {
+ "name": "Tschad",
+ "demonym_one": "Tschad",
+ "demonym_other": "Tschadisch"
+ },
+ "TGO": {
+ "name": "Togo",
+ "demonym_one": "Togolese",
+ "demonym_other": "Togolese"
+ },
+ "THA": {
+ "name": "Thailand",
+ "demonym_one": "Thailändisch",
+ "demonym_other": "Thais"
+ },
+ "TJK": {
+ "name": "Tajikistan",
+ "demonym_one": "Tadschiki",
+ "demonym_other": "Tadschiken"
+ },
+ "TKL": {
+ "name": "Tokelau",
+ "demonym_one": "Tokelauisch",
+ "demonym_other": "Tokelauans"
+ },
+ "TKM": {
+ "name": "Turkmenistan",
+ "demonym_one": "Turkmen",
+ "demonym_other": "Turkmenen"
+ },
+ "TLS": {
+ "name": "Timor-Leste",
+ "demonym_one": "Osttimoresisch",
+ "demonym_other": "Osttimoresisch"
+ },
+ "TON": {
+ "name": "Tonga",
+ "demonym_one": "Tongan",
+ "demonym_other": "Tongans"
+ },
+ "TTO": {
+ "name": "Trinidad und Tobago",
+ "demonym_one": "Trinidadian",
+ "demonym_other": "Trinidadians"
+ },
+ "TUN": {
+ "name": "Tunisia",
+ "demonym_one": "Tunisian",
+ "demonym_other": "Tunesier"
+ },
+ "TUR": {
+ "name": "Türkei",
+ "demonym_one": "Türkisch",
+ "demonym_other": "Türken"
+ },
+ "TUV": {
+ "name": "Tuvalu",
+ "demonym_one": "Tuvaluan",
+ "demonym_other": "Tuvaluans"
+ },
+ "TWN": {
+ "name": "Taiwan",
+ "demonym_one": "Taiwanisch",
+ "demonym_other": "Taiwanisch"
+ },
+ "TZA": {
+ "name": "Tanzania",
+ "demonym_one": "Tansanisch",
+ "demonym_other": "Tansanisch"
+ },
+ "UGA": {
+ "name": "Uganda",
+ "demonym_one": "Ugandan",
+ "demonym_other": "Ugandans"
+ },
+ "UKR": {
+ "name": "Ukraine",
+ "demonym_one": "Ukrainische",
+ "demonym_other": "Ukrainer"
+ },
+ "UMI": {
+ "name": "Kleine Inseln in äußerster Randlage der USA",
+ "demonym_one": "Amerikanisch",
+ "demonym_other": "Amerikaner"
+ },
+ "UNK": {
+ "name": "Kosovo",
+ "demonym_one": "Kosovar",
+ "demonym_other": "Kosovars"
+ },
+ "URY": {
+ "name": "Uruguay",
+ "demonym_one": "Uruguayan",
+ "demonym_other": "Uruguayans"
+ },
+ "USA": {
+ "name": "Vereinigte Staaten",
+ "demonym_one": "Amerikanisch",
+ "demonym_other": "Amerikaner"
+ },
+ "UZB": {
+ "name": "Uzbekistan",
+ "demonym_one": "Uzbekistani",
+ "demonym_other": "Uzbekistanis"
+ },
+ "VAT": {
+ "name": "Vatikanstadt",
+ "demonym_one": "Italienisch",
+ "demonym_other": "Italiener"
+ },
+ "VCT": {
+ "name": "St. Vincent und die Grenadinen",
+ "demonym_one": "Saint Vincentian",
+ "demonym_other": "St. Vincentianer"
+ },
+ "VEN": {
+ "name": "Venezuela",
+ "demonym_one": "Venezuelanisch",
+ "demonym_other": "Venezolaner"
+ },
+ "VGB": {
+ "name": "Britische Jungferninseln",
+ "demonym_one": "Jungferninseln",
+ "demonym_other": "Jungferninseln"
+ },
+ "VIR": {
+ "name": "Amerikanische Jungferninseln",
+ "demonym_one": "Jungferninseln",
+ "demonym_other": "Jungferninseln"
+ },
+ "VNM": {
+ "name": "Vietnam",
+ "demonym_one": "Vietnamese",
+ "demonym_other": "Vietnamese"
+ },
+ "VUT": {
+ "name": "Vanuatu",
+ "demonym_one": "Ni-Vanuatu",
+ "demonym_other": "Ni-Vanuatu"
+ },
+ "WLF": {
+ "name": "Wallis und Futuna",
+ "demonym_one": "Wallis und Futuna Islander",
+ "demonym_other": "Wallis und Futuna-Inseln"
+ },
+ "WSM": {
+ "name": "Samoa",
+ "demonym_one": "Samoan",
+ "demonym_other": "Samoans"
+ },
+ "YEM": {
+ "name": "Jemen",
+ "demonym_one": "Jemen",
+ "demonym_other": "Jemenis"
+ },
+ "ZAF": {
+ "name": "Südafrika",
+ "demonym_one": "Südafrikanisch",
+ "demonym_other": "Südafrikaner"
+ },
+ "ZMB": {
+ "name": "Zambia",
+ "demonym_one": "Sambia",
+ "demonym_other": "Samen"
+ },
+ "ZWE": {
+ "name": "Zimbabwe",
+ "demonym_one": "Simbabwe",
+ "demonym_other": "Simbabwer"
+ }
+}
diff --git a/apps/app/public/locales/de-DE/gov-dist.json b/apps/app/public/locales/de-DE/gov-dist.json
new file mode 100644
index 0000000000..12a4154b41
--- /dev/null
+++ b/apps/app/public/locales/de-DE/gov-dist.json
@@ -0,0 +1,3333 @@
+{
+ "ca-alberta": "Jennifer",
+ "ca-british-columbia": "Britisch-Kolumbien",
+ "ca-manitoba": "Manitoba",
+ "ca-new-brunswick": "Neuer Brunsick",
+ "ca-newfoundland-and-labrador": "Neufundland und Labrador",
+ "ca-northwest-territories": "Nordwest-Gebiete",
+ "ca-nova-scotia": "Nova Scotia",
+ "ca-nunavut": "Nunavut",
+ "ca-ontario": "Ontario",
+ "ca-prince-edward-island": "Prinz Edward Insel",
+ "ca-quebec": "Québec",
+ "ca-saskatchewan": "Saskatchewan",
+ "ca-yukon": "Yukon",
+ "mx-aguascalientes": "Aguascalientes",
+ "mx-baja-california": "Baja Kalifornien",
+ "mx-baja-california-sur": "Baja California Sur",
+ "mx-campeche": "Campeche",
+ "mx-chiapas": "Chiapas",
+ "mx-chihuahua": "Chihuahua",
+ "mx-coahuila": "Coahuila",
+ "mx-colima": "Colima",
+ "mx-distrito-federal": "Distrito Federal",
+ "mx-durango": "Durango",
+ "mx-guanajuato": "Guanajuato",
+ "mx-guerrero": "Guerrero",
+ "mx-hidalgo": "Hidalgo",
+ "mx-jalisco": "Jalisco",
+ "mx-mexico": "Mexiko",
+ "mx-michoacan": "Michoacan",
+ "mx-morelos": "Morelos",
+ "mx-nayarit": "Nayarit",
+ "mx-nuevo-leon": "Nuevo Leon",
+ "mx-oaxaca": "Oaxaca",
+ "mx-puebla": "Puebla",
+ "mx-queretaro": "Queretaro",
+ "mx-quintana-roo": "Quintana Roo",
+ "mx-san-luis-potosi": "San Luis Potosi",
+ "mx-sinaloa": "Sinaloa",
+ "mx-sonora": "Sonora",
+ "mx-tabasco": "Tabasco",
+ "mx-tamaulipas": "Tamaulipas",
+ "mx-tlaxcala": "Tlaxcala",
+ "mx-veracruz": "Veracruz",
+ "mx-yucatan": "Yucatan",
+ "mx-zacatecas": "Zacatecas",
+ "pr-adjuntas": "Adjuntas",
+ "pr-aguada": "Aguada",
+ "pr-aguadilla": "Aguadilla",
+ "pr-aguas-buenas": "Aguas Buenas",
+ "pr-aibonito": "Aibonito",
+ "pr-anasco": "An asco",
+ "pr-arecibo": "Arecibo",
+ "pr-arroyo": "Arroyo",
+ "pr-barceloneta": "Barceloneta",
+ "pr-barranquitas": "Barranquitas",
+ "pr-bayamon": "Bayamón",
+ "pr-cabo-rojo": "Cabo Rojo",
+ "pr-caguas": "Caguas",
+ "pr-camuy": "Camuy",
+ "pr-canovanas": "Cano vanas",
+ "pr-carolina": "Jennifer",
+ "pr-catano": "Katanisch",
+ "pr-cayey": "Cayey",
+ "pr-ceiba": "Ceiba",
+ "pr-ciales": "Christus",
+ "pr-cidra": "Cidra",
+ "pr-coamo": "Coamo",
+ "pr-comerio": "Comerío",
+ "pr-corozal": "Corozal",
+ "pr-culebra": "Culebra",
+ "pr-dorado": "Jörg",
+ "pr-fajardo": "Fajardo",
+ "pr-florida": "Florida",
+ "pr-guanica": "Gua nica",
+ "pr-guayama": "Guayama",
+ "pr-guayanilla": "Guayanilla",
+ "pr-guaynabo": "Guaynabo",
+ "pr-gurabo": "Gurabo",
+ "pr-hatillo": "Hatillo",
+ "pr-hormigueros": "Hormigueros",
+ "pr-humacao": "Humacao",
+ "pr-isabela": "Isabela",
+ "pr-jayuya": "Jayuya",
+ "pr-juana-diaz": "Juana Di az",
+ "pr-juncos": "Juncos",
+ "pr-lajas": "Lajas",
+ "pr-lares": "Lares",
+ "pr-las-marias": "Las Marías",
+ "pr-las-piedras": "Las Piedras",
+ "pr-loiza": "Loi za",
+ "pr-luquillo": "Luquillo",
+ "pr-manati": "Manati",
+ "pr-maricao": "Maricao",
+ "pr-maunabo": "Maunabo",
+ "pr-mayaguez": "Mayagüez",
+ "pr-moca": "Moca",
+ "pr-morovis": "Morovis",
+ "pr-naguabo": "Naguabo",
+ "pr-naranjito": "Naranjito",
+ "pr-orocovis": "Orocovis",
+ "pr-patillas": "Kranke",
+ "pr-penuelas": "Peñuelas",
+ "pr-ponce": "Ponce",
+ "pr-quebradillas": "Quebradilla",
+ "pr-rincon": "Rincón",
+ "pr-rio-grande": "Ri o Grande",
+ "pr-sabana-grande": "Sabana Grande",
+ "pr-salinas": "Salinas",
+ "pr-san-german": "San Germa n",
+ "pr-san-juan": "San Juan",
+ "pr-san-lorenzo": "San Lorenzo",
+ "pr-san-sebastian": "San Sebastián",
+ "pr-santa-isabel": "Santa Isabel",
+ "pr-toa-alta": "Toa Alta",
+ "pr-toa-baja": "Toa Baja",
+ "pr-trujillo-alto": "Trujillo Alto",
+ "pr-utuado": "Utuado",
+ "pr-vega-alta": "Vega-Alta",
+ "pr-vega-baja": "Vega Baja",
+ "pr-vieques": "Vieques",
+ "pr-villalba": "Villalba",
+ "pr-yabucoa": "Yabucoa",
+ "pr-yauco": "Yauco",
+ "us-alabama": "Alabama",
+ "us-alabama-autauga-county": "Autauga",
+ "us-alabama-baldwin-county": "Baldwin",
+ "us-alabama-barbour-county": "Barbier",
+ "us-alabama-bibb-county": "Bibb",
+ "us-alabama-blount-county": "Blount",
+ "us-alabama-bullock-county": "Bullock",
+ "us-alabama-butler-county": "Butler",
+ "us-alabama-calhoun-county": "Calhoun",
+ "us-alabama-chambers-county": "Kammern",
+ "us-alabama-cherokee-county": "Cherokee",
+ "us-alabama-chilton-county": "Jörg",
+ "us-alabama-choctaw-county": "Choktaw",
+ "us-alabama-clarke-county": "Jörg",
+ "us-alabama-clay-county": "Lehm",
+ "us-alabama-cleburne-county": "Cleburne",
+ "us-alabama-coffee-county": "Kaffee",
+ "us-alabama-colbert-county": "Jörg",
+ "us-alabama-conecuh-county": "Conecuh",
+ "us-alabama-coosa-county": "Kosa",
+ "us-alabama-covington-county": "Covington",
+ "us-alabama-crenshaw-county": "Crenshaw",
+ "us-alabama-cullman-county": "Cullman",
+ "us-alabama-dale-county": "Tim",
+ "us-alabama-dallas-county": "Dallas",
+ "us-alabama-dekalb-county": "DeKalb",
+ "us-alabama-elmore-county": "Elmore",
+ "us-alabama-escambia-county": "Escambia",
+ "us-alabama-etowah-county": "Etowah",
+ "us-alabama-fayette-county": "Jörg",
+ "us-alabama-franklin-county": "Franklin",
+ "us-alabama-geneva-county": "Geneva",
+ "us-alabama-greene-county": "Grün",
+ "us-alabama-hale-county": "Hale",
+ "us-alabama-henry-county": "Gabriel",
+ "us-alabama-houston-county": "Houston",
+ "us-alabama-jackson-county": "Jennifer",
+ "us-alabama-jefferson-county": "Jefferson",
+ "us-alabama-lamar-county": "Lamar",
+ "us-alabama-lauderdale-county": "Lauderdale",
+ "us-alabama-lawrence-county": "Jörg",
+ "us-alabama-lee-county": "Lennon",
+ "us-alabama-limestone-county": "Kalkstein",
+ "us-alabama-lowndes-county": "Lowndes",
+ "us-alabama-macon-county": "Margaret",
+ "us-alabama-madison-county": "Madison",
+ "us-alabama-marengo-county": "Marengo",
+ "us-alabama-marion-county": "Marion",
+ "us-alabama-marshall-county": "Martha",
+ "us-alabama-mobile-county": "Mobil",
+ "us-alabama-monroe-county": "Monroe",
+ "us-alabama-montgomery-county": "Montgomery",
+ "us-alabama-morgan-county": "Morgan",
+ "us-alabama-perry-county": "Evelyn",
+ "us-alabama-pickens-county": "Pickens",
+ "us-alabama-pike-county": "Pike",
+ "us-alabama-randolph-county": "Zufällig",
+ "us-alabama-russell-county": "Russell",
+ "us-alabama-shelby-county": "Shelby",
+ "us-alabama-st-clair-county": "St. Clair",
+ "us-alabama-sumter-county": "Sumter",
+ "us-alabama-talladega-county": "Talladega",
+ "us-alabama-tallapoosa-county": "Tallapoosa",
+ "us-alabama-tuscaloosa-county": "Tuscaloosa",
+ "us-alabama-walker-county": "Wanderer",
+ "us-alabama-washington-county": "Arthur",
+ "us-alabama-wilcox-county": "Wilcox",
+ "us-alabama-winston-county": "Winston",
+ "us-alaska": "Alaska",
+ "us-alaska-aleutians-east-county": "Aleutianer Osten",
+ "us-alaska-aleutians-west-county": "Aleutianer Westen",
+ "us-alaska-anchorage-county": "Ankerplatz",
+ "us-alaska-bethel-county": "Bethel",
+ "us-alaska-bristol-bay-county": "Bristol Bay",
+ "us-alaska-denali-county": "Denali",
+ "us-alaska-dillingham-county": "Dillingham",
+ "us-alaska-fairbanks-north-star-county": "Fairbanks North Star",
+ "us-alaska-haines-county": "Haines",
+ "us-alaska-hoonah-angoon-county": "Hoonah-Angoon",
+ "us-alaska-juneau-county": "Lila",
+ "us-alaska-kenai-peninsula-county": "Kenai Peninsula",
+ "us-alaska-ketchikan-gateway-county": "Ketchikan Gateway",
+ "us-alaska-kodiak-island-county": "Kodiak-Insel",
+ "us-alaska-kusilvak-county": "Jasmin",
+ "us-alaska-lake-and-peninsula-county": "See und Halbinsel",
+ "us-alaska-matanuska-susitna-county": "Matanuska-Susitna",
+ "us-alaska-nome-county": "Nome",
+ "us-alaska-north-slope-county": "Nordneigung",
+ "us-alaska-northwest-arctic-county": "Nordwest-Arktis",
+ "us-alaska-petersburg-county": "Petersburg",
+ "us-alaska-prince-of-wales-hyder-county": "Prinz von Wales-Hyder",
+ "us-alaska-sitka-county": "Sitka",
+ "us-alaska-skagway-county": "Skagway",
+ "us-alaska-southeast-fairbanks-county": "Südost-Fairbanks",
+ "us-alaska-valdez-cordova-county": "Valdez-Cordova",
+ "us-alaska-wrangell-county": "Wrangell",
+ "us-alaska-yakutat-county": "Yakutat",
+ "us-alaska-yukon-koyukuk-county": "Yukon-Koyukuk",
+ "us-arizona": "Arizona",
+ "us-arizona-apache-county": "Apache",
+ "us-arizona-cochise-county": "Cochise",
+ "us-arizona-coconino-county": "Coconino",
+ "us-arizona-gila-county": "Gila",
+ "us-arizona-graham-county": "Graham",
+ "us-arizona-greenlee-county": "Lila",
+ "us-arizona-la-paz-county": "La Paz",
+ "us-arizona-maricopa-county": "Maricopa",
+ "us-arizona-mohave-county": "Mohar",
+ "us-arizona-navajo-county": "Navajo",
+ "us-arizona-pima-county": "Pima",
+ "us-arizona-pinal-county": "Pinal",
+ "us-arizona-santa-cruz-county": "Santa Cruz",
+ "us-arizona-yavapai-county": "Yavapai",
+ "us-arizona-yuma-county": "Yuma",
+ "us-arkansas": "Arkansas",
+ "us-arkansas-arkansas-county": "Arkansas",
+ "us-arkansas-ashley-county": "Evelyn",
+ "us-arkansas-baxter-county": "Baxter",
+ "us-arkansas-benton-county": "Benton",
+ "us-arkansas-boone-county": "Boone",
+ "us-arkansas-bradley-county": "Bradley",
+ "us-arkansas-calhoun-county": "Calhoun",
+ "us-arkansas-carroll-county": "Carlton",
+ "us-arkansas-chicot-county": "Chicot",
+ "us-arkansas-clark-county": "Jörg",
+ "us-arkansas-clay-county": "Lehm",
+ "us-arkansas-cleburne-county": "Cleburne",
+ "us-arkansas-cleveland-county": "Günter",
+ "us-arkansas-columbia-county": "Kolumbien",
+ "us-arkansas-conway-county": "Conway",
+ "us-arkansas-craighead-county": "Craighead",
+ "us-arkansas-crawford-county": "Werner",
+ "us-arkansas-crittenden-county": "Crittenden",
+ "us-arkansas-cross-county": "Kreuz",
+ "us-arkansas-dallas-county": "Dallas",
+ "us-arkansas-desha-county": "Elias",
+ "us-arkansas-drew-county": "Hannah",
+ "us-arkansas-faulkner-county": "Fehler",
+ "us-arkansas-franklin-county": "Franklin",
+ "us-arkansas-fulton-county": "Fulton",
+ "us-arkansas-garland-county": "Karl-Heinz",
+ "us-arkansas-grant-county": "Zuschuss",
+ "us-arkansas-greene-county": "Grün",
+ "us-arkansas-hempstead-county": "Hempstead",
+ "us-arkansas-hot-spring-county": "Heiße Quelle",
+ "us-arkansas-howard-county": "Jörg",
+ "us-arkansas-independence-county": "Unabhängigkeit",
+ "us-arkansas-izard-county": "Izard",
+ "us-arkansas-jackson-county": "Jennifer",
+ "us-arkansas-jefferson-county": "Jefferson",
+ "us-arkansas-johnson-county": "Jörg",
+ "us-arkansas-lafayette-county": "Lafayette",
+ "us-arkansas-lawrence-county": "Jörg",
+ "us-arkansas-lee-county": "Lennon",
+ "us-arkansas-lincoln-county": "Lincoln",
+ "us-arkansas-little-river-county": "Kleiner Fluss",
+ "us-arkansas-logan-county": "Logan",
+ "us-arkansas-lonoke-county": "Lonoke",
+ "us-arkansas-madison-county": "Madison",
+ "us-arkansas-marion-county": "Marion",
+ "us-arkansas-miller-county": "Fritz",
+ "us-arkansas-mississippi-county": "Mississippi",
+ "us-arkansas-monroe-county": "Monroe",
+ "us-arkansas-montgomery-county": "Montgomery",
+ "us-arkansas-nevada-county": "Nevada",
+ "us-arkansas-newton-county": "Newton",
+ "us-arkansas-ouachita-county": "Guillaume",
+ "us-arkansas-perry-county": "Evelyn",
+ "us-arkansas-phillips-county": "Phillips",
+ "us-arkansas-pike-county": "Pike",
+ "us-arkansas-poinsett-county": "Punktesatz",
+ "us-arkansas-polk-county": "Polk",
+ "us-arkansas-pope-county": "Papst",
+ "us-arkansas-prairie-county": "Prairie",
+ "us-arkansas-pulaski-county": "Pulaski",
+ "us-arkansas-randolph-county": "Zufällig",
+ "us-arkansas-saline-county": "Salin",
+ "us-arkansas-scott-county": "Jörg",
+ "us-arkansas-searcy-county": "Seilschaft",
+ "us-arkansas-sebastian-county": "Sebastian",
+ "us-arkansas-sevier-county": "Sevier",
+ "us-arkansas-sharp-county": "Scharf",
+ "us-arkansas-st-francis-county": "St. Francis",
+ "us-arkansas-stone-county": "Stein",
+ "us-arkansas-union-county": "Union",
+ "us-arkansas-van-buren-county": "Van Buren",
+ "us-arkansas-washington-county": "Arthur",
+ "us-arkansas-white-county": "Weiß",
+ "us-arkansas-woodruff-county": "Woodruff",
+ "us-arkansas-yell-county": "Hannah",
+ "us-california": "Kalifornien",
+ "us-california-alameda-county": "Alameda",
+ "us-california-alpine-county": "Alpin",
+ "us-california-amador-county": "Amador",
+ "us-california-butte-county": "Hannah",
+ "us-california-calaveras-county": "Calavera",
+ "us-california-colusa-county": "Colusa",
+ "us-california-contra-costa-county": "Contra Costa",
+ "us-california-del-norte-county": "Del Norte",
+ "us-california-el-dorado-county": "El Dorado",
+ "us-california-fresno-county": "Fresno",
+ "us-california-glenn-county": "Glenn",
+ "us-california-humboldt-county": "Humboldt",
+ "us-california-imperial-county": "Kaiserlich",
+ "us-california-inyo-county": "Inyo",
+ "us-california-kern-county": "Kern",
+ "us-california-kings-county": "Könige",
+ "us-california-lake-county": "See",
+ "us-california-lassen-county": "Lassen",
+ "us-california-los-angeles-county": "Los Angeles",
+ "us-california-madera-county": "Madera",
+ "us-california-marin-county": "Marin",
+ "us-california-mariposa-county": "Mariposa",
+ "us-california-mendocino-county": "Mendocino",
+ "us-california-merced-county": "Merced",
+ "us-california-modoc-county": "Modoc",
+ "us-california-mono-county": "Mono",
+ "us-california-monterey-county": "Monterey",
+ "us-california-napa-county": "Napa",
+ "us-california-nevada-county": "Nevada",
+ "us-california-orange-county": "Orange",
+ "us-california-placer-county": "Platzhalter",
+ "us-california-plumas-county": "Plumas",
+ "us-california-riverside-county": "Flussufer",
+ "us-california-sacramento-county": "Sacramento",
+ "us-california-san-benito-county": "San Benito",
+ "us-california-san-bernardino-county": "San Bernardino",
+ "us-california-san-diego-county": "San Diego",
+ "us-california-san-francisco-county": "San Francisco",
+ "us-california-san-joaquin-county": "San Joaquin",
+ "us-california-san-luis-obispo-county": "San Luis Obispo",
+ "us-california-san-mateo-county": "San Mateo",
+ "us-california-santa-barbara-county": "Santa Barbara",
+ "us-california-santa-clara-county": "Santa Clara",
+ "us-california-santa-cruz-county": "Santa Cruz",
+ "us-california-shasta-county": "Shasta",
+ "us-california-sierra-county": "Sierra",
+ "us-california-siskiyou-county": "Siskiyou",
+ "us-california-solano-county": "Solano",
+ "us-california-sonoma-county": "Sonom",
+ "us-california-stanislaus-county": "Lennon",
+ "us-california-sutter-county": "Sutter",
+ "us-california-tehama-county": "Tehama",
+ "us-california-trinity-county": "Dreizack",
+ "us-california-tulare-county": "Tulare",
+ "us-california-tuolumne-county": "Tuolumne",
+ "us-california-ventura-county": "Ventura",
+ "us-california-yolo-county": "Yolo",
+ "us-california-yuba-county": "Yuba",
+ "us-colorado": "Colorado",
+ "us-colorado-adams-county": "Jörg",
+ "us-colorado-alamosa-county": "Alamosa",
+ "us-colorado-arapahoe-county": "Arapahoe",
+ "us-colorado-archuleta-county": "Archuleta",
+ "us-colorado-baca-county": "Baca",
+ "us-colorado-bent-county": "Biegen",
+ "us-colorado-boulder-county": "Felsbrocken",
+ "us-colorado-broomfield-county": "Besenfeld",
+ "us-colorado-chaffee-county": "Chaffee",
+ "us-colorado-cheyenne-county": "Cheyenne",
+ "us-colorado-clear-creek-county": "Creek leeren",
+ "us-colorado-conejos-county": "Conejos",
+ "us-colorado-costilla-county": "Costilla",
+ "us-colorado-crowley-county": "Hannah",
+ "us-colorado-custer-county": "Kuster",
+ "us-colorado-delta-county": "Lila",
+ "us-colorado-denver-county": "Lewis",
+ "us-colorado-dolores-county": "Dolores",
+ "us-colorado-douglas-county": "Douglas",
+ "us-colorado-eagle-county": "Adler",
+ "us-colorado-el-paso-county": "El Paso",
+ "us-colorado-elbert-county": "Jennifer",
+ "us-colorado-fremont-county": "Günter",
+ "us-colorado-garfield-county": "Gerhard",
+ "us-colorado-gilpin-county": "Günter",
+ "us-colorado-grand-county": "Groß",
+ "us-colorado-gunnison-county": "Gunnison",
+ "us-colorado-hinsdale-county": "Hinsdale",
+ "us-colorado-huerfano-county": "Huerfano",
+ "us-colorado-jackson-county": "Jennifer",
+ "us-colorado-jefferson-county": "Jefferson",
+ "us-colorado-kiowa-county": "Kiowa",
+ "us-colorado-kit-carson-county": "Kit Carson",
+ "us-colorado-la-plata-county": "La Plata",
+ "us-colorado-lake-county": "See",
+ "us-colorado-larimer-county": "Larimer",
+ "us-colorado-las-animas-county": "Las Animas",
+ "us-colorado-lincoln-county": "Lincoln",
+ "us-colorado-logan-county": "Logan",
+ "us-colorado-mesa-county": "Mesa",
+ "us-colorado-mineral-county": "Mineral",
+ "us-colorado-moffat-county": "Moffat",
+ "us-colorado-montezuma-county": "Montezuma",
+ "us-colorado-montrose-county": "Montrose",
+ "us-colorado-morgan-county": "Morgan",
+ "us-colorado-otero-county": "Otero",
+ "us-colorado-ouray-county": "Ouraie",
+ "us-colorado-park-county": "Parken",
+ "us-colorado-phillips-county": "Phillips",
+ "us-colorado-pitkin-county": "Pitkin",
+ "us-colorado-prowers-county": "Beutel",
+ "us-colorado-pueblo-county": "Pueblo",
+ "us-colorado-rio-blanco-county": "Rio Blanco",
+ "us-colorado-rio-grande-county": "Rio Grande",
+ "us-colorado-routt-county": "Routine",
+ "us-colorado-saguache-county": "Saguache",
+ "us-colorado-san-juan-county": "San Juan",
+ "us-colorado-san-miguel-county": "San Miguel",
+ "us-colorado-sedgwick-county": "Sedgwick",
+ "us-colorado-summit-county": "Gipfel",
+ "us-colorado-teller-county": "Teller",
+ "us-colorado-washington-county": "Arthur",
+ "us-colorado-weld-county": "Schweiß",
+ "us-colorado-yuma-county": "Yuma",
+ "us-connecticut": "Verbinden",
+ "us-connecticut-fairfield-county": "Fairfield",
+ "us-connecticut-hartford-county": "Hannah",
+ "us-connecticut-litchfield-county": "Litchfeld",
+ "us-connecticut-middlesex-county": "Middlesex",
+ "us-connecticut-new-haven-county": "Neuer Hafen",
+ "us-connecticut-new-london-county": "Neues London",
+ "us-connecticut-tolland-county": "Tolland",
+ "us-connecticut-windham-county": "Werner",
+ "us-delaware": "Jörg",
+ "us-delaware-kent-county": "Kent",
+ "us-delaware-new-castle-county": "Neue Burg",
+ "us-delaware-sussex-county": "Sussex",
+ "us-district-of-columbia": "Bezirk Kolumbien",
+ "us-district-of-columbia-district-of-columbia-county": "Bezirk Kolumbien",
+ "us-florida": "Florida",
+ "us-florida-alachua-county": "Alachua",
+ "us-florida-baker-county": "Baker",
+ "us-florida-bay-county": "Bucht",
+ "us-florida-bradford-county": "Martha",
+ "us-florida-brevard-county": "Brevard",
+ "us-florida-broward-county": "Gabriele",
+ "us-florida-calhoun-county": "Calhoun",
+ "us-florida-charlotte-county": "Charlotte",
+ "us-florida-citrus-county": "Zitrusfrüchte",
+ "us-florida-clay-county": "Lehm",
+ "us-florida-collier-county": "Collier",
+ "us-florida-columbia-county": "Kolumbien",
+ "us-florida-desoto-county": "DeSoto",
+ "us-florida-dixie-county": "Dixie",
+ "us-florida-duval-county": "Dauer",
+ "us-florida-escambia-county": "Escambia",
+ "us-florida-flagler-county": "Flagler",
+ "us-florida-franklin-county": "Franklin",
+ "us-florida-gadsden-county": "Gadsden",
+ "us-florida-gilchrist-county": "Gilchrist",
+ "us-florida-glades-county": "Glades",
+ "us-florida-gulf-county": "Golf",
+ "us-florida-hamilton-county": "Jennifer",
+ "us-florida-hardee-county": "Hardee",
+ "us-florida-hendry-county": "Hendry",
+ "us-florida-hernando-county": "Hernando",
+ "us-florida-highlands-county": "Hochland",
+ "us-florida-hillsborough-county": "Hillsborough",
+ "us-florida-holmes-county": "Bohrungen",
+ "us-florida-indian-river-county": "Indischer Fluss",
+ "us-florida-jackson-county": "Jennifer",
+ "us-florida-jefferson-county": "Jefferson",
+ "us-florida-lafayette-county": "Lafayette",
+ "us-florida-lake-county": "See",
+ "us-florida-lee-county": "Lennon",
+ "us-florida-leon-county": "Leon",
+ "us-florida-levy-county": "Levy",
+ "us-florida-liberty-county": "Freiheit",
+ "us-florida-madison-county": "Madison",
+ "us-florida-manatee-county": "Manatee",
+ "us-florida-marion-county": "Marion",
+ "us-florida-martin-county": "Lucia",
+ "us-florida-miami-dade-county": "Miami-Dade",
+ "us-florida-monroe-county": "Monroe",
+ "us-florida-nassau-county": "Nassau",
+ "us-florida-okaloosa-county": "Okaloosa",
+ "us-florida-okeechobee-county": "Okeechobee",
+ "us-florida-orange-county": "Orange",
+ "us-florida-osceola-county": "Osceola",
+ "us-florida-palm-beach-county": "Palmenstrand",
+ "us-florida-pasco-county": "Pasco",
+ "us-florida-pinellas-county": "Pinellas",
+ "us-florida-polk-county": "Polk",
+ "us-florida-putnam-county": "Putnam",
+ "us-florida-santa-rosa-county": "Santa Rosa",
+ "us-florida-sarasota-county": "Sarasota",
+ "us-florida-seminole-county": "Seminar",
+ "us-florida-st-johns-county": "St. Johns",
+ "us-florida-st-lucie-county": "St. Lucie",
+ "us-florida-sumter-county": "Sumter",
+ "us-florida-suwannee-county": "Suwannee",
+ "us-florida-taylor-county": "Jörg",
+ "us-florida-union-county": "Union",
+ "us-florida-volusia-county": "Volusia",
+ "us-florida-wakulla-county": "Wakulla",
+ "us-florida-walton-county": "Gabriel",
+ "us-florida-washington-county": "Arthur",
+ "us-georgia": "Georgien",
+ "us-georgia-appling-county": "Bewerben",
+ "us-georgia-atkinson-county": "Atkinson",
+ "us-georgia-bacon-county": "Bacon",
+ "us-georgia-baker-county": "Baker",
+ "us-georgia-baldwin-county": "Baldwin",
+ "us-georgia-banks-county": "Banken",
+ "us-georgia-barrow-county": "Rachel",
+ "us-georgia-bartow-county": "Bartow",
+ "us-georgia-ben-hill-county": "Ben Hill",
+ "us-georgia-berrien-county": "Berrien",
+ "us-georgia-bibb-county": "Bibb",
+ "us-georgia-bleckley-county": "Günther",
+ "us-georgia-brantley-county": "Jörg",
+ "us-georgia-brooks-county": "Lila",
+ "us-georgia-bryan-county": "Jennifer",
+ "us-georgia-bulloch-county": "Bulloch",
+ "us-georgia-burke-county": "Burke",
+ "us-georgia-butts-county": "Äste",
+ "us-georgia-calhoun-county": "Calhoun",
+ "us-georgia-camden-county": "Camden",
+ "us-georgia-candler-county": "Candler",
+ "us-georgia-carroll-county": "Carlton",
+ "us-georgia-catoosa-county": "Katoosa",
+ "us-georgia-charlton-county": "Charlton",
+ "us-georgia-chatham-county": "Hannah",
+ "us-georgia-chattahoochee-county": "Chattahoochee",
+ "us-georgia-chattooga-county": "Chattooga",
+ "us-georgia-cherokee-county": "Cherokee",
+ "us-georgia-clarke-county": "Jörg",
+ "us-georgia-clay-county": "Lehm",
+ "us-georgia-clayton-county": "Clayton",
+ "us-georgia-clinch-county": "Jörg",
+ "us-georgia-cobb-county": "Kobb",
+ "us-georgia-coffee-county": "Kaffee",
+ "us-georgia-colquitt-county": "Colquitt",
+ "us-georgia-columbia-county": "Kolumbien",
+ "us-georgia-cook-county": "Kochen",
+ "us-georgia-coweta-county": "Coweta",
+ "us-georgia-crawford-county": "Werner",
+ "us-georgia-crisp-county": "Knapp",
+ "us-georgia-dade-county": "Jörg",
+ "us-georgia-dawson-county": "Jörg",
+ "us-georgia-decatur-county": "Decatur",
+ "us-georgia-dekalb-county": "DeKalb",
+ "us-georgia-dodge-county": "Ausweichen",
+ "us-georgia-dooly-county": "Dooly",
+ "us-georgia-dougherty-county": "Dougherty",
+ "us-georgia-douglas-county": "Douglas",
+ "us-georgia-early-county": "Früh",
+ "us-georgia-echols-county": "Echools",
+ "us-georgia-effingham-county": "Bollwerk",
+ "us-georgia-elbert-county": "Jennifer",
+ "us-georgia-emanuel-county": "Emanuel",
+ "us-georgia-evans-county": "Jennifer",
+ "us-georgia-fannin-county": "Fannin",
+ "us-georgia-fayette-county": "Jörg",
+ "us-georgia-floyd-county": "Floyd",
+ "us-georgia-forsyth-county": "Forsyth",
+ "us-georgia-franklin-county": "Franklin",
+ "us-georgia-fulton-county": "Fulton",
+ "us-georgia-gilmer-county": "Günther",
+ "us-georgia-glascock-county": "Glascock",
+ "us-georgia-glynn-county": "Lennon",
+ "us-georgia-gordon-county": "Gordon",
+ "us-georgia-grady-county": "Gabriel",
+ "us-georgia-greene-county": "Grün",
+ "us-georgia-gwinnett-county": "Gwinnett",
+ "us-georgia-habersham-county": "Habersham",
+ "us-georgia-hall-county": "Halle",
+ "us-georgia-hancock-county": "Hancock",
+ "us-georgia-haralson-county": "Haralson",
+ "us-georgia-harris-county": "Harris",
+ "us-georgia-hart-county": "Hart",
+ "us-georgia-heard-county": "Gehört",
+ "us-georgia-henry-county": "Gabriel",
+ "us-georgia-houston-county": "Houston",
+ "us-georgia-irwin-county": "Irwin",
+ "us-georgia-jackson-county": "Jennifer",
+ "us-georgia-jasper-county": "Jasper",
+ "us-georgia-jeff-davis-county": "Jeff Davis",
+ "us-georgia-jefferson-county": "Jefferson",
+ "us-georgia-jenkins-county": "Jenkins",
+ "us-georgia-johnson-county": "Jörg",
+ "us-georgia-jones-county": "Jones",
+ "us-georgia-lamar-county": "Lamar",
+ "us-georgia-lanier-county": "Lanier",
+ "us-georgia-laurens-county": "Lennon",
+ "us-georgia-lee-county": "Lennon",
+ "us-georgia-liberty-county": "Freiheit",
+ "us-georgia-lincoln-county": "Lincoln",
+ "us-georgia-long-county": "Lang",
+ "us-georgia-lowndes-county": "Lowndes",
+ "us-georgia-lumpkin-county": "Lumpkin",
+ "us-georgia-macon-county": "Margaret",
+ "us-georgia-madison-county": "Madison",
+ "us-georgia-marion-county": "Marion",
+ "us-georgia-mcduffie-county": "McDuffie",
+ "us-georgia-mcintosh-county": "McIntosh",
+ "us-georgia-meriwether-county": "Meriwether",
+ "us-georgia-miller-county": "Fritz",
+ "us-georgia-mitchell-county": "Jörg",
+ "us-georgia-monroe-county": "Monroe",
+ "us-georgia-montgomery-county": "Montgomery",
+ "us-georgia-morgan-county": "Morgan",
+ "us-georgia-murray-county": "Murray",
+ "us-georgia-muscogee-county": "Muscogee",
+ "us-georgia-newton-county": "Newton",
+ "us-georgia-oconee-county": "Oconee",
+ "us-georgia-oglethorpe-county": "Oglethorpe",
+ "us-georgia-paulding-county": "Pauling",
+ "us-georgia-peach-county": "Pfirsich",
+ "us-georgia-pickens-county": "Pickens",
+ "us-georgia-pierce-county": "Jörg",
+ "us-georgia-pike-county": "Pike",
+ "us-georgia-polk-county": "Polk",
+ "us-georgia-pulaski-county": "Pulaski",
+ "us-georgia-putnam-county": "Putnam",
+ "us-georgia-quitman-county": "Quitman",
+ "us-georgia-rabun-county": "Rabun",
+ "us-georgia-randolph-county": "Zufällig",
+ "us-georgia-richmond-county": "Rachel",
+ "us-georgia-rockdale-county": "Rockdale",
+ "us-georgia-schley-county": "Jörg",
+ "us-georgia-screven-county": "Bildschirmschoner",
+ "us-georgia-seminole-county": "Seminar",
+ "us-georgia-spalding-county": "Spalding",
+ "us-georgia-stephens-county": "Stephan",
+ "us-georgia-stewart-county": "Stewart",
+ "us-georgia-sumter-county": "Sumter",
+ "us-georgia-talbot-county": "Talbot",
+ "us-georgia-taliaferro-county": "Taliaferro",
+ "us-georgia-tattnall-county": "Tattnall",
+ "us-georgia-taylor-county": "Jörg",
+ "us-georgia-telfair-county": "Telfair",
+ "us-georgia-terrell-county": "Terrell",
+ "us-georgia-thomas-county": "Jennifer",
+ "us-georgia-tift-county": "Tift",
+ "us-georgia-toombs-county": "Toombs",
+ "us-georgia-towns-county": "Städte",
+ "us-georgia-treutlen-county": "Treutlen",
+ "us-georgia-troup-county": "Trophäe",
+ "us-georgia-turner-county": "Jörg",
+ "us-georgia-twiggs-county": "Twiggs",
+ "us-georgia-union-county": "Union",
+ "us-georgia-upson-county": "Upson",
+ "us-georgia-walker-county": "Wanderer",
+ "us-georgia-walton-county": "Gabriel",
+ "us-georgia-ware-county": "Ware",
+ "us-georgia-warren-county": "Warren",
+ "us-georgia-washington-county": "Arthur",
+ "us-georgia-wayne-county": "Wayne",
+ "us-georgia-webster-county": "Webster",
+ "us-georgia-wheeler-county": "Rad",
+ "us-georgia-white-county": "Weiß",
+ "us-georgia-whitfield-county": "Weißfeld",
+ "us-georgia-wilcox-county": "Wilcox",
+ "us-georgia-wilkes-county": "Jörg",
+ "us-georgia-wilkinson-county": "Wilkinson",
+ "us-georgia-worth-county": "Wert",
+ "us-hawaii": "Hawaii",
+ "us-hawaii-hawaii-county": "Hawaii",
+ "us-hawaii-honolulu-county": "Honolulu",
+ "us-hawaii-kalawao-county": "Kalawao",
+ "us-hawaii-kauai-county": "Kauai",
+ "us-hawaii-maui-county": "Lila",
+ "us-idaho": "Idaho",
+ "us-idaho-ada-county": "Ada",
+ "us-idaho-adams-county": "Jörg",
+ "us-idaho-bannock-county": "Bannock",
+ "us-idaho-bear-lake-county": "Bären See",
+ "us-idaho-benewah-county": "Benewah",
+ "us-idaho-bingham-county": "Bingham",
+ "us-idaho-blaine-county": "Blaine",
+ "us-idaho-boise-county": "Boise",
+ "us-idaho-bonner-county": "Jörg",
+ "us-idaho-bonneville-county": "Bonneville",
+ "us-idaho-boundary-county": "Grenze",
+ "us-idaho-butte-county": "Hannah",
+ "us-idaho-camas-county": "Camas",
+ "us-idaho-canyon-county": "Canyon",
+ "us-idaho-caribou-county": "Caribou",
+ "us-idaho-cassia-county": "Cassia",
+ "us-idaho-clark-county": "Jörg",
+ "us-idaho-clearwater-county": "Clearwater",
+ "us-idaho-custer-county": "Kuster",
+ "us-idaho-elmore-county": "Elmore",
+ "us-idaho-franklin-county": "Franklin",
+ "us-idaho-fremont-county": "Günter",
+ "us-idaho-gem-county": "Juwel",
+ "us-idaho-gooding-county": "Warten",
+ "us-idaho-idaho-county": "Idaho",
+ "us-idaho-jefferson-county": "Jefferson",
+ "us-idaho-jerome-county": "Jörg",
+ "us-idaho-kootenai-county": "Kootenai",
+ "us-idaho-latah-county": "Lana",
+ "us-idaho-lemhi-county": "Lemhi",
+ "us-idaho-lewis-county": "Lewis",
+ "us-idaho-lincoln-county": "Lincoln",
+ "us-idaho-madison-county": "Madison",
+ "us-idaho-minidoka-county": "Minidoka",
+ "us-idaho-nez-perce-county": "Nez Perce",
+ "us-idaho-oneida-county": "Elizabeth",
+ "us-idaho-owyhee-county": "Owyhee",
+ "us-idaho-payette-county": "Auszahlung",
+ "us-idaho-power-county": "Macht",
+ "us-idaho-shoshone-county": "Schuss",
+ "us-idaho-teton-county": "Teton",
+ "us-idaho-twin-falls-county": "Zwillingsfälle",
+ "us-idaho-valley-county": "Tal",
+ "us-idaho-washington-county": "Arthur",
+ "us-illinois": "Illinois",
+ "us-illinois-adams-county": "Jörg",
+ "us-illinois-alexander-county": "Jörg",
+ "us-illinois-bond-county": "Anleihe",
+ "us-illinois-boone-county": "Boone",
+ "us-illinois-brown-county": "Brauner",
+ "us-illinois-bureau-county": "Bureau",
+ "us-illinois-calhoun-county": "Calhoun",
+ "us-illinois-carroll-county": "Carlton",
+ "us-illinois-cass-county": "Cass",
+ "us-illinois-champaign-county": "Champaign",
+ "us-illinois-christian-county": "Christi",
+ "us-illinois-clark-county": "Jörg",
+ "us-illinois-clay-county": "Lehm",
+ "us-illinois-clinton-county": "Jennifer",
+ "us-illinois-coles-county": "Coles",
+ "us-illinois-cook-county": "Kochen",
+ "us-illinois-crawford-county": "Werner",
+ "us-illinois-cumberland-county": "Cumberland",
+ "us-illinois-dekalb-county": "DeKalb",
+ "us-illinois-dewitt-county": "DeWitt",
+ "us-illinois-douglas-county": "Douglas",
+ "us-illinois-dupage-county": "DuPage",
+ "us-illinois-edgar-county": "Jörg",
+ "us-illinois-edwards-county": "Jörg",
+ "us-illinois-effingham-county": "Bollwerk",
+ "us-illinois-fayette-county": "Jörg",
+ "us-illinois-ford-county": "Jörg",
+ "us-illinois-franklin-county": "Franklin",
+ "us-illinois-fulton-county": "Fulton",
+ "us-illinois-gallatin-county": "Gallatin",
+ "us-illinois-greene-county": "Grün",
+ "us-illinois-grundy-county": "Grundlegend",
+ "us-illinois-hamilton-county": "Jennifer",
+ "us-illinois-hancock-county": "Hancock",
+ "us-illinois-hardin-county": "Hardin",
+ "us-illinois-henderson-county": "Henderson",
+ "us-illinois-henry-county": "Gabriel",
+ "us-illinois-iroquois-county": "Iroquois",
+ "us-illinois-jackson-county": "Jennifer",
+ "us-illinois-jasper-county": "Jasper",
+ "us-illinois-jefferson-county": "Jefferson",
+ "us-illinois-jersey-county": "Trikot",
+ "us-illinois-jo-daviess-county": "Jo Daviess",
+ "us-illinois-johnson-county": "Jörg",
+ "us-illinois-kane-county": "Kane",
+ "us-illinois-kankakee-county": "Kankaja",
+ "us-illinois-kendall-county": "Kendall",
+ "us-illinois-knox-county": "Knox",
+ "us-illinois-lake-county": "See",
+ "us-illinois-lasalle-county": "LaSalle",
+ "us-illinois-lawrence-county": "Jörg",
+ "us-illinois-lee-county": "Lennon",
+ "us-illinois-livingston-county": "Livingston",
+ "us-illinois-logan-county": "Logan",
+ "us-illinois-macon-county": "Margaret",
+ "us-illinois-macoupin-county": "Macoupin",
+ "us-illinois-madison-county": "Madison",
+ "us-illinois-marion-county": "Marion",
+ "us-illinois-marshall-county": "Martha",
+ "us-illinois-mason-county": "Jürgen",
+ "us-illinois-massac-county": "Massak",
+ "us-illinois-mcdonough-county": "Karl-Heinz",
+ "us-illinois-mchenry-county": "Martha",
+ "us-illinois-mclean-county": "Jennifer",
+ "us-illinois-menard-county": "Menard",
+ "us-illinois-mercer-county": "Mercer",
+ "us-illinois-monroe-county": "Monroe",
+ "us-illinois-montgomery-county": "Montgomery",
+ "us-illinois-morgan-county": "Morgan",
+ "us-illinois-moultrie-county": "Moultrie",
+ "us-illinois-ogle-county": "Ogle",
+ "us-illinois-peoria-county": "Peoria",
+ "us-illinois-perry-county": "Evelyn",
+ "us-illinois-piatt-county": "Piatt",
+ "us-illinois-pike-county": "Pike",
+ "us-illinois-pope-county": "Papst",
+ "us-illinois-pulaski-county": "Pulaski",
+ "us-illinois-putnam-county": "Putnam",
+ "us-illinois-randolph-county": "Zufällig",
+ "us-illinois-richland-county": "Urland",
+ "us-illinois-rock-island-county": "Felseninsel",
+ "us-illinois-saline-county": "Salin",
+ "us-illinois-sangamon-county": "Sangamon",
+ "us-illinois-schuyler-county": "Schuyler",
+ "us-illinois-scott-county": "Jörg",
+ "us-illinois-shelby-county": "Shelby",
+ "us-illinois-st-clair-county": "St. Clair",
+ "us-illinois-stark-county": "Stark",
+ "us-illinois-stephenson-county": "Stephenson",
+ "us-illinois-tazewell-county": "Tazewell",
+ "us-illinois-union-county": "Union",
+ "us-illinois-vermilion-county": "Vermilion",
+ "us-illinois-wabash-county": "Waschen",
+ "us-illinois-warren-county": "Warren",
+ "us-illinois-washington-county": "Arthur",
+ "us-illinois-wayne-county": "Wayne",
+ "us-illinois-white-county": "Weiß",
+ "us-illinois-whiteside-county": "Whiteside",
+ "us-illinois-will-county": "Wille",
+ "us-illinois-williamson-county": "Martha",
+ "us-illinois-winnebago-county": "Winnebago",
+ "us-illinois-woodford-county": "Hölzer",
+ "us-indiana": "Indiana",
+ "us-indiana-adams-county": "Jörg",
+ "us-indiana-allen-county": "Jörg",
+ "us-indiana-bartholomew-county": "Bartholomew",
+ "us-indiana-benton-county": "Benton",
+ "us-indiana-blackford-county": "Sophia",
+ "us-indiana-boone-county": "Boone",
+ "us-indiana-brown-county": "Brauner",
+ "us-indiana-carroll-county": "Carlton",
+ "us-indiana-cass-county": "Cass",
+ "us-indiana-clark-county": "Jörg",
+ "us-indiana-clay-county": "Lehm",
+ "us-indiana-clinton-county": "Jennifer",
+ "us-indiana-crawford-county": "Werner",
+ "us-indiana-daviess-county": "Jörg",
+ "us-indiana-dearborn-county": "Werner",
+ "us-indiana-decatur-county": "Decatur",
+ "us-indiana-dekalb-county": "DeKalb",
+ "us-indiana-delaware-county": "Jörg",
+ "us-indiana-dubois-county": "Dubois",
+ "us-indiana-elkhart-county": "Elkhart",
+ "us-indiana-fayette-county": "Jörg",
+ "us-indiana-floyd-county": "Floyd",
+ "us-indiana-fountain-county": "Fontäne",
+ "us-indiana-franklin-county": "Franklin",
+ "us-indiana-fulton-county": "Fulton",
+ "us-indiana-gibson-county": "Gibson",
+ "us-indiana-grant-county": "Zuschuss",
+ "us-indiana-greene-county": "Grün",
+ "us-indiana-hamilton-county": "Jennifer",
+ "us-indiana-hancock-county": "Hancock",
+ "us-indiana-harrison-county": "Harrison",
+ "us-indiana-hendricks-county": "Hendricks",
+ "us-indiana-henry-county": "Gabriel",
+ "us-indiana-howard-county": "Jörg",
+ "us-indiana-huntington-county": "Jägerin",
+ "us-indiana-jackson-county": "Jennifer",
+ "us-indiana-jasper-county": "Jasper",
+ "us-indiana-jay-county": "Jay",
+ "us-indiana-jefferson-county": "Jefferson",
+ "us-indiana-jennings-county": "Jenning",
+ "us-indiana-johnson-county": "Jörg",
+ "us-indiana-knox-county": "Knox",
+ "us-indiana-kosciusko-county": "Kosciusko",
+ "us-indiana-lagrange-county": "LaGrange",
+ "us-indiana-lake-county": "See",
+ "us-indiana-laporte-county": "LaPorte",
+ "us-indiana-lawrence-county": "Jörg",
+ "us-indiana-madison-county": "Madison",
+ "us-indiana-marion-county": "Marion",
+ "us-indiana-marshall-county": "Martha",
+ "us-indiana-martin-county": "Lucia",
+ "us-indiana-miami-county": "Miami",
+ "us-indiana-monroe-county": "Monroe",
+ "us-indiana-montgomery-county": "Montgomery",
+ "us-indiana-morgan-county": "Morgan",
+ "us-indiana-newton-county": "Newton",
+ "us-indiana-noble-county": "Edler",
+ "us-indiana-ohio-county": "Ohio",
+ "us-indiana-orange-county": "Orange",
+ "us-indiana-owen-county": "Owen",
+ "us-indiana-parke-county": "Parkplatz",
+ "us-indiana-perry-county": "Evelyn",
+ "us-indiana-pike-county": "Pike",
+ "us-indiana-porter-county": "Portierer",
+ "us-indiana-posey-county": "Sophia",
+ "us-indiana-pulaski-county": "Pulaski",
+ "us-indiana-putnam-county": "Putnam",
+ "us-indiana-randolph-county": "Zufällig",
+ "us-indiana-ripley-county": "Ripley",
+ "us-indiana-rush-county": "Rush",
+ "us-indiana-scott-county": "Jörg",
+ "us-indiana-shelby-county": "Shelby",
+ "us-indiana-spencer-county": "Jörg",
+ "us-indiana-st-joseph-county": "St. Joseph",
+ "us-indiana-starke-county": "Starke",
+ "us-indiana-steuben-county": "Steuben",
+ "us-indiana-sullivan-county": "Sullivan",
+ "us-indiana-switzerland-county": "Schweiz",
+ "us-indiana-tippecanoe-county": "Tippecanoe",
+ "us-indiana-tipton-county": "Tipton",
+ "us-indiana-union-county": "Union",
+ "us-indiana-vanderburgh-county": "Vanderburgh",
+ "us-indiana-vermillion-county": "Vermillion",
+ "us-indiana-vigo-county": "Vigo",
+ "us-indiana-wabash-county": "Waschen",
+ "us-indiana-warren-county": "Warren",
+ "us-indiana-warrick-county": "Warrick",
+ "us-indiana-washington-county": "Arthur",
+ "us-indiana-wayne-county": "Wayne",
+ "us-indiana-wells-county": "Brunnen",
+ "us-indiana-white-county": "Weiß",
+ "us-indiana-whitley-county": "Lewis",
+ "us-iowa": "Iowa",
+ "us-iowa-adair-county": "Adair",
+ "us-iowa-adams-county": "Jörg",
+ "us-iowa-allamakee-county": "Allamakee",
+ "us-iowa-appanoose-county": "Appanoose",
+ "us-iowa-audubon-county": "Audubon",
+ "us-iowa-benton-county": "Benton",
+ "us-iowa-black-hawk-county": "Schwarzer Hawk",
+ "us-iowa-boone-county": "Boone",
+ "us-iowa-bremer-county": "Bremer",
+ "us-iowa-buchanan-county": "Buchanisch",
+ "us-iowa-buena-vista-county": "Buena Vista",
+ "us-iowa-butler-county": "Butler",
+ "us-iowa-calhoun-county": "Calhoun",
+ "us-iowa-carroll-county": "Carlton",
+ "us-iowa-cass-county": "Cass",
+ "us-iowa-cedar-county": "Zeder",
+ "us-iowa-cerro-gordo-county": "Cerro Gordo",
+ "us-iowa-cherokee-county": "Cherokee",
+ "us-iowa-chickasaw-county": "Chickasaw",
+ "us-iowa-clarke-county": "Jörg",
+ "us-iowa-clay-county": "Lehm",
+ "us-iowa-clayton-county": "Clayton",
+ "us-iowa-clinton-county": "Jennifer",
+ "us-iowa-crawford-county": "Werner",
+ "us-iowa-dallas-county": "Dallas",
+ "us-iowa-davis-county": "Dennis",
+ "us-iowa-decatur-county": "Decatur",
+ "us-iowa-delaware-county": "Jörg",
+ "us-iowa-des-moines-county": "Des Moines",
+ "us-iowa-dickinson-county": "Dickinson",
+ "us-iowa-dubuque-county": "Dubuque",
+ "us-iowa-emmet-county": "Emmet",
+ "us-iowa-fayette-county": "Jörg",
+ "us-iowa-floyd-county": "Floyd",
+ "us-iowa-franklin-county": "Franklin",
+ "us-iowa-fremont-county": "Günter",
+ "us-iowa-greene-county": "Grün",
+ "us-iowa-grundy-county": "Grundlegend",
+ "us-iowa-guthrie-county": "Guthrie",
+ "us-iowa-hamilton-county": "Jennifer",
+ "us-iowa-hancock-county": "Hancock",
+ "us-iowa-hardin-county": "Hardin",
+ "us-iowa-harrison-county": "Harrison",
+ "us-iowa-henry-county": "Gabriel",
+ "us-iowa-howard-county": "Jörg",
+ "us-iowa-humboldt-county": "Humboldt",
+ "us-iowa-ida-county": "Ida",
+ "us-iowa-iowa-county": "Iowa",
+ "us-iowa-jackson-county": "Jennifer",
+ "us-iowa-jasper-county": "Jasper",
+ "us-iowa-jefferson-county": "Jefferson",
+ "us-iowa-johnson-county": "Jörg",
+ "us-iowa-jones-county": "Jones",
+ "us-iowa-keokuk-county": "Keokuk",
+ "us-iowa-kossuth-county": "Kossuth",
+ "us-iowa-lee-county": "Lennon",
+ "us-iowa-linn-county": "Linn",
+ "us-iowa-louisa-county": "Lila",
+ "us-iowa-lucas-county": "Lucas",
+ "us-iowa-lyon-county": "Lyon",
+ "us-iowa-madison-county": "Madison",
+ "us-iowa-mahaska-county": "Mahaska",
+ "us-iowa-marion-county": "Marion",
+ "us-iowa-marshall-county": "Martha",
+ "us-iowa-mills-county": "Mühlen",
+ "us-iowa-mitchell-county": "Jörg",
+ "us-iowa-monona-county": "Monona",
+ "us-iowa-monroe-county": "Monroe",
+ "us-iowa-montgomery-county": "Montgomery",
+ "us-iowa-muscatine-county": "Muscatine",
+ "us-iowa-obrien-county": "Otto",
+ "us-iowa-osceola-county": "Osceola",
+ "us-iowa-page-county": "Seite",
+ "us-iowa-palo-alto-county": "Palo Alto",
+ "us-iowa-plymouth-county": "Plymouth",
+ "us-iowa-pocahontas-county": "Pocahontas",
+ "us-iowa-polk-county": "Polk",
+ "us-iowa-pottawattamie-county": "Pottawattamie",
+ "us-iowa-poweshiek-county": "Pulverfass",
+ "us-iowa-ringgold-county": "Ringgold",
+ "us-iowa-sac-county": "Sac",
+ "us-iowa-scott-county": "Jörg",
+ "us-iowa-shelby-county": "Shelby",
+ "us-iowa-sioux-county": "Sioux",
+ "us-iowa-story-county": "Geschichte",
+ "us-iowa-tama-county": "Tama",
+ "us-iowa-taylor-county": "Jörg",
+ "us-iowa-union-county": "Union",
+ "us-iowa-van-buren-county": "Van Buren",
+ "us-iowa-wapello-county": "Wapello",
+ "us-iowa-warren-county": "Warren",
+ "us-iowa-washington-county": "Arthur",
+ "us-iowa-wayne-county": "Wayne",
+ "us-iowa-webster-county": "Webster",
+ "us-iowa-winnebago-county": "Winnebago",
+ "us-iowa-winneshiek-county": "Siegeshiek",
+ "us-iowa-woodbury-county": "Holzbeerdigung",
+ "us-iowa-worth-county": "Wert",
+ "us-iowa-wright-county": "Hell",
+ "us-kansas": "Kansas",
+ "us-kansas-allen-county": "Jörg",
+ "us-kansas-anderson-county": "Anderson",
+ "us-kansas-atchison-county": "Atchison",
+ "us-kansas-barber-county": "Barber",
+ "us-kansas-barton-county": "Barton",
+ "us-kansas-bourbon-county": "Bourbon",
+ "us-kansas-brown-county": "Brauner",
+ "us-kansas-butler-county": "Butler",
+ "us-kansas-chase-county": "Jasmin",
+ "us-kansas-chautauqua-county": "Chautauqua",
+ "us-kansas-cherokee-county": "Cherokee",
+ "us-kansas-cheyenne-county": "Cheyenne",
+ "us-kansas-clark-county": "Jörg",
+ "us-kansas-clay-county": "Lehm",
+ "us-kansas-cloud-county": "Wolke",
+ "us-kansas-coffey-county": "Coffey",
+ "us-kansas-comanche-county": "Comanche",
+ "us-kansas-cowley-county": "Cowley",
+ "us-kansas-crawford-county": "Werner",
+ "us-kansas-decatur-county": "Decatur",
+ "us-kansas-dickinson-county": "Dickinson",
+ "us-kansas-doniphan-county": "Doniphan",
+ "us-kansas-douglas-county": "Douglas",
+ "us-kansas-edwards-county": "Jörg",
+ "us-kansas-elk-county": "Elk",
+ "us-kansas-ellis-county": "Lili",
+ "us-kansas-ellsworth-county": "Jennifer",
+ "us-kansas-finney-county": "Finney",
+ "us-kansas-ford-county": "Jörg",
+ "us-kansas-franklin-county": "Franklin",
+ "us-kansas-geary-county": "Geary",
+ "us-kansas-gove-county": "Gehe",
+ "us-kansas-graham-county": "Graham",
+ "us-kansas-grant-county": "Zuschuss",
+ "us-kansas-gray-county": "Grau",
+ "us-kansas-greeley-county": "Günther",
+ "us-kansas-greenwood-county": "Grönholz",
+ "us-kansas-hamilton-county": "Jennifer",
+ "us-kansas-harper-county": "Harper",
+ "us-kansas-harvey-county": "Jörg",
+ "us-kansas-haskell-county": "Haskell",
+ "us-kansas-hodgeman-county": "Hedgeman",
+ "us-kansas-jackson-county": "Jennifer",
+ "us-kansas-jefferson-county": "Jefferson",
+ "us-kansas-jewell-county": "Jörg",
+ "us-kansas-johnson-county": "Jörg",
+ "us-kansas-kearny-county": "Kearny",
+ "us-kansas-kingman-county": "Königsmann",
+ "us-kansas-kiowa-county": "Kiowa",
+ "us-kansas-labette-county": "Jörg",
+ "us-kansas-lane-county": "Lane",
+ "us-kansas-leavenworth-county": "Leavenworth",
+ "us-kansas-lincoln-county": "Lincoln",
+ "us-kansas-linn-county": "Linn",
+ "us-kansas-logan-county": "Logan",
+ "us-kansas-lyon-county": "Lyon",
+ "us-kansas-marion-county": "Marion",
+ "us-kansas-marshall-county": "Martha",
+ "us-kansas-mcpherson-county": "McPherson",
+ "us-kansas-meade-county": "Meide",
+ "us-kansas-miami-county": "Miami",
+ "us-kansas-mitchell-county": "Jörg",
+ "us-kansas-montgomery-county": "Montgomery",
+ "us-kansas-morris-county": "Morris",
+ "us-kansas-morton-county": "Morton",
+ "us-kansas-nemaha-county": "Nemaha",
+ "us-kansas-neosho-county": "Neosho",
+ "us-kansas-ness-county": "Ness",
+ "us-kansas-norton-county": "Martha",
+ "us-kansas-osage-county": "Osage",
+ "us-kansas-osborne-county": "Osborne",
+ "us-kansas-ottawa-county": "Ottawa",
+ "us-kansas-pawnee-county": "Juwelier",
+ "us-kansas-phillips-county": "Phillips",
+ "us-kansas-pottawatomie-county": "Pottawatomie",
+ "us-kansas-pratt-county": "Pratt",
+ "us-kansas-rawlins-county": "Rohlinse",
+ "us-kansas-reno-county": "Reno",
+ "us-kansas-republic-county": "Republik",
+ "us-kansas-rice-county": "Reis",
+ "us-kansas-riley-county": "Ricky",
+ "us-kansas-rooks-county": "Rooks",
+ "us-kansas-rush-county": "Rush",
+ "us-kansas-russell-county": "Russell",
+ "us-kansas-saline-county": "Salin",
+ "us-kansas-scott-county": "Jörg",
+ "us-kansas-sedgwick-county": "Sedgwick",
+ "us-kansas-seward-county": "Selig",
+ "us-kansas-shawnee-county": "Shawnee",
+ "us-kansas-sheridan-county": "Sheridan",
+ "us-kansas-sherman-county": "Schermann",
+ "us-kansas-smith-county": "Schmied",
+ "us-kansas-stafford-county": "Stopp",
+ "us-kansas-stanton-county": "Stanton",
+ "us-kansas-stevens-county": "Stevens",
+ "us-kansas-sumner-county": "Sumner",
+ "us-kansas-thomas-county": "Jennifer",
+ "us-kansas-trego-county": "Trego",
+ "us-kansas-wabaunsee-county": "Wabaunsee",
+ "us-kansas-wallace-county": "Wallace",
+ "us-kansas-washington-county": "Arthur",
+ "us-kansas-wichita-county": "Hannah",
+ "us-kansas-wilson-county": "Wilhelm",
+ "us-kansas-woodson-county": "Werner",
+ "us-kansas-wyandotte-county": "Wyandotte",
+ "us-kentucky": "Kentucky",
+ "us-kentucky-adair-county": "Adair",
+ "us-kentucky-allen-county": "Jörg",
+ "us-kentucky-anderson-county": "Anderson",
+ "us-kentucky-ballard-county": "Ballard",
+ "us-kentucky-barren-county": "Barren",
+ "us-kentucky-bath-county": "Bad",
+ "us-kentucky-bell-county": "Glocke",
+ "us-kentucky-boone-county": "Boone",
+ "us-kentucky-bourbon-county": "Bourbon",
+ "us-kentucky-boyd-county": "Jörg",
+ "us-kentucky-boyle-county": "Jörg",
+ "us-kentucky-bracken-county": "Hannah",
+ "us-kentucky-breathitt-county": "Atemzug",
+ "us-kentucky-breckinridge-county": "Breckinridge",
+ "us-kentucky-bullitt-county": "Bullitt",
+ "us-kentucky-butler-county": "Butler",
+ "us-kentucky-caldwell-county": "Caldwell",
+ "us-kentucky-calloway-county": "Calloway",
+ "us-kentucky-campbell-county": "Campbell",
+ "us-kentucky-carlisle-county": "Carlton",
+ "us-kentucky-carroll-county": "Carlton",
+ "us-kentucky-carter-county": "Jörg",
+ "us-kentucky-casey-county": "Jörg",
+ "us-kentucky-christian-county": "Christi",
+ "us-kentucky-clark-county": "Jörg",
+ "us-kentucky-clay-county": "Lehm",
+ "us-kentucky-clinton-county": "Jennifer",
+ "us-kentucky-crittenden-county": "Crittenden",
+ "us-kentucky-cumberland-county": "Cumberland",
+ "us-kentucky-daviess-county": "Jörg",
+ "us-kentucky-edmonson-county": "Edmonson",
+ "us-kentucky-elliott-county": "Elliott",
+ "us-kentucky-estill-county": "Estill",
+ "us-kentucky-fayette-county": "Jörg",
+ "us-kentucky-fleming-county": "Flammen",
+ "us-kentucky-floyd-county": "Floyd",
+ "us-kentucky-franklin-county": "Franklin",
+ "us-kentucky-fulton-county": "Fulton",
+ "us-kentucky-gallatin-county": "Gallatin",
+ "us-kentucky-garrard-county": "Garrard",
+ "us-kentucky-grant-county": "Zuschuss",
+ "us-kentucky-graves-county": "Gräber",
+ "us-kentucky-grayson-county": "Gabriel",
+ "us-kentucky-green-county": "Grün",
+ "us-kentucky-greenup-county": "Gründer",
+ "us-kentucky-hancock-county": "Hancock",
+ "us-kentucky-hardin-county": "Hardin",
+ "us-kentucky-harlan-county": "Harlan",
+ "us-kentucky-harrison-county": "Harrison",
+ "us-kentucky-hart-county": "Hart",
+ "us-kentucky-henderson-county": "Henderson",
+ "us-kentucky-henry-county": "Gabriel",
+ "us-kentucky-hickman-county": "Hickman",
+ "us-kentucky-hopkins-county": "Hopkins",
+ "us-kentucky-jackson-county": "Jennifer",
+ "us-kentucky-jefferson-county": "Jefferson",
+ "us-kentucky-jessamine-county": "Jessamin",
+ "us-kentucky-johnson-county": "Jörg",
+ "us-kentucky-kenton-county": "Kenton",
+ "us-kentucky-knott-county": "Knottin",
+ "us-kentucky-knox-county": "Knox",
+ "us-kentucky-larue-county": "Rue",
+ "us-kentucky-laurel-county": "Laurence",
+ "us-kentucky-lawrence-county": "Jörg",
+ "us-kentucky-lee-county": "Lennon",
+ "us-kentucky-leslie-county": "Leslie",
+ "us-kentucky-letcher-county": "Letter",
+ "us-kentucky-lewis-county": "Lewis",
+ "us-kentucky-lincoln-county": "Lincoln",
+ "us-kentucky-livingston-county": "Livingston",
+ "us-kentucky-logan-county": "Logan",
+ "us-kentucky-lyon-county": "Lyon",
+ "us-kentucky-madison-county": "Madison",
+ "us-kentucky-magoffin-county": "Magopin",
+ "us-kentucky-marion-county": "Marion",
+ "us-kentucky-marshall-county": "Martha",
+ "us-kentucky-martin-county": "Lucia",
+ "us-kentucky-mason-county": "Jürgen",
+ "us-kentucky-mccracken-county": "Karl-Heinz",
+ "us-kentucky-mccreary-county": "Karin",
+ "us-kentucky-mclean-county": "Jennifer",
+ "us-kentucky-meade-county": "Meide",
+ "us-kentucky-menifee-county": "Menifee",
+ "us-kentucky-mercer-county": "Mercer",
+ "us-kentucky-metcalfe-county": "Metcalfe",
+ "us-kentucky-monroe-county": "Monroe",
+ "us-kentucky-montgomery-county": "Montgomery",
+ "us-kentucky-morgan-county": "Morgan",
+ "us-kentucky-muhlenberg-county": "Muhlenberg",
+ "us-kentucky-nelson-county": "Nelson",
+ "us-kentucky-nicholas-county": "Nikolaus",
+ "us-kentucky-ohio-county": "Ohio",
+ "us-kentucky-oldham-county": "Oldham",
+ "us-kentucky-owen-county": "Owen",
+ "us-kentucky-owsley-county": "Owsley",
+ "us-kentucky-pendleton-county": "Pendleton",
+ "us-kentucky-perry-county": "Evelyn",
+ "us-kentucky-pike-county": "Pike",
+ "us-kentucky-powell-county": "Günter",
+ "us-kentucky-pulaski-county": "Pulaski",
+ "us-kentucky-robertson-county": "Robertson",
+ "us-kentucky-rockcastle-county": "Steinburg",
+ "us-kentucky-rowan-county": "Rowan",
+ "us-kentucky-russell-county": "Russell",
+ "us-kentucky-scott-county": "Jörg",
+ "us-kentucky-shelby-county": "Shelby",
+ "us-kentucky-simpson-county": "Schäfer",
+ "us-kentucky-spencer-county": "Jörg",
+ "us-kentucky-taylor-county": "Jörg",
+ "us-kentucky-todd-county": "Todd",
+ "us-kentucky-trigg-county": "Trigg",
+ "us-kentucky-trimble-county": "Trimbel",
+ "us-kentucky-union-county": "Union",
+ "us-kentucky-warren-county": "Warren",
+ "us-kentucky-washington-county": "Arthur",
+ "us-kentucky-wayne-county": "Wayne",
+ "us-kentucky-webster-county": "Webster",
+ "us-kentucky-whitley-county": "Lewis",
+ "us-kentucky-wolfe-county": "Wolfe",
+ "us-kentucky-woodford-county": "Hölzer",
+ "us-louisiana": "Louisiana",
+ "us-louisiana-acadia-county": "Akadia",
+ "us-louisiana-allen-county": "Jörg",
+ "us-louisiana-ascension-county": "Aufstieg",
+ "us-louisiana-assumption-county": "Annahme",
+ "us-louisiana-avoyelles-county": "Avoyelles",
+ "us-louisiana-beauregard-county": "Schöne",
+ "us-louisiana-bienville-county": "Bienville",
+ "us-louisiana-bossier-county": "Jörg",
+ "us-louisiana-caddo-county": "Caddo",
+ "us-louisiana-calcasieu-county": "Calcasieu",
+ "us-louisiana-caldwell-county": "Caldwell",
+ "us-louisiana-cameron-county": "Jörg",
+ "us-louisiana-catahoula-county": "Catahoula",
+ "us-louisiana-claiborne-county": "Claiborne",
+ "us-louisiana-concordia-county": "Concordia",
+ "us-louisiana-desoto-county": "DeSoto",
+ "us-louisiana-east-baton-rouge-county": "Ost-Baton Rouge",
+ "us-louisiana-east-carroll-county": "Ost-Carroll",
+ "us-louisiana-east-feliciana-county": "OstFeliciana",
+ "us-louisiana-evangeline-county": "Evangeline",
+ "us-louisiana-franklin-county": "Franklin",
+ "us-louisiana-grant-county": "Zuschuss",
+ "us-louisiana-iberia-county": "Iberien",
+ "us-louisiana-iberville-county": "Iberville",
+ "us-louisiana-jackson-county": "Jennifer",
+ "us-louisiana-jefferson-county": "Jefferson",
+ "us-louisiana-jefferson-davis-county": "Jefferson Davis",
+ "us-louisiana-la-salle-county": "La Salle",
+ "us-louisiana-lafayette-county": "Lafayette",
+ "us-louisiana-lafourche-county": "Lafourche",
+ "us-louisiana-lincoln-county": "Lincoln",
+ "us-louisiana-livingston-county": "Livingston",
+ "us-louisiana-madison-county": "Madison",
+ "us-louisiana-morehouse-county": "Mehrhaus",
+ "us-louisiana-natchitoches-county": "Natchitochen",
+ "us-louisiana-orleans-county": "Orleans",
+ "us-louisiana-ouachita-county": "Guillaume",
+ "us-louisiana-plaquemines-county": "Plaqueminen",
+ "us-louisiana-pointe-coupee-county": "Punkte-Gutschein",
+ "us-louisiana-rapides-county": "Rapides",
+ "us-louisiana-red-river-county": "Roter Fluss",
+ "us-louisiana-richland-county": "Urland",
+ "us-louisiana-sabine-county": "Sabine",
+ "us-louisiana-st-bernard-county": "St. Bernard",
+ "us-louisiana-st-charles-county": "St. Charles",
+ "us-louisiana-st-helena-county": "St. Helena",
+ "us-louisiana-st-james-county": "St. Jakob",
+ "us-louisiana-st-john-the-baptist-county": "Johannes der Täufer",
+ "us-louisiana-st-landry-county": "St. Landry",
+ "us-louisiana-st-martin-county": "St. Martin",
+ "us-louisiana-st-mary-county": "St. Maria",
+ "us-louisiana-st-tammany-county": "St. Tammany",
+ "us-louisiana-tangipahoa-county": "Tangipahoa",
+ "us-louisiana-tensas-county": "Zensas",
+ "us-louisiana-terrebonne-county": "Terrebonne",
+ "us-louisiana-union-county": "Union",
+ "us-louisiana-vermilion-county": "Vermilion",
+ "us-louisiana-vernon-county": "Tila",
+ "us-louisiana-washington-county": "Arthur",
+ "us-louisiana-webster-county": "Webster",
+ "us-louisiana-west-baton-rouge-county": "West-Baton-Rouge",
+ "us-louisiana-west-carroll-county": "West Carroll",
+ "us-louisiana-west-feliciana-county": "WestFeliciana",
+ "us-louisiana-winn-county": "Werner",
+ "us-maine": "Maine",
+ "us-maine-androscoggin-county": "Androscoggin",
+ "us-maine-aroostook-county": "Aroostook",
+ "us-maine-cumberland-county": "Cumberland",
+ "us-maine-franklin-county": "Franklin",
+ "us-maine-hancock-county": "Hancock",
+ "us-maine-kennebec-county": "Kennebec",
+ "us-maine-knox-county": "Knox",
+ "us-maine-lincoln-county": "Lincoln",
+ "us-maine-oxford-county": "Luis",
+ "us-maine-penobscot-county": "Penobscot",
+ "us-maine-piscataquis-county": "Piscataquis",
+ "us-maine-sagadahoc-county": "Sagadahoc",
+ "us-maine-somerset-county": "Somerset",
+ "us-maine-waldo-county": "Waldo",
+ "us-maine-washington-county": "Arthur",
+ "us-maine-york-county": "Jennifer",
+ "us-maryland": "Maryland",
+ "us-maryland-allegany-county": "Alfred",
+ "us-maryland-anne-arundel-county": "Anne Arundel",
+ "us-maryland-baltimore-city": "Baltimore",
+ "us-maryland-baltimore-county": "Baltimore",
+ "us-maryland-calvert-county": "Calvert",
+ "us-maryland-caroline-county": "Karlene",
+ "us-maryland-carroll-county": "Carlton",
+ "us-maryland-cecil-county": "Cecil",
+ "us-maryland-charles-county": "Jennifer",
+ "us-maryland-dorchester-county": "Dorchester",
+ "us-maryland-frederick-county": "Evelyn",
+ "us-maryland-garrett-county": "Garrett",
+ "us-maryland-harford-county": "Hannah",
+ "us-maryland-howard-county": "Jörg",
+ "us-maryland-kent-county": "Kent",
+ "us-maryland-montgomery-county": "Montgomery",
+ "us-maryland-prince-georges-county": "Prinz Georges",
+ "us-maryland-queen-annes-county": "Königin Anne",
+ "us-maryland-somerset-county": "Somerset",
+ "us-maryland-st-marys-county": "St. Marij",
+ "us-maryland-talbot-county": "Talbot",
+ "us-maryland-washington-county": "Arthur",
+ "us-maryland-wicomico-county": "Wicomisch",
+ "us-maryland-worcester-county": "Worcester",
+ "us-massachusetts": "Massachusetts",
+ "us-massachusetts-barnstable-county": "Barnstabil",
+ "us-massachusetts-berkshire-county": "Berkshire",
+ "us-massachusetts-bristol-county": "Bristol",
+ "us-massachusetts-dukes-county": "Herzog",
+ "us-massachusetts-essex-county": "Elizabeth",
+ "us-massachusetts-franklin-county": "Franklin",
+ "us-massachusetts-hampden-county": "Hampden",
+ "us-massachusetts-hampshire-county": "Hampshire",
+ "us-massachusetts-middlesex-county": "Middlesex",
+ "us-massachusetts-nantucket-county": "Nantucket",
+ "us-massachusetts-norfolk-county": "Norfolk",
+ "us-massachusetts-plymouth-county": "Plymouth",
+ "us-massachusetts-suffolk-county": "Suffolk",
+ "us-massachusetts-worcester-county": "Worcester",
+ "us-michigan": "Michigan",
+ "us-michigan-alcona-county": "Alcona",
+ "us-michigan-alger-county": "Alg",
+ "us-michigan-allegan-county": "Allegan",
+ "us-michigan-alpena-county": "Alpena",
+ "us-michigan-antrim-county": "Antrim",
+ "us-michigan-arenac-county": "Arenac",
+ "us-michigan-baraga-county": "Baraga",
+ "us-michigan-barry-county": "Gabriel",
+ "us-michigan-bay-county": "Bucht",
+ "us-michigan-benzie-county": "Benzie",
+ "us-michigan-berrien-county": "Berrien",
+ "us-michigan-branch-county": "Zweig",
+ "us-michigan-calhoun-county": "Calhoun",
+ "us-michigan-cass-county": "Cass",
+ "us-michigan-charlevoix-county": "Charlevoix",
+ "us-michigan-cheboygan-county": "Cheboygan",
+ "us-michigan-chippewa-county": "Chippewa",
+ "us-michigan-clare-county": "Gabriele",
+ "us-michigan-clinton-county": "Jennifer",
+ "us-michigan-crawford-county": "Werner",
+ "us-michigan-delta-county": "Lila",
+ "us-michigan-dickinson-county": "Dickinson",
+ "us-michigan-eaton-county": "Elizabeth",
+ "us-michigan-emmet-county": "Emmet",
+ "us-michigan-genesee-county": "Genesee",
+ "us-michigan-gladwin-county": "Gabriel",
+ "us-michigan-gogebic-county": "Gogebic",
+ "us-michigan-grand-traverse-county": "Großer Traverse",
+ "us-michigan-gratiot-county": "Gratiot",
+ "us-michigan-hillsdale-county": "Hillsdale",
+ "us-michigan-houghton-county": "Houghton",
+ "us-michigan-huron-county": "Huron",
+ "us-michigan-ingham-county": "Ingham",
+ "us-michigan-ionia-county": "Ionia",
+ "us-michigan-iosco-county": "Iosco",
+ "us-michigan-iron-county": "Eisen",
+ "us-michigan-isabella-county": "Isabella",
+ "us-michigan-jackson-county": "Jennifer",
+ "us-michigan-kalamazoo-county": "Kalamazoo",
+ "us-michigan-kalkaska-county": "Kalkaska",
+ "us-michigan-kent-county": "Kent",
+ "us-michigan-keweenaw-county": "Keweenaw",
+ "us-michigan-lake-county": "See",
+ "us-michigan-lapeer-county": "Lapeer",
+ "us-michigan-leelanau-county": "Leelanau",
+ "us-michigan-lenawee-county": "Lenawee",
+ "us-michigan-livingston-county": "Livingston",
+ "us-michigan-luce-county": "Luce",
+ "us-michigan-mackinac-county": "Mackinac",
+ "us-michigan-macomb-county": "Macomb",
+ "us-michigan-manistee-county": "Manistee",
+ "us-michigan-marquette-county": "Marquette",
+ "us-michigan-mason-county": "Jürgen",
+ "us-michigan-mecosta-county": "Mecosta",
+ "us-michigan-menominee-county": "Menominee",
+ "us-michigan-midland-county": "Mittelland",
+ "us-michigan-missaukee-county": "Missaukee",
+ "us-michigan-monroe-county": "Monroe",
+ "us-michigan-montcalm-county": "Montcalm",
+ "us-michigan-montmorency-county": "Montmorency",
+ "us-michigan-muskegon-county": "Moschee",
+ "us-michigan-newaygo-county": "Newaygo",
+ "us-michigan-oakland-county": "Eichenland",
+ "us-michigan-oceana-county": "Marilyn",
+ "us-michigan-ogemaw-county": "Ogemaw",
+ "us-michigan-ontonagon-county": "Ontonagon",
+ "us-michigan-osceola-county": "Osceola",
+ "us-michigan-oscoda-county": "Oscoda",
+ "us-michigan-otsego-county": "Otsego",
+ "us-michigan-ottawa-county": "Ottawa",
+ "us-michigan-presque-isle-county": "Presque Isle",
+ "us-michigan-roscommon-county": "Roscommon",
+ "us-michigan-saginaw-county": "Sagina",
+ "us-michigan-sanilac-county": "Sanilac",
+ "us-michigan-schoolcraft-county": "Schulkunst",
+ "us-michigan-shiawassee-county": "Shiawassee",
+ "us-michigan-st-clair-county": "St. Clair",
+ "us-michigan-st-joseph-county": "St. Joseph",
+ "us-michigan-tuscola-county": "Toskana",
+ "us-michigan-van-buren-county": "Van Buren",
+ "us-michigan-washtenaw-county": "Waschtenaw",
+ "us-michigan-wayne-county": "Wayne",
+ "us-michigan-wexford-county": "Wexford",
+ "us-minnesota": "Minnesota",
+ "us-minnesota-aitkin-county": "Aitkin",
+ "us-minnesota-anoka-county": "Anoka",
+ "us-minnesota-becker-county": "Becker",
+ "us-minnesota-beltrami-county": "Beltrami",
+ "us-minnesota-benton-county": "Benton",
+ "us-minnesota-big-stone-county": "Großer Stein",
+ "us-minnesota-blue-earth-county": "Blaue Erde",
+ "us-minnesota-brown-county": "Brauner",
+ "us-minnesota-carlton-county": "Carlton",
+ "us-minnesota-carver-county": "Carver",
+ "us-minnesota-cass-county": "Cass",
+ "us-minnesota-chippewa-county": "Chippewa",
+ "us-minnesota-chisago-county": "Chisago",
+ "us-minnesota-clay-county": "Lehm",
+ "us-minnesota-clearwater-county": "Clearwater",
+ "us-minnesota-cook-county": "Kochen",
+ "us-minnesota-cottonwood-county": "Baumwollholz",
+ "us-minnesota-crow-wing-county": "Krähenflügel",
+ "us-minnesota-dakota-county": "Dakota",
+ "us-minnesota-dodge-county": "Ausweichen",
+ "us-minnesota-douglas-county": "Douglas",
+ "us-minnesota-faribault-county": "Faribault",
+ "us-minnesota-fillmore-county": "Füllen",
+ "us-minnesota-freeborn-county": "Freeborn",
+ "us-minnesota-goodhue-county": "Goodhue",
+ "us-minnesota-grant-county": "Zuschuss",
+ "us-minnesota-hennepin-county": "Hennepin",
+ "us-minnesota-houston-county": "Houston",
+ "us-minnesota-hubbard-county": "Hubbard",
+ "us-minnesota-isanti-county": "Isanti",
+ "us-minnesota-itasca-county": "Itasca",
+ "us-minnesota-jackson-county": "Jennifer",
+ "us-minnesota-kanabec-county": "Kanabec",
+ "us-minnesota-kandiyohi-county": "Kandiyohi",
+ "us-minnesota-kittson-county": "Kätzchen",
+ "us-minnesota-koochiching-county": "Koochiching",
+ "us-minnesota-lac-qui-parle-county": "Lac qui Parle",
+ "us-minnesota-lake-county": "See",
+ "us-minnesota-lake-of-the-woods-county": "See des Waldes",
+ "us-minnesota-le-sueur-county": "Le Sueur",
+ "us-minnesota-lincoln-county": "Lincoln",
+ "us-minnesota-lyon-county": "Lyon",
+ "us-minnesota-mahnomen-county": "Mahnomen",
+ "us-minnesota-marshall-county": "Martha",
+ "us-minnesota-martin-county": "Lucia",
+ "us-minnesota-mcleod-county": "Leod",
+ "us-minnesota-meeker-county": "Meeker",
+ "us-minnesota-mille-lacs-county": "Mille Lacs",
+ "us-minnesota-morrison-county": "Morrison",
+ "us-minnesota-mower-county": "Untere",
+ "us-minnesota-murray-county": "Murray",
+ "us-minnesota-nicollet-county": "Nicollet",
+ "us-minnesota-nobles-county": "Edelsteine",
+ "us-minnesota-norman-county": "Norman",
+ "us-minnesota-olmsted-county": "Olmsted",
+ "us-minnesota-otter-tail-county": "Otter Schwanz",
+ "us-minnesota-pennington-county": "Penningham",
+ "us-minnesota-pine-county": "Kiefer",
+ "us-minnesota-pipestone-county": "Pipstein",
+ "us-minnesota-polk-county": "Polk",
+ "us-minnesota-pope-county": "Papst",
+ "us-minnesota-ramsey-county": "Ramsey",
+ "us-minnesota-red-lake-county": "Roter See",
+ "us-minnesota-redwood-county": "Redholz",
+ "us-minnesota-renville-county": "Renville",
+ "us-minnesota-rice-county": "Reis",
+ "us-minnesota-rock-county": "Felsen",
+ "us-minnesota-roseau-county": "Roseau",
+ "us-minnesota-scott-county": "Jörg",
+ "us-minnesota-sherburne-county": "Sherburne",
+ "us-minnesota-sibley-county": "Sibley",
+ "us-minnesota-st-louis-county": "St. Louis",
+ "us-minnesota-stearns-county": "Stearns",
+ "us-minnesota-steele-county": "Steel",
+ "us-minnesota-stevens-county": "Stevens",
+ "us-minnesota-swift-county": "Swift",
+ "us-minnesota-todd-county": "Todd",
+ "us-minnesota-traverse-county": "Traverse",
+ "us-minnesota-wabasha-county": "Wabasha",
+ "us-minnesota-wadena-county": "Wadena",
+ "us-minnesota-waseca-county": "Waseca",
+ "us-minnesota-washington-county": "Arthur",
+ "us-minnesota-watonwan-county": "Watonwan",
+ "us-minnesota-wilkin-county": "Wilkin",
+ "us-minnesota-winona-county": "Winona",
+ "us-minnesota-wright-county": "Hell",
+ "us-minnesota-yellow-medicine-county": "Gelbe Medizin",
+ "us-mississippi": "Mississippi",
+ "us-mississippi-adams-county": "Jörg",
+ "us-mississippi-alcorn-county": "Alcorn",
+ "us-mississippi-amite-county": "Amitsch",
+ "us-mississippi-attala-county": "Arthur",
+ "us-mississippi-benton-county": "Benton",
+ "us-mississippi-bolivar-county": "Bolivar",
+ "us-mississippi-calhoun-county": "Calhoun",
+ "us-mississippi-carroll-county": "Carlton",
+ "us-mississippi-chickasaw-county": "Chickasaw",
+ "us-mississippi-choctaw-county": "Choktaw",
+ "us-mississippi-claiborne-county": "Claiborne",
+ "us-mississippi-clarke-county": "Jörg",
+ "us-mississippi-clay-county": "Lehm",
+ "us-mississippi-coahoma-county": "Coahom",
+ "us-mississippi-copiah-county": "Kopia",
+ "us-mississippi-covington-county": "Covington",
+ "us-mississippi-desoto-county": "DeSoto",
+ "us-mississippi-forrest-county": "Jörg",
+ "us-mississippi-franklin-county": "Franklin",
+ "us-mississippi-george-county": "Jörg",
+ "us-mississippi-greene-county": "Grün",
+ "us-mississippi-grenada-county": "Grenada",
+ "us-mississippi-hancock-county": "Hancock",
+ "us-mississippi-harrison-county": "Harrison",
+ "us-mississippi-hinds-county": "Hinds",
+ "us-mississippi-holmes-county": "Bohrungen",
+ "us-mississippi-humphreys-county": "Humphreys",
+ "us-mississippi-issaquena-county": "Issaquena",
+ "us-mississippi-itawamba-county": "Itawamba",
+ "us-mississippi-jackson-county": "Jennifer",
+ "us-mississippi-jasper-county": "Jasper",
+ "us-mississippi-jefferson-county": "Jefferson",
+ "us-mississippi-jefferson-davis-county": "Jefferson Davis",
+ "us-mississippi-jones-county": "Jones",
+ "us-mississippi-kemper-county": "Kemper",
+ "us-mississippi-lafayette-county": "Lafayette",
+ "us-mississippi-lamar-county": "Lamar",
+ "us-mississippi-lauderdale-county": "Lauderdale",
+ "us-mississippi-lawrence-county": "Jörg",
+ "us-mississippi-leake-county": "Leake",
+ "us-mississippi-lee-county": "Lennon",
+ "us-mississippi-leflore-county": "Leflore",
+ "us-mississippi-lincoln-county": "Lincoln",
+ "us-mississippi-lowndes-county": "Lowndes",
+ "us-mississippi-madison-county": "Madison",
+ "us-mississippi-marion-county": "Marion",
+ "us-mississippi-marshall-county": "Martha",
+ "us-mississippi-monroe-county": "Monroe",
+ "us-mississippi-montgomery-county": "Montgomery",
+ "us-mississippi-neshoba-county": "Neshoba",
+ "us-mississippi-newton-county": "Newton",
+ "us-mississippi-noxubee-county": "Noxubee",
+ "us-mississippi-oktibbeha-county": "Oktibbeha",
+ "us-mississippi-panola-county": "Panola",
+ "us-mississippi-pearl-river-county": "Perlenfluss",
+ "us-mississippi-perry-county": "Evelyn",
+ "us-mississippi-pike-county": "Pike",
+ "us-mississippi-pontotoc-county": "Pontotoc",
+ "us-mississippi-prentiss-county": "Prentiss",
+ "us-mississippi-quitman-county": "Quitman",
+ "us-mississippi-rankin-county": "Rankin",
+ "us-mississippi-scott-county": "Jörg",
+ "us-mississippi-sharkey-county": "Sharkey",
+ "us-mississippi-simpson-county": "Schäfer",
+ "us-mississippi-smith-county": "Schmied",
+ "us-mississippi-stone-county": "Stein",
+ "us-mississippi-sunflower-county": "Sonnenblume",
+ "us-mississippi-tallahatchie-county": "Tallahatchie",
+ "us-mississippi-tate-county": "Tate",
+ "us-mississippi-tippah-county": "Tiberius",
+ "us-mississippi-tishomingo-county": "Tishomingo",
+ "us-mississippi-tunica-county": "Tunica",
+ "us-mississippi-union-county": "Union",
+ "us-mississippi-walthall-county": "Walthall",
+ "us-mississippi-warren-county": "Warren",
+ "us-mississippi-washington-county": "Arthur",
+ "us-mississippi-wayne-county": "Wayne",
+ "us-mississippi-webster-county": "Webster",
+ "us-mississippi-wilkinson-county": "Wilkinson",
+ "us-mississippi-winston-county": "Winston",
+ "us-mississippi-yalobusha-county": "Yalobusha",
+ "us-mississippi-yazoo-county": "Yazoo",
+ "us-missouri": "Missouri",
+ "us-missouri-adair-county": "Adair",
+ "us-missouri-andrew-county": "Jenny",
+ "us-missouri-atchison-county": "Atchison",
+ "us-missouri-audrain-county": "Jörg",
+ "us-missouri-barry-county": "Gabriel",
+ "us-missouri-barton-county": "Barton",
+ "us-missouri-bates-county": "Bates",
+ "us-missouri-benton-county": "Benton",
+ "us-missouri-bollinger-county": "Bollinger",
+ "us-missouri-boone-county": "Boone",
+ "us-missouri-buchanan-county": "Buchanisch",
+ "us-missouri-butler-county": "Butler",
+ "us-missouri-caldwell-county": "Caldwell",
+ "us-missouri-callaway-county": "Rufe weg",
+ "us-missouri-camden-county": "Camden",
+ "us-missouri-cape-girardeau-county": "Cape Girardeau",
+ "us-missouri-carroll-county": "Carlton",
+ "us-missouri-carter-county": "Jörg",
+ "us-missouri-cass-county": "Cass",
+ "us-missouri-cedar-county": "Zeder",
+ "us-missouri-chariton-county": "Chariton",
+ "us-missouri-christian-county": "Christi",
+ "us-missouri-clark-county": "Jörg",
+ "us-missouri-clay-county": "Lehm",
+ "us-missouri-clinton-county": "Jennifer",
+ "us-missouri-cole-county": "Cole",
+ "us-missouri-cooper-county": "Cooper",
+ "us-missouri-crawford-county": "Werner",
+ "us-missouri-dade-county": "Jörg",
+ "us-missouri-dallas-county": "Dallas",
+ "us-missouri-daviess-county": "Jörg",
+ "us-missouri-dekalb-county": "DeKalb",
+ "us-missouri-dent-county": "Zahnarzt",
+ "us-missouri-douglas-county": "Douglas",
+ "us-missouri-dunklin-county": "Dunkle",
+ "us-missouri-franklin-county": "Franklin",
+ "us-missouri-gasconade-county": "Gasconade",
+ "us-missouri-gentry-county": "Gentry",
+ "us-missouri-greene-county": "Grün",
+ "us-missouri-grundy-county": "Grundlegend",
+ "us-missouri-harrison-county": "Harrison",
+ "us-missouri-henry-county": "Gabriel",
+ "us-missouri-hickory-county": "Hickory",
+ "us-missouri-holt-county": "Hannah",
+ "us-missouri-howard-county": "Jörg",
+ "us-missouri-howell-county": "Hulf",
+ "us-missouri-iron-county": "Eisen",
+ "us-missouri-jackson-county": "Jennifer",
+ "us-missouri-jasper-county": "Jasper",
+ "us-missouri-jefferson-county": "Jefferson",
+ "us-missouri-johnson-county": "Jörg",
+ "us-missouri-knox-county": "Knox",
+ "us-missouri-laclede-county": "Laclede",
+ "us-missouri-lafayette-county": "Lafayette",
+ "us-missouri-lawrence-county": "Jörg",
+ "us-missouri-lewis-county": "Lewis",
+ "us-missouri-lincoln-county": "Lincoln",
+ "us-missouri-linn-county": "Linn",
+ "us-missouri-livingston-county": "Livingston",
+ "us-missouri-macon-county": "Margaret",
+ "us-missouri-madison-county": "Madison",
+ "us-missouri-maries-county": "Karier",
+ "us-missouri-marion-county": "Marion",
+ "us-missouri-mcdonald-county": "Jörg",
+ "us-missouri-mercer-county": "Mercer",
+ "us-missouri-miller-county": "Fritz",
+ "us-missouri-mississippi-county": "Mississippi",
+ "us-missouri-moniteau-county": "Moniteau",
+ "us-missouri-monroe-county": "Monroe",
+ "us-missouri-montgomery-county": "Montgomery",
+ "us-missouri-morgan-county": "Morgan",
+ "us-missouri-new-madrid-county": "Neues Madrid",
+ "us-missouri-newton-county": "Newton",
+ "us-missouri-nodaway-county": "Nodaway",
+ "us-missouri-oregon-county": "Oregon",
+ "us-missouri-osage-county": "Osage",
+ "us-missouri-ozark-county": "Ozark",
+ "us-missouri-pemiscot-county": "Pemiscot",
+ "us-missouri-perry-county": "Evelyn",
+ "us-missouri-pettis-county": "Pettis",
+ "us-missouri-phelps-county": "Phelps",
+ "us-missouri-pike-county": "Pike",
+ "us-missouri-platte-county": "Platte",
+ "us-missouri-polk-county": "Polk",
+ "us-missouri-pulaski-county": "Pulaski",
+ "us-missouri-putnam-county": "Putnam",
+ "us-missouri-ralls-county": "Reihen",
+ "us-missouri-randolph-county": "Zufällig",
+ "us-missouri-ray-county": "Strahl",
+ "us-missouri-reynolds-county": "Reynolds",
+ "us-missouri-ripley-county": "Ripley",
+ "us-missouri-saline-county": "Salin",
+ "us-missouri-schuyler-county": "Schuyler",
+ "us-missouri-scotland-county": "Schottland",
+ "us-missouri-scott-county": "Jörg",
+ "us-missouri-shannon-county": "Jörg",
+ "us-missouri-shelby-county": "Shelby",
+ "us-missouri-st-charles-county": "St. Charles",
+ "us-missouri-st-clair-county": "St. Clair",
+ "us-missouri-st-francois-county": "St. Francois",
+ "us-missouri-st-louis-city": "St. Louis",
+ "us-missouri-st-louis-county": "St. Louis",
+ "us-missouri-ste-genevieve-county": "Ste. Genevieve",
+ "us-missouri-stoddard-county": "Stoddard",
+ "us-missouri-stone-county": "Stein",
+ "us-missouri-sullivan-county": "Sullivan",
+ "us-missouri-taney-county": "Tanny",
+ "us-missouri-texas-county": "Texas",
+ "us-missouri-vernon-county": "Tila",
+ "us-missouri-warren-county": "Warren",
+ "us-missouri-washington-county": "Arthur",
+ "us-missouri-wayne-county": "Wayne",
+ "us-missouri-webster-county": "Webster",
+ "us-missouri-worth-county": "Wert",
+ "us-missouri-wright-county": "Hell",
+ "us-montana": "Montana",
+ "us-montana-beaverhead-county": "Beaverhead",
+ "us-montana-big-horn-county": "Großes Horn",
+ "us-montana-blaine-county": "Blaine",
+ "us-montana-broadwater-county": "Breitwasser",
+ "us-montana-carbon-county": "Kohlenstoff",
+ "us-montana-carter-county": "Jörg",
+ "us-montana-cascade-county": "Cascade",
+ "us-montana-chouteau-county": "Chouteau",
+ "us-montana-custer-county": "Kuster",
+ "us-montana-daniels-county": "Jörg",
+ "us-montana-dawson-county": "Jörg",
+ "us-montana-deer-lodge-county": "Hirschhütte",
+ "us-montana-fallon-county": "Fallon",
+ "us-montana-fergus-county": "Fergus",
+ "us-montana-flathead-county": "Flathead",
+ "us-montana-gallatin-county": "Gallatin",
+ "us-montana-garfield-county": "Gerhard",
+ "us-montana-glacier-county": "Gletscher",
+ "us-montana-golden-valley-county": "Goldenes Tal",
+ "us-montana-granite-county": "Granit",
+ "us-montana-hill-county": "Hill",
+ "us-montana-jefferson-county": "Jefferson",
+ "us-montana-judith-basin-county": "Judith Becken",
+ "us-montana-lake-county": "See",
+ "us-montana-lewis-and-clark-county": "Lewis und Clark",
+ "us-montana-liberty-county": "Freiheit",
+ "us-montana-lincoln-county": "Lincoln",
+ "us-montana-madison-county": "Madison",
+ "us-montana-mccone-county": "McCone",
+ "us-montana-meagher-county": "Meagher",
+ "us-montana-mineral-county": "Mineral",
+ "us-montana-missoula-county": "Missoula",
+ "us-montana-musselshell-county": "Musselshell",
+ "us-montana-park-county": "Parken",
+ "us-montana-petroleum-county": "Erdöl",
+ "us-montana-phillips-county": "Phillips",
+ "us-montana-pondera-county": "Pondera",
+ "us-montana-powder-river-county": "Pulverfluss",
+ "us-montana-powell-county": "Günter",
+ "us-montana-prairie-county": "Prairie",
+ "us-montana-ravalli-county": "Ravalli",
+ "us-montana-richland-county": "Urland",
+ "us-montana-roosevelt-county": "Roosevelt",
+ "us-montana-rosebud-county": "Rosebud",
+ "us-montana-sanders-county": "Sanders",
+ "us-montana-sheridan-county": "Sheridan",
+ "us-montana-silver-bow-county": "Silberbogen",
+ "us-montana-stillwater-county": "Stillwasser",
+ "us-montana-sweet-grass-county": "Süßes Gras",
+ "us-montana-teton-county": "Teton",
+ "us-montana-toole-county": "Toole",
+ "us-montana-treasure-county": "Schatz",
+ "us-montana-valley-county": "Tal",
+ "us-montana-wheatland-county": "Weizenland",
+ "us-montana-wibaux-county": "Wibaux",
+ "us-montana-yellowstone-county": "Gelber Stein",
+ "us-nebraska": "Nebraska",
+ "us-nebraska-adams-county": "Jörg",
+ "us-nebraska-antelope-county": "Antelope",
+ "us-nebraska-arthur-county": "Arthur",
+ "us-nebraska-banner-county": "Banner",
+ "us-nebraska-blaine-county": "Blaine",
+ "us-nebraska-boone-county": "Boone",
+ "us-nebraska-box-butte-county": "Box Butte",
+ "us-nebraska-boyd-county": "Jörg",
+ "us-nebraska-brown-county": "Brauner",
+ "us-nebraska-buffalo-county": "Buffalo",
+ "us-nebraska-burt-county": "Hannah",
+ "us-nebraska-butler-county": "Butler",
+ "us-nebraska-cass-county": "Cass",
+ "us-nebraska-cedar-county": "Zeder",
+ "us-nebraska-chase-county": "Jasmin",
+ "us-nebraska-cherry-county": "Kirsche",
+ "us-nebraska-cheyenne-county": "Cheyenne",
+ "us-nebraska-clay-county": "Lehm",
+ "us-nebraska-colfax-county": "Colfax",
+ "us-nebraska-cuming-county": "Cuming",
+ "us-nebraska-custer-county": "Kuster",
+ "us-nebraska-dakota-county": "Dakota",
+ "us-nebraska-dawes-county": "Dawes",
+ "us-nebraska-dawson-county": "Jörg",
+ "us-nebraska-deuel-county": "Deuel",
+ "us-nebraska-dixon-county": "Dixon",
+ "us-nebraska-dodge-county": "Ausweichen",
+ "us-nebraska-douglas-county": "Douglas",
+ "us-nebraska-dundy-county": "Dundy",
+ "us-nebraska-fillmore-county": "Füllen",
+ "us-nebraska-franklin-county": "Franklin",
+ "us-nebraska-frontier-county": "Grenze",
+ "us-nebraska-furnas-county": "Ofen",
+ "us-nebraska-gage-county": "Hannah",
+ "us-nebraska-garden-county": "Garten",
+ "us-nebraska-garfield-county": "Gerhard",
+ "us-nebraska-gosper-county": "Evangelium",
+ "us-nebraska-grant-county": "Zuschuss",
+ "us-nebraska-greeley-county": "Günther",
+ "us-nebraska-hall-county": "Halle",
+ "us-nebraska-hamilton-county": "Jennifer",
+ "us-nebraska-harlan-county": "Harlan",
+ "us-nebraska-hayes-county": "Hannes",
+ "us-nebraska-hitchcock-county": "Hitchcock",
+ "us-nebraska-holt-county": "Hannah",
+ "us-nebraska-hooker-county": "Hooker",
+ "us-nebraska-howard-county": "Jörg",
+ "us-nebraska-jefferson-county": "Jefferson",
+ "us-nebraska-johnson-county": "Jörg",
+ "us-nebraska-kearney-county": "Kevin",
+ "us-nebraska-keith-county": "Lewis",
+ "us-nebraska-keya-paha-county": "Keya Paha",
+ "us-nebraska-kimball-county": "Kimball",
+ "us-nebraska-knox-county": "Knox",
+ "us-nebraska-lancaster-county": "Lancaster",
+ "us-nebraska-lincoln-county": "Lincoln",
+ "us-nebraska-logan-county": "Logan",
+ "us-nebraska-loup-county": "Lupe",
+ "us-nebraska-madison-county": "Madison",
+ "us-nebraska-mcpherson-county": "McPherson",
+ "us-nebraska-merrick-county": "Gabriel",
+ "us-nebraska-morrill-county": "Morrill",
+ "us-nebraska-nance-county": "Nanz",
+ "us-nebraska-nemaha-county": "Nemaha",
+ "us-nebraska-nuckolls-county": "Nuckolls",
+ "us-nebraska-otoe-county": "Otoe",
+ "us-nebraska-pawnee-county": "Juwelier",
+ "us-nebraska-perkins-county": "Perkins",
+ "us-nebraska-phelps-county": "Phelps",
+ "us-nebraska-pierce-county": "Jörg",
+ "us-nebraska-platte-county": "Platte",
+ "us-nebraska-polk-county": "Polk",
+ "us-nebraska-red-willow-county": "Rote Weide",
+ "us-nebraska-richardson-county": "Martha",
+ "us-nebraska-rock-county": "Felsen",
+ "us-nebraska-saline-county": "Salin",
+ "us-nebraska-sarpy-county": "Sarpy",
+ "us-nebraska-saunders-county": "Saunders",
+ "us-nebraska-scotts-bluff-county": "Schotter Bluff",
+ "us-nebraska-seward-county": "Selig",
+ "us-nebraska-sheridan-county": "Sheridan",
+ "us-nebraska-sherman-county": "Schermann",
+ "us-nebraska-sioux-county": "Sioux",
+ "us-nebraska-stanton-county": "Stanton",
+ "us-nebraska-thayer-county": "Thayer",
+ "us-nebraska-thomas-county": "Jennifer",
+ "us-nebraska-thurston-county": "Thüringen",
+ "us-nebraska-valley-county": "Tal",
+ "us-nebraska-washington-county": "Arthur",
+ "us-nebraska-wayne-county": "Wayne",
+ "us-nebraska-webster-county": "Webster",
+ "us-nebraska-wheeler-county": "Rad",
+ "us-nebraska-york-county": "Jennifer",
+ "us-nevada": "Nevada",
+ "us-nevada-carson-city-county": "Carson Stadt",
+ "us-nevada-churchill-county": "Kirchlein",
+ "us-nevada-clark-county": "Jörg",
+ "us-nevada-douglas-county": "Douglas",
+ "us-nevada-elko-county": "Lenny",
+ "us-nevada-esmeralda-county": "Esmeralda",
+ "us-nevada-eureka-county": "Eureka",
+ "us-nevada-humboldt-county": "Humboldt",
+ "us-nevada-lander-county": "Landern",
+ "us-nevada-lincoln-county": "Lincoln",
+ "us-nevada-lyon-county": "Lyon",
+ "us-nevada-mineral-county": "Mineral",
+ "us-nevada-nye-county": "Nye",
+ "us-nevada-pershing-county": "Pershing",
+ "us-nevada-storey-county": "Storey",
+ "us-nevada-washoe-county": "Washoe",
+ "us-nevada-white-pine-county": "Weiße Kiefer",
+ "us-new-hampshire": "New Hampshire",
+ "us-new-hampshire-belknap-county": "Belknap",
+ "us-new-hampshire-carroll-county": "Carlton",
+ "us-new-hampshire-cheshire-county": "Jörg",
+ "us-new-hampshire-coos-county": "Köche",
+ "us-new-hampshire-grafton-county": "Grafton",
+ "us-new-hampshire-hillsborough-county": "Hillsborough",
+ "us-new-hampshire-merrimack-county": "Merrimack",
+ "us-new-hampshire-rockingham-county": "Rosenberg",
+ "us-new-hampshire-strafford-county": "Strafford",
+ "us-new-hampshire-sullivan-county": "Sullivan",
+ "us-new-jersey": "Neues Jersey",
+ "us-new-jersey-atlantic-county": "Atlantik",
+ "us-new-jersey-bergen-county": "Bergen",
+ "us-new-jersey-burlington-county": "Burlington",
+ "us-new-jersey-camden-county": "Camden",
+ "us-new-jersey-cape-may-county": "Kap Mai",
+ "us-new-jersey-cumberland-county": "Cumberland",
+ "us-new-jersey-essex-county": "Elizabeth",
+ "us-new-jersey-gloucester-county": "Gloucester",
+ "us-new-jersey-hudson-county": "Hudson",
+ "us-new-jersey-hunterdon-county": "Jäger",
+ "us-new-jersey-mercer-county": "Mercer",
+ "us-new-jersey-middlesex-county": "Middlesex",
+ "us-new-jersey-monmouth-county": "Monmoud",
+ "us-new-jersey-morris-county": "Morris",
+ "us-new-jersey-ocean-county": "Ozean",
+ "us-new-jersey-passaic-county": "Passaic",
+ "us-new-jersey-salem-county": "Salem",
+ "us-new-jersey-somerset-county": "Somerset",
+ "us-new-jersey-sussex-county": "Sussex",
+ "us-new-jersey-union-county": "Union",
+ "us-new-jersey-warren-county": "Warren",
+ "us-new-mexico": "Neues Mexiko",
+ "us-new-mexico-bernalillo-county": "Bernalillo",
+ "us-new-mexico-catron-county": "Catron",
+ "us-new-mexico-chaves-county": "Chaves",
+ "us-new-mexico-cibola-county": "Cibola",
+ "us-new-mexico-colfax-county": "Colfax",
+ "us-new-mexico-curry-county": "Krug",
+ "us-new-mexico-de-baca-county": "De Baca",
+ "us-new-mexico-dona-ana-county": "Doña Ana",
+ "us-new-mexico-eddy-county": "Evelyn",
+ "us-new-mexico-grant-county": "Zuschuss",
+ "us-new-mexico-guadalupe-county": "Guadalupe",
+ "us-new-mexico-harding-county": "Härten",
+ "us-new-mexico-hidalgo-county": "Hidalgo",
+ "us-new-mexico-lea-county": "Leo",
+ "us-new-mexico-lincoln-county": "Lincoln",
+ "us-new-mexico-los-alamos-county": "Los Alamos",
+ "us-new-mexico-luna-county": "Luna",
+ "us-new-mexico-mckinley-county": "McKinley",
+ "us-new-mexico-mora-county": "Lila",
+ "us-new-mexico-otero-county": "Otero",
+ "us-new-mexico-quay-county": "Quay",
+ "us-new-mexico-rio-arriba-county": "Rio Arriba",
+ "us-new-mexico-roosevelt-county": "Roosevelt",
+ "us-new-mexico-san-juan-county": "San Juan",
+ "us-new-mexico-san-miguel-county": "San Miguel",
+ "us-new-mexico-sandoval-county": "Sandoval",
+ "us-new-mexico-santa-fe-county": "Santa Fe",
+ "us-new-mexico-sierra-county": "Sierra",
+ "us-new-mexico-socorro-county": "Socorro",
+ "us-new-mexico-taos-county": "Taos",
+ "us-new-mexico-torrance-county": "Torrance",
+ "us-new-mexico-union-county": "Union",
+ "us-new-mexico-valencia-county": "Valencia",
+ "us-new-york": "New York",
+ "us-new-york-albany-county": "Albany",
+ "us-new-york-allegany-county": "Alfred",
+ "us-new-york-bronx-county": "Bronx",
+ "us-new-york-broome-county": "Broome",
+ "us-new-york-cattaraugus-county": "Cattaraugus",
+ "us-new-york-cayuga-county": "Cayuga",
+ "us-new-york-chautauqua-county": "Chautauqua",
+ "us-new-york-chemung-county": "Chemung",
+ "us-new-york-chenango-county": "Chenango",
+ "us-new-york-clinton-county": "Jennifer",
+ "us-new-york-columbia-county": "Kolumbien",
+ "us-new-york-cortland-county": "Kornland",
+ "us-new-york-delaware-county": "Jörg",
+ "us-new-york-dutchess-county": "Niederländisch",
+ "us-new-york-erie-county": "Evelyn",
+ "us-new-york-essex-county": "Elizabeth",
+ "us-new-york-franklin-county": "Franklin",
+ "us-new-york-fulton-county": "Fulton",
+ "us-new-york-genesee-county": "Genesee",
+ "us-new-york-greene-county": "Grün",
+ "us-new-york-hamilton-county": "Jennifer",
+ "us-new-york-herkimer-county": "Herkimer",
+ "us-new-york-jefferson-county": "Jefferson",
+ "us-new-york-kings-county": "Könige",
+ "us-new-york-lewis-county": "Lewis",
+ "us-new-york-livingston-county": "Livingston",
+ "us-new-york-madison-county": "Madison",
+ "us-new-york-monroe-county": "Monroe",
+ "us-new-york-montgomery-county": "Montgomery",
+ "us-new-york-nassau-county": "Nassau",
+ "us-new-york-new-york-county": "New York",
+ "us-new-york-niagara-county": "Niagara",
+ "us-new-york-oneida-county": "Elizabeth",
+ "us-new-york-onondaga-county": "Onondaga",
+ "us-new-york-ontario-county": "Ontario",
+ "us-new-york-orange-county": "Orange",
+ "us-new-york-orleans-county": "Orleans",
+ "us-new-york-oswego-county": "Oswego",
+ "us-new-york-otsego-county": "Otsego",
+ "us-new-york-putnam-county": "Putnam",
+ "us-new-york-queens-county": "Königin",
+ "us-new-york-rensselaer-county": "Rensselaer",
+ "us-new-york-richmond-county": "Rachel",
+ "us-new-york-rockland-county": "Felsen",
+ "us-new-york-saratoga-county": "Saratoga",
+ "us-new-york-schenectady-county": "Schenectady",
+ "us-new-york-schoharie-county": "Jörg",
+ "us-new-york-schuyler-county": "Schuyler",
+ "us-new-york-seneca-county": "Seneca",
+ "us-new-york-st-lawrence-county": "St. Lawrence",
+ "us-new-york-steuben-county": "Steuben",
+ "us-new-york-suffolk-county": "Suffolk",
+ "us-new-york-sullivan-county": "Sullivan",
+ "us-new-york-tioga-county": "Tioga",
+ "us-new-york-tompkins-county": "Tompkins",
+ "us-new-york-ulster-county": "Jörg",
+ "us-new-york-warren-county": "Warren",
+ "us-new-york-washington-county": "Arthur",
+ "us-new-york-wayne-county": "Wayne",
+ "us-new-york-westchester-county": "Westchester",
+ "us-new-york-wyoming-county": "Wyoming",
+ "us-new-york-yates-county": "Yates",
+ "us-north-carolina": "Nord-Carolina",
+ "us-north-carolina-alamance-county": "Alamenz",
+ "us-north-carolina-alexander-county": "Jörg",
+ "us-north-carolina-alleghany-county": "Alleghany",
+ "us-north-carolina-anson-county": "Anne",
+ "us-north-carolina-ashe-county": "Asche",
+ "us-north-carolina-avery-county": "Gabriele",
+ "us-north-carolina-beaufort-county": "Schöne",
+ "us-north-carolina-bertie-county": "Bertie",
+ "us-north-carolina-bladen-county": "Bladen",
+ "us-north-carolina-brunswick-county": "Brunswick,",
+ "us-north-carolina-buncombe-county": "Hülsenkombe",
+ "us-north-carolina-burke-county": "Burke",
+ "us-north-carolina-cabarrus-county": "Cabarrus",
+ "us-north-carolina-caldwell-county": "Caldwell",
+ "us-north-carolina-camden-county": "Camden",
+ "us-north-carolina-carteret-county": "Carteret",
+ "us-north-carolina-caswell-county": "Caswell",
+ "us-north-carolina-catawba-county": "Katawba",
+ "us-north-carolina-chatham-county": "Hannah",
+ "us-north-carolina-cherokee-county": "Cherokee",
+ "us-north-carolina-chowan-county": "Chowan",
+ "us-north-carolina-clay-county": "Lehm",
+ "us-north-carolina-cleveland-county": "Günter",
+ "us-north-carolina-columbus-county": "Kolumbus",
+ "us-north-carolina-craven-county": "Günther",
+ "us-north-carolina-cumberland-county": "Cumberland",
+ "us-north-carolina-currituck-county": "Currituck",
+ "us-north-carolina-dare-county": "Wagemut",
+ "us-north-carolina-davidson-county": "Jennifer",
+ "us-north-carolina-davie-county": "Davie",
+ "us-north-carolina-duplin-county": "Duplin",
+ "us-north-carolina-durham-county": "Durham",
+ "us-north-carolina-edgecombe-county": "Edgecombe",
+ "us-north-carolina-forsyth-county": "Forsyth",
+ "us-north-carolina-franklin-county": "Franklin",
+ "us-north-carolina-gaston-county": "Gaston",
+ "us-north-carolina-gates-county": "Tore",
+ "us-north-carolina-graham-county": "Graham",
+ "us-north-carolina-granville-county": "Gabriel",
+ "us-north-carolina-greene-county": "Grün",
+ "us-north-carolina-guilford-county": "Gabriel",
+ "us-north-carolina-halifax-county": "Halifax",
+ "us-north-carolina-harnett-county": "Harnett",
+ "us-north-carolina-haywood-county": "Hayholz",
+ "us-north-carolina-henderson-county": "Henderson",
+ "us-north-carolina-hertford-county": "Herbert",
+ "us-north-carolina-hoke-county": "Haken",
+ "us-north-carolina-hyde-county": "Hannah",
+ "us-north-carolina-iredell-county": "Iredell",
+ "us-north-carolina-jackson-county": "Jennifer",
+ "us-north-carolina-johnston-county": "Joachim",
+ "us-north-carolina-jones-county": "Jones",
+ "us-north-carolina-lee-county": "Lennon",
+ "us-north-carolina-lenoir-county": "Lenoir",
+ "us-north-carolina-lincoln-county": "Lincoln",
+ "us-north-carolina-macon-county": "Margaret",
+ "us-north-carolina-madison-county": "Madison",
+ "us-north-carolina-martin-county": "Lucia",
+ "us-north-carolina-mcdowell-county": "Jenny",
+ "us-north-carolina-mecklenburg-county": "Mecklenburg",
+ "us-north-carolina-mitchell-county": "Jörg",
+ "us-north-carolina-montgomery-county": "Montgomery",
+ "us-north-carolina-moore-county": "Jörg",
+ "us-north-carolina-nash-county": "Nash",
+ "us-north-carolina-new-hanover-county": "Neue Hannover",
+ "us-north-carolina-northampton-county": "Nordenampton",
+ "us-north-carolina-onslow-county": "Langsam",
+ "us-north-carolina-orange-county": "Orange",
+ "us-north-carolina-pamlico-county": "Pamlico",
+ "us-north-carolina-pasquotank-county": "Pasquotank",
+ "us-north-carolina-pender-county": "Pender",
+ "us-north-carolina-perquimans-county": "Perquimans",
+ "us-north-carolina-person-county": "Person",
+ "us-north-carolina-pitt-county": "Pitt",
+ "us-north-carolina-polk-county": "Polk",
+ "us-north-carolina-randolph-county": "Zufällig",
+ "us-north-carolina-richmond-county": "Rachel",
+ "us-north-carolina-robeson-county": "Robeson",
+ "us-north-carolina-rockingham-county": "Rosenberg",
+ "us-north-carolina-rowan-county": "Rowan",
+ "us-north-carolina-rutherford-county": "Rutherford",
+ "us-north-carolina-sampson-county": "Sampson",
+ "us-north-carolina-scotland-county": "Schottland",
+ "us-north-carolina-stanly-county": "Jörg",
+ "us-north-carolina-stokes-county": "Stacheln",
+ "us-north-carolina-surry-county": "Trauer",
+ "us-north-carolina-swain-county": "Swain",
+ "us-north-carolina-transylvania-county": "Transylvania",
+ "us-north-carolina-tyrrell-county": "Tyrrell",
+ "us-north-carolina-union-county": "Union",
+ "us-north-carolina-vance-county": "Vance",
+ "us-north-carolina-wake-county": "Wecken",
+ "us-north-carolina-warren-county": "Warren",
+ "us-north-carolina-washington-county": "Arthur",
+ "us-north-carolina-watauga-county": "Watauga",
+ "us-north-carolina-wayne-county": "Wayne",
+ "us-north-carolina-wilkes-county": "Jörg",
+ "us-north-carolina-wilson-county": "Wilhelm",
+ "us-north-carolina-yadkin-county": "Yadkin",
+ "us-north-carolina-yancey-county": "Yancey",
+ "us-north-dakota": "Nord-Dakota",
+ "us-north-dakota-adams-county": "Jörg",
+ "us-north-dakota-barnes-county": "Barnes",
+ "us-north-dakota-benson-county": "Benson",
+ "us-north-dakota-billings-county": "Rechnungen",
+ "us-north-dakota-bottineau-county": "Bottineau",
+ "us-north-dakota-bowman-county": "Bogenschütze",
+ "us-north-dakota-burke-county": "Burke",
+ "us-north-dakota-burleigh-county": "Burleigh",
+ "us-north-dakota-cass-county": "Cass",
+ "us-north-dakota-cavalier-county": "Kavalier",
+ "us-north-dakota-dickey-county": "Dickey",
+ "us-north-dakota-divide-county": "Aufteilen",
+ "us-north-dakota-dunn-county": "Dunn",
+ "us-north-dakota-eddy-county": "Evelyn",
+ "us-north-dakota-emmons-county": "Emmons",
+ "us-north-dakota-foster-county": "Foster",
+ "us-north-dakota-golden-valley-county": "Goldenes Tal",
+ "us-north-dakota-grand-forks-county": "Großbogen",
+ "us-north-dakota-grant-county": "Zuschuss",
+ "us-north-dakota-griggs-county": "Griggs",
+ "us-north-dakota-hettinger-county": "Hettinger",
+ "us-north-dakota-kidder-county": "Kinder",
+ "us-north-dakota-lamoure-county": "LaMoure",
+ "us-north-dakota-logan-county": "Logan",
+ "us-north-dakota-mchenry-county": "Martha",
+ "us-north-dakota-mcintosh-county": "McIntosh",
+ "us-north-dakota-mckenzie-county": "Kenzie",
+ "us-north-dakota-mclean-county": "Jennifer",
+ "us-north-dakota-mercer-county": "Mercer",
+ "us-north-dakota-morton-county": "Morton",
+ "us-north-dakota-mountrail-county": "Reitspur",
+ "us-north-dakota-nelson-county": "Nelson",
+ "us-north-dakota-oliver-county": "Joe",
+ "us-north-dakota-pembina-county": "Pembina",
+ "us-north-dakota-pierce-county": "Jörg",
+ "us-north-dakota-ramsey-county": "Ramsey",
+ "us-north-dakota-ransom-county": "Ransom",
+ "us-north-dakota-renville-county": "Renville",
+ "us-north-dakota-richland-county": "Urland",
+ "us-north-dakota-rolette-county": "Rolette",
+ "us-north-dakota-sargent-county": "Sargent",
+ "us-north-dakota-sheridan-county": "Sheridan",
+ "us-north-dakota-sioux-county": "Sioux",
+ "us-north-dakota-slope-county": "Neigung",
+ "us-north-dakota-stark-county": "Stark",
+ "us-north-dakota-steele-county": "Steel",
+ "us-north-dakota-stutsman-county": "Stutsman",
+ "us-north-dakota-towner-county": "Tbesitzer",
+ "us-north-dakota-traill-county": "Traill",
+ "us-north-dakota-walsh-county": "Walisisch",
+ "us-north-dakota-ward-county": "Warte",
+ "us-north-dakota-wells-county": "Brunnen",
+ "us-north-dakota-williams-county": "Jörg",
+ "us-ohio": "Ohio",
+ "us-ohio-adams-county": "Jörg",
+ "us-ohio-allen-county": "Jörg",
+ "us-ohio-ashland-county": "Eschland",
+ "us-ohio-ashtabula-county": "Aschtabula",
+ "us-ohio-athens-county": "Athen",
+ "us-ohio-auglaize-county": "Auglaize",
+ "us-ohio-belmont-county": "Belmont",
+ "us-ohio-brown-county": "Brauner",
+ "us-ohio-butler-county": "Butler",
+ "us-ohio-carroll-county": "Carlton",
+ "us-ohio-champaign-county": "Champaign",
+ "us-ohio-clark-county": "Jörg",
+ "us-ohio-clermont-county": "Clermont",
+ "us-ohio-clinton-county": "Jennifer",
+ "us-ohio-columbiana-county": "Columbiana",
+ "us-ohio-coshocton-county": "Coshocton",
+ "us-ohio-crawford-county": "Werner",
+ "us-ohio-cuyahoga-county": "Cuyahoga",
+ "us-ohio-darke-county": "Finke",
+ "us-ohio-defiance-county": "Missachtung",
+ "us-ohio-delaware-county": "Jörg",
+ "us-ohio-erie-county": "Evelyn",
+ "us-ohio-fairfield-county": "Fairfield",
+ "us-ohio-fayette-county": "Jörg",
+ "us-ohio-franklin-county": "Franklin",
+ "us-ohio-fulton-county": "Fulton",
+ "us-ohio-gallia-county": "Gregor",
+ "us-ohio-geauga-county": "Geauga",
+ "us-ohio-greene-county": "Grün",
+ "us-ohio-guernsey-county": "Guernsey",
+ "us-ohio-hamilton-county": "Jennifer",
+ "us-ohio-hancock-county": "Hancock",
+ "us-ohio-hardin-county": "Hardin",
+ "us-ohio-harrison-county": "Harrison",
+ "us-ohio-henry-county": "Gabriel",
+ "us-ohio-highland-county": "Hochland",
+ "us-ohio-hocking-county": "Hocken",
+ "us-ohio-holmes-county": "Bohrungen",
+ "us-ohio-huron-county": "Huron",
+ "us-ohio-jackson-county": "Jennifer",
+ "us-ohio-jefferson-county": "Jefferson",
+ "us-ohio-knox-county": "Knox",
+ "us-ohio-lake-county": "See",
+ "us-ohio-lawrence-county": "Jörg",
+ "us-ohio-licking-county": "Lecken",
+ "us-ohio-logan-county": "Logan",
+ "us-ohio-lorain-county": "Lorain",
+ "us-ohio-lucas-county": "Lucas",
+ "us-ohio-madison-county": "Madison",
+ "us-ohio-mahoning-county": "Mahoning",
+ "us-ohio-marion-county": "Marion",
+ "us-ohio-medina-county": "Jörg",
+ "us-ohio-meigs-county": "Meier",
+ "us-ohio-mercer-county": "Mercer",
+ "us-ohio-miami-county": "Miami",
+ "us-ohio-monroe-county": "Monroe",
+ "us-ohio-montgomery-county": "Montgomery",
+ "us-ohio-morgan-county": "Morgan",
+ "us-ohio-morrow-county": "Morgen",
+ "us-ohio-muskingum-county": "Muskingum",
+ "us-ohio-noble-county": "Edler",
+ "us-ohio-ottawa-county": "Ottawa",
+ "us-ohio-paulding-county": "Pauling",
+ "us-ohio-perry-county": "Evelyn",
+ "us-ohio-pickaway-county": "Pickaway",
+ "us-ohio-pike-county": "Pike",
+ "us-ohio-portage-county": "Portage",
+ "us-ohio-preble-county": "Präbel",
+ "us-ohio-putnam-county": "Putnam",
+ "us-ohio-richland-county": "Urland",
+ "us-ohio-ross-county": "Ross",
+ "us-ohio-sandusky-county": "Sanduskisch",
+ "us-ohio-scioto-county": "Scioto",
+ "us-ohio-seneca-county": "Seneca",
+ "us-ohio-shelby-county": "Shelby",
+ "us-ohio-stark-county": "Stark",
+ "us-ohio-summit-county": "Gipfel",
+ "us-ohio-trumbull-county": "Trumbull",
+ "us-ohio-tuscarawas-county": "Toskana",
+ "us-ohio-union-county": "Union",
+ "us-ohio-van-wert-county": "Van Wert",
+ "us-ohio-vinton-county": "Vinton",
+ "us-ohio-warren-county": "Warren",
+ "us-ohio-washington-county": "Arthur",
+ "us-ohio-wayne-county": "Wayne",
+ "us-ohio-williams-county": "Jörg",
+ "us-ohio-wood-county": "Holz",
+ "us-ohio-wyandot-county": "Wyandot",
+ "us-oklahoma": "Oklahom",
+ "us-oklahoma-adair-county": "Adair",
+ "us-oklahoma-alfalfa-county": "Alfalfa",
+ "us-oklahoma-atoka-county": "Atoka",
+ "us-oklahoma-beaver-county": "Biber",
+ "us-oklahoma-beckham-county": "Beckham",
+ "us-oklahoma-blaine-county": "Blaine",
+ "us-oklahoma-bryan-county": "Jennifer",
+ "us-oklahoma-caddo-county": "Caddo",
+ "us-oklahoma-canadian-county": "Kanadisch",
+ "us-oklahoma-carter-county": "Jörg",
+ "us-oklahoma-cherokee-county": "Cherokee",
+ "us-oklahoma-choctaw-county": "Choktaw",
+ "us-oklahoma-cimarron-county": "Cimarron",
+ "us-oklahoma-cleveland-county": "Günter",
+ "us-oklahoma-coal-county": "Kohle",
+ "us-oklahoma-comanche-county": "Comanche",
+ "us-oklahoma-cotton-county": "Baumwolle",
+ "us-oklahoma-craig-county": "Gerald",
+ "us-oklahoma-creek-county": "Creek",
+ "us-oklahoma-custer-county": "Kuster",
+ "us-oklahoma-delaware-county": "Jörg",
+ "us-oklahoma-dewey-county": "Dewey",
+ "us-oklahoma-ellis-county": "Lili",
+ "us-oklahoma-garfield-county": "Gerhard",
+ "us-oklahoma-garvin-county": "Garvin",
+ "us-oklahoma-grady-county": "Gabriel",
+ "us-oklahoma-grant-county": "Zuschuss",
+ "us-oklahoma-greer-county": "Greer",
+ "us-oklahoma-harmon-county": "Harmon",
+ "us-oklahoma-harper-county": "Harper",
+ "us-oklahoma-haskell-county": "Haskell",
+ "us-oklahoma-hughes-county": "Hannah",
+ "us-oklahoma-jackson-county": "Jennifer",
+ "us-oklahoma-jefferson-county": "Jefferson",
+ "us-oklahoma-johnston-county": "Joachim",
+ "us-oklahoma-kay-county": "Kay",
+ "us-oklahoma-kingfisher-county": "Königsfischer",
+ "us-oklahoma-kiowa-county": "Kiowa",
+ "us-oklahoma-latimer-county": "Latimer",
+ "us-oklahoma-leflore-county": "LeFlore",
+ "us-oklahoma-lincoln-county": "Lincoln",
+ "us-oklahoma-logan-county": "Logan",
+ "us-oklahoma-love-county": "Liebe",
+ "us-oklahoma-major-county": "Gr.",
+ "us-oklahoma-marshall-county": "Martha",
+ "us-oklahoma-mayes-county": "Mayes",
+ "us-oklahoma-mcclain-county": "Jörg",
+ "us-oklahoma-mccurtain-county": "McVorhang",
+ "us-oklahoma-mcintosh-county": "McIntosh",
+ "us-oklahoma-murray-county": "Murray",
+ "us-oklahoma-muskogee-county": "Muskogee",
+ "us-oklahoma-noble-county": "Edler",
+ "us-oklahoma-nowata-county": "Nowata",
+ "us-oklahoma-okfuskee-county": "Okfuskee",
+ "us-oklahoma-oklahoma-county": "Oklahom",
+ "us-oklahoma-okmulgee-county": "Okmulgee",
+ "us-oklahoma-osage-county": "Osage",
+ "us-oklahoma-ottawa-county": "Ottawa",
+ "us-oklahoma-pawnee-county": "Juwelier",
+ "us-oklahoma-payne-county": "Karl-Heinz",
+ "us-oklahoma-pittsburg-county": "Pittsburg",
+ "us-oklahoma-pontotoc-county": "Pontotoc",
+ "us-oklahoma-pottawatomie-county": "Pottawatomie",
+ "us-oklahoma-pushmataha-county": "Pushmata",
+ "us-oklahoma-roger-mills-county": "Roger Mühlen",
+ "us-oklahoma-rogers-county": "Roger",
+ "us-oklahoma-seminole-county": "Seminar",
+ "us-oklahoma-sequoyah-county": "Sequoyah",
+ "us-oklahoma-stephens-county": "Stephan",
+ "us-oklahoma-texas-county": "Texas",
+ "us-oklahoma-tillman-county": "Tillman",
+ "us-oklahoma-tulsa-county": "Tulsa",
+ "us-oklahoma-wagoner-county": "Wagoner",
+ "us-oklahoma-washington-county": "Arthur",
+ "us-oklahoma-washita-county": "Susanne",
+ "us-oklahoma-woods-county": "Wälder",
+ "us-oklahoma-woodward-county": "Holz",
+ "us-oregon": "Oregon",
+ "us-oregon-baker-county": "Baker",
+ "us-oregon-benton-county": "Benton",
+ "us-oregon-clackamas-county": "Clackamas",
+ "us-oregon-clatsop-county": "Clatsop",
+ "us-oregon-columbia-county": "Kolumbien",
+ "us-oregon-coos-county": "Köche",
+ "us-oregon-crook-county": "Käfer",
+ "us-oregon-curry-county": "Krug",
+ "us-oregon-deschutes-county": "Deschutes",
+ "us-oregon-douglas-county": "Douglas",
+ "us-oregon-gilliam-county": "Günther",
+ "us-oregon-grant-county": "Zuschuss",
+ "us-oregon-harney-county": "Hannah",
+ "us-oregon-hood-river-county": "Kapuze Fluss",
+ "us-oregon-jackson-county": "Jennifer",
+ "us-oregon-jefferson-county": "Jefferson",
+ "us-oregon-josephine-county": "Josephine",
+ "us-oregon-klamath-county": "Klamath",
+ "us-oregon-lake-county": "See",
+ "us-oregon-lane-county": "Lane",
+ "us-oregon-lincoln-county": "Lincoln",
+ "us-oregon-linn-county": "Linn",
+ "us-oregon-malheur-county": "Malheur",
+ "us-oregon-marion-county": "Marion",
+ "us-oregon-morrow-county": "Morgen",
+ "us-oregon-multnomah-county": "Multnomah",
+ "us-oregon-polk-county": "Polk",
+ "us-oregon-sherman-county": "Schermann",
+ "us-oregon-tillamook-county": "Tillamook",
+ "us-oregon-umatilla-county": "Umatilla",
+ "us-oregon-union-county": "Union",
+ "us-oregon-wallowa-county": "Wallowa",
+ "us-oregon-wasco-county": "Wasco",
+ "us-oregon-washington-county": "Arthur",
+ "us-oregon-wheeler-county": "Rad",
+ "us-oregon-yamhill-county": "Yamhill",
+ "us-pennsylvania": "Pennsylvania",
+ "us-pennsylvania-adams-county": "Jörg",
+ "us-pennsylvania-allegheny-county": "Allegheny",
+ "us-pennsylvania-armstrong-county": "Armstrong",
+ "us-pennsylvania-beaver-county": "Biber",
+ "us-pennsylvania-bedford-county": "Jörg",
+ "us-pennsylvania-berks-county": "Berks",
+ "us-pennsylvania-blair-county": "Blair",
+ "us-pennsylvania-bradford-county": "Martha",
+ "us-pennsylvania-bucks-county": "Bucks",
+ "us-pennsylvania-butler-county": "Butler",
+ "us-pennsylvania-cambria-county": "Cambria",
+ "us-pennsylvania-cameron-county": "Jörg",
+ "us-pennsylvania-carbon-county": "Kohlenstoff",
+ "us-pennsylvania-centre-county": "Mitte",
+ "us-pennsylvania-chester-county": "Jörg",
+ "us-pennsylvania-clarion-county": "Clarion",
+ "us-pennsylvania-clearfield-county": "Leerfeld",
+ "us-pennsylvania-clinton-county": "Jennifer",
+ "us-pennsylvania-columbia-county": "Kolumbien",
+ "us-pennsylvania-crawford-county": "Werner",
+ "us-pennsylvania-cumberland-county": "Cumberland",
+ "us-pennsylvania-dauphin-county": "Dauphin",
+ "us-pennsylvania-delaware-county": "Jörg",
+ "us-pennsylvania-elk-county": "Elk",
+ "us-pennsylvania-erie-county": "Evelyn",
+ "us-pennsylvania-fayette-county": "Jörg",
+ "us-pennsylvania-forest-county": "Wald",
+ "us-pennsylvania-franklin-county": "Franklin",
+ "us-pennsylvania-fulton-county": "Fulton",
+ "us-pennsylvania-greene-county": "Grün",
+ "us-pennsylvania-huntingdon-county": "Jäger",
+ "us-pennsylvania-indiana-county": "Indiana",
+ "us-pennsylvania-jefferson-county": "Jefferson",
+ "us-pennsylvania-juniata-county": "Juniata",
+ "us-pennsylvania-lackawanna-county": "Lackawanna",
+ "us-pennsylvania-lancaster-county": "Lancaster",
+ "us-pennsylvania-lawrence-county": "Jörg",
+ "us-pennsylvania-lebanon-county": "Lebanon",
+ "us-pennsylvania-lehigh-county": "Jörg",
+ "us-pennsylvania-luzerne-county": "Luzerne",
+ "us-pennsylvania-lycoming-county": "Lyvents",
+ "us-pennsylvania-mckean-county": "McKean",
+ "us-pennsylvania-mercer-county": "Mercer",
+ "us-pennsylvania-mifflin-county": "Mifflin",
+ "us-pennsylvania-monroe-county": "Monroe",
+ "us-pennsylvania-montgomery-county": "Montgomery",
+ "us-pennsylvania-montour-county": "MonTour",
+ "us-pennsylvania-northampton-county": "Nordenampton",
+ "us-pennsylvania-northumberland-county": "Northumberland",
+ "us-pennsylvania-perry-county": "Evelyn",
+ "us-pennsylvania-philadelphia-county": "Philadelphia",
+ "us-pennsylvania-pike-county": "Pike",
+ "us-pennsylvania-potter-county": "Töpfer",
+ "us-pennsylvania-schuylkill-county": "Schuylkill",
+ "us-pennsylvania-snyder-county": "Snyder",
+ "us-pennsylvania-somerset-county": "Somerset",
+ "us-pennsylvania-sullivan-county": "Sullivan",
+ "us-pennsylvania-susquehanna-county": "Susquehanna",
+ "us-pennsylvania-tioga-county": "Tioga",
+ "us-pennsylvania-union-county": "Union",
+ "us-pennsylvania-venango-county": "Venango",
+ "us-pennsylvania-warren-county": "Warren",
+ "us-pennsylvania-washington-county": "Arthur",
+ "us-pennsylvania-wayne-county": "Wayne",
+ "us-pennsylvania-westmoreland-county": "Westmorland",
+ "us-pennsylvania-wyoming-county": "Wyoming",
+ "us-pennsylvania-york-county": "Jennifer",
+ "us-rhode-island": "Rhode Insel",
+ "us-rhode-island-bristol-county": "Bristol",
+ "us-rhode-island-kent-county": "Kent",
+ "us-rhode-island-newport-county": "Newport",
+ "us-rhode-island-providence-county": "Vorrat",
+ "us-rhode-island-washington-county": "Arthur",
+ "us-south-carolina": "Süd-Carolina",
+ "us-south-carolina-abbeville-county": "Abbeville",
+ "us-south-carolina-aiken-county": "Aiken",
+ "us-south-carolina-allendale-county": "Allendale",
+ "us-south-carolina-anderson-county": "Anderson",
+ "us-south-carolina-bamberg-county": "Bamberg",
+ "us-south-carolina-barnwell-county": "Barnwell",
+ "us-south-carolina-beaufort-county": "Schöne",
+ "us-south-carolina-berkeley-county": "Bernd",
+ "us-south-carolina-calhoun-county": "Calhoun",
+ "us-south-carolina-charleston-county": "Karleston",
+ "us-south-carolina-cherokee-county": "Cherokee",
+ "us-south-carolina-chester-county": "Jörg",
+ "us-south-carolina-chesterfield-county": "Chesterfield",
+ "us-south-carolina-clarendon-county": "Jörg",
+ "us-south-carolina-colleton-county": "Karl-Heinz",
+ "us-south-carolina-darlington-county": "Jennifer",
+ "us-south-carolina-dillon-county": "Jörg",
+ "us-south-carolina-dorchester-county": "Dorchester",
+ "us-south-carolina-edgefield-county": "Edgefield",
+ "us-south-carolina-fairfield-county": "Fairfield",
+ "us-south-carolina-florence-county": "Florida",
+ "us-south-carolina-georgetown-county": "Georgetown",
+ "us-south-carolina-greenville-county": "Grönland",
+ "us-south-carolina-greenwood-county": "Grönholz",
+ "us-south-carolina-hampton-county": "Hampton",
+ "us-south-carolina-horry-county": "Hannah",
+ "us-south-carolina-jasper-county": "Jasper",
+ "us-south-carolina-kershaw-county": "Kerschau",
+ "us-south-carolina-lancaster-county": "Lancaster",
+ "us-south-carolina-laurens-county": "Lennon",
+ "us-south-carolina-lee-county": "Lennon",
+ "us-south-carolina-lexington-county": "Lexington",
+ "us-south-carolina-marion-county": "Marion",
+ "us-south-carolina-marlboro-county": "Marlboro",
+ "us-south-carolina-mccormick-county": "McCormick",
+ "us-south-carolina-newberry-county": "Neubeere",
+ "us-south-carolina-oconee-county": "Oconee",
+ "us-south-carolina-orangeburg-county": "Orangeburg",
+ "us-south-carolina-pickens-county": "Pickens",
+ "us-south-carolina-richland-county": "Urland",
+ "us-south-carolina-saluda-county": "Saluda",
+ "us-south-carolina-spartanburg-county": "Spartanburg",
+ "us-south-carolina-sumter-county": "Sumter",
+ "us-south-carolina-union-county": "Union",
+ "us-south-carolina-williamsburg-county": "Wilhelm",
+ "us-south-carolina-york-county": "Jennifer",
+ "us-south-dakota": "Dakota",
+ "us-south-dakota-aurora-county": "Aurora",
+ "us-south-dakota-beadle-county": "Perle",
+ "us-south-dakota-bennett-county": "Bennett",
+ "us-south-dakota-bon-homme-county": "Bon Homme",
+ "us-south-dakota-brookings-county": "Brookings",
+ "us-south-dakota-brown-county": "Brauner",
+ "us-south-dakota-brule-county": "Brule",
+ "us-south-dakota-buffalo-county": "Buffalo",
+ "us-south-dakota-butte-county": "Hannah",
+ "us-south-dakota-campbell-county": "Campbell",
+ "us-south-dakota-charles-mix-county": "Charles Mix",
+ "us-south-dakota-clark-county": "Jörg",
+ "us-south-dakota-clay-county": "Lehm",
+ "us-south-dakota-codington-county": "Codington",
+ "us-south-dakota-corson-county": "Corson",
+ "us-south-dakota-custer-county": "Kuster",
+ "us-south-dakota-davison-county": "Jennifer",
+ "us-south-dakota-day-county": "Tag",
+ "us-south-dakota-deuel-county": "Deuel",
+ "us-south-dakota-dewey-county": "Dewey",
+ "us-south-dakota-douglas-county": "Douglas",
+ "us-south-dakota-edmunds-county": "Jennifer",
+ "us-south-dakota-fall-river-county": "Fallfluss",
+ "us-south-dakota-faulk-county": "Fehler",
+ "us-south-dakota-grant-county": "Zuschuss",
+ "us-south-dakota-gregory-county": "Gregor",
+ "us-south-dakota-haakon-county": "Jörg",
+ "us-south-dakota-hamlin-county": "Hamlin",
+ "us-south-dakota-hand-county": "Hand",
+ "us-south-dakota-hanson-county": "Jörg",
+ "us-south-dakota-harding-county": "Härten",
+ "us-south-dakota-hughes-county": "Hannah",
+ "us-south-dakota-hutchinson-county": "Hutchinson",
+ "us-south-dakota-hyde-county": "Hannah",
+ "us-south-dakota-jackson-county": "Jennifer",
+ "us-south-dakota-jerauld-county": "Jörg",
+ "us-south-dakota-jones-county": "Jones",
+ "us-south-dakota-kingsbury-county": "Königsbury",
+ "us-south-dakota-lake-county": "See",
+ "us-south-dakota-lawrence-county": "Jörg",
+ "us-south-dakota-lincoln-county": "Lincoln",
+ "us-south-dakota-lyman-county": "Lyman",
+ "us-south-dakota-marshall-county": "Martha",
+ "us-south-dakota-mccook-county": "McCook",
+ "us-south-dakota-mcpherson-county": "McPherson",
+ "us-south-dakota-meade-county": "Meide",
+ "us-south-dakota-mellette-county": "Mellette",
+ "us-south-dakota-miner-county": "Bergmann",
+ "us-south-dakota-minnehaha-county": "Minnehaha",
+ "us-south-dakota-moody-county": "Moody",
+ "us-south-dakota-oglala-lakota-county": "Oglala Lakota",
+ "us-south-dakota-pennington-county": "Penningham",
+ "us-south-dakota-perkins-county": "Perkins",
+ "us-south-dakota-potter-county": "Töpfer",
+ "us-south-dakota-roberts-county": "Roberts",
+ "us-south-dakota-sanborn-county": "Sanborn",
+ "us-south-dakota-spink-county": "Spinken",
+ "us-south-dakota-stanley-county": "Stanley",
+ "us-south-dakota-sully-county": "Elias",
+ "us-south-dakota-todd-county": "Todd",
+ "us-south-dakota-tripp-county": "Tripp",
+ "us-south-dakota-turner-county": "Jörg",
+ "us-south-dakota-union-county": "Union",
+ "us-south-dakota-walworth-county": "Walworth",
+ "us-south-dakota-yankton-county": "Yankton",
+ "us-south-dakota-ziebach-county": "Stephan",
+ "us-tennessee": "Tennessee",
+ "us-tennessee-anderson-county": "Anderson",
+ "us-tennessee-bedford-county": "Jörg",
+ "us-tennessee-benton-county": "Benton",
+ "us-tennessee-bledsoe-county": "Bledsoe",
+ "us-tennessee-blount-county": "Blount",
+ "us-tennessee-bradley-county": "Bradley",
+ "us-tennessee-campbell-county": "Campbell",
+ "us-tennessee-cannon-county": "Kanone",
+ "us-tennessee-carroll-county": "Carlton",
+ "us-tennessee-carter-county": "Jörg",
+ "us-tennessee-cheatham-county": "Cheatham",
+ "us-tennessee-chester-county": "Jörg",
+ "us-tennessee-claiborne-county": "Claiborne",
+ "us-tennessee-clay-county": "Lehm",
+ "us-tennessee-cocke-county": "Cocke",
+ "us-tennessee-coffee-county": "Kaffee",
+ "us-tennessee-crockett-county": "Karin",
+ "us-tennessee-cumberland-county": "Cumberland",
+ "us-tennessee-davidson-county": "Jennifer",
+ "us-tennessee-decatur-county": "Decatur",
+ "us-tennessee-dekalb-county": "DeKalb",
+ "us-tennessee-dickson-county": "Dickson",
+ "us-tennessee-dyer-county": "Dylan",
+ "us-tennessee-fayette-county": "Jörg",
+ "us-tennessee-fentress-county": "Fritz",
+ "us-tennessee-franklin-county": "Franklin",
+ "us-tennessee-gibson-county": "Gibson",
+ "us-tennessee-giles-county": "Gordon",
+ "us-tennessee-grainger-county": "Grainger",
+ "us-tennessee-greene-county": "Grün",
+ "us-tennessee-grundy-county": "Grundlegend",
+ "us-tennessee-hamblen-county": "Hamblen",
+ "us-tennessee-hamilton-county": "Jennifer",
+ "us-tennessee-hancock-county": "Hancock",
+ "us-tennessee-hardeman-county": "Hardeman",
+ "us-tennessee-hardin-county": "Hardin",
+ "us-tennessee-hawkins-county": "Hawkins",
+ "us-tennessee-haywood-county": "Hayholz",
+ "us-tennessee-henderson-county": "Henderson",
+ "us-tennessee-henry-county": "Gabriel",
+ "us-tennessee-hickman-county": "Hickman",
+ "us-tennessee-houston-county": "Houston",
+ "us-tennessee-humphreys-county": "Humphreys",
+ "us-tennessee-jackson-county": "Jennifer",
+ "us-tennessee-jefferson-county": "Jefferson",
+ "us-tennessee-johnson-county": "Jörg",
+ "us-tennessee-knox-county": "Knox",
+ "us-tennessee-lake-county": "See",
+ "us-tennessee-lauderdale-county": "Lauderdale",
+ "us-tennessee-lawrence-county": "Jörg",
+ "us-tennessee-lewis-county": "Lewis",
+ "us-tennessee-lincoln-county": "Lincoln",
+ "us-tennessee-loudon-county": "Loudon",
+ "us-tennessee-macon-county": "Margaret",
+ "us-tennessee-madison-county": "Madison",
+ "us-tennessee-marion-county": "Marion",
+ "us-tennessee-marshall-county": "Martha",
+ "us-tennessee-maury-county": "Maury",
+ "us-tennessee-mcminn-county": "McMinn",
+ "us-tennessee-mcnairy-county": "McNairy",
+ "us-tennessee-meigs-county": "Meier",
+ "us-tennessee-monroe-county": "Monroe",
+ "us-tennessee-montgomery-county": "Montgomery",
+ "us-tennessee-moore-county": "Jörg",
+ "us-tennessee-morgan-county": "Morgan",
+ "us-tennessee-obion-county": "Obdach",
+ "us-tennessee-overton-county": "Overton",
+ "us-tennessee-perry-county": "Evelyn",
+ "us-tennessee-pickett-county": "Kartoffel",
+ "us-tennessee-polk-county": "Polk",
+ "us-tennessee-putnam-county": "Putnam",
+ "us-tennessee-rhea-county": "Rhea",
+ "us-tennessee-roane-county": "Roane",
+ "us-tennessee-robertson-county": "Robertson",
+ "us-tennessee-rutherford-county": "Rutherford",
+ "us-tennessee-scott-county": "Jörg",
+ "us-tennessee-sequatchie-county": "Sequatchie",
+ "us-tennessee-sevier-county": "Sevier",
+ "us-tennessee-shelby-county": "Shelby",
+ "us-tennessee-smith-county": "Schmied",
+ "us-tennessee-stewart-county": "Stewart",
+ "us-tennessee-sullivan-county": "Sullivan",
+ "us-tennessee-sumner-county": "Sumner",
+ "us-tennessee-tipton-county": "Tipton",
+ "us-tennessee-trousdale-county": "Trousdale",
+ "us-tennessee-unicoi-county": "Unicoi",
+ "us-tennessee-union-county": "Union",
+ "us-tennessee-van-buren-county": "Van Buren",
+ "us-tennessee-warren-county": "Warren",
+ "us-tennessee-washington-county": "Arthur",
+ "us-tennessee-wayne-county": "Wayne",
+ "us-tennessee-weakley-county": "Schwäche",
+ "us-tennessee-white-county": "Weiß",
+ "us-tennessee-williamson-county": "Martha",
+ "us-tennessee-wilson-county": "Wilhelm",
+ "us-texas": "Texas",
+ "us-texas-anderson-county": "Anderson",
+ "us-texas-andrews-county": "Andrew",
+ "us-texas-angelina-county": "Jennifer",
+ "us-texas-aransas-county": "Aransas",
+ "us-texas-archer-county": "Bogenschütze",
+ "us-texas-armstrong-county": "Armstrong",
+ "us-texas-atascosa-county": "Atascosa",
+ "us-texas-austin-county": "Anne",
+ "us-texas-bailey-county": "Bailey",
+ "us-texas-bandera-county": "Bandera",
+ "us-texas-bastrop-county": "Bastrop",
+ "us-texas-baylor-county": "Baylor",
+ "us-texas-bee-county": "Biene",
+ "us-texas-bell-county": "Glocke",
+ "us-texas-bexar-county": "Bexar",
+ "us-texas-blanco-county": "Lewis",
+ "us-texas-borden-county": "Borden",
+ "us-texas-bosque-county": "Jörg",
+ "us-texas-bowie-county": "Bowie",
+ "us-texas-brazoria-county": "Brasilien",
+ "us-texas-brazos-county": "Brazos",
+ "us-texas-brewster-county": "Brauer",
+ "us-texas-briscoe-county": "Briscoe",
+ "us-texas-brooks-county": "Lila",
+ "us-texas-brown-county": "Brauner",
+ "us-texas-burleson-county": "Burleson",
+ "us-texas-burnet-county": "Burnet",
+ "us-texas-caldwell-county": "Caldwell",
+ "us-texas-calhoun-county": "Calhoun",
+ "us-texas-callahan-county": "Callahan",
+ "us-texas-cameron-county": "Jörg",
+ "us-texas-camp-county": "Lager",
+ "us-texas-carson-county": "Jörg",
+ "us-texas-cass-county": "Cass",
+ "us-texas-castro-county": "Castros",
+ "us-texas-chambers-county": "Kammern",
+ "us-texas-cherokee-county": "Cherokee",
+ "us-texas-childress-county": "Kinderkleidung",
+ "us-texas-clay-county": "Lehm",
+ "us-texas-cochran-county": "Cochran",
+ "us-texas-coke-county": "Koks",
+ "us-texas-coleman-county": "Coleman",
+ "us-texas-collin-county": "Eveline",
+ "us-texas-collingsworth-county": "Collingsworth",
+ "us-texas-colorado-county": "Colorado",
+ "us-texas-comal-county": "Comal",
+ "us-texas-comanche-county": "Comanche",
+ "us-texas-concho-county": "Concho",
+ "us-texas-cooke-county": "Kochen",
+ "us-texas-coryell-county": "Coryell",
+ "us-texas-cottle-county": "Cottle",
+ "us-texas-crane-county": "Krane",
+ "us-texas-crockett-county": "Karin",
+ "us-texas-crosby-county": "Kreuz",
+ "us-texas-culberson-county": "Günther",
+ "us-texas-dallam-county": "Dallam",
+ "us-texas-dallas-county": "Dallas",
+ "us-texas-dawson-county": "Jörg",
+ "us-texas-deaf-smith-county": "Gehörloser Schmied",
+ "us-texas-delta-county": "Lila",
+ "us-texas-denton-county": "Denton",
+ "us-texas-dewitt-county": "DeWitt",
+ "us-texas-dickens-county": "Dickens",
+ "us-texas-dimmit-county": "Dennis",
+ "us-texas-donley-county": "Donley",
+ "us-texas-duval-county": "Dauer",
+ "us-texas-eastland-county": "Ostland",
+ "us-texas-ector-county": "Ector",
+ "us-texas-edwards-county": "Jörg",
+ "us-texas-el-paso-county": "El Paso",
+ "us-texas-ellis-county": "Lili",
+ "us-texas-erath-county": "Erbsen",
+ "us-texas-falls-county": "Sturz",
+ "us-texas-fannin-county": "Fannin",
+ "us-texas-fayette-county": "Jörg",
+ "us-texas-fisher-county": "Angelo",
+ "us-texas-floyd-county": "Floyd",
+ "us-texas-foard-county": "Foard",
+ "us-texas-fort-bend-county": "Festungsbündel",
+ "us-texas-franklin-county": "Franklin",
+ "us-texas-freestone-county": "Freier Stein",
+ "us-texas-frio-county": "Frio",
+ "us-texas-gaines-county": "Gewinn",
+ "us-texas-galveston-county": "Galveston",
+ "us-texas-garza-county": "Jennifer",
+ "us-texas-gillespie-county": "Gillespie",
+ "us-texas-glasscock-county": "Glascock",
+ "us-texas-goliad-county": "Goliad",
+ "us-texas-gonzales-county": "Gonzalez",
+ "us-texas-gray-county": "Grau",
+ "us-texas-grayson-county": "Gabriel",
+ "us-texas-gregg-county": "Gregg",
+ "us-texas-grimes-county": "Grimes",
+ "us-texas-guadalupe-county": "Guadalupe",
+ "us-texas-hale-county": "Hale",
+ "us-texas-hall-county": "Halle",
+ "us-texas-hamilton-county": "Jennifer",
+ "us-texas-hansford-county": "Jennifer",
+ "us-texas-hardeman-county": "Hardeman",
+ "us-texas-hardin-county": "Hardin",
+ "us-texas-harris-county": "Harris",
+ "us-texas-harrison-county": "Harrison",
+ "us-texas-hartley-county": "Hannah",
+ "us-texas-haskell-county": "Haskell",
+ "us-texas-hays-county": "Heuen",
+ "us-texas-hemphill-county": "Hanf",
+ "us-texas-henderson-county": "Henderson",
+ "us-texas-hidalgo-county": "Hidalgo",
+ "us-texas-hill-county": "Hill",
+ "us-texas-hockley-county": "Hockley",
+ "us-texas-hood-county": "Kapuze",
+ "us-texas-hopkins-county": "Hopkins",
+ "us-texas-houston-county": "Houston",
+ "us-texas-howard-county": "Jörg",
+ "us-texas-hudspeth-county": "Hudspeth",
+ "us-texas-hunt-county": "Jagd",
+ "us-texas-hutchinson-county": "Hutchinson",
+ "us-texas-irion-county": "Irion",
+ "us-texas-jack-county": "Stephan",
+ "us-texas-jackson-county": "Jennifer",
+ "us-texas-jasper-county": "Jasper",
+ "us-texas-jeff-davis-county": "Jeff Davis",
+ "us-texas-jefferson-county": "Jefferson",
+ "us-texas-jim-hogg-county": "Jim Hogg",
+ "us-texas-jim-wells-county": "Jim Brunnen",
+ "us-texas-johnson-county": "Jörg",
+ "us-texas-jones-county": "Jones",
+ "us-texas-karnes-county": "Karnes",
+ "us-texas-kaufman-county": "Kaufman",
+ "us-texas-kendall-county": "Kendall",
+ "us-texas-kenedy-county": "Jennifer",
+ "us-texas-kent-county": "Kent",
+ "us-texas-kerr-county": "Jörg",
+ "us-texas-kimble-county": "Würfel",
+ "us-texas-king-county": "König",
+ "us-texas-kinney-county": "Kinney",
+ "us-texas-kleberg-county": "Kleberg",
+ "us-texas-knox-county": "Knox",
+ "us-texas-la-salle-county": "La Salle",
+ "us-texas-lamar-county": "Lamar",
+ "us-texas-lamb-county": "Lamb",
+ "us-texas-lampasas-county": "Lampasas",
+ "us-texas-lavaca-county": "Lavaca",
+ "us-texas-lee-county": "Lennon",
+ "us-texas-leon-county": "Leon",
+ "us-texas-liberty-county": "Freiheit",
+ "us-texas-limestone-county": "Kalkstein",
+ "us-texas-lipscomb-county": "Lipscomb",
+ "us-texas-live-oak-county": "Live Eiche",
+ "us-texas-llano-county": "Llano",
+ "us-texas-loving-county": "Liebend",
+ "us-texas-lubbock-county": "Lubbock",
+ "us-texas-lynn-county": "Luis",
+ "us-texas-madison-county": "Madison",
+ "us-texas-marion-county": "Marion",
+ "us-texas-martin-county": "Lucia",
+ "us-texas-mason-county": "Jürgen",
+ "us-texas-matagorda-county": "Matagorda",
+ "us-texas-maverick-county": "Maverick",
+ "us-texas-mcculloch-county": "McCulloch",
+ "us-texas-mclennan-county": "Lennan",
+ "us-texas-mcmullen-county": "McMullen",
+ "us-texas-medina-county": "Jörg",
+ "us-texas-menard-county": "Menard",
+ "us-texas-midland-county": "Mittelland",
+ "us-texas-milam-county": "Milam",
+ "us-texas-mills-county": "Mühlen",
+ "us-texas-mitchell-county": "Jörg",
+ "us-texas-montague-county": "Montague",
+ "us-texas-montgomery-county": "Montgomery",
+ "us-texas-moore-county": "Jörg",
+ "us-texas-morris-county": "Morris",
+ "us-texas-motley-county": "Jörg",
+ "us-texas-nacogdoches-county": "Nacogdoches",
+ "us-texas-navarro-county": "Navarro",
+ "us-texas-newton-county": "Newton",
+ "us-texas-nolan-county": "Nolanisch",
+ "us-texas-nueces-county": "Kerne",
+ "us-texas-ochiltree-county": "Ochiltree",
+ "us-texas-oldham-county": "Oldham",
+ "us-texas-orange-county": "Orange",
+ "us-texas-palo-pinto-county": "Palo Pinto",
+ "us-texas-panola-county": "Panola",
+ "us-texas-parker-county": "Jörg",
+ "us-texas-parmer-county": "Fritz",
+ "us-texas-pecos-county": "Pecos",
+ "us-texas-polk-county": "Polk",
+ "us-texas-potter-county": "Töpfer",
+ "us-texas-presidio-county": "Präsident",
+ "us-texas-rains-county": "Regen",
+ "us-texas-randall-county": "Jörg",
+ "us-texas-reagan-county": "Reagan",
+ "us-texas-real-county": "Echt",
+ "us-texas-red-river-county": "Roter Fluss",
+ "us-texas-reeves-county": "Reeves",
+ "us-texas-refugio-county": "Refugio",
+ "us-texas-roberts-county": "Roberts",
+ "us-texas-robertson-county": "Robertson",
+ "us-texas-rockwall-county": "Steinmauer",
+ "us-texas-runnels-county": "Runnels",
+ "us-texas-rusk-county": "Rusk",
+ "us-texas-sabine-county": "Sabine",
+ "us-texas-san-augustine-county": "San Augustine",
+ "us-texas-san-jacinto-county": "San Jacinto",
+ "us-texas-san-patricio-county": "San Patricio",
+ "us-texas-san-saba-county": "San Saba",
+ "us-texas-schleicher-county": "Schleicher",
+ "us-texas-scurry-county": "Scurry",
+ "us-texas-shackelford-county": "Shackelford",
+ "us-texas-shelby-county": "Shelby",
+ "us-texas-sherman-county": "Schermann",
+ "us-texas-smith-county": "Schmied",
+ "us-texas-somervell-county": "Somervell",
+ "us-texas-starr-county": "Starr",
+ "us-texas-stephens-county": "Stephan",
+ "us-texas-sterling-county": "Sterling",
+ "us-texas-stonewall-county": "Steinwand",
+ "us-texas-sutton-county": "Sutton",
+ "us-texas-swisher-county": "Schwader",
+ "us-texas-tarrant-county": "Tarrank",
+ "us-texas-taylor-county": "Jörg",
+ "us-texas-terrell-county": "Terrell",
+ "us-texas-terry-county": "Terry",
+ "us-texas-throckmorton-county": "Throckmorton",
+ "us-texas-titus-county": "Titus",
+ "us-texas-tom-green-county": "Tom Green",
+ "us-texas-travis-county": "Travis",
+ "us-texas-trinity-county": "Dreizack",
+ "us-texas-tyler-county": "Tyler",
+ "us-texas-upshur-county": "Upshur",
+ "us-texas-upton-county": "Ochsen",
+ "us-texas-uvalde-county": "Evelyn",
+ "us-texas-val-verde-county": "Val Verde",
+ "us-texas-van-zandt-county": "Van Zandt",
+ "us-texas-victoria-county": "Viktor",
+ "us-texas-walker-county": "Wanderer",
+ "us-texas-waller-county": "Waller",
+ "us-texas-ward-county": "Warte",
+ "us-texas-washington-county": "Arthur",
+ "us-texas-webb-county": "Webb",
+ "us-texas-wharton-county": "Wharton",
+ "us-texas-wheeler-county": "Rad",
+ "us-texas-wichita-county": "Hannah",
+ "us-texas-wilbarger-county": "Wilbarger",
+ "us-texas-willacy-county": "Willenskraft",
+ "us-texas-williamson-county": "Martha",
+ "us-texas-wilson-county": "Wilhelm",
+ "us-texas-winkler-county": "Winkler",
+ "us-texas-wise-county": "Weisheit",
+ "us-texas-wood-county": "Holz",
+ "us-texas-yoakum-county": "Yoakum",
+ "us-texas-young-county": "Jung",
+ "us-texas-zapata-county": "Zapata",
+ "us-texas-zavala-county": "Zavala",
+ "us-utah": "Utah",
+ "us-utah-beaver-county": "Biber",
+ "us-utah-box-elder-county": "Box Älter",
+ "us-utah-cache-county": "Cache",
+ "us-utah-carbon-county": "Kohlenstoff",
+ "us-utah-daggett-county": "Daggett",
+ "us-utah-davis-county": "Dennis",
+ "us-utah-duchesne-county": "Duchesne",
+ "us-utah-emery-county": "Jörg",
+ "us-utah-garfield-county": "Gerhard",
+ "us-utah-grand-county": "Groß",
+ "us-utah-iron-county": "Eisen",
+ "us-utah-juab-county": "Juab",
+ "us-utah-kane-county": "Kane",
+ "us-utah-millard-county": "Jürgen",
+ "us-utah-morgan-county": "Morgan",
+ "us-utah-piute-county": "Piute",
+ "us-utah-rich-county": "Reiche",
+ "us-utah-salt-lake-county": "Salzsee",
+ "us-utah-san-juan-county": "San Juan",
+ "us-utah-sanpete-county": "Sanpete",
+ "us-utah-sevier-county": "Sevier",
+ "us-utah-summit-county": "Gipfel",
+ "us-utah-tooele-county": "Tooele",
+ "us-utah-uintah-county": "Uintah",
+ "us-utah-utah-county": "Utah",
+ "us-utah-wasatch-county": "Wasatch",
+ "us-utah-washington-county": "Arthur",
+ "us-utah-wayne-county": "Wayne",
+ "us-utah-weber-county": "Weber",
+ "us-vermont": "Vermont",
+ "us-vermont-addison-county": "Adolf",
+ "us-vermont-bennington-county": "Bennington",
+ "us-vermont-caledonia-county": "Caledonia",
+ "us-vermont-chittenden-county": "Chittenden",
+ "us-vermont-essex-county": "Elizabeth",
+ "us-vermont-franklin-county": "Franklin",
+ "us-vermont-grand-isle-county": "Große Insel",
+ "us-vermont-lamoille-county": "Lamoille",
+ "us-vermont-orange-county": "Orange",
+ "us-vermont-orleans-county": "Orleans",
+ "us-vermont-rutland-county": "Rutland",
+ "us-vermont-washington-county": "Arthur",
+ "us-vermont-windham-county": "Werner",
+ "us-vermont-windsor-county": "Windsor",
+ "us-virginia": "Virginia",
+ "us-virginia-accomack-county": "Akcomack",
+ "us-virginia-albemarle-county": "Albemarle",
+ "us-virginia-alexandria-city": "Alexandria",
+ "us-virginia-alleghany-county": "Alleghany",
+ "us-virginia-amelia-county": "Amelia",
+ "us-virginia-amherst-county": "Amherst",
+ "us-virginia-appomattox-county": "Appomattox",
+ "us-virginia-arlington-county": "Arlene",
+ "us-virginia-augusta-county": "Augusta",
+ "us-virginia-bath-county": "Bad",
+ "us-virginia-bedford-city": "Jörg",
+ "us-virginia-bedford-county": "Jörg",
+ "us-virginia-bland-county": "Bland",
+ "us-virginia-botetourt-county": "Botetourt",
+ "us-virginia-bristol-city": "Bristol",
+ "us-virginia-brunswick-county": "Brunswick,",
+ "us-virginia-buchanan-county": "Buchanisch",
+ "us-virginia-buckingham-county": "Buckingham",
+ "us-virginia-buena-vista-city": "Buena Vista",
+ "us-virginia-campbell-county": "Campbell",
+ "us-virginia-caroline-county": "Karlene",
+ "us-virginia-carroll-county": "Carlton",
+ "us-virginia-charles-city-county": "Karls Stadt",
+ "us-virginia-charlotte-county": "Charlotte",
+ "us-virginia-charlottesville-city": "Charlottesville",
+ "us-virginia-chesapeake-city": "Jürgen",
+ "us-virginia-chesterfield-county": "Chesterfield",
+ "us-virginia-clarke-county": "Jörg",
+ "us-virginia-colonial-heights-city": "Kolonialhöhen",
+ "us-virginia-covington-city": "Covington",
+ "us-virginia-craig-county": "Gerald",
+ "us-virginia-culpeper-county": "Kuppel",
+ "us-virginia-cumberland-county": "Cumberland",
+ "us-virginia-danville-city": "Danville",
+ "us-virginia-dickenson-county": "Dickenson",
+ "us-virginia-dinwiddie-county": "Dinwiddie",
+ "us-virginia-emporia-city": "Emporie",
+ "us-virginia-essex-county": "Elizabeth",
+ "us-virginia-fairfax-city": "Fairfax",
+ "us-virginia-fairfax-county": "Fairfax",
+ "us-virginia-falls-church-city": "Fallkirche",
+ "us-virginia-fauquier-county": "Fauquier",
+ "us-virginia-floyd-county": "Floyd",
+ "us-virginia-fluvanna-county": "Flüssigkeit",
+ "us-virginia-franklin-city": "Franklin",
+ "us-virginia-franklin-county": "Franklin",
+ "us-virginia-frederick-county": "Evelyn",
+ "us-virginia-fredericksburg-city": "Fredericksburg",
+ "us-virginia-galax-city": "Galax",
+ "us-virginia-giles-county": "Gordon",
+ "us-virginia-gloucester-county": "Gloucester",
+ "us-virginia-goochland-county": "Goochland",
+ "us-virginia-grayson-county": "Gabriel",
+ "us-virginia-greene-county": "Grün",
+ "us-virginia-greensville-county": "Greensville",
+ "us-virginia-halifax-county": "Halifax",
+ "us-virginia-hampton-city": "Hampton",
+ "us-virginia-hanover-county": "Hanover",
+ "us-virginia-harrisonburg-city": "Harrisonburg",
+ "us-virginia-henrico-county": "Henrico",
+ "us-virginia-henry-county": "Gabriel",
+ "us-virginia-highland-county": "Hochland",
+ "us-virginia-hopewell-city": "Hopewell",
+ "us-virginia-isle-of-wight-county": "Insel des Weges",
+ "us-virginia-james-city-county": "James City",
+ "us-virginia-king-and-queen-county": "König und Königin",
+ "us-virginia-king-george-county": "König George",
+ "us-virginia-king-william-county": "König Wilhelm",
+ "us-virginia-lancaster-county": "Lancaster",
+ "us-virginia-lee-county": "Lennon",
+ "us-virginia-lexington-city": "Lexington",
+ "us-virginia-loudoun-county": "Loudoun",
+ "us-virginia-louisa-county": "Lila",
+ "us-virginia-lunenburg-county": "Lunenburg",
+ "us-virginia-lynchburg-city": "Luchburg",
+ "us-virginia-madison-county": "Madison",
+ "us-virginia-manassas-city": "Manassas",
+ "us-virginia-manassas-park-city": "Manassas-Park",
+ "us-virginia-martinsville-city": "Martha",
+ "us-virginia-mathews-county": "Mathews",
+ "us-virginia-mecklenburg-county": "Mecklenburg",
+ "us-virginia-middlesex-county": "Middlesex",
+ "us-virginia-montgomery-county": "Montgomery",
+ "us-virginia-nelson-county": "Nelson",
+ "us-virginia-new-kent-county": "Neuer Kent",
+ "us-virginia-newport-news-city": "Newport News",
+ "us-virginia-norfolk-city": "Norfolk",
+ "us-virginia-northampton-county": "Nordenampton",
+ "us-virginia-northumberland-county": "Northumberland",
+ "us-virginia-norton-city": "Martha",
+ "us-virginia-nottoway-county": "Notweg",
+ "us-virginia-orange-county": "Orange",
+ "us-virginia-page-county": "Seite",
+ "us-virginia-patrick-county": "Jörg",
+ "us-virginia-petersburg-city": "Petersburg",
+ "us-virginia-pittsylvania-county": "Pittsylvanie",
+ "us-virginia-poquoson-city": "Poquoson",
+ "us-virginia-portsmouth-city": "Portsmouth",
+ "us-virginia-powhatan-county": "Powhatan",
+ "us-virginia-prince-edward-county": "Prinz Edward",
+ "us-virginia-prince-george-county": "Prinz George",
+ "us-virginia-prince-william-county": "Prinz Wilhelm",
+ "us-virginia-pulaski-county": "Pulaski",
+ "us-virginia-radford-city": "Radford",
+ "us-virginia-rappahannock-county": "Rappahannock",
+ "us-virginia-richmond-city": "Rachel",
+ "us-virginia-richmond-county": "Rachel",
+ "us-virginia-roanoke-city": "Roanoke",
+ "us-virginia-roanoke-county": "Roanoke",
+ "us-virginia-rockbridge-county": "Steinbrücke",
+ "us-virginia-rockingham-county": "Rosenberg",
+ "us-virginia-russell-county": "Russell",
+ "us-virginia-salem-city": "Salem",
+ "us-virginia-scott-county": "Jörg",
+ "us-virginia-shenandoah-county": "Shenandoah",
+ "us-virginia-smyth-county": "Smyth",
+ "us-virginia-southampton-county": "Südampton",
+ "us-virginia-spotsylvania-county": "Spotsylvanie",
+ "us-virginia-stafford-county": "Stopp",
+ "us-virginia-staunton-city": "Staunton",
+ "us-virginia-suffolk-city": "Suffolk",
+ "us-virginia-surry-county": "Trauer",
+ "us-virginia-sussex-county": "Sussex",
+ "us-virginia-tazewell-county": "Tazewell",
+ "us-virginia-virginia-beach-city": "Virginia Strand",
+ "us-virginia-warren-county": "Warren",
+ "us-virginia-washington-county": "Arthur",
+ "us-virginia-waynesboro-city": "Waynesboro",
+ "us-virginia-westmoreland-county": "Westmorland",
+ "us-virginia-williamsburg-city": "Wilhelm",
+ "us-virginia-winchester-city": "Winchester",
+ "us-virginia-wise-county": "Weisheit",
+ "us-virginia-wythe-county": "Wythe",
+ "us-virginia-york-county": "Jennifer",
+ "us-washington": "Arthur",
+ "us-washington-adams-county": "Jörg",
+ "us-washington-asotin-county": "Asotin",
+ "us-washington-benton-county": "Benton",
+ "us-washington-chelan-county": "Gabriel",
+ "us-washington-clallam-county": "Clallam",
+ "us-washington-clark-county": "Jörg",
+ "us-washington-columbia-county": "Kolumbien",
+ "us-washington-cowlitz-county": "Kowlitz",
+ "us-washington-douglas-county": "Douglas",
+ "us-washington-ferry-county": "Fähre",
+ "us-washington-franklin-county": "Franklin",
+ "us-washington-garfield-county": "Gerhard",
+ "us-washington-grant-county": "Zuschuss",
+ "us-washington-grays-harbor-county": "Grauer Hafen",
+ "us-washington-island-county": "Insel",
+ "us-washington-jefferson-county": "Jefferson",
+ "us-washington-king-county": "König",
+ "us-washington-kitsap-county": "Kitsap",
+ "us-washington-kittitas-county": "Kittitas",
+ "us-washington-klickitat-county": "Klickitat",
+ "us-washington-lewis-county": "Lewis",
+ "us-washington-lincoln-county": "Lincoln",
+ "us-washington-mason-county": "Jürgen",
+ "us-washington-okanogan-county": "Okanogan",
+ "us-washington-pacific-county": "Pazifik",
+ "us-washington-pend-oreille-county": "Pend Oreille",
+ "us-washington-pierce-county": "Jörg",
+ "us-washington-san-juan-county": "San Juan",
+ "us-washington-skagit-county": "Skagit",
+ "us-washington-skamania-county": "Skamanien",
+ "us-washington-snohomish-county": "Snohomisch",
+ "us-washington-spokane-county": "Spokane",
+ "us-washington-stevens-county": "Stevens",
+ "us-washington-thurston-county": "Thüringen",
+ "us-washington-wahkiakum-county": "Wahkiakum",
+ "us-washington-walla-walla-county": "Walla Walla",
+ "us-washington-whatcom-county": "Whatcom",
+ "us-washington-whitman-county": "Weißer Mann",
+ "us-washington-yakima-county": "Yakima",
+ "us-west-virginia": "WestVirginia",
+ "us-west-virginia-barbour-county": "Barbier",
+ "us-west-virginia-berkeley-county": "Bernd",
+ "us-west-virginia-boone-county": "Boone",
+ "us-west-virginia-braxton-county": "Braxton",
+ "us-west-virginia-brooke-county": "Jörg",
+ "us-west-virginia-cabell-county": "Cabell",
+ "us-west-virginia-calhoun-county": "Calhoun",
+ "us-west-virginia-clay-county": "Lehm",
+ "us-west-virginia-doddridge-county": "Doddridge",
+ "us-west-virginia-fayette-county": "Jörg",
+ "us-west-virginia-gilmer-county": "Günther",
+ "us-west-virginia-grant-county": "Zuschuss",
+ "us-west-virginia-greenbrier-county": "Greenbrier",
+ "us-west-virginia-hampshire-county": "Hampshire",
+ "us-west-virginia-hancock-county": "Hancock",
+ "us-west-virginia-hardy-county": "Hardy",
+ "us-west-virginia-harrison-county": "Harrison",
+ "us-west-virginia-jackson-county": "Jennifer",
+ "us-west-virginia-jefferson-county": "Jefferson",
+ "us-west-virginia-kanawha-county": "Kanawha",
+ "us-west-virginia-lewis-county": "Lewis",
+ "us-west-virginia-lincoln-county": "Lincoln",
+ "us-west-virginia-logan-county": "Logan",
+ "us-west-virginia-marion-county": "Marion",
+ "us-west-virginia-marshall-county": "Martha",
+ "us-west-virginia-mason-county": "Jürgen",
+ "us-west-virginia-mcdowell-county": "Jenny",
+ "us-west-virginia-mercer-county": "Mercer",
+ "us-west-virginia-mineral-county": "Mineral",
+ "us-west-virginia-mingo-county": "Mingo",
+ "us-west-virginia-monongalia-county": "Monongalia",
+ "us-west-virginia-monroe-county": "Monroe",
+ "us-west-virginia-morgan-county": "Morgan",
+ "us-west-virginia-nicholas-county": "Nikolaus",
+ "us-west-virginia-ohio-county": "Ohio",
+ "us-west-virginia-pendleton-county": "Pendleton",
+ "us-west-virginia-pleasants-county": "Angenehme",
+ "us-west-virginia-pocahontas-county": "Pocahontas",
+ "us-west-virginia-preston-county": "Gabriel",
+ "us-west-virginia-putnam-county": "Putnam",
+ "us-west-virginia-raleigh-county": "Raleigh",
+ "us-west-virginia-randolph-county": "Zufällig",
+ "us-west-virginia-ritchie-county": "Ritchie",
+ "us-west-virginia-roane-county": "Roane",
+ "us-west-virginia-summers-county": "Sommer",
+ "us-west-virginia-taylor-county": "Jörg",
+ "us-west-virginia-tucker-county": "Tucker",
+ "us-west-virginia-tyler-county": "Tyler",
+ "us-west-virginia-upshur-county": "Upshur",
+ "us-west-virginia-wayne-county": "Wayne",
+ "us-west-virginia-webster-county": "Webster",
+ "us-west-virginia-wetzel-county": "Wetzel",
+ "us-west-virginia-wirt-county": "Wirt",
+ "us-west-virginia-wood-county": "Holz",
+ "us-west-virginia-wyoming-county": "Wyoming",
+ "us-wisconsin": "Wisconsin",
+ "us-wisconsin-adams-county": "Jörg",
+ "us-wisconsin-ashland-county": "Eschland",
+ "us-wisconsin-barron-county": "Günter",
+ "us-wisconsin-bayfield-county": "Bayfield",
+ "us-wisconsin-brown-county": "Brauner",
+ "us-wisconsin-buffalo-county": "Buffalo",
+ "us-wisconsin-burnett-county": "Burnett",
+ "us-wisconsin-calumet-county": "Calumet",
+ "us-wisconsin-chippewa-county": "Chippewa",
+ "us-wisconsin-clark-county": "Jörg",
+ "us-wisconsin-columbia-county": "Kolumbien",
+ "us-wisconsin-crawford-county": "Werner",
+ "us-wisconsin-dane-county": "Dennis",
+ "us-wisconsin-dodge-county": "Ausweichen",
+ "us-wisconsin-door-county": "Tür",
+ "us-wisconsin-douglas-county": "Douglas",
+ "us-wisconsin-dunn-county": "Dunn",
+ "us-wisconsin-eau-claire-county": "Eau Claire",
+ "us-wisconsin-florence-county": "Florida",
+ "us-wisconsin-fond-du-lac-county": "Fond du Lac",
+ "us-wisconsin-forest-county": "Wald",
+ "us-wisconsin-grant-county": "Zuschuss",
+ "us-wisconsin-green-county": "Grün",
+ "us-wisconsin-green-lake-county": "Grüner See",
+ "us-wisconsin-iowa-county": "Iowa",
+ "us-wisconsin-iron-county": "Eisen",
+ "us-wisconsin-jackson-county": "Jennifer",
+ "us-wisconsin-jefferson-county": "Jefferson",
+ "us-wisconsin-juneau-county": "Lila",
+ "us-wisconsin-kenosha-county": "Kenoscha",
+ "us-wisconsin-kewaunee-county": "Kewaunee",
+ "us-wisconsin-la-crosse-county": "La Crosse",
+ "us-wisconsin-lafayette-county": "Lafayette",
+ "us-wisconsin-langlade-county": "Langlacht",
+ "us-wisconsin-lincoln-county": "Lincoln",
+ "us-wisconsin-manitowoc-county": "Manitowoc",
+ "us-wisconsin-marathon-county": "Marathon",
+ "us-wisconsin-marinette-county": "Margaret",
+ "us-wisconsin-marquette-county": "Marquette",
+ "us-wisconsin-menominee-county": "Menominee",
+ "us-wisconsin-milwaukee-county": "Milwaukee",
+ "us-wisconsin-monroe-county": "Monroe",
+ "us-wisconsin-oconto-county": "Oconto",
+ "us-wisconsin-oneida-county": "Elizabeth",
+ "us-wisconsin-outagamie-county": "Outagamie",
+ "us-wisconsin-ozaukee-county": "Ozaukee",
+ "us-wisconsin-pepin-county": "Pepin",
+ "us-wisconsin-pierce-county": "Jörg",
+ "us-wisconsin-polk-county": "Polk",
+ "us-wisconsin-portage-county": "Portage",
+ "us-wisconsin-price-county": "Preis",
+ "us-wisconsin-racine-county": "Racine",
+ "us-wisconsin-richland-county": "Urland",
+ "us-wisconsin-rock-county": "Felsen",
+ "us-wisconsin-rusk-county": "Rusk",
+ "us-wisconsin-sauk-county": "Saukisch",
+ "us-wisconsin-sawyer-county": "Säger",
+ "us-wisconsin-shawano-county": "Shawano",
+ "us-wisconsin-sheboygan-county": "Sheboygan",
+ "us-wisconsin-st-croix-county": "St. Croix",
+ "us-wisconsin-taylor-county": "Jörg",
+ "us-wisconsin-trempealeau-county": "Trempealeau",
+ "us-wisconsin-vernon-county": "Tila",
+ "us-wisconsin-vilas-county": "Vilas",
+ "us-wisconsin-walworth-county": "Walworth",
+ "us-wisconsin-washburn-county": "Waschbrennen",
+ "us-wisconsin-washington-county": "Arthur",
+ "us-wisconsin-waukesha-county": "Waukesha",
+ "us-wisconsin-waupaca-county": "Waupaca",
+ "us-wisconsin-waushara-county": "Waushara",
+ "us-wisconsin-winnebago-county": "Winnebago",
+ "us-wisconsin-wood-county": "Holz",
+ "us-wyoming": "Wyoming",
+ "us-wyoming-albany-county": "Albany",
+ "us-wyoming-big-horn-county": "Großes Horn",
+ "us-wyoming-campbell-county": "Campbell",
+ "us-wyoming-carbon-county": "Kohlenstoff",
+ "us-wyoming-converse-county": "Konversation",
+ "us-wyoming-crook-county": "Käfer",
+ "us-wyoming-fremont-county": "Günter",
+ "us-wyoming-goshen-county": "Hannah",
+ "us-wyoming-hot-springs-county": "Heiße Quellen",
+ "us-wyoming-johnson-county": "Jörg",
+ "us-wyoming-laramie-county": "Laramie",
+ "us-wyoming-lincoln-county": "Lincoln",
+ "us-wyoming-natrona-county": "Natrona",
+ "us-wyoming-niobrara-county": "Niobrara",
+ "us-wyoming-park-county": "Parken",
+ "us-wyoming-platte-county": "Platte",
+ "us-wyoming-sheridan-county": "Sheridan",
+ "us-wyoming-sublette-county": "Tila",
+ "us-wyoming-sweetwater-county": "Süßwasser",
+ "us-wyoming-teton-county": "Teton",
+ "us-wyoming-uinta-county": "Uinta",
+ "us-wyoming-washakie-county": "Washakie",
+ "us-wyoming-weston-county": "Hannah",
+ "type-city_one": "stadt",
+ "type-city_other": "städte",
+ "type-county_one": "bezirk",
+ "type-county_other": "Bezirke",
+ "type-district_one": "bezirk",
+ "type-district_other": "Bezirke",
+ "type-outlying-area_one": "abgelegenes Gebiet",
+ "type-outlying-area_other": "abgelegene Gebiete",
+ "type-province_one": "Provinz",
+ "type-province_other": "provinzen",
+ "type-state_one": "status",
+ "type-state_other": "status",
+ "type-territory_one": "territorium",
+ "type-territory_other": "territorium"
+}
diff --git a/apps/app/public/locales/de-DE/landingPage.json b/apps/app/public/locales/de-DE/landingPage.json
new file mode 100644
index 0000000000..14fb6d741d
--- /dev/null
+++ b/apps/app/public/locales/de-DE/landingPage.json
@@ -0,0 +1,43 @@
+{
+ "banner": {
+ "redesign": "Lesen Sie mehr über den Start des InReach App-Redesigns in unserem Blog. Erfahre mehr."
+ },
+ "call-out": {
+ "hear-from-users": "Höre von unseren Benutzern",
+ "who-we-are": "Wen wir sind\nWir sind ein transgeführter Technologie-gemeinnütziger und zunehmender Ressourcenzugang für die vielfältige LGBTQ+-Community.\nErfahre mehr über uns."
+ },
+ "hero": {
+ "community": {
+ "0": "LGBTQ+ Asylbewerber",
+ "1": "LGBTQ+ Einwanderer",
+ "2": "LGBTQ+ Flüchtlinge",
+ "3": "LGBTQ+ Jugend",
+ "4": "die Transgender Gemeinschaft",
+ "5": "LGBTQ+ BIPOC Communities",
+ "6": "Betreuer von LGBTQ+ Jugendlichen"
+ },
+ "find-resources": "Finde verifizierte für mit InReach.",
+ "heading": "Finde LGBTQ+ Ressourcen.",
+ "privacy-disclaimer": "Ihre Antwort ist anonym und nicht mit Ihnen als Einzelnutzer verbunden. Lesen Sie unsere Datenschutzrichtlinie , um mehr zu erfahren.",
+ "services": {
+ "0": "medizinische Versorgung",
+ "1": "Community-Unterstützung",
+ "2": "psychische Gesundheitsfürsorge",
+ "3": "erziehung",
+ "4": "beschäftigung",
+ "5": "essen",
+ "6": "gehäuse",
+ "7": "kleidung",
+ "8": "rechtliche Hilfe",
+ "9": "übersetzen"
+ },
+ "subheading": "Willkommen auf der weltweit ersten Technologieplattform für TLGBQ+ (Transgender, Lesben, Schwulen, Bisexual, Queer und mehr Identitäten) Menschen, die mit Verfolgungen oder Diskriminierungen mit sicheren, überprüften Ressourcen konfrontiert sind."
+ },
+ "values": {
+ "free": "Kostenlos für immer 🔑\nUnsere Technologieplattform ist 100% kostenlos für alle, um sichere Hilfe zu gewährleisten, ist immer InReach.\nSpenden Sie uns, um unsere Plattform frei zu halten.",
+ "innovative": "Innovativ :funkeln:\nWir sind die weltweit erste Technologieplattform, die LGBTQ+ Menschen mit Verfolgung oder Diskriminierung mit Sicherheit begegnet unabhängig überprüfte Ressourcen.\nSehen Sie sich unseren Quellcode an und tragen Sie bei.",
+ "intersectional": "Intersektional✊🏿 :raised_fist_medium dark_skin_tone:✊🏽\nWir glauben, dass die Gleichheit von LGBTQ+ Trans Gerechtigkeit erfordert Flüchtlingsrecht, rassische Gerechtigkeit, reproduktive Gerechtigkeit, Sprachgerechtigkeit und vieles mehr.\nErfahre mehr über unseren Überprüfungsprozess.",
+ "our-values": "Unsere Werte",
+ "safety-first": "Safety-first 🔒\nWe know online anonymity can be a life-or-death issue for LGBTQ+ people. That's why our App is designed to protect users' confidentiality and safety online.\nLearn more about our privacy policy."
+ }
+}
diff --git a/apps/app/public/locales/de-DE/phone-type.json b/apps/app/public/locales/de-DE/phone-type.json
new file mode 100644
index 0000000000..8d18c803a3
--- /dev/null
+++ b/apps/app/public/locales/de-DE/phone-type.json
@@ -0,0 +1,7 @@
+{
+ "fax": "Fax",
+ "hotline": "Hotline",
+ "office": "Büro",
+ "sms": "SMS",
+ "whatsapp": "WhatsApp"
+}
diff --git a/apps/app/public/locales/de-DE/services.json b/apps/app/public/locales/de-DE/services.json
new file mode 100644
index 0000000000..8e6d6a3d6e
--- /dev/null
+++ b/apps/app/public/locales/de-DE/services.json
@@ -0,0 +1,140 @@
+{
+ "abortion-care": {
+ "CATEGORYNAME": "Abbruchpflege",
+ "abortion-providers": "Abtreibungsanbieter",
+ "financial-assistance": "Finanzhilfe",
+ "lodging-assistance": "Unterbringung Hilfe",
+ "mail-order-services": "Versandbestellungsdienste",
+ "mental-health-support": "Unterstützung für psychische Gesundheit",
+ "travel-assistance": "Reisehilfe"
+ },
+ "community-support": {
+ "CATEGORYNAME": "Community-Unterstützung",
+ "community-social-groups": "Gemeinschaftliche und soziale Gruppen",
+ "cultural-centers": "Kulturelle Zentren",
+ "lgbtq-centers": "LGBTQ-Center",
+ "reception-services": "Empfangsdienste",
+ "reentry-services": "Inhaftierungs- und Wiedereintragsdienste",
+ "spiritual-support": "Spirituelle Unterstützung",
+ "sponsors": "Förderung der Einwanderung"
+ },
+ "computers-and-internet": {
+ "CATEGORYNAME": "Computer und Internet",
+ "computers-and-internet": "Computer und Internet"
+ },
+ "crisis-support": {
+ "CATEGORYNAME": "Krisenunterstützung",
+ "crisis-support": "Krisenunterstützung"
+ },
+ "education-and-employment": {
+ "CATEGORYNAME": "Bildung und Beschäftigung",
+ "career-counseling": "Karriereberatung",
+ "educational-support-for-lgbtq-youth": "Bildungsunterstützung für LGBTQ-Jugendliche",
+ "english-classes": "Englischkurse",
+ "language-classes": "Sprachklassen",
+ "leadership-training-and-professional-development": "Führungspersonal und berufliche Entwicklung",
+ "libraries": "Bibliotheken",
+ "scholarships": "Stipendien"
+ },
+ "food": {
+ "CATEGORYNAME": "Nahrung",
+ "food": "Nahrung",
+ "food-assistance": "Nahrungsmittelhilfe"
+ },
+ "housing": {
+ "CATEGORYNAME": "Wohnraum",
+ "drop-in-centers-for-lgbtq-youth": "Drop-In-Zentren für LGBTQ-Jugendliche",
+ "emergency-housing": "Notfallgehäuse",
+ "housing-information-and-referrals": "Wohnungsinformationen und Empfehlungen",
+ "short-term-housing": "Kurzfristiges Gehäuse",
+ "trans-housing": "Trans Gehäuse"
+ },
+ "hygiene-and-clothing": {
+ "CATEGORYNAME": "Hygiene und Kleidung",
+ "clothes": "Kleidung",
+ "gender-affirming-items": "Genderbestätigungselemente",
+ "gender-neutral-bathrooms": "Geschlechtsneutrale Badezimmer",
+ "haircuts-and-stylists": "Frisuren und Stylisten",
+ "hygiene": "Hygiene"
+ },
+ "international-support": {
+ "CATEGORTYNAME": "Internationale Unterstützung",
+ "financial-assistance": "Finanzhilfe",
+ "mental-health": "Psychische Gesundheit",
+ "resettlement-assistance": "Neuansiedlungshilfe"
+ },
+ "legal": {
+ "CATEGORYNAME": "Rechtlich",
+ "asylum-application": "Asylantrag",
+ "citizenship": "Staatsbürgerschaft",
+ "crime-and-discrimination": "Kriminalität und Diskriminierung",
+ "deferred-action-for-childhood-arrivals-daca": "Aufgeschobene Aktion für Ankunft in der Kindheit (DACA)",
+ "deportation-or-removal": "Abschieben oder Entfernen",
+ "employment-authorization": "Arbeitsgenehmigung",
+ "family-petitions": "Familien-Petitionen",
+ "immigration-detention": "Inhaftierung der Einwanderung",
+ "legal-advice": "Rechtsberatung",
+ "legal-hotlines": "Rechtliche Hotlines",
+ "name-and-gender-change": "Name und Geschlechtsmarker ändern",
+ "refugee-claim": "Flüchtlingsbehauptung",
+ "residency": "Residenz",
+ "special-immigrant-juvenile-status-sijs": "Besonderer Jugendstatus für Einwanderer (SIJS)",
+ "t-visa": "T visa",
+ "u-visa": "U visa"
+ },
+ "mail": {
+ "CATEGORYNAME": "Mail",
+ "mail": "Mail"
+ },
+ "medical": {
+ "CATEGORYNAME": "Medizinisch",
+ "covid-19-services": "COVID-19 Dienste",
+ "dental-care": "Zahnpflege",
+ "hiv-and-sexual-health": "HIV und sexuelle Gesundheit",
+ "medical-clinics": "Kliniken",
+ "obgyn-services": "OBGYN Dienste",
+ "physical-evaluations-for-asylum-claim": "Körperliche Bewertungen des Asylantrags",
+ "physical-evaluations-for-refugee-claim": "Physikalische Bewertungen von Flüchtlingsangaben",
+ "trans-health": "Trans Gesundheit",
+ "trans-health-gender-affirming-surgery": "Trans Health - Gender affirming chirurgie",
+ "trans-health-hormone-and-surgery-letters": "Trans Health - Hormon und Chirurgie Briefe",
+ "trans-health-hormone-therapy": "Trans Health - Hormontherapie",
+ "trans-health-primary-care": "Trans Gesundheit - Primärversorgung",
+ "trans-health-speech-therapy": "Trans Health - Sprachtherapie",
+ "trans-health-youth-care": "Trans Health - Jugendbetreuung"
+ },
+ "mental-health": {
+ "CATEGORYNAME": "Psychische Gesundheit",
+ "bipoc-support-groups": "BIPOC Unterstützungsgruppen",
+ "hotlines": "Hotlines",
+ "private-therapy-and-counseling": "Private Therapie und Beratung",
+ "psychological-evaluations-for-asylum-claim": "Psychologische Bewertungen des Asylantrags",
+ "psychological-evaluations-for-refugee-claim": "Psychologische Bewertungen von Flüchtlingsangaben",
+ "substance-use": "Verwendung von Stoffen",
+ "support-for-caregivers-of-trans-youth": "Unterstützung für Pflegekräfte der Trans-Jugend",
+ "support-for-conversion-therapy-survivors": "Unterstützung für Überlebende der Konversionstherapie",
+ "support-groups": "Unterstützungsgruppen",
+ "trans-support-groups": "Trans-Unterstützungsgruppen"
+ },
+ "sports-and-entertainment": {
+ "CATEGORYNAME": "Unterhaltung und Aktivitäten",
+ "art-music-literature": "Kunst, Musik und Literatur",
+ "sports-and-entertainment": "Sport und Unterhaltung"
+ },
+ "trans-focused-services": {
+ "CATEGORYNAME": "Trans-fokussierte Dienste",
+ "transport-gacare": "Transport für geschlechtsspezifische Bekräftigung der Pflege",
+ "transport-relo-support": "Translokations-Unterstützung"
+ },
+ "translation-and-interpretation": {
+ "CATEGORYNAME": "Übersetzung und Übersetzung",
+ "for-healthcare": "Für die Gesundheitsversorgung",
+ "for-legal-services": "Für juristische Dienste",
+ "general-translation-and-interpretation": "Allgemeine Übersetzung und Übersetzung"
+ },
+ "transportation": {
+ "CATEGORYNAME": "Transport",
+ "transit-passes-and-discounts": "Transitkarten und Rabatte",
+ "transportation-assistance": "Transportunterstützung"
+ }
+}
diff --git a/apps/app/public/locales/de-DE/suggestOrg.json b/apps/app/public/locales/de-DE/suggestOrg.json
new file mode 100644
index 0000000000..14ac98b7c4
--- /dev/null
+++ b/apps/app/public/locales/de-DE/suggestOrg.json
@@ -0,0 +1,37 @@
+{
+ "body": {
+ "accept-country": "Bitte beachten Sie, dass wir derzeit nur Organisationen in den USA, Mexiko und Kanada akzeptieren können.",
+ "additional-info": "Zusätzliche Informationen",
+ "intro-text": "Vielen Dank für Ihr Interesse, zur InReach App beizutragen! Verwenden Sie dieses Formular, um eine Organisation vorzuschlagen (z. gemeinnützige Organisationen, gemeinnützige Organisationen, Gesundheitssysteme, private Praxis usw., sollten Ihrer Meinung nach einbezogen werden. Es ist in Ordnung, wenn Sie nicht alle Informationen im Formular haben - füllen Sie einfach das aus, was Sie wissen und wir tun den Rest! Wir freuen uns über Ihre Einreichung und danken Ihnen für Ihre Hilfe bei der Verbesserung des Zugangs zu sicheren, verifizierten Ressourcen für die vielfältige LGBTQ+-Community. Alle vorgeschlagenen Organisationen werden vor der Veröffentlichung auf InReach von ausgebildeten Freiwilligen überprüft.",
+ "required-info": "Erforderliche Informationen",
+ "subject-review": "Alle vorgeschlagenen Organisationen unterliegen der Überprüfung durch InReach vor der Veröffentlichung.",
+ "suggest-org": "Eine Organisation vorschlagen"
+ },
+ "form": {
+ "btn-community": "LGBTQ+ Community-Fokus(e) hinzufügen",
+ "btn-save-changes": "Änderungen speichern",
+ "btn-service": "Service Typ(en) hinzufügen",
+ "btn-submit": "Neue Organisation einreichen",
+ "community-focus": "Bietet diese Organisation Dienste(n) an, die sich auf bestimmte LGBTQ+-Gemeinschaften konzentrieren?",
+ "error-exists-active": "{{org}} ist bereits in InReach aufgelistet. Bitte verwenden Sie dieses Formular, um neue Organisationen vorzuschlagen.",
+ "error-exists-dismiss": "Klicken Sie hier, wenn dies eine andere Organisation ist.",
+ "error-exists-inactive": "{{org}} wurde bereits vorgeschlagen. Unser Team prüft immer noch Informationen oder diese Organisation erfüllt nicht alle Anforderungen.",
+ "org-address": "Adresse der Organisation",
+ "org-country": "In welchem Land befindet sich die Organisation?",
+ "org-name": "Name der Organisation",
+ "org-website": "Organisations-Webseite",
+ "placeholder-address": "Adresse eingeben...",
+ "placeholder-name": "Organisationsname eingeben...",
+ "placeholder-website": "URL eingeben...",
+ "service-types": "Welche Art von Dienst(en) bietet diese Organisation an?"
+ },
+ "modal": {
+ "community-sub": "Bietet diese Organisation Dienste(n) an, die sich auf bestimmte LGBTQ+-Gemeinschaften konzentrieren? Bitte wählen Sie alle Anwendungen.",
+ "community-title": "LGBTQ+ Community-Fokus(en)",
+ "dismiss": "Verwerfen",
+ "service-types-sub": "Welche Servicetyp(en) bietet diese Organisation an? Bitte wählen Sie alle diese Anwendungen.",
+ "service-types-title": "Service-Typen",
+ "thank-you": "Vielen Dank, dass Sie {{org}} eingereicht haben!",
+ "thank-you-sub": "Unser Team überprüft Ihre Einsendung, überprüft die Informationen und veröffentlicht die Organisation auf InReach, wenn sie unseren Kriterien entspricht."
+ }
+}
diff --git a/apps/app/public/locales/de-DE/user-title.json b/apps/app/public/locales/de-DE/user-title.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/apps/app/public/locales/de-DE/user-title.json
@@ -0,0 +1 @@
+{}
diff --git a/apps/app/public/locales/de-DE/user.json b/apps/app/public/locales/de-DE/user.json
new file mode 100644
index 0000000000..ac84144be8
--- /dev/null
+++ b/apps/app/public/locales/de-DE/user.json
@@ -0,0 +1,41 @@
+{
+ "eth-american-indiannative-americanindigenous-person": "Amerikanische Indianer/indigene Person",
+ "eth-asian": "Asiatisch",
+ "eth-biracialmultiracial": "Biracial/Multiracial",
+ "eth-black": "Schwarz",
+ "eth-latinoaxhispanic": "Latino/a/x/Hispanic",
+ "eth-middle-easternnorth-african": "Naher Osten/Nordafrika",
+ "eth-native-hawaiianpacific-islander": "Native Hawaiian/Pazifik-Insel",
+ "eth-other": "Andere",
+ "eth-prefer-not-to-say": "Nicht sagen",
+ "eth-south-asian": "Südasien",
+ "eth-white": "Weiß",
+ "identity-ally": "Jörg",
+ "identity-asexual": "Asexuell",
+ "identity-bisexual": "Bisexuell",
+ "identity-gay": "Schwul",
+ "identity-intersex": "Intersex",
+ "identity-lesbian": "Lesbian",
+ "identity-man": "Mann",
+ "identity-nonbinary": "Nicht binär",
+ "identity-pansexual": "Pansexual",
+ "identity-queer": "Queer",
+ "identity-questioning": "Frage",
+ "identity-straight": "Gerade",
+ "identity-transgender": "Transgender",
+ "identity-woman": "Frau",
+ "immigration-asylee": "Asyl (Asyl gewährt)",
+ "immigration-asylum-seeker": "Asylsuchender",
+ "immigration-dreamer": "Träumer (DACA-Empfänger)",
+ "immigration-immigrant": "Andere Einwanderer",
+ "immigration-none": "Ich identifiziere mich nicht als eines dieser",
+ "immigration-prefer-not-to-say": "Nicht sagen",
+ "immigration-refugee": "Flüchtlinge",
+ "type-dataadmin": "Datenadministrator",
+ "type-datamanager": "Datenmanager",
+ "type-individual": "Individuell",
+ "type-lcr": "Lokaler Community-Überprüfer",
+ "type-provider": "Dienstanbieter",
+ "type-sysadmin": "Systemadministrator",
+ "type-system": "Systembenutzer"
+}
diff --git a/apps/app/public/locales/ko/gov-dist.json b/apps/app/public/locales/ko/gov-dist.json
index 0ac635eb0b..3cd5890518 100644
--- a/apps/app/public/locales/ko/gov-dist.json
+++ b/apps/app/public/locales/ko/gov-dist.json
@@ -2018,7 +2018,7 @@
"us-new-york-oneida-county": "오나이다",
"us-new-york-onondaga-county": "오논다가",
"us-new-york-ontario-county": "온타리오",
- "us-new-york-orange-county": "주황색",
+ "us-new-york-orange-county": "오렌지",
"us-new-york-orleans-county": "올리언스",
"us-new-york-oswego-county": "오스위고",
"us-new-york-otsego-county": "옷세고",
@@ -2113,7 +2113,7 @@
"us-north-carolina-new-hanover-county": "뉴 해노버",
"us-north-carolina-northampton-county": "노샘프턴",
"us-north-carolina-onslow-county": "온슬로",
- "us-north-carolina-orange-county": "주황색",
+ "us-north-carolina-orange-county": "오렌지",
"us-north-carolina-pamlico-county": "팜리코",
"us-north-carolina-pasquotank-county": "패스쿼탱크",
"us-north-carolina-pender-county": "펜더",
diff --git a/apps/app/public/locales/ru/common.json b/apps/app/public/locales/ru/common.json
index 7ecf6a0e77..02e8e6e542 100644
--- a/apps/app/public/locales/ru/common.json
+++ b/apps/app/public/locales/ru/common.json
@@ -223,7 +223,7 @@
"InReach использует сервис Google Analytics для проведения анонимного анализа данных об использовании приложения (запросы пользователя и другие действия). Google Analytics соответствует требованиям GDPR о запрете сохранения персональных данных и анонимизации неперсональных данных. Действия пользователей на сайтах никогда не отслеживаются. ",
"InReach использует сервис Vercel Analytics для анализа показателей производительности сайта. Vercel Analytics предоставляет данные об использовании сайта без привязки к определенному IP-адресу пользователя. Запись данных производится анонимно, а сервис не сохраняет данные, позволяющие Vercel распознавать Вас на различных сайтах и браузерах. "
],
- "privacy-statement-foot": "Прочтите нашу полную политику конфиденциальности для получения дополнительной информации",
+ "privacy-statement-foot": "Ознакомьтесь с нашей политикой конфиденциальности для получения дополнительной информации",
"privacy-statement-head": ["🔒", "Конфиденциальность"],
"privatePractice": "Частная практика",
"profile": "Профиль",
@@ -299,17 +299,17 @@
"modal-body": [
"Какой тип учетной записи вы хотели бы создать?",
"\n\n\n\n",
- "Уже есть аккаунт?"
+ "У вас уже есть аккаунт?"
],
- "name-use-any": "Используйте любое имя, с которым вам удобно.",
+ "name-use-any": "Вы можете использовать любое имя, которое вам нравится.",
"name_alias": "Имя или псевдоним",
"name_full": "Полное имя",
- "placeholder-name_alias": "Введите имя или псевдонимы...",
+ "placeholder-name_alias": "Введите имя или псевдоним…",
"placeholder-name_full": "Введите полное имя...",
- "select-law-practice": "Где вы практикуете право?",
- "select-service-provider": "Где вы работаете или волонтеры?",
+ "select-law-practice": "Где вы занимаетесь юридической практикой?",
+ "select-service-provider": "Где вы работаете или являетесь волонтером?",
"specify-work-volunteer": "Пожалуйста, укажите, где вы работаете или являетесь волонтером",
- "success": "Вы зарегистрировали аккаунт!",
+ "success": "Вы успешно зарегистрировали аккаунт!",
"user-exists-body": "Этот адрес электронной почты уже зарегистрирован.",
"user-exists-header": "Возможно, у вас уже есть аккаунт.",
"verify-email": "Прежде чем вы сможете начать использование новой учетной запись, вам необходимо подтвердить адрес электронной почты. Проверьте свой email и нажмите на ссылку в полученном сообщении."
@@ -361,7 +361,7 @@
"thank-you": "Спасибо!",
"thank-you-message": "Информация, которую вы нам предоставили, помогает нам улучшить наш продукт."
},
- "take-action": "Действия",
+ "take-action": "Действовать",
"uncheck-all": "Снять все флажки",
"unclaimed": "Не подтверждено",
"user-avatar": "Аватар пользователя",
@@ -390,7 +390,7 @@
"delete": "Удалить",
"distance": "Расстояние",
"donate": "Пожертвовать",
- "email": "Почта",
+ "email": "Email",
"home": "Главная",
"hours": "Часы",
"location": "Местоположение",
@@ -412,7 +412,7 @@
"service-hours": "Время работы",
"settings": "Настройки",
"share": "Поделиться",
- "sign-up": "Регистрация",
+ "sign-up": "Зарегистрировать",
"skip": "Пропустить",
"support": "Поддержать",
"website": "Сайт",
diff --git a/apps/app/public/locales/ru/phone-type.json b/apps/app/public/locales/ru/phone-type.json
index ac3f4cfe21..f28ef03823 100644
--- a/apps/app/public/locales/ru/phone-type.json
+++ b/apps/app/public/locales/ru/phone-type.json
@@ -1,6 +1,6 @@
{
"fax": "Факс",
- "hotline": "Горячие линии",
+ "hotline": "Горячая линия",
"office": "Офис",
"sms": "СМС",
"whatsapp": "WhatsApp"
diff --git a/apps/app/public/locales/ru/services.json b/apps/app/public/locales/ru/services.json
index 94765201f9..4151c3464e 100644
--- a/apps/app/public/locales/ru/services.json
+++ b/apps/app/public/locales/ru/services.json
@@ -1,6 +1,6 @@
{
"abortion-care": {
- "CATEGORYNAME": "Аборт",
+ "CATEGORYNAME": "Прерывание беременности",
"abortion-providers": "Услуги по прерыванию беременности",
"financial-assistance": "Финансовая помощь",
"lodging-assistance": "Помощь в аренде жилья",
@@ -73,7 +73,7 @@
"employment-authorization": "Разрешение на работу",
"family-petitions": "Семейные петиции",
"immigration-detention": "Задержание иммигрантов",
- "legal-advice": "Юридические консультации",
+ "legal-advice": "Юридическая помощь",
"legal-hotlines": "Горячие линии по юридическим вопросам",
"name-and-gender-change": "Изменение имени и пола",
"refugee-claim": "Статус беженца",
@@ -87,7 +87,7 @@
"mail": "Почта"
},
"medical": {
- "CATEGORYNAME": "Медицинский",
+ "CATEGORYNAME": "Медицинские услуги",
"covid-19-services": "Услуги по вопросам COVID-19",
"dental-care": "Стоматологическая помощь",
"hiv-and-sexual-health": "ВИЧ-инфекции и сексуальное здоровье",
@@ -127,7 +127,7 @@
"transport-relo-support": "Помощь в переезде"
},
"translation-and-interpretation": {
- "CATEGORYNAME": "Перевод и перевод",
+ "CATEGORYNAME": "Устный и письменный перевод",
"for-healthcare": "По медицинским вопросам",
"for-legal-services": "По юридическим вопросам",
"general-translation-and-interpretation": "Устный и письменный перевод"
diff --git a/apps/app/src/pages/org/[slug]/index.tsx b/apps/app/src/pages/org/[slug]/index.tsx
index 71e7d57963..c3e35d82de 100644
--- a/apps/app/src/pages/org/[slug]/index.tsx
+++ b/apps/app/src/pages/org/[slug]/index.tsx
@@ -280,7 +280,7 @@ export const getStaticProps = async ({
}
const orgId = await ssg.organization.getIdFromSlug.fetch({ slug })
- // if (!orgId) return { notFound: true, props: {} }
+ if (!orgId) return { notFound: true }
const [i18n] = await Promise.allSettled([
orgId
diff --git a/apps/app/src/pages/search/intl/[country].tsx b/apps/app/src/pages/search/intl/[country].tsx
index a46bb21b6e..76c52cc163 100644
--- a/apps/app/src/pages/search/intl/[country].tsx
+++ b/apps/app/src/pages/search/intl/[country].tsx
@@ -89,15 +89,12 @@ const OutsideServiceArea = () => {
}
}, [router.isReady, router.isFallback, loading])
- const { data: countryInfo } = api.misc.getCountryTranslation.useQuery(
- { cca2: router.query.country ?? '' },
- { enabled: notBlank(router.query.country) }
- )
const { data } = api.organization.getIntlCrisis.useQuery(
{ cca2: router.query.country ?? '' },
{ enabled: notBlank(router.query.country), onSuccess: () => setLoading(false) }
)
- const { t } = useTranslation(['services', 'common', 'attribute', 'country'])
+ const { t } = useTranslation(['services', 'common', 'attribute'])
+ const countryTranslate = new Intl.DisplayNames(router.locale, { type: 'region' })
const resultCount = 0
@@ -138,7 +135,7 @@ const OutsideServiceArea = () => {
{t('common:crisis-support.outside-service-area', {
- country: `$t(country:${countryInfo?.tsKey})`,
+ country: countryTranslate.of(router.query.country ?? ''),
})}
@@ -171,8 +168,7 @@ export const getStaticProps = async ({
const ssg = await trpcServerClient({ session: null })
const [i18n] = await Promise.allSettled([
- getServerSideTranslations(locale, ['services', 'common', 'attribute', 'country']),
- ssg.misc.getCountryTranslation.prefetch({ cca2: parsedQuery.data.country }),
+ getServerSideTranslations(locale, ['services', 'common', 'attribute']),
ssg.organization.getIntlCrisis.prefetch({ cca2: parsedQuery.data.country }),
])
const props = {
diff --git a/apps/app/src/utils/api.ts b/apps/app/src/utils/api.ts
index 73f8b152be..4e1125489f 100644
--- a/apps/app/src/utils/api.ts
+++ b/apps/app/src/utils/api.ts
@@ -7,8 +7,8 @@ import { type inferRouterInputs, type inferRouterOutputs } from '@trpc/server'
import { devtoolsLink } from 'trpc-client-devtools-link'
import { type AppRouter } from '@weareinreach/api'
-import { transformer } from '@weareinreach/api/lib/transformer'
import { getEnv } from '@weareinreach/env'
+import { transformer } from '@weareinreach/util/transformer'
// import { createLoggerInstance } from '@weareinreach/util/logger'
// const log = createLoggerInstance('tRPC')
diff --git a/apps/web/package.json b/apps/web/package.json
index 4f71f0e937..4d7969ae5d 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -28,21 +28,21 @@
"@weareinreach/ui": "workspace:*",
"dayjs": "1.11.10",
"embla-carousel-react": "7.1.0",
- "i18next": "23.7.6",
- "next": "14.0.2",
+ "i18next": "23.7.7",
+ "next": "14.0.3",
"react": "18.2.0",
"react-dom": "18.2.0",
- "react-i18next": "13.4.1"
+ "react-i18next": "13.5.0"
},
"devDependencies": {
- "@next/bundle-analyzer": "14.0.2",
- "@types/eslint": "8.44.7",
- "@types/node": "18.18.9",
- "@types/react": "18.2.37",
- "@types/react-dom": "18.2.15",
+ "@next/bundle-analyzer": "14.0.3",
+ "@types/eslint": "8.44.8",
+ "@types/node": "20.10.3",
+ "@types/react": "18.2.42",
+ "@types/react-dom": "18.2.17",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
- "eslint": "8.53.0",
- "typescript": "5.2.2"
+ "eslint": "8.55.0",
+ "typescript": "5.3.2"
}
}
diff --git a/crowdin.yml b/crowdin.yml
index 556672d445..f9501ed4df 100644
--- a/crowdin.yml
+++ b/crowdin.yml
@@ -20,4 +20,5 @@ pull_request_labels:
- translations
- "kodiak: merge.method = 'squash'"
- automerge
+
pull_request_title: 'chore(i18n): Updated translations from Crowdin'
diff --git a/lambdas/cognito-messaging/package.json b/lambdas/cognito-messaging/package.json
index b58836587b..748e238df9 100644
--- a/lambdas/cognito-messaging/package.json
+++ b/lambdas/cognito-messaging/package.json
@@ -20,18 +20,18 @@
"package": "cd dist && zip -r ../bundle.zip *"
},
"dependencies": {
- "@aws-lambda-powertools/logger": "1.15.0"
+ "@aws-lambda-powertools/logger": "1.17.0"
},
"devDependencies": {
- "@types/aws-lambda": "8.10.126",
- "@types/eslint": "8.44.7",
- "@types/node": "18.18.9",
+ "@types/aws-lambda": "8.10.130",
+ "@types/eslint": "8.44.8",
+ "@types/node": "20.10.3",
"@vercel/ncc": "0.38.1",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
"aws-lambda": "1.0.7",
- "eslint": "8.53.0",
+ "eslint": "8.55.0",
"prettier": "3.1.0",
- "typescript": "5.2.2"
+ "typescript": "5.3.2"
}
}
diff --git a/lambdas/cognito-user-migrate/package.json b/lambdas/cognito-user-migrate/package.json
index 792046ec74..bee666abff 100644
--- a/lambdas/cognito-user-migrate/package.json
+++ b/lambdas/cognito-user-migrate/package.json
@@ -21,21 +21,21 @@
"prune-clients": "find ./dist/client -type f -not -name '*rhel*' -delete -print"
},
"dependencies": {
- "@aws-lambda-powertools/logger": "1.15.0",
+ "@aws-lambda-powertools/logger": "1.17.0",
"@prisma/client": "5.6.0",
"@weareinreach/db": "workspace:*"
},
"devDependencies": {
- "@types/aws-lambda": "8.10.126",
- "@types/eslint": "8.44.7",
- "@types/node": "18.18.9",
+ "@types/aws-lambda": "8.10.130",
+ "@types/eslint": "8.44.8",
+ "@types/node": "20.10.3",
"@vercel/ncc": "0.38.1",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
"aws-lambda": "1.0.7",
- "eslint": "8.53.0",
+ "eslint": "8.55.0",
"prettier": "3.1.0",
"prisma": "5.6.0",
- "typescript": "5.2.2"
+ "typescript": "5.3.2"
}
}
diff --git a/package.json b/package.json
index 4f847c9f29..2c3f2583aa 100644
--- a/package.json
+++ b/package.json
@@ -36,30 +36,30 @@
"types:sync": "typesync"
},
"devDependencies": {
- "@changesets/cli": "2.26.2",
+ "@changesets/cli": "2.27.1",
"@turbo/gen": "1.10.16",
"@types/lint-staged": "13.2.2",
- "@types/node": "18.18.9",
+ "@types/node": "20.10.3",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
"boxen": "7.1.1",
"dotenv": "16.3.1",
"husky": "8.0.3",
- "knip": "2.41.2",
- "lint-staged": "15.1.0",
+ "knip": "3.5.0",
+ "lint-staged": "15.2.0",
"prettier": "3.1.0",
"prettier-plugin-jsdoc": "1.1.1",
- "prettier-plugin-packagejson": "2.4.6",
+ "prettier-plugin-packagejson": "2.4.7",
"prettier-plugin-prisma": "5.0.0",
- "sherif": "0.5.0",
- "tsx": "4.1.2",
+ "sherif": "0.6.1",
+ "tsx": "4.6.2",
"turbo": "1.10.16",
- "typescript": "5.2.2",
+ "typescript": "5.3.2",
"typesync": "0.11.1"
},
- "packageManager": "pnpm@8.10.5",
+ "packageManager": "pnpm@8.11.0",
"engines": {
- "node": "^18.17.0",
+ "node": "^20.0.0",
"pnpm": "^8.10.5"
},
"nextBundleAnalysis": {
@@ -102,9 +102,6 @@
},
"peerDependencyRules": {
"allowedVersions": {
- "@storybook/components": "7",
- "@storybook/core-events": "7",
- "@storybook/theming": "7",
"babel-loader": "9",
"i18next-browser-languagedetector": "7",
"i18next-http-backend": "2",
diff --git a/packages/analytics/package.json b/packages/analytics/package.json
index 9a179c2dbd..1b2b8ef78e 100644
--- a/packages/analytics/package.json
+++ b/packages/analytics/package.json
@@ -19,12 +19,12 @@
"@types/gtag.js": "0.0.18",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "workspace:*",
- "next": "14.0.2",
+ "next": "14.0.3",
"nextjs-google-analytics": "2.3.3",
- "type-fest": "4.7.1"
+ "type-fest": "4.8.3"
},
"peerDependencies": {
- "next": "14.0.2",
+ "next": "14.0.3",
"nextjs-google-analytics": "2.3.3"
}
}
diff --git a/packages/api/lib/index.ts b/packages/api/lib/index.ts
index 6fe9744a62..c47ecf7a99 100644
--- a/packages/api/lib/index.ts
+++ b/packages/api/lib/index.ts
@@ -9,6 +9,5 @@ export * from './milliseconds'
export * from './nanoIdUrl'
export * from './permissions'
export * from './prismaErrorCodes'
-export * from './transformer'
export * from './trpc'
// codegen:end
diff --git a/packages/api/lib/initTRPC.ts b/packages/api/lib/initTRPC.ts
index 85cff4a388..6be4422742 100644
--- a/packages/api/lib/initTRPC.ts
+++ b/packages/api/lib/initTRPC.ts
@@ -1,9 +1,9 @@
import { initTRPC } from '@trpc/server'
-import superjson from 'superjson'
import { type TRPCPanelMeta } from 'trpc-panel'
import { ZodError } from 'zod'
import { type Permission } from '@weareinreach/db/generated/permission'
+import { transformer } from '@weareinreach/util/transformer'
import { type Context } from './context'
@@ -15,7 +15,7 @@ export const t = initTRPC
.context()
.meta()
.create({
- transformer: superjson,
+ transformer,
errorFormatter({ shape, error }) {
return {
...shape,
diff --git a/packages/api/lib/transformer.ts b/packages/api/lib/transformer.ts
deleted file mode 100644
index b22115c954..0000000000
--- a/packages/api/lib/transformer.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import superjson from 'superjson'
-
-export { type SuperJSONResult } from 'superjson/dist/types'
-export const transformer = superjson
diff --git a/packages/api/package.json b/packages/api/package.json
index 7238dc432a..70d74b1c4b 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -17,13 +17,13 @@
"dependencies": {
"@googlemaps/google-maps-services-js": "3.3.41",
"@opentelemetry/api": "1.7.0",
- "@sentry/nextjs": "7.80.1",
+ "@sentry/nextjs": "7.85.0",
"@tanstack/react-query": "4.36.1",
"@terraformer/wkt": "2.2.0",
- "@trpc/client": "10.43.2",
- "@trpc/next": "10.43.2",
- "@trpc/react-query": "10.43.2",
- "@trpc/server": "10.43.2",
+ "@trpc/client": "10.44.1",
+ "@trpc/next": "10.44.1",
+ "@trpc/react-query": "10.44.1",
+ "@trpc/server": "10.44.1",
"@vercel/edge-config": "0.4.1",
"@vercel/kv": "1.0.0",
"@weareinreach/auth": "workspace:*",
@@ -36,35 +36,35 @@
"geolib": "3.3.4",
"just-compact": "3.2.0",
"just-flush": "2.3.0",
+ "just-group-by": "2.2.0",
"just-map-values": "3.2.0",
"just-omit": "2.2.0",
"just-pick": "4.2.0",
"luxon": "3.4.4",
- "nanoid": "5.0.3",
+ "nanoid": "5.0.4",
"slugify": "1.6.6",
- "superjson": "2.2.1",
"tiny-invariant": "1.3.1",
"zod": "3.22.4"
},
"devDependencies": {
"@turbo/gen": "1.10.16",
- "@types/eslint": "8.44.7",
- "@types/google.maps": "3.54.7",
- "@types/luxon": "3.3.4",
- "@types/node": "18.18.9",
+ "@types/eslint": "8.44.8",
+ "@types/google.maps": "3.54.10",
+ "@types/luxon": "3.3.7",
+ "@types/node": "20.10.3",
"@types/terraformer__wkt": "2.0.2",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
"dotenv-cli": "7.3.0",
- "eslint": "8.53.0",
+ "eslint": "8.55.0",
"inquirer-search-list": "1.2.6",
"just-pascal-case": "3.2.0",
- "next": "14.0.2",
+ "next": "14.0.3",
"prettier": "3.1.0",
"trpc-client-devtools-link": "0.2.1-next",
"trpc-panel": "1.3.4",
- "type-fest": "4.7.1",
- "typescript": "5.2.2"
+ "type-fest": "4.8.3",
+ "typescript": "5.3.2"
},
"peerDependencies": {
"next": ">=13"
diff --git a/packages/api/router/organization/query.getAlerts.handler.ts b/packages/api/router/organization/query.getAlerts.handler.ts
index 20ed12bec5..a0ef87279f 100644
--- a/packages/api/router/organization/query.getAlerts.handler.ts
+++ b/packages/api/router/organization/query.getAlerts.handler.ts
@@ -19,6 +19,7 @@ export const getAlerts = async ({ input }: TRPCHandlerParams)
select: {
supplement: {
select: { text: { select: { tsKey: { select: { key: true, ns: true, text: true } } } } },
+ where: { active: true },
},
attribute: { select: { tag: true, icon: true } },
},
diff --git a/packages/api/router/organization/query.getIntlCrisis.handler.ts b/packages/api/router/organization/query.getIntlCrisis.handler.ts
index 034d28c96d..d580dda260 100644
--- a/packages/api/router/organization/query.getIntlCrisis.handler.ts
+++ b/packages/api/router/organization/query.getIntlCrisis.handler.ts
@@ -1,8 +1,7 @@
-import superjson from 'superjson'
-import { type SuperJSONResult } from 'superjson/dist/types'
import { z } from 'zod'
import { prisma } from '@weareinreach/db'
+import { superjson, type SuperJSONResult } from '@weareinreach/util/transformer'
import { type TRPCHandlerParams } from '~api/types/handler'
import { type TGetIntlCrisisSchema } from './query.getIntlCrisis.schema'
diff --git a/packages/api/router/organization/query.getNatlCrisis.handler.ts b/packages/api/router/organization/query.getNatlCrisis.handler.ts
index 0fb2811a6a..0a88edf54a 100644
--- a/packages/api/router/organization/query.getNatlCrisis.handler.ts
+++ b/packages/api/router/organization/query.getNatlCrisis.handler.ts
@@ -1,8 +1,6 @@
-import superjson from 'superjson'
-import { type SuperJSONResult } from 'superjson/dist/types'
-
import { prisma } from '@weareinreach/db'
import { accessInstructions } from '@weareinreach/db/zod_util/attributeSupplement'
+import { superjson, type SuperJSONResult } from '@weareinreach/util/transformer'
import { isPublic } from '~api/schemas/selects/common'
import { type TRPCHandlerParams } from '~api/types/handler'
diff --git a/packages/api/router/organization/query.searchDistance.schema.ts b/packages/api/router/organization/query.searchDistance.schema.ts
index de85238150..beee7f4dcf 100644
--- a/packages/api/router/organization/query.searchDistance.schema.ts
+++ b/packages/api/router/organization/query.searchDistance.schema.ts
@@ -3,10 +3,12 @@ import { z } from 'zod'
import { coerceCoordItems, pagination } from '~api/schemas/common'
export const ZSearchDistanceSchema = z.object({
- ...coerceCoordItems,
- dist: z.union([z.number(), z.string()]).pipe(z.coerce.number()),
+ lat: z.number().gte(-90).lte(90),
+ lon: z.number().gte(-180).lte(180),
+ dist: z.coerce.number(),
unit: z.enum(['mi', 'km']),
- ...pagination,
+ skip: z.coerce.number(),
+ take: z.coerce.number(),
services: z.string().array().optional(),
attributes: z.string().array().optional(),
})
diff --git a/packages/api/router/service/query.forServiceDrawer.handler.ts b/packages/api/router/service/query.forServiceDrawer.handler.ts
index 4b58baf5bf..0015002c4e 100644
--- a/packages/api/router/service/query.forServiceDrawer.handler.ts
+++ b/packages/api/router/service/query.forServiceDrawer.handler.ts
@@ -1,7 +1,7 @@
import mapObjectVals from 'just-map-values'
import { prisma } from '@weareinreach/db'
-import { transformer } from '~api/lib/transformer'
+import { transformer } from '@weareinreach/util/transformer'
import { globalSelect, globalWhere } from '~api/selects/global'
import { type TRPCHandlerParams } from '~api/types/handler'
diff --git a/packages/api/router/service/query.forServiceEditDrawer.handler.ts b/packages/api/router/service/query.forServiceEditDrawer.handler.ts
index c4f6da334b..bba051f4aa 100644
--- a/packages/api/router/service/query.forServiceEditDrawer.handler.ts
+++ b/packages/api/router/service/query.forServiceEditDrawer.handler.ts
@@ -1,5 +1,5 @@
import { prisma } from '@weareinreach/db'
-import { transformer } from '~api/lib/transformer'
+import { transformer } from '@weareinreach/util/transformer'
import { globalSelect } from '~api/selects/global'
import { type TRPCHandlerParams } from '~api/types/handler'
diff --git a/packages/api/router/system/mutation.updateInactiveCountryEdgeConfig.handler.ts b/packages/api/router/system/mutation.updateInactiveCountryEdgeConfig.handler.ts
index f62603586b..090db8b44d 100644
--- a/packages/api/router/system/mutation.updateInactiveCountryEdgeConfig.handler.ts
+++ b/packages/api/router/system/mutation.updateInactiveCountryEdgeConfig.handler.ts
@@ -1,7 +1,6 @@
-import superjson from 'superjson'
-
import { prisma } from '@weareinreach/db'
import { getEnv } from '@weareinreach/env'
+import { superjson } from '@weareinreach/util/transformer'
export const updateInactiveCountryEdgeConfig = async () => {
const active = await prisma.country.findMany({
diff --git a/packages/api/schemas/attributeSupplements/accessInstructions.ts b/packages/api/schemas/attributeSupplements/accessInstructions.ts
index bd0fa5ec81..1491698e57 100644
--- a/packages/api/schemas/attributeSupplements/accessInstructions.ts
+++ b/packages/api/schemas/attributeSupplements/accessInstructions.ts
@@ -1,7 +1,7 @@
-import superjson from 'superjson'
-import { type SuperJSONResult } from 'superjson/dist/types'
import { z } from 'zod'
+import { superjson, type SuperJSONResult } from '@weareinreach/util/transformer'
+
const isURL = (string: string) => z.string().url().safeParse(string).success
const email = z.object({
diff --git a/packages/api/schemas/common.ts b/packages/api/schemas/common.ts
index f6a6a3dd10..49eb7c2b08 100644
--- a/packages/api/schemas/common.ts
+++ b/packages/api/schemas/common.ts
@@ -1,4 +1,3 @@
-import superjson from 'superjson'
import { z } from 'zod'
import {
@@ -7,6 +6,7 @@ import {
JsonInputOrNull,
JsonNullValueInputSchema,
} from '@weareinreach/db/zod_util'
+import { superjson } from '@weareinreach/util/transformer'
import { nanoUrlRegex } from '~api/lib/nanoIdUrl'
/**
diff --git a/packages/api/schemas/routes/search.ts b/packages/api/schemas/routes/search.ts
index 5d3ce5cdb0..fab7e67905 100644
--- a/packages/api/schemas/routes/search.ts
+++ b/packages/api/schemas/routes/search.ts
@@ -1,13 +1,9 @@
import { z } from 'zod'
/** Longitudes are vertical lines that measure east or west of the meridian in Greenwich, England */
-const longitude = z
- .union([z.number(), z.string()])
- .pipe(z.coerce.number().gte(-180).lte(180).describe('longitude'))
+const longitude = z.coerce.number().gte(-180).lte(180).describe('longitude')
/** Latitudes are horizontal lines that measure distance north or south of the equator. */
-const latitude = z
- .union([z.number(), z.string()])
- .pipe(z.coerce.number().gte(-90).lte(90).describe('latitude'))
+const latitude = z.coerce.number().gte(-90).lte(90).describe('latitude')
/**
* Search Params
@@ -19,13 +15,13 @@ export const SearchParamsSchema = z
z.string().length(2),
longitude,
latitude,
- z.union([z.number(), z.string()]).pipe(z.coerce.number().gte(0).describe('radius')),
+ z.coerce.number().gte(0).describe('radius'),
z.enum(['mi', 'km']),
])
- .transform<[string, string, string, string, 'mi' | 'km']>(([country, lon, lat, radius, unit]) => [
+ .transform<[string, number, number, number, 'mi' | 'km']>(([country, lon, lat, radius, unit]) => [
country,
- lon.toString(),
- lat.toString(),
- radius.toString(),
+ lon,
+ lat,
+ radius,
unit,
])
diff --git a/packages/api/trpc/client.ts b/packages/api/trpc/client.ts
index d4232a8f03..383e4a6be4 100644
--- a/packages/api/trpc/client.ts
+++ b/packages/api/trpc/client.ts
@@ -5,8 +5,8 @@ import { type inferRouterInputs, type inferRouterOutputs } from '@trpc/server'
import { devtoolsLink } from 'trpc-client-devtools-link'
import { getEnv } from '@weareinreach/env'
+import { transformer } from '@weareinreach/util/transformer'
-import { transformer } from '../lib/transformer'
import { type AppRouter } from '../router'
const getBaseUrl = () => {
diff --git a/packages/api/trpc/ssr.ts b/packages/api/trpc/ssr.ts
index 55e41b9495..310244bf8c 100644
--- a/packages/api/trpc/ssr.ts
+++ b/packages/api/trpc/ssr.ts
@@ -3,8 +3,8 @@ import { type GetServerSidePropsContext, type NextApiRequest, type NextApiRespon
import { getServerSession } from '@weareinreach/auth/next-auth/get-session'
import { type Session } from '@weareinreach/auth/next-auth/types'
+import { transformer } from '@weareinreach/util/transformer'
import { createContextInner } from '~api/lib/context'
-import { transformer } from '~api/lib/transformer'
import { appRouter } from '~api/router'
interface SSRContext {
diff --git a/packages/auth/package.json b/packages/auth/package.json
index 3cb66c9081..bf2219ec75 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -14,7 +14,7 @@
"with-env": "dotenv -e ../../.env --"
},
"dependencies": {
- "@aws-sdk/client-cognito-identity-provider": "3.451.0",
+ "@aws-sdk/client-cognito-identity-provider": "3.465.0",
"@next-auth/prisma-adapter": "1.0.7",
"@weareinreach/db": "workspace:*",
"@weareinreach/env": "workspace:*",
@@ -25,18 +25,18 @@
"zod": "3.22.4"
},
"devDependencies": {
- "@types/eslint": "8.44.7",
- "@types/node": "18.18.9",
- "@types/react": "18.2.37",
- "@types/react-dom": "18.2.15",
+ "@types/eslint": "8.44.8",
+ "@types/node": "20.10.3",
+ "@types/react": "18.2.42",
+ "@types/react-dom": "18.2.17",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
- "eslint": "8.53.0",
- "next": "14.0.2",
+ "eslint": "8.55.0",
+ "next": "14.0.3",
"next-auth": "4.24.5",
"react": "18.2.0",
"react-dom": "18.2.0",
- "typescript": "5.2.2"
+ "typescript": "5.3.2"
},
"peerDependencies": {
"next": "^14",
diff --git a/packages/config/package.json b/packages/config/package.json
index 60562cc824..db27f260e3 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -15,10 +15,10 @@
"preinstall": "npx only-allow pnpm"
},
"devDependencies": {
- "@types/node": "18.18.9",
+ "@types/node": "20.10.3",
"@weareinreach/eslint-config": "0.100.0",
"alex": "11.0.1",
"next-i18next": "15.0.0",
- "typescript": "5.2.2"
+ "typescript": "5.3.2"
}
}
diff --git a/packages/crowdin/package.json b/packages/crowdin/package.json
index 3853bac3ad..a68bb037ff 100644
--- a/packages/crowdin/package.json
+++ b/packages/crowdin/package.json
@@ -39,7 +39,7 @@
"with-env": "dotenv -e ../../.env --"
},
"dependencies": {
- "@crowdin/crowdin-api-client": "1.26.0",
+ "@crowdin/crowdin-api-client": "1.28.1",
"@crowdin/ota-client": "1.0.0",
"@opentelemetry/api": "1.7.0",
"@vercel/kv": "1.0.0",
@@ -52,6 +52,6 @@
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "workspace:*",
"prettier": "3.1.0",
- "typescript": "5.2.2"
+ "typescript": "5.3.2"
}
}
diff --git a/packages/db/client/index.ts b/packages/db/client/index.ts
index ede7fabcef..469027f111 100644
--- a/packages/db/client/index.ts
+++ b/packages/db/client/index.ts
@@ -8,7 +8,6 @@ import { superjsonMiddleware } from '~db/lib/superjsonMiddleware'
const log = createLoggerInstance('prisma')
const verboseLogging = Boolean(
- // eslint-disable-next-line turbo/no-undeclared-env-vars
process.env.NODE_ENV === 'development' && (!!process.env.NEXT_VERBOSE || !!process.env.PRISMA_VERBOSE)
)
diff --git a/packages/db/db-cli/index.ts b/packages/db/db-cli/index.ts
index c50bb73b8e..a8d66c5bb0 100644
--- a/packages/db/db-cli/index.ts
+++ b/packages/db/db-cli/index.ts
@@ -1,6 +1,7 @@
import inquirer from 'inquirer'
import { generateIdTask } from './task.generateId'
+import { generateSlugTask } from './task.generateSlug'
const main = () =>
inquirer
@@ -11,6 +12,7 @@ const main = () =>
message: 'Select a task/tool',
choices: [
{ name: 'Generate IDs', value: 'generateId' },
+ { name: 'Generate Slug', value: 'generateSlug' },
// { name: 'Quit', value: 'quit' },
],
},
@@ -20,7 +22,10 @@ const main = () =>
if (answers.task === 'quit') process.exit()
switch (answers.task) {
case 'generateId': {
- generateIdTask()
+ return generateIdTask()
+ }
+ case 'generateSlug': {
+ return generateSlugTask()
}
}
})
diff --git a/packages/db/db-cli/task.generateSlug.ts b/packages/db/db-cli/task.generateSlug.ts
new file mode 100644
index 0000000000..a3da013d96
--- /dev/null
+++ b/packages/db/db-cli/task.generateSlug.ts
@@ -0,0 +1,18 @@
+import inquirer from 'inquirer'
+
+import { generateUniqueSlug } from '~db/lib/slugGen'
+
+export const generateSlugTask = () => {
+ inquirer
+ .prompt([
+ {
+ type: 'input',
+ name: 'orgName',
+ message: 'Enter the organization name:',
+ },
+ ])
+ .then(async (answers) => {
+ const newSlug = await generateUniqueSlug({ name: answers.orgName, id: '' })
+ console.log(newSlug)
+ })
+}
diff --git a/packages/db/lib/superjsonMiddleware.ts b/packages/db/lib/superjsonMiddleware.ts
index ceebc9212c..cdd663fdfe 100644
--- a/packages/db/lib/superjsonMiddleware.ts
+++ b/packages/db/lib/superjsonMiddleware.ts
@@ -1,9 +1,8 @@
import { Prisma } from '@prisma/client'
-import superjson from 'superjson'
-import { type SuperJSONResult } from 'superjson/dist/types'
import { z } from 'zod'
import { createLoggerInstance } from '@weareinreach/util/logger'
+import { superjson, type SuperJSONResult } from '@weareinreach/util/transformer'
import { NullableJsonValue } from './zod'
diff --git a/packages/db/package.json b/packages/db/package.json
index f2a972470d..e795533c0b 100644
--- a/packages/db/package.json
+++ b/packages/db/package.json
@@ -59,31 +59,32 @@
"zod": "3.22.4"
},
"devDependencies": {
- "@octokit/core": "5.0.1",
+ "@octokit/core": "5.0.2",
"@terraformer/wkt": "2.2.0",
"@turbo/gen": "1.10.16",
"@turf/helpers": "6.5.0",
- "@types/eslint": "8.44.7",
+ "@types/eslint": "8.44.8",
"@types/inquirer": "9.0.7",
"@types/inquirer-autocomplete-prompt": "3.0.3",
- "@types/luxon": "3.3.4",
- "@types/node": "18.18.9",
- "@types/papaparse": "5.3.11",
+ "@types/luxon": "3.3.7",
+ "@types/node": "20.10.3",
+ "@types/papaparse": "5.3.14",
"@types/pg": "8.10.9",
"@types/terraformer__wkt": "2.0.2",
"@weareinreach/config": "workspace:*",
"@weareinreach/eslint-config": "0.100.0",
"dotenv": "16.3.1",
"dotenv-cli": "7.3.0",
- "eslint": "8.53.0",
- "google-auth-library": "9.2.0",
+ "eslint": "8.55.0",
+ "google-auth-library": "9.4.1",
"google-spreadsheet": "4.1.1",
+ "googleapis": "129.0.0",
"inquirer": "9.2.12",
"inquirer-autocomplete-prompt": "3.0.1",
"just-compact": "3.2.0",
"kysely-codegen": "0.11.0",
- "libphonenumber-js": "1.10.49",
- "listr2": "7.0.2",
+ "libphonenumber-js": "1.10.51",
+ "listr2": "8.0.0",
"luxon": "3.4.4",
"p-queue": "7.4.1",
"p-retry": "6.1.0",
@@ -97,13 +98,13 @@
"prisma-query-log": "3.2.0",
"slugify": "1.6.6",
"sql-bricks-postgres": "0.6.0",
- "string-byte-length": "2.0.0",
+ "string-byte-length": "3.0.0",
"tiny-invariant": "1.3.1",
- "tsx": "4.1.2",
- "type-fest": "4.7.1",
- "typescript": "5.2.2",
- "zod-prisma-types": "3.1.5",
- "zod-to-json-schema": "3.21.4"
+ "tsx": "4.6.2",
+ "type-fest": "4.8.3",
+ "typescript": "5.3.2",
+ "zod-prisma-types": "3.1.6",
+ "zod-to-json-schema": "3.22.1"
},
"prisma": {
"seed": "turbo run db:run-seed"
diff --git a/packages/db/prisma/data-migrations/2023-11-17_add-missing-websites/data.json b/packages/db/prisma/data-migrations/2023-11-17_add-missing-websites/data.json
new file mode 100644
index 0000000000..1392f52ce6
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-17_add-missing-websites/data.json
@@ -0,0 +1 @@
+[{"url":"https://taagg.org/","id":"oweb_01HFFF6GD1H82SN0BSPCNRYE0W","organizationId":"orgn_01H4EMWV80FN0ZZSC5RN2SWN6A"},{"url":"https://www.thepublicbarber.com/","id":"oweb_01HFFF6GD1AVEK9DV1KYWS9T51","organizationId":"orgn_01H5KGYD8KRGJ5Q49FK27MAC6N"},{"url":"http://queercenter.net/","id":"oweb_01HFFF6GD1W6Q1QAC48AC5VZ9R","organizationId":"orgn_01H5XNPEKSDQ5CBWSC5CE5RV5S"},{"url":"https://oasiscenter.org/","id":"oweb_01HFFF6GD19VXDF3MBBWTBDEM3","organizationId":"orgn_01H5XP8FN3T6SDYGTMJ5R2QYPS"},{"url":"https://rapidresponsesd.org/","id":"oweb_01HFFF6GD11E2XKYRKAYBZGNB5","organizationId":"orgn_01H6F4BYSD4D0BYQ9657QNFEJ1"},{"url":"https://heshezewe.org/","id":"oweb_01HFFF6GD15N5BWA7SYRR2ZM0G","organizationId":"orgn_01H6F4FBE2FKKYZ02PHJ8VWJQH"},{"url":"https://www.gbpflag.org/","id":"oweb_01HFFF6GD14YEMSBYJ49GQEE53","organizationId":"orgn_01H6WFSYTRBH76Q0HRKH10AEMY"},{"url":"https://www.healthlawadvocates.org/","id":"oweb_01HFFF6GD1XT93QYBBJZEXMFET","organizationId":"orgn_01H6WFYQAVVG5CCEN1T23NXDMX"},{"url":"https://www.bmc.org/center-transgender-medicine-and-surgery","id":"oweb_01HFFF6GD1W4TYNTWGPH6QAQTM","organizationId":"orgn_01H6WGTT774EQ723NGH78GEMM2"},{"url":"http://samallencounseling.com/","id":"oweb_01HFFF6GD1RTENYMB1ENEJKPPF","organizationId":"orgn_01H6WGYA09JSENSGTMHD2FH9G5"},{"url":"https://www.brighamandwomens.org/transgender-health","id":"oweb_01HFFF6GD1X8VJ7SKE4Y3PKB2H","organizationId":"orgn_01H6WH39TTTEA354FH9MSW3KDH"},{"url":"https://www.childrenshospital.org/programs/gender-services","id":"oweb_01HFFF6GD1AC9DNZT1SVF31T4H","organizationId":"orgn_01H6WHAVKB2ZJPA5XXWWP6E2F5"},{"url":"https://www.bidmc.org/centers-and-departments/gender-affirming-services","id":"oweb_01HFFF6GD1T3GRG6W623W93S7F","organizationId":"orgn_01H6WHK3RJ6QPH45WYX34211G1"},{"url":"https://www.massgeneral.org/transgender-health-program","id":"oweb_01HFFF6GD1H40NB2VEC41EYZ0D","organizationId":"orgn_01H6WHN3ACBR3WQN7KVW19ARVP"},{"url":"https://www.baystatehealth.org/Services/Transgender","id":"oweb_01HFFF6GD1G0BYDN5PT69PKF59","organizationId":"orgn_01H6WHVKT95BWH9CCBG87KMDVV"},{"url":"https://www.cooleydickinson.org/about-us/commitment-to-community/lgbtq-care/","id":"oweb_01HFFF6GD1ZE2CZAMGS07PG922","organizationId":"orgn_01H6WJ30M4MXXT8EY0PSEGAEP6"},{"url":"https://www.lahey.org/lhmc/department/transgender-medicine/","id":"oweb_01HFFF6GD1HPKANPMFFBG0CR2V","organizationId":"orgn_01H6WJEFTVQVH3X9MZHCWG7DZ2"},{"url":"https://www.mainehealth.org/Services/Kids-Health/The-Gender-Clinic","id":"oweb_01HFFF6GD1FCSNZD2NYKNDFFB5","organizationId":"orgn_01H6WJPV5D0QTH3476N0KR3YGP"},{"url":"https://transhealth.org/","id":"oweb_01HFFF6GD1Y0JKKMM3Z5NJ2M3N","organizationId":"orgn_01H6WJT5KWHG8SM2WHD5VYVCK6"},{"url":"https://www.vpi.org/mpt-services/","id":"oweb_01HFFF6GD1MEJSFPZJMB0NSAPX","organizationId":"orgn_01H6WJZK41CGW5WWP9HRMBXVCF"},{"url":"https://www.safehomesma.org/","id":"oweb_01HFFF6GD156MFRB0A4ZQRQEVP","organizationId":"orgn_01H6WK4KA925H3DK13HYVRPCF3"},{"url":"https://ourspotkc.org/","id":"oweb_01HFFF6GD1BHB4S63CZSK270WC","organizationId":"orgn_01H7WW496DG9NRN1EZBN4KPAF4"},{"url":"https://www.peacockrebellion.org/","id":"oweb_01HFFF6GD1K6WB8WNYZSVMBF8F","organizationId":"orgn_01H7WW772598JCEHJCY8B8VH0M"},{"url":"https://houseofgg.org/","id":"oweb_01HFFF6GD107F0X0SC8XGW2V85","organizationId":"orgn_01H7WWNF9DJT1HSRCXBRP3ZF14"},{"url":"https://www.asylumpridehouse.org/","id":"oweb_01HFFF6GD1EVB8NEK1JC1180TX","organizationId":"orgn_01H84JYTH7E895XX9192BW6VSB"},{"url":"https://www.getequalhealth.com/","id":"oweb_01HFFF6GD1V98XG9GX48NBR2R8","organizationId":"orgn_01H84MN8JQPZF6HBCVGM0P28DB"},{"url":"https://www.transformativeschools.org/","id":"oweb_01HFFF6GD17YQ58VH292WS79BY","organizationId":"orgn_01H855WJPCEH7GMSXT3TQHQ7G1"},{"url":"https://www.gracepointe.net/lgbtqia-gathering","id":"oweb_01HFFF6GD19JT5ENT6JP31YEFT","organizationId":"orgn_01H8750NGDGZKMPM6V48TB8737"},{"url":"https://www.instagram.com/transmascseattle/","id":"oweb_01HFFF6GD15YHFR61QG9ZP6CHX","organizationId":"orgn_01H9ERZ8VPPC8TQ1BC8XH7MBC2"},{"url":"https://seattletransjoy.com/","id":"oweb_01HFFF6GD1G6NSNMFXWHHGKD57","organizationId":"orgn_01H9ES0SM4TT072EDZS6ZK9ZEH"},{"url":"https://depts.washington.edu/tgnbhealthprogram/","id":"oweb_01HFFF6GD148DE82XFBE1CGB2V","organizationId":"orgn_01H9ES4SJA09NGTBDJ3TGW7G4F"},{"url":"https://www.squirrelchops.com/cuts","id":"oweb_01HFFF6GD1C05BJ1X2S6XXJV6Z","organizationId":"orgn_01H9ESH4DNT6QHDZPHBQS6E3S8"},{"url":"https://www.swopbehindbars.org/","id":"oweb_01HFFF6GD14VSFGVKPNB5PHQVZ","organizationId":"orgn_01H9ESQQTH7BPJE3ZPQ8Z3KCPW"},{"url":"https://www.nwys.org/","id":"oweb_01HFFF6GD1TT85B8HW6WJM3JF7","organizationId":"orgn_01H9ET9M1PR7QKCDQ9115G9YMM"},{"url":"https://www.marybridge.org/services/lgbtq-care/","id":"oweb_01HFFF6GD1H9FHVHGHSV1Y8GCC","organizationId":"orgn_01H9ETQYA28NGBS6BDXQHQBYWR"},{"url":"https://www.mayoclinic.org/departments-centers/transgender-and-intersex-specialty-care-clinic/overview/ovc-20395546","id":"oweb_01HFFF6GD1N4VD30GRRF7AH4AP","organizationId":"orgn_01H9GJ3YKF3RSFRF8EY6558W1A"},{"url":"https://www.obsydianstudio.com","id":"oweb_01HFFF6GD1HCW7JQ7C8G1E3ZZV","organizationId":"orgn_01H9RS3Y58RNRE7FGWXNR1JQXB"},{"url":"https://triadhealthproject.org","id":"oweb_01HFFF6GD1XX4F1V69EEMDF41Y","organizationId":"orgn_01H9VAVEAKBKBQDTVK0PG6ZMY1"},{"url":"https://www.finnsplacetx.org/","id":"oweb_01HFFF6GD1RPTWVYD6BVX3P4HY","organizationId":"orgn_01HASCVBE7TRV5EDYYESVN2ZDB"},{"url":"https://www.uvmhealth.org/childrens-hospital/pediatric-specialties/transgender-youth-program","id":"oweb_01HFFF6GD10DDC5FYHTQ76HA3H","organizationId":"orgn_01HBYM0MTDYZVR8VJ5F88CZDXZ"},{"url":"https://www.translategender.org/","id":"oweb_01HFFF6GD1KYW82CVJMXZGKSP2","organizationId":"orgn_01HBYMSP1ZRXT3QVQTAJBT3PXM"},{"url":"https://www.challiance.org/services-programs/primary-care/lgbtq-plus-living-well","id":"oweb_01HFFF6GD1FR0NVRRAKZVTWRWH","organizationId":"orgn_01HBYN3T22CS63PCXBZWS9BQ90"},{"url":"https://childrensnational.org/departments/adolescent-and-young-adult-medicine/youth-pride-clinic","id":"oweb_01HFFF6GD1714ND0DTTQ3XJ0H9","organizationId":"orgn_01HC18PM8GHK5K316SSJY4FHP0"},{"url":"https://www.seattlechildrens.org/clinics/gender-clinic/","id":"oweb_01HFFF6GD1562CN1CJ77HYVKS4","organizationId":"orgn_01HC18YDH64GF0DTXDPPSQGNG2"},{"url":"https://www.uwhealth.org/treatments/path-clinic-for-pediatric-gender-identity","id":"oweb_01HFFF6GD1R03C6HS9PY0QK2T3","organizationId":"orgn_01HC195CDTQWGK8MP435SAER2Y"},{"url":"https://www.akronchildrens.org/departments/Center-for-Gender-Affirming-Medicine.html","id":"oweb_01HFFF6GD1XZGB4QFNP7KE32V7","organizationId":"orgn_01HC197PFD4CEJH712MVQTP82A"},{"url":"https://www.childrenscolorado.org/doctors-and-departments/departments/gender-diversity-center/","id":"oweb_01HFFF6GD1GNNEYZGRPZZSGDTT","organizationId":"orgn_01HC19ADN0DXSKZ8Z0SSBADQVY"},{"url":"https://nyulangone.org/locations/adolescent-medicine-program","id":"oweb_01HFFF6GD14ENQVSNG982ZHA5A","organizationId":"orgn_01HC19E1G0PTA4692M66HT66N4"},{"url":"https://www.upmc.com/services/lgbtqia","id":"oweb_01HFFF6GD1Y37DGNZH8KH6E909","organizationId":"orgn_01HC19GDRAABEYZEDX4CVJYNPH"},{"url":"https://www.stanfordchildrens.org/en/service/gender","id":"oweb_01HFFF6GD1K77T0NX18M0KNZ7T","organizationId":"orgn_01HC19KKMJM9Y0KF1WPWCZ5G07"},{"url":"https://www.nm.org/conditions-and-care-areas/gender-pathways-program","id":"oweb_01HFFF6GD15XGW89A26A2TT191","organizationId":"orgn_01HC19NJXS10ERZA0ZK44C6XGH"},{"url":"https://med.umn.edu/sexualhealth/clinic","id":"oweb_01HFFF6GD1FR4X77P21ZA7Z66T","organizationId":"orgn_01HC19SBPTSA54J5ZK6H5915TW"},{"url":"https://www.yalemedicine.org/departments/pediatric-gender-program","id":"oweb_01HFFF6GD1R6YZ1A4TA52YN9J3","organizationId":"orgn_01HC1A1CDY9RGWWPFXGYTAD1DP"},{"url":"https://www.uchicagomedicine.org/conditions-services/lgbtq-care","id":"oweb_01HFFF6GD15NDCVKHZ7PBH4PCD","organizationId":"orgn_01HC1A52RF25XNSJ928XMJB9VV"},{"url":"https://www.kansashealthsystem.com/care/specialties/gender-affirming-medicine","id":"oweb_01HFFF6GD1NJVWTX9XGPM3WEPC","organizationId":"orgn_01HC1AC50C9EGMQDX8R0EDF21R"},{"url":"https://www.cincinnatichildrens.org/service/t/transgender","id":"oweb_01HFFF6GD1813D84G9GMGZDXVP","organizationId":"orgn_01HC3TYKK32W6DND15TNXF9KF7"},{"url":"https://www.connecticutchildrens.org/search-specialties/endocrinology-diabetes/endocrinology-diabetes-gender-program/","id":"oweb_01HFFF6GD1V4Y25KXDR2PDT2MN","organizationId":"orgn_01HC3V3YCMQFY96YFAWZKG2XZM"},{"url":"https://www.mottchildren.org/conditions-treatments/ped-mend/gender-management","id":"oweb_01HFFF6GD17AVBS36WJ0XB90XQ","organizationId":"orgn_01HC3V5X3SZGMJH7NM7RVDEGK0"},{"url":"https://www.denverhealth.org/services/lgbtq-services","id":"oweb_01HFFF6GD1Z1MKNVQZ142HMPW4","organizationId":"orgn_01HC3VC24CHSEY8TXBA5JQD6B3"},{"url":"https://www.medstarhealth.org/services","id":"oweb_01HFFF6GD1VK115DEGFD93H53W","organizationId":"orgn_01HC3VG0D3HZGR6DBV2X2YAD78"},{"url":"https://www.metrohealth.org/lgbtq-pride-network","id":"oweb_01HFFF6GD1XK878QN6145K1TGD","organizationId":"orgn_01HC3VK29ZRXFC5Y7S2FZWWJKB"},{"url":"https://www.hopkinsmedicine.org/center-transgender-health","id":"oweb_01HFFF6GD1D2PBT3A19V2RDX7Q","organizationId":"orgn_01HC3XBMH0EHQ8636ND716AHQR"},{"url":"https://transadvocacycouncil.org/","id":"oweb_01HFFF6GD1606APNK7X3XWSDN2","organizationId":"orgn_01HC3XXMJY4QDG02H0F12GP17V"},{"url":"https://www.northtexastransportationnetwork.org/","id":"oweb_01HFFF6GD1C8B75SS1T3FN257S","organizationId":"orgn_01HC3Y0PJY90J604ZFDCPN3WKC"},{"url":"http://dallasrainbowcounseling.com/","id":"oweb_01HFFF6GD1NFVQQR53W1MJCHWW","organizationId":"orgn_01HC3Y57GM228CA02CTY3VW7WN"},{"url":"https://www.journeytodream.com/residential-campus","id":"oweb_01HFFF6GD1P3HEJ7YNZXTFJP8N","organizationId":"orgn_01HC3YAFD6PN23BC4VNK7JNG56"},{"url":"https://transitionalspace.us/","id":"oweb_01HFFF6GD1PG9625GQ8S597EWM","organizationId":"orgn_01HC7ZP7N0RQJ6J65MFKKXTE04"},{"url":"https://www.emoryhealthcare.org/centers-programs/transgender-clinic","id":"oweb_01HFFF6GD1DPZ1FYFYJVH6JPVA","organizationId":"orgn_01HC80M9VYSCACNE8GTMXYVP5M"},{"url":"https://www.thegenderphluidcollective.com/","id":"oweb_01HFFF6GD1PT8KWD693HXXPR4T","organizationId":"orgn_01HC810TKQSQ8P88759EGK7CMT"},{"url":"https://www.phoenixchildrens.org/gendersupport","id":"oweb_01HFFF6GD1AJ2PP87M18PTSB28","organizationId":"orgn_01HC81B1AVJ9JHG2A3W7DSTQ2J"},{"url":"https://www.med.unc.edu/shac/programs/gender-affirming-care/","id":"oweb_01HFFF6GD19EAJJ1MYSFCPH00C","organizationId":"orgn_01HC825YQH1M6QB0S8G7KNK80D"},{"url":"https://equitashealth.com/our-services/","id":"oweb_01HFFF6GD1DM65VH45KDGEG7YR","organizationId":"orgn_01HC817A7816T43MQ8DFXB11YH"},{"url":"https://childrenswi.org/medical-care/endocrine/gender-health-clinic","id":"oweb_01HFFF6GD1WWA5A24YDA486Z5G","organizationId":"orgn_01HC81G02X7Y5K8VFY46VYAZBM"},{"url":"https://www.chop.edu/centers-programs/gender-and-sexuality-development-program","id":"oweb_01HFFF6GD1RPEXKVDK6QKQ56BF","organizationId":"orgn_01HC81N8K7G8QBN75SYYCR0T1C"},{"url":"https://www.umms.org/ummc/health-services/transgender-health-care","id":"oweb_01HFFF6GD187B5QE3CQAQCHEDR","organizationId":"orgn_01HC81WXHEFX4E7GMD8CVZ9J34"},{"url":"https://www.archildrens.org/programs-and-services/gender-services","id":"oweb_01HFFF6GD1P3KEYTYEAP8Q91WY","organizationId":"orgn_01HC82KN4V9025S0AG23MY9Z9S"},{"url":"https://www.heartsonawire.org/","id":"oweb_01HFFF6GD1XEXGC50TVV0XAXV9","organizationId":"orgn_01HC8X63BAHH2YPSJDANVM55VS"},{"url":"https://prisonercorrespondenceproject.com/","id":"oweb_01HFFF6GD15G1GGD67TFJ5HES9","organizationId":"orgn_01HC8X8MX72HV7ZC2W52TH8XZ6"},{"url":"https://www.tranzmissionprisonproject.org/","id":"oweb_01HFFF6GD1E88RQX12Z0B6VHCQ","organizationId":"orgn_01HC8XAH47TJS7KVHC6PVGSYBV"},{"url":"https://www.empowermentprogram.org/","id":"oweb_01HFFF6GD1R1REZBQ8QAH1NBM5","organizationId":"orgn_01HC8YSSVFRJXD0Y9B2XP7WFRB"},{"url":"https://tgpdenver.org/about/","id":"oweb_01HFFF6GD15ZX3BS7CVR1J77T3","organizationId":"orgn_01HC8Z0ATDSKKSB2D2327GDGBE"},{"url":"https://sjch.org/transgender-health-program/","id":"oweb_01HFFF6GD1ZKMKX3J0GMF4MKFC","organizationId":"orgn_01HC8Z8DSDRTQB3SB5NMRBGEQS"},{"url":"https://queermed.com/","id":"oweb_01HFFF6GD1Y7X3XY0ZX8BHYS4E","organizationId":"orgn_01HCACQ62TQ3B02BAQHBH3D4PV"},{"url":"https://www.bmc.org/transgender-child-adolescent-center","id":"oweb_01HFFF6GD11HE2JGBWTAMQPWYM","organizationId":"orgn_01HDQ1XM4XYGBM4D2S6CVPNTGP"},{"url":"https://www.aztypo.com/","id":"oweb_01HFFF6GD14J9CYVRWVK1HBQ74","organizationId":"orgn_01HDQ1XN0R8Q6CQCCMR8Q417MK"},{"url":"https://lgbtbookstoprisoners.org/","id":"oweb_01HFFF6GD1NV49Q716SCRP43ZY","organizationId":"orgn_01HDQ1XNPYCDMK9Y7BJ71N23DN"},{"url":"https://www.galileochurch.org/","id":"oweb_01HFFF6GD17R0AMW6Z1S326K6M","organizationId":"orgn_01HDQ1XP1RJG2A53S032ZYKSD3"}]
\ No newline at end of file
diff --git a/packages/db/prisma/data-migrations/2023-11-17_add-missing-websites/index.ts b/packages/db/prisma/data-migrations/2023-11-17_add-missing-websites/index.ts
new file mode 100644
index 0000000000..8b98277b39
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-17_add-missing-websites/index.ts
@@ -0,0 +1,62 @@
+import { z } from 'zod'
+
+import fs from 'fs'
+import path from 'path'
+
+import { prisma } from '~db/client'
+import { formatMessage } from '~db/prisma/common'
+import { type MigrationJob } from '~db/prisma/dataMigrationRunner'
+import { createLogger, type JobDef, jobPostRunner } from '~db/prisma/jobPreRun'
+
+const Schema = z
+ .object({
+ id: z.string(),
+ url: z.string().url(),
+ organizationId: z.string(),
+ })
+ .array()
+
+/** Define the job metadata here. */
+const jobDef: JobDef = {
+ jobId: '2023-11-17-add-missing-websites',
+ title: 'add missing websites',
+ createdBy: 'Joe Karow',
+ /** Optional: Longer description for the job */
+ description: undefined,
+}
+/**
+ * Job export - this variable MUST be UNIQUE
+ */
+export const job20231117_add_missing_websites = {
+ title: `[${jobDef.jobId}] ${jobDef.title}`,
+ task: async (_ctx, task) => {
+ /** Create logging instance */
+ createLogger(task, jobDef.jobId)
+ const log = (...args: Parameters) => (task.output = formatMessage(...args))
+ /**
+ * Start defining your data migration from here.
+ *
+ * To log output, use `task.output = 'Message to log'`
+ *
+ * This will be written to `stdout` and to a log file in `/prisma/migration-logs/`
+ */
+
+ // Do stuff
+
+ const data = Schema.parse(JSON.parse(fs.readFileSync(path.resolve(__dirname, 'data.json'), 'utf8')))
+
+ const addedSites = await prisma.orgWebsite.createMany({
+ data,
+ skipDuplicates: true,
+ })
+ log(`Added ${addedSites.count} org websites`)
+
+ /**
+ * DO NOT REMOVE BELOW
+ *
+ * This writes a record to the DB to register that this migration has run successfully.
+ */
+ await jobPostRunner(jobDef)
+ },
+ def: jobDef,
+} satisfies MigrationJob
diff --git a/packages/db/prisma/data-migrations/2023-11-17_data-load/!load.ts b/packages/db/prisma/data-migrations/2023-11-17_data-load/!load.ts
new file mode 100644
index 0000000000..374f0045ac
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-17_data-load/!load.ts
@@ -0,0 +1,113 @@
+/* eslint-disable node/no-process-env */
+import { JWT } from 'google-auth-library'
+import { GoogleSpreadsheet } from 'google-spreadsheet'
+import PQueue from 'p-queue'
+import PRetry from 'p-retry'
+import papa from 'papaparse'
+
+import fs from 'fs'
+import path from 'path'
+
+const creds = JSON.parse(process.env.GOOGLE_SERVICE_ACCT_CREDS as string)
+const scopes = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive.file']
+const jwt = new JWT({
+ email: creds.client_email,
+ key: creds.private_key,
+ scopes,
+})
+const sheetID = '17Egecl5U8_o8Nx8qic5cUE7oD3A8__2KgXilz-7yoMU'
+
+const queue = new PQueue({
+ concurrency: 1,
+ interval: 2250,
+ intervalCap: 1,
+ autoStart: false,
+ carryoverConcurrencyCount: true,
+})
+function sleep(ms: number) {
+ return new Promise((resolve) => setTimeout(resolve, ms))
+}
+const main = async () => {
+ const wb = new GoogleSpreadsheet(sheetID, jwt)
+ await wb.loadInfo()
+
+ const sheetsToGet = {
+ Orgs: 'organization',
+ Emails: 'orgEmail',
+ 'Access Instructions': 'svcAccess',
+ Phones: 'orgPhone',
+ Locations: 'orgLocation',
+ OrgSocial: 'orgSocial',
+ Services: 'orgService',
+ }
+ const joinsToGet = {
+ OrgServicePhone: 'orgServicePhone',
+ OrgServiceEmail: 'orgServiceEmail',
+ OrgLocationEmail: 'orgLocationEmail',
+ OrgLocationService: 'orgLocationService',
+ OrgLocationPhone: 'orgLocationPhone',
+ }
+ const data = {}
+ const joins = {}
+
+ const getData = async (sheetName: string) => {
+ const sheet = wb.sheetsByTitle[sheetName]
+ console.log('Parsing', sheetName)
+ if (!sheet) throw new Error(`Sheet ${sheetName} not found in spreadsheet ${sheetID}`)
+ const csv = await sheet.downloadAsCSV()
+ const parsed = papa.parse(csv.toString(), { header: true, skipEmptyLines: 'greedy' })
+ const dataName = sheetsToGet[sheetName]
+ console.log(sheetName, `returned ${parsed.data.length} rows`)
+ data[dataName] = parsed.data
+ }
+
+ const getJoin = async (joinName: string) => {
+ const sheet = wb.sheetsByTitle[joinName]
+ console.log('Parsing', joinName)
+ if (!sheet) throw new Error(`Sheet ${joinName} not found in spreadsheet ${sheetID}`)
+ const csv = await sheet.downloadAsCSV()
+ const parsed = papa.parse(csv.toString(), { header: true, skipEmptyLines: true })
+ console.log(joinName, `returned ${parsed.data.length} rows`)
+ const dataName = joinsToGet[joinName]
+ joins[dataName] = parsed.data
+ }
+
+ for (const sheetName of Object.keys(sheetsToGet)) {
+ queue.add(async () => {
+ await PRetry(() => getData(sheetName), {
+ onFailedAttempt: async (err) => {
+ console.error(`[${err.attemptNumber}/${err.retriesLeft}] ${err.message} -- Trying again`)
+ // await sleep(5000)
+ },
+ // factor: 3,
+ randomize: true,
+ })
+ })
+ }
+ queue.add(async () => {
+ console.log("Let google catch it's breath")
+ await sleep(5000)
+ })
+
+ for (const joinName of Object.keys(joinsToGet)) {
+ queue.add(async () => {
+ await PRetry(() => getJoin(joinName), {
+ onFailedAttempt: async (err) => {
+ console.error(
+ `[${err.attemptNumber}/${err.retriesLeft}] ${err.message} -- Trying again in 5 seconds`
+ )
+ await sleep(5000)
+ },
+ })
+ })
+ }
+ queue.add(() => {
+ console.log('writing data.json')
+ fs.writeFileSync(path.resolve(__dirname, 'load.json'), JSON.stringify(data))
+ console.log('writing joins.json')
+ fs.writeFileSync(path.resolve(__dirname, 'joins.json'), JSON.stringify(joins))
+ })
+ queue.start()
+}
+
+main()
diff --git a/packages/db/prisma/data-migrations/2023-11-17_data-load/!prep.ts b/packages/db/prisma/data-migrations/2023-11-17_data-load/!prep.ts
new file mode 100644
index 0000000000..c7a4d0b5cc
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-17_data-load/!prep.ts
@@ -0,0 +1,577 @@
+/* eslint-disable node/no-process-env */
+import compact from 'just-compact'
+import { isSupportedCountry, parsePhoneNumberWithError } from 'libphonenumber-js'
+import superjson from 'superjson'
+
+import fs from 'fs'
+import path from 'path'
+
+import { Prisma, prisma } from '~db/client'
+import { generateFreeText } from '~db/lib/generateFreeText'
+import { generateId, isIdFor } from '~db/lib/idGen'
+import { generateUniqueSlug } from '~db/lib/slugGen'
+import { JsonInputOrNull, accessInstructions as zAccessInstructions } from '~db/zod_util'
+
+import { DataFile, DataSchema, JoinFile, JoinSchema } from './!schemas'
+
+const data = DataFile.parse(JSON.parse(fs.readFileSync(path.resolve(__dirname, 'load.json'), 'utf8')))
+const joins = JoinFile.parse(JSON.parse(fs.readFileSync(path.resolve(__dirname, 'joins.json'), 'utf8')))
+
+export interface Output {
+ organizationNew: Prisma.OrganizationCreateManyInput[]
+ organizationUp: Prisma.OrganizationUpdateArgs[]
+ organizationAttribute: Prisma.OrganizationAttributeCreateManyInput[]
+ attributeSupplement: Prisma.AttributeSupplementCreateManyInput[]
+ translationKey: Prisma.TranslationKeyCreateManyInput[]
+ freeText: Prisma.FreeTextCreateManyInput[]
+ orgLocation: Prisma.OrgLocationCreateManyInput[]
+ serviceArea: Prisma.ServiceAreaCreateManyInput[]
+ serviceAreaCountry: Prisma.ServiceAreaCountryCreateManyInput[]
+ serviceAreaDist: Prisma.ServiceAreaDistCreateManyInput[]
+ orgService: Prisma.OrgServiceCreateManyInput[]
+ orgServiceTag: Prisma.OrgServiceTagCreateManyInput[]
+ orgEmail: Prisma.OrgEmailCreateManyInput[]
+ orgPhone: Prisma.OrgPhoneCreateManyInput[]
+ orgWebsite: Prisma.OrgWebsiteCreateManyInput[]
+ orgServiceEmail: Prisma.OrgServiceEmailCreateManyInput[]
+ orgServicePhone: Prisma.OrgServicePhoneCreateManyInput[]
+ orgLocationEmail: Prisma.OrgLocationEmailCreateManyInput[]
+ orgLocationPhone: Prisma.OrgLocationPhoneCreateManyInput[]
+ orgLocationService: Prisma.OrgLocationServiceCreateManyInput[]
+ serviceAccessAttribute: Prisma.ServiceAccessAttributeCreateManyInput[]
+ serviceAttribute: Prisma.ServiceAttributeCreateManyInput[]
+ handledSuggestions: Prisma.SuggestionUpdateManyArgs
+}
+
+const handledSuggestions: string[] = []
+
+const output: Output = {
+ translationKey: [],
+ freeText: [],
+
+ organizationNew: [],
+ organizationUp: [],
+
+ orgLocation: [],
+ orgService: [],
+ orgEmail: [],
+ orgPhone: [],
+ orgWebsite: [],
+
+ attributeSupplement: [],
+
+ serviceArea: [],
+ serviceAreaCountry: [],
+ serviceAreaDist: [],
+
+ orgServiceTag: [],
+
+ organizationAttribute: [],
+ serviceAccessAttribute: [],
+ serviceAttribute: [],
+
+ orgServiceEmail: [],
+ orgServicePhone: [],
+ orgLocationEmail: [],
+ orgLocationPhone: [],
+ orgLocationService: [],
+ handledSuggestions: {
+ where: { organizationId: { in: handledSuggestions } },
+ data: { handled: true },
+ },
+}
+const orgAttributes = [
+ 'asylum-seekers',
+ 'bipoc-comm',
+ 'bipoc-led',
+ 'black-led',
+ 'gender-nc',
+ 'hiv-comm',
+ 'immigrant-comm',
+ 'immigrant-led',
+ 'lgbtq-youth-focus',
+ 'resettled-refugees',
+ 'spanish-speakers',
+ 'trans-comm',
+ 'trans-fem',
+ 'trans-led',
+ 'trans-masc',
+ 'trans-youth-focus',
+]
+const activeCountries = ['UM', 'US', 'MH', 'PW', 'AS', 'MX', 'CA', 'MP', 'GU', 'PR', 'VI']
+
+const attributes = {
+ alertMessage: 'attr_01GYSVX1NAMR6RDV6M69H4KN3T',
+ serviceAccess: {
+ email: 'attr_01GW2HHFVKFM4TDY4QRK4AR2ZW',
+ phone: 'attr_01GW2HHFVMKTFWCKBVVFJ5GMY0',
+ file: 'attr_01GW2HHFVKMRHFD8SMDAZM3SSM',
+ link: 'attr_01GW2HHFVMYXMS8ARA3GE7HZFD',
+ },
+ 'at-capacity': 'attr_01GW2HHFV3YJ2AWADHVKG79BQ0',
+ 'cost-fees': 'attr_01GW2HHFVGWKWB53HWAAHQ9AAZ',
+ 'cost-free': 'attr_01GW2HHFVGDTNW9PDQNXK6TF1T',
+ 'elig-age-min': 'attr_01GW2HHFVGSAZXGR4JAVHEK6ZC',
+ 'elig-age-max': 'attr_01GW2HHFVGSAZXGR4JAVHEK6ZC',
+ 'has-confidentiality-policy': 'attr_01GW2HHFV3BADK80TG0DXXFPMM',
+ 'lang-offered': 'attr_01GW2HHFVJ8K180CNX339BTXM2',
+ 'offers-remote-services': 'attr_01GW2HHFV5Q7XN2ZNTYFR1AD3M',
+ 'other-describe': 'attr_01GW2HHFVJDKVF1HV7559CNZCY',
+ 'req-medical-insurance': 'attr_01GW2HHFVH9DPBZ968VXGE50E7',
+ 'req-photo-id': 'attr_01GW2HHFVHZ599M48CMSPGDCSC',
+ 'req-proof-of-age': 'attr_01GW2HHFVH0GQK0GAJR5D952V3',
+ 'req-proof-of-income': 'attr_01GW2HHFVHEVX4PMNN077ASQMG',
+ 'req-referral': 'attr_01GW2HHFVJH8MADHYTHBV54CER',
+}
+
+const serviceAttributes = {
+ boolean: [
+ 'at-capacity',
+ 'cost-free',
+ 'has-confidentiality-policy',
+ 'offers-remote-services',
+ 'req-medical-insurance',
+ 'req-photo-id',
+ 'req-proof-of-age',
+ 'req-proof-of-income',
+ 'req-referral',
+ ],
+ cost: ['cost-fees'],
+ age: ['elig-age-max', 'elig-age-min'],
+ languages: ['lang-offered'],
+ text: ['other-describe'],
+ all: [
+ 'at-capacity',
+ 'cost-free',
+ 'has-confidentiality-policy',
+ 'offers-remote-services',
+ 'req-medical-insurance',
+ 'req-photo-id',
+ 'req-proof-of-age',
+ 'req-proof-of-income',
+ 'req-referral',
+ 'cost-fees',
+ 'elig-age-max',
+ 'elig-age-min',
+ 'lang-offered',
+ 'other-describe',
+ ],
+} as const
+const zServAccess = zAccessInstructions.getAll()
+const prep = async () => {
+ const attributes = await prisma.attribute.findMany({ select: { id: true, tag: true } })
+ const attributeMap = new Map(attributes.map(({ id, tag }) => [tag, id]))
+ const countries = await prisma.country.findMany({ select: { id: true, cca2: true } })
+ const countryMap = new Map(countries.map(({ cca2, id }) => [id, cca2]))
+ const govDist = await prisma.govDist.findMany({
+ select: { id: true, abbrev: true },
+ where: { isPrimary: true },
+ })
+ const govDistMap = new Map(govDist.map(({ abbrev, id }) => [id, abbrev]))
+
+ return { attributeMap, countryMap, govDistMap }
+}
+
+function throttleApiCalls(fn: () => Promise): () => Promise {
+ let count = 0
+ const interval = 1000 // 1 second
+
+ return async function apiCall() {
+ if (count >= 5) {
+ await new Promise((resolve) => setTimeout(resolve, interval))
+ count = 0
+ }
+
+ count++
+ return await fn()
+ }
+}
+
+const run = async () => {
+ const { attributeMap, countryMap, govDistMap } = await prep()
+ for (const org of data.organization) {
+ const isNew = !isIdFor('organization', org.id)
+ const orgId = isNew ? generateId('organization') : org.id
+ if (!org['reviewed?']) {
+ console.info(`Skipping ${org.Name} (${org.id}) --> Not ready for upload`)
+ continue
+ }
+ console.info(`Processing ${org.id} -- ${org.Name}`)
+ if (!isNew) {
+ handledSuggestions.push(orgId)
+ }
+ const orgData: Prisma.OrganizationUncheckedUpdateInput | Prisma.OrganizationCreateManyInput = {}
+ orgData.name = org.Name.trim()
+ orgData.slug = await generateUniqueSlug({ name: orgData.name, id: orgId })
+ orgData.sourceId = 'srce_01GXD88N4X2XNE3DW0G1AZJ403'
+ orgData.lastVerified = new Date()
+ orgData.published = true
+
+ if (org.Description) {
+ const desc = generateFreeText({ orgId, text: org.Description.trim(), type: 'orgDesc' })
+ output.translationKey.push(desc.translationKey)
+ output.freeText.push(desc.freeText)
+ orgData.descriptionId = desc.freeText.id
+ }
+ if (org['Alert Message']) {
+ const suppId = generateId('attributeSupplement')
+ const alertMsg = generateFreeText({
+ orgId,
+ text: org['Alert Message'].trim(),
+ type: 'attSupp',
+ itemId: suppId,
+ })
+ output.organizationAttribute.push({ attributeId: attributes.alertMessage, organizationId: orgId })
+ output.translationKey.push(alertMsg.translationKey)
+ output.freeText.push(alertMsg.freeText)
+ output.attributeSupplement.push({
+ id: suppId,
+ organizationAttributeOrganizationId: orgId,
+ organizationAttributeAttributeId: attributes.alertMessage,
+ textId: alertMsg.freeText.id,
+ })
+ }
+ for (const attrib of orgAttributes) {
+ if (org[attrib]) {
+ const attributeId = attributeMap.get(attrib)
+ if (!attributeId) continue
+ output.organizationAttribute.push({ attributeId, organizationId: orgId })
+ }
+ }
+
+ if (isNew) {
+ const orgOut = Prisma.validator()(
+ orgData as NonNullable
+ ) as Prisma.OrganizationCreateManyInput
+ output.organizationNew.push({ id: orgId, ...orgOut })
+ } else {
+ const orgOut = Prisma.validator()({
+ where: { id: orgId },
+ data: orgData,
+ })
+ output.organizationUp.push(orgOut)
+ }
+
+ if (org.URL) {
+ output.orgWebsite.push({
+ url: org.URL,
+ organizationId: orgId,
+ id: generateId('orgWebsite'),
+ })
+ }
+
+ const locations = data.orgLocation.filter(({ organizationId }) => organizationId === org.id)
+
+ for (const loc of locations) {
+ const orgLocationId = generateId('orgLocation')
+ const locData: Prisma.OrgLocationCreateManyInput = {
+ id: orgLocationId,
+ orgId,
+ name: loc['Location Name'].trim(),
+ street1: loc.Street,
+ city: loc.City?.trim() ?? '',
+ countryId: loc.Country,
+ govDistId: loc.State,
+ postCode: loc.PostalCode,
+ notVisitable: loc['Hide Location?'],
+ mapCityOnly: loc['Hide Location?'],
+ }
+ const cca2 = countryMap.get(loc.Country)
+ const govDistAbbrev = govDistMap.get(loc.State ?? '')
+ if (loc.City && cca2) {
+ const searchString = compact([
+ locData.street1,
+ locData.city,
+ govDistAbbrev,
+ locData.postCode,
+ cca2,
+ ]).join(', ')
+
+ const searchParams = new URLSearchParams({
+ text: searchString,
+ format: 'json',
+ apiKey: process.env.GEOAPIFY_API_KEY as string,
+ filter: `countrycode:${activeCountries.join(',').toLowerCase()}`,
+ })
+ const geoURL = `https://api.geoapify.com/v1/geocode/search?${searchParams.toString()}`
+ const geoResponse = await throttleApiCalls(async () => await fetch(geoURL))()
+ const geoData = await geoResponse.json()
+ const geoResult = geoData.results.length ? geoData.results[0] : null
+ locData.latitude = geoResult?.lat
+ locData.longitude = geoResult?.lon
+ if (loc['Service Area Coverage - State(s)'] || loc['Service Area Coverage - USA National']) {
+ const serviceAreaId = generateId('serviceArea')
+ output.serviceArea.push({
+ id: serviceAreaId,
+ orgLocationId: locData.id,
+ })
+ for (const country of loc['Service Area Coverage - USA National'] ?? []) {
+ output.serviceAreaCountry.push({ serviceAreaId, countryId: country.trim() })
+ }
+ for (const dist of loc['Service Area Coverage - State(s)'] ?? []) {
+ output.serviceAreaDist.push({ serviceAreaId, govDistId: dist.trim() })
+ }
+ }
+ }
+ output.orgLocation.push(locData)
+
+ const linkedPhones = joins.orgLocationPhone
+ .filter(({ locationId }) => locationId === loc.id)
+ .map(({ phoneId }) => phoneId)
+ const unlinkedPhones =
+ locations.length === 1
+ ? data.orgPhone.filter(({ organizationId }) => organizationId === org.id).map(({ id }) => id)
+ : []
+ const phonesToLink = new Set([...linkedPhones, ...unlinkedPhones])
+
+ for (const phnLink of phonesToLink) {
+ const phone = data.orgPhone.find(({ id }) => id === phnLink)
+ if (!phone) throw new Error(`Phone not found -- ${phnLink}`)
+ if (!output.orgPhone.find(({ legacyId }) => legacyId === phone.id)) {
+ const newId = generateId('orgPhone')
+ const cca2val = cca2 ?? 'US'
+ const countrycode = isSupportedCountry(cca2val) ? cca2val : 'US'
+ const parsedPhone = parsePhoneNumberWithError(
+ compact([phone.number, phone.ext]).join(' ').trim(),
+ countrycode
+ )
+ const phoneDesc = generateFreeText({
+ orgId,
+ type: 'phoneDesc',
+ itemId: newId,
+ text: phone.description,
+ })
+ output.translationKey.push(phoneDesc.translationKey)
+ output.freeText.push(phoneDesc.freeText)
+ output.orgPhone.push({
+ id: newId,
+ legacyId: phone.id,
+ countryId: locData.countryId,
+ number: parsedPhone.nationalNumber,
+ ext: parsedPhone.ext,
+ descriptionId: phoneDesc.freeText.id,
+ })
+ output.orgLocationPhone.push({ orgLocationId, phoneId: newId })
+ } else {
+ const phoneDbRecord = output.orgPhone.find(({ legacyId }) => legacyId === phone.id)
+ if (phoneDbRecord?.id) {
+ output.orgLocationPhone.push({ orgLocationId, phoneId: phoneDbRecord.id })
+ }
+ }
+ }
+ const emailsToLink = joins.orgLocationEmail.filter(({ locationId }) => locationId === loc.id)
+ for (const emailLink of emailsToLink) {
+ const email = data.orgEmail.find(({ id }) => id === emailLink.emailId)
+ if (!email) throw new Error(`Email not found -- ${emailLink.emailId}`)
+ if (!output.orgEmail.find(({ legacyId }) => legacyId === email.id)) {
+ const newId = generateId('orgEmail')
+ const emailData: Prisma.OrgEmailCreateManyInput = {
+ id: newId,
+ legacyId: email.id,
+ email: email.email,
+ }
+ if (email.description) {
+ const emailDesc = generateFreeText({
+ orgId,
+ type: 'emailDesc',
+ itemId: newId,
+ text: email.description,
+ })
+ output.translationKey.push(emailDesc.translationKey)
+ output.freeText.push(emailDesc.freeText)
+ }
+ output.orgEmail.push(emailData)
+ output.orgLocationEmail.push({ orgLocationId, orgEmailId: newId })
+ } else {
+ const emailDbRecord = output.orgEmail.find(({ legacyId }) => legacyId === email.id)
+ if (emailDbRecord?.id) {
+ output.orgLocationEmail.push({ orgLocationId, orgEmailId: emailDbRecord.id })
+ }
+ }
+ }
+ const servicesToLink = joins.orgLocationService.filter(({ locationId }) => locationId === loc.id)
+ for (const svc of servicesToLink) {
+ const serv = data.orgService.find(({ id }) => id === svc.serviceId)
+ if (!serv) {
+ console.error(`Service not found -- ${svc.serviceId}`)
+ continue
+ }
+ if (!output.orgService.find(({ legacyId }) => legacyId === serv.id)) {
+ const newId = generateId('orgService')
+ const servName = generateFreeText({ orgId, type: 'svcName', itemId: newId, text: serv.Title })
+ const servDesc = generateFreeText({
+ orgId,
+ type: 'svcDesc',
+ itemId: newId,
+ text: serv.Description,
+ })
+ output.translationKey.push(servName.translationKey)
+ output.translationKey.push(servDesc.translationKey)
+ output.freeText.push(servName.freeText)
+ output.freeText.push(servDesc.freeText)
+ output.orgService.push({
+ id: newId,
+ legacyId: serv.id,
+ serviceNameId: servName.freeText.id,
+ organizationId: orgId,
+ descriptionId: servDesc.freeText.id,
+ published: true,
+ })
+ for (const { tag } of serv['Tag(s)'] ?? []) {
+ output.orgServiceTag.push({ serviceId: newId, tagId: tag.trim() })
+ }
+ output.orgLocationService.push({ orgLocationId, serviceId: newId })
+
+ //
+ // Attributes
+ //
+ const serviceAccessToAdd = data.svcAccess.filter(({ serviceId }) => serviceId === serv.id)
+ for (const sa of serviceAccessToAdd) {
+ const saSupplementId = generateId('attributeSupplement')
+ if (sa.type === '') continue
+ const attributeId = attributes.serviceAccess[sa.type]
+ output.attributeSupplement.push({
+ id: saSupplementId,
+ serviceAccessAttributeAttributeId: attributeId,
+ serviceAccessAttributeServiceId: newId,
+ data: JsonInputOrNull.parse(
+ superjson.serialize(
+ zServAccess.parse({
+ access_type: sa.type,
+ access_value: sa.value,
+ })
+ )
+ ),
+ })
+ output.serviceAccessAttribute.push({ attributeId, serviceId: newId })
+ }
+
+ for (const tag of serviceAttributes.all) {
+ if (Object.keys(serv).includes(tag) && serv[tag]) {
+ const attributeId = attributes[tag]
+ if (!attributeId) throw new Error(`Unknown attribute -> ${tag}`)
+ switch (tag) {
+ case 'other-describe':
+ case 'cost-fees': {
+ const supplementId = generateId('attributeSupplement')
+ const content = serv[tag]
+ if (typeof content !== 'string') break
+ const text = generateFreeText({
+ orgId,
+ type: 'attSupp',
+ itemId: supplementId,
+ text: content,
+ })
+ output.translationKey.push(text.translationKey)
+ output.freeText.push(text.freeText)
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ textId: text.freeText.id,
+ })
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ break
+ }
+ case 'elig-age-max':
+ case 'elig-age-min': {
+ if (tag === 'elig-age-min' && typeof serv['elig-age-max'] === 'number') {
+ const supplementId = generateId('attributeSupplement')
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ data: JsonInputOrNull.parse(
+ superjson.serialize({ min: serv['elig-age-min'], max: serv['elig-age-max'] })
+ ),
+ })
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ } else if (tag === 'elig-age-max' && typeof serv['elig-age-min'] === 'number') {
+ break
+ } else {
+ const supplementId = generateId('attributeSupplement')
+ const data = {
+ ...(serv['elig-age-min'] ? { min: serv['elig-age-min'] } : {}),
+ ...(serv['elig-age-max'] ? { max: serv['elig-age-max'] } : {}),
+ }
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ data: JsonInputOrNull.parse(superjson.serialize(data)),
+ })
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ }
+ break
+ }
+ case 'lang-offered': {
+ if (!serv['lang-offered']) break
+ const langs = serv['lang-offered']
+ for (const langId of langs) {
+ const supplementId = generateId('attributeSupplement')
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ languageId: langId,
+ })
+ }
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ break
+ }
+ default: {
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ }
+ }
+ }
+ }
+
+ const phonesToLink = joins.orgServicePhone.filter(({ serviceId }) => serviceId === serv.id)
+ const emailsToLink = joins.orgServiceEmail.filter(({ serviceId }) => serviceId === serv.id)
+ for (const phn of phonesToLink) {
+ const phoneDbRecord = output.orgPhone.find(({ legacyId }) => legacyId === phn.phoneId)
+ if (phoneDbRecord?.id) {
+ output.orgServicePhone.push({ serviceId: newId, orgPhoneId: phoneDbRecord.id })
+ }
+ }
+ for (const eml of emailsToLink) {
+ const emailDbRecord = output.orgEmail.find(({ legacyId }) => legacyId === eml.emailId)
+ if (emailDbRecord?.id) {
+ output.orgServiceEmail.push({ serviceId: newId, orgEmailId: emailDbRecord.id })
+ }
+ }
+ } else {
+ // Service record has already been created
+ const serviceDbRecord = output.orgService.find(({ legacyId }) => legacyId === serv.id)
+ if (serviceDbRecord?.id) {
+ output.orgLocationService.push({ orgLocationId, serviceId: serviceDbRecord.id })
+ if (serviceDbRecord.legacyId) {
+ const phonesToLink = joins.orgServicePhone.filter(
+ ({ serviceId }) => serviceId === serviceDbRecord.legacyId
+ )
+ const emailsToLink = joins.orgServiceEmail.filter(
+ ({ serviceId }) => serviceId === serviceDbRecord.legacyId
+ )
+ for (const phn of phonesToLink) {
+ const phoneDbRecord = output.orgPhone.find(({ legacyId }) => legacyId === phn.phoneId)
+ if (phoneDbRecord?.id) {
+ output.orgServicePhone.push({ serviceId: serviceDbRecord.id, orgPhoneId: phoneDbRecord.id })
+ }
+ }
+ for (const eml of emailsToLink) {
+ const emailDbRecord = output.orgEmail.find(({ legacyId }) => legacyId === eml.emailId)
+ if (emailDbRecord?.id) {
+ output.orgServiceEmail.push({ serviceId: serviceDbRecord.id, orgEmailId: emailDbRecord.id })
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ fs.writeFileSync(path.resolve(__dirname, 'data.json'), JSON.stringify(output))
+}
+
+run()
diff --git a/packages/db/prisma/data-migrations/2023-11-17_data-load/!schemas.ts b/packages/db/prisma/data-migrations/2023-11-17_data-load/!schemas.ts
new file mode 100644
index 0000000000..0467be15f5
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-17_data-load/!schemas.ts
@@ -0,0 +1,169 @@
+import { string, z } from 'zod'
+
+const stripEmptyString = (val?: string) => (typeof val === 'string' && val === '' ? undefined : val)
+const boolOrBlank = z.enum(['FALSE', 'TRUE', '']).transform((val) => (val === 'TRUE' ? true : false))
+
+const stringToArray = (val?: string) =>
+ (typeof val === 'string' && val === '') || val === undefined
+ ? undefined
+ : val.split(',').map((x) => x.trim())
+
+const separateServiceTags = (val?: string) => {
+ const arr = stringToArray(val)
+ if (!arr) return undefined
+ const output: { category: string; tag: string }[] = []
+ for (const item of arr) {
+ const [category, tag] = item.split(':')
+ if (typeof category === 'string' && typeof tag === 'string') {
+ output.push({ category, tag })
+ }
+ }
+ return output
+}
+const coerceNumber = (val?: string) => {
+ const stripped = stripEmptyString(val)
+ if (stripped) {
+ return parseInt(stripped)
+ }
+ return undefined
+}
+export const DataSchema = {
+ Organization: z.object({
+ id: z.string(),
+ Name: z.string(),
+ URL: z.string().optional().transform(stripEmptyString),
+ Description: z.string(),
+ 'Alert Message': z.string().optional().transform(stripEmptyString),
+ 'bipoc-led': boolOrBlank,
+ 'black-led': boolOrBlank,
+ 'bipoc-comm': boolOrBlank,
+ 'immigrant-led': boolOrBlank,
+ 'immigrant-comm': boolOrBlank,
+ 'asylum-seekers': boolOrBlank,
+ 'resettled-refugees': boolOrBlank,
+ 'trans-led': boolOrBlank,
+ 'trans-comm': boolOrBlank,
+ 'trans-youth-focus': boolOrBlank,
+ 'trans-masc': boolOrBlank,
+ 'trans-fem': boolOrBlank,
+ 'gender-nc': boolOrBlank,
+ 'lgbtq-youth-focus': boolOrBlank,
+ 'spanish-speakers': boolOrBlank,
+ 'hiv-comm': boolOrBlank,
+ 'Additional Notes': z.string().optional().transform(stripEmptyString),
+ 'reviewed?': boolOrBlank,
+ }),
+
+ OrgEmail: z.object({
+ id: z.string(),
+ firstName: z.string().optional().transform(stripEmptyString),
+ lastName: z.string().optional().transform(stripEmptyString),
+ primary: boolOrBlank,
+ email: z.string().email(),
+ description: z.string().optional().transform(stripEmptyString),
+ organizationId: z.string(),
+ locationOnly: boolOrBlank,
+ serviceOnly: boolOrBlank,
+ }),
+
+ SvcAccess: z.object({
+ id: z.string(),
+ serviceId: z.string(),
+ type: z.enum(['email', 'phone', 'file', 'link', '']),
+ value: z.string(),
+ }),
+ OrgPhone: z.object({
+ id: z.string(),
+ number: z.string(),
+ ext: z.string().optional().transform(stripEmptyString),
+ primary: boolOrBlank,
+ countryId: z.string().optional().transform(stripEmptyString),
+ description: z.string(),
+ organizationId: z.string(),
+ }),
+ OrgLocation: z.object({
+ id: z.string(),
+ organizationId: z.string(),
+ 'Location Name': z.string(),
+ Country: z.string(),
+ Street: z.string().optional().transform(stripEmptyString),
+ City: z.string().optional().transform(stripEmptyString),
+ State: z.string().optional().transform(stripEmptyString),
+ PostalCode: z.string().optional().transform(stripEmptyString),
+ 'Hide Location?': boolOrBlank,
+ 'Service Area Coverage - USA National': z
+ .string()
+ .optional()
+ .transform((val) => stringToArray(val)),
+ 'Service Area Coverage - State(s)': z
+ .string()
+ .optional()
+ .transform((val) => stringToArray(val)),
+ }),
+ OrgSocial: z.object({
+ id: z.string(),
+ organizationId: z.string(),
+ service: z.string(),
+ url: z.string().url(),
+ }),
+ OrgService: z.object({
+ id: z.string(),
+ organizationId: z.string(),
+ Title: z.string(),
+ Description: z.string(),
+ 'Tag(s)': z.string().optional().transform(separateServiceTags),
+ 'other-describe': z.string().optional().transform(stripEmptyString),
+ 'elig-age-min': z.string().optional().transform(coerceNumber),
+ 'elig-age-max': z.string().optional().transform(coerceNumber),
+ 'cost-free': boolOrBlank,
+ 'cost-fees': z.string().optional().transform(coerceNumber),
+ 'lang-offered': z.string().optional().transform(stringToArray),
+ 'has-confidentiality-policy': boolOrBlank,
+ 'offers-remote-services': boolOrBlank,
+ 'req-medical-insurance': boolOrBlank,
+ 'req-photo-id': boolOrBlank,
+ 'req-proof-of-age': boolOrBlank,
+ 'req-proof-of-income': boolOrBlank,
+ 'req-referral': boolOrBlank,
+ 'at-capacity': boolOrBlank,
+ }),
+}
+export const DataFile = z.object({
+ organization: DataSchema.Organization.array(),
+ orgEmail: DataSchema.OrgEmail.array(),
+ svcAccess: DataSchema.SvcAccess.array(),
+ orgPhone: DataSchema.OrgPhone.array(),
+ orgLocation: DataSchema.OrgLocation.array(),
+ orgSocial: DataSchema.OrgSocial.array(),
+ orgService: DataSchema.OrgService.array(),
+})
+
+export const JoinSchema = {
+ OrgServicePhone: z.object({
+ serviceId: z.string(),
+ phoneId: z.string(),
+ }),
+ OrgServiceEmail: z.object({
+ serviceId: z.string(),
+ emailId: z.string(),
+ }),
+ OrgLocationEmail: z.object({
+ locationId: z.string(),
+ emailId: z.string(),
+ }),
+ OrgLocationService: z.object({
+ locationId: z.string(),
+ serviceId: z.string(),
+ }),
+ OrgLocationPhone: z.object({
+ locationId: z.string(),
+ phoneId: z.string(),
+ }),
+}
+export const JoinFile = z.object({
+ orgServicePhone: JoinSchema.OrgServicePhone.array(),
+ orgServiceEmail: JoinSchema.OrgServiceEmail.array(),
+ orgLocationEmail: JoinSchema.OrgLocationEmail.array(),
+ orgLocationService: JoinSchema.OrgLocationService.array(),
+ orgLocationPhone: JoinSchema.OrgLocationPhone.array(),
+})
diff --git a/packages/db/prisma/data-migrations/2023-11-17_data-load/index.ts b/packages/db/prisma/data-migrations/2023-11-17_data-load/index.ts
new file mode 100644
index 0000000000..bca87615ea
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-17_data-load/index.ts
@@ -0,0 +1,154 @@
+import { prisma } from '~db/client'
+import { downloadFromDatastore, formatMessage } from '~db/prisma/common'
+import { type MigrationJob } from '~db/prisma/dataMigrationRunner'
+import { createLogger, type JobDef, jobPostRunner } from '~db/prisma/jobPreRun'
+
+import { type Output } from './!prep'
+
+/** Define the job metadata here. */
+const jobDef: JobDef = {
+ jobId: '2023-11-17-data-load',
+ title: 'Data load',
+ createdBy: 'Joe Karow',
+ /** Optional: Longer description for the job */
+ description: undefined,
+}
+/**
+ * Job export - this variable MUST be UNIQUE
+ */
+export const job20231117_data_load = {
+ title: `[${jobDef.jobId}] ${jobDef.title}`,
+ task: async (_ctx, task) => {
+ /** Create logging instance */
+ createLogger(task, jobDef.jobId)
+ const log = (...args: Parameters) => (task.output = formatMessage(...args))
+ /**
+ * Start defining your data migration from here.
+ *
+ * To log output, use `task.output = 'Message to log'`
+ *
+ * This will be written to `stdout` and to a log file in `/prisma/migration-logs/`
+ */
+
+ // Do stuff
+
+ log(`Downloading data from datastore`)
+ const data = (await downloadFromDatastore('migrations/2023-11-17_data-load/data.json', log)) as Output
+ const translationKeys = await prisma.translationKey.createMany({
+ data: data.translationKey,
+ skipDuplicates: true,
+ })
+ log(`Translation Keys -- Submitted: ${data.translationKey.length}, Created: ${translationKeys.count}`)
+ const freeText = await prisma.freeText.createMany({ data: data.freeText, skipDuplicates: true })
+ log(`Free Text -- Submitted: ${data.freeText.length}, Created: ${freeText.count}`)
+
+ const organizationNew = await prisma.organization.createMany({
+ data: data.organizationNew,
+ skipDuplicates: true,
+ })
+ log(`Organizations -- Submitted: ${data.organizationNew.length}, Created: ${organizationNew.count}`)
+ const organizationUp = await prisma.$transaction(
+ data.organizationUp.map((args) => prisma.organization.update(args))
+ )
+ log(`Updated ${organizationUp.length} organization records`)
+
+ const orgLocation = await prisma.orgLocation.createMany({ data: data.orgLocation, skipDuplicates: true })
+ log(`OrgLocation -- Submitted: ${data.orgLocation.length}, Created: ${orgLocation.count}`)
+ const orgService = await prisma.orgService.createMany({ data: data.orgService, skipDuplicates: true })
+ log(`OrgService -- Submitted: ${data.orgService.length}, Created: ${orgService.count}`)
+ const orgEmail = await prisma.orgEmail.createMany({ data: data.orgEmail, skipDuplicates: true })
+ log(`OrgEmail -- Submitted: ${data.orgEmail.length}, Created: ${orgEmail.count}`)
+ const orgPhone = await prisma.orgPhone.createMany({ data: data.orgPhone, skipDuplicates: true })
+ log(`OrgPhone -- Submitted: ${data.orgPhone.length}, Created: ${orgPhone.count}`)
+ const orgWebsite = await prisma.orgWebsite.createMany({ data: data.orgWebsite, skipDuplicates: true })
+ log(`OrgWebsite -- Submitted: ${data.orgWebsite.length}, Created: ${orgWebsite.count}`)
+
+ const serviceArea = await prisma.serviceArea.createMany({ data: data.serviceArea, skipDuplicates: true })
+ log(`ServiceArea -- Submitted: ${data.serviceArea.length}, Created: ${serviceArea.count}`)
+ const serviceAreaCountry = await prisma.serviceAreaCountry.createMany({
+ data: data.serviceAreaCountry,
+ skipDuplicates: true,
+ })
+ log(
+ `ServiceAreaCountry -- Submitted: ${data.serviceAreaCountry.length}, Created: ${serviceAreaCountry.count}`
+ )
+ const serviceAreaDist = await prisma.serviceAreaDist.createMany({
+ data: data.serviceAreaDist,
+ skipDuplicates: true,
+ })
+ log(`ServiceAreaDist -- Submitted: ${data.serviceAreaDist.length}, Created: ${serviceAreaDist.count}`)
+
+ const orgServiceTag = await prisma.orgServiceTag.createMany({
+ data: data.orgServiceTag,
+ skipDuplicates: true,
+ })
+ log(`OrgServiceTag -- Submitted: ${data.orgServiceTag.length}, Created: ${orgServiceTag.count}`)
+
+ const organizationAttribute = await prisma.organizationAttribute.createMany({
+ data: data.organizationAttribute,
+ skipDuplicates: true,
+ })
+ log(
+ `OrganizationAttribute -- Submitted: ${data.organizationAttribute.length}, Created: ${organizationAttribute.count}`
+ )
+ const serviceAttribute = await prisma.serviceAttribute.createMany({
+ data: data.serviceAttribute,
+ skipDuplicates: true,
+ })
+ log(`ServiceAttribute -- Submitted: ${data.serviceAttribute.length}, Created: ${serviceAttribute.count}`)
+ const serviceAccessAttribute = await prisma.serviceAccessAttribute.createMany({
+ data: data.serviceAccessAttribute,
+ skipDuplicates: true,
+ })
+ log(
+ `ServiceAccessAttribute -- Submitted: ${data.serviceAccessAttribute.length}, Created: ${serviceAccessAttribute.count}`
+ )
+
+ const attributeSupplement = await prisma.attributeSupplement.createMany({
+ data: data.attributeSupplement,
+ skipDuplicates: true,
+ })
+ log(
+ `AttributeSupplement -- Submitted: ${data.attributeSupplement.length}, Created: ${attributeSupplement.count}`
+ )
+
+ const orgServiceEmail = await prisma.orgServiceEmail.createMany({
+ data: data.orgServiceEmail,
+ skipDuplicates: true,
+ })
+ log(`OrgServiceEmail -- Submitted: ${data.orgServiceEmail.length}, Created: ${orgServiceEmail.count}`)
+ const orgServicePhone = await prisma.orgServicePhone.createMany({
+ data: data.orgServicePhone,
+ skipDuplicates: true,
+ })
+ log(`OrgServicePhone -- Submitted: ${data.orgServicePhone.length}, Created: ${orgServicePhone.count}`)
+ const orgLocationEmail = await prisma.orgLocationEmail.createMany({
+ data: data.orgLocationEmail,
+ skipDuplicates: true,
+ })
+ log(`OrgLocationEmail -- Submitted: ${data.orgLocationEmail.length}, Created: ${orgLocationEmail.count}`)
+ const orgLocationPhone = await prisma.orgLocationPhone.createMany({
+ data: data.orgLocationPhone,
+ skipDuplicates: true,
+ })
+ log(`OrgLocationPhone -- Submitted: ${data.orgLocationPhone.length}, Created: ${orgLocationPhone.count}`)
+ const orgLocationService = await prisma.orgLocationService.createMany({
+ data: data.orgLocationService,
+ skipDuplicates: true,
+ })
+ log(
+ `OrgLocationService -- Submitted: ${data.orgLocationService.length}, Created: ${orgLocationService.count}`
+ )
+
+ const handledSuggestions = await prisma.suggestion.updateMany(data.handledSuggestions)
+ log(`Marked ${handledSuggestions.count} suggestions as 'handled'`)
+
+ /**
+ * DO NOT REMOVE BELOW
+ *
+ * This writes a record to the DB to register that this migration has run successfully.
+ */
+ await jobPostRunner(jobDef)
+ },
+ def: jobDef,
+} satisfies MigrationJob
diff --git a/packages/db/prisma/data-migrations/2023-11-20_fix-listing.ts b/packages/db/prisma/data-migrations/2023-11-20_fix-listing.ts
new file mode 100644
index 0000000000..6b75638e98
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-20_fix-listing.ts
@@ -0,0 +1,61 @@
+import { prisma } from '~db/client'
+import { formatMessage } from '~db/prisma/common'
+import { type MigrationJob } from '~db/prisma/dataMigrationRunner'
+import { createLogger, type JobDef, jobPostRunner } from '~db/prisma/jobPreRun'
+
+/** Define the job metadata here. */
+const jobDef: JobDef = {
+ jobId: '2023-11-20-fix-listing',
+ title: 'fix listing',
+ createdBy: 'Joe Karow',
+ /** Optional: Longer description for the job */
+ description: undefined,
+}
+/**
+ * Job export - this variable MUST be UNIQUE
+ */
+export const job20231120_fix_listing = {
+ title: `[${jobDef.jobId}] ${jobDef.title}`,
+ task: async (_ctx, task) => {
+ /** Create logging instance */
+ createLogger(task, jobDef.jobId)
+ const log = (...args: Parameters) => (task.output = formatMessage(...args))
+ /**
+ * Start defining your data migration from here.
+ *
+ * To log output, use `task.output = 'Message to log'`
+ *
+ * This will be written to `stdout` and to a log file in `/prisma/migration-logs/`
+ */
+
+ // Do stuff
+
+ const orgLocationId = 'oloc_01H299KEBZ3ZVF1653PXJ3MEH5'
+ const services = [
+ 'osvc_01H299KEC0MRBCN9RGRGVVM2FY',
+ 'osvc_01H299KEC2JDB0PSYJR94ZYHY8',
+ 'osvc_01H299KEC4NRQE5C15W0R42SAA',
+ 'osvc_01H299KEC66C1ZZ0BYENYEWCS3',
+ ]
+
+ const updateServices = await prisma.orgLocationService.createMany({
+ data: services.map((serviceId) => ({ serviceId, orgLocationId })),
+ skipDuplicates: true,
+ })
+ log(`Created ${updateServices.count} orgLocationService records`)
+
+ const updateLocation = await prisma.orgLocation.update({
+ where: { id: 'oloc_01H299KEBZ3ZVF1653PXJ3MEH5' },
+ data: { published: true, mapCityOnly: true, notVisitable: true },
+ })
+ log(`Updated orgLocation ${updateLocation.id}`)
+
+ /**
+ * DO NOT REMOVE BELOW
+ *
+ * This writes a record to the DB to register that this migration has run successfully.
+ */
+ await jobPostRunner(jobDef)
+ },
+ def: jobDef,
+} satisfies MigrationJob
diff --git a/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!check.ts b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!check.ts
new file mode 100644
index 0000000000..568e585788
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!check.ts
@@ -0,0 +1,32 @@
+import fs from 'fs'
+import path from 'path'
+
+import { prisma } from '~db/client'
+
+const data = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'phone.json'), 'utf8'))
+
+const run = async () => {
+ const phoneIds = new Set()
+ const phoneLegacy = new Set()
+ const serviceIds = new Set()
+ const locationIds = new Set()
+ for (const { id, legacyId } of data.orgPhone) {
+ phoneIds.add(id)
+ phoneLegacy.add(legacyId)
+ }
+ for (const { serviceId } of data.orgServicePhone) {
+ serviceIds.add(serviceId)
+ }
+ for (const { orgLocationId } of data.orgLocationPhone) {
+ locationIds.add(orgLocationId)
+ }
+ const countPhones = await prisma.orgPhone.count({
+ where: { OR: [{ id: { in: [...phoneIds] } }, { legacyId: { in: [...phoneLegacy] } }] },
+ })
+ const countServices = await prisma.orgService.count({ where: { id: { in: [...serviceIds] } } })
+ const countLocations = await prisma.orgLocation.count({ where: { id: { in: [...locationIds] } } })
+ console.log('phones', countPhones, phoneIds.size)
+ console.log('services', countServices, serviceIds.size)
+ console.log('locations', countLocations, locationIds.size)
+}
+run()
diff --git a/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!load.ts b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!load.ts
new file mode 100644
index 0000000000..374f0045ac
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!load.ts
@@ -0,0 +1,113 @@
+/* eslint-disable node/no-process-env */
+import { JWT } from 'google-auth-library'
+import { GoogleSpreadsheet } from 'google-spreadsheet'
+import PQueue from 'p-queue'
+import PRetry from 'p-retry'
+import papa from 'papaparse'
+
+import fs from 'fs'
+import path from 'path'
+
+const creds = JSON.parse(process.env.GOOGLE_SERVICE_ACCT_CREDS as string)
+const scopes = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive.file']
+const jwt = new JWT({
+ email: creds.client_email,
+ key: creds.private_key,
+ scopes,
+})
+const sheetID = '17Egecl5U8_o8Nx8qic5cUE7oD3A8__2KgXilz-7yoMU'
+
+const queue = new PQueue({
+ concurrency: 1,
+ interval: 2250,
+ intervalCap: 1,
+ autoStart: false,
+ carryoverConcurrencyCount: true,
+})
+function sleep(ms: number) {
+ return new Promise((resolve) => setTimeout(resolve, ms))
+}
+const main = async () => {
+ const wb = new GoogleSpreadsheet(sheetID, jwt)
+ await wb.loadInfo()
+
+ const sheetsToGet = {
+ Orgs: 'organization',
+ Emails: 'orgEmail',
+ 'Access Instructions': 'svcAccess',
+ Phones: 'orgPhone',
+ Locations: 'orgLocation',
+ OrgSocial: 'orgSocial',
+ Services: 'orgService',
+ }
+ const joinsToGet = {
+ OrgServicePhone: 'orgServicePhone',
+ OrgServiceEmail: 'orgServiceEmail',
+ OrgLocationEmail: 'orgLocationEmail',
+ OrgLocationService: 'orgLocationService',
+ OrgLocationPhone: 'orgLocationPhone',
+ }
+ const data = {}
+ const joins = {}
+
+ const getData = async (sheetName: string) => {
+ const sheet = wb.sheetsByTitle[sheetName]
+ console.log('Parsing', sheetName)
+ if (!sheet) throw new Error(`Sheet ${sheetName} not found in spreadsheet ${sheetID}`)
+ const csv = await sheet.downloadAsCSV()
+ const parsed = papa.parse(csv.toString(), { header: true, skipEmptyLines: 'greedy' })
+ const dataName = sheetsToGet[sheetName]
+ console.log(sheetName, `returned ${parsed.data.length} rows`)
+ data[dataName] = parsed.data
+ }
+
+ const getJoin = async (joinName: string) => {
+ const sheet = wb.sheetsByTitle[joinName]
+ console.log('Parsing', joinName)
+ if (!sheet) throw new Error(`Sheet ${joinName} not found in spreadsheet ${sheetID}`)
+ const csv = await sheet.downloadAsCSV()
+ const parsed = papa.parse(csv.toString(), { header: true, skipEmptyLines: true })
+ console.log(joinName, `returned ${parsed.data.length} rows`)
+ const dataName = joinsToGet[joinName]
+ joins[dataName] = parsed.data
+ }
+
+ for (const sheetName of Object.keys(sheetsToGet)) {
+ queue.add(async () => {
+ await PRetry(() => getData(sheetName), {
+ onFailedAttempt: async (err) => {
+ console.error(`[${err.attemptNumber}/${err.retriesLeft}] ${err.message} -- Trying again`)
+ // await sleep(5000)
+ },
+ // factor: 3,
+ randomize: true,
+ })
+ })
+ }
+ queue.add(async () => {
+ console.log("Let google catch it's breath")
+ await sleep(5000)
+ })
+
+ for (const joinName of Object.keys(joinsToGet)) {
+ queue.add(async () => {
+ await PRetry(() => getJoin(joinName), {
+ onFailedAttempt: async (err) => {
+ console.error(
+ `[${err.attemptNumber}/${err.retriesLeft}] ${err.message} -- Trying again in 5 seconds`
+ )
+ await sleep(5000)
+ },
+ })
+ })
+ }
+ queue.add(() => {
+ console.log('writing data.json')
+ fs.writeFileSync(path.resolve(__dirname, 'load.json'), JSON.stringify(data))
+ console.log('writing joins.json')
+ fs.writeFileSync(path.resolve(__dirname, 'joins.json'), JSON.stringify(joins))
+ })
+ queue.start()
+}
+
+main()
diff --git a/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!prep.ts b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!prep.ts
new file mode 100644
index 0000000000..7e4b678a22
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!prep.ts
@@ -0,0 +1,584 @@
+/* eslint-disable node/no-process-env */
+import compact from 'just-compact'
+import { isSupportedCountry, parsePhoneNumberWithError } from 'libphonenumber-js'
+import superjson from 'superjson'
+
+import fs from 'fs'
+import path from 'path'
+
+import { Prisma, prisma } from '~db/client'
+import { generateFreeText } from '~db/lib/generateFreeText'
+import { generateId, isIdFor } from '~db/lib/idGen'
+import { generateUniqueSlug } from '~db/lib/slugGen'
+import { JsonInputOrNull, accessInstructions as zAccessInstructions } from '~db/zod_util'
+
+import { DataFile, DataSchema, JoinFile, JoinSchema } from './!schemas'
+
+const data = DataFile.parse(JSON.parse(fs.readFileSync(path.resolve(__dirname, 'load.json'), 'utf8')))
+const joins = JoinFile.parse(JSON.parse(fs.readFileSync(path.resolve(__dirname, 'joins.json'), 'utf8')))
+
+export interface Output {
+ organizationNew: Prisma.OrganizationCreateManyInput[]
+ organizationUp: Prisma.OrganizationUpdateArgs[]
+ organizationAttribute: Prisma.OrganizationAttributeCreateManyInput[]
+ attributeSupplement: Prisma.AttributeSupplementCreateManyInput[]
+ translationKey: Prisma.TranslationKeyCreateManyInput[]
+ freeText: Prisma.FreeTextCreateManyInput[]
+ orgLocation: Prisma.OrgLocationCreateManyInput[]
+ serviceArea: Prisma.ServiceAreaCreateManyInput[]
+ serviceAreaCountry: Prisma.ServiceAreaCountryCreateManyInput[]
+ serviceAreaDist: Prisma.ServiceAreaDistCreateManyInput[]
+ orgService: Prisma.OrgServiceCreateManyInput[]
+ orgServiceTag: Prisma.OrgServiceTagCreateManyInput[]
+ orgEmail: Prisma.OrgEmailCreateManyInput[]
+ orgPhone: Prisma.OrgPhoneCreateManyInput[]
+ orgWebsite: Prisma.OrgWebsiteCreateManyInput[]
+ orgServiceEmail: Prisma.OrgServiceEmailCreateManyInput[]
+ orgServicePhone: Prisma.OrgServicePhoneCreateManyInput[]
+ orgLocationEmail: Prisma.OrgLocationEmailCreateManyInput[]
+ orgLocationPhone: Prisma.OrgLocationPhoneCreateManyInput[]
+ orgLocationService: Prisma.OrgLocationServiceCreateManyInput[]
+ serviceAccessAttribute: Prisma.ServiceAccessAttributeCreateManyInput[]
+ serviceAttribute: Prisma.ServiceAttributeCreateManyInput[]
+ handledSuggestions: Prisma.SuggestionUpdateManyArgs
+}
+
+const handledSuggestions: string[] = []
+
+const output: Output = {
+ translationKey: [],
+ freeText: [],
+
+ organizationNew: [],
+ organizationUp: [],
+
+ orgLocation: [],
+ orgService: [],
+ orgEmail: [],
+ orgPhone: [],
+ orgWebsite: [],
+
+ attributeSupplement: [],
+
+ serviceArea: [],
+ serviceAreaCountry: [],
+ serviceAreaDist: [],
+
+ orgServiceTag: [],
+
+ organizationAttribute: [],
+ serviceAccessAttribute: [],
+ serviceAttribute: [],
+
+ orgServiceEmail: [],
+ orgServicePhone: [],
+ orgLocationEmail: [],
+ orgLocationPhone: [],
+ orgLocationService: [],
+ handledSuggestions: {
+ where: { organizationId: { in: handledSuggestions } },
+ data: { handled: true },
+ },
+}
+const orgAttributes = [
+ 'asylum-seekers',
+ 'bipoc-comm',
+ 'bipoc-led',
+ 'black-led',
+ 'gender-nc',
+ 'hiv-comm',
+ 'immigrant-comm',
+ 'immigrant-led',
+ 'lgbtq-youth-focus',
+ 'resettled-refugees',
+ 'spanish-speakers',
+ 'trans-comm',
+ 'trans-fem',
+ 'trans-led',
+ 'trans-masc',
+ 'trans-youth-focus',
+]
+const activeCountries = ['UM', 'US', 'MH', 'PW', 'AS', 'MX', 'CA', 'MP', 'GU', 'PR', 'VI']
+
+const attributes = {
+ alertMessage: 'attr_01GYSVX1NAMR6RDV6M69H4KN3T',
+ serviceAccess: {
+ email: 'attr_01GW2HHFVKFM4TDY4QRK4AR2ZW',
+ phone: 'attr_01GW2HHFVMKTFWCKBVVFJ5GMY0',
+ file: 'attr_01GW2HHFVKMRHFD8SMDAZM3SSM',
+ link: 'attr_01GW2HHFVMYXMS8ARA3GE7HZFD',
+ },
+ 'at-capacity': 'attr_01GW2HHFV3YJ2AWADHVKG79BQ0',
+ 'cost-fees': 'attr_01GW2HHFVGWKWB53HWAAHQ9AAZ',
+ 'cost-free': 'attr_01GW2HHFVGDTNW9PDQNXK6TF1T',
+ 'elig-age-min': 'attr_01GW2HHFVGSAZXGR4JAVHEK6ZC',
+ 'elig-age-max': 'attr_01GW2HHFVGSAZXGR4JAVHEK6ZC',
+ 'has-confidentiality-policy': 'attr_01GW2HHFV3BADK80TG0DXXFPMM',
+ 'lang-offered': 'attr_01GW2HHFVJ8K180CNX339BTXM2',
+ 'offers-remote-services': 'attr_01GW2HHFV5Q7XN2ZNTYFR1AD3M',
+ 'other-describe': 'attr_01GW2HHFVJDKVF1HV7559CNZCY',
+ 'req-medical-insurance': 'attr_01GW2HHFVH9DPBZ968VXGE50E7',
+ 'req-photo-id': 'attr_01GW2HHFVHZ599M48CMSPGDCSC',
+ 'req-proof-of-age': 'attr_01GW2HHFVH0GQK0GAJR5D952V3',
+ 'req-proof-of-income': 'attr_01GW2HHFVHEVX4PMNN077ASQMG',
+ 'req-referral': 'attr_01GW2HHFVJH8MADHYTHBV54CER',
+}
+
+const serviceAttributes = {
+ boolean: [
+ 'at-capacity',
+ 'cost-free',
+ 'has-confidentiality-policy',
+ 'offers-remote-services',
+ 'req-medical-insurance',
+ 'req-photo-id',
+ 'req-proof-of-age',
+ 'req-proof-of-income',
+ 'req-referral',
+ ],
+ cost: ['cost-fees'],
+ age: ['elig-age-max', 'elig-age-min'],
+ languages: ['lang-offered'],
+ text: ['other-describe'],
+ all: [
+ 'at-capacity',
+ 'cost-free',
+ 'has-confidentiality-policy',
+ 'offers-remote-services',
+ 'req-medical-insurance',
+ 'req-photo-id',
+ 'req-proof-of-age',
+ 'req-proof-of-income',
+ 'req-referral',
+ 'cost-fees',
+ 'elig-age-max',
+ 'elig-age-min',
+ 'lang-offered',
+ 'other-describe',
+ ],
+} as const
+const zServAccess = zAccessInstructions.getAll()
+const prep = async () => {
+ const attributes = await prisma.attribute.findMany({ select: { id: true, tag: true } })
+ const attributeMap = new Map(attributes.map(({ id, tag }) => [tag, id]))
+ const countries = await prisma.country.findMany({ select: { id: true, cca2: true } })
+ const countryMap = new Map(countries.map(({ cca2, id }) => [id, cca2]))
+ const govDist = await prisma.govDist.findMany({
+ select: { id: true, abbrev: true },
+ where: { isPrimary: true },
+ })
+ const govDistMap = new Map(govDist.map(({ abbrev, id }) => [id, abbrev]))
+
+ return { attributeMap, countryMap, govDistMap }
+}
+
+function throttleApiCalls(fn: () => Promise): () => Promise {
+ let count = 0
+ const interval = 1000 // 1 second
+
+ return async function apiCall() {
+ if (count >= 5) {
+ await new Promise((resolve) => setTimeout(resolve, interval))
+ count = 0
+ }
+
+ count++
+ return await fn()
+ }
+}
+
+const run = async () => {
+ const { attributeMap, countryMap, govDistMap } = await prep()
+ for (const org of data.organization) {
+ const isNew = !isIdFor('organization', org.id)
+ const orgId = isNew ? generateId('organization') : org.id
+ if (org['reviewed?'] !== false) {
+ console.info(`Skipping ${org.Name} (${org.id}) --> Not ready for upload`)
+ continue
+ }
+ console.info(`Processing ${org.id} -- ${org.Name}`)
+ if (!isNew) {
+ handledSuggestions.push(orgId)
+ }
+ const orgData: Prisma.OrganizationUncheckedUpdateInput | Prisma.OrganizationCreateManyInput = {}
+ orgData.name = org.Name.trim()
+ // orgData.slug = await generateUniqueSlug({ name: orgData.name, id: orgId })
+ orgData.sourceId = 'srce_01GXD88N4X2XNE3DW0G1AZJ403'
+ orgData.lastVerified = new Date()
+ orgData.published = true
+
+ if (org.Description) {
+ // const desc = generateFreeText({ orgId, text: org.Description.trim(), type: 'orgDesc' })
+ // output.translationKey.push(desc.translationKey)
+ // output.freeText.push(desc.freeText)
+ // orgData.descriptionId = desc.freeText.id
+ }
+ if (org['Alert Message']) {
+ const suppId = generateId('attributeSupplement')
+ const alertMsg = generateFreeText({
+ orgId,
+ text: org['Alert Message'].trim(),
+ type: 'attSupp',
+ itemId: suppId,
+ })
+ output.organizationAttribute.push({ attributeId: attributes.alertMessage, organizationId: orgId })
+ // output.translationKey.push(alertMsg.translationKey)
+ // output.freeText.push(alertMsg.freeText)
+ output.attributeSupplement.push({
+ id: suppId,
+ organizationAttributeOrganizationId: orgId,
+ organizationAttributeAttributeId: attributes.alertMessage,
+ textId: alertMsg.freeText.id,
+ })
+ }
+ for (const attrib of orgAttributes) {
+ if (org[attrib]) {
+ const attributeId = attributeMap.get(attrib)
+ if (!attributeId) continue
+ output.organizationAttribute.push({ attributeId, organizationId: orgId })
+ }
+ }
+
+ if (isNew) {
+ const orgOut = Prisma.validator()(
+ orgData as NonNullable
+ ) as Prisma.OrganizationCreateManyInput
+ output.organizationNew.push({ id: orgId, ...orgOut })
+ } else {
+ const orgOut = Prisma.validator()({
+ where: { id: orgId },
+ data: orgData,
+ })
+ output.organizationUp.push(orgOut)
+ }
+
+ if (org.URL) {
+ output.orgWebsite.push({
+ url: org.URL,
+ organizationId: orgId,
+ id: generateId('orgWebsite'),
+ })
+ }
+
+ const locations = data.orgLocation.filter(({ organizationId }) => organizationId === org.id)
+
+ for (const loc of locations) {
+ const orgLocationId = isIdFor('orgLocation', loc.id) ? loc.id : generateId('orgLocation')
+ const locData: Prisma.OrgLocationCreateManyInput = {
+ id: orgLocationId,
+ orgId,
+ name: loc['Location Name'].trim(),
+ street1: loc.Street,
+ city: loc.City?.trim() ?? '',
+ countryId: loc.Country,
+ govDistId: loc.State,
+ postCode: loc.PostalCode,
+ notVisitable: loc['Hide Location?'],
+ mapCityOnly: loc['Hide Location?'],
+ }
+ const cca2 = countryMap.get(loc.Country)
+ const govDistAbbrev = govDistMap.get(loc.State ?? '')
+ if (loc.City && cca2) {
+ const searchString = compact([
+ locData.street1,
+ locData.city,
+ govDistAbbrev,
+ locData.postCode,
+ cca2,
+ ]).join(', ')
+
+ const searchParams = new URLSearchParams({
+ text: searchString,
+ format: 'json',
+ apiKey: process.env.GEOAPIFY_API_KEY as string,
+ filter: `countrycode:${activeCountries.join(',').toLowerCase()}`,
+ })
+ const geoURL = `https://api.geoapify.com/v1/geocode/search?${searchParams.toString()}`
+ // const geoResponse = await throttleApiCalls(async () => await fetch(geoURL))()
+ // const geoData = await geoResponse.json()
+ // const geoResult = geoData.results.length ? geoData.results[0] : null
+ // locData.latitude = geoResult?.lat
+ // locData.longitude = geoResult?.lon
+ if (loc['Service Area Coverage - State(s)'] || loc['Service Area Coverage - USA National']) {
+ const serviceAreaId = generateId('serviceArea')
+ output.serviceArea.push({
+ id: serviceAreaId,
+ orgLocationId: locData.id,
+ })
+ for (const country of loc['Service Area Coverage - USA National'] ?? []) {
+ output.serviceAreaCountry.push({ serviceAreaId, countryId: country.trim() })
+ }
+ for (const dist of loc['Service Area Coverage - State(s)'] ?? []) {
+ output.serviceAreaDist.push({ serviceAreaId, govDistId: dist.trim() })
+ }
+ }
+ }
+ output.orgLocation.push(locData)
+
+ const linkedPhones = joins.orgLocationPhone
+ .filter(({ locationId }) => locationId === loc.id)
+ .map(({ phoneId }) => phoneId)
+ const unlinkedPhones =
+ locations.length === 1
+ ? data.orgPhone.filter(({ organizationId }) => organizationId === org.id).map(({ id }) => id)
+ : []
+ const phonesToLink = new Set([...linkedPhones, ...unlinkedPhones])
+
+ for (const phnLink of phonesToLink) {
+ const phone = data.orgPhone.find(({ id }) => id === phnLink)
+ if (!phone) throw new Error(`Phone not found -- ${phnLink}`)
+ if (!output.orgPhone.find(({ legacyId }) => legacyId === phone.id)) {
+ if (isIdFor('orgPhone', phone.id)) continue
+
+ const newId = isIdFor('orgPhone', phone.id) ? phone.id : generateId('orgPhone')
+ const cca2val = cca2 ?? 'US'
+ const countrycode = isSupportedCountry(cca2val) ? cca2val : 'US'
+ const parsedPhone = parsePhoneNumberWithError(
+ compact([phone.number, phone.ext]).join(' ').trim(),
+ countrycode
+ )
+ const phoneDesc = generateFreeText({
+ orgId,
+ type: 'phoneDesc',
+ itemId: newId,
+ text: phone.description,
+ })
+ output.translationKey.push(phoneDesc.translationKey)
+ output.freeText.push(phoneDesc.freeText)
+ output.orgPhone.push({
+ id: newId,
+ legacyId: phone.id,
+ countryId: locData.countryId,
+ number: parsedPhone.nationalNumber,
+ ext: parsedPhone.ext,
+ descriptionId: phoneDesc.freeText.id,
+ })
+ output.orgLocationPhone.push({ orgLocationId, phoneId: newId })
+ } else {
+ const phoneDbRecord = output.orgPhone.find(({ legacyId }) => legacyId === phone.id)
+ if (phoneDbRecord?.id) {
+ output.orgLocationPhone.push({ orgLocationId, phoneId: phoneDbRecord.id })
+ }
+ }
+ }
+ const emailsToLink = joins.orgLocationEmail.filter(({ locationId }) => locationId === loc.id)
+ for (const emailLink of emailsToLink) {
+ const email = data.orgEmail.find(({ id }) => id === emailLink.emailId)
+ if (!email) throw new Error(`Email not found -- ${emailLink.emailId}`)
+ if (!output.orgEmail.find(({ legacyId }) => legacyId === email.id)) {
+ const newId = isIdFor('orgEmail', email.id) ? email.id : generateId('orgEmail')
+ const emailData: Prisma.OrgEmailCreateManyInput = {
+ id: newId,
+ legacyId: email.id,
+ email: email.email,
+ }
+ if (email.description) {
+ const emailDesc = generateFreeText({
+ orgId,
+ type: 'emailDesc',
+ itemId: newId,
+ text: email.description,
+ })
+ // output.translationKey.push(emailDesc.translationKey)
+ // output.freeText.push(emailDesc.freeText)
+ }
+ output.orgEmail.push(emailData)
+ output.orgLocationEmail.push({ orgLocationId, orgEmailId: newId })
+ } else {
+ const emailDbRecord = output.orgEmail.find(({ legacyId }) => legacyId === email.id)
+ if (emailDbRecord?.id) {
+ output.orgLocationEmail.push({ orgLocationId, orgEmailId: emailDbRecord.id })
+ }
+ }
+ }
+ const servicesToLink = joins.orgLocationService.filter(({ locationId }) => locationId === loc.id)
+ for (const svc of servicesToLink) {
+ const serv = data.orgService.find(({ id }) => id === svc.serviceId)
+ if (!serv) {
+ console.error(`Service not found -- ${svc.serviceId}`)
+ continue
+ }
+ if (!output.orgService.find(({ legacyId }) => legacyId === serv.id)) {
+ const newId = isIdFor('orgService', serv.id) ? serv.id : generateId('orgService')
+ const servName = generateFreeText({ orgId, type: 'svcName', itemId: newId, text: serv.Title })
+ const servDesc = generateFreeText({
+ orgId,
+ type: 'svcDesc',
+ itemId: newId,
+ text: serv.Description,
+ })
+ // output.translationKey.push(servName.translationKey)
+ // output.translationKey.push(servDesc.translationKey)
+ // output.freeText.push(servName.freeText)
+ // output.freeText.push(servDesc.freeText)
+ output.orgService.push({
+ id: newId,
+ legacyId: serv.id,
+ serviceNameId: servName.freeText.id,
+ organizationId: orgId,
+ descriptionId: servDesc.freeText.id,
+ published: true,
+ })
+ for (const { tag } of serv['Tag(s)'] ?? []) {
+ output.orgServiceTag.push({ serviceId: newId, tagId: tag.trim() })
+ }
+ output.orgLocationService.push({ orgLocationId, serviceId: newId })
+
+ //
+ // Attributes
+ //
+ const serviceAccessToAdd = data.svcAccess.filter(({ serviceId }) => serviceId === serv.id)
+ for (const sa of serviceAccessToAdd) {
+ const saSupplementId = generateId('attributeSupplement')
+ if (sa.type === '') continue
+ const attributeId = attributes.serviceAccess[sa.type]
+ output.attributeSupplement.push({
+ id: saSupplementId,
+ serviceAccessAttributeAttributeId: attributeId,
+ serviceAccessAttributeServiceId: newId,
+ data: JsonInputOrNull.parse(
+ superjson.serialize(
+ zServAccess.parse({
+ access_type: sa.type,
+ access_value: sa.value,
+ })
+ )
+ ),
+ })
+ output.serviceAccessAttribute.push({ attributeId, serviceId: newId })
+ }
+
+ for (const tag of serviceAttributes.all) {
+ if (Object.keys(serv).includes(tag) && serv[tag]) {
+ const attributeId = attributes[tag]
+ if (!attributeId) throw new Error(`Unknown attribute -> ${tag}`)
+ switch (tag) {
+ case 'other-describe':
+ case 'cost-fees': {
+ const supplementId = generateId('attributeSupplement')
+ const content = serv[tag]
+ if (typeof content !== 'string') break
+ const text = generateFreeText({
+ orgId,
+ type: 'attSupp',
+ itemId: supplementId,
+ text: content,
+ })
+ // output.translationKey.push(text.translationKey)
+ // output.freeText.push(text.freeText)
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ textId: text.freeText.id,
+ })
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ break
+ }
+ case 'elig-age-max':
+ case 'elig-age-min': {
+ if (tag === 'elig-age-min' && typeof serv['elig-age-max'] === 'number') {
+ const supplementId = generateId('attributeSupplement')
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ data: JsonInputOrNull.parse(
+ superjson.serialize({ min: serv['elig-age-min'], max: serv['elig-age-max'] })
+ ),
+ })
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ } else if (tag === 'elig-age-max' && typeof serv['elig-age-min'] === 'number') {
+ break
+ } else {
+ const supplementId = generateId('attributeSupplement')
+ const data = {
+ ...(serv['elig-age-min'] ? { min: serv['elig-age-min'] } : {}),
+ ...(serv['elig-age-max'] ? { max: serv['elig-age-max'] } : {}),
+ }
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ data: JsonInputOrNull.parse(superjson.serialize(data)),
+ })
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ }
+ break
+ }
+ case 'lang-offered': {
+ if (!serv['lang-offered']) break
+ const langs = serv['lang-offered']
+ for (const langId of langs) {
+ const supplementId = generateId('attributeSupplement')
+ output.attributeSupplement.push({
+ id: supplementId,
+ serviceAttributeAttributeId: attributeId,
+ serviceAttributeOrgServiceId: newId,
+ languageId: langId,
+ })
+ }
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ break
+ }
+ default: {
+ output.serviceAttribute.push({ attributeId, orgServiceId: newId, active: true })
+ }
+ }
+ }
+ }
+
+ const phonesToLink = joins.orgServicePhone.filter(({ serviceId }) => serviceId === serv.id)
+ const emailsToLink = joins.orgServiceEmail.filter(({ serviceId }) => serviceId === serv.id)
+ for (const phn of phonesToLink) {
+ const phoneDbRecord = output.orgPhone.find(({ legacyId }) => legacyId === phn.phoneId)
+ if (phoneDbRecord?.id) {
+ output.orgServicePhone.push({ serviceId: newId, orgPhoneId: phoneDbRecord.id })
+ }
+ }
+ for (const eml of emailsToLink) {
+ const emailDbRecord = output.orgEmail.find(({ legacyId }) => legacyId === eml.emailId)
+ if (emailDbRecord?.id) {
+ output.orgServiceEmail.push({ serviceId: newId, orgEmailId: emailDbRecord.id })
+ }
+ }
+ } else {
+ // Service record has already been created
+ const serviceDbRecord = output.orgService.find(({ legacyId }) => legacyId === serv.id)
+ if (serviceDbRecord?.id) {
+ output.orgLocationService.push({ orgLocationId, serviceId: serviceDbRecord.id })
+ if (serviceDbRecord.legacyId) {
+ const phonesToLink = joins.orgServicePhone.filter(
+ ({ serviceId }) => serviceId === serviceDbRecord.legacyId
+ )
+ const emailsToLink = joins.orgServiceEmail.filter(
+ ({ serviceId }) => serviceId === serviceDbRecord.legacyId
+ )
+ for (const phn of phonesToLink) {
+ const phoneDbRecord = output.orgPhone.find(({ legacyId }) => legacyId === phn.phoneId)
+ if (phoneDbRecord?.id) {
+ output.orgServicePhone.push({ serviceId: serviceDbRecord.id, orgPhoneId: phoneDbRecord.id })
+ }
+ }
+ for (const eml of emailsToLink) {
+ const emailDbRecord = output.orgEmail.find(({ legacyId }) => legacyId === eml.emailId)
+ if (emailDbRecord?.id) {
+ output.orgServiceEmail.push({ serviceId: serviceDbRecord.id, orgEmailId: emailDbRecord.id })
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ fs.writeFileSync(path.resolve(__dirname, 'data.json'), JSON.stringify(output))
+ const { orgPhone, orgLocationPhone, orgServicePhone, freeText, translationKey } = output
+ fs.writeFileSync(
+ path.resolve(__dirname, 'phone.json'),
+ JSON.stringify({ orgPhone, orgLocationPhone, orgServicePhone, freeText, translationKey })
+ )
+}
+
+run()
diff --git a/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!schemas.ts b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!schemas.ts
new file mode 100644
index 0000000000..71c490a9e1
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/!schemas.ts
@@ -0,0 +1,171 @@
+import { string, z } from 'zod'
+
+const stripEmptyString = (val?: string) => (typeof val === 'string' && val === '' ? undefined : val)
+const boolOrBlank = z
+ .enum(['FALSE', 'TRUE', ''])
+ .transform((val) => (val === 'TRUE' ? true : val === 'FALSE' ? false : undefined))
+
+const stringToArray = (val?: string) =>
+ (typeof val === 'string' && val === '') || val === undefined
+ ? undefined
+ : val.split(',').map((x) => x.trim())
+
+const separateServiceTags = (val?: string) => {
+ const arr = stringToArray(val)
+ if (!arr) return undefined
+ const output: { category: string; tag: string }[] = []
+ for (const item of arr) {
+ const [category, tag] = item.split(':')
+ if (typeof category === 'string' && typeof tag === 'string') {
+ output.push({ category, tag })
+ }
+ }
+ return output
+}
+const coerceNumber = (val?: string) => {
+ const stripped = stripEmptyString(val)
+ if (stripped) {
+ return parseInt(stripped)
+ }
+ return undefined
+}
+export const DataSchema = {
+ Organization: z.object({
+ id: z.string(),
+ Name: z.string(),
+ URL: z.string().optional().transform(stripEmptyString),
+ Description: z.string(),
+ 'Alert Message': z.string().optional().transform(stripEmptyString),
+ 'bipoc-led': boolOrBlank,
+ 'black-led': boolOrBlank,
+ 'bipoc-comm': boolOrBlank,
+ 'immigrant-led': boolOrBlank,
+ 'immigrant-comm': boolOrBlank,
+ 'asylum-seekers': boolOrBlank,
+ 'resettled-refugees': boolOrBlank,
+ 'trans-led': boolOrBlank,
+ 'trans-comm': boolOrBlank,
+ 'trans-youth-focus': boolOrBlank,
+ 'trans-masc': boolOrBlank,
+ 'trans-fem': boolOrBlank,
+ 'gender-nc': boolOrBlank,
+ 'lgbtq-youth-focus': boolOrBlank,
+ 'spanish-speakers': boolOrBlank,
+ 'hiv-comm': boolOrBlank,
+ 'Additional Notes': z.string().optional().transform(stripEmptyString),
+ 'reviewed?': boolOrBlank,
+ }),
+
+ OrgEmail: z.object({
+ id: z.string(),
+ firstName: z.string().optional().transform(stripEmptyString),
+ lastName: z.string().optional().transform(stripEmptyString),
+ primary: boolOrBlank,
+ email: z.string().email(),
+ description: z.string().optional().transform(stripEmptyString),
+ organizationId: z.string(),
+ locationOnly: boolOrBlank,
+ serviceOnly: boolOrBlank,
+ }),
+
+ SvcAccess: z.object({
+ id: z.string(),
+ serviceId: z.string(),
+ type: z.enum(['email', 'phone', 'file', 'link', '']),
+ value: z.string(),
+ }),
+ OrgPhone: z.object({
+ id: z.string(),
+ number: z.string(),
+ ext: z.string().optional().transform(stripEmptyString),
+ primary: boolOrBlank,
+ countryId: z.string().optional().transform(stripEmptyString),
+ description: z.string(),
+ organizationId: z.string(),
+ }),
+ OrgLocation: z.object({
+ id: z.string(),
+ organizationId: z.string(),
+ 'Location Name': z.string(),
+ Country: z.string(),
+ Street: z.string().optional().transform(stripEmptyString),
+ City: z.string().optional().transform(stripEmptyString),
+ State: z.string().optional().transform(stripEmptyString),
+ PostalCode: z.string().optional().transform(stripEmptyString),
+ 'Hide Location?': boolOrBlank,
+ 'Service Area Coverage - USA National': z
+ .string()
+ .optional()
+ .transform((val) => stringToArray(val)),
+ 'Service Area Coverage - State(s)': z
+ .string()
+ .optional()
+ .transform((val) => stringToArray(val)),
+ }),
+ OrgSocial: z.object({
+ id: z.string(),
+ organizationId: z.string(),
+ service: z.string(),
+ url: z.string().url(),
+ }),
+ OrgService: z.object({
+ id: z.string(),
+ organizationId: z.string(),
+ Title: z.string(),
+ Description: z.string(),
+ 'Tag(s)': z.string().optional().transform(separateServiceTags),
+ 'other-describe': z.string().optional().transform(stripEmptyString),
+ 'elig-age-min': z.string().optional().transform(coerceNumber),
+ 'elig-age-max': z.string().optional().transform(coerceNumber),
+ 'cost-free': boolOrBlank,
+ 'cost-fees': z.string().optional().transform(coerceNumber),
+ 'lang-offered': z.string().optional().transform(stringToArray),
+ 'has-confidentiality-policy': boolOrBlank,
+ 'offers-remote-services': boolOrBlank,
+ 'req-medical-insurance': boolOrBlank,
+ 'req-photo-id': boolOrBlank,
+ 'req-proof-of-age': boolOrBlank,
+ 'req-proof-of-income': boolOrBlank,
+ 'req-referral': boolOrBlank,
+ 'at-capacity': boolOrBlank,
+ }),
+}
+export const DataFile = z.object({
+ organization: DataSchema.Organization.array(),
+ orgEmail: DataSchema.OrgEmail.array(),
+ svcAccess: DataSchema.SvcAccess.array(),
+ orgPhone: DataSchema.OrgPhone.array(),
+ orgLocation: DataSchema.OrgLocation.array(),
+ orgSocial: DataSchema.OrgSocial.array(),
+ orgService: DataSchema.OrgService.array(),
+})
+
+export const JoinSchema = {
+ OrgServicePhone: z.object({
+ serviceId: z.string(),
+ phoneId: z.string(),
+ }),
+ OrgServiceEmail: z.object({
+ serviceId: z.string(),
+ emailId: z.string(),
+ }),
+ OrgLocationEmail: z.object({
+ locationId: z.string(),
+ emailId: z.string(),
+ }),
+ OrgLocationService: z.object({
+ locationId: z.string(),
+ serviceId: z.string(),
+ }),
+ OrgLocationPhone: z.object({
+ locationId: z.string(),
+ phoneId: z.string(),
+ }),
+}
+export const JoinFile = z.object({
+ orgServicePhone: JoinSchema.OrgServicePhone.array(),
+ orgServiceEmail: JoinSchema.OrgServiceEmail.array(),
+ orgLocationEmail: JoinSchema.OrgLocationEmail.array(),
+ orgLocationService: JoinSchema.OrgLocationService.array(),
+ orgLocationPhone: JoinSchema.OrgLocationPhone.array(),
+})
diff --git a/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/index.ts b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/index.ts
new file mode 100644
index 0000000000..dc401811a4
--- /dev/null
+++ b/packages/db/prisma/data-migrations/2023-11-21_add-missing-phones/index.ts
@@ -0,0 +1,74 @@
+import { prisma } from '~db/client'
+import { downloadFromDatastore, formatMessage } from '~db/prisma/common'
+import { type MigrationJob } from '~db/prisma/dataMigrationRunner'
+import { createLogger, type JobDef, jobPostRunner } from '~db/prisma/jobPreRun'
+
+import { type Output } from './!prep'
+
+type Data = Pick