"""Localized strings and weather code labels for the weather dashboard."""

# Nerd Font WMO icons
_WMO_ICONS_NERD = {
    0: "\U000F0599", 1: "\U000F0599", 2: "\U000F0595", 3: "\U000F0590",
    45: "\U000F0591", 48: "\U000F0591",
    51: "\U000F0597", 53: "\U000F0597", 55: "\U000F0597",
    56: "\U000F0597", 57: "\U000F0597",
    61: "\U000F0596", 63: "\U000F0596", 65: "\U000F0596",
    66: "\U000F0596", 67: "\U000F0596",
    71: "\U000F0F36", 73: "\U000F0F36", 75: "\U000F0F36", 77: "\U000F0F36",
    80: "\U000F0596", 81: "\U000F0596", 82: "\U000F0596",
    85: "\U000F0F36", 86: "\U000F0F36",
    95: "\U000F0593", 96: "\U000F0593", 99: "\U000F0593",
}

# Emoji fallback WMO icons (no Nerd Font required)
_WMO_ICONS_EMOJI = {
    0: "\u2600\ufe0f",  1: "\U0001f324\ufe0f",  2: "\u26c5", 3: "\u2601\ufe0f",
    45: "\U0001f32b\ufe0f", 48: "\U0001f32b\ufe0f",
    51: "\U0001f326\ufe0f", 53: "\U0001f326\ufe0f", 55: "\U0001f326\ufe0f",
    56: "\U0001f327\ufe0f", 57: "\U0001f327\ufe0f",
    61: "\U0001f327\ufe0f", 63: "\U0001f327\ufe0f", 65: "\U0001f327\ufe0f",
    66: "\U0001f327\ufe0f", 67: "\U0001f327\ufe0f",
    71: "\U0001f328\ufe0f", 73: "\U0001f328\ufe0f", 75: "\U0001f328\ufe0f", 77: "\U0001f328\ufe0f",
    80: "\U0001f326\ufe0f", 81: "\U0001f326\ufe0f", 82: "\U0001f326\ufe0f",
    85: "\U0001f328\ufe0f", 86: "\U0001f328\ufe0f",
    95: "\u26c8\ufe0f",  96: "\u26c8\ufe0f",  99: "\u26c8\ufe0f",
}


def _wmo_icons(runtime):
    return _WMO_ICONS_EMOJI if runtime.emoji else _WMO_ICONS_NERD


WMO_NAMES = {
    0: "Clear", 1: "Mostly Clear", 2: "Partly Cloudy", 3: "Overcast",
    45: "Fog", 48: "Rime Fog",
    51: "Light Drizzle", 53: "Drizzle", 55: "Heavy Drizzle",
    56: "Freezing Drizzle", 57: "Freezing Drizzle",
    61: "Light Rain", 63: "Rain", 65: "Heavy Rain",
    66: "Freezing Rain", 67: "Freezing Rain",
    71: "Light Snow", 73: "Snow", 75: "Heavy Snow", 77: "Snow Grains",
    80: "Light Showers", 81: "Showers", 82: "Heavy Showers",
    85: "Snow Showers", 86: "Heavy Snow Showers",
    95: "Thunderstorm", 96: "Thunderstorm", 99: "Thunderstorm",
}

DAY_NAMES = {
    "en": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
    "fr": ["lun", "mar", "mer", "jeu", "ven", "sam", "dim"],
    "es": ["lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b", "dom"],
    "de": ["Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son"],
    "no": ["man", "tir", "ons", "tor", "fre", "l\u00f8r", "s\u00f8n"],
    "is": ["m\u00e1n", "\u00feri", "mi\u00f0", "fim", "f\u00f6s", "lau", "sun"],
    "da": ["man", "tir", "ons", "tor", "fre", "l\u00f8r", "s\u00f8n"],
    "it": ["lun", "mar", "mer", "gio", "ven", "sab", "dom"],
    "pl": ["pon", "wto", "\u015bro", "czw", "pi\u0105", "sob", "nie"],
    "nl": ["maa", "din", "woe", "don", "vri", "zat", "zon"],
    "pt": ["seg", "ter", "qua", "qui", "sex", "s\u00e1b", "dom"],
    "sv": ["m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r", "s\u00f6n"],
    "fi": ["ma", "ti", "ke", "to", "pe", "la", "su"],
    "ja": ["\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f", "\u65e5"],
    "ko": ["\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0", "\uc77c"],
    "zh": ["\u5468\u4e00", "\u5468\u4e8c", "\u5468\u4e09", "\u5468\u56db", "\u5468\u4e94", "\u5468\u516d", "\u5468\u65e5"],
}

FULL_DAY_NAMES = {
    "en": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
    "fr": ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"],
    "es": ["lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado", "domingo"],
    "de": ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"],
    "no": ["mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag", "s\u00f8ndag"],
    "is": ["m\u00e1nudagur", "\u00feri\u00f0judagur", "mi\u00f0vikudagur", "fimmtudagur", "f\u00f6studagur", "laugardagur", "sunnudagur"],
    "da": ["mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag", "s\u00f8ndag"],
    "it": ["luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato", "domenica"],
    "pl": ["poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota", "niedziela"],
    "nl": ["maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"],
    "pt": ["segunda-feira", "ter\u00e7a-feira", "quarta-feira", "quinta-feira", "sexta-feira", "s\u00e1bado", "domingo"],
    "sv": ["m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag", "s\u00f6ndag"],
    "fi": ["maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"],
    "ja": ["\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5", "\u65e5\u66dc\u65e5"],
    "ko": ["\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c", "\uc77c\uc694\uc77c"],
    "zh": ["\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d", "\u661f\u671f\u65e5"],
}

WMO_NAMES_I18N = {
    "fr": {
        0: "D\u00e9gag\u00e9", 1: "Peu nuageux", 2: "Partiellement nuageux", 3: "Couvert",
        45: "Brouillard", 48: "Brouillard givrant",
        51: "Bruine l\u00e9g\u00e8re", 53: "Bruine", 55: "Forte bruine",
        56: "Bruine vergla\u00e7ante", 57: "Bruine vergla\u00e7ante",
        61: "Pluie l\u00e9g\u00e8re", 63: "Pluie", 65: "Forte pluie",
        66: "Pluie vergla\u00e7ante", 67: "Pluie vergla\u00e7ante",
        71: "Neige l\u00e9g\u00e8re", 73: "Neige", 75: "Forte neige", 77: "Grains de neige",
        80: "Averses l\u00e9g\u00e8res", 81: "Averses", 82: "Fortes averses",
        85: "Averses de neige", 86: "Fortes averses de neige",
        95: "Orage", 96: "Orage", 99: "Orage",
    },
    "es": {
        0: "Despejado", 1: "Mayormente despejado", 2: "Parcialmente nublado", 3: "Nublado",
        45: "Niebla", 48: "Niebla helada",
        51: "Llovizna ligera", 53: "Llovizna", 55: "Llovizna intensa",
        56: "Llovizna helada", 57: "Llovizna helada",
        61: "Lluvia ligera", 63: "Lluvia", 65: "Lluvia intensa",
        66: "Lluvia helada", 67: "Lluvia helada",
        71: "Nieve ligera", 73: "Nieve", 75: "Nieve intensa", 77: "Granos de nieve",
        80: "Chubascos ligeros", 81: "Chubascos", 82: "Chubascos intensos",
        85: "Chubascos de nieve", 86: "Chubascos de nieve intensos",
        95: "Tormenta", 96: "Tormenta", 99: "Tormenta",
    },
    "de": {
        0: "Klar", 1: "\u00dcberwiegend klar", 2: "Teilweise bew\u00f6lkt", 3: "Bedeckt",
        45: "Nebel", 48: "Gefrierender Nebel",
        51: "Leichter Nieselregen", 53: "Nieselregen", 55: "Starker Nieselregen",
        56: "Gefrierender Nieselregen", 57: "Gefrierender Nieselregen",
        61: "Leichter Regen", 63: "Regen", 65: "Starker Regen",
        66: "Gefrierender Regen", 67: "Gefrierender Regen",
        71: "Leichter Schneefall", 73: "Schneefall", 75: "Starker Schneefall", 77: "Schneegriesel",
        80: "Leichte Schauer", 81: "Schauer", 82: "Starke Schauer",
        85: "Schneeschauer", 86: "Starke Schneeschauer",
        95: "Gewitter", 96: "Gewitter", 99: "Gewitter",
    },
    "no": {
        0: "Klart", 1: "Mest klart", 2: "Delvis skyet", 3: "Overskyet",
        45: "T\u00e5ke", 48: "Rimt\u00e5ke",
        51: "Lett yr", 53: "Yr", 55: "Kraftig yr",
        56: "Underkj\u00f8lt yr", 57: "Underkj\u00f8lt yr",
        61: "Lett regn", 63: "Regn", 65: "Kraftig regn",
        66: "Underkj\u00f8lt regn", 67: "Underkj\u00f8lt regn",
        71: "Lett sn\u00f8", 73: "Sn\u00f8", 75: "Kraftig sn\u00f8", 77: "Sn\u00f8korn",
        80: "Lette byger", 81: "Byger", 82: "Kraftige byger",
        85: "Sn\u00f8byger", 86: "Kraftige sn\u00f8byger",
        95: "Tordenv\u00e6r", 96: "Tordenv\u00e6r", 99: "Tordenv\u00e6r",
    },
    "is": {
        0: "Hei\u00f0sk\u00edrt", 1: "Hei\u00f0sk\u00edrt a\u00f0 mestu", 2: "Sk\u00fdja\u00f0 a\u00f0 hluta", 3: "Alsk\u00fdja\u00f0",
        45: "\u00deoka", 48: "Hr\u00edm\u00feoka",
        51: "L\u00e9ttur \u00fa\u00f0i", 53: "\u00da\u00f0i", 55: "Mikill \u00fa\u00f0i",
        56: "Frystandi \u00fa\u00f0i", 57: "Frystandi \u00fa\u00f0i",
        61: "L\u00e9tt rigning", 63: "Rigning", 65: "Mikil rigning",
        66: "Frystandi rigning", 67: "Frystandi rigning",
        71: "L\u00e9tt snj\u00f3koma", 73: "Snj\u00f3koma", 75: "Mikil snj\u00f3koma", 77: "Snj\u00f3korn",
        80: "L\u00e9ttar sk\u00farir", 81: "Sk\u00farir", 82: "Miklar sk\u00farir",
        85: "Snj\u00f3sk\u00farir", 86: "Miklar snj\u00f3sk\u00farir",
        95: "\u00derumuve\u00f0ur", 96: "\u00derumuve\u00f0ur", 99: "\u00derumuve\u00f0ur",
    },
    "da": {
        0: "Klart", 1: "Overvejende klart", 2: "Delvist skyet", 3: "Overskyet",
        45: "T\u00e5ge", 48: "Rimt\u00e5ge",
        51: "Let st\u00f8vregn", 53: "St\u00f8vregn", 55: "Kraftig st\u00f8vregn",
        56: "Underk\u00f8let st\u00f8vregn", 57: "Underk\u00f8let st\u00f8vregn",
        61: "Let regn", 63: "Regn", 65: "Kraftig regn",
        66: "Underk\u00f8let regn", 67: "Underk\u00f8let regn",
        71: "Let sne", 73: "Sne", 75: "Kraftig sne", 77: "Snekorn",
        80: "Lette byger", 81: "Byger", 82: "Kraftige byger",
        85: "Snebyger", 86: "Kraftige snebyger",
        95: "Tordenvejr", 96: "Tordenvejr", 99: "Tordenvejr",
    },
    "it": {
        0: "Sereno", 1: "Prevalentemente sereno", 2: "Parzialmente nuvoloso", 3: "Coperto",
        45: "Nebbia", 48: "Nebbia con brina",
        51: "Pioviggine leggera", 53: "Pioviggine", 55: "Pioviggine intensa",
        56: "Pioviggine gelata", 57: "Pioviggine gelata",
        61: "Pioggia leggera", 63: "Pioggia", 65: "Pioggia intensa",
        66: "Pioggia gelata", 67: "Pioggia gelata",
        71: "Neve leggera", 73: "Neve", 75: "Neve intensa", 77: "Granuli di neve",
        80: "Rovesci leggeri", 81: "Rovesci", 82: "Rovesci intensi",
        85: "Rovesci di neve", 86: "Rovesci di neve intensi",
        95: "Temporale", 96: "Temporale", 99: "Temporale",
    },
    "pl": {
        0: "Bezchmurnie", 1: "Przewa\u017cnie bezchmurnie", 2: "Cz\u0119\u015bciowe zachmurzenie", 3: "Pochmurno",
        45: "Mg\u0142a", 48: "Szad\u017a",
        51: "Lekka m\u017cawka", 53: "M\u017cawka", 55: "Silna m\u017cawka",
        56: "Marzn\u0105ca m\u017cawka", 57: "Marzn\u0105ca m\u017cawka",
        61: "Lekki deszcz", 63: "Deszcz", 65: "Silny deszcz",
        66: "Marzn\u0105cy deszcz", 67: "Marzn\u0105cy deszcz",
        71: "Lekki \u015bnieg", 73: "\u015anieg", 75: "Silny \u015bnieg", 77: "Ziarna \u015bniegu",
        80: "Lekkie przelotne opady", 81: "Przelotne opady", 82: "Silne przelotne opady",
        85: "Przelotne opady \u015bniegu", 86: "Silne przelotne opady \u015bniegu",
        95: "Burza", 96: "Burza", 99: "Burza",
    },
    "nl": {
        0: "Helder", 1: "Overwegend helder", 2: "Halfbewolkt", 3: "Bewolkt",
        45: "Mist", 48: "Rijpmist",
        51: "Lichte motregen", 53: "Motregen", 55: "Zware motregen",
        56: "Aanvriezende motregen", 57: "Aanvriezende motregen",
        61: "Lichte regen", 63: "Regen", 65: "Zware regen",
        66: "Aanvriezende regen", 67: "Aanvriezende regen",
        71: "Lichte sneeuw", 73: "Sneeuw", 75: "Zware sneeuw", 77: "Sneeuwkorrels",
        80: "Lichte buien", 81: "Buien", 82: "Zware buien",
        85: "Sneeuwbuien", 86: "Zware sneeuwbuien",
        95: "Onweer", 96: "Onweer", 99: "Onweer",
    },
    "pt": {
        0: "C\u00e9u limpo", 1: "Quase limpo", 2: "Parcialmente nublado", 3: "Encoberto",
        45: "Nevoeiro", 48: "Nevoeiro gelado",
        51: "Chuvisco fraco", 53: "Chuvisco", 55: "Chuvisco forte",
        56: "Chuvisco gelado", 57: "Chuvisco gelado",
        61: "Chuva fraca", 63: "Chuva", 65: "Chuva forte",
        66: "Chuva gelada", 67: "Chuva gelada",
        71: "Neve fraca", 73: "Neve", 75: "Neve forte", 77: "Gr\u00e3os de neve",
        80: "Aguaceiros fracos", 81: "Aguaceiros", 82: "Aguaceiros fortes",
        85: "Aguaceiros de neve", 86: "Aguaceiros de neve fortes",
        95: "Trovoada", 96: "Trovoada", 99: "Trovoada",
    },
    "sv": {
        0: "Klart", 1: "Mestadels klart", 2: "Halvklart", 3: "Mulet",
        45: "Dimma", 48: "Rimfrost",
        51: "L\u00e4tt duggregn", 53: "Duggregn", 55: "Kraftigt duggregn",
        56: "Underkylt duggregn", 57: "Underkylt duggregn",
        61: "L\u00e4tt regn", 63: "Regn", 65: "Kraftigt regn",
        66: "Underkylt regn", 67: "Underkylt regn",
        71: "L\u00e4tt sn\u00f6", 73: "Sn\u00f6", 75: "Kraftigt sn\u00f6fall", 77: "Sn\u00f6korn",
        80: "L\u00e4tta skurar", 81: "Skurar", 82: "Kraftiga skurar",
        85: "Sn\u00f6byar", 86: "Kraftiga sn\u00f6byar",
        95: "\u00c5skv\u00e4der", 96: "\u00c5skv\u00e4der", 99: "\u00c5skv\u00e4der",
    },
    "fi": {
        0: "Selke\u00e4", 1: "Enimm\u00e4kseen selke\u00e4", 2: "Puolipilvinen", 3: "Pilvinen",
        45: "Sumu", 48: "H\u00e4rm\u00e4sumu",
        51: "Kevyt tihku", 53: "Tihku", 55: "Voimakas tihku",
        56: "J\u00e4\u00e4t\u00e4v\u00e4 tihku", 57: "J\u00e4\u00e4t\u00e4v\u00e4 tihku",
        61: "Kevyt sade", 63: "Sade", 65: "Voimakas sade",
        66: "J\u00e4\u00e4t\u00e4v\u00e4 sade", 67: "J\u00e4\u00e4t\u00e4v\u00e4 sade",
        71: "Kevyt lumisade", 73: "Lumisade", 75: "Voimakas lumisade", 77: "Lumijyv\u00e4set",
        80: "Kevyet kuurot", 81: "Kuurot", 82: "Voimakkaat kuurot",
        85: "Lumikuurot", 86: "Voimakkaat lumikuurot",
        95: "Ukkonen", 96: "Ukkonen", 99: "Ukkonen",
    },
    "ja": {
        0: "\u5feb\u6674", 1: "\u6674\u308c", 2: "\u4e00\u90e8\u66c7\u308a", 3: "\u66c7\u308a",
        45: "\u9727", 48: "\u7740\u6c37\u6027\u306e\u9727",
        51: "\u5f31\u3044\u9727\u96e8", 53: "\u9727\u96e8", 55: "\u5f37\u3044\u9727\u96e8",
        56: "\u7740\u6c37\u6027\u306e\u9727\u96e8", 57: "\u7740\u6c37\u6027\u306e\u9727\u96e8",
        61: "\u5f31\u3044\u96e8", 63: "\u96e8", 65: "\u5f37\u3044\u96e8",
        66: "\u7740\u6c37\u6027\u306e\u96e8", 67: "\u7740\u6c37\u6027\u306e\u96e8",
        71: "\u5f31\u3044\u96ea", 73: "\u96ea", 75: "\u5f37\u3044\u96ea", 77: "\u9727\u96ea",
        80: "\u5f31\u3044\u306b\u308f\u304b\u96e8", 81: "\u306b\u308f\u304b\u96e8", 82: "\u5f37\u3044\u306b\u308f\u304b\u96e8",
        85: "\u306b\u308f\u304b\u96ea", 86: "\u5f37\u3044\u306b\u308f\u304b\u96ea",
        95: "\u96f7\u96e8", 96: "\u96f7\u96e8", 99: "\u96f7\u96e8",
    },
    "ko": {
        0: "\ub9d1\uc74c", 1: "\ub300\uccb4\ub85c \ub9d1\uc74c", 2: "\uad6c\ub984 \uc870\uae08", 3: "\ud750\ub9bc",
        45: "\uc548\uac1c", 48: "\uc11c\ub9ac \uc548\uac1c",
        51: "\uc57d\ud55c \uc774\uc2ac\ube44", 53: "\uc774\uc2ac\ube44", 55: "\uac15\ud55c \uc774\uc2ac\ube44",
        56: "\uc5b4\ub294 \uc774\uc2ac\ube44", 57: "\uc5b4\ub294 \uc774\uc2ac\ube44",
        61: "\uc57d\ud55c \ube44", 63: "\ube44", 65: "\uac15\ud55c \ube44",
        66: "\uc5b4\ub294 \ube44", 67: "\uc5b4\ub294 \ube44",
        71: "\uc57d\ud55c \ub208", 73: "\ub208", 75: "\uac15\ud55c \ub208", 77: "\uc2f8\ub77c\uae30\ub208",
        80: "\uc57d\ud55c \uc18c\ub098\uae30", 81: "\uc18c\ub098\uae30", 82: "\uac15\ud55c \uc18c\ub098\uae30",
        85: "\ub208 \uc18c\ub098\uae30", 86: "\uac15\ud55c \ub208 \uc18c\ub098\uae30",
        95: "\ub1cc\uc6b0", 96: "\ub1cc\uc6b0", 99: "\ub1cc\uc6b0",
    },
    "zh": {
        0: "\u6674\u6717", 1: "\u5927\u90e8\u6674\u6717", 2: "\u5c40\u90e8\u591a\u4e91", 3: "\u9634\u5929",
        45: "\u96fe", 48: "\u51bb\u96fe",
        51: "\u5c0f\u6bdb\u6bdb\u96e8", 53: "\u6bdb\u6bdb\u96e8", 55: "\u5927\u6bdb\u6bdb\u96e8",
        56: "\u51bb\u6bdb\u6bdb\u96e8", 57: "\u51bb\u6bdb\u6bdb\u96e8",
        61: "\u5c0f\u96e8", 63: "\u96e8", 65: "\u5927\u96e8",
        66: "\u51bb\u96e8", 67: "\u51bb\u96e8",
        71: "\u5c0f\u96ea", 73: "\u96ea", 75: "\u5927\u96ea", 77: "\u96ea\u7c92",
        80: "\u5c0f\u9635\u96e8", 81: "\u9635\u96e8", 82: "\u5927\u9635\u96e8",
        85: "\u9635\u96ea", 86: "\u5927\u9635\u96ea",
        95: "\u96f7\u66b4\u96e8", 96: "\u96f7\u66b4\u96e8", 99: "\u96f7\u66b4\u96e8",
    },
}

_PRECIP_DESCS_I18N = {
    "fr": {
        51: "bruine l\u00e9g\u00e8re", 53: "bruine", 55: "forte bruine",
        56: "bruine vergla\u00e7ante", 57: "bruine vergla\u00e7ante",
        61: "pluie l\u00e9g\u00e8re", 63: "pluie", 65: "forte pluie",
        66: "pluie vergla\u00e7ante", 67: "pluie vergla\u00e7ante",
        71: "neige l\u00e9g\u00e8re", 73: "neige", 75: "forte neige", 77: "grains de neige",
        80: "averses l\u00e9g\u00e8res", 81: "averses", 82: "fortes averses",
        85: "averses de neige", 86: "fortes averses de neige",
        95: "orages", 96: "orages", 99: "orages",
    },
    "es": {
        51: "llovizna ligera", 53: "llovizna", 55: "llovizna intensa",
        56: "llovizna helada", 57: "llovizna helada",
        61: "lluvia ligera", 63: "lluvia", 65: "lluvia intensa",
        66: "lluvia helada", 67: "lluvia helada",
        71: "nieve ligera", 73: "nieve", 75: "nieve intensa", 77: "granos de nieve",
        80: "chubascos ligeros", 81: "chubascos", 82: "chubascos intensos",
        85: "chubascos de nieve", 86: "chubascos de nieve intensos",
        95: "tormentas", 96: "tormentas", 99: "tormentas",
    },
    "de": {
        51: "leichter Nieselregen", 53: "Nieselregen", 55: "starker Nieselregen",
        56: "gefrierender Nieselregen", 57: "gefrierender Nieselregen",
        61: "leichter Regen", 63: "Regen", 65: "starker Regen",
        66: "gefrierender Regen", 67: "gefrierender Regen",
        71: "leichter Schneefall", 73: "Schneefall", 75: "starker Schneefall", 77: "Schneegriesel",
        80: "leichte Schauer", 81: "Schauer", 82: "starke Schauer",
        85: "Schneeschauer", 86: "starke Schneeschauer",
        95: "Gewitter", 96: "Gewitter", 99: "Gewitter",
    },
    "no": {
        51: "lett yr", 53: "yr", 55: "kraftig yr",
        56: "underkj\u00f8lt yr", 57: "underkj\u00f8lt yr",
        61: "lett regn", 63: "regn", 65: "kraftig regn",
        66: "underkj\u00f8lt regn", 67: "underkj\u00f8lt regn",
        71: "lett sn\u00f8", 73: "sn\u00f8", 75: "kraftig sn\u00f8", 77: "sn\u00f8korn",
        80: "lette byger", 81: "byger", 82: "kraftige byger",
        85: "sn\u00f8byger", 86: "kraftige sn\u00f8byger",
        95: "tordenv\u00e6r", 96: "tordenv\u00e6r", 99: "tordenv\u00e6r",
    },
    "is": {
        51: "l\u00e9ttur \u00fa\u00f0i", 53: "\u00fa\u00f0i", 55: "mikill \u00fa\u00f0i",
        56: "frystandi \u00fa\u00f0i", 57: "frystandi \u00fa\u00f0i",
        61: "l\u00e9tt rigning", 63: "rigning", 65: "mikil rigning",
        66: "frystandi rigning", 67: "frystandi rigning",
        71: "l\u00e9tt snj\u00f3koma", 73: "snj\u00f3koma", 75: "mikil snj\u00f3koma", 77: "snj\u00f3korn",
        80: "l\u00e9ttar sk\u00farir", 81: "sk\u00farir", 82: "miklar sk\u00farir",
        85: "snj\u00f3sk\u00farir", 86: "miklar snj\u00f3sk\u00farir",
        95: "\u00ferumuve\u00f0ur", 96: "\u00ferumuve\u00f0ur", 99: "\u00ferumuve\u00f0ur",
    },
    "da": {
        51: "let st\u00f8vregn", 53: "st\u00f8vregn", 55: "kraftig st\u00f8vregn",
        56: "underk\u00f8let st\u00f8vregn", 57: "underk\u00f8let st\u00f8vregn",
        61: "let regn", 63: "regn", 65: "kraftig regn",
        66: "underk\u00f8let regn", 67: "underk\u00f8let regn",
        71: "let sne", 73: "sne", 75: "kraftig sne", 77: "snekorn",
        80: "lette byger", 81: "byger", 82: "kraftige byger",
        85: "snebyger", 86: "kraftige snebyger",
        95: "tordenvejr", 96: "tordenvejr", 99: "tordenvejr",
    },
    "it": {
        51: "pioviggine leggera", 53: "pioviggine", 55: "pioviggine intensa",
        56: "pioviggine gelata", 57: "pioviggine gelata",
        61: "pioggia leggera", 63: "pioggia", 65: "pioggia intensa",
        66: "pioggia gelata", 67: "pioggia gelata",
        71: "neve leggera", 73: "neve", 75: "neve intensa", 77: "granuli di neve",
        80: "rovesci leggeri", 81: "rovesci", 82: "rovesci intensi",
        85: "rovesci di neve", 86: "rovesci di neve intensi",
        95: "temporali", 96: "temporali", 99: "temporali",
    },
    "pl": {
        51: "lekka m\u017cawka", 53: "m\u017cawka", 55: "silna m\u017cawka",
        56: "marzn\u0105ca m\u017cawka", 57: "marzn\u0105ca m\u017cawka",
        61: "lekki deszcz", 63: "deszcz", 65: "silny deszcz",
        66: "marzn\u0105cy deszcz", 67: "marzn\u0105cy deszcz",
        71: "lekki \u015bnieg", 73: "\u015bnieg", 75: "silny \u015bnieg", 77: "ziarna \u015bniegu",
        80: "lekkie przelotne opady", 81: "przelotne opady", 82: "silne przelotne opady",
        85: "przelotne opady \u015bniegu", 86: "silne przelotne opady \u015bniegu",
        95: "burze", 96: "burze", 99: "burze",
    },
    "nl": {
        51: "lichte motregen", 53: "motregen", 55: "zware motregen",
        56: "aanvriezende motregen", 57: "aanvriezende motregen",
        61: "lichte regen", 63: "regen", 65: "zware regen",
        66: "aanvriezende regen", 67: "aanvriezende regen",
        71: "lichte sneeuw", 73: "sneeuw", 75: "zware sneeuw", 77: "sneeuwkorrels",
        80: "lichte buien", 81: "buien", 82: "zware buien",
        85: "sneeuwbuien", 86: "zware sneeuwbuien",
        95: "onweer", 96: "onweer", 99: "onweer",
    },
    "pt": {
        51: "chuvisco fraco", 53: "chuvisco", 55: "chuvisco forte",
        56: "chuvisco gelado", 57: "chuvisco gelado",
        61: "chuva fraca", 63: "chuva", 65: "chuva forte",
        66: "chuva gelada", 67: "chuva gelada",
        71: "neve fraca", 73: "neve", 75: "neve forte", 77: "gr\u00e3os de neve",
        80: "aguaceiros fracos", 81: "aguaceiros", 82: "aguaceiros fortes",
        85: "aguaceiros de neve", 86: "aguaceiros de neve fortes",
        95: "trovoadas", 96: "trovoadas", 99: "trovoadas",
    },
    "sv": {
        51: "l\u00e4tt duggregn", 53: "duggregn", 55: "kraftigt duggregn",
        56: "underkylt duggregn", 57: "underkylt duggregn",
        61: "l\u00e4tt regn", 63: "regn", 65: "kraftigt regn",
        66: "underkylt regn", 67: "underkylt regn",
        71: "l\u00e4tt sn\u00f6", 73: "sn\u00f6", 75: "kraftigt sn\u00f6fall", 77: "sn\u00f6korn",
        80: "l\u00e4tta skurar", 81: "skurar", 82: "kraftiga skurar",
        85: "sn\u00f6byar", 86: "kraftiga sn\u00f6byar",
        95: "\u00e5skv\u00e4der", 96: "\u00e5skv\u00e4der", 99: "\u00e5skv\u00e4der",
    },
    "fi": {
        51: "kevyt tihku", 53: "tihku", 55: "voimakas tihku",
        56: "j\u00e4\u00e4t\u00e4v\u00e4 tihku", 57: "j\u00e4\u00e4t\u00e4v\u00e4 tihku",
        61: "kevyt sade", 63: "sade", 65: "voimakas sade",
        66: "j\u00e4\u00e4t\u00e4v\u00e4 sade", 67: "j\u00e4\u00e4t\u00e4v\u00e4 sade",
        71: "kevyt lumisade", 73: "lumisade", 75: "voimakas lumisade", 77: "lumijyv\u00e4set",
        80: "kevyet kuurot", 81: "kuurot", 82: "voimakkaat kuurot",
        85: "lumikuurot", 86: "voimakkaat lumikuurot",
        95: "ukkonen", 96: "ukkonen", 99: "ukkonen",
    },
    "ja": {
        51: "\u5f31\u3044\u9727\u96e8", 53: "\u9727\u96e8", 55: "\u5f37\u3044\u9727\u96e8",
        56: "\u7740\u6c37\u6027\u306e\u9727\u96e8", 57: "\u7740\u6c37\u6027\u306e\u9727\u96e8",
        61: "\u5f31\u3044\u96e8", 63: "\u96e8", 65: "\u5f37\u3044\u96e8",
        66: "\u7740\u6c37\u6027\u306e\u96e8", 67: "\u7740\u6c37\u6027\u306e\u96e8",
        71: "\u5f31\u3044\u96ea", 73: "\u96ea", 75: "\u5f37\u3044\u96ea", 77: "\u9727\u96ea",
        80: "\u5f31\u3044\u306b\u308f\u304b\u96e8", 81: "\u306b\u308f\u304b\u96e8", 82: "\u5f37\u3044\u306b\u308f\u304b\u96e8",
        85: "\u306b\u308f\u304b\u96ea", 86: "\u5f37\u3044\u306b\u308f\u304b\u96ea",
        95: "\u96f7\u96e8", 96: "\u96f7\u96e8", 99: "\u96f7\u96e8",
    },
    "ko": {
        51: "\uc57d\ud55c \uc774\uc2ac\ube44", 53: "\uc774\uc2ac\ube44", 55: "\uac15\ud55c \uc774\uc2ac\ube44",
        56: "\uc5b4\ub294 \uc774\uc2ac\ube44", 57: "\uc5b4\ub294 \uc774\uc2ac\ube44",
        61: "\uc57d\ud55c \ube44", 63: "\ube44", 65: "\uac15\ud55c \ube44",
        66: "\uc5b4\ub294 \ube44", 67: "\uc5b4\ub294 \ube44",
        71: "\uc57d\ud55c \ub208", 73: "\ub208", 75: "\uac15\ud55c \ub208", 77: "\uc2f8\ub77c\uae30\ub208",
        80: "\uc57d\ud55c \uc18c\ub098\uae30", 81: "\uc18c\ub098\uae30", 82: "\uac15\ud55c \uc18c\ub098\uae30",
        85: "\ub208 \uc18c\ub098\uae30", 86: "\uac15\ud55c \ub208 \uc18c\ub098\uae30",
        95: "\ub1cc\uc6b0", 96: "\ub1cc\uc6b0", 99: "\ub1cc\uc6b0",
    },
    "zh": {
        51: "\u5c0f\u6bdb\u6bdb\u96e8", 53: "\u6bdb\u6bdb\u96e8", 55: "\u5927\u6bdb\u6bdb\u96e8",
        56: "\u51bb\u6bdb\u6bdb\u96e8", 57: "\u51bb\u6bdb\u6bdb\u96e8",
        61: "\u5c0f\u96e8", 63: "\u96e8", 65: "\u5927\u96e8",
        66: "\u51bb\u96e8", 67: "\u51bb\u96e8",
        71: "\u5c0f\u96ea", 73: "\u96ea", 75: "\u5927\u96ea", 77: "\u96ea\u7c92",
        80: "\u5c0f\u9635\u96e8", 81: "\u9635\u96e8", 82: "\u5927\u9635\u96e8",
        85: "\u9635\u96ea", 86: "\u5927\u9635\u96ea",
        95: "\u96f7\u66b4\u96e8", 96: "\u96f7\u66b4\u96e8", 99: "\u96f7\u66b4\u96e8",
    },
}

# Localized UI strings
_STRINGS = {
    "en": {
        "today": "Today",
        "today_short": "Tod",
        "feels": "feels",
        "wind": "Wind",
        "gusts": "gusts",
        "until": "until",
        # Comparative line
        "same_temp": "about the same temperature as {ref_day}",
        "bit_warmer": "a bit warmer than {ref_day}",
        "bit_cooler": "a bit cooler than {ref_day}",
        "warmer": "warmer than {ref_day}",
        "cooler": "cooler than {ref_day}",
        "much_warmer": "much warmer than {ref_day}",
        "much_cooler": "much cooler than {ref_day}",
        "today_subj": "Today",
        "tomorrow_subj": "Tomorrow",
        "yesterday": "yesterday",
        "today_ref": "today",
        "will_be": "{subject} will be {comparison}",
        # Precipitation line
        "ending": "{desc} ending {time}",
        "continuing": "{desc} continuing through the day",
        "starting": "{desc} likely starting {time}",
        "shortly": "shortly",
        "in_about_an_hour": "in about an hour",
        "in_a_couple_hours": "in a couple hours",
        "around": "around {time}",
        "tomorrow_morning": "tomorrow morning",
        "tomorrow_afternoon": "tomorrow afternoon",
        "tomorrow_evening": "tomorrow evening",
        "on_day": "on {day}",
        # Past precip
        "past_precip": "{amt} of {ptype} in the last 24h",
        "snow": "snow",
        "rain": "rain",
        "mixed_precip": "mixed precipitation",
        # Daily precip types
        "Snow": "Snow",
        "Rain": "Rain",
        "Mix": "Mix",
        # Alert modal hints
        "q_to_close": "q to close",
        "o_to_open": "o to open in browser",
        "scroll": "scroll",
    },
    "fr": {
        "today": "aujourd'hui",
        "today_short": "auj",
        "feels": "ressenti",
        "wind": "Vent",
        "gusts": "rafales",
        "until": "jusqu'\u00e0",
        # Comparative line
        "same_temp": "\u00e0 peu pr\u00e8s la m\u00eame temp\u00e9rature {subject} qu'{ref_day}",
        "bit_warmer": "un peu plus chaud {subject} qu'{ref_day}",
        "bit_cooler": "un peu plus frais {subject} qu'{ref_day}",
        "warmer": "plus chaud {subject} qu'{ref_day}",
        "cooler": "plus frais {subject} qu'{ref_day}",
        "much_warmer": "beaucoup plus chaud {subject} qu'{ref_day}",
        "much_cooler": "beaucoup plus frais {subject} qu'{ref_day}",
        "today_subj": "Aujourd'hui",
        "tomorrow_subj": "Demain",
        "yesterday": "hier",
        "today_ref": "aujourd'hui",
        "will_be": "Il fera {comparison}",
        # Precipitation line
        "ending": "{desc} se terminant {time}",
        "continuing": "{desc} se poursuivant toute la journ\u00e9e",
        "starting": "{desc} probable {time}",
        "shortly": "tr\u00e8s bient\u00f4t",
        "in_about_an_hour": "dans environ une heure",
        "in_a_couple_hours": "dans quelques heures",
        "around": "vers {time}",
        "tomorrow_morning": "demain matin",
        "tomorrow_afternoon": "demain apr\u00e8s-midi",
        "tomorrow_evening": "demain soir",
        "on_day": "{day}",
        # Past precip
        "past_precip": "{amt} de {ptype} au cours des derni\u00e8res 24 h",
        "snow": "neige",
        "rain": "pluie",
        "mixed_precip": "pr\u00e9cipitations mixtes",
        # Daily precip types
        "Snow": "Neige",
        "Rain": "Pluie",
        "Mix": "Mixte",
        # Alert modal hints
        "q_to_close": "q pour fermer",
        "o_to_open": "o pour ouvrir dans le navigateur",
        "scroll": "d\u00e9filer",
    },
    "es": {
        "today": "hoy",
        "today_short": "hoy",
        "feels": "sens.",
        "wind": "Viento",
        "gusts": "r\u00e1fagas",
        "until": "hasta",
        # Comparative line
        "same_temp": "aproximadamente la misma temperatura que {ref_day}",
        "bit_warmer": "un poco m\u00e1s c\u00e1lido que {ref_day}",
        "bit_cooler": "un poco m\u00e1s fresco que {ref_day}",
        "warmer": "m\u00e1s c\u00e1lido que {ref_day}",
        "cooler": "m\u00e1s fresco que {ref_day}",
        "much_warmer": "mucho m\u00e1s c\u00e1lido que {ref_day}",
        "much_cooler": "mucho m\u00e1s fresco que {ref_day}",
        "today_subj": "Hoy",
        "tomorrow_subj": "Ma\u00f1ana",
        "yesterday": "ayer",
        "today_ref": "hoy",
        "will_be": "{subject} ser\u00e1 {comparison}",
        # Precipitation line
        "ending": "{desc} terminando {time}",
        "continuing": "{desc} durante todo el d\u00eda",
        "starting": "{desc} probable {time}",
        "shortly": "pronto",
        "in_about_an_hour": "en aproximadamente una hora",
        "in_a_couple_hours": "en un par de horas",
        "around": "hacia las {time}",
        "tomorrow_morning": "ma\u00f1ana por la ma\u00f1ana",
        "tomorrow_afternoon": "ma\u00f1ana por la tarde",
        "tomorrow_evening": "ma\u00f1ana por la noche",
        "on_day": "el {day}",
        # Past precip
        "past_precip": "{amt} de {ptype} en las \u00faltimas 24 h",
        "snow": "nieve",
        "rain": "lluvia",
        "mixed_precip": "precipitaci\u00f3n mixta",
        # Daily precip types
        "Snow": "Nieve",
        "Rain": "Lluvia",
        "Mix": "Mixta",
        # Alert modal hints
        "q_to_close": "q para cerrar",
        "o_to_open": "o para abrir en el navegador",
        "scroll": "desplazar",
    },
    "de": {
        "today": "Heute",
        "today_short": "Heu",
        "feels": "gef\u00fchlt",
        "wind": "Wind",
        "gusts": "B\u00f6en",
        "until": "bis",
        # Comparative line
        "same_temp": "etwa so warm wie {ref_day}",
        "bit_warmer": "etwas w\u00e4rmer als {ref_day}",
        "bit_cooler": "etwas k\u00fchler als {ref_day}",
        "warmer": "w\u00e4rmer als {ref_day}",
        "cooler": "k\u00fchler als {ref_day}",
        "much_warmer": "deutlich w\u00e4rmer als {ref_day}",
        "much_cooler": "deutlich k\u00fchler als {ref_day}",
        "today_subj": "Heute",
        "tomorrow_subj": "Morgen",
        "yesterday": "gestern",
        "today_ref": "heute",
        "will_be": "{subject} wird es {comparison}",
        # Precipitation line
        "ending": "{desc} endet {time}",
        "continuing": "{desc} den ganzen Tag",
        "starting": "{desc} wahrscheinlich {time}",
        "shortly": "in K\u00fcrze",
        "in_about_an_hour": "in etwa einer Stunde",
        "in_a_couple_hours": "in ein paar Stunden",
        "around": "gegen {time}",
        "tomorrow_morning": "morgen fr\u00fch",
        "tomorrow_afternoon": "morgen Nachmittag",
        "tomorrow_evening": "morgen Abend",
        "on_day": "am {day}",
        # Past precip
        "past_precip": "{amt} {ptype} in den letzten 24 h",
        "snow": "Schnee",
        "rain": "Regen",
        "mixed_precip": "Mischniederschlag",
        # Daily precip types
        "Snow": "Schnee",
        "Rain": "Regen",
        "Mix": "Mix",
        # Alert modal hints
        "q_to_close": "q zum Schlie\u00dfen",
        "o_to_open": "o zum \u00d6ffnen im Browser",
        "scroll": "scrollen",
    },
    "no": {
        "today": "i dag",
        "today_short": "I d",
        "feels": "f\u00f8les",
        "wind": "Vind",
        "gusts": "kast",
        "until": "til",
        # Comparative line
        "same_temp": "omtrent like varmt som {ref_day}",
        "bit_warmer": "litt varmere enn {ref_day}",
        "bit_cooler": "litt kj\u00f8ligere enn {ref_day}",
        "warmer": "varmere enn {ref_day}",
        "cooler": "kj\u00f8ligere enn {ref_day}",
        "much_warmer": "mye varmere enn {ref_day}",
        "much_cooler": "mye kj\u00f8ligere enn {ref_day}",
        "today_subj": "I dag",
        "tomorrow_subj": "I morgen",
        "yesterday": "i g\u00e5r",
        "today_ref": "i dag",
        "will_be": "{subject} blir det {comparison}",
        # Precipitation line
        "ending": "{desc} gir seg {time}",
        "continuing": "{desc} gjennom hele dagen",
        "starting": "{desc} trolig {time}",
        "shortly": "snart",
        "in_about_an_hour": "om cirka en time",
        "in_a_couple_hours": "om et par timer",
        "around": "rundt {time}",
        "tomorrow_morning": "i morgen formiddag",
        "tomorrow_afternoon": "i morgen ettermiddag",
        "tomorrow_evening": "i morgen kveld",
        "on_day": "p\u00e5 {day}",
        # Past precip
        "past_precip": "{amt} {ptype} siste 24 t",
        "snow": "sn\u00f8",
        "rain": "regn",
        "mixed_precip": "blandet nedb\u00f8r",
        # Daily precip types
        "Snow": "Sn\u00f8",
        "Rain": "Regn",
        "Mix": "Bland.",
        # Alert modal hints
        "q_to_close": "q for \u00e5 lukke",
        "o_to_open": "o for \u00e5 \u00e5pne i nettleser",
        "scroll": "rull",
    },
    "is": {
        "today": "\u00ed dag",
        "today_short": "\u00cd d",
        "feels": "finnst",
        "wind": "Vindur",
        "gusts": "kast",
        "until": "til",
        # Comparative line
        "same_temp": "svipa\u00f0 hitastig og {ref_day}",
        "bit_warmer": "a\u00f0eins hl\u00fdrra en {ref_day}",
        "bit_cooler": "a\u00f0eins kaldara en {ref_day}",
        "warmer": "hl\u00fdrra en {ref_day}",
        "cooler": "kaldara en {ref_day}",
        "much_warmer": "mun hl\u00fdrra en {ref_day}",
        "much_cooler": "mun kaldara en {ref_day}",
        "today_subj": "\u00cd dag",
        "tomorrow_subj": "\u00c1 morgun",
        "yesterday": "\u00ed g\u00e6r",
        "today_ref": "\u00ed dag",
        "will_be": "{subject} ver\u00f0ur {comparison}",
        # Precipitation line
        "ending": "{desc} h\u00e6ttir {time}",
        "continuing": "{desc} allan daginn",
        "starting": "{desc} l\u00edklega {time}",
        "shortly": "br\u00e1\u00f0lega",
        "in_about_an_hour": "eftir um klukkustund",
        "in_a_couple_hours": "eftir nokkrar klukkustundir",
        "around": "um {time}",
        "tomorrow_morning": "snemma \u00e1 morgun",
        "tomorrow_afternoon": "\u00e1 morgun eftir h\u00e1degi",
        "tomorrow_evening": "\u00e1 morgun s\u00ed\u00f0degis",
        "on_day": "\u00e1 {day}",
        # Past precip
        "past_precip": "{amt} af {ptype} s\u00ed\u00f0ustu 24 klst.",
        "snow": "snj\u00f3",
        "rain": "rigningu",
        "mixed_precip": "\u00farkoma",
        # Daily precip types
        "Snow": "Snj\u00f3r",
        "Rain": "Rigning",
        "Mix": "Bland.",
        # Alert modal hints
        "q_to_close": "q til a\u00f0 loka",
        "o_to_open": "o til a\u00f0 opna \u00ed vafra",
        "scroll": "skruna",
    },
    "da": {
        "today": "i dag",
        "today_short": "I d",
        "feels": "f\u00f8les",
        "wind": "Vind",
        "gusts": "kast",
        "until": "til",
        # Comparative line
        "same_temp": "omtrent samme temperatur som {ref_day}",
        "bit_warmer": "lidt varmere end {ref_day}",
        "bit_cooler": "lidt k\u00f8ligere end {ref_day}",
        "warmer": "varmere end {ref_day}",
        "cooler": "k\u00f8ligere end {ref_day}",
        "much_warmer": "meget varmere end {ref_day}",
        "much_cooler": "meget k\u00f8ligere end {ref_day}",
        "today_subj": "I dag",
        "tomorrow_subj": "I morgen",
        "yesterday": "i g\u00e5r",
        "today_ref": "i dag",
        "will_be": "{subject} bliver det {comparison}",
        # Precipitation line
        "ending": "{desc} aftager {time}",
        "continuing": "{desc} hele dagen",
        "starting": "{desc} sandsynlig {time}",
        "shortly": "snart",
        "in_about_an_hour": "om cirka en time",
        "in_a_couple_hours": "om et par timer",
        "around": "omkring {time}",
        "tomorrow_morning": "i morgen tidlig",
        "tomorrow_afternoon": "i morgen eftermiddag",
        "tomorrow_evening": "i morgen aften",
        "on_day": "p\u00e5 {day}",
        # Past precip
        "past_precip": "{amt} {ptype} de seneste 24 t",
        "snow": "sne",
        "rain": "regn",
        "mixed_precip": "blandet nedb\u00f8r",
        # Daily precip types
        "Snow": "Sne",
        "Rain": "Regn",
        "Mix": "Bland.",
        # Alert modal hints
        "q_to_close": "q for at lukke",
        "o_to_open": "o for at \u00e5bne i browser",
        "scroll": "rul",
    },
    "it": {
        "today": "oggi",
        "today_short": "ogg",
        "feels": "perc.",
        "wind": "Vento",
        "gusts": "raffiche",
        "until": "fino a",
        # Comparative line
        "same_temp": "circa la stessa temperatura di {ref_day}",
        "bit_warmer": "un po\u2019 pi\u00f9 caldo di {ref_day}",
        "bit_cooler": "un po\u2019 pi\u00f9 fresco di {ref_day}",
        "warmer": "pi\u00f9 caldo di {ref_day}",
        "cooler": "pi\u00f9 fresco di {ref_day}",
        "much_warmer": "molto pi\u00f9 caldo di {ref_day}",
        "much_cooler": "molto pi\u00f9 fresco di {ref_day}",
        "today_subj": "Oggi",
        "tomorrow_subj": "Domani",
        "yesterday": "ieri",
        "today_ref": "oggi",
        "will_be": "{subject} sar\u00e0 {comparison}",
        # Precipitation line
        "ending": "{desc} in esaurimento {time}",
        "continuing": "{desc} per tutta la giornata",
        "starting": "{desc} probabile {time}",
        "shortly": "a breve",
        "in_about_an_hour": "tra circa un\u2019ora",
        "in_a_couple_hours": "tra un paio d\u2019ore",
        "around": "verso le {time}",
        "tomorrow_morning": "domani mattina",
        "tomorrow_afternoon": "domani pomeriggio",
        "tomorrow_evening": "domani sera",
        "on_day": "{day}",
        # Past precip
        "past_precip": "{amt} di {ptype} nelle ultime 24 h",
        "snow": "neve",
        "rain": "pioggia",
        "mixed_precip": "precipitazioni miste",
        # Daily precip types
        "Snow": "Neve",
        "Rain": "Pioggia",
        "Mix": "Misto",
        # Alert modal hints
        "q_to_close": "q per chiudere",
        "o_to_open": "o per aprire nel browser",
        "scroll": "scorrere",
    },
    "pl": {
        "today": "dzi\u015b",
        "today_short": "dzi",
        "feels": "odcz.",
        "wind": "Wiatr",
        "gusts": "porywy",
        "until": "do",
        # Comparative line
        "same_temp": "mniej wi\u0119cej taka sama temperatura jak {ref_day}",
        "bit_warmer": "troch\u0119 cieplej ni\u017c {ref_day}",
        "bit_cooler": "troch\u0119 ch\u0142odniej ni\u017c {ref_day}",
        "warmer": "cieplej ni\u017c {ref_day}",
        "cooler": "ch\u0142odniej ni\u017c {ref_day}",
        "much_warmer": "znacznie cieplej ni\u017c {ref_day}",
        "much_cooler": "znacznie ch\u0142odniej ni\u017c {ref_day}",
        "today_subj": "Dzi\u015b",
        "tomorrow_subj": "Jutro",
        "yesterday": "wczoraj",
        "today_ref": "dzi\u015b",
        "will_be": "{subject} b\u0119dzie {comparison}",
        # Precipitation line
        "ending": "{desc} ust\u0119puje {time}",
        "continuing": "{desc} przez ca\u0142y dzie\u0144",
        "starting": "{desc} prawdopodobnie {time}",
        "shortly": "wkr\u00f3tce",
        "in_about_an_hour": "za oko\u0142o godzin\u0119",
        "in_a_couple_hours": "za kilka godzin",
        "around": "oko\u0142o {time}",
        "tomorrow_morning": "jutro rano",
        "tomorrow_afternoon": "jutro po po\u0142udniu",
        "tomorrow_evening": "jutro wieczorem",
        "on_day": "w {day}",
        # Past precip
        "past_precip": "{amt} {ptype} w ci\u0105gu ostatnich 24 h",
        "snow": "\u015bniegu",
        "rain": "deszczu",
        "mixed_precip": "opad\u00f3w mieszanych",
        # Daily precip types
        "Snow": "\u015anieg",
        "Rain": "Deszcz",
        "Mix": "Miesz.",
        # Alert modal hints
        "q_to_close": "q aby zamkn\u0105\u0107",
        "o_to_open": "o aby otworzy\u0107 w przegl\u0105darce",
        "scroll": "przewi\u0144",
    },
    "nl": {
        "today": "vandaag",
        "today_short": "van",
        "feels": "voelt",
        "wind": "Wind",
        "gusts": "stoten",
        "until": "tot",
        # Comparative line
        "same_temp": "ongeveer dezelfde temperatuur als {ref_day}",
        "bit_warmer": "iets warmer dan {ref_day}",
        "bit_cooler": "iets koeler dan {ref_day}",
        "warmer": "warmer dan {ref_day}",
        "cooler": "koeler dan {ref_day}",
        "much_warmer": "veel warmer dan {ref_day}",
        "much_cooler": "veel koeler dan {ref_day}",
        "today_subj": "Vandaag",
        "tomorrow_subj": "Morgen",
        "yesterday": "gisteren",
        "today_ref": "vandaag",
        "will_be": "{subject} wordt het {comparison}",
        # Precipitation line
        "ending": "{desc} stopt {time}",
        "continuing": "{desc} de hele dag",
        "starting": "{desc} waarschijnlijk {time}",
        "shortly": "binnenkort",
        "in_about_an_hour": "over ongeveer een uur",
        "in_a_couple_hours": "over een paar uur",
        "around": "rond {time}",
        "tomorrow_morning": "morgenochtend",
        "tomorrow_afternoon": "morgenmiddag",
        "tomorrow_evening": "morgenavond",
        "on_day": "op {day}",
        # Past precip
        "past_precip": "{amt} {ptype} in de afgelopen 24 u",
        "snow": "sneeuw",
        "rain": "regen",
        "mixed_precip": "gemengde neerslag",
        # Daily precip types
        "Snow": "Sneeuw",
        "Rain": "Regen",
        "Mix": "Gem.",
        # Alert modal hints
        "q_to_close": "q om te sluiten",
        "o_to_open": "o om te openen in browser",
        "scroll": "scrollen",
    },
    "pt": {
        "today": "hoje",
        "today_short": "hoj",
        "feels": "sens.",
        "wind": "Vento",
        "gusts": "rajadas",
        "until": "at\u00e9",
        # Comparative line
        "same_temp": "aproximadamente a mesma temperatura que {ref_day}",
        "bit_warmer": "um pouco mais quente que {ref_day}",
        "bit_cooler": "um pouco mais fresco que {ref_day}",
        "warmer": "mais quente que {ref_day}",
        "cooler": "mais fresco que {ref_day}",
        "much_warmer": "muito mais quente que {ref_day}",
        "much_cooler": "muito mais fresco que {ref_day}",
        "today_subj": "Hoje",
        "tomorrow_subj": "Amanh\u00e3",
        "yesterday": "ontem",
        "today_ref": "hoje",
        "will_be": "{subject} ser\u00e1 {comparison}",
        # Precipitation line
        "ending": "{desc} terminando {time}",
        "continuing": "{desc} durante todo o dia",
        "starting": "{desc} prov\u00e1vel {time}",
        "shortly": "em breve",
        "in_about_an_hour": "dentro de cerca de uma hora",
        "in_a_couple_hours": "dentro de algumas horas",
        "around": "por volta das {time}",
        "tomorrow_morning": "amanh\u00e3 de manh\u00e3",
        "tomorrow_afternoon": "amanh\u00e3 \u00e0 tarde",
        "tomorrow_evening": "amanh\u00e3 \u00e0 noite",
        "on_day": "{day}",
        # Past precip
        "past_precip": "{amt} de {ptype} nas \u00faltimas 24 h",
        "snow": "neve",
        "rain": "chuva",
        "mixed_precip": "precipita\u00e7\u00e3o mista",
        # Daily precip types
        "Snow": "Neve",
        "Rain": "Chuva",
        "Mix": "Misto",
        # Alert modal hints
        "q_to_close": "q para fechar",
        "o_to_open": "o para abrir no navegador",
        "scroll": "rolar",
    },
    "sv": {
        "today": "i dag",
        "today_short": "I d",
        "feels": "k\u00e4nns",
        "wind": "Vind",
        "gusts": "byar",
        "until": "till",
        # Comparative line
        "same_temp": "ungef\u00e4r samma temperatur som {ref_day}",
        "bit_warmer": "lite varmare \u00e4n {ref_day}",
        "bit_cooler": "lite svalare \u00e4n {ref_day}",
        "warmer": "varmare \u00e4n {ref_day}",
        "cooler": "svalare \u00e4n {ref_day}",
        "much_warmer": "mycket varmare \u00e4n {ref_day}",
        "much_cooler": "mycket svalare \u00e4n {ref_day}",
        "today_subj": "I dag",
        "tomorrow_subj": "I morgon",
        "yesterday": "i g\u00e5r",
        "today_ref": "i dag",
        "will_be": "{subject} blir det {comparison}",
        # Precipitation line
        "ending": "{desc} upph\u00f6r {time}",
        "continuing": "{desc} hela dagen",
        "starting": "{desc} troligen {time}",
        "shortly": "snart",
        "in_about_an_hour": "om ungef\u00e4r en timme",
        "in_a_couple_hours": "om ett par timmar",
        "around": "runt {time}",
        "tomorrow_morning": "i morgon bitti",
        "tomorrow_afternoon": "i morgon eftermiddag",
        "tomorrow_evening": "i morgon kv\u00e4ll",
        "on_day": "p\u00e5 {day}",
        # Past precip
        "past_precip": "{amt} {ptype} senaste 24 t",
        "snow": "sn\u00f6",
        "rain": "regn",
        "mixed_precip": "blandad nederb\u00f6rd",
        # Daily precip types
        "Snow": "Sn\u00f6",
        "Rain": "Regn",
        "Mix": "Bland.",
        # Alert modal hints
        "q_to_close": "q f\u00f6r att st\u00e4nga",
        "o_to_open": "o f\u00f6r att \u00f6ppna i webbl\u00e4sare",
        "scroll": "rulla",
    },
    "fi": {
        "today": "t\u00e4n\u00e4\u00e4n",
        "today_short": "t\u00e4n",
        "feels": "tunt.",
        "wind": "Tuuli",
        "gusts": "puuskat",
        "until": "asti",
        # Comparative line
        "same_temp": "suunnilleen sama l\u00e4mp\u00f6tila kuin {ref_day}",
        "bit_warmer": "hieman l\u00e4mpim\u00e4mpi kuin {ref_day}",
        "bit_cooler": "hieman viile\u00e4mpi kuin {ref_day}",
        "warmer": "l\u00e4mpim\u00e4mpi kuin {ref_day}",
        "cooler": "viile\u00e4mpi kuin {ref_day}",
        "much_warmer": "paljon l\u00e4mpim\u00e4mpi kuin {ref_day}",
        "much_cooler": "paljon viile\u00e4mpi kuin {ref_day}",
        "today_subj": "T\u00e4n\u00e4\u00e4n",
        "tomorrow_subj": "Huomenna",
        "yesterday": "eilen",
        "today_ref": "t\u00e4n\u00e4\u00e4n",
        "will_be": "{subject} on {comparison}",
        # Precipitation line
        "ending": "{desc} loppuu {time}",
        "continuing": "{desc} koko p\u00e4iv\u00e4n",
        "starting": "{desc} todenn\u00e4k\u00f6isesti {time}",
        "shortly": "pian",
        "in_about_an_hour": "noin tunnin kuluttua",
        "in_a_couple_hours": "parin tunnin kuluttua",
        "around": "noin {time}",
        "tomorrow_morning": "huomenna aamulla",
        "tomorrow_afternoon": "huomenna iltap\u00e4iv\u00e4ll\u00e4",
        "tomorrow_evening": "huomenna illalla",
        "on_day": "{day}",
        # Past precip
        "past_precip": "{amt} {ptype} viimeisen 24 t aikana",
        "snow": "lunta",
        "rain": "sadetta",
        "mixed_precip": "sekasadetta",
        # Daily precip types
        "Snow": "Lumi",
        "Rain": "Sade",
        "Mix": "Seka",
        # Alert modal hints
        "q_to_close": "q sulkeaksesi",
        "o_to_open": "o avataksesi selaimessa",
        "scroll": "vierit\u00e4",
    },
    "ja": {
        "today": "\u4eca\u65e5",
        "today_short": "\u4eca\u65e5",
        "feels": "\u4f53\u611f",
        "wind": "\u98a8",
        "gusts": "\u7a81\u98a8",
        "until": "\u307e\u3067",
        # Comparative line
        "same_temp": "{ref_day}\u3068\u307b\u307c\u540c\u3058\u6c17\u6e29",
        "bit_warmer": "{ref_day}\u3088\u308a\u3084\u3084\u6696\u304b\u3044",
        "bit_cooler": "{ref_day}\u3088\u308a\u3084\u3084\u6dbc\u3057\u3044",
        "warmer": "{ref_day}\u3088\u308a\u6696\u304b\u3044",
        "cooler": "{ref_day}\u3088\u308a\u6dbc\u3057\u3044",
        "much_warmer": "{ref_day}\u3088\u308a\u304b\u306a\u308a\u6696\u304b\u3044",
        "much_cooler": "{ref_day}\u3088\u308a\u304b\u306a\u308a\u6dbc\u3057\u3044",
        "today_subj": "\u4eca\u65e5",
        "tomorrow_subj": "\u660e\u65e5",
        "yesterday": "\u6628\u65e5",
        "today_ref": "\u4eca\u65e5",
        "will_be": "{subject}\u306f{comparison}",
        # Precipitation line
        "ending": "{desc} {time}\u3084\u3080",
        "continuing": "{desc} \u4e00\u65e5\u4e2d\u7d9a\u304f",
        "starting": "{desc} {time}\u964d\u308a\u305d\u3046",
        "shortly": "\u307e\u3082\u306a\u304f",
        "in_about_an_hour": "\u7d041\u6642\u9593\u5f8c\u306b",
        "in_a_couple_hours": "\u6570\u6642\u9593\u5f8c\u306b",
        "around": "{time}\u9803\u306b",
        "tomorrow_morning": "\u660e\u65e5\u306e\u671d\u306b",
        "tomorrow_afternoon": "\u660e\u65e5\u306e\u5348\u5f8c\u306b",
        "tomorrow_evening": "\u660e\u65e5\u306e\u5915\u65b9\u306b",
        "on_day": "{day}\u306b",
        # Past precip
        "past_precip": "\u904e\u53bb24\u6642\u9593\u306e{ptype} {amt}",
        "snow": "\u964d\u96ea",
        "rain": "\u964d\u96e8",
        "mixed_precip": "\u6df7\u5408\u964d\u6c34",
        # Daily precip types
        "Snow": "\u96ea",
        "Rain": "\u96e8",
        "Mix": "\u6df7\u5408",
        # Alert modal hints
        "q_to_close": "q \u3067\u9589\u3058\u308b",
        "o_to_open": "o \u3067\u30d6\u30e9\u30a6\u30b6\u3092\u958b\u304f",
        "scroll": "\u30b9\u30af\u30ed\u30fc\u30eb",
    },
    "ko": {
        "today": "\uc624\ub298",
        "today_short": "\uc624\ub298",
        "feels": "\uccb4\uac10",
        "wind": "\ubc14\ub78c",
        "gusts": "\ub3cc\ud48d",
        "until": "\uae4c\uc9c0",
        # Comparative line
        "same_temp": "{ref_day}\uacfc \ube44\uc2b7\ud55c \uae30\uc628",
        "bit_warmer": "{ref_day}\ubcf4\ub2e4 \uc870\uae08 \ub530\ub73b\ud568",
        "bit_cooler": "{ref_day}\ubcf4\ub2e4 \uc870\uae08 \uc11c\ub298\ud568",
        "warmer": "{ref_day}\ubcf4\ub2e4 \ub530\ub73b\ud568",
        "cooler": "{ref_day}\ubcf4\ub2e4 \uc11c\ub298\ud568",
        "much_warmer": "{ref_day}\ubcf4\ub2e4 \ud6e8\uc52c \ub530\ub73b\ud568",
        "much_cooler": "{ref_day}\ubcf4\ub2e4 \ud6e8\uc52c \uc11c\ub298\ud568",
        "today_subj": "\uc624\ub298",
        "tomorrow_subj": "\ub0b4\uc77c",
        "yesterday": "\uc5b4\uc81c",
        "today_ref": "\uc624\ub298",
        "will_be": "{subject}\uc740 {comparison}",
        # Precipitation line
        "ending": "{desc} {time} \uadf8\uce68",
        "continuing": "{desc} \ud558\ub8e8 \uc885\uc77c",
        "starting": "{desc} {time} \uc608\uc0c1",
        "shortly": "\uace7",
        "in_about_an_hour": "\uc57d 1\uc2dc\uac04 \ud6c4",
        "in_a_couple_hours": "\uba87 \uc2dc\uac04 \ud6c4",
        "around": "{time}\uacbd",
        "tomorrow_morning": "\ub0b4\uc77c \uc544\uce68",
        "tomorrow_afternoon": "\ub0b4\uc77c \uc624\ud6c4",
        "tomorrow_evening": "\ub0b4\uc77c \uc800\ub141",
        "on_day": "{day}\uc5d0",
        # Past precip
        "past_precip": "\uc9c0\ub09c 24\uc2dc\uac04 {ptype} {amt}",
        "snow": "\uac15\uc124",
        "rain": "\uac15\uc6b0",
        "mixed_precip": "\ud63c\ud569 \uac15\uc218",
        # Daily precip types
        "Snow": "\ub208",
        "Rain": "\ube44",
        "Mix": "\ud63c\ud569",
        # Alert modal hints
        "q_to_close": "q \ub2eb\uae30",
        "o_to_open": "o \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \uc5f4\uae30",
        "scroll": "\uc2a4\ud06c\ub864",
    },
    "zh": {
        "today": "\u4eca\u5929",
        "today_short": "\u4eca\u5929",
        "feels": "\u4f53\u611f",
        "wind": "\u98ce",
        "gusts": "\u9635\u98ce",
        "until": "\u5230",
        # Comparative line
        "same_temp": "\u4e0e{ref_day}\u6c14\u6e29\u76f8\u8fd1",
        "bit_warmer": "\u6bd4{ref_day}\u7a0d\u6696",
        "bit_cooler": "\u6bd4{ref_day}\u7a0d\u51c9",
        "warmer": "\u6bd4{ref_day}\u6696\u548c",
        "cooler": "\u6bd4{ref_day}\u51c9\u723d",
        "much_warmer": "\u6bd4{ref_day}\u6696\u548c\u5f88\u591a",
        "much_cooler": "\u6bd4{ref_day}\u51c9\u723d\u5f88\u591a",
        "today_subj": "\u4eca\u5929",
        "tomorrow_subj": "\u660e\u5929",
        "yesterday": "\u6628\u5929",
        "today_ref": "\u4eca\u5929",
        "will_be": "{subject}{comparison}",
        # Precipitation line
        "ending": "{desc} {time}\u505c\u6b62",
        "continuing": "{desc} \u6301\u7eed\u4e00\u6574\u5929",
        "starting": "{desc} \u53ef\u80fd{time}\u5f00\u59cb",
        "shortly": "\u5373\u5c06",
        "in_about_an_hour": "\u7ea6\u4e00\u5c0f\u65f6\u540e",
        "in_a_couple_hours": "\u51e0\u5c0f\u65f6\u540e",
        "around": "{time}\u5de6\u53f3",
        "tomorrow_morning": "\u660e\u5929\u65e9\u4e0a",
        "tomorrow_afternoon": "\u660e\u5929\u4e0b\u5348",
        "tomorrow_evening": "\u660e\u5929\u665a\u4e0a",
        "on_day": "{day}",
        # Past precip
        "past_precip": "\u8fc7\u53bb24\u5c0f\u65f6{ptype} {amt}",
        "snow": "\u964d\u96ea",
        "rain": "\u964d\u96e8",
        "mixed_precip": "\u6df7\u5408\u964d\u6c34",
        # Daily precip types
        "Snow": "\u96ea",
        "Rain": "\u96e8",
        "Mix": "\u6df7\u5408",
        # Alert modal hints
        "q_to_close": "q \u5173\u95ed",
        "o_to_open": "o \u5728\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00",
        "scroll": "\u6eda\u52a8",
    },
}


def _s(key, runtime, **kwargs):
    """Look up a localized string, with optional format substitution."""
    lang = getattr(runtime, "lang", "en")
    template = _STRINGS.get(lang, _STRINGS["en"]).get(key, _STRINGS["en"].get(key, key))
    return template.format(**kwargs) if kwargs else template
