diff --git a/.gitignore b/.gitignore index 3b87454..39548b6 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,16 @@ AGENTS.md # Claude Code scratch: throwaway probe scripts, never committed /.scratch + +# Empty stubs the Claude Code sandbox mounts over shell/editor dotfiles while it +# runs. They are not project files and keep sneaking into commits via `git add -A`. +/.bash_profile +/.bashrc +/.profile +/.zprofile +/.zshrc +/.gitconfig +/.gitmodules +/.ripgreprc +/.idea +/.mcp.json diff --git a/README.md b/README.md index 6e7136a..0790d6e 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ Pages that are not prerendered (unlisted cities, GPS coordinate routes like and resolves the location client-side. Configure the server to serve `404.html` for unknown paths. +Serve it as an **internal rewrite (200)**, not as an error page. `error_page +404 /404.html` sends the right body with a 404 status: the page works, but +every hard reload of an unprerendered URL logs a 404 in the network panel and +tells crawlers the page does not exist. `try_files` with a URI as its last +argument does an internal redirect instead, and answers 200. + ### 2. Cross-origin isolation (SharedArrayBuffer for the embedded map) The `/weather/maps/` page embeds `maps.open-meteo.com`, which uses @@ -83,11 +89,12 @@ drizzli.example.com { server { server_name drizzli.example.com; root /srv/drizzli; - error_page 404 /404.html; add_header Cross-Origin-Opener-Policy "same-origin" always; add_header Cross-Origin-Embedder-Policy "require-corp" always; location / { - try_files $uri $uri/ =404; + # the trailing /404.html is a URI, so nginx rewrites internally and + # answers 200 - `error_page 404 /404.html` would answer 404 instead + try_files $uri $uri/index.html /404.html; } } ``` diff --git a/messages/de.json b/messages/de.json index 56e29ee..93a7c0e 100644 --- a/messages/de.json +++ b/messages/de.json @@ -1,6 +1,6 @@ { "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_week": "7-Tage-Vorhersage", + "nav_week": "Wochenvorhersage", "nav_compare": "Modellvergleich", "nav_14day": "14-Tage-Vorhersage", "nav_seasonal": "Saisonal", @@ -44,7 +44,7 @@ "day_today": "Heute", "day_tomorrow": "Morgen", "day_yesterday": "Gestern", - "page_week_subtitle": "7-Tage-Vorhersage", + "page_week_subtitle": "Wochenvorhersage", "page_compare_subtitle": "Modellvergleich", "page_14day_subtitle": "14-Tage-Ensemblevorhersage", "page_seasonal_subtitle": "Saisonale Aussichten", @@ -101,7 +101,7 @@ "period_morning": "morgens", "period_afternoon": "nachmittags", "period_evening": "in den Abendstunden", - "footer_tagline": "Schnelle, unkomplizierte Wettervorhersagen auf Basis offener Daten.", + "footer_tagline": "Schnelle, gratis, unkomplizierte Wettervorhersagen auf Basis offener Daten.", "footer_data_by": "Wetterdaten von", "footer_forecasts": "Vorhersagen", "footer_popular": "Beliebte Orte", @@ -260,6 +260,8 @@ "table_interval_aria": "Stundenintervall", "table_now": "Jetzt", "interval_toggle": "Zwischen 1- und 3-Stunden-Intervall wechseln", + "page_loading": "Wird geladen…", + "page_loading_dismiss": "Schließen", "charts_loading": "Diagramme werden geladen…", "chart_download": "Meteogramm als PNG-Bild herunterladen", "chart_credit_viz": "Visualisierung von", @@ -267,7 +269,7 @@ "legend_show": "Legende anzeigen", "meteograms_none_before": "Keine Meteogramme konfiguriert,", "meteograms_none_action": "fügen Sie Variablen hinzu", - "meteograms_none_historical": "Keine Meteogramme konfiguriert. Fügen Sie Variablen auf der 7-Tage-Seite hinzu.", + "meteograms_none_historical": "Keine Meteogramme konfiguriert. Fügen Sie Variablen auf der Wochenvorhersage-Seite hinzu.", "search_searching": "Wird gesucht…", "search_favorites": "Favoriten", "search_recent": "Zuletzt", @@ -280,6 +282,7 @@ "model_automatic_selection": "Automatische Auswahl", "model_selector_aria": "Auswahl: {label}", "compare_models_heading": "Modelle", + "compare_models_choose": "Modelle für den Vergleich wählen", "compare_variables_heading": "Stündliche Wettervariablen", "compare_standard_preset": "Standardvergleich", "compare_weather_conditions": "Wetterlage & Gesamtbewölkung", @@ -385,5 +388,35 @@ "cadence_varies": "variiert", "model_group_automatic": "Automatisch", "model_group_reanalysis": "ECMWF-Reanalyse", - "model_group_regional_reanalysis": "Regionale Reanalyse" + "model_group_regional_reanalysis": "Regionale Reanalyse", + "wmo_0": "Klarer Himmel", + "wmo_1": "Überwiegend klar", + "wmo_2": "Teils bewölkt", + "wmo_3": "Bedeckt", + "wmo_45": "Nebel", + "wmo_48": "Gefrierender Nebel", + "wmo_51": "Leichter Nieselregen", + "wmo_53": "Mäßiger Nieselregen", + "wmo_55": "Starker Nieselregen", + "wmo_56": "Leichter gefrierender Nieselregen", + "wmo_57": "Starker gefrierender Nieselregen", + "wmo_61": "Leichter Regen", + "wmo_63": "Mäßiger Regen", + "wmo_65": "Starker Regen", + "wmo_66": "Leichter gefrierender Regen", + "wmo_67": "Starker gefrierender Regen", + "wmo_71": "Leichter Schneefall", + "wmo_73": "Mäßiger Schneefall", + "wmo_75": "Starker Schneefall", + "wmo_77": "Schneegriesel", + "wmo_80": "Leichte Regenschauer", + "wmo_81": "Mäßige Regenschauer", + "wmo_82": "Heftige Regenschauer", + "wmo_85": "Leichte Schneeschauer", + "wmo_86": "Starke Schneeschauer", + "wmo_95": "Gewitter", + "wmo_96": "Gewitter mit leichtem Hagel", + "wmo_99": "Gewitter mit starkem Hagel", + "summary_read_more": "Mehr anzeigen", + "summary_read_less": "Weniger anzeigen" } diff --git a/messages/en.json b/messages/en.json index 162b91a..b26aeb1 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1,6 +1,6 @@ { "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_week": "7-Day Forecast", + "nav_week": "Weekly Forecast", "nav_compare": "Model Comparison", "nav_14day": "14-Day Forecast", "nav_seasonal": "Seasonal", @@ -44,7 +44,7 @@ "day_today": "Today", "day_tomorrow": "Tomorrow", "day_yesterday": "Yesterday", - "page_week_subtitle": "7-day forecast", + "page_week_subtitle": "Weekly forecast", "page_compare_subtitle": "Model comparison", "page_14day_subtitle": "14-day ensemble forecast", "page_seasonal_subtitle": "Seasonal outlook", @@ -101,7 +101,7 @@ "period_morning": "in the morning", "period_afternoon": "in the afternoon", "period_evening": "in the evening", - "footer_tagline": "Fast, no-nonsense weather forecasts built on open data.", + "footer_tagline": "Fast, free, no-nonsense weather forecasts built on open data.", "footer_data_by": "Weather data by", "footer_forecasts": "Forecasts", "footer_popular": "Popular locations", @@ -260,6 +260,8 @@ "table_interval_aria": "Hourly interval", "table_now": "Now", "interval_toggle": "Toggle between 1-hour and 3-hour intervals", + "page_loading": "Loading…", + "page_loading_dismiss": "Dismiss", "charts_loading": "Loading charts...", "chart_download": "Download meteogram as PNG image", "chart_credit_viz": "visualisation by", @@ -267,7 +269,7 @@ "legend_show": "Show legend", "meteograms_none_before": "No meteograms configured,", "meteograms_none_action": "add some variables", - "meteograms_none_historical": "No meteograms configured. Add variables from the 7-day forecast page.", + "meteograms_none_historical": "No meteograms configured. Add variables from the weekly forecast page.", "search_searching": "Searching...", "search_favorites": "Favorites", "search_recent": "Recent", @@ -280,6 +282,7 @@ "model_automatic_selection": "Automatic selection", "model_selector_aria": "{label} selection", "compare_models_heading": "Models", + "compare_models_choose": "Choose which models to plot", "compare_variables_heading": "Hourly Weather Variables", "compare_standard_preset": "Standard comparison", "compare_weather_conditions": "Weather conditions & cloud cover", @@ -385,5 +388,35 @@ "cadence_varies": "varies", "model_group_automatic": "Automatic", "model_group_reanalysis": "ECMWF reanalysis", - "model_group_regional_reanalysis": "Regional reanalysis" + "model_group_regional_reanalysis": "Regional reanalysis", + "wmo_0": "Clear sky", + "wmo_1": "Mainly clear", + "wmo_2": "Partly cloudy", + "wmo_3": "Overcast", + "wmo_45": "Fog", + "wmo_48": "Depositing rime fog", + "wmo_51": "Light drizzle", + "wmo_53": "Moderate drizzle", + "wmo_55": "Dense drizzle", + "wmo_56": "Light freezing drizzle", + "wmo_57": "Dense freezing drizzle", + "wmo_61": "Slight rain", + "wmo_63": "Moderate rain", + "wmo_65": "Heavy rain", + "wmo_66": "Light freezing rain", + "wmo_67": "Heavy freezing rain", + "wmo_71": "Slight snowfall", + "wmo_73": "Moderate snowfall", + "wmo_75": "Heavy snowfall", + "wmo_77": "Snow grains", + "wmo_80": "Slight rain showers", + "wmo_81": "Moderate rain showers", + "wmo_82": "Violent rain showers", + "wmo_85": "Slight snow showers", + "wmo_86": "Heavy snow showers", + "wmo_95": "Thunderstorm", + "wmo_96": "Thunderstorm with slight hail", + "wmo_99": "Thunderstorm with heavy hail", + "summary_read_more": "Read more", + "summary_read_less": "Show less" } diff --git a/messages/es.json b/messages/es.json index 52c1847..1b383ee 100644 --- a/messages/es.json +++ b/messages/es.json @@ -1,6 +1,6 @@ { "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_week": "Pronóstico de 7 días", + "nav_week": "Pronóstico semanal", "nav_compare": "Comparación de modelos", "nav_14day": "Pronóstico de 14 días", "nav_seasonal": "Estacional", @@ -44,11 +44,11 @@ "day_today": "Hoy", "day_tomorrow": "Mañana", "day_yesterday": "Ayer", - "page_week_subtitle": "pronóstico de 7 días", - "page_compare_subtitle": "comparación de modelos", - "page_14day_subtitle": "pronóstico de conjunto a 14 días", - "page_seasonal_subtitle": "previsión estacional", - "page_historical_subtitle": "clima histórico", + "page_week_subtitle": "Pronóstico semanal", + "page_compare_subtitle": "Comparación de modelos", + "page_14day_subtitle": "Pronóstico de conjunto a 14 días", + "page_seasonal_subtitle": "Previsión estacional", + "page_historical_subtitle": "Clima histórico", "hourly_heading": "por horas", "hourly_variables": "Variables", "meteograms_heading": "Meteogramas", @@ -260,6 +260,8 @@ "table_interval_aria": "Intervalo horario", "table_now": "Ahora", "interval_toggle": "Alternar entre intervalos de 1 y 3 horas", + "page_loading": "Cargando…", + "page_loading_dismiss": "Descartar", "charts_loading": "Cargando gráficos…", "chart_download": "Descargar el meteograma como imagen PNG", "chart_credit_viz": "visualización de", @@ -267,7 +269,7 @@ "legend_show": "Mostrar leyenda", "meteograms_none_before": "No hay meteogramas configurados,", "meteograms_none_action": "añade algunas variables", - "meteograms_none_historical": "No hay meteogramas configurados. Añade variables desde la página de 7 días.", + "meteograms_none_historical": "No hay meteogramas configurados. Añade variables desde la página del pronóstico semanal.", "search_searching": "Buscando…", "search_favorites": "Favoritos", "search_recent": "Recientes", @@ -280,6 +282,7 @@ "model_automatic_selection": "Selección automática", "model_selector_aria": "Selección de {label}", "compare_models_heading": "Modelos", + "compare_models_choose": "Elige los modelos a comparar", "compare_variables_heading": "Variables meteorológicas horarias", "compare_standard_preset": "Comparación estándar", "compare_weather_conditions": "Condiciones y nubosidad", @@ -385,5 +388,35 @@ "cadence_varies": "variable", "model_group_automatic": "Automático", "model_group_reanalysis": "Reanálisis del ECMWF", - "model_group_regional_reanalysis": "Reanálisis regional" + "model_group_regional_reanalysis": "Reanálisis regional", + "wmo_0": "Cielo despejado", + "wmo_1": "Mayormente despejado", + "wmo_2": "Parcialmente nublado", + "wmo_3": "Cubierto", + "wmo_45": "Niebla", + "wmo_48": "Niebla engelante", + "wmo_51": "Llovizna débil", + "wmo_53": "Llovizna moderada", + "wmo_55": "Llovizna intensa", + "wmo_56": "Llovizna engelante débil", + "wmo_57": "Llovizna engelante intensa", + "wmo_61": "Lluvia débil", + "wmo_63": "Lluvia moderada", + "wmo_65": "Lluvia intensa", + "wmo_66": "Lluvia engelante débil", + "wmo_67": "Lluvia engelante intensa", + "wmo_71": "Nevada débil", + "wmo_73": "Nevada moderada", + "wmo_75": "Nevada intensa", + "wmo_77": "Granos de nieve", + "wmo_80": "Chubascos débiles", + "wmo_81": "Chubascos moderados", + "wmo_82": "Chubascos violentos", + "wmo_85": "Chubascos de nieve débiles", + "wmo_86": "Chubascos de nieve intensos", + "wmo_95": "Tormenta", + "wmo_96": "Tormenta con granizo ligero", + "wmo_99": "Tormenta con granizo fuerte", + "summary_read_more": "Leer más", + "summary_read_less": "Mostrar menos" } diff --git a/messages/fr.json b/messages/fr.json index 2e04997..96bfd6d 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -1,6 +1,6 @@ { "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_week": "Prévisions à 7 jours", + "nav_week": "Prévisions hebdomadaires", "nav_compare": "Comparaison des modèles", "nav_14day": "Prévisions à 14 jours", "nav_seasonal": "Saisonnier", @@ -44,11 +44,11 @@ "day_today": "Aujourd'hui", "day_tomorrow": "Demain", "day_yesterday": "Hier", - "page_week_subtitle": "prévisions à 7 jours", - "page_compare_subtitle": "comparaison des modèles", - "page_14day_subtitle": "prévision d'ensemble à 14 jours", - "page_seasonal_subtitle": "tendances saisonnières", - "page_historical_subtitle": "météo historique", + "page_week_subtitle": "Prévisions hebdomadaires", + "page_compare_subtitle": "Comparaison des modèles", + "page_14day_subtitle": "Prévision d'ensemble à 14 jours", + "page_seasonal_subtitle": "Tendances saisonnières", + "page_historical_subtitle": "Météo historique", "hourly_heading": "par heure", "hourly_variables": "Variables", "meteograms_heading": "Météogrammes", @@ -260,6 +260,8 @@ "table_interval_aria": "Intervalle horaire", "table_now": "Maintenant", "interval_toggle": "Basculer entre les intervalles de 1 h et 3 h", + "page_loading": "Chargement…", + "page_loading_dismiss": "Fermer", "charts_loading": "Chargement des graphiques…", "chart_download": "Télécharger le météogramme en PNG", "chart_credit_viz": "visualisation par", @@ -267,7 +269,7 @@ "legend_show": "Afficher la légende", "meteograms_none_before": "Aucun météogramme configuré,", "meteograms_none_action": "ajoutez des variables", - "meteograms_none_historical": "Aucun météogramme configuré. Ajoutez des variables depuis la page 7 jours.", + "meteograms_none_historical": "Aucun météogramme configuré. Ajoutez des variables depuis la page des prévisions hebdomadaires.", "search_searching": "Recherche…", "search_favorites": "Favoris", "search_recent": "Récents", @@ -280,6 +282,7 @@ "model_automatic_selection": "Sélection automatique", "model_selector_aria": "Sélection : {label}", "compare_models_heading": "Modèles", + "compare_models_choose": "Choisir les modèles à comparer", "compare_variables_heading": "Variables météo horaires", "compare_standard_preset": "Comparaison standard", "compare_weather_conditions": "Conditions & couverture nuageuse", @@ -385,5 +388,35 @@ "cadence_varies": "variable", "model_group_automatic": "Automatique", "model_group_reanalysis": "Réanalyse ECMWF", - "model_group_regional_reanalysis": "Réanalyse régionale" + "model_group_regional_reanalysis": "Réanalyse régionale", + "wmo_0": "Ciel dégagé", + "wmo_1": "Plutôt dégagé", + "wmo_2": "Partiellement nuageux", + "wmo_3": "Couvert", + "wmo_45": "Brouillard", + "wmo_48": "Brouillard givrant", + "wmo_51": "Bruine faible", + "wmo_53": "Bruine modérée", + "wmo_55": "Bruine dense", + "wmo_56": "Bruine verglaçante faible", + "wmo_57": "Bruine verglaçante dense", + "wmo_61": "Pluie faible", + "wmo_63": "Pluie modérée", + "wmo_65": "Pluie forte", + "wmo_66": "Pluie verglaçante faible", + "wmo_67": "Pluie verglaçante forte", + "wmo_71": "Neige faible", + "wmo_73": "Neige modérée", + "wmo_75": "Neige forte", + "wmo_77": "Grésil", + "wmo_80": "Averses faibles", + "wmo_81": "Averses modérées", + "wmo_82": "Averses violentes", + "wmo_85": "Averses de neige faibles", + "wmo_86": "Averses de neige fortes", + "wmo_95": "Orage", + "wmo_96": "Orage avec grêle légère", + "wmo_99": "Orage avec forte grêle", + "summary_read_more": "Lire la suite", + "summary_read_less": "Afficher moins" } diff --git a/messages/it.json b/messages/it.json index 3d16c06..b0d8e3d 100644 --- a/messages/it.json +++ b/messages/it.json @@ -1,6 +1,6 @@ { "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_week": "Previsioni a 7 giorni", + "nav_week": "Previsioni settimanali", "nav_compare": "Confronto modelli", "nav_14day": "Previsioni a 14 giorni", "nav_seasonal": "Stagionale", @@ -44,11 +44,11 @@ "day_today": "Oggi", "day_tomorrow": "Domani", "day_yesterday": "Ieri", - "page_week_subtitle": "previsioni a 7 giorni", - "page_compare_subtitle": "confronto modelli", - "page_14day_subtitle": "previsione d'insieme a 14 giorni", - "page_seasonal_subtitle": "tendenze stagionali", - "page_historical_subtitle": "meteo storico", + "page_week_subtitle": "Previsioni settimanali", + "page_compare_subtitle": "Confronto modelli", + "page_14day_subtitle": "Previsione d'insieme a 14 giorni", + "page_seasonal_subtitle": "Tendenze stagionali", + "page_historical_subtitle": "Meteo storico", "hourly_heading": "orario", "hourly_variables": "Variabili", "meteograms_heading": "Meteogrammi", @@ -260,6 +260,8 @@ "table_interval_aria": "Intervallo orario", "table_now": "Ora", "interval_toggle": "Alterna tra intervalli di 1 e 3 ore", + "page_loading": "Caricamento…", + "page_loading_dismiss": "Chiudi", "charts_loading": "Caricamento dei grafici…", "chart_download": "Scarica il meteogramma come immagine PNG", "chart_credit_viz": "visualizzazione di", @@ -267,7 +269,7 @@ "legend_show": "Mostra legenda", "meteograms_none_before": "Nessun meteogramma configurato,", "meteograms_none_action": "aggiungi qualche variabile", - "meteograms_none_historical": "Nessun meteogramma configurato. Aggiungi variabili dalla pagina a 7 giorni.", + "meteograms_none_historical": "Nessun meteogramma configurato. Aggiungi variabili dalla pagina delle previsioni settimanali.", "search_searching": "Ricerca in corso…", "search_favorites": "Preferiti", "search_recent": "Recenti", @@ -280,6 +282,7 @@ "model_automatic_selection": "Selezione automatica", "model_selector_aria": "Selezione di {label}", "compare_models_heading": "Modelli", + "compare_models_choose": "Scegli i modelli da confrontare", "compare_variables_heading": "Variabili meteo orarie", "compare_standard_preset": "Confronto standard", "compare_weather_conditions": "Condizioni e copertura nuvolosa", @@ -385,5 +388,35 @@ "cadence_varies": "variabile", "model_group_automatic": "Automatico", "model_group_reanalysis": "Rianalisi ECMWF", - "model_group_regional_reanalysis": "Rianalisi regionale" + "model_group_regional_reanalysis": "Rianalisi regionale", + "wmo_0": "Cielo sereno", + "wmo_1": "Prevalentemente sereno", + "wmo_2": "Parzialmente nuvoloso", + "wmo_3": "Coperto", + "wmo_45": "Nebbia", + "wmo_48": "Nebbia gelata", + "wmo_51": "Pioviggine debole", + "wmo_53": "Pioviggine moderata", + "wmo_55": "Pioviggine intensa", + "wmo_56": "Pioviggine congelantesi debole", + "wmo_57": "Pioviggine congelantesi intensa", + "wmo_61": "Pioggia debole", + "wmo_63": "Pioggia moderata", + "wmo_65": "Pioggia forte", + "wmo_66": "Pioggia congelantesi debole", + "wmo_67": "Pioggia congelantesi forte", + "wmo_71": "Nevicata debole", + "wmo_73": "Nevicata moderata", + "wmo_75": "Nevicata forte", + "wmo_77": "Granuli di neve", + "wmo_80": "Rovesci deboli", + "wmo_81": "Rovesci moderati", + "wmo_82": "Rovesci violenti", + "wmo_85": "Rovesci di neve deboli", + "wmo_86": "Rovesci di neve forti", + "wmo_95": "Temporale", + "wmo_96": "Temporale con grandine leggera", + "wmo_99": "Temporale con grandine forte", + "summary_read_more": "Leggi tutto", + "summary_read_less": "Mostra meno" } diff --git a/src/app.html b/src/app.html index cb618ef..c833eb1 100644 --- a/src/app.html +++ b/src/app.html @@ -3,6 +3,11 @@ + + - + + + + +{#if loadingOverlay} +
+ + +
+ + {m.page_loading()} +
+
+{/if} +
-