diff --git a/ROADMAP.md b/ROADMAP.md index 070552d07..0b7a41e35 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ **Stage: alpha** · next: beta, ~25 points of "ready for real work" and ~160–240 h away -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-12 · **Change:** minor (rows auto-fit oversized fonts on open and whole-row/column formatting) · **Target:** Microsoft Excel (Microsoft 365) +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-20 · **Change:** minor (Dutch interface language) · **Target:** Microsoft Excel (Microsoft 365) GridCraft aims at full Microsoft Excel parity, and at being better in places: faster, open (XLSX is the native format), fully scriptable by agents (MCP, control channel, CLI), and on the web. @@ -111,7 +111,7 @@ Localized German formulas and numbers are in PR #163. Detail: [localization-pari | Korean | ko | menus only | ~12% | | Vietnamese | vi | none | 0% | -Other shipped languages: 2 (Russian and German, menus only, ~12%). +Other shipped languages: 3 (Russian and German, menus only, ~12%; Dutch, menus, File view and dialog titles, ~24%). ## Upcoming @@ -132,6 +132,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | What landed | |---|---| +| 2026-10-20 | Interface translated into Dutch (518 labels: ribbon, context menus, File view, dialog titles, Options); `nl`, `nl-NL`, `nl-BE` locale tags resolve to Dutch | | 2026-10-12 | Rows auto-fit oversized fonts: opening a file and whole-row/column formatting grow non-custom rows to their tallest font (#833) | | 2026-10-12 | Number formats: parsing a format code is linear in its length (long runs of `[`, `,` or `/` no longer take quadratic time), and an unclosed `[` is a literal when splitting sections as well as when tokenizing (#810) | | 2026-10-12 | Number formats: a fraction denominator with 65,536 zeros no longer crashes; format codes are capped at 255 characters like Excel (longer codes display as General, `TEXT` gives `#VALUE!`) (#807) | @@ -193,6 +194,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | Change | Summary | |---|---|---| +| 2026-10-20 | minor | Dutch (nl) listed under other shipped languages; progress log row | | 2026-10-12 | minor | Rows auto-fit oversized fonts on open and whole-row/column formatting (#833); progress log row | | 2026-10-12 | minor | Progress log: multi-area row/column delete (#758) | | 2026-10-12 | trivial | Progress log: XLSX chart sheets kept on save (#727) | diff --git a/contributors/people.toml b/contributors/people.toml index be84b5b01..deab80ae2 100644 --- a/contributors/people.toml +++ b/contributors/people.toml @@ -68,3 +68,7 @@ sync_github_name = false [people.Shnrqpdr] sync_github_name = true + +[people.Stefanfra] +real_name = "Stefan Fransen" +sync_github_name = true diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 98919f8a4..0bdb2d38c 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -14,6 +14,7 @@ mod de; mod es; mod fr; mod ko; +mod nl; mod pt; mod ru; mod sr; @@ -35,10 +36,12 @@ pub enum Language { Cs, Fr, Sr, + Nl, } impl Language { - pub const ALL: [Self; 11] = [Self::En, Self::Es, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr]; + pub const ALL: [Self; 12] = + [Self::En, Self::Es, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr, Self::Nl]; /// The language's own name, shown in the switcher. pub fn name(self) -> &'static str { @@ -54,6 +57,7 @@ impl Language { Self::Cs => "Čeština", Self::Fr => "Français", Self::Sr => "Srpski", + Self::Nl => "Nederlands", } } @@ -71,6 +75,7 @@ impl Language { Self::Cs => "cs", Self::Fr => "fr", Self::Sr => "sr", + Self::Nl => "nl", } } @@ -91,6 +96,7 @@ impl Language { "cs" => Some(Self::Cs), "fr" => Some(Self::Fr), "sr" => Some(Self::Sr), + "nl" => Some(Self::Nl), _ => None, } } @@ -129,6 +135,7 @@ impl Language { Self::Cs => cs::translate(text), Self::Fr => fr::translate(text), Self::Sr => sr::translate(text), + Self::Nl => nl::translate(text), }; translated.unwrap_or_else(|| text.rsplit_once('|').map_or(text, |(_, label)| label)) } @@ -611,6 +618,7 @@ mod tests { assert!(cs::translate(english).is_some_and(|text| !text.is_empty()), "missing Czech: {english}"); assert!(fr::translate(english).is_some_and(|text| !text.is_empty()), "missing French: {english}"); assert!(sr::translate(english).is_some_and(|text| !text.is_empty()), "missing Serbian: {english}"); + assert!(nl::translate(english).is_some_and(|text| !text.is_empty()), "missing Dutch: {english}"); } assert_eq!(Language::Ja.tr("Data"), "データ"); assert_eq!(Language::Zh.tr("Data"), "数据"); @@ -644,6 +652,10 @@ mod tests { assert_eq!(Language::Sr.tr("Sheet1!A1"), "Sheet1!A1"); assert_eq!(Language::Sr.tr("Page Layout|Orientation"), "Orijentacija"); assert_eq!(Language::Sr.tr("Orientation"), "Orijentacija"); + assert_eq!(Language::Nl.tr("Data"), "Gegevens"); + assert_eq!(Language::Nl.tr("Sheet1!A1"), "Sheet1!A1"); + assert_eq!(Language::Nl.tr("Page Layout|Orientation"), "Paginastand"); + assert_eq!(Language::Nl.tr("Orientation"), "Richting"); assert_eq!(Language::parse("xx"), None); } @@ -698,6 +710,9 @@ mod tests { assert_eq!(Language::Sr.tr("Options|General"), "Opšte"); assert_eq!(Language::Sr.tr("Options|Save"), "Sačuvaj"); assert_eq!(Language::Sr.tr("Sheet Options|View"), "Prikaz"); + assert_eq!(Language::Nl.tr("Options|General"), "Algemeen"); + assert_eq!(Language::Nl.tr("Options|Save"), "Opslaan"); + assert_eq!(Language::Nl.tr("Sheet Options|View"), "Weergeven"); } #[test] @@ -738,6 +753,9 @@ mod tests { assert_eq!(Language::from_tag("sr-Latn-RS"), Some(Language::Sr)); assert_eq!(Language::from_tag("sr-RS"), Some(Language::Sr)); assert_eq!(Language::parse("sr"), Some(Language::Sr)); + assert_eq!(Language::from_tag("nl-NL"), Some(Language::Nl)); + assert_eq!(Language::from_tag("nl_BE"), Some(Language::Nl)); + assert_eq!(Language::parse("nl"), Some(Language::Nl)); } #[test] diff --git a/crates/ui-egui/src/i18n/nl.rs b/crates/ui-egui/src/i18n/nl.rs new file mode 100644 index 000000000..aeedf3a13 --- /dev/null +++ b/crates/ui-egui/src/i18n/nl.rs @@ -0,0 +1,533 @@ +//! Dutch translations for the interface strings in i18n.rs. + +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Plakken", + "Paste Values" => "Waarden plakken", + "Paste Formulas" => "Formules plakken", + "Paste Formatting" => "Opmaak plakken", + "Transpose" => "Transponeren", + "Paste Link" => "Koppeling plakken", + "Paste Special…" => "Speciaal plakken…", + "Insert Copied Cells" => "Gekopieerde cellen invoegen", + "Insert Copied Cells…" => "Gekopieerde cellen invoegen…", + "Insert Cut Cells" => "Geknipte cellen invoegen", + "Insert Paste" => "Invoegen en plakken", + "Cut (⌘X)" => "Knippen (⌘X)", + "Copy (⌘C)" => "Kopiëren (⌘C)", + "Format Painter (double-click to keep it on)" => "Opmaak kopiëren (dubbelklik om vast te zetten)", + "Bold (⌘B)" => "Vet (⌘B)", + "Italic (⌘I)" => "Cursief (⌘I)", + "Underline (⌘U)" => "Onderstrepen (⌘U)", + "Double Underline" => "Dubbel onderstrepen", + "Strikethrough" => "Doorhalen", + "Underline" => "Onderstrepen", + "Increase Font Size" => "Tekengrootte vergroten", + "Decrease Font Size" => "Tekengrootte verkleinen", + "Wrap Text" => "Tekstterugloop", + "Merge & Center" => "Samenvoegen & centreren", + "Merge Cells" => "Cellen samenvoegen", + "Merge Across" => "Rijen samenvoegen", + "Unmerge Cells" => "Samenvoeging opheffen", + "Fill Color" => "Opvulkleur", + "Font Color" => "Tekstkleur", + "Borders" => "Celranden", + "Top\nAlign" => "Boven\nuitlijnen", + "Middle\nAlign" => "Midden\nuitlijnen", + "Bottom\nAlign" => "Onder\nuitlijnen", + "Left" => "Links", + "Right" => "Rechts", + "Center" => "Centreren", + "Horizontal" => "Horizontaal", + "Vertical Text" => "Verticale tekst", + "Decrease Indent" => "Inspringing verkleinen", + "Increase Indent" => "Inspringing vergroten", + "Orientation" => "Richting", + "Page Layout|Orientation" => "Paginastand", + "Angle Counterclockwise" => "Tegen de klok in draaien", + "Angle Clockwise" => "Met de klok mee draaien", + "Rotate Text Up" => "Tekst omhoog draaien", + "Rotate Text Down" => "Tekst omlaag draaien", + "Accounting Number Format" => "Valutanotatie (financieel)", + "Percent Style" => "Procentnotatie", + "Comma Style" => "Notatie met scheidingstekens", + "Increase Decimal" => "Decimaal toevoegen", + "Decrease Decimal" => "Decimaal verwijderen", + "More Accounting Formats…" => "Meer boekhoudkundige notaties…", + "Conditional\nFormatting" => "Voorwaardelijke\nopmaak", + "Conditional Formatting" => "Voorwaardelijke opmaak", + "Format\nas Table" => "Opmaken\nals tabel", + "Cell\nStyles" => "Cel-\nstijlen", + "Format Cells…" => "Cellen opmaken…", + "Format Cell Alignment…" => "Celuitlijning…", + "Format\nPane" => "Opmaak-\nvenster", + "Format" => "Opmaak", + "Insert" => "Invoegen", + "Insert Cells…" => "Cellen invoegen…", + "Delete" => "Verwijderen", + "Delete Cells…" => "Cellen verwijderen…", + "Insert Sheet Rows" => "Bladrijen invoegen", + "Insert Sheet Columns" => "Bladkolommen invoegen", + "Delete Sheet Rows" => "Bladrijen verwijderen", + "Delete Sheet Columns" => "Bladkolommen verwijderen", + "Row Height…" => "Rijhoogte…", + "AutoFit Row Height" => "Rijhoogte automatisch aanpassen", + "Column Width…" => "Kolombreedte…", + "AutoFit Column Width" => "Kolombreedte automatisch aanpassen", + "Default Width…" => "Standaardkolombreedte…", + "Hide Rows" => "Rijen verbergen", + "Unhide Rows" => "Verborgen rijen tonen", + "Hide Columns" => "Kolommen verbergen", + "Unhide Columns" => "Verborgen kolommen tonen", + "Lock Cell" => "Cel vergrendelen", + "Clear" => "Wissen", + "Clear All" => "Alles wissen", + "Clear Formats" => "Opmaak wissen", + "Clear Contents" => "Celinhoud wissen", + "Clear Comments and Notes" => "Opmerkingen en notities wissen", + "Clear Hyperlinks" => "Hyperlinks wissen", + "AutoSum" => "AutoSom", + "AutoSum (⌘⇧T)" => "AutoSom (⌘⇧T)", + "Flash\nFill" => "Automatisch\ninvullen", + "Flash Fill" => "Automatisch invullen", + "Fill" => "Vullen", + "Clear Print Area" => "Afdrukbereik wissen", + "Find &\nSelect" => "Zoeken &\nselecteren", + "Find…" => "Zoeken…", + "Replace…" => "Vervangen…", + "Go To…" => "Ga naar…", + "Go To Special…" => "Ga naar speciaal…", + "PivotTable" => "Draaitabel", + "Recommended\nCharts" => "Aanbevolen\ngrafieken", + "Table" => "Tabel", + "Pictures" => "Afbeeldingen", + "Shapes" => "Vormen", + "Icons" => "Pictogrammen", + "Text\nBox" => "Tekst-\nvak", + "Comment" => "Opmerking", + "New\nComment" => "Nieuwe\nopmerking", + "New Note" => "Nieuwe notitie", + "Show/Hide Note" => "Notitie weergeven/verbergen", + "Header &\nFooter" => "Koptekst &\nvoettekst", + "Text to\nColumns" => "Tekst naar\nkolommen", + "Link" => "Link", + "Symbol" => "Symbool", + "Sparklines" => "Sparklines", + "Checkbox" => "Checkbox", + "Insert checkboxes in the selected cells" => "Checkboxes invoegen in de geselecteerde cellen", + "Header & Footer" => "Koptekst & voettekst", + "Draw with ink" => "Tekenen met inkt", + "Eraser" => "Gum", + "Ink to\nShape" => "Inkt naar\nvorm", + "Select\nObjects" => "Objecten\nselecteren", + "Themes" => "Thema's", + "Margins" => "Marges", + "Left Margin" => "Linkermarge", + "Right Margin" => "Rechtermarge", + "Top Margin" => "Bovenmarge", + "Bottom Margin" => "Ondermarge", + "Header Margin" => "Koptekstmarge", + "Footer Margin" => "Voettekstmarge", + "Size" => "Formaat", + "Print\nArea" => "Afdruk-\nbereik", + "Set Print Area" => "Afdrukbereik instellen", + "Breaks" => "Eindemarkeringen", + "Insert Page Break" => "Pagina-einde invoegen", + "Remove Page Break" => "Pagina-einde verwijderen", + "Reset All Page Breaks" => "Alle pagina-einden herstellen", + "Print\nTitles" => "Titels\nafdrukken", + "Sheet\nRight-to-Left" => "Blad van rechts\nnaar links", + "Sheet Right-to-Left" => "Blad van rechts naar links", + "Narrow" => "Smal", + "Wide" => "Breed", + "Normal" => "Normaal", + "Portrait" => "Staand", + "Landscape" => "Liggend", + "Custom Margins…" => "Aangepaste marges…", + "Insert\nFunction" => "Functie\ninvoegen", + "Name\nManager" => "Naam-\nbeheer", + "Define Name" => "Naam definiëren", + "Use in Formula" => "Gebruiken in formule", + "Create from Selection" => "Maken op basis van selectie", + "Trace Precedents" => "Broncellen aanwijzen", + "Trace Dependents" => "Doelcellen aanwijzen", + "Remove Arrows" => "Pijlen verwijderen", + "Show Formulas" => "Formules weergeven", + "Error Checking" => "Foutopsporing", + "Evaluate Formula" => "Formule evalueren", + "Watch Window" => "Bewakingsvenster", + "Calculation\nOptions" => "Berekenings-\nopties", + "Calculate Now" => "Nu berekenen", + "Calculate Sheet" => "Blad berekenen", + "Automatic" => "Automatisch", + "Automatic Except for Data Tables" => "Automatisch (geen gegevenstabellen)", + "Manual" => "Handmatig", + "Sort &\nFilter" => "Sorteren en\nfilteren", + "Sort" => "Sorteren", + "Sort A to Z" => "Sorteren van A naar Z", + "Sort Z to A" => "Sorteren van Z naar A", + "Custom Sort…" => "Aangepast sorteren…", + "Filter" => "Filteren", + "Reapply" => "Opnieuw toepassen", + "Get Data\n(Text/CSV)" => "Gegevens ophalen\n(tekst/CSV)", + "Remove\nDuplicates" => "Duplicaten\nverwijderen", + "Data\nValidation" => "Gegevens-\nvalidatie", + "Data Validation" => "Gegevensvalidatie", + "Data Validation…" => "Gegevensvalidatie…", + "Circle Invalid Data" => "Ongeldige gegevens omcirkelen", + "Clear Validation" => "Validatie wissen", + "Group" => "Groeperen", + "Ungroup" => "Groep opheffen", + "Show Detail" => "Details weergeven", + "Hide Detail" => "Details verbergen", + "Subtotal" => "Subtotaal", + "Data\nAnalysis" => "Gegevens-\nanalyse", + "Data Analysis" => "Gegevensanalyse", + "Solver" => "Solver", + "What-If\nAnalysis" => "Wat-als-\nanalyse", + "Data Table…" => "Gegevenstabel…", + "Scenario Manager…" => "Scenariobeheer…", + "Goal Seek…" => "Doelzoeken…", + "Forecast\nSheet" => "Prognose-\nblad", + "Spelling" => "Spelling", + "Check\nAccessibility" => "Toegankelijkheid\ncontroleren", + "Threaded Comments" => "Opmerkingen met threads", + "Show\nComments" => "Opmerkingen\nweergeven", + "Previous" => "Vorige", + "Next" => "Volgende", + "Previous Comment" => "Vorige opmerking", + "Next Comment" => "Volgende opmerking", + "Show All Notes" => "Alle notities weergeven", + "Convert to Comments" => "Converteren naar opmerkingen", + "Protect\nWorkbook" => "Werkmap\nbeveiligen", + "Allow Edit\nRanges" => "Bereiken bewerken\ntoestaan", + "Allow Edit Ranges" => "Bereiken bewerken toestaan", + "Unprotect\nSheet" => "Bladbeveiliging\nopheffen", + "Protect Sheet…" => "Blad beveiligen…", + "Comments" => "Opmerkingen", + "Notes" => "Notities", + "Page Break\nPreview" => "Pagina-einde-\nweergave", + "Page\nLayout" => "Pagina-\nindeling", + "Formula Bar" => "Formulebalk", + "Gridlines" => "Celrasterlijnen", + "Headings" => "Kopteksten", + "Zoom" => "Zoomen", + "100%" => "100%", + "Zoom to\nSelection" => "Inzoomen op\nselectie", + "Freeze\nPanes" => "Titels\nblokkeren", + "Freeze Panes" => "Titels blokkeren", + "Freeze Top Row" => "Bovenste rij vastzetten", + "Freeze First Column" => "Eerste kolom vastzetten", + "Unfreeze Panes" => "Titelblokkering opheffen", + "Dark Mode" => "Donkere modus", + "Display theme" => "Weergavethema", + "Animations" => "Animaties", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "De selectierand naar de nieuwe cel laten glijden in plaats van erheen springen" + } + "System" => "Systeem", + "Light" => "Licht", + "Dark" => "Donker", + "Interface language" => "Weergavetaal", + "Interface size" => "Grootte van de interface", + "Auto" => "Automatisch", + "Drag to freeze columns" => "Sleep om kolommen vast te zetten", + "Drag to freeze rows" => "Sleep om rijen vast te zetten", + "Command\nPalette" => "Opdracht-\npalet", + "Agent\nControl" => "Agent-\nbesturing", + "Action\nJournal" => "Actie-\nlogboek", + "About\nGridCraft" => "Over\nGridCraft", + "Share" => "Delen", + "Add Chart\nElement" => "Grafiekelement\ntoevoegen", + "Change\nChart Type" => "Ander\ngrafiektype", + "Switch\nRow/Column" => "Rij/kolom\nomwisselen", + "Select\nData" => "Gegevens\nselecteren", + "Data Labels: None" => "Gegevenslabels: geen", + "Data Labels: Show" => "Gegevenslabels: weergeven", + "Legend: None" => "Legenda: geen", + "Legend: Bottom" => "Legenda: onder", + "Legend: Top" => "Legenda: boven", + "Legend: Right" => "Legenda: rechts", + "Gridlines: None" => "Rasterlijnen: geen", + "Gridlines: Show" => "Rasterlijnen: weergeven", + "Chart\nTitle" => "Grafiek-\ntitel", + "Delete\nChart" => "Grafiek\nverwijderen", + "Convert\nto Range" => "Converteren\nnaar bereik", + "Table\nStyles" => "Tabel-\nstijlen", + "Top 10 Items" => "Top 10-items", + "Top 10%" => "Top 10%", + "Bottom 10 Items" => "Onderste 10 items", + "Bottom 10%" => "Onderste 10%", + "Above Average" => "Boven het gemiddelde", + "Below Average" => "Onder het gemiddelde", + "Clear Rules from Entire Sheet" => "Regels van hele blad wissen", + "Clear Rules from Selected Cells" => "Regels van geselecteerde cellen wissen", + "Constants" => "Constanten", + "Data Bars" => "Gegevensbalken", + "Color Scales" => "Kleurenschalen", + "Icon Sets" => "Symboolsets", + "Home" => "Start", + "Draw" => "Tekenen", + "Page Layout" => "Pagina-indeling", + "Formulas" => "Formules", + "Data" => "Gegevens", + "Review" => "Controleren", + "View" => "Weergave", + "Automate" => "Automatiseren", + "Table Design" => "Tabelontwerp", + "Chart Design" => "Grafiekontwerp", + "Ready" => "Gereed", + "Enter" => "Invoeren", + "Edit" => "Bewerken", + "Point" => "Aanwijzen", + "Calculate" => "Berekenen", + "Select destination and press Enter or choose Paste" => "Selecteer de bestemming en druk op Enter of kies Plakken", + "General" => "Algemeen", + "Number" => "Getal", + "Currency" => "Valuta", + "Accounting" => "Boekhoudkundig", + "Date" => "Datum", + "Time" => "Tijd", + "Percentage" => "Percentage", + "Fraction" => "Breuk", + "Scientific" => "Wetenschappelijk", + "Text" => "Tekst", + "Special" => "Speciaal", + "Custom" => "Aangepast", + "Short Date" => "Korte datumnotatie", + "Long Date" => "Lange datumnotatie", + "More Number Formats…" => "Meer getalnotaties…", + "Financial" => "Financieel", + "Logical" => "Logisch", + "Date &\nTime" => "Datum en\ntijd", + "Lookup &\nReference" => "Zoeken en\nverwijzen", + "Math &\nTrig" => "Wiskunde en\ntrigonometrie", + "More\nFunctions" => "Meer\nfuncties", + "Sheet Options|View" => "Weergeven", + "Print" => "Afdrukken", + "Click to add data" => "Klik om gegevens toe te voegen", + "Add header" => "Koptekst toevoegen", + "Add footer" => "Voettekst toevoegen", + "(none)" => "(geen)", + "Header" => "Koptekst", + "Footer" => "Voettekst", + "Page\nNumber" => "Pagina-\nnummer", + "Number\nof Pages" => "Aantal\npagina's", + "Current\nDate" => "Huidige\ndatum", + "Current\nTime" => "Huidige\ntijd", + "File\nPath" => "Bestands-\npad", + "File\nName" => "Bestands-\nnaam", + "Sheet\nName" => "Blad-\nnaam", + "Go to\nHeader" => "Naar\nkoptekst", + "Go to\nFooter" => "Naar\nvoettekst", + "Page Number" => "Paginanummer", + "Number of Pages" => "Aantal pagina's", + "Current Date" => "Huidige datum", + "Current Time" => "Huidige tijd", + "File Path" => "Bestandspad", + "File Name" => "Bestandsnaam", + "Sheet Name" => "Bladnaam", + "Go to Header" => "Naar koptekst", + "Different First Page" => "Eerste pagina afwijkend", + "Different Odd & Even Pages" => "Even en oneven pagina's afwijkend", + "Go to Footer" => "Naar voettekst", + "Ruler" => "Liniaal", + "File" => "Bestand", + "Back" => "Terug", + "New" => "Nieuw", + "Open" => "Openen", + "Info" => "Info", + "Save" => "Opslaan", + "Save As" => "Opslaan als", + "Export" => "Exporteren", + "Close" => "Sluiten", + "Options" => "Opties", + "Blank workbook" => "Lege werkmap", + "Recent" => "Recent", + "No recent workbooks yet." => "Nog geen recente werkmappen.", + "More workbooks" => "Meer werkmappen", + "Modified" => "Gewijzigd", + "Not available" => "Niet beschikbaar", + "Just now" => "Zojuist", + "Yesterday" => "Gisteren", + "{n} min ago" => "{n} min. geleden", + "{n} h ago" => "{n} uur geleden", + "{n} days ago" => "{n} dagen geleden", + "{n} weeks ago" => "{n} weken geleden", + "{n} months ago" => "{n} maanden geleden", + "{n} years ago" => "{n} jaar geleden", + "Browse…" => "Bladeren…", + "Not saved yet" => "Nog niet opgeslagen", + "Location" => "Locatie", + "Sheets" => "Bladen", + "Protect Workbook" => "Werkmap beveiligen", + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "De bladstructuur is vergrendeld: bladen kunnen niet worden toegevoegd, verplaatst, hernoemd of verwijderd." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Vergrendel de bladstructuur zodat bladen niet kunnen worden toegevoegd, verplaatst, hernoemd of verwijderd." + } + "Properties" => "Eigenschappen", + "Title" => "Titel", + "Subject" => "Onderwerp", + "Author" => "Auteur", + "Company" => "Bedrijf", + "Keywords" => "Trefwoorden", + "Description" => "Beschrijving", + "No workbook is open." => "Er is geen werkmap geopend.", + "Save as type" => "Opslaan als type", + "Excel Workbook (*.xlsx)" => "Excel-werkmap (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (door komma's gescheiden) (*.csv)", + "Web Page (*.html)" => "Webpagina (*.html)", + "PDF (*.pdf)" => "PDF (*.pdf)", + "Download" => "Downloaden", + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "Een CSV-bestand, webpagina of PDF is een kopie: de werkmap behoudt haar eigen bestand." + } + "Save the workbook under another name or in another folder." => "De werkmap onder een andere naam of in een andere map opslaan.", + "Print Active Sheets" => "Actieve bladen afdrukken", + "Print Entire Workbook" => "Hele werkmap afdrukken", + "Fit Sheet on One Page" => "Blad op één pagina passen", + "Page Setup…" => "Pagina-instelling…", + "Page {page} of {pages}" => "Pagina {page} van {pages}", + "Nothing to print." => "Niets om af te drukken.", + "Previous page" => "Vorige pagina", + "Next page" => "Volgende pagina", + "Create PDF" => "PDF maken", + "Save the sheet as a PDF document that keeps its page layout." => "Het blad opslaan als PDF-document met behoud van de pagina-indeling.", + "Change File Type" => "Bestandstype wijzigen", + "CSV (Comma delimited)" => "CSV (door komma's gescheiden)", + "Save the active sheet as comma-separated text." => "Het actieve blad opslaan als door komma's gescheiden tekst.", + "Web Page (.html)" => "Webpagina (.html)", + "Save the workbook as a web page." => "De werkmap opslaan als webpagina.", + "Options|General" => "Algemeen", + "Options|Save" => "Opslaan", + "Show formula bar" => "Formulebalk weergeven", + "Enable AutoComplete for cell values" => "Automatisch aanvullen van celwaarden inschakelen", + "Save .xlsx workbooks automatically after every change" => ".xlsx-werkmappen na elke wijziging automatisch opslaan", + "Workbook calculation" => "Werkmapberekening", + "Enable iterative calculation" => "Iteratieve berekening inschakelen", + "Calculation settings are saved with the workbook." => "Berekeningsinstellingen worden bij de werkmap opgeslagen.", + "Cut" => "Knippen", + "Copy" => "Kopiëren", + "Insert…" => "Invoegen…", + "Delete…" => "Verwijderen…", + "Filter by Selected Cell's Value" => "Filteren op waarde van geselecteerde cel", + "New Comment" => "Nieuwe opmerking", + "Pick From Drop-down List…" => "Kiezen uit keuzelijst…", + "Define Name…" => "Naam definiëren…", + "Link…" => "Link…", + "Hide" => "Verbergen", + "Unhide" => "Zichtbaar maken", + "Cancel" => "Annuleren", + "Expand formula bar" => "Formulebalk uitvouwen", + "Insert Function" => "Functie invoegen", + "$ English (United States)" => "$ Engels (Verenigde Staten)", + "Add Chart Element" => "Grafiekelement toevoegen", + "Align Left" => "Links uitlijnen", + "Align Right" => "Rechts uitlijnen", + "Bottom Align" => "Onder uitlijnen", + "Calculate Now (F9)" => "Nu berekenen (F9)", + "Calculate Sheet (⇧F9)" => "Blad berekenen (⇧F9)", + "Calculation Options" => "Berekeningsopties", + "Cell Styles" => "Celstijlen", + "Change Chart Type" => "Ander grafiektype", + "Check Accessibility" => "Toegankelijkheid controleren", + "Clear Filter" => "Filter wissen", + "Column or Bar" => "Kolom of staaf", + "Comments pane" => "Opmerkingenvenster", + "Convert the last ink stroke to a shape" => "De laatste inktstreek omzetten in een vorm", + "Convert to Range" => "Converteren naar bereik", + "Custom Sort" => "Aangepast sorteren", + "Delete Comment" => "Opmerking verwijderen", + "Delete Sheet" => "Blad verwijderen", + "Delete chart" => "Grafiek verwijderen", + "Down" => "Omlaag", + "Edit chart title" => "Grafiektitel bewerken", + "Erase ink strokes" => "Inktstreken wissen", + "Every command run in this session (replayable)" => "Elke opdracht die in deze sessie is uitgevoerd (opnieuw af te spelen)", + "Filter (⌘⇧F)" => "Filteren (⌘⇧F)", + "Find & Select" => "Zoeken & selecteren", + "Flash Fill (⌘E)" => "Automatisch invullen (⌘E)", + "Forecast Sheet" => "Prognoseblad", + "Format Chart pane" => "Venster Grafiek opmaken", + "Format as Table" => "Opmaken als tabel", + "Hide Sheet" => "Blad verbergen", + "Hierarchy & more" => "Hiërarchie en meer", + "Highlighter" => "Markeerstift", + "How agents drive GridCraft (MCP / control channel)" => "Hoe agents GridCraft besturen (MCP / besturingskanaal)", + "Import a text or CSV file" => "Een tekst- of CSV-bestand importeren", + "Insert\nSlicer" => "Gegevensfilter\ninvoegen", + "Insert Function (⇧F3)" => "Functie invoegen (⇧F3)", + "Insert Link (⌘K)" => "Link invoegen (⌘K)", + "Insert Sheet" => "Blad invoegen", + "Insert Slicer" => "Gegevensfilter invoegen", + "Insert a picture" => "Een afbeelding invoegen", + "Insert a slicer to filter a table" => "Een gegevensfilter invoegen om een tabel te filteren", + "Insert an icon" => "Een pictogram invoegen", + "Line or Area" => "Lijn of vlak", + "Macros" => "Macro's", + "Macros and scripts in this workbook (Alt+F8)" => "Macro's en scripts in deze werkmap (Alt+F8)", + "Middle Align" => "Midden uitlijnen", + "More commands" => "Meer opdrachten", + "Move or Copy Sheet…" => "Blad verplaatsen of kopiëren…", + "Name Manager" => "Naambeheer", + "Page Breaks" => "Pagina-einden", + "Paper Size" => "Papierformaat", + "Paste (⌘V)" => "Plakken (⌘V)", + "Pen\nBlack" => "Pen\nzwart", + "Pen\nBlue" => "Pen\nblauw", + "Pen\nRed" => "Pen\nrood", + "Pie or Doughnut" => "Taart of ring", + "Print Area" => "Afdrukbereik", + "Print Titles" => "Titels afdrukken", + "Protect\nSheet" => "Blad\nbeveiligen", + "Protect Sheet" => "Blad beveiligen", + "Protect Workbook structure" => "Werkmapstructuur beveiligen", + "Recommended Charts" => "Aanbevolen grafieken", + "Redo (⌘Y)" => "Opnieuw (⌘Y)", + "Remove Duplicates" => "Duplicaten verwijderen", + "Rename Sheet" => "Blad hernoemen", + "Save (⌘S)" => "Opslaan (⌘S)", + "Scatter or Bubble" => "Punten of bellen", + "Search and run any command" => "Een opdracht zoeken en uitvoeren", + "Search commands (⌘⇧Space)" => "Opdrachten zoeken (⌘⇧Spatie)", + "Select Data" => "Gegevens selecteren", + "Select and move ink and shapes" => "Inkt en vormen selecteren en verplaatsen", + "Series…" => "Reeks…", + "Share: export or save a copy" => "Delen: exporteren of een kopie opslaan", + "Show Formulas (⌃`)" => "Formules weergeven (⌃`)", + "Slicer" => "Gegevensfilter", + "Sort & Filter" => "Sorteren en filteren", + "Spelling (F7)" => "Spelling (F7)", + "Statistic" => "Statistisch", + "Switch Row/Column" => "Rij/kolom omwisselen", + "Table (⌘T)" => "Tabel (⌘T)", + "Table Styles" => "Tabelstijlen", + "Text Box" => "Tekstvak", + "Text to Columns" => "Tekst naar kolommen", + "Top Align" => "Boven uitlijnen", + "Undo (⌘Z)" => "Ongedaan maken (⌘Z)", + "Undo list" => "Ongedaan maken-lijst", + "Unhide Sheet…" => "Blad zichtbaar maken…", + "Up" => "Omhoog", + "Version, contributors and the AI models that helped" => "Versie, bijdragers en de AI-modellen die hielpen", + "Watch\nWindow" => "Bewakings-\nvenster", + "What-If Analysis" => "Wat-als-analyse", + "Workbook\nStatistics" => "Werkmap-\nstatistieken", + "Workbook Statistics" => "Werkmapstatistieken", + "Zoom to 100%" => "Zoomen naar 100%", + "Zoom to Selection" => "Inzoomen op selectie", + "Zoom…" => "Zoomen…", + "£ English (United Kingdom)" => "£ Engels (Verenigd Koninkrijk)", + "¥ Japanese" => "¥ Japans", + "€ Euro" => "€ Euro", + "New sheet (⇧F11)" => "Nieuw blad (⇧F11)", + "Next sheet" => "Volgend blad", + "Previous sheet" => "Vorig blad", + "Zoom In" => "Inzoomen", + "Zoom Out" => "Uitzoomen", + "Dismiss" => "Negeren", + _ => return None, + }) +} diff --git a/crates/ui-egui/tests/file_menu.rs b/crates/ui-egui/tests/file_menu.rs index 6cce9cdba..6d59d926e 100644 --- a/crates/ui-egui/tests/file_menu.rs +++ b/crates/ui-egui/tests/file_menu.rs @@ -137,6 +137,7 @@ fn translated_options_headings_show_no_context_prefix() { for (code, headings, prefixed, (view, view_prefixed)) in [ ("fr", ["Général", "Enregistrer"], ["Options|Général", "Options|Enregistrer"], ("Affichage", "Options de la feuille|Affichage")), ("sr", ["Opšte", "Sačuvaj"], ["Opcije|Opšte", "Opcije|Sačuvaj"], ("Prikaz", "Opcije lista|Prikaz")), + ("nl", ["Algemeen", "Opslaan"], ["Opties|Algemeen", "Opties|Opslaan"], ("Weergeven", "Bladopties|Weergeven")), ] { let mut h = harness(Services::default()); h.state_mut().run("app.language.set", serde_json::json!({"language": code})).unwrap(); diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 64876633d..bc7f072d5 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-19 · **Change:** minor (defined-name length limit counts characters, so long Arabic names are accepted; Table names are limited to 255 characters; right-to-left sheets in `.xls` files open right-to-left; text boxes and shapes keep right-to-left paragraph direction through XLSX save; Save as Web Page and copied HTML keep right-to-left; French and Serbian `context|label` translations no longer show the context) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-20 · **Change:** minor (Dutch interface language; defined-name length limit counts characters, so long Arabic names are accepted; Table names are limited to 255 characters; right-to-left sheets in `.xls` files open right-to-left; text boxes and shapes keep right-to-left paragraph direction through XLSX save; Save as Web Page and copied HTML keep right-to-left; French and Serbian `context|label` translations no longer show the context) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Per-language status against Excel, which ships its UI in dozens of languages (Windows language packs cover 100+), with localized function names, argument separators, number and date formats, @@ -61,7 +61,7 @@ separators, number/date formats, machine translation with agent review, and scri | Korean | ko | 266 (~12%) | no | Hangul via the CJK fallback; IME unverified | no | menus only | 6–10 h | | Vietnamese | vi | 0 (0%) | no | Latin with stacked diacritics: unverified | no | none | 6–10 h | -Other shipped languages: Russian (ru) and German (de), 266 labels each (~12%), menus only. +Other shipped languages: Russian (ru) and German (de), 266 labels each (~12%), menus only; Dutch (nl), 518 labels (~24%): ribbon, context menus, File view, dialog titles and the Options page. **Total:** catalog work 10–20 h + languages 92–144 h ≈ **100–165 h**. Parallelizes almost fully once the catalog covers dialogs and commands. **Needs a human:** native-speaker review of every @@ -83,6 +83,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-20 | minor | Dutch (nl) interface catalog (`i18n/nl.rs`, 518 labels, ~24%): every key the other catalogs translate; `nl-NL`, `nl-BE` locale tags resolve to Dutch | | 2026-10-19 | minor | Defined-name length counts characters, not bytes: Arabic names up to 255 letters are accepted, and Create from Selection keeps long Arabic headers | | 2026-10-19 | minor | Table names are limited to 255 Unicode characters | | 2026-10-19 | minor | Right-to-left sheets in legacy `.xls` files (common in older Arabic workbooks) open right-to-left |