"""Interface translations: English, German, French, Italian and Romansh (Rumantsch Grischun).
Every visible string lives here. Templates use {placeholders}; values are HTML-escaped by t().
Strings ending in _html may contain trusted markup.
The Romansh (rm) texts are Rumantsch Grischun, drafted by hand and cross-checked against the
ZurichNLP Romansh NLLB model. Have a native speaker review them before relying on them.
"""
import html
LANGS = {"en": "EN", "de": "DE", "fr": "FR", "it": "IT", "rm": "RM"}
DEFAULT_LANG = "en"
S = {
# ------------------------------------------------ toolbar
"theme": {
"en": "◐ Light / Dark", "de": "◐ Hell / Dunkel", "fr": "◐ Clair / Sombre",
"it": "◐ Chiaro / Scuro", "rm": "◐ Cler / Stgir",
},
"about": {"en": "About", "de": "Über Clerina", "fr": "À propos", "it": "Informazioni", "rm": "Davart Clerina"},
"back": {"en": "Back to Clerina", "de": "Zurück zu Clerina", "fr": "Retour à Clerina", "it": "Torna a Clerina",
"rm": "Enavos tar Clerina"},
"map_title": {"en": "Map of the Romansh idioms", "de": "Karte der romanischen Idiome",
"fr": "Carte des idiomes romanches", "it": "Mappa degli idiomi romanci",
"rm": "Charta dals idioms rumantschs"},
"map_legend": {"en": "Idioms", "de": "Idiome", "fr": "Idiomes", "it": "Idiomi", "rm": "Idioms"},
"map_here": {"en": "You are here", "de": "Du bist hier", "fr": "Vous êtes ici", "it": "Sei qui", "rm": "Ti es qua"},
"map_note": {
"en": "Coloured areas: municipalities of the Romansh villages in Clerina, by idiom (approximate). "
"Map and boundaries © swisstopo.",
"de": "Farbige Flächen: Gemeinden der romanischen Dörfer in Clerina, nach Idiom (ungefähr). "
"Karte und Grenzen © swisstopo.",
"fr": "Zones colorées : communes des villages romanches de Clerina, par idiome (approximatif). "
"Carte et limites © swisstopo.",
"it": "Aree colorate: comuni dei villaggi romanci di Clerina, per idioma (indicativo). "
"Mappa e confini © swisstopo.",
"rm": "Surfaschas coluradas: vischnancas dals vitgs rumantschs en Clerina, tenor idiom (approximativ). "
"Charta e cunfins © swisstopo.",
},
"lang_label": {
"en": "Language", "de": "Sprache", "fr": "Langue", "it": "Lingua", "rm": "Lingua",
},
# ------------------------------------------------ hero
"hero_line1": {
"en": "Don't just visit.", "de": "Nicht nur besuchen.", "fr": "Ne faites pas que passer.",
"it": "Non limitarti a visitare.", "rm": "Betg mo visitar.",
},
"hero_line2": {"en": "Say", "de": "Sag", "fr": "Dites", "it": "Dici", "rm": "Di"},
"hero_lead_html": {
"en": "Locals light up when you greet them in their own Romansh. "
"Get the {n} phrases for exactly the village you're in right now.",
"de": "Einheimische strahlen, wenn du sie in ihrem eigenen Romanisch grüsst. "
"Hol dir die {n} Sätze für genau das Dorf, in dem du gerade bist.",
"fr": "Les habitants s'illuminent quand vous les saluez dans leur propre romanche. "
"Découvrez les {n} phrases du village où vous êtes en ce moment.",
"it": "La gente del posto si illumina quando la saluti nel suo romancio. "
"Scopri le {n} frasi del villaggio in cui sei in questo momento.",
"rm": "Ils indigens traglischan, sche ti als salidas en lur agen rumantsch. "
"Prenda las {n} frasas per exact il vitg, nua che ti es gist.",
},
"stat_idioms": {"en": "idioms", "de": "Idiome", "fr": "idiomes", "it": "idiomi", "rm": "idioms"},
"stat_standard": {"en": "written standard", "de": "Schriftsprache", "fr": "langue écrite", "it": "lingua scritta",
"rm": "lingua scritta"},
"std_written": {"en": "written standard", "de": "Schriftsprache", "fr": "forme écrite standard",
"it": "forma scritta standard", "rm": "furma scritta da standard"},
"stat_phrases": {"en": "phrases", "de": "Sätze", "fr": "phrases", "it": "frasi", "rm": "frasas"},
"stat_speakers": {"en": "speakers", "de": "Sprechende", "fr": "locuteurs", "it": "parlanti", "rm": "pledaders"},
"everywhere": {"en": "Everywhere", "de": "Überall", "fr": "Partout", "it": "Ovunque", "rm": "Dapertut"},
# ------------------------------------------------ step 1
"step1": {
"en": "1. Where are you?", "de": "1. Wo bist du?",
"fr": "1. Où êtes-vous ?", "it": "1. Dove sei?",
"rm": "1. Nua es ti?",
},
"step1_sub": {
"en": "Use your location, or type a town or village.",
"de": "Nutze deinen Standort oder gib einen Ort ein.",
"fr": "Utilisez votre position ou saisissez une localité.",
"it": "Usa la tua posizione o inserisci una località.",
"rm": "Utilisescha tia posiziun u endatescha in lieu.",
},
"city_label": {
"en": "Town or village (optional)", "de": "Ort oder Dorf (optional)",
"fr": "Localité ou village (facultatif)", "it": "Località o villaggio (facoltativo)",
"rm": "Lieu u vitg (opziunal)",
},
"city_ph": {
"en": "Type a town or village, e.g. Scuol, Disentis", "de": "Ort oder Dorf eingeben, z. B. Scuol, Disentis",
"fr": "Saisissez une localité, p. ex. Scuol, Disentis", "it": "Inserisci una località, ad es. Scuol, Disentis",
"rm": "Endatescha in lieu, p.ex. Scuol, Mustér",
},
"search": {"en": "Search", "de": "Suchen", "fr": "Rechercher", "it": "Cerca", "rm": "Tschertgar"},
"or": {"en": "or", "de": "oder", "fr": "ou", "it": "oppure", "rm": "u"},
"locate": {
"en": "📍 Use my location", "de": "📍 Meinen Standort verwenden", "fr": "📍 Utiliser ma position",
"it": "📍 Usa la mia posizione", "rm": "📍 Utilisar mia posiziun",
},
"pick_acc": {
"en": "Or choose an idiom yourself", "de": "Oder wähle selbst ein Idiom",
"fr": "Ou choisissez vous-même un idiome", "it": "Oppure scegli tu un idioma",
"rm": "U tscherna sez in idiom",
},
"pick_label": {
"en": "Romansh idiom", "de": "Romanisches Idiom", "fr": "Idiome romanche",
"it": "Idioma romancio", "rm": "Idiom rumantsch",
},
# ------------------------------------------------ step 2
"step2": {
"en": "2. You are …", "de": "2. Du bist …", "fr": "2. Vous êtes …",
"it": "2. Sei …", "rm": "2. Ti es …",
},
"view_label": {"en": "Show", "de": "Anzeigen", "fr": "Afficher", "it": "Mostra", "rm": "Mussar"},
"view_mine": {"en": "Current idiom", "de": "Aktuelles Idiom", "fr": "Idiome actuel", "it": "Idioma attuale",
"rm": "Idiom actual"},
"view_all": {"en": "All idioms & standard", "de": "Alle Idiome & Standard", "fr": "Tous les idiomes et le standard",
"it": "Tutti gli idiomi e lo standard", "rm": "Tut ils idioms e la furma da standard"},
"empty": {
"en": "Find your location first to see the phrases.",
"de": "Bestimme zuerst deinen Standort, um die Sätze zu sehen.",
"fr": "Indiquez d'abord votre position pour voir les phrases.",
"it": "Indica prima la tua posizione per vedere le frasi.",
"rm": "Fixescha l'emprim tia posiziun per vesair las frasas.",
},
"col_phrase": {"en": "Phrase", "de": "Satz", "fr": "Phrase", "it": "Frase", "rm": "Frasa"},
"col_meaning": {"en": "Meaning", "de": "Bedeutung", "fr": "Signification", "it": "Significato", "rm": "Muntada"},
"col_german": {"en": "German", "de": "Deutsch", "fr": "Allemand", "it": "Tedesco", "rm": "Tudestg"},
"here_in": {
"en": "📍 You are in {place}", "de": "📍 Du bist in {place}", "fr": "📍 Vous êtes à {place}",
"it": "📍 Sei a {place}", "rm": "📍 Ti es en {place}",
},
"here_near": {
"en": "📍 Near {place}", "de": "📍 In der Nähe von {place}", "fr": "📍 Près de {place}",
"it": "📍 Vicino a {place}", "rm": "📍 Datiers da {place}",
},
"here_std": {
"en": "📍 Standard form", "de": "📍 Standardform", "fr": "📍 Forme standard",
"it": "📍 Forma standard", "rm": "📍 Furma da standard",
},
# ------------------------------------------------ region block
"chip": {
"en": "About this region", "de": "Zu dieser Region", "fr": "À propos de la région",
"it": "Sulla regione", "rm": "Davart questa regiun",
},
"region": {"en": "Region", "de": "Region", "fr": "Région", "it": "Regione", "rm": "Regiun"},
"picked": {
"en": "You chose this idiom yourself.", "de": "Du hast dieses Idiom selbst gewählt.",
"fr": "Vous avez choisi cet idiome vous-même.", "it": "Hai scelto tu questo idioma.",
"rm": "Ti has tschernì sez quest idiom.",
},
# location messages (templates)
"src_town": {
"en": "Based on the town you entered.", "de": "Basierend auf dem eingegebenen Ort.",
"fr": "D'après la localité saisie.", "it": "In base alla località inserita.",
"rm": "Basà sin il lieu endatà.",
},
"src_geo": {
"en": "Based on “{city}” ({label}).", "de": "Basierend auf «{city}» ({label}).",
"fr": "D'après « {city} » ({label}).", "it": "In base a «{city}» ({label}).",
"rm": "Basà sin «{city}» ({label}).",
},
"src_device": {
"en": "Based on your device location.", "de": "Basierend auf dem Standort deines Geräts.",
"fr": "D'après la position de votre appareil.", "it": "In base alla posizione del tuo dispositivo.",
"rm": "Basà sin la posiziun da tes apparat.",
},
"in_place": {
"en": "You are in {place}.", "de": "Du bist in {place}.", "fr": "Vous êtes à {place}.",
"it": "Sei a {place}.", "rm": "Ti es en {place}.",
},
"near_place": {
"en": "You are near {place}.", "de": "Du bist in der Nähe von {place}.", "fr": "Vous êtes près de {place}.",
"it": "Sei vicino a {place}.", "rm": "Ti es datiers da {place}.",
},
"local_idiom": {
"en": "The local idiom is {idiom}.", "de": "Das lokale Idiom ist {idiom}.",
"fr": "L'idiome local est le {idiom}.", "it": "L'idioma locale è il {idiom}.",
"rm": "L'idiom local è {idiom}.",
},
"non_rm": {
"en": "Romansh is not the main local language there (German or Italian is).",
"de": "Dort ist Romanisch nicht die Hauptsprache (sondern Deutsch oder Italienisch).",
"fr": "Le romanche n'y est pas la langue principale (c'est l'allemand ou l'italien).",
"it": "Lì il romancio non è la lingua principale (lo sono il tedesco o l'italiano).",
"rm": "Là n'è il rumantsch betg la lingua principala (mabain il tudestg u il talian).",
},
"outside": {
"en": "You seem to be outside Graubünden.", "de": "Du scheinst ausserhalb von Graubünden zu sein.",
"fr": "Vous semblez être en dehors des Grisons.", "it": "Sembra che tu sia fuori dai Grigioni.",
"rm": "Ti paras dad esser ordaifer il Grischun.",
},
"notfound": {
"en": "Couldn't find “{city}”.", "de": "«{city}» wurde nicht gefunden.",
"fr": "« {city} » introuvable.", "it": "«{city}» non trovato.",
"rm": "«{city}» n'è betg vegnì chattà.",
},
"noloc": {
"en": "No location available. Allow location access or enter a town.",
"de": "Kein Standort verfügbar. Erlaube den Standortzugriff oder gib einen Ort ein.",
"fr": "Aucune position disponible. Autorisez l'accès à la position ou saisissez une localité.",
"it": "Nessuna posizione disponibile. Consenti l'accesso alla posizione o inserisci una località.",
"rm": "Nagina posiziun disponibla. Permetta l'access a la posiziun u endatescha in lieu.",
},
"fallback": {
"en": "Showing {idiom}, the written standard.", "de": "Angezeigt wird {idiom}, die Schriftsprache.",
"fr": "Affichage du {idiom}, la forme écrite standard.", "it": "Viene mostrato il {idiom}, la forma scritta standard.",
"rm": "Inditgà vegn {idiom}, la furma scritta da standard.",
},
# ------------------------------------------------ footer
"legend_model": {
'en': 'Not in the Lia Rumantscha dictionary (Pledari Grond): chosen by machine translation and how often the form is used in Romansh texts. Puter and Vallader have no searchable dictionary here.',
'de': 'Nicht im Wörterbuch der Lia Rumantscha (Pledari Grond): per maschineller Übersetzung und Häufigkeit in romanischen Texten gewählt. Für Puter und Vallader ist hier kein durchsuchbares Wörterbuch verfügbar.',
'fr': "Absent du dictionnaire de la Lia Rumantscha (Pledari Grond) : choisi par traduction automatique et selon la fréquence d'usage dans des textes romanches. Le puter et le vallader n'ont pas de dictionnaire consultable ici.",
'it': "Non presente nel dizionario della Lia Rumantscha (Pledari Grond): scelto con traduzione automatica e in base alla frequenza d'uso in testi romanci. Per puter e vallader qui non è disponibile un dizionario consultabile.",
'rm': "Betg en il dicziunari da la Lia Rumantscha (Pledari Grond): tschernì cun translaziun automatica e tenor la frequenza en texts rumantschs. Per il puter ed il vallader n'è nagin dicziunari consultabel disponibel qua.",
},
"play_native": {
'en': 'Play {phrase} (native speaker)',
'de': '{phrase} anhören (Muttersprachler:in)',
'fr': 'Écouter {phrase} (locuteur natif)',
'it': 'Ascolta {phrase} (madrelingua)',
'rm': 'Tadlar {phrase} (pledader(a) nativ(a))',
},
"play_tts": {
'en': 'Play {phrase} (computer voice)',
'de': '{phrase} anhören (Computerstimme)',
'fr': 'Écouter {phrase} (voix de synthèse)',
'it': 'Ascolta {phrase} (voce sintetica)',
'rm': 'Tadlar {phrase} (vusch da computer)',
},
"audio_native": {
'en': 'Recorded by a native speaker.',
'de': 'Von Muttersprachler:innen aufgenommen.',
'fr': 'Enregistré par un locuteur natif.',
'it': 'Registrato da madrelingua.',
'rm': 'Registrà da pledaders nativs.',
},
"audio_tts": {
'en': 'Computer voice (OmniVoice, CC BY-NC) – a rough guide that may not sound like the local idiom. All clips are computer voice for now.',
'de': 'Computerstimme (OmniVoice, CC BY-NC) – eine grobe Orientierung, klingt evtl. nicht wie das lokale Idiom. Vorerst sind alle Aufnahmen Computerstimmen.',
'fr': "Voix de synthèse (OmniVoice, CC BY-NC) – un simple repère qui peut ne pas sonner comme l'idiome local. Pour l'instant, tous les extraits sont des voix de synthèse.",
'it': "Voce sintetica (OmniVoice, CC BY-NC) – solo un'indicazione, potrebbe non suonare come l'idioma locale. Per ora tutti gli audio sono voci sintetiche.",
'rm': "Vusch da computer (OmniVoice, CC BY-NC) – mo ina orientaziun che na tuna forsa betg sco l'idiom local. Per ussa èn tut ils tocs vuschs da computer.",
},
"guide": {"en": "Romansh phrases in all idioms", "de": "Romanische Sätze in allen Idiomen",
"fr": "Phrases romanches dans tous les idiomes", "it": "Frasi romance in tutti gli idiomi",
"rm": "Frasas en tut ils idioms"},
"footer_html": {
'en': 'Phrases: Pledari Grond dictionary (Lia Rumantscha), ranked by how often each form is used in ZurichNLP\'s Romansh corpora; entries marked † come from the ZurichNLP Romansh NLLB model (CC BY-NC 4.0). Independent project, not affiliated with Switzerland Tourism.',
'de': 'Sätze: Wörterbuch Pledari Grond (Lia Rumantscha), gewichtet nach Gebrauchshäufigkeit in den romanischen Textkorpora von ZurichNLP; mit † markierte Einträge stammen vom ZurichNLP Romansh NLLB-Modell (CC BY-NC 4.0). Unabhängiges Projekt, nicht mit Schweiz Tourismus verbunden.',
'fr': 'Phrases : dictionnaire Pledari Grond (Lia Rumantscha), classées selon leur fréquence d\'usage dans les corpus romanches de ZurichNLP ; les entrées marquées † proviennent du modèle ZurichNLP Romansh NLLB (CC BY-NC 4.0). Projet indépendant, sans lien avec Suisse Tourisme.',
'it': 'Frasi: dizionario Pledari Grond (Lia Rumantscha), ordinate per frequenza d\'uso nei corpora romanci di ZurichNLP; le voci contrassegnate da † provengono dal modello ZurichNLP Romansh NLLB (CC BY-NC 4.0). Progetto indipendente, non affiliato a Svizzera Turismo.',
'rm': 'Frasas: dicziunari Pledari Grond (Lia Rumantscha), ponderadas tenor la frequenza d\'utilisaziun en ils corpus rumantschs da ZurichNLP; endataziuns cun † derivan dal model ZurichNLP Romansh NLLB (CC BY-NC 4.0). Project independent, betg collià cun Svizra Turissem.',
},
# ------------------------------------------------ translate tab (hidden by default)
"tab_phrases": {"en": "Phrases", "de": "Sätze", "fr": "Phrases", "it": "Frasi", "rm": "Frasas"},
"tab_translate": {"en": "Translate", "de": "Übersetzen", "fr": "Traduire", "it": "Traduci", "rm": "Translatar"},
}
REGIONS = {
"en": {
"rm-sursilv": "Surselva (Vorderrhein valley: Disentis/Mustér, Ilanz/Glion, Flims, Lumnezia)",
"rm-sutsilv": "Sutselva (Schams/Schons, Domleschg/Tumleastga, Heinzenberg)",
"rm-surmiran": "Surmeir (Albula/Alvra valley and Surses/Oberhalbstein)",
"rm-puter": "Upper Engadine (Engiadin'Ota)",
"rm-vallader": "Lower Engadine (Engiadina Bassa) and Val Müstair",
"rm-rumgr": "Standard written Romansh used by the canton, media and schools",
},
"de": {
"rm-sursilv": "Surselva (Vorderrheintal: Disentis/Mustér, Ilanz/Glion, Flims, Lumnezia)",
"rm-sutsilv": "Sutselva (Schams/Schons, Domleschg/Tumleastga, Heinzenberg)",
"rm-surmiran": "Surmeir (Albulatal/Alvra und Surses/Oberhalbstein)",
"rm-puter": "Oberengadin (Engiadin'Ota)",
"rm-vallader": "Unterengadin (Engiadina Bassa) und Val Müstair",
"rm-rumgr": "Romanische Standardschriftsprache von Kanton, Medien und Schulen",
},
"fr": {
"rm-sursilv": "Surselva (vallée du Rhin antérieur : Disentis/Mustér, Ilanz/Glion, Flims, Lumnezia)",
"rm-sutsilv": "Sutselva (Schams/Schons, Domleschg/Tumleastga, Heinzenberg)",
"rm-surmiran": "Surmeir (vallée de l'Albula/Alvra et Surses/Oberhalbstein)",
"rm-puter": "Haute-Engadine (Engiadin'Ota)",
"rm-vallader": "Basse-Engadine (Engiadina Bassa) et Val Müstair",
"rm-rumgr": "Romanche écrit standard utilisé par le canton, les médias et les écoles",
},
"it": {
"rm-sursilv": "Surselva (valle del Reno anteriore: Disentis/Mustér, Ilanz/Glion, Flims, Lumnezia)",
"rm-sutsilv": "Sutselva (Schams/Schons, Domleschg/Tumleastga, Heinzenberg)",
"rm-surmiran": "Surmeir (valle dell'Albula/Alvra e Surses/Oberhalbstein)",
"rm-puter": "Alta Engadina (Engiadin'Ota)",
"rm-vallader": "Bassa Engadina (Engiadina Bassa) e Val Müstair",
"rm-rumgr": "Romancio scritto standard usato da cantone, media e scuole",
},
"rm": {
"rm-sursilv": "Surselva (Val dal Rain Anteriur: Mustér, Glion, Flem, Lumnezia)",
"rm-sutsilv": "Sutselva (Schons, Tumleastga, Mantogna)",
"rm-surmiran": "Surmeir (Val d'Alvra e Surses)",
"rm-puter": "Engiadin'Ota",
"rm-vallader": "Engiadina Bassa e Val Müstair",
"rm-rumgr": "Lingua scritta da standard rumantscha dal chantun, da las medias e da las scolas",
},
}
TIPS = {
"en": {
"rm-sursilv": "Surselva is the largest Romansh-speaking area. Greet people in shops and on hiking trails, even if you continue in German.",
"rm-sutsilv": "Sutsilvan is the smallest idiom and has few speakers. Locals especially value a visitor's effort here.",
"rm-surmiran": "Romansh is used in daily life in many villages of Surmeir, often alongside German and Italian.",
"rm-puter": "In the Upper Engadine, German has become common in the tourist centers, so a Romansh greeting stands out and is a friendly conversation starter.",
"rm-vallader": "The Lower Engadine and Val Müstair are among the strongest Romansh areas. People often use Romansh as their everyday language. (Val Müstair speaks Jauer, a variety close to Vallader.)",
"rm-rumgr": "Rumantsch Grischun is the standard form that everyone understands, but in villages people speak their own idiom.",
},
"de": {
"rm-sursilv": "Die Surselva ist das grösste romanischsprachige Gebiet. Grüsse in Läden und auf Wanderwegen auf Romanisch, auch wenn du danach Deutsch sprichst.",
"rm-sutsilv": "Sutsilvan ist das kleinste Idiom mit wenigen Sprechenden. Hier wird die Mühe von Gästen besonders geschätzt.",
"rm-surmiran": "In vielen Dörfern im Surmeir wird Romanisch im Alltag gesprochen, oft neben Deutsch und Italienisch.",
"rm-puter": "Im Oberengadin ist in den Tourismusorten Deutsch verbreitet – ein romanischer Gruss fällt auf und ist ein sympathischer Gesprächseinstieg.",
"rm-vallader": "Das Unterengadin und das Val Müstair gehören zu den stärksten romanischen Gebieten. Romanisch ist hier oft Alltagssprache. (Im Val Müstair spricht man Jauer, eine Varietät nahe am Vallader.)",
"rm-rumgr": "Rumantsch Grischun ist die Standardform, die alle verstehen – in den Dörfern spricht man aber das eigene Idiom.",
},
"fr": {
"rm-sursilv": "La Surselva est la plus grande région romanchophone. Saluez en romanche dans les magasins et sur les sentiers, même si vous continuez en allemand.",
"rm-sutsilv": "Le sutsilvan est le plus petit idiome et compte peu de locuteurs. Les habitants apprécient tout particulièrement l'effort des visiteurs.",
"rm-surmiran": "Dans de nombreux villages du Surmeir, le romanche est parlé au quotidien, souvent avec l'allemand et l'italien.",
"rm-puter": "En Haute-Engadine, l'allemand est courant dans les centres touristiques : une salutation en romanche se remarque et ouvre la conversation.",
"rm-vallader": "La Basse-Engadine et le Val Müstair comptent parmi les régions où le romanche est le plus vivant. C'est souvent la langue de tous les jours. (Au Val Müstair, on parle le jauer, proche du vallader.)",
"rm-rumgr": "Le rumantsch grischun est la forme standard que tout le monde comprend, mais dans les villages on parle son propre idiome.",
},
"it": {
"rm-sursilv": "La Surselva è la più grande area di lingua romancia. Saluta in romancio nei negozi e sui sentieri, anche se poi continui in tedesco.",
"rm-sutsilv": "Il sutsilvano è l'idioma più piccolo, con pochi parlanti. Qui l'impegno dei visitatori è particolarmente apprezzato.",
"rm-surmiran": "In molti villaggi del Surmeir il romancio si usa nella vita quotidiana, spesso accanto al tedesco e all'italiano.",
"rm-puter": "In Alta Engadina il tedesco è diffuso nei centri turistici: un saluto in romancio si nota ed è un ottimo modo per iniziare una conversazione.",
"rm-vallader": "La Bassa Engadina e la Val Müstair sono tra le aree in cui il romancio è più vivo, spesso come lingua di tutti i giorni. (In Val Müstair si parla il jauer, vicino al vallader.)",
"rm-rumgr": "Il rumantsch grischun è la forma standard che tutti capiscono, ma nei villaggi si parla il proprio idioma.",
},
"rm": {
"rm-sursilv": "La Surselva è il pli grond territori rumantsch. Salida en rumantsch en butias e sin sendas, era sche ti discurras suenter tudestg.",
"rm-sutsilv": "Il sutsilvan è il pli pitschen idiom cun paucs pledaders. Qua vegn la fadia dals giasts appreziada spezialmain.",
"rm-surmiran": "En blers vitgs en il Surmeir vegn discurrì rumantsch en il mintgadi, savens sper il tudestg ed il talian.",
"rm-puter": "En l'Engiadin'Ota è il tudestg derasà en ils lieus turistics – in salid rumantsch dat en egl ed è in'entschatta simpatica dal discurs.",
"rm-vallader": "L'Engiadina Bassa e la Val Müstair tutgan tar ils territoris ils pli ferm rumantschs. Il rumantsch è qua savens la lingua dal mintgadi. (En la Val Müstair discurr'ins jauer, ina varietad datiers dal vallader.)",
"rm-rumgr": "Il rumantsch grischun è la furma da standard che tuts chapeschan – en ils vitgs discurr'ins dentant l'agen idiom.",
},
}
# Meaning of each phrase plus the counting row, in the same order as romansh.phrase_rows().
MEANINGS = {
"en": ["Hello! (the classic Romansh greeting)", "Good morning!", "Good evening!", "Good night!", "Goodbye!",
"How are you?", "Thank you very much!", "Please.", "Excuse me.", "Enjoy your meal!", "Cheers! (when drinking)", "Counting 1–10"],
"de": ["Hallo! (der klassische romanische Gruss)", "Guten Morgen!", "Guten Abend!", "Gute Nacht!",
"Auf Wiedersehen!", "Wie geht es dir?", "Danke vielmals!", "Bitte.", "Entschuldigung.", "Guten Appetit!", "Prost! (beim Anstossen)", "Zählen 1–10"],
"fr": ["Bonjour ! (la salutation romanche classique)", "Bonjour ! (le matin)", "Bonsoir !", "Bonne nuit !",
"Au revoir !", "Comment ça va ?", "Merci beaucoup !", "S'il vous plaît.", "Excusez-moi.", "Bon appétit !", "Santé ! (en trinquant)", "Compter de 1 à 10"],
"it": ["Ciao! (il classico saluto romancio)", "Buongiorno!", "Buonasera!", "Buonanotte!", "Arrivederci!",
"Come stai?", "Grazie mille!", "Per favore.", "Scusi.", "Buon appetito!", "Salute! (al brindisi)", "Contare da 1 a 10"],
}
def t(lang, key, **kw):
"""Translated string; {placeholders} are HTML-escaped, keys ending in _html are trusted markup."""
entry = S[key]
text = entry.get(lang) or entry[DEFAULT_LANG]
if kw:
text = text.format(**{k: html.escape(str(v)) for k, v in kw.items()})
return text
def meanings(lang):
"""Phrase meanings for the table: (primary, secondary-or-None).
Romansh UI shows German as the meaning (the reader already sees the Romansh);
other languages show their own text plus German, the language most heard locally.
"""
if lang == "rm":
return [(m, None) for m in MEANINGS["de"]]
primary = MEANINGS.get(lang, MEANINGS[DEFAULT_LANG])
if lang == "de":
return [(m, None) for m in primary]
return list(zip(primary, MEANINGS["de"]))
def detect(browser_lang):
"""Map a browser language like 'de-CH' or 'rm' to a supported UI language."""
code = (browser_lang or "").lower()[:2]
return code if code in LANGS else DEFAULT_LANG