From fd0e0d0cc6022488091b65534042eea8faacb165 Mon Sep 17 00:00:00 2001 From: Nik Verweel Date: Fri, 20 Feb 2026 10:55:35 +0100 Subject: [PATCH] Updated translations --- .gitignore | 2 + ..._CI_report_with_kpis_agronomic_support.Rmd | 362 ++++++++---------- r_app/translations/translations.xlsx | Bin 17058 -> 36600 bytes 3 files changed, 166 insertions(+), 198 deletions(-) diff --git a/.gitignore b/.gitignore index cf5b8fc..12458df 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ Rplots.pdf # R Data Files *.rds +*.here +*.png !renv.lock # Data Files (Excel, CSV, Text) diff --git a/r_app/90_CI_report_with_kpis_agronomic_support.Rmd b/r_app/90_CI_report_with_kpis_agronomic_support.Rmd index 4b63f09..9513e0c 100644 --- a/r_app/90_CI_report_with_kpis_agronomic_support.Rmd +++ b/r_app/90_CI_report_with_kpis_agronomic_support.Rmd @@ -3,7 +3,7 @@ params: ref: "word-styles-reference-var1.docx" output_file: "CI_report.docx" report_date: "2026-02-04" #!r Sys.Date() - data_dir: "aura" + data_dir: "tpc" mail_day: "Wednesday" borders: FALSE ci_plot_type: "both" @@ -502,14 +502,11 @@ tryCatch({ t <- function(key) { if (key %in% names(tr)) { txt <- glue(tr[key], .envir = parent.frame()) - - # 1. Handle tabs - txt <- gsub(">>", " ", txt) - - # 2. Handle newlines txt <- gsub("\n", " \n", txt) - return(txt) + return(enc2utf8(as.character(txt))) + } else if (key == "" | is.na(key)) { + return("") } else { return(paste0("[", key, "]")) } @@ -518,13 +515,11 @@ t <- function(key) { ::: {custom-style="Cover_title" style="text-align:center; margin-top:120px;"} -Satellite Based Field Reporting +`r t("cover_title")` ::: - - ::: {custom-style="Cover_subtitle" style="text-align:center; margin-top:18px;"} -Chlorophyll Index (CI) Monitoring Report — `r toupper(params$data_dir)` Farm (Week `r { rd <- params$report_date; rd <- if (inherits(rd, "Date")) rd else suppressWarnings(as.Date(rd)); if (is.na(rd)) rd <- Sys.Date(); if (!is.null(params$week)) params$week else format(rd, '%V') }`, `r { rd <- params$report_date; rd <- if (inherits(rd, "Date")) rd else suppressWarnings(as.Date(rd)); if (is.na(rd)) rd <- Sys.Date(); format(rd, '%Y') }`) +`r t("cover_subtitle")` ::: \newpage @@ -543,7 +538,7 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table # 1. Uniformity insights - group by interpretation if (!is.null(summary_tables$uniformity) && nrow(summary_tables$uniformity) > 0) { - cat(t("field_unif")) + cat(t("field_unif"), "\n\n") uniformity_counts <- summary_tables$uniformity %>% dplyr::select(interpretation, count = field_count) @@ -551,14 +546,14 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table status <- uniformity_counts$interpretation[i] count <- uniformity_counts$count[i] if (!is.na(status) && !is.na(count) && count > 0) { - cat(t("unif_status")) + cat("-", t("unif_status"), "\n\n") } } } # 2. Area change insights - group by interpretation if (!is.null(summary_tables$area_change) && nrow(summary_tables$area_change) > 0) { - cat("\n", t("field_area")) + cat(t("field_area"), "\n\n") area_counts <- summary_tables$area_change %>% dplyr::select(interpretation, count = field_count) @@ -566,14 +561,14 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table status <- area_counts$interpretation[i] count <- area_counts$count[i] if (!is.na(status) && !is.na(count) && count > 0) { - cat(t("area_status")) + cat("-", t("area_status"), "\n\n") } } } # 3. Growth trend insights - group by trend_interpretation if (!is.null(summary_tables$growth_decline) && nrow(summary_tables$growth_decline) > 0) { - cat("\n", t("growth_trend")) + cat(t("growth_trend"), "\n\n") growth_counts <- summary_tables$growth_decline %>% dplyr::select(trend_interpretation, count = field_count) @@ -581,14 +576,14 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table trend <- growth_counts$trend_interpretation[i] count <- growth_counts$count[i] if (!is.na(trend) && !is.na(count) && count > 0) { - cat(t("trend_status")) + cat("-", t("trend_status"), "\n\n") } } } # 4. Patchiness insights - group by patchiness_risk if (!is.null(summary_tables$patchiness) && nrow(summary_tables$patchiness) > 0) { - cat("\n", t("patch_risk")) + cat(t("patch_risk"), "\n\n") patchiness_counts <- summary_tables$patchiness %>% dplyr::select(patchiness_risk, count = field_count) @@ -596,14 +591,14 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table risk <- patchiness_counts$patchiness_risk[i] count <- patchiness_counts$count[i] if (!is.na(risk) && !is.na(count) && count > 0) { - cat(t("patch_status")) + cat("-", t("patch_status"), "\n\n") } } } # 5. Total fields analyzed total_fields <- sum(summary_tables$uniformity$field_count, na.rm = TRUE) - cat("\n", t("tot_fields_analyzed")) + cat(t("tot_fields_analyzed")) } else { cat(t("kpi_na")) @@ -614,7 +609,7 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table `r t("section_i")` -`r t("exec_summary")` +`r t("exec_summary")`\n\n ```{r combined_kpi_table, echo=FALSE, results='asis'} # Display KPI tables - standardized format with Level, Count, Percent columns @@ -692,8 +687,12 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table display_df <- combined_df %>% dplyr::select(KPI = KPI_display, Level, Count, Percent) + # Translate the table for visualization + names(display_df) <- c(t("KPI"), t("Level"), t("Count"), t("Percent")) + display_df[, 1:2] <- lapply(display_df[, 1:2], function(col) sapply(col, t)) + ft <- flextable(display_df) %>% - merge_v(j = "KPI") %>% + merge_v(j = t("KPI")) %>% autofit() cum_rows <- cumsum(kpi_group_sizes) @@ -703,15 +702,15 @@ if (exists("summary_tables") && !is.null(summary_tables) && length(summary_table hline(i = cum_rows[i], border = officer::fp_border(width = 2)) } } - + ft } else { - cat("No valid KPI summary tables found for display.\n") + cat(t("no_kpi_table")) } }, error = function(e) { safe_log(paste("Error displaying KPI tables:", e$message), "WARNING") - cat("KPI summary tables could not be displayed. Individual KPI sections will be shown below.\n") + cat(t("kpi_table_error")) }) } else { @@ -730,7 +729,7 @@ generate_field_alerts <- function(field_details_table) { } # Check for required columns - required_cols <- c("Field", "Field Size (acres)", "Growth Uniformity", "Yield Forecast (t/ha)", + required_cols <- c("Field", "Field Size (hectares)", "Growth Uniformity", "Yield Forecast (t/ha)", "Gap Score", "Decline Risk", "Patchiness Risk", "Mean CI", "CV Value", "Moran's I") missing_cols <- setdiff(required_cols, colnames(field_details_table)) @@ -887,7 +886,6 @@ if (!exists("CI_quadrant")) { } ``` - ```{r load_field_boundaries, message=TRUE, warning=TRUE, include=FALSE} # Load field boundaries from GeoJSON tryCatch({ @@ -1116,9 +1114,9 @@ tryCatch({ # Choose color palette based on colorblind_friendly parameter if (colorblind_friendly) { fill_scale <- ggplot2::scale_fill_viridis_c( - name = "Chlorophyll Index (CI)", + name = t("legend_ci"), limits = c(1, 8), - direction = -1, # Reversed: green=high, yellow/red=low + direction = 1, na.value = "transparent", oob = scales::squish ) @@ -1126,7 +1124,7 @@ tryCatch({ # Use Red-Yellow-Green diverging palette (reversed for intuitive interpretation) fill_scale <- ggplot2::scale_fill_distiller( palette = "RdYlGn", - name = "Chlorophyll Index (CI)", + name = t("legend_ci"), limits = c(1, 8), direction = 1, # Standard direction for RdYlGn na.value = "transparent" @@ -1190,7 +1188,7 @@ tryCatch({ panel.background = ggplot2::element_rect(fill = "white", color = NA) ) + ggplot2::labs( - title = paste("Current Week CI Overview - Week", current_week, "of", current_iso_year) + title = t("ci_overview_title") ) # Print the map @@ -1209,7 +1207,7 @@ tryCatch({ }) ``` -```{r render_farm_ci_diff_map, echo=FALSE, message=FALSE, warning=FALSE, fig.height=6.8, fig.width=8.5, dpi=150, dev='png'} +```{r render_farm_ci_diff_map, echo=FALSE, fig.height=6.8, fig.width=8.5, message=FALSE, warning=FALSE, dev='png', dpi=150} # Create farm-level CI difference map (week-over-week change) tryCatch({ if (!is.null(farm_ci_diff_week_ll)) { @@ -1223,7 +1221,7 @@ tryCatch({ if (colorblind_friendly) { # Use plasma for colorblind-friendly diverging visualization fill_scale <- ggplot2::scale_fill_viridis_c( - name = "CI Change (Week-over-Week)", + name = t("legend_ci_change"), option = "plasma", limits = c(-3, 3), na.value = "transparent", @@ -1233,7 +1231,7 @@ tryCatch({ # Use Red-Blue diverging palette (red=decline, blue=increase) fill_scale <- ggplot2::scale_fill_distiller( palette = "RdBu", - name = "CI Change (Week-over-Week)", + name = t("legend_ci_change"), limits = c(-3, 3), direction = 1, na.value = "transparent" @@ -1297,7 +1295,7 @@ tryCatch({ panel.background = ggplot2::element_rect(fill = "white", color = NA) ) + ggplot2::labs( - title = paste("Weekly CI Change - Week", current_week, "vs Week", week_minus_1) + title = t("ci_change_title") ) # Print the map @@ -1316,18 +1314,9 @@ tryCatch({ }) ``` -# Section 2: Field-by-Field Analysis +\newpage -## Overview of Field-Level Insights -This section provides detailed, field-specific analyses including chlorophyll index maps, trend graphs, and performance metrics. Each field is analyzed individually to support targeted interventions. - -**Key Elements per Field:** -- Current and historical CI maps -- Week-over-week change visualizations -- Cumulative growth trends -- Field-specific KPI summaries - -*Navigate to the following pages for individual field reports.* +`r t("section_ii")` \newpage @@ -1516,7 +1505,7 @@ tryCatch({ }) ``` -```{r generate_subarea_visualizations, echo=FALSE, fig.height=3.8, fig.width=6.5, dpi=150, message=FALSE, warning=FALSE, results='asis', eval=FALSE} +```{r generate_subarea_visualizations, eval=FALSE, echo=FALSE, fig.height=3.8, fig.width=6.5, message=FALSE, warning=FALSE, dpi=150, results='asis'} # Alternative visualization grouped by sub-area (disabled by default) tryCatch({ # Group pivots by sub-area @@ -1549,17 +1538,14 @@ tryCatch({ }) ``` -\newpage -## Detailed Field Performance Summary by Field - -The following table provides a comprehensive overview of all monitored fields with their key performance metrics from the KPI analysis. +`r t("detailed_field")` ```{r detailed_field_table, echo=FALSE, results='asis'} # Detailed field performance table if (!exists("field_details_table") || is.null(field_details_table) || nrow(field_details_table) == 0) { safe_log("No field details available for table", "WARNING") - cat("No field-level KPI data available for this report period.\n") + cat(t("no_field_data")) } else { # Calculate field sizes from boundaries (convert to acres) @@ -1613,33 +1599,56 @@ if (!exists("field_details_table") || is.null(field_details_table) || nrow(field field_details_clean <- field_details_clean %>% mutate(Weekly_CI_Change = round(Weekly_CI_Change, 2)) %>% select( - Field = Field_id, - `Field Size (acres)` = field_size_acres, - `Mean CI` = Mean_CI, - `Weekly CI Change` = Weekly_CI_Change, - `Yield Forecast (t/ha)` = TCH_Forecasted, - `Gap Score %` = Gap_Score, - `Decline Risk` = Decline_Severity, - `Patchiness Risk` = Patchiness_Risk, - `CV Value` = CV + field = Field_id, + field_size = field_size_acres, + mean_ci = Mean_CI, + weekly_ci_change = Weekly_CI_Change, + yield_forecast = TCH_Forecasted, + gap_score = Gap_Score, + decline_risk = Decline_Severity, + patchiness_risk = Patchiness_Risk, + cv_value = CV ) } else { field_details_clean <- field_details_clean %>% select( - Field = Field_id, - `Field Size (acres)` = field_size_acres, - `Mean CI` = Mean_CI, - `Yield Forecast (t/ha)` = TCH_Forecasted, - `Gap Score %` = Gap_Score, - `Decline Risk` = Decline_Severity, - `Patchiness Risk` = Patchiness_Risk, - `CV Value` = CV + field = Field_id, + field_size = field_size_acres, + mean_ci = Mean_CI, + yield_forecast = TCH_Forecasted, + gap_score = Gap_Score, + decline_risk = Decline_Severity, + patchiness_risk = Patchiness_Risk, + cv_value = CV ) } + # Translate risk levels + field_details_clean <- field_details_clean %>% + mutate( + across( + c(decline_risk, patchiness_risk), + ~ sapply(.x, t) + ) + ) + + # Translation labels for flextable + header_labels <- list( + field = t("field"), + field_size = t("field_size"), + mean_ci = t("mean_ci"), + weekly_ci_change = t("weekly_ci_change"), + yield_forecast = t("yield_forecast"), + gap_score = t("gap_score"), + decline_risk = t("decline_risk"), + patchiness_risk = t("patchiness_risk"), + cv_value = t("cv_value") + ) + # Display the cleaned field table with flextable (fit to page width) ft <- flextable(field_details_clean) %>% - set_caption("Detailed Field Performance Summary") %>% + set_header_labels(values = header_labels) %>% + set_caption(t("detailed_field_caption")) %>% theme_booktabs() %>% set_table_properties(width = 1, layout = "autofit") # Fit to 100% page width with auto-adjust @@ -1649,144 +1658,101 @@ if (!exists("field_details_table") || is.null(field_details_table) || nrow(field \newpage -This automated report provides weekly analysis of sugarcane crop health using satellite-derived Chlorophyll Index (CI) measurements. The analysis supports: +`r t("section_iii")` -• Scouting of growth related issues that are in need of attention -• Timely actions can be taken such that negative impact is reduced -• Monitoring of the crop growth rates of the farm, providing evidence of performance -• Planning of harvest moment and mill logistics is supported such that optimal tonnage and sucrose levels can be harvested. - -The base of the report is the Chlorophyll Index. The chlorophyll index identifies: -• Field-level crop health variations => target problem area's -• Weekly changes in crop vigor => scout for diseases and stress -• Areas requiring attention by the agricultural and irrigation teams -• Growth patterns across different field sections - -Key Features: - High-resolution satellite imagery analysis - Week-over-week change detection - Individual field performance metrics - Actionable insights for crop management - -### Explanation of the Report - -This report provides a detailed analysis (3x3m of resolution) of your sugarcane fields based on satellite imagery. It supports you monitor crop health and development throughout the growing season. The data is processed weekly to give you timely insights for optimal farm management decisions. - -### What is the Chlorophyll Index (CI)? - -The Chlorophyll Index (CI) is a vegetation index that measures the relative amount of chlorophyll in plant leaves. Chlorophyll is the green pigment responsible for photosynthesis in plants. Higher CI values indicate: -• Greater photosynthetic activity -• Healthier plant tissue -• Better nitrogen uptake -• More vigorous crop growth - -CI values typically range from 0 (bare soil or severely stressed vegetation) to 7+ (very healthy, dense vegetation). For sugarcane, values between 3-7 generally indicate good crop health, depending on the growth stage. +```{r include=FALSE} +# Tries to get the CI graph in different language, otherwise falls back on English +target_img <- paste0("CI_graph_example_", lang, ".png") +img_path <- ifelse(file.exists(target_img), target_img, "CI_graph_example.png") +```
-![`r t("ci_caption")`](CI_graph_example.png) +![`r t("ci_caption")`](`r img_path`)
-### What You'll Find in This Report: +`r t("sec_iii_1")` + + - `r t("kpi_i")` + - `r t("kpi_i_metric")` + - `r t("kpi_i_calc")` + - `r t("kpi_categories")` + - `r t("kpi_i_excellent")` + - `r t("kpi_i_good")` + - `r t("kpi_i_accept")` + - `r t("kpi_i_poor")` + - `r t("kpi_i_verypoor")` + - `r t("kpi_i_why")` + + - `r t("kpi_ii")` + - `r t("kpi_ii_calc")` + - `r t("kpi_categories")` + - `r t("kpi_ii_rapid")` + - `r t("kpi_ii_positive")` + - `r t("kpi_ii_stable")` + - `r t("kpi_ii_declining")` + - `r t("kpi_ii_rapid_decline")` + - `r t("kpi_ii_why")` + + - `r t("kpi_iii")` + - `r t("kpi_iii_applies")` + - `r t("kpi_iii_method")` + - `r t("kpi_iii_input")` + - `r t("kpi_iii_output")` + - `r t("kpi_iii_why")` + + - `r t("kpi_iv")` + - `r t("kpi_iv_calc")` + - `r t("kpi_categories")` + - `r t("kpi_iv_strong")` + - `r t("kpi_iv_weak")` + - `r t("kpi_iv_sli_decline")` + - `r t("kpi_iv_mod_decline")` + - `r t("kpi_iv_str_decline")` + - `r t("kpi_iv_why")` + + - `r t("kpi_v")` + - `r t("kpi_v_met1")` + - `r t("kpi_v_form")` + - `r t("kpi_v_range")` + - `r t("kpi_v_interpretation")` + - `r t("kpi_v_met2")` + - `r t("kpi_v_met2_range")` + - `r t("kpi_v_thresh")` + - `r t("kpi_v_risk")` + - `r t("kpi_v_minimal")` + - `r t("kpi_v_low")` + - `r t("kpi_v_medium")` + - `r t("kpi_v_high")` + - `r t("kpi_v_why")` -1. **Key Performance Indicators (KPIs):** - The report provides a farm-wide analysis based on weekly Chlorophyll Index (CI) measurements. Five comprehensive KPIs are calculated field by field to assess crop health: - - - **KPI 1: Field Uniformity** — Measures how consistently crop is developing across the field - - **Metric:** Coefficient of Variation (CV) of CI pixel values - - **Calculation:** CV = (Standard Deviation of CI) / (Mean CI) - - **Categories:** - - **Excellent:** CV < 0.08 (very uniform growth, minimal intervention needed) - - **Good:** CV < 0.15 (acceptable uniformity, routine monitoring) - - **Acceptable:** CV < 0.25 (moderate variation, monitor irrigation/fertility) - - **Poor:** CV < 0.4 (high variation, investigate management issues) - - **Very poor:** CV ≥ 0.4 (severe variation, immediate field scout required) - - **Why it matters:** Uniform fields are easier to manage and typically produce better yields. Uneven growth suggests irrigation problems, fertility gaps, pests, or disease. - - - **KPI 2: Area Change (Weekly Growth)** — Tracks week-over-week CI changes to detect rapid improvements or declines - - **Calculation:** Current Mean CI − Previous Mean CI (absolute change in CI units) - - **Categories:** - - **Rapid growth:** > +0.5 (excellent weekly progress) - - **Positive growth:** +0.2 to +0.5 (steady improvement) - - **Stable:** −0.2 to +0.2 (field maintained, no significant change) - - **Declining:** −0.5 to −0.2 (slow decline, warrant closer monitoring) - - **Rapid decline:** < −0.5 (alert: urgent issue requiring investigation) - - **Why it matters:** Week-to-week changes reveal developing problems early, enabling timely intervention. - - - **KPI 3: TCH Forecasted (Yield Prediction)** — Predicts final harvest tonnage for mature fields - - **Applies to:** Fields ≥ 240 days old (mature stage) - - **Method:** Random Forest machine learning model trained on historical harvest data and CI trajectories - - **Inputs:** Days after harvest (DAH) and CI growth rate (CI_per_day) - - **Output:** Predicted tons of cane per hectare (t/ha) - - **Why it matters:** Helps plan harvest timing, mill throughput, and revenue forecasting for mature crops. - - - **KPI 4: Growth Decline (4-Week Trend)** — Assesses short-term growth trajectory using linear regression - - **Calculation:** Linear slope of CI values over the previous 4 weeks - - **Categories:** - - **Strong growth:** Slope > 0.1 CI units/week (excellent sustained progress) - - **Weak growth:** Slope 0–0.1 (slow improvement, monitor closely) - - **Slight decline:** Slope −0.1–0 (low severity, non-urgent observation) - - **Moderate decline:** Slope −0.3 to −0.1 (medium severity, scouting recommended) - - **Strong decline:** Slope < −0.3 (high severity, immediate field investigation required) - - **Why it matters:** Trend analysis reveals whether crop is accelerating, stalling, or stressed over time. - - - **KPI 5: Field Patchiness (Heterogeneity)** — Combines two complementary spatial metrics for comprehensive heterogeneity assessment - - **Metric 1: Gini Coefficient** — Statistical measure of distribution inequality in CI pixel values - - **Formula:** (2 × Σ(i × sorted_CI)) / (n × Σ(sorted_CI)) − (n+1)/n - - **Range:** 0 (perfectly uniform) to 1 (highly unequal) - - **Interpretation:** Low Gini (< 0.15) = good uniformity; High Gini (> 0.3) = significant heterogeneity - - **Metric 2: Moran's I** — Spatial autocorrelation indicating whether high/low areas are clustered or scattered - - **Range:** −1 (dispersed pattern) to +1 (strong clustering) - - **Thresholds:** Moran's I > 0.85 indicates clustered problem areas; < 0.75 suggests scattered issues - - **Risk Determination (Gini + Moran's I Combined):** - - **Minimal Risk:** Gini < 0.15 (excellent uniformity regardless of spatial pattern) - - **Low Risk:** Gini 0.15–0.30, Moran's I < 0.85 (moderate variation, scattered distribution) - - **Medium Risk:** Gini 0.15–0.30, Moran's I > 0.85 OR Gini 0.30–0.50, Moran's I < 0.85 (notable issues) - - **High Risk:** Gini > 0.30, Moran's I > 0.85 (severe heterogeneity with localized clusters—urgent scouting needed) - - **Why it matters:** High patchiness may indicate irrigation inefficiencies, localized pest pressure, fertility variation, or disease spread. Combined Gini + Moran's I reveals not just *how much* variation exists, but also *how it's distributed* spatially. CI reflects chlorophyll = nitrogen status + plant health + vigor. High CV/Patchiness often signals N gaps, water stress, pests (borers), or ratoon decline. - - - **Uniformity vs. Patchiness — What's the Difference?** - Both KPIs measure variation, but they answer different questions and drive different management actions: - - **Uniformity (CV-based)** answers: "*Is* growth even across the field?" — it detects whether a problem exists but not where. - - **Patchiness (Gini + Moran's I)** answers: "*Where* are problems and how are they arranged?" — it reveals the spatial pattern. + - `r t("unif_v_patch")` + - `r t("unif")` + - `r t("patch")` - **Practical example:** Two fields both score "Poor" on Uniformity (CV = 0.25). However: - - Field A has scattered low-CI patches (Moran's I = 0.6) → suggests *random* stress (disease pressure, uneven irrigation) - - Field B has clustered low-CI in one corner (Moran's I = 0.95) → suggests *localized* problem (drainage, compaction, pest hotspot) - Your scouting and remediation strategy should differ: Field A might need systemic irrigation adjustment or disease management; Field B might need soil remediation in the affected corner. **Patchiness tells you *where to focus your effort*.** - - - **KPI 6: Gap Score (Establishment Quality)** — Quantifies field gaps and areas of poor crop establishment - - **Calculation Method:** Statistical outlier detection (2σ method) - - Identifies pixels with CI below: **Median CI − (2 × Standard Deviation)** - - Calculates: **Gap Score = (Outlier Pixels / Total Pixels) × 100** - - Example: If 2 of 100 pixels fall below threshold → Gap Score = 2% - - **Score Ranges & Interpretation:** - - **0–10%:** Minimal gaps (excellent establishment, healthy field) - - **10–25%:** Moderate gaps (monitor for expansion, coordinate with agronomy) - - **≥ 25%:** Significant gaps (consider targeted replanting or rehabilitation) - - **Why it matters:** Gap scores reveal areas of poor establishment that may indicate early growth problems or harvest-related residue issues. Lower is better (0–3% is typical for healthy fields). + `r t("practical_example")` + + - `r t("field_a")` + - `r t("field_b")` + + `r t("scouting")` + + - `r t("kpi_vi")` + - `r t("kpi_vi_calc")` + - `r t("kpi_vi_identify")` + - `r t("kpi_vi_calculates")` + - `r t("kpi_vi_example")` + - `r t("kpi_vi_scores")` + - `r t("kpi_vi_0")` + - `r t("kpi_vi_10")` + - `r t("kpi_vi_25")` + - `r t("kpi_vi_why")` -2. **Overview Map: Growth on Farm:** - Provides a traffic light overview of field-by-field growth status for quick prioritization and reporting. - -3. **Chlorophyll Index Overview Map:** - Shows current CI values for all fields, helping to identify high- and low-performing areas. - -4. **Field-by-Field Analysis:** - Includes detailed maps, trend graphs, and performance metrics for each field. - -5. **Yield Prediction:** - For mature crops (over 240 days), yield is predicted using current and historical CI data. - -6. **Farm Overview Table:** - Presents numerical field-level results for all KPIs. +`r t("sec_iii_2_to_6")` --- -### Historical Benchmark Lines - -The CI time series graphs include historical benchmark lines for the 10th, 50th, and 90th percentiles of CI values across all fields and seasons. -**Note:** These lines are now all rendered as solid lines (not dashed or dotted), with different colors for each percentile. -- **10th Percentile:** Lower end of historical performance -- **50th Percentile:** Median historical performance -- **90th Percentile:** Upper end of historical performance -Comparing the current season to these lines helps assess whether crop growth is below, at, or above historical norms. +`r t("hist_benchmark")` \newpage `r t("metadata")` @@ -1797,7 +1763,7 @@ metadata_info <- data.frame( Value = c( format(Sys.time(), "%Y-%m-%d %H:%M:%S"), paste(t("project"), toupper(project_dir)), - paste(t("week"), current_week, "of", year), + paste(t("week"), current_week, t("of"), year), ifelse(exists("AllPivots0"), nrow(AllPivots0 %>% filter(!is.na(field)) %>% group_by(field) %>% summarise()), t("unknown")), t("next_wed") ) @@ -1813,4 +1779,4 @@ ft <- flextable(metadata_info) %>% ft ``` -`r t("disclaimer")` \ No newline at end of file +`r t("disclaimer")` diff --git a/r_app/translations/translations.xlsx b/r_app/translations/translations.xlsx index 82896f2a9552c6f177696accdecb77e8ce96ed48..46e0f88f83778f8a77b13600ec7254f1b4580144 100644 GIT binary patch delta 29957 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 m^bZEr|F)oQ{}wfj|1WV