From 5effeea8fc40378b0baaab8092d14b062eaa69e9 Mon Sep 17 00:00:00 2001 From: mbielski1337 Date: Tue, 13 Oct 2026 17:01:15 +0200 Subject: [PATCH 01/33] i18n: add Polish translation table --- crates/ui-egui/src/i18n/pl.rs | 983 ++++++++++++++++++++++++++++++++++ 1 file changed, 983 insertions(+) create mode 100644 crates/ui-egui/src/i18n/pl.rs diff --git a/crates/ui-egui/src/i18n/pl.rs b/crates/ui-egui/src/i18n/pl.rs new file mode 100644 index 000000000..d351b8597 --- /dev/null +++ b/crates/ui-egui/src/i18n/pl.rs @@ -0,0 +1,983 @@ +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Wklej", + "Paste Values" => "Wklej wartości", + "Paste Formulas" => "Wklej formuły", + "Paste Formatting" => "Wklej formatowanie", + "Transpose" => "Transpozycja", + "Paste Link" => "Wklej łącze", + "Paste Special…" => "Wklej specjalnie…", + "Insert Copied Cells" => "Wstaw skopiowane komórki", + "Insert Copied Cells…" => "Wstaw skopiowane komórki…", + "Insert Cut Cells" => "Wstaw wycięte komórki", + "Insert Paste" => "Wklej ze wstawieniem", + "Cut (⌘X)" => "Wytnij (⌘X)", + "Copy (⌘C)" => "Kopiuj (⌘C)", + "Format Painter (double-click to keep it on)" => "Malarz formatów (kliknij dwukrotnie, aby pozostał włączony)", + "Bold (⌘B)" => "Pogrubienie (⌘B)", + "Italic (⌘I)" => "Kursywa (⌘I)", + "Underline (⌘U)" => "Podkreślenie (⌘U)", + "Double Underline" => "Podwójne podkreślenie", + "Strikethrough" => "Przekreślenie", + "Underline" => "Podkreślenie", + "Increase Font Size" => "Zwiększ rozmiar czcionki", + "Decrease Font Size" => "Zmniejsz rozmiar czcionki", + "Wrap Text" => "Zawijaj tekst", + "Merge & Center" => "Scal i wyśrodkuj", + "Merge Cells" => "Scal komórki", + "Merge Across" => "Scal wszystkie", + "Unmerge Cells" => "Rozdziel komórki", + "Fill Color" => "Kolor wypełnienia", + "Font Color" => "Kolor czcionki", + "Borders" => "Obramowania", + "Top\nAlign" => "Wyrównaj\ndo góry", + "Middle\nAlign" => "Wyrównaj\ndo środka", + "Bottom\nAlign" => "Wyrównaj\ndo dołu", + "Left" => "Do lewej", + "Right" => "Do prawej", + "Center" => "Do środka", + "Horizontal" => "Poziomo", + "Vertical Text" => "Tekst pionowy", + "Decrease Indent" => "Zmniejsz wcięcie", + "Increase Indent" => "Zwiększ wcięcie", + "Orientation" => "Orientacja", + "Angle Counterclockwise" => "Kąt przeciwnie do ruchu wskazówek zegara", + "Angle Clockwise" => "Kąt zgodnie z ruchem wskazówek zegara", + "Rotate Text Up" => "Obróć tekst w górę", + "Rotate Text Down" => "Obróć tekst w dół", + "Accounting Number Format" => "Format liczb księgowych", + "Percent Style" => "Zapis procentowy", + "Comma Style" => "Zapis dziesiętny", + "Increase Decimal" => "Zwiększ dziesiętne", + "Decrease Decimal" => "Zmniejsz dziesiętne", + "More Accounting Formats…" => "Więcej formatów księgowych…", + "Conditional\nFormatting" => "Formatowanie\nwarunkowe", + "Conditional Formatting" => "Formatowanie warunkowe", + "Format\nas Table" => "Formatuj\njako tabelę", + "Cell\nStyles" => "Style\nkomórki", + "Format Cells…" => "Formatuj komórki…", + "Format Cell Alignment…" => "Formatuj wyrównanie komórek…", + "Format\nPane" => "Okienko\nformatowania", + "Format" => "Formatuj", + "Insert" => "Wstaw", + "Insert Cells…" => "Wstaw komórki…", + "Delete" => "Usuń", + "Delete Cells…" => "Usuń komórki…", + "Insert Sheet Rows" => "Wstaw wiersze arkusza", + "Insert Sheet Columns" => "Wstaw kolumny arkusza", + "Delete Sheet Rows" => "Usuń wiersze arkusza", + "Delete Sheet Columns" => "Usuń kolumny arkusza", + "Row Height…" => "Wysokość wiersza…", + "AutoFit Row Height" => "Autodopasowanie wysokości wiersza", + "Column Width…" => "Szerokość kolumny…", + "AutoFit Column Width" => "Autodopasowanie szerokości kolumny", + "Default Width…" => "Szerokość domyślna…", + "Hide Rows" => "Ukryj wiersze", + "Unhide Rows" => "Odkryj wiersze", + "Hide Columns" => "Ukryj kolumny", + "Unhide Columns" => "Odkryj kolumny", + "Lock Cell" => "Zablokuj komórkę", + "Clear" => "Wyczyść", + "Clear All" => "Wyczyść wszystko", + "Clear Formats" => "Wyczyść formaty", + "Clear Contents" => "Wyczyść zawartość", + "Clear Comments and Notes" => "Wyczyść komentarze i notatki", + "Clear Hyperlinks" => "Wyczyść hiperlinki", + "AutoSum" => "Autosumowanie", + "AutoSum (⌘⇧T)" => "Autosumowanie (⌘⇧T)", + "Flash\nFill" => "Wypełnianie\nbłyskawiczne", + "Flash Fill" => "Wypełnianie błyskawiczne", + "Fill" => "Wypełnij", + "Clear Print Area" => "Wyczyść obszar wydruku", + "Find &\nSelect" => "Znajdź i\nzaznacz", + "Find…" => "Znajdź…", + "Replace…" => "Zamień…", + "Go To…" => "Przejdź do…", + "Go To Special…" => "Przejdź do (specjalnie)…", + "PivotTable" => "Tabela\nprzestawna", + "Recommended\nCharts" => "Polecane\nwykresy", + "Table" => "Tabela", + "Pictures" => "Obrazy", + "Shapes" => "Kształty", + "Icons" => "Ikony", + "Text\nBox" => "Pole\ntekstowe", + "Comment" => "Komentarz", + "New\nComment" => "Nowy\nkomentarz", + "New Note" => "Nowa notatka", + "Show/Hide Note" => "Pokaż/ukryj notatkę", + "Header &\nFooter" => "Nagłówek\ni stopka", + "Text to\nColumns" => "Tekst jako\nkolumny", + "Link" => "Łącze", + "Symbol" => "Symbol", + "Sparklines" => "Wykresy przebiegu w czasie", + "Checkbox" => "Pole wyboru", + "Insert checkboxes in the selected cells" => "Wstaw pola wyboru w zaznaczonych komórkach", + "Header & Footer" => "Nagłówek i stopka", + "Draw with ink" => "Rysuj piórem", + "Eraser" => "Gumka", + "Ink to\nShape" => "Pismo odręczne\nna kształt", + "Select\nObjects" => "Zaznacz\nobiekty", + "Themes" => "Motywy", + "Margins" => "Marginesy", + "Left Margin" => "Lewy margines", + "Right Margin" => "Prawy margines", + "Top Margin" => "Górny margines", + "Bottom Margin" => "Dolny margines", + "Header Margin" => "Margines nagłówka", + "Footer Margin" => "Margines stopki", + "Size" => "Rozmiar", + "Print\nArea" => "Obszar\nwydruku", + "Set Print Area" => "Ustaw obszar wydruku", + "Breaks" => "Podziały", + "Insert Page Break" => "Wstaw podział strony", + "Remove Page Break" => "Usuń podział strony", + "Reset All Page Breaks" => "Resetuj wszystkie podziały stron", + "Print\nTitles" => "Tytuły\nwydruku", + "Sheet\nRight-to-Left" => "Arkusz od prawej\ndo lewej", + "Sheet Right-to-Left" => "Arkusz od prawej do lewej", + "Narrow" => "Wąskie", + "Wide" => "Szerokie", + "Normal" => "Normalne", + "Portrait" => "Pionowa", + "Landscape" => "Pozioma", + "Custom Margins…" => "Marginesy niestandardowe…", + "Insert\nFunction" => "Wstaw\nfunkcję", + "Name\nManager" => "Menedżer\nnazw", + "Define Name" => "Definiuj nazwę", + "Use in Formula" => "Użyj w formule", + "Create from Selection" => "Utwórz z zaznaczenia", + "Trace Precedents" => "Śledź poprzedniki", + "Trace Dependents" => "Śledź zależności", + "Remove Arrows" => "Usuń strzałki", + "Show Formulas" => "Pokaż formuły", + "Error Checking" => "Sprawdzanie błędów", + "Evaluate Formula" => "Szacuj formułę", + "Watch Window" => "Okno czujki", + "Calculation\nOptions" => "Opcje\nobliczania", + "Calculate Now" => "Oblicz teraz", + "Calculate Sheet" => "Oblicz arkusz", + "Automatic" => "Automatycznie", + "Automatic Except for Data Tables" => "Automatycznie z wyjątkiem tabel danych", + "Manual" => "Ręcznie", + "Sort &\nFilter" => "Sortuj i\nfiltruj", + "Sort" => "Sortuj", + "Sort A to Z" => "Sortuj od A do Z", + "Sort Z to A" => "Sortuj od Z do A", + "Custom Sort…" => "Sortowanie niestandardowe…", + "Filter" => "Filtruj", + "Reapply" => "Zastosuj ponownie", + "Get Data\n(Text/CSV)" => "Pobierz dane\n(tekst/CSV)", + "Remove\nDuplicates" => "Usuń\nduplikaty", + "Data\nValidation" => "Poprawność\ndanych", + "Data Validation" => "Poprawność danych", + "Data Validation…" => "Poprawność danych…", + "Circle Invalid Data" => "Zakreśl nieprawidłowe dane", + "Clear Validation" => "Wyczyść poprawność danych", + "Group" => "Grupuj", + "Ungroup" => "Rozgrupuj", + "Show Detail" => "Pokaż szczegóły", + "Hide Detail" => "Ukryj szczegóły", + "Subtotal" => "Suma częściowa", + "Data\nAnalysis" => "Analiza\ndanych", + "Data Analysis" => "Analiza danych", + "Solver" => "Solver", + "What-If\nAnalysis" => "Analiza\nwarunkowa", + "Data Table…" => "Tabela danych…", + "Scenario Manager…" => "Menedżer scenariuszy…", + "Goal Seek…" => "Szukaj wyniku…", + "Forecast\nSheet" => "Arkusz\nprognozy", + "Spelling" => "Pisownia", + "Check\nAccessibility" => "Sprawdź ułatwienia\ndostępu", + "Threaded Comments" => "Komentarze wątkowe", + "Show\nComments" => "Pokaż\nkomentarze", + "Previous" => "Poprzedni", + "Next" => "Następny", + "Previous Comment" => "Poprzedni komentarz", + "Next Comment" => "Następny komentarz", + "Show All Notes" => "Pokaż wszystkie notatki", + "Convert to Comments" => "Konwertuj na komentarze", + "Protect\nWorkbook" => "Chroń\nskoroszyt", + "Allow Edit\nRanges" => "Zezwalaj na\nedycję zakresów", + "Allow Edit Ranges" => "Zezwalaj na edycję zakresów", + "Unprotect\nSheet" => "Nie chroń\narkusza", + "Protect Sheet…" => "Chroń arkusz…", + "Comments" => "Komentarze", + "Notes" => "Notatki", + "Page Break\nPreview" => "Podgląd\npodziału stron", + "Page\nLayout" => "Układ\nstrony", + "Formula Bar" => "Pasek formuły", + "Gridlines" => "Linie siatki", + "Headings" => "Nagłówki", + "Zoom" => "Powiększenie", + "100%" => "100%", + "Zoom to\nSelection" => "Powiększ do\nzaznaczenia", + "Freeze\nPanes" => "Zablokuj\nokienka", + "Freeze Panes" => "Zablokuj okienka", + "Freeze Top Row" => "Zablokuj górny wiersz", + "Freeze First Column" => "Zablokuj pierwszą kolumnę", + "Unfreeze Panes" => "Odblokuj okienka", + "Dark Mode" => "Tryb ciemny", + "Interface language" => "Język interfejsu", + "Interface size" => "Rozmiar interfejsu", + "Auto" => "Automatyczny", + "Drag to freeze columns" => "Przeciągnij, aby zablokować kolumny", + "Drag to freeze rows" => "Przeciągnij, aby zablokować wiersze", + "Command\nPalette" => "Paleta\npoleceń", + "Agent\nControl" => "Sterowanie\nagentem", + "Action\nJournal" => "Dziennik\nakcji", + "About\nGridCraft" => "O programie\nGridCraft", + "Share" => "Udostępnij", + "Add Chart\nElement" => "Dodaj element\nwykresu", + "Change\nChart Type" => "Zmień\ntyp wykresu", + "Switch\nRow/Column" => "Przełącz\nwiersz/kolumnę", + "Select\nData" => "Zaznacz\ndane", + "Data Labels: None" => "Etykiety danych: brak", + "Data Labels: Show" => "Etykiety danych: pokaż", + "Legend: None" => "Legenda: brak", + "Legend: Bottom" => "Legenda: u dołu", + "Legend: Top" => "Legenda: u góry", + "Legend: Right" => "Legenda: z prawej", + "Gridlines: None" => "Linie siatki: brak", + "Gridlines: Show" => "Linie siatki: pokaż", + "Chart\nTitle" => "Tytuł\nwykresu", + "Delete\nChart" => "Usuń\nwykres", + "Convert\nto Range" => "Konwertuj\nna zakres", + "Table\nStyles" => "Style\ntabeli", + "Top 10 Items" => "10 pierwszych elementów", + "Top 10%" => "Pierwsze 10%", + "Bottom 10 Items" => "10 ostatnich elementów", + "Bottom 10%" => "Ostatnie 10%", + "Above Average" => "Powyżej średniej", + "Below Average" => "Poniżej średniej", + "Clear Rules from Entire Sheet" => "Wyczyść reguły z całego arkusza", + "Clear Rules from Selected Cells" => "Wyczyść reguły z zaznaczonych komórek", + "Constants" => "Stałe", + "Data Bars" => "Paski danych", + "Color Scales" => "Skale kolorów", + "Icon Sets" => "Zestawy ikon", + "Home" => "Narzędzia główne", + "Draw" => "Rysowanie", + "Page Layout" => "Układ strony", + "Formulas" => "Formuły", + "Data" => "Dane", + "Review" => "Recenzja", + "View" => "Widok", + "Automate" => "Automatyzacja", + "Table Design" => "Projekt tabeli", + "Chart Design" => "Projekt wykresu", + "Ready" => "Gotowy", + "Enter" => "Wprowadź", + "Edit" => "Edytuj", + "Point" => "Wskaż", + "Calculate" => "Oblicz", + "Select destination and press Enter or choose Paste" => "Zaznacz miejsce docelowe i naciśnij Enter lub wybierz polecenie Wklej", + "General" => "Ogólne", + "Number" => "Liczbowe", + "Currency" => "Walutowe", + "Accounting" => "Księgowe", + "Date" => "Data", + "Time" => "Czas", + "Percentage" => "Procentowe", + "Fraction" => "Ułamkowe", + "Scientific" => "Naukowe", + "Text" => "Tekstowe", + "Special" => "Specjalne", + "Custom" => "Niestandardowe", + "Short Date" => "Data krótka", + "Long Date" => "Data długa", + "More Number Formats…" => "Więcej formatów liczb…", + "Financial" => "Finansowe", + "Logical" => "Logiczne", + "Date &\nTime" => "Data i\ngodzina", + "Lookup &\nReference" => "Wyszukiwanie\ni odwołania", + "Math &\nTrig" => "Matematyczne i\ntrygonometryczne", + "More\nFunctions" => "Więcej\nfunkcji", + "Page Layout|Orientation" => "Orientacja", + "Display theme" => "Motyw wyświetlania", + "Animations" => "Animacje", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "Płynnie przesuwaj ramkę zaznaczenia do komórki, do której przechodzisz, zamiast przeskakiwać" + } + "System" => "Systemowy", + "Light" => "Jasny", + "Dark" => "Ciemny", + "Sheet Options|View" => "Wyświetl", + "Print" => "Drukuj", + "Click to add data" => "Kliknij, aby dodać dane", + "Add header" => "Dodaj nagłówek", + "Add footer" => "Dodaj stopkę", + "(none)" => "(brak)", + "Header" => "Nagłówek", + "Footer" => "Stopka", + "Page\nNumber" => "Numer\nstrony", + "Number\nof Pages" => "Liczba\nstron", + "Current\nDate" => "Bieżąca\ndata", + "Current\nTime" => "Bieżąca\ngodzina", + "File\nPath" => "Ścieżka\npliku", + "File\nName" => "Nazwa\npliku", + "Sheet\nName" => "Nazwa\narkusza", + "Go to\nHeader" => "Przejdź do\nnagłówka", + "Go to\nFooter" => "Przejdź do\nstopki", + "Page Number" => "Numer strony", + "Number of Pages" => "Liczba stron", + "Current Date" => "Bieżąca data", + "Current Time" => "Bieżąca godzina", + "File Path" => "Ścieżka pliku", + "File Name" => "Nazwa pliku", + "Sheet Name" => "Nazwa arkusza", + "Go to Header" => "Przejdź do nagłówka", + "Different First Page" => "Inna pierwsza strona", + "Different Odd & Even Pages" => "Inne strony nieparzyste i parzyste", + "Go to Footer" => "Przejdź do stopki", + "Ruler" => "Linijka", + "File" => "Plik", + "Back" => "Wstecz", + "New" => "Nowy", + "Open" => "Otwórz", + "Info" => "Informacje", + "Save" => "Zapisz", + "Save As" => "Zapisz jako", + "Export" => "Eksportuj", + "Close" => "Zamknij", + "Options" => "Opcje", + "Blank workbook" => "Pusty skoroszyt", + "Recent" => "Ostatnie", + "No recent workbooks yet." => "Nie masz jeszcze ostatnio używanych skoroszytów.", + "More workbooks" => "Więcej skoroszytów", + "Modified" => "Zmodyfikowano", + "Not available" => "Niedostępne", + "Just now" => "Przed chwilą", + "{n} min ago" => "{n} min temu", + "{n} h ago" => "{n} godz. temu", + "{n} days ago" => "{n} dni temu", + "{n} weeks ago" => "{n} tyg. temu", + "{n} months ago" => "{n} mies. temu", + "{n} years ago" => "{n} l. temu", + "Browse…" => "Przeglądaj…", + "Not saved yet" => "Jeszcze niezapisany", + "Location" => "Lokalizacja", + "Sheets" => "Arkusze", + "Protect Workbook" => "Chroń skoroszyt", + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "Struktura arkuszy jest zablokowana: nie można dodawać, przenosić, usuwać arkuszy ani zmieniać ich nazw." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Zablokuj strukturę arkuszy, żeby nie dało się dodawać, przenosić, usuwać arkuszy ani zmieniać ich nazw." + } + "Properties" => "Właściwości", + "Title" => "Tytuł", + "Subject" => "Temat", + "Author" => "Autor", + "Company" => "Firma", + "Keywords" => "Słowa kluczowe", + "Description" => "Opis", + "No workbook is open." => "Żaden skoroszyt nie jest otwarty.", + "Save as type" => "Zapisz jako typ", + "Excel Workbook (*.xlsx)" => "Skoroszyt programu Excel (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (rozdzielany przecinkami) (*.csv)", + "Web Page (*.html)" => "Strona sieci Web (*.html)", + "PDF (*.pdf)" => "PDF (*.pdf)", + "Download" => "Pobierz", + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "Plik CSV, strona sieci Web i PDF to tylko kopie: skoroszyt zostaje w swoim pliku." + } + "Save the workbook under another name or in another folder." => "Zapisz skoroszyt pod inną nazwą lub w innym folderze.", + "Print Active Sheets" => "Drukuj aktywne arkusze", + "Print Entire Workbook" => "Drukuj cały skoroszyt", + "Fit Sheet on One Page" => "Dopasuj arkusz do jednej strony", + "Page Setup…" => "Ustawienia strony…", + "Page {page} of {pages}" => "Strona {page} z {pages}", + "Nothing to print." => "Nie ma nic do wydrukowania.", + "Previous page" => "Poprzednia strona", + "Next page" => "Następna strona", + "Create PDF" => "Utwórz plik PDF", + "Save the sheet as a PDF document that keeps its page layout." => "Zapisz arkusz jako dokument PDF z zachowaniem układu strony.", + "Change File Type" => "Zmień typ pliku", + "CSV (Comma delimited)" => "CSV (rozdzielany przecinkami)", + "Save the active sheet as comma-separated text." => "Zapisz aktywny arkusz jako tekst rozdzielany przecinkami.", + "Web Page (.html)" => "Strona sieci Web (.html)", + "Save the workbook as a web page." => "Zapisz skoroszyt jako stronę sieci Web.", + "Options|General" => "Ogólne", + "Options|Save" => "Zapisywanie", + "Show formula bar" => "Pokaż pasek formuły", + "Enable AutoComplete for cell values" => "Włącz Autouzupełnianie dla wartości komórek", + "Save .xlsx workbooks automatically after every change" => "Automatycznie zapisuj skoroszyty .xlsx po każdej zmianie", + "Workbook calculation" => "Obliczenia w skoroszycie", + "Enable iterative calculation" => "Włącz obliczenia iteracyjne", + "Calculation settings are saved with the workbook." => "Ustawienia obliczeń są zapisywane razem ze skoroszytem.", + "OK" => "OK", + "Cancel" => "Anuluj", + "Don't Save" => "Nie zapisuj", + "Open…" => "Otwórz…", + "Show password" => "Pokaż hasło", + "Start a new workbook" => "Utwórz nowy skoroszyt", + "Household Budget" => "Budżet domowy", + "Quarterly Sales Dashboard" => "Pulpit sprzedaży kwartalnej", + "Gradebook" => "Dziennik ocen", + "this workbook" => "ten skoroszyt", + "This workbook" => "Ten skoroszyt", + "Do you want to save the changes you made to {title}?" => "Czy chcesz zapisać zmiany wprowadzone w pliku {title}?", + "Save a copy as .{format}" => "Zapisz kopię jako .{format}", + "Select a chart first." => "Najpierw zaznacz wykres.", + "Text Box" => "Pole tekstowe", + "Select Data" => "Zaznacz dane", + "Row Height" => "Wysokość wiersza", + "Column Width" => "Szerokość kolumny", + "Standard Width" => "Szerokość standardowa", + "Rename Sheet" => "Zmień nazwę arkusza", + "Move or Copy" => "Przenoszenie lub kopiowanie", + "Protect Sheet" => "Chroń arkusz", + "Protect Structure and Windows" => "Chroń strukturę i okna", + "Unprotect Workbook" => "Nie chroń skoroszytu", + "Unprotect Sheet" => "Nie chroń arkusza", + "Password" => "Hasło", + "Unhide" => "Odkryj", + "Paste Special" => "Wklejanie specjalne", + "Series" => "Seria danych", + "New Comment" => "Nowy komentarz", + "Insert Hyperlink" => "Wstawianie hiperlinku", + "Create Sparklines" => "Tworzenie wykresów przebiegu w czasie", + "Page Setup" => "Ustawienia strony", + "Convert Text to Columns" => "Konwertowanie tekstu na kolumny", + "Remove Duplicates" => "Usuń duplikaty", + "Goal Seek" => "Szukaj wyniku", + "Create Forecast Worksheet" => "Tworzenie arkusza prognozy", + "Solver Parameters" => "Parametry dodatku Solver", + "Solver Results" => "Wyniki dodatku Solver", + "Edit Name" => "Edytowanie nazwy", + "New Name" => "Nowa nazwa", + "Format Cells" => "Formatowanie komórek", + "Formula Builder" => "Konstruktor formuł", + "Find and Replace" => "Znajdowanie i zamienianie", + "Go To" => "Przechodzenie do", + "Insert Calculated Field" => "Wstawianie pola obliczeniowego", + "Go To Special" => "Przechodzenie do (specjalnie)", + "Name Manager" => "Menedżer nazw", + "Conditional Formatting Rules Manager" => "Menedżer reguł formatowania warunkowego", + "Search Commands" => "Wyszukaj polecenia", + "Agent Control" => "Sterowanie agentem", + "About GridCraft" => "O programie GridCraft", + "Insert Chart" => "Wstawianie wykresu", + "Select Data Source" => "Wybieranie źródła danych", + "Action Journal" => "Dziennik akcji", + "Macros" => "Makra", + "Workbook Statistics" => "Statystyki skoroszytu", + "Accessibility" => "Ułatwienia dostępu", + "Chart Title" => "Tytuł wykresu", + "Place Picture in Cell" => "Umieść obraz w komórce", + "Place Picture over Cells" => "Umieść obraz na komórkach", + "Pick From List" => "Wybierz z listy", + "Save a Copy" => "Zapisz kopię", + "Save Changes?" => "Zapisać zmiany?", + "Shift cells right" => "Przesuń komórki w prawo", + "Shift cells down" => "Przesuń komórki w dół", + "Shift cells left" => "Przesuń komórki w lewo", + "Shift cells up" => "Przesuń komórki w górę", + "Entire row" => "Cały wiersz", + "Entire column" => "Cała kolumna", + "Row height (pixels):" => "Wysokość wiersza (piksele):", + "Column width (characters):" => "Szerokość kolumny (znaki):", + "Standard column width (pixels):" => "Standardowa szerokość kolumny (piksele):", + "Name:" => "Nazwa:", + "Before sheet (position, 0 = first):" => "Przed arkuszem (pozycja, 0 = pierwszy):", + "Create a copy" => "Utwórz kopię", + "Sheets: {sheets}" => "Arkusze: {sheets}", + "Password (optional):" => "Hasło (opcjonalnie):", + "Password:" => "Hasło:", + "Allow all users of this sheet to:" => "Zezwalaj wszystkim użytkownikom tego arkusza na:", + "Format cells" => "Formatowanie komórek", + "Format columns" => "Formatowanie kolumn", + "Format rows" => "Formatowanie wierszy", + "Insert rows" => "Wstawianie wierszy", + "Delete rows" => "Usuwanie wierszy", + "Use AutoFilter" => "Używanie Autofiltru", + " (password, unlocked)" => " (hasło, odblokowany)", + " (password)" => " (hasło)", + "No ranges yet." => "Nie ma jeszcze zakresów.", + "Ranges that stay editable when the sheet is protected:" => "Zakresy, które można edytować, gdy arkusz jest chroniony:", + "Action" => "Akcja", + "Modify" => "Modyfikuj", + "Unlock with password" => "Odblokuj hasłem", + "Title:" => "Tytuł:", + "Refers to cells:" => "Odwołuje się do komórek:", + "Range password:" => "Hasło zakresu:", + "New title (Modify):" => "Nowy tytuł (Modyfikuj):", + "Remove the password (Modify)" => "Usuń hasło (Modyfikuj)", + "'{file}' is protected." => "Plik „{file}” jest chroniony.", + "Unhide sheet:" => "Odkryj arkusz:", + "Hidden: {sheets}" => "Ukryte: {sheets}", + "All" => "Wszystko", + "Formulas (F)" => "Formuły (F)", + "Values (V)" => "Wartości (V)", + "Formats (T)" => "Formaty (T)", + "Comments and notes (C)" => "Komentarze i notatki (C)", + "Validation" => "Sprawdzanie poprawności", + "All except borders" => "Wszystko z wyjątkiem obramowań", + "Column widths" => "Szerokości kolumn", + "Formulas and number formats" => "Formuły i formaty liczb", + "Values and number formats" => "Wartości i formaty liczb", + "Operation" => "Operacja", + "Add" => "Dodaj", + "Subtract" => "Odejmij", + "Multiply" => "Pomnóż", + "Divide" => "Podziel", + "Skip blanks" => "Pomijaj puste", + "Transpose (E)" => "Transpozycja (E)", + "Series in" => "Seria w", + "Columns" => "Kolumny", + "Rows" => "Wiersze", + "Type" => "Typ", + "Linear" => "Liniowy", + "Growth" => "Wzrost", + "Date unit" => "Jednostka daty", + "Day" => "Dzień", + "Weekday" => "Dzień powszedni", + "Month" => "Miesiąc", + "Year" => "Rok", + "Step value:" => "Wartość kroku:", + "Stop value:" => "Wartość końcowa:", + "Start a conversation:" => "Rozpocznij konwersację:", + "Note:" => "Notatka:", + "Display:" => "Tekst do wyświetlenia:", + "Link to (web address, e-mail or Sheet!A1):" => "Łącze do (adres internetowy, e-mail lub Arkusz1!A1):", + "ScreenTip:" => "Etykietka ekranowa:", + "Data Range:" => "Zakres danych:", + "Location Range:" => "Zakres lokalizacji:", + "Markers" => "Znaczniki", + "Footer:" => "Stopka:", + "Left margin (in):" => "Lewy margines (cale):", + "Right margin (in):" => "Prawy margines (cale):", + "Top margin (in):" => "Górny margines (cale):", + "Bottom margin (in):" => "Dolny margines (cale):", + "Header (in):" => "Nagłówek (cale):", + "Footer (in):" => "Stopka (cale):", + "Tab" => "Tabulator", + "Semicolon" => "Średnik", + "Comma" => "Przecinek", + "Space" => "Spacja", + "Other:" => "Inny:", + "Treat consecutive delimiters as one" => "Traktuj kolejne ograniczniki jako jeden", + "Destination:" => "Miejsce docelowe:", + "My data has headers" => "Moje dane mają nagłówki", + "Columns (blank = all, e.g. A,C):" => "Kolumny (puste = wszystkie, np. A,C):", + "Timeline range (blank: first column of the selection):" => "Zakres osi czasu (puste: pierwsza kolumna zaznaczenia):", + "Values range (blank: second column of the selection):" => "Zakres wartości (puste: druga kolumna zaznaczenia):", + "Confidence interval" => "Przedział ufności", + "Confidence level (%):" => "Poziom ufności (%):", + "Seasonality (auto, 0 for none, or a season length):" => "Sezonowość (auto, 0 = brak albo długość sezonu):", + "Fill missing points using" => "Wypełnij brakujące punkty przy użyciu", + "Interpolation" => "Interpolacja", + "Zeros" => "Zera", + "Aggregate duplicates using" => "Agreguj duplikaty przy użyciu", + "Average" => "Średnia", + "Count" => "Licznik", + "CountA" => "Licznik niepustych", + "Max" => "Maksimum", + "Median" => "Mediana", + "Min" => "Minimum", + "Sum" => "Suma", + "Product" => "Iloczyn", + "Include forecast statistics" => "Uwzględnij statystyki prognozy", + "Chart" => "Wykres", + "Line chart" => "Wykres liniowy", + "Column chart" => "Wykres kolumnowy", + "At each change in (column letter):" => "Przy każdej zmianie w (litera kolumny):", + "Use function" => "Użyj funkcji", + "Add subtotal to (columns, e.g. C,D):" => "Dodaj sumę częściową do (kolumny, np. C,D):", + "Magnification" => "Powiększenie", + "Custom (%):" => "Niestandardowe (%):", + "Scope (Workbook or sheet name):" => "Zakres (skoroszyt lub nazwa arkusza):", + "Comment:" => "Komentarz:", + "Refers to:" => "Odwołuje się do:", + "Allow" => "Dozwolone", + "Any value" => "Dowolna wartość", + "Whole number" => "Pełna liczba", + "Decimal" => "Dziesiętne", + "List" => "Lista", + "Text length" => "Długość tekstu", + "between" => "między", + "not between" => "nie między", + "equal to" => "równe", + "not equal to" => "różne od", + "greater than" => "większe niż", + "less than" => "mniejsze niż", + "greater than or equal to" => "większe lub równe", + "less than or equal to" => "mniejsze lub równe", + "Minimum / Source / Formula:" => "Minimum / Źródło / Formuła:", + "Maximum:" => "Maksimum:", + "Ignore blank" => "Ignoruj puste", + "In-cell dropdown" => "Rozwinięcie w komórce", + "Input message:" => "Komunikat wejściowy:", + "Error style" => "Styl błędu", + "Stop" => "Zatrzymaj", + "Warning" => "Ostrzeżenie", + "Information" => "Informacje", + "Error message:" => "Komunikat o błędzie:", + "Format cells that are (value):" => "Formatuj komórki, które są (wartość):", + "and:" => "i:", + "Format cells that contain the text:" => "Formatuj komórki zawierające tekst:", + "Format cells that contain a date occurring:" => "Formatuj komórki zawierające datę:", + "Yesterday" => "Wczoraj", + "Today" => "Dzisiaj", + "Tomorrow" => "Jutro", + "In the last 7 days" => "W ciągu ostatnich 7 dni", + "Last week" => "W zeszłym tygodniu", + "This week" => "W tym tygodniu", + "Next week" => "W przyszłym tygodniu", + "Last month" => "W zeszłym miesiącu", + "This month" => "W tym miesiącu", + "Next month" => "W przyszłym miesiącu", + "Format values where this formula is true:" => "Formatuj wartości, dla których ta formuła jest prawdziwa:", + "with" => "z", + "Light Red Fill with Dark Red Text" => "Jasnoczerwone wypełnienie z ciemnoczerwonym tekstem", + "Yellow Fill with Dark Yellow Text" => "Żółte wypełnienie z ciemnożółtym tekstem", + "Green Fill with Dark Green Text" => "Zielone wypełnienie z ciemnozielonym tekstem", + "Light Red Fill" => "Jasnoczerwone wypełnienie", + "Red Text" => "Czerwony tekst", + "Red Border" => "Czerwone obramowanie", + "Formula:" => "Formuła:", + "Select" => "Zaznacz", + "Blanks" => "Puste", + "Errors" => "Błędy", + "Numbers" => "Liczby", + "Current region" => "Bieżący obszar", + "Last cell" => "Ostatnia komórka", + "Visible cells only" => "Tylko widoczne komórki", + "Conditional formats" => "Formatowanie warunkowe", + "Data validation" => "Poprawność danych", + "Horizontal axis title:" => "Tytuł osi poziomej:", + "Vertical axis title:" => "Tytuł osi pionowej:", + "No picture selected" => "Nie wybrano obrazu", + "Picture file path (PNG or JPEG):" => "Ścieżka pliku obrazu (PNG lub JPEG):", + "Description (optional):" => "Opis (opcjonalnie):", + "Fits inside the selected cell and moves with its content." => "Mieści się w zaznaczonej komórce i przesuwa się razem z jej zawartością.", + "Choose a PNG or JPEG no larger than 16 MB." => "Wybierz plik PNG lub JPEG nie większy niż 16 MB.", + "About" => "O programie", + "Contributors" => "Współtwórcy", + "Models" => "Modele", + "Version {version}" => "Wersja {version}", + "Join the ArtCraft Discord" => "Dołącz do Discorda ArtCraft", + "This workbook has no scripts or macros." => "Ten skoroszyt nie zawiera skryptów ani makr.", + "(unnamed)" => "(bez nazwy)", + "— VBA project (preserved, not run)" => "- projekt VBA (zachowany, nieuruchamiany)", + "— 1 step" => "- 1 krok", + "— {steps} steps" => "- liczba kroków: {steps}", + "Alignment" => "Wyrównanie", + "Font" => "Czcionka", + "Border" => "Obramowanie", + "Format Cells|Fill" => "Wypełnienie", + "Protection" => "Ochrona", + "Category:" => "Kategoria:", + "Sample" => "Przykład", + "Type (custom format code):" => "Typ (kod formatu niestandardowego):", + "Vertical" => "Pionowo", + "Justify" => "Wyjustuj", + "Center Across Selection" => "Wyrównaj do środka zaznaczenia", + "Distributed" => "Rozłożone", + "Top" => "Do góry", + "Bottom" => "Do dołu", + "Indent" => "Wcięcie", + "Orientation (degrees)" => "Orientacja (stopnie)", + "Wrap text" => "Zawijaj tekst", + "Shrink to fit" => "Zmniejsz, aby dopasować", + "Bold" => "Pogrubienie", + "Italic" => "Kursywa", + "None" => "Brak", + "Single" => "Pojedyncze", + "Double" => "Podwójne", + "Single Accounting" => "Pojedyncze księgowe", + "Double Accounting" => "Podwójne księgowe", + "Superscript" => "Indeks górny", + "Subscript" => "Indeks dolny", + "Color:" => "Kolor:", + "Outline" => "Kontur", + "Diagonal ↘" => "Ukośna ↘", + "Diagonal ↗" => "Ukośna ↗", + "none" => "brak", + "thin" => "cienka", + "medium" => "średnia", + "thick" => "gruba", + "dashed" => "kreskowana", + "dotted" => "kropkowana", + "double" => "podwójna", + "Background Color:" => "Kolor tła:", + "Locked" => "Zablokuj", + "Hidden" => "Ukryj", + "Search:" => "Szukaj:", + "e.g. lookup, average, date" => "np. wyszukaj, średnia, data", + "Date & Time" => "Data i godzina", + "Lookup & Reference" => "Wyszukiwanie i odwołania", + "Math & Trig" => "Matematyczne i trygonometryczne", + "Statistical" => "Statystyczne", + "Engineering" => "Inżynierskie", + "Database" => "Baza danych", + "Compatibility" => "Zgodność", + "Web" => "Sieć Web", + "Cube" => "Moduł", + "Add-in and Automation" => "Dodatki i automatyzacja", + "Find" => "Znajdź", + "Replace" => "Zamień", + "Find what:" => "Znajdź:", + "Replace with:" => "Zamień na:", + "Match case" => "Uwzględniaj wielkość liter", + "Match entire cell contents" => "Dopasuj do całej zawartości komórki", + "Within workbook" => "W obrębie skoroszytu", + "Replace All" => "Zamień wszystko", + "Find All" => "Znajdź wszystko", + "Find Next" => "Znajdź następny", + "All done. We made {count} replacements." => "Gotowe. Liczba zamian: {count}.", + "{count} cell(s) found" => "Znalezione komórki: {count}", + "Reference:" => "Odwołanie:", + "Special…" => "Specjalnie…", + "My list has headers" => "Moja lista ma nagłówki", + "Sort by" => "Sortuj według", + "Then by" => "Następnie według", + "Cell Values" => "Wartości komórek", + "Cell Color" => "Kolor komórki", + "A to Z" => "Od A do Z", + "Z to A" => "Od Z do A", + "+ Add Level" => "+ Dodaj poziom", + "New…" => "Nowy…", + "Edit…" => "Edytuj…", + "Name" => "Nazwa", + "Value" => "Wartość", + "Refers To" => "Odwołuje się do", + "Scope" => "Zakres", + "Workbook" => "Skoroszyt", + "No names defined" => "Brak zdefiniowanych nazw", + "Recommended Charts" => "Polecane wykresy", + "All Charts" => "Wszystkie wykresy", + "Clustered Column" => "Kolumnowy grupowany", + "Stacked Column" => "Kolumnowy skumulowany", + "100% Stacked Column" => "Kolumnowy 100% skumulowany", + "Clustered Bar" => "Słupkowy grupowany", + "Stacked Bar" => "Słupkowy skumulowany", + "100% Stacked Bar" => "Słupkowy 100% skumulowany", + "Line" => "Liniowy", + "Line with Markers" => "Liniowy ze znacznikami", + "Stacked Line" => "Liniowy skumulowany", + "Pie" => "Kołowy", + "Doughnut" => "Pierścieniowy", + "Area" => "Warstwowy", + "Stacked Area" => "Warstwowy skumulowany", + "Scatter" => "Punktowy", + "Scatter with Lines" => "Punktowy z liniami", + "Radar" => "Radarowy", + "Histogram" => "Histogram", + "Waterfall" => "Kaskadowy", + "Funnel" => "Lejkowy", + "Combo" => "Kombi", + "Chart data range:" => "Zakres danych wykresu:", + "Legend Entries (Series)" => "Wpisy legendy (serie)", + "Series{n}" => "Seria{n}", + "Keep" => "Zachowaj", + "Remove" => "Usuń", + "Horizontal (Category) Axis Labels:" => "Etykiety osi poziomej (kategorii):", + "There are no conditional formatting rules on this sheet." => "W tym arkuszu nie ma reguł formatowania warunkowego.", + "applies to" => "dotyczy", + "Type a command, e.g. freeze, chart, bold…" => "Wpisz polecenie, np. zablokuj, wykres, pogrubienie…", + "Set cell:" => "Ustaw komórkę:", + "To value:" => "Wartość docelowa:", + "By changing cell:" => "Zmieniając komórkę:", + "Goal Seeking found a solution: {value}" => "Szukanie wyniku znalazło rozwiązanie: {value}", + "Analysis Tools" => "Narzędzia analizy", + "Anova: Single Factor" => "Analiza wariancji: jednoczynnikowa", + "Correlation" => "Korelacja", + "Covariance" => "Kowariancja", + "Descriptive Statistics" => "Statystyka opisowa", + "Exponential Smoothing" => "Wygładzanie wykładnicze", + "F-Test Two-Sample for Variances" => "Test F: z dwiema próbami dla wariancji", + "Moving Average" => "Średnia ruchoma", + "Rank and Percentile" => "Ranga i percentyl", + "Regression" => "Regresja", + "t-Test: Paired Two Sample for Means" => "Test t: par skojarzonych z dwiema próbami dla średnich", + "t-Test: Two-Sample Assuming Equal Variances" => "Test t: z dwiema próbami zakładający równe wariancje", + "t-Test: Two-Sample Assuming Unequal Variances" => "Test t: z dwiema próbami zakładający nierówne wariancje", + "Output options" => "Opcje wyjścia", + "Output Range:" => "Zakres wyjściowy:", + "New Worksheet Ply:" => "Nowy arkusz:", + "Grouped By:" => "Grupowanie:", + "Labels in first row" => "Etykiety w pierwszym wierszu", + "Input Range:" => "Zakres wejściowy:", + "Variable 1 Range:" => "Zakres zmiennej 1:", + "Variable 2 Range:" => "Zakres zmiennej 2:", + "Summary statistics" => "Statystyki podsumowujące", + "Confidence Level for Mean (%), blank for none:" => "Poziom ufności dla średniej (%), puste = brak:", + "Kth Largest (blank for none):" => "K-ty największy (puste = brak):", + "Kth Smallest (blank for none):" => "K-ty najmniejszy (puste = brak):", + "Bin Range (blank for automatic bins):" => "Zakres przedziałów (puste = automatyczne przedziały):", + "Pareto (sorted histogram)" => "Pareto (posortowany histogram)", + "Cumulative Percentage" => "Procent skumulowany", + "Alpha:" => "Alfa:", + "Input Y Range:" => "Zakres wejściowy Y:", + "Input X Range:" => "Zakres wejściowy X:", + "Constant is Zero" => "Stała równa zero", + "Confidence Level (%):" => "Poziom ufności (%):", + "Residuals" => "Składniki resztowe", + "Standardized Residuals" => "Standardowe składniki resztowe", + "Normal Probability" => "Prawdopodobieństwo normalne", + "Interval:" => "Interwał:", + "Standard Errors" => "Błędy standardowe", + "Damping factor:" => "Współczynnik tłumienia:", + "Hypothesized Mean Difference:" => "Hipotetyczna różnica średnich:", + "Set Objective:" => "Ustaw cel:", + "To:" => "Na:", + "Value Of:" => "Wartość:", + "By Changing Variable Cells:" => "Przez zmienianie komórek zmiennych:", + "Subject to the Constraints:" => "Podlegające ograniczeniom:", + "Make Unconstrained Variables Non-Negative" => "Ustaw zmienne nieograniczone jako nieujemne", + "Select a Solving Method:" => "Wybierz metodę rozwiązywania:", + "GRG Nonlinear" => "Nieliniowa GRG", + "Solve" => "Rozwiąż", + "Keep Solver Solution" => "Zachowaj rozwiązanie dodatku Solver", + "Restore Original Values" => "Przywróć wartości oryginalne", + "The spelling check is complete for the entire sheet." => "Sprawdzanie pisowni w całym arkuszu zostało zakończone.", + "Not in Dictionary ({cell}):" => "Brak w słowniku ({cell}):", + "Suggestions:" => "Sugestie:", + "(No suggestions)" => "(Brak sugestii)", + "Ignore Once" => "Zignoruj raz", + "Add to Dictionary" => "Dodaj do słownika", + "Change" => "Zmień", + "Change All" => "Zmień wszystko", + "$ English (United States)" => "$ Angielski (Stany Zjednoczone)", + "Add Chart Element" => "Dodaj element wykresu", + "Align Left" => "Wyrównaj do lewej", + "Align Right" => "Wyrównaj do prawej", + "Bottom Align" => "Wyrównaj do dołu", + "Calculate Now (F9)" => "Oblicz teraz (F9)", + "Calculate Sheet (⇧F9)" => "Oblicz arkusz (⇧F9)", + "Calculation Options" => "Opcje obliczania", + "Cell Styles" => "Style komórki", + "Change Chart Type" => "Zmień typ wykresu", + "Check Accessibility" => "Sprawdź ułatwienia dostępu", + "Clear Filter" => "Wyczyść filtr", + "Column or Bar" => "Kolumnowy lub słupkowy", + "Comments pane" => "Okienko komentarzy", + "Convert the last ink stroke to a shape" => "Przekształć ostatnie pociągnięcie pióra w kształt", + "Convert to Range" => "Konwertuj na zakres", + "Copy" => "Kopiuj", + "Custom Sort" => "Sortowanie niestandardowe", + "Cut" => "Wytnij", + "Define Name…" => "Definiuj nazwę…", + "Delete Comment" => "Usuń komentarz", + "Delete Sheet" => "Usuń arkusz", + "Delete chart" => "Usuń wykres", + "Delete…" => "Usuń…", + "Dismiss" => "Zamknij", + "Down" => "W dół", + "Edit chart title" => "Edytuj tytuł wykresu", + "Erase ink strokes" => "Wymaż pociągnięcia pióra", + "Every command run in this session (replayable)" => "Każde polecenie uruchomione w tej sesji (można je odtworzyć)", + "Expand formula bar" => "Rozwiń pasek formuły", + "Filter (⌘⇧F)" => "Filtruj (⌘⇧F)", + "Filter by Selected Cell's Value" => "Filtruj według wartości zaznaczonej komórki", + "Find & Select" => "Znajdź i zaznacz", + "Flash Fill (⌘E)" => "Wypełnianie błyskawiczne (⌘E)", + "Forecast Sheet" => "Arkusz prognozy", + "Forecast end (date or number; blank: a third of the history):" => "Koniec prognozy (data lub liczba; puste: jedna trzecia historii):", + "Format Chart pane" => "Okienko formatowania wykresu", + "Format as Table" => "Formatuj jako tabelę", + "Hide" => "Ukryj", + "Hide Sheet" => "Ukryj arkusz", + "Hierarchy & more" => "Hierarchiczne i inne", + "Highlighter" => "Zakreślacz", + "How agents drive GridCraft (MCP / control channel)" => "Jak agenci sterują programem GridCraft (MCP / kanał sterowania)", + "Import a text or CSV file" => "Importuj plik tekstowy lub CSV", + "Insert Function" => "Wstaw funkcję", + "Insert Function (⇧F3)" => "Wstaw funkcję (⇧F3)", + "Insert Link (⌘K)" => "Wstaw łącze (⌘K)", + "Insert Sheet" => "Wstaw arkusz", + "Insert Slicer" => "Wstaw fragmentator", + "Insert a picture" => "Wstaw obraz", + "Insert a slicer to filter a table" => "Wstaw fragmentator, aby filtrować tabelę", + "Insert an icon" => "Wstaw ikonę", + "Insert…" => "Wstaw…", + "Line or Area" => "Liniowy lub warstwowy", + "Link…" => "Łącze…", + "Macros and scripts in this workbook (Alt+F8)" => "Makra i skrypty w tym skoroszycie (Alt+F8)", + "Middle Align" => "Wyrównaj do środka", + "More commands" => "Więcej poleceń", + "Move or Copy Sheet…" => "Przenieś lub kopiuj arkusz…", + "New sheet (⇧F11)" => "Nowy arkusz (⇧F11)", + "Next sheet" => "Następny arkusz", + "Page Breaks" => "Podziały stron", + "Paper Size" => "Rozmiar papieru", + "Paste (⌘V)" => "Wklej (⌘V)", + "Pick From Drop-down List…" => "Wybierz z listy rozwijanej…", + "Pie or Doughnut" => "Kołowy lub pierścieniowy", + "Previous sheet" => "Poprzedni arkusz", + "Print Area" => "Obszar wydruku", + "Print Titles" => "Tytuły wydruku", + "Protect Workbook structure" => "Chroń strukturę skoroszytu", + "Redo (⌘Y)" => "Ponów (⌘Y)", + "Save (⌘S)" => "Zapisz (⌘S)", + "Scatter or Bubble" => "Punktowy lub bąbelkowy", + "Search and run any command" => "Wyszukaj i uruchom dowolne polecenie", + "Search commands (⌘⇧Space)" => "Wyszukaj polecenia (⌘⇧Spacja)", + "Select and move ink and shapes" => "Zaznaczaj i przesuwaj pismo odręczne oraz kształty", + "Series…" => "Seria danych…", + "Share: export or save a copy" => "Udostępnij: eksportuj lub zapisz kopię", + "Show Formulas (⌃`)" => "Pokaż formuły (⌃`)", + "Slicer" => "Fragmentator", + "Sort & Filter" => "Sortuj i filtruj", + "Spelling (F7)" => "Pisownia (F7)", + "Statistic" => "Statystyczne", + "Switch Row/Column" => "Przełącz wiersz/kolumnę", + "Table (⌘T)" => "Tabela (⌘T)", + "Table Styles" => "Style tabeli", + "Text to Columns" => "Tekst jako kolumny", + "The output range already holds data. Replace it with the report?" => "Zakres wyjściowy zawiera już dane. Zastąpić je raportem?", + "Top Align" => "Wyrównaj do góry", + "Undo (⌘Z)" => "Cofnij (⌘Z)", + "Undo list" => "Lista cofania", + "Unhide Sheet…" => "Odkryj arkusz…", + "Up" => "W górę", + "Version, contributors and the AI models that helped" => "Wersja, współtwórcy i modele AI, które pomogły", + "What-If Analysis" => "Analiza warunkowa", + "Zoom In" => "Powiększ", + "Zoom Out" => "Pomniejsz", + "Zoom to 100%" => "Powiększenie 100%", + "Zoom to Selection" => "Powiększ do zaznaczenia", + "Zoom…" => "Powiększenie…", + "£ English (United Kingdom)" => "£ Angielski (Wielka Brytania)", + "¥ Japanese" => "¥ Japoński", + "€ Euro" => "€ Euro", + "Tab|Insert" => "Wstawianie", + "AutoSave" => "Autozapis", + "Insert\nSlicer" => "Wstaw\nfragmentator", + "Pen\nBlack" => "Pióro\nczarne", + "Pen\nBlue" => "Pióro\nniebieskie", + "Pen\nRed" => "Pióro\nczerwone", + "Protect\nSheet" => "Chroń\narkusz", + "Watch\nWindow" => "Okno\nczujki", + "Workbook\nStatistics" => "Statystyki\nskoroszytu", + "PivotTable Fields" => "Pola tabeli przestawnej", + "Choose fields to add to report:" => "Wybierz pola, które chcesz dodać do raportu:", + "Use a field's menu to move it between areas:" => "Przenoś pole między obszarami za pomocą jego menu:", + "Filters" => "Filtry", + "Values" => "Wartości", + "Move to Row Labels" => "Przenieś do etykiet wierszy", + "Move to Column Labels" => "Przenieś do etykiet kolumn", + "Move to Report Filter" => "Przenieś do filtru raportu", + "Move to Values" => "Przenieś do wartości", + "Summarize by Sum" => "Podsumuj według: Suma", + "Summarize by Count" => "Podsumuj według: Licznik", + "Summarize by Average" => "Podsumuj według: Średnia", + "Summarize by Max" => "Podsumuj według: Maksimum", + "Summarize by Min" => "Podsumuj według: Minimum", + "Show as No Calculation" => "Pokaż jako: Bez obliczeń", + "Show as % of Grand Total" => "Pokaż jako: % sumy końcowej", + "Show as Running Total" => "Pokaż jako: Suma bieżąca", + "Show as Rank" => "Pokaż jako: Pozycja", + "Group by Years" => "Grupuj według lat", + "Group by Quarters" => "Grupuj według kwartałów", + "Group by Months" => "Grupuj według miesięcy", + "Remove Field" => "Usuń pole", + "Refresh" => "Odśwież", + "Calculated Field…" => "Pole obliczeniowe…", + "Report Layout" => "Układ raportu", + "Compact" => "Kompaktowy", + "Tabular" => "Tabelaryczny", + _ => return None, + }) +} From 694809d6c5f3008c07d4c19f9dc9a247a3332f88 Mon Sep 17 00:00:00 2001 From: mbielski1337 Date: Tue, 13 Oct 2026 17:02:21 +0200 Subject: [PATCH 02/33] i18n: register Polish (pl) language --- crates/ui-egui/src/i18n.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 061698df9..a2a41e309 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 pl; mod pt; mod ru; mod sr; @@ -35,10 +36,12 @@ pub enum Language { Cs, Fr, Sr, + Pl, } 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::Pl]; /// 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::Pl => "Polski", } } @@ -71,6 +75,7 @@ impl Language { Self::Cs => "cs", Self::Fr => "fr", Self::Sr => "sr", + Self::Pl => "pl", } } @@ -91,6 +96,7 @@ impl Language { "cs" => Some(Self::Cs), "fr" => Some(Self::Fr), "sr" => Some(Self::Sr), + "pl" => Some(Self::Pl), _ => None, } } @@ -129,6 +135,7 @@ impl Language { Self::Cs => cs::translate(text), Self::Fr => fr::translate(text), Self::Sr => sr::translate(text), + Self::Pl => pl::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!(pl::translate(english).is_some_and(|text| !text.is_empty()), "missing Polish: {english}"); } assert_eq!(Language::Ja.tr("Data"), "データ"); assert_eq!(Language::Zh.tr("Data"), "数据"); @@ -644,6 +652,9 @@ 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::Pl.tr("Data"), "Dane"); + assert_eq!(Language::Pl.tr("Sheet1!A1"), "Sheet1!A1"); + assert_eq!(Language::Pl.tr("Page Layout|Orientation"), "Orientacja"); assert_eq!(Language::parse("xx"), None); } @@ -685,6 +696,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("pl-PL"), Some(Language::Pl)); + assert_eq!(Language::from_tag("pl_PL.UTF-8"), Some(Language::Pl)); + assert_eq!(Language::parse("pl"), Some(Language::Pl)); } #[test] From efd081acc0b889a9a376f6e1149f15fa11bb76bd Mon Sep 17 00:00:00 2001 From: Harrison Booth Date: Wed, 14 Oct 2026 07:47:42 -0500 Subject: [PATCH 03/33] UI parity: form dialogs open ready to type Column Width, Row Height and the other form dialogs now open with the cursor in their first field and its value selected, as in Excel: Alt+H, O, W, then 12 and Enter sets the width without clicking into the field first. - The first text or number field takes focus once it can (a new window's first frame is a sizing pass that ignores focus requests), and its value is selected so typing replaces it. - Number fields commit while typing, so Enter or OK in the same frame no longer confirms the old value. Tests: tests/dialog_focus.rs (Column Width and Row Height: type, Enter, value applied). Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/dialogs.rs | 34 +++++++++++++++- crates/ui-egui/tests/dialog_focus.rs | 61 ++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 crates/ui-egui/tests/dialog_focus.rs diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index fb899c702..1fc373bb8 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -36,6 +36,9 @@ pub struct Dialog { pub result: Option, /// "Show password" is ticked: password fields show their text. pub show_password: bool, + /// The first text or number field still has to take keyboard focus (set when a form opens, + /// used once): like Excel, Column Width opens ready to type, its value selected. + focus_first_field: bool, picture_inbox: Option, picture_target: Option<(u64, usize)>, /// The dialog this one was opened from (Name Manager › New…): it comes back when this closes. @@ -70,6 +73,7 @@ impl Dialog { list_index: 0, result: None, show_password: false, + focus_first_field: true, picture_inbox: None, picture_target: None, back: None, @@ -88,6 +92,7 @@ impl Dialog { list_index: 0, result: None, show_password: false, + focus_first_field: false, picture_inbox: None, picture_target: None, back: None, @@ -1387,6 +1392,28 @@ fn form(ui: &mut egui::Ui, d: &mut Dialog, confirm: &mut bool, open: &mut bool) ok_cancel(ui, confirm, open); } +/// Gives keyboard focus to the first text or number field the first time a form is drawn. A +/// focused number field is in typing mode with its value selected, so Alt+H, O, W then 12 and +/// Enter sets the width, as in Excel. +/// Keeps asking until the field really has focus: a new window's first frame is an invisible +/// sizing pass where a focus request is ignored. +fn take_first_focus(d: &mut Dialog, r: &egui::Response) { + if !d.focus_first_field { + return; + } + if !r.has_focus() { + r.request_focus(); + return; + } + // Focus has landed, and the field is now a text box: select its whole value so typing + // replaces it (the field's own select-on-focus fired before it was a text box). + let mut state = egui::text_edit::TextEditState::load(&r.ctx, r.id).unwrap_or_default(); + let all = egui::text::CCursorRange::two(egui::text::CCursor::new(0), egui::text::CCursor::new(usize::MAX / 2)); + state.cursor.set_char_range(Some(all)); + state.store(&r.ctx, r.id); + d.focus_first_field = false; +} + /// Draws a dialog's `fields`, editing its values. fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { egui::Grid::new("form").num_columns(1).spacing(vec2(8.0, 6.0)).show(ui, |ui| { @@ -1406,6 +1433,7 @@ fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { } else { ui.add(egui::TextEdit::singleline(&mut s).desired_width(320.0)) }; + take_first_focus(d, &r); if r.changed() { d.values.insert(key.into(), json!(s)); } @@ -1426,7 +1454,11 @@ fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { ui.horizontal(|ui| { ui.label(label); let mut n = d.values.get(key).and_then(Json::as_f64).unwrap_or(0.0); - if ui.add(egui::DragValue::new(&mut n).speed(0.5)).changed() { + // Typed values count straight away: otherwise Enter or OK in the same frame + // confirms the old value, because a number field only commits when it loses focus. + let r = ui.add(egui::DragValue::new(&mut n).speed(0.5).update_while_editing(true)); + take_first_focus(d, &r); + if r.changed() { d.values.insert(key.into(), json!(n)); } }); diff --git a/crates/ui-egui/tests/dialog_focus.rs b/crates/ui-egui/tests/dialog_focus.rs new file mode 100644 index 000000000..2dd047554 --- /dev/null +++ b/crates/ui-egui/tests/dialog_focus.rs @@ -0,0 +1,61 @@ +//! Form dialogs open ready to type, as in Excel: Alt+H, O, W then a number and Enter sets the +//! column width without clicking into the field first. + +use egui::{Event, Key, vec2}; +use gridcraft_engine::Session; +use gridcraft_engine::core::CellRef; +use gridcraft_ui_egui::SheetApp; +use serde_json::json; + +fn harness() -> egui_kittest::Harness<'static, SheetApp> { + let mut session = Session::new(); + session.new_workbook(); + session.execute("selection.set", json!({"cell": "C3"})).unwrap(); + let mut h = egui_kittest::Harness::builder().with_size(vec2(1200.0, 800.0)).build_ui_state( + |ui, app: &mut SheetApp| { + app.logic(&ui.ctx().clone()); + app.ui(ui); + }, + SheetApp::new(session, Default::default()), + ); + h.run_steps(6); + h +} + +fn type_and_enter(h: &mut egui_kittest::Harness<'static, SheetApp>, text: &str) { + for c in text.chars() { + h.input_mut().events.push(Event::Text(c.to_string())); + h.run_steps(1); + } + h.key_press(Key::Enter); + h.run_steps(6); +} + +#[test] +fn column_width_opens_with_the_width_ready_to_type() { + let mut h = harness(); + h.state_mut().open_dialog("columnWidth", json!({})); + h.run_steps(6); + type_and_enter(&mut h, "12"); + assert!(h.state().dialog.is_none(), "Enter confirmed the dialog"); + let chars = { + let d = h.state().session.active().unwrap(); + let sheet = d.wb.active().unwrap(); + gridcraft_engine::cmd::format::points_to_chars(sheet.col_width(CellRef::parse("C3").unwrap().col) as f64) + }; + assert!((chars - 12.0).abs() < 0.2, "column C is 12 characters wide, got {chars}"); +} + +#[test] +fn row_height_opens_with_the_height_ready_to_type() { + let mut h = harness(); + h.state_mut().open_dialog("rowHeight", json!({})); + h.run_steps(6); + type_and_enter(&mut h, "40"); + assert!(h.state().dialog.is_none(), "Enter confirmed the dialog"); + let height = { + let d = h.state().session.active().unwrap(); + d.wb.active().unwrap().row_height(CellRef::parse("C3").unwrap().row) + }; + assert!((height as f64 - 40.0).abs() < 0.6, "row 3 is 40 high, got {height}"); +} From 4bfd0bc5a108c37e60e6a67f06bd8377973a70bc Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 15 Oct 2026 03:23:16 +0200 Subject: [PATCH 04/33] Improve Command Palette keyboard navigation and layout --- crates/ui-egui/src/dialogs.rs | 67 ++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index fb899c702..b4e12817f 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -40,6 +40,7 @@ pub struct Dialog { picture_target: Option<(u64, usize)>, /// The dialog this one was opened from (Name Manager › New…): it comes back when this closes. back: Option>, + focus_initialized: bool, } impl Dialog { @@ -73,6 +74,7 @@ impl Dialog { picture_inbox: None, picture_target: None, back: None, + focus_initialized: false, } } @@ -91,6 +93,7 @@ impl Dialog { picture_inbox: None, picture_target: None, back: None, + focus_initialized: false, } } @@ -2239,8 +2242,24 @@ fn manage_rules(app: &mut SheetApp, ui: &mut egui::Ui) { } fn command_search(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confirm: &mut bool) { - let r = ui.add(egui::TextEdit::singleline(&mut d.search).desired_width(480.0).hint_text("Type a command, e.g. freeze, chart, bold…")); - r.request_focus(); + let (down, up, home, end, pgup, pgdn) = ui.input_mut(|i| { + ( + i.count_and_consume_key(egui::Modifiers::NONE, Key::ArrowDown), + i.count_and_consume_key(egui::Modifiers::NONE, Key::ArrowUp), + i.consume_key(egui::Modifiers::CTRL, Key::Home), + i.consume_key(egui::Modifiers::CTRL, Key::End), + i.consume_key(egui::Modifiers::NONE, Key::PageUp), + i.consume_key(egui::Modifiers::NONE, Key::PageDown), + ) + }); + let width = ui.available_width(); + let r = ui.add(egui::TextEdit::singleline(&mut d.search).desired_width(width).hint_text("Type a command, e.g. freeze, chart, bold…")); + + if !d.focus_initialized { + r.request_focus(); + d.focus_initialized = true; + } + let q = d.search.to_ascii_lowercase(); let cmds: Vec<(String, String, String)> = app .session @@ -2251,19 +2270,51 @@ fn command_search(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confirm .map(|c| (c.id.to_string(), c.label.to_string(), c.menu.join(" › "))) .take(40) .collect(); - if ui.input(|i| i.key_pressed(Key::ArrowDown)) { - d.list_index = (d.list_index + 1).min(cmds.len().saturating_sub(1)); + + let last = cmds.len().saturating_sub(1); + // let page_size = 10; + + let row_h = ui.spacing().interact_size.y.max(20.0); + let row_step = row_h + ui.spacing().item_spacing.y; + + const LIST_HEIGHT: f32 = 320.0; + + let page_size = ((LIST_HEIGHT / row_step).floor() as usize).saturating_sub(1).max(1); + + if down > 0 { + d.list_index = d.list_index.saturating_add(down).min(last); } - if ui.input(|i| i.key_pressed(Key::ArrowUp)) { - d.list_index = d.list_index.saturating_sub(1); + if up > 0 { + d.list_index = d.list_index.saturating_sub(up); } - egui::ScrollArea::vertical().max_height(320.0).show(ui, |ui| { + if pgdn { + d.list_index = (d.list_index + page_size).min(last); + } + if pgup { + d.list_index = d.list_index.saturating_sub(page_size); + } + if home { + d.list_index = 0; + } + if end { + d.list_index = last; + } + + d.list_index = d.list_index.min(last); + + egui::ScrollArea::vertical().max_height(LIST_HEIGHT).auto_shrink([true, false]).show(ui, |ui| { for (i, (id, label, menu)) in cmds.iter().enumerate() { - let r = ui.add(egui::Button::selectable(i == d.list_index, format!("{label} {menu}")).min_size(vec2(480.0, 20.0))); + let r = ui.add(egui::Button::selectable(i == d.list_index, format!("{label} {menu}")).min_size(vec2(width, 20.0))); + + if (down > 0 || up > 0 || home || end || pgup || pgdn) && i == d.list_index && !ui.clip_rect().contains_rect(r.rect) { + r.scroll_to_me(Some(if down > 0 || end || pgdn { egui::Align::Max } else { egui::Align::Min })); + } + if r.clicked() { d.list_index = i; *confirm = true; } + r.on_hover_text(id); } }); From f065f9168a68849c2341a0feea5ada2e5dcd6eef Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 15 Oct 2026 05:18:08 +0200 Subject: [PATCH 05/33] Clean up Command Palette code --- crates/ui-egui/src/dialogs.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index b4e12817f..0d9d02f2e 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -2244,8 +2244,8 @@ fn manage_rules(app: &mut SheetApp, ui: &mut egui::Ui) { fn command_search(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confirm: &mut bool) { let (down, up, home, end, pgup, pgdn) = ui.input_mut(|i| { ( - i.count_and_consume_key(egui::Modifiers::NONE, Key::ArrowDown), - i.count_and_consume_key(egui::Modifiers::NONE, Key::ArrowUp), + i.consume_key(egui::Modifiers::NONE, Key::ArrowDown), + i.consume_key(egui::Modifiers::NONE, Key::ArrowUp), i.consume_key(egui::Modifiers::CTRL, Key::Home), i.consume_key(egui::Modifiers::CTRL, Key::End), i.consume_key(egui::Modifiers::NONE, Key::PageUp), @@ -2272,7 +2272,6 @@ fn command_search(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confirm .collect(); let last = cmds.len().saturating_sub(1); - // let page_size = 10; let row_h = ui.spacing().interact_size.y.max(20.0); let row_step = row_h + ui.spacing().item_spacing.y; @@ -2281,11 +2280,11 @@ fn command_search(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confirm let page_size = ((LIST_HEIGHT / row_step).floor() as usize).saturating_sub(1).max(1); - if down > 0 { - d.list_index = d.list_index.saturating_add(down).min(last); + if down { + d.list_index = (d.list_index + 1).min(last); } - if up > 0 { - d.list_index = d.list_index.saturating_sub(up); + if up { + d.list_index = d.list_index.saturating_sub(1); } if pgdn { d.list_index = (d.list_index + page_size).min(last); @@ -2303,11 +2302,12 @@ fn command_search(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confirm d.list_index = d.list_index.min(last); egui::ScrollArea::vertical().max_height(LIST_HEIGHT).auto_shrink([true, false]).show(ui, |ui| { + let scroll_area_width = ui.available_width(); for (i, (id, label, menu)) in cmds.iter().enumerate() { - let r = ui.add(egui::Button::selectable(i == d.list_index, format!("{label} {menu}")).min_size(vec2(width, 20.0))); + let r = ui.add(egui::Button::selectable(i == d.list_index, format!("{label} {menu}")).min_size(vec2(scroll_area_width, 20.0))); - if (down > 0 || up > 0 || home || end || pgup || pgdn) && i == d.list_index && !ui.clip_rect().contains_rect(r.rect) { - r.scroll_to_me(Some(if down > 0 || end || pgdn { egui::Align::Max } else { egui::Align::Min })); + if (down || up || home || end || pgup || pgdn) && i == d.list_index && !ui.clip_rect().contains_rect(r.rect) { + r.scroll_to_me(Some(if down || end || pgdn { egui::Align::Max } else { egui::Align::Min })); } if r.clicked() { From 4d68300bc2d43c3179df2e7ee87d6d178c1111f7 Mon Sep 17 00:00:00 2001 From: Camthalion77 <2944375+Camthalion77@users.noreply.github.com> Date: Thu, 15 Oct 2026 08:31:40 +0300 Subject: [PATCH 06/33] Add Greek (el) localization --- crates/ui-egui/src/i18n.rs | 17 +- crates/ui-egui/src/i18n/el.rs | 989 ++++++++++++++++++++++++++++++++++ docs/localization-el.md | 17 + 3 files changed, 1022 insertions(+), 1 deletion(-) create mode 100644 crates/ui-egui/src/i18n/el.rs create mode 100644 docs/localization-el.md diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 061698df9..16de0bf45 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -11,6 +11,7 @@ use serde::{Deserialize, Serialize}; mod cs; mod de; +mod el; mod es; mod fr; mod ko; @@ -25,6 +26,7 @@ pub enum Language { #[default] En, Es, + El, Zh, Ja, Ko, @@ -38,13 +40,15 @@ pub enum Language { } 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::El, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr]; /// The language's own name, shown in the switcher. pub fn name(self) -> &'static str { match self { Self::En => "English", Self::Es => "Español", + Self::El => "Ελληνικά", Self::Zh => "简体中文", Self::Ja => "日本語", Self::Ko => "한국어", @@ -62,6 +66,7 @@ impl Language { match self { Self::En => "en", Self::Es => "es", + Self::El => "el", Self::Zh => "zh", Self::Ja => "ja", Self::Ko => "ko", @@ -82,6 +87,7 @@ impl Language { match tag.trim().split(['-', '_']).next()?.to_ascii_lowercase().as_str() { "en" => Some(Self::En), "es" => Some(Self::Es), + "el" => Some(Self::El), "zh" => Some(Self::Zh), "ja" => Some(Self::Ja), "ko" => Some(Self::Ko), @@ -120,6 +126,7 @@ impl Language { let translated = match self { Self::En => None, Self::Es => es::translate(text), + Self::El => el::translate(text), Self::Ja => JAPANESE.iter().find(|(english, _)| *english == text).map(|(_, translated)| *translated), Self::Zh => zh::translate(text), Self::Ko => ko::translate(text), @@ -607,6 +614,7 @@ mod tests { assert!(ru::translate(english).is_some_and(|text| !text.is_empty()), "missing Russian: {english}"); assert!(pt::translate(english).is_some_and(|text| !text.is_empty()), "missing Portuguese: {english}"); assert!(es::translate(english).is_some_and(|text| !text.is_empty()), "missing Spanish: {english}"); + assert!(el::translate(english).is_some_and(|text| !text.is_empty()), "missing Greek: {english}"); assert!(de::translate(english).is_some_and(|text| !text.is_empty()), "missing German: {english}"); 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}"); @@ -618,6 +626,10 @@ mod tests { assert_eq!(Language::Ru.tr("Data"), "Данные"); assert_eq!(Language::PtBr.tr("Data"), "Dados"); assert_eq!(Language::Es.tr("Data"), "Datos"); + assert_eq!(Language::El.tr("Data"), "Δεδομένα"); + assert_eq!(Language::El.tr("Page Layout|Orientation"), "Προσανατολισμός σελίδας"); + assert_eq!(Language::El.tr("Sheet1!A1"), "Sheet1!A1"); + assert_eq!(Language::El.tr("Page {page} of {pages}"), "Σελίδα {page} από {pages}"); assert_eq!(Language::Es.tr("Freeze Panes"), "Inmovilizar paneles"); assert_eq!(Language::Es.tr("Sheet1!A1"), "Sheet1!A1"); assert_eq!(Language::De.tr("Data"), "Daten"); @@ -667,6 +679,9 @@ mod tests { assert_eq!(Language::from_tag("ja-JP"), Some(Language::Ja)); assert_eq!(Language::from_tag("en_US"), Some(Language::En)); assert_eq!(Language::from_tag("es_MX"), Some(Language::Es)); + assert_eq!(Language::from_tag("el-GR"), Some(Language::El)); + assert_eq!(Language::from_tag("el_GR.UTF-8"), Some(Language::El)); + assert_eq!(Language::parse("el"), Some(Language::El)); assert_eq!(Language::from_tag("zh-Hans-CN"), Some(Language::Zh)); assert_eq!(Language::from_tag("ko-KR"), Some(Language::Ko)); assert_eq!(Language::from_tag("RU_ru"), Some(Language::Ru)); diff --git a/crates/ui-egui/src/i18n/el.rs b/crates/ui-egui/src/i18n/el.rs new file mode 100644 index 000000000..b87e9c0f0 --- /dev/null +++ b/crates/ui-egui/src/i18n/el.rs @@ -0,0 +1,989 @@ +//! Greek (el) interface localization for GridCraft. +//! Command ids, cell references and formula identifiers are not translated. +//! Source labels are kept verbatim and unmatched labels fall back to English. + +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Επικόλληση", + "Paste Values" => "Επικόλληση τιμών", + "Paste Formulas" => "Επικόλληση τύπων", + "Paste Formatting" => "Επικόλληση μορφοποίησης", + "Transpose" => "Αντιμετάθεση", + "Paste Link" => "Επικόλληση σύνδεσης", + "Paste Special…" => "Ειδική επικόλληση…", + "Cut (⌘X)" => "Αποκοπή (⌘X)", + "Copy (⌘C)" => "Αντιγραφή (⌘C)", + "Format Painter (double-click to keep it on)" => "Αντιγραφή μορφοποίησης (διπλό κλικ για συνεχή χρήση)", + "Bold (⌘B)" => "Έντονη γραφή (⌘B)", + "Italic (⌘I)" => "Πλάγια γραφή (⌘I)", + "Underline (⌘U)" => "Υπογράμμιση (⌘U)", + "Double Underline" => "Διπλή υπογράμμιση", + "Strikethrough" => "Διαγραφή με γραμμή", + "Underline" => "Υπογράμμιση", + "Increase Font Size" => "Αύξηση μεγέθους γραμματοσειράς", + "Decrease Font Size" => "Μείωση μεγέθους γραμματοσειράς", + "Wrap Text" => "Αναδίπλωση κειμένου", + "Merge & Center" => "Συγχώνευση και στοίχιση στο κέντρο", + "Merge Cells" => "Συγχώνευση κελιών", + "Merge Across" => "Συγχώνευση κατά γραμμή", + "Unmerge Cells" => "Κατάργηση συγχώνευσης κελιών", + "Fill Color" => "Χρώμα γεμίσματος", + "Font Color" => "Χρώμα γραμματοσειράς", + "Borders" => "Περιγράμματα", + "Top\nAlign" => "Στοίχιση\nεπάνω", + "Middle\nAlign" => "Στοίχιση\nστο μέσο", + "Bottom\nAlign" => "Στοίχιση\nκάτω", + "Left" => "Αριστερά", + "Right" => "Δεξιά", + "Center" => "Στο κέντρο", + "Horizontal" => "Οριζόντια", + "Vertical Text" => "Κατακόρυφο κείμενο", + "Decrease Indent" => "Μείωση εσοχής", + "Increase Indent" => "Αύξηση εσοχής", + "Orientation" => "Προσανατολισμός κειμένου", + "Angle Counterclockwise" => "Περιστροφή αριστερόστροφα", + "Angle Clockwise" => "Περιστροφή δεξιόστροφα", + "Rotate Text Up" => "Περιστροφή κειμένου προς τα πάνω", + "Rotate Text Down" => "Περιστροφή κειμένου προς τα κάτω", + "Accounting Number Format" => "Λογιστική μορφή αριθμών", + "Percent Style" => "Μορφή ποσοστού", + "Comma Style" => "Διαχωριστικό χιλιάδων", + "Increase Decimal" => "Αύξηση δεκαδικών ψηφίων", + "Decrease Decimal" => "Μείωση δεκαδικών ψηφίων", + "More Accounting Formats…" => "Περισσότερες λογιστικές μορφές…", + "Conditional\nFormatting" => "Μορφοποίηση\nυπό όρους", + "Conditional Formatting" => "Μορφοποίηση υπό όρους", + "Format\nas Table" => "Μορφοποίηση\nως πίνακας", + "Cell\nStyles" => "Στυλ\nκελιών", + "Format Cells…" => "Μορφοποίηση κελιών…", + "Format Cell Alignment…" => "Στοίχιση κελιών…", + "Format\nPane" => "Παράθυρο\nμορφοποίησης", + "Format" => "Μορφοποίηση", + "Insert" => "Εισαγωγή", + "Insert Cells…" => "Εισαγωγή κελιών…", + "Delete" => "Διαγραφή", + "Delete Cells…" => "Διαγραφή κελιών…", + "Insert Sheet Rows" => "Εισαγωγή γραμμών φύλλου", + "Insert Sheet Columns" => "Εισαγωγή στηλών φύλλου", + "Delete Sheet Rows" => "Διαγραφή γραμμών φύλλου", + "Delete Sheet Columns" => "Διαγραφή στηλών φύλλου", + "Row Height…" => "Ύψος γραμμής…", + "AutoFit Row Height" => "Αυτόματη προσαρμογή ύψους γραμμής", + "Column Width…" => "Πλάτος στήλης…", + "AutoFit Column Width" => "Αυτόματη προσαρμογή πλάτους στήλης", + "Default Width…" => "Προεπιλεγμένο πλάτος…", + "Hide Rows" => "Απόκρυψη γραμμών", + "Unhide Rows" => "Εμφάνιση γραμμών", + "Hide Columns" => "Απόκρυψη στηλών", + "Unhide Columns" => "Εμφάνιση στηλών", + "Lock Cell" => "Κλείδωμα κελιού", + "Clear" => "Απαλοιφή", + "Clear All" => "Απαλοιφή όλων", + "Clear Formats" => "Απαλοιφή μορφοποίησης", + "Clear Contents" => "Απαλοιφή περιεχομένων", + "Clear Comments and Notes" => "Απαλοιφή σχολίων και σημειώσεων", + "Clear Hyperlinks" => "Απαλοιφή υπερσυνδέσμων", + "AutoSum" => "Αυτόματο άθροισμα", + "AutoSum (⌘⇧T)" => "Αυτόματο άθροισμα (⌘⇧T)", + "Flash\nFill" => "Γρήγορη\nσυμπλήρωση", + "Flash Fill" => "Γρήγορη συμπλήρωση", + "Fill" => "Συμπλήρωση", + "Clear Print Area" => "Κατάργηση περιοχής εκτύπωσης", + "Find &\nSelect" => "Εύρεση και\nεπιλογή", + "Find…" => "Εύρεση…", + "Replace…" => "Αντικατάσταση…", + "Go To…" => "Μετάβαση…", + "Go To Special…" => "Ειδική μετάβαση…", + "PivotTable" => "Συγκεντρωτικός πίνακας", + "Recommended\nCharts" => "Προτεινόμενα\nγραφήματα", + "Table" => "Πίνακας", + "Pictures" => "Εικόνες", + "Shapes" => "Σχήματα", + "Icons" => "Εικονίδια", + "Text\nBox" => "Πλαίσιο\nκειμένου", + "Comment" => "Σχόλιο", + "New\nComment" => "Νέο\nσχόλιο", + "New Note" => "Νέα σημείωση", + "Show/Hide Note" => "Εμφάνιση/απόκρυψη σημείωσης", + "Header &\nFooter" => "Κεφαλίδα και\nυποσέλιδο", + "Text to\nColumns" => "Κείμενο σε\nστήλες", + "Link" => "Σύνδεση", + "Symbol" => "Σύμβολο", + "Sparklines" => "Μικρογραφήματα", + "Header & Footer" => "Κεφαλίδα και υποσέλιδο", + "Draw with ink" => "Σχεδίαση με μελάνι", + "Eraser" => "Γόμα", + "Ink to\nShape" => "Μελάνι σε\nσχήμα", + "Select\nObjects" => "Επιλογή\nαντικειμένων", + "Themes" => "Θέματα", + "Margins" => "Περιθώρια", + "Left Margin" => "Αριστερό περιθώριο", + "Right Margin" => "Δεξιό περιθώριο", + "Top Margin" => "Επάνω περιθώριο", + "Bottom Margin" => "Κάτω περιθώριο", + "Header Margin" => "Περιθώριο κεφαλίδας", + "Footer Margin" => "Περιθώριο υποσέλιδου", + "Size" => "Μέγεθος", + "Print\nArea" => "Περιοχή\nεκτύπωσης", + "Set Print Area" => "Ορισμός περιοχής εκτύπωσης", + "Breaks" => "Αλλαγές σελίδας", + "Insert Page Break" => "Εισαγωγή αλλαγής σελίδας", + "Remove Page Break" => "Κατάργηση αλλαγής σελίδας", + "Reset All Page Breaks" => "Κατάργηση όλων των αλλαγών σελίδας", + "Print\nTitles" => "Τίτλοι\nεκτύπωσης", + "Narrow" => "Στενά", + "Wide" => "Πλατιά", + "Normal" => "Κανονικό", + "Portrait" => "Κατακόρυφος", + "Landscape" => "Οριζόντιος", + "Custom Margins…" => "Προσαρμοσμένα περιθώρια…", + "Insert\nFunction" => "Εισαγωγή\nσυνάρτησης", + "Name\nManager" => "Διαχείριση\nονομάτων", + "Define Name" => "Ορισμός ονόματος", + "Use in Formula" => "Χρήση σε τύπο", + "Create from Selection" => "Δημιουργία από επιλογή", + "Trace Precedents" => "Εντοπισμός κελιών προέλευσης", + "Trace Dependents" => "Εντοπισμός εξαρτώμενων κελιών", + "Remove Arrows" => "Κατάργηση βελών", + "Show Formulas" => "Εμφάνιση τύπων", + "Error Checking" => "Έλεγχος σφαλμάτων", + "Evaluate Formula" => "Αξιολόγηση τύπου", + "Watch Window" => "Παράθυρο παρακολούθησης", + "Calculation\nOptions" => "Επιλογές\nυπολογισμού", + "Calculate Now" => "Υπολογισμός τώρα", + "Calculate Sheet" => "Υπολογισμός φύλλου", + "Automatic" => "Αυτόματα", + "Automatic Except for Data Tables" => "Αυτόματα, εκτός από τους πίνακες δεδομένων", + "Manual" => "Χειροκίνητα", + "Sort &\nFilter" => "Ταξινόμηση και\nφίλτρο", + "Sort" => "Ταξινόμηση", + "Sort A to Z" => "Ταξινόμηση από Α προς Ω", + "Sort Z to A" => "Ταξινόμηση από Ω προς Α", + "Custom Sort…" => "Προσαρμοσμένη ταξινόμηση…", + "Filter" => "Φίλτρο", + "Reapply" => "Επανάληψη εφαρμογής", + "Get Data\n(Text/CSV)" => "Λήψη δεδομένων\n(κείμενο/CSV)", + "Remove\nDuplicates" => "Κατάργηση\nδιπλοτύπων", + "Data\nValidation" => "Επικύρωση\nδεδομένων", + "Data Validation" => "Επικύρωση δεδομένων", + "Data Validation…" => "Επικύρωση δεδομένων…", + "Circle Invalid Data" => "Κύκλωση μη έγκυρων δεδομένων", + "Clear Validation" => "Κατάργηση επικύρωσης", + "Group" => "Ομαδοποίηση", + "Ungroup" => "Κατάργηση ομαδοποίησης", + "Show Detail" => "Εμφάνιση λεπτομερειών", + "Hide Detail" => "Απόκρυψη λεπτομερειών", + "Subtotal" => "Μερικό άθροισμα", + "What-If\nAnalysis" => "Ανάλυση\nυποθετικών σεναρίων", + "Data Table…" => "Πίνακας δεδομένων…", + "Scenario Manager…" => "Διαχείριση σεναρίων…", + "Goal Seek…" => "Αναζήτηση στόχου…", + "Spelling" => "Ορθογραφικός έλεγχος", + "Check\nAccessibility" => "Έλεγχος\nπροσβασιμότητας", + "Threaded Comments" => "Σχόλια με νήματα", + "Show\nComments" => "Εμφάνιση\nσχολίων", + "Protect\nWorkbook" => "Προστασία\nβιβλίου εργασίας", + "Unprotect\nSheet" => "Κατάργηση προστασίας\nφύλλου", + "Protect Sheet…" => "Προστασία φύλλου…", + "Comments" => "Σχόλια", + "Notes" => "Σημειώσεις", + "Page Break\nPreview" => "Προεπισκόπηση\nαλλαγών σελίδας", + "Page\nLayout" => "Διάταξη\nσελίδας", + "Formula Bar" => "Γραμμή τύπων", + "Gridlines" => "Γραμμές πλέγματος", + "Headings" => "Επικεφαλίδες", + "Zoom" => "Μεγέθυνση", + "Forecast\nSheet" => "Φύλλο\nπρόβλεψης", + "Add footer" => "Προσθήκη υποσέλιδου", + "Add header" => "Προσθήκη κεφαλίδας", + "Click to add data" => "Κάντε κλικ για εισαγωγή δεδομένων", + "Current Date" => "Τρέχουσα ημερομηνία", + "Current\nDate" => "Τρέχουσα\nημερομηνία", + "Current\nTime" => "Τρέχουσα\nώρα", + "Current Time" => "Τρέχουσα ώρα", + "File Name" => "Όνομα αρχείου", + "File\nName" => "Όνομα\nαρχείου", + "File\nPath" => "Διαδρομή\nαρχείου", + "File Path" => "Διαδρομή αρχείου", + "Footer" => "Υποσέλιδο", + "Different First Page" => "Διαφορετική πρώτη σελίδα", + "Different Odd & Even Pages" => "Διαφορετικές μονές και ζυγές σελίδες", + "Go to Footer" => "Μετάβαση στο υποσέλιδο", + "Go to Header" => "Μετάβαση στην κεφαλίδα", + "Go to\nFooter" => "Μετάβαση στο\nυποσέλιδο", + "Go to\nHeader" => "Μετάβαση στην\nκεφαλίδα", + "Header" => "Κεφαλίδα", + "(none)" => "(κανένα)", + "Number\nof Pages" => "Αριθμός\nσελίδων", + "Number of Pages" => "Αριθμός σελίδων", + "Page\nNumber" => "Αριθμός\nσελίδας", + "Page Number" => "Αριθμός σελίδας", + "Ruler" => "Χάρακας", + "Sheet Name" => "Όνομα φύλλου", + "Sheet\nName" => "Όνομα\nφύλλου", + "Animations" => "Κινήσεις", + "Insert Copied Cells" => "Εισαγωγή αντιγραμμένων κελιών", + "Insert Copied Cells…" => "Εισαγωγή αντιγραμμένων κελιών…", + "Insert Cut Cells" => "Εισαγωγή αποκομμένων κελιών", + "Insert Paste" => "Εισαγωγή με επικόλληση", + "Previous" => "Προηγούμενο", + "Next" => "Επόμενο", + "Previous Comment" => "Προηγούμενο σχόλιο", + "Next Comment" => "Επόμενο σχόλιο", + "Show All Notes" => "Εμφάνιση όλων των σημειώσεων", + "Convert to Comments" => "Μετατροπή σε σχόλια", + "Checkbox" => "Πλαίσιο ελέγχου", + "Insert checkboxes in the selected cells" => "Εισαγωγή πλαισίων ελέγχου στα επιλεγμένα κελιά", + "Sheet\nRight-to-Left" => "Φύλλο από\nδεξιά προς αριστερά", + "Sheet Right-to-Left" => "Φύλλο από δεξιά προς αριστερά", + "Data\nAnalysis" => "Ανάλυση\nδεδομένων", + "Data Analysis" => "Ανάλυση δεδομένων", + "Solver" => "Επίλυση", + "Allow Edit\nRanges" => "Περιοχές με\nδικαίωμα επεξεργασίας", + "Allow Edit Ranges" => "Να επιτρέπεται η επεξεργασία περιοχών", + "Drag to freeze columns" => "Σύρετε για σταθεροποίηση στηλών", + "Drag to freeze rows" => "Σύρετε για σταθεροποίηση γραμμών", + "Select\nData" => "Επιλογή\nδεδομένων", + "File" => "Αρχείο", + "Back" => "Πίσω", + "New" => "Νέο", + "Open" => "Άνοιγμα", + "Info" => "Πληροφορίες", + "Save" => "Αποθήκευση", + "Save As" => "Αποθήκευση ως", + "Export" => "Εξαγωγή", + "Close" => "Κλείσιμο", + "Options" => "Επιλογές", + "Blank workbook" => "Κενό βιβλίο εργασίας", + "Recent" => "Πρόσφατα", + "No recent workbooks yet." => "Δεν υπάρχουν ακόμη πρόσφατα βιβλία εργασίας.", + "More workbooks" => "Περισσότερα βιβλία εργασίας", + "Modified" => "Τροποποιήθηκε", + "Not available" => "Μη διαθέσιμο", + "Just now" => "Μόλις τώρα", + "Yesterday" => "Χθες", + "{n} min ago" => "Πριν από {n} λεπτά", + "{n} h ago" => "Πριν από {n} ώρες", + "{n} days ago" => "Πριν από {n} ημέρες", + "{n} weeks ago" => "Πριν από {n} εβδομάδες", + "{n} months ago" => "Πριν από {n} μήνες", + "{n} years ago" => "Πριν από {n} χρόνια", + "Browse…" => "Περιήγηση…", + "Not saved yet" => "Δεν έχει αποθηκευτεί ακόμη", + "Location" => "Τοποθεσία", + "Sheets" => "Φύλλα", + "Protect Workbook" => "Προστασία βιβλίου εργασίας", + "Properties" => "Ιδιότητες", + "Title" => "Τίτλος", + "Subject" => "Θέμα", + "Author" => "Συντάκτης", + "Company" => "Εταιρεία", + "Keywords" => "Λέξεις-κλειδιά", + "Description" => "Περιγραφή", + "No workbook is open." => "Δεν υπάρχει ανοιχτό βιβλίο εργασίας.", + "Save as type" => "Τύπος αρχείου", + "Excel Workbook (*.xlsx)" => "Βιβλίο εργασίας Excel (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (οριοθέτηση με κόμματα) (*.csv)", + "Web Page (*.html)" => "Ιστοσελίδα (*.html)", + "PDF (*.pdf)" => "PDF (*.pdf)", + "Download" => "Λήψη", + "Save the workbook under another name or in another folder." => "Αποθηκεύστε το βιβλίο εργασίας με άλλο όνομα ή σε άλλον φάκελο.", + "Print Active Sheets" => "Εκτύπωση ενεργών φύλλων", + "Print Entire Workbook" => "Εκτύπωση ολόκληρου βιβλίου εργασίας", + "Fit Sheet on One Page" => "Προσαρμογή φύλλου σε μία σελίδα", + "Page Setup…" => "Διαμόρφωση σελίδας…", + "Page {page} of {pages}" => "Σελίδα {page} από {pages}", + "Nothing to print." => "Δεν υπάρχει περιεχόμενο για εκτύπωση.", + "Previous page" => "Προηγούμενη σελίδα", + "Next page" => "Επόμενη σελίδα", + "Create PDF" => "Δημιουργία PDF", + "Save the sheet as a PDF document that keeps its page layout." => "Αποθηκεύστε το φύλλο ως PDF διατηρώντας τη διάταξη των σελίδων.", + "Change File Type" => "Αλλαγή τύπου αρχείου", + "CSV (Comma delimited)" => "CSV (οριοθέτηση με κόμματα)", + "Save the active sheet as comma-separated text." => "Αποθηκεύστε το ενεργό φύλλο ως κείμενο με διαχωριστικά κόμματα.", + "Web Page (.html)" => "Ιστοσελίδα (.html)", + "Save the workbook as a web page." => "Αποθηκεύστε το βιβλίο εργασίας ως ιστοσελίδα.", + "Options|General" => "Γενικά", + "Options|Save" => "Αποθήκευση", + "Show formula bar" => "Εμφάνιση γραμμής τύπων", + "Enable AutoComplete for cell values" => "Ενεργοποίηση αυτόματης συμπλήρωσης τιμών κελιών", + "Save .xlsx workbooks automatically after every change" => "Αυτόματη αποθήκευση βιβλίων .xlsx μετά από κάθε αλλαγή", + "Workbook calculation" => "Υπολογισμός βιβλίου εργασίας", + "Enable iterative calculation" => "Ενεργοποίηση επαναληπτικού υπολογισμού", + "Calculation settings are saved with the workbook." => "Οι ρυθμίσεις υπολογισμού αποθηκεύονται στο βιβλίο εργασίας.", + "Interface size" => "Μέγεθος περιβάλλοντος", + "Auto" => "Αυτόματο", + "100%" => "100%", + "Zoom to\nSelection" => "Μεγέθυνση στην\nεπιλογή", + "Freeze\nPanes" => "Σταθεροποίηση\nπαραθύρων", + "Freeze Panes" => "Σταθεροποίηση παραθύρων", + "Freeze Top Row" => "Σταθεροποίηση επάνω γραμμής", + "Freeze First Column" => "Σταθεροποίηση πρώτης στήλης", + "Unfreeze Panes" => "Κατάργηση σταθεροποίησης παραθύρων", + "Dark Mode" => "Σκοτεινή λειτουργία", + "Interface language" => "Γλώσσα περιβάλλοντος", + "Command\nPalette" => "Παλέτα\nεντολών", + "Agent\nControl" => "Έλεγχος\nπρακτόρων", + "Action\nJournal" => "Ιστορικό\nενεργειών", + "About\nGridCraft" => "Πληροφορίες για\nτο GridCraft", + "Share" => "Κοινή χρήση", + "Add Chart\nElement" => "Προσθήκη στοιχείου\nγραφήματος", + "Change\nChart Type" => "Αλλαγή τύπου\nγραφήματος", + "Switch\nRow/Column" => "Εναλλαγή\nγραμμής/στήλης", + "Data Labels: None" => "Ετικέτες δεδομένων: καμία", + "Data Labels: Show" => "Ετικέτες δεδομένων: εμφάνιση", + "Legend: None" => "Υπόμνημα: κανένα", + "Legend: Bottom" => "Υπόμνημα: κάτω", + "Legend: Top" => "Υπόμνημα: επάνω", + "Legend: Right" => "Υπόμνημα: δεξιά", + "Gridlines: None" => "Γραμμές πλέγματος: καμία", + "Gridlines: Show" => "Γραμμές πλέγματος: εμφάνιση", + "Chart\nTitle" => "Τίτλος\nγραφήματος", + "Delete\nChart" => "Διαγραφή\nγραφήματος", + "Convert\nto Range" => "Μετατροπή\nσε περιοχή", + "Table\nStyles" => "Στυλ\nπίνακα", + "Top 10 Items" => "10 υψηλότερες τιμές", + "Top 10%" => "Ανώτερο 10%", + "Bottom 10 Items" => "10 χαμηλότερες τιμές", + "Bottom 10%" => "Κατώτερο 10%", + "Above Average" => "Πάνω από τον μέσο όρο", + "Below Average" => "Κάτω από τον μέσο όρο", + "Clear Rules from Entire Sheet" => "Απαλοιφή κανόνων από ολόκληρο το φύλλο", + "Clear Rules from Selected Cells" => "Απαλοιφή κανόνων από τα επιλεγμένα κελιά", + "Constants" => "Σταθερές", + "Data Bars" => "Ράβδοι δεδομένων", + "Color Scales" => "Κλίμακες χρωμάτων", + "Icon Sets" => "Σύνολα εικονιδίων", + "Home" => "Αρχική", + "Draw" => "Σχεδίαση", + "Page Layout" => "Διάταξη σελίδας", + "Formulas" => "Τύποι", + "Data" => "Δεδομένα", + "Review" => "Αναθεώρηση", + "View" => "Προβολή", + "Automate" => "Αυτοματισμός", + "Table Design" => "Σχεδίαση πίνακα", + "Chart Design" => "Σχεδίαση γραφήματος", + "Ready" => "Έτοιμο", + "Enter" => "Εισαγωγή", + "Edit" => "Επεξεργασία", + "Point" => "Κατάδειξη", + "Calculate" => "Υπολογισμός", + "Select destination and press Enter or choose Paste" => "Επιλέξτε προορισμό και πατήστε Enter ή επιλέξτε Επικόλληση", + "General" => "Γενικά", + "Number" => "Αριθμός", + "Currency" => "Νόμισμα", + "Accounting" => "Λογιστική", + "Date" => "Ημερομηνία", + "Time" => "Ώρα", + "Percentage" => "Ποσοστό", + "Fraction" => "Κλάσμα", + "Scientific" => "Επιστημονική", + "Text" => "Κείμενο", + "Special" => "Ειδική", + "Custom" => "Προσαρμοσμένη", + "Short Date" => "Σύντομη ημερομηνία", + "Long Date" => "Πλήρης ημερομηνία", + "More Number Formats…" => "Περισσότερες μορφές αριθμών…", + "Financial" => "Οικονομικές", + "Logical" => "Λογικές", + "Date &\nTime" => "Ημερομηνία και\nώρα", + "Lookup &\nReference" => "Αναζήτηση και\nαναφορά", + "Math &\nTrig" => "Μαθηματικά και\nτριγωνομετρία", + "More\nFunctions" => "Περισσότερες\nσυναρτήσεις", + "Page Layout|Orientation" => "Προσανατολισμός σελίδας", + "Display theme" => "Θέμα εμφάνισης", + "System" => "Σύστημα", + "Light" => "Φωτεινό", + "Dark" => "Σκοτεινό", + "Sheet Options|View" => "Προβολή", + "Print" => "Εκτύπωση", + "PivotTable Fields" => "Πεδία συγκεντρωτικού πίνακα", + "Choose fields to add to report:" => "Επιλέξτε πεδία για προσθήκη στην αναφορά:", + "Use a field's menu to move it between areas:" => "Χρησιμοποιήστε το μενού ενός πεδίου για να το μετακινήσετε μεταξύ περιοχών:", + "Filters" => "Φίλτρα", + "Columns" => "Στήλες", + "Rows" => "Γραμμές", + "Values" => "Τιμές", + "Move to Row Labels" => "Μετακίνηση στις ετικέτες γραμμών", + "Move to Column Labels" => "Μετακίνηση στις ετικέτες στηλών", + "Move to Report Filter" => "Μετακίνηση στο φίλτρο αναφοράς", + "Move to Values" => "Μετακίνηση στις τιμές", + "Summarize by Sum" => "Σύνοψη με άθροισμα", + "Summarize by Count" => "Σύνοψη με πλήθος", + "Summarize by Average" => "Σύνοψη με μέσο όρο", + "Summarize by Max" => "Σύνοψη με μέγιστο", + "Summarize by Min" => "Σύνοψη με ελάχιστο", + "Show as No Calculation" => "Εμφάνιση χωρίς επιπλέον υπολογισμό", + "Show as % of Grand Total" => "Εμφάνιση ως % του γενικού συνόλου", + "Show as Running Total" => "Εμφάνιση ως αθροιστικό σύνολο", + "Show as Rank" => "Εμφάνιση ως κατάταξη", + "Group by Years" => "Ομαδοποίηση ανά έτη", + "Group by Quarters" => "Ομαδοποίηση ανά τρίμηνα", + "Group by Months" => "Ομαδοποίηση ανά μήνες", + "Remove Field" => "Κατάργηση πεδίου", + "Refresh" => "Ανανέωση", + "Calculated Field…" => "Υπολογιζόμενο πεδίο…", + "Report Layout" => "Διάταξη αναφοράς", + "Compact" => "Συμπαγής", + "Outline" => "Διάρθρωση", + "Tabular" => "Πινακοειδής", + "Cancel" => "Ακύρωση", + "Expand formula bar" => "Ανάπτυξη γραμμής τύπων", + "Insert Function" => "Εισαγωγή συνάρτησης", + "Copy" => "Αντιγραφή", + "Cut" => "Αποκοπή", + "Define Name…" => "Ορισμός ονόματος…", + "Delete…" => "Διαγραφή…", + "Filter by Selected Cell's Value" => "Φιλτράρισμα βάσει της τιμής του επιλεγμένου κελιού", + "Hide" => "Απόκρυψη", + "Insert…" => "Εισαγωγή…", + "Link…" => "Σύνδεση…", + "New Comment" => "Νέο σχόλιο", + "Pick From Drop-down List…" => "Επιλογή από αναπτυσσόμενη λίστα…", + "Unhide" => "Εμφάνιση", + "$ English (United States)" => "$ Αγγλικά (Ηνωμένες Πολιτείες)", + "Add Chart Element" => "Προσθήκη στοιχείου γραφήματος", + "Align Left" => "Στοίχιση αριστερά", + "Align Right" => "Στοίχιση δεξιά", + "Bottom Align" => "Στοίχιση κάτω", + "Calculate Now (F9)" => "Υπολογισμός τώρα (F9)", + "Calculate Sheet (⇧F9)" => "Υπολογισμός φύλλου (⇧F9)", + "Calculation Options" => "Επιλογές υπολογισμού", + "Cell Styles" => "Στυλ κελιών", + "Change Chart Type" => "Αλλαγή τύπου γραφήματος", + "Check Accessibility" => "Έλεγχος προσβασιμότητας", + "Clear Filter" => "Απαλοιφή φίλτρου", + "Column or Bar" => "Στήλες ή ράβδοι", + "Comments pane" => "Παράθυρο σχολίων", + "Convert the last ink stroke to a shape" => "Μετατροπή τελευταίας πινελιάς σε σχήμα", + "Convert to Range" => "Μετατροπή σε περιοχή", + "Custom Sort" => "Προσαρμοσμένη ταξινόμηση", + "Delete Comment" => "Διαγραφή σχολίου", + "Delete Sheet" => "Διαγραφή φύλλου", + "Delete chart" => "Διαγραφή γραφήματος", + "Down" => "Κάτω", + "Edit chart title" => "Επεξεργασία τίτλου γραφήματος", + "Erase ink strokes" => "Σβήσιμο πινελιών", + "Every command run in this session (replayable)" => "Κάθε εντολή που εκτελέστηκε σε αυτή τη συνεδρία (με δυνατότητα επανάληψης)", + "Filter (⌘⇧F)" => "Φίλτρο (⌘⇧F)", + "Find & Select" => "Εύρεση και επιλογή", + "Flash Fill (⌘E)" => "Γρήγορη συμπλήρωση (⌘E)", + "Forecast Sheet" => "Φύλλο πρόβλεψης", + "Format Chart pane" => "Παράθυρο μορφοποίησης γραφήματος", + "Format as Table" => "Μορφοποίηση ως πίνακας", + "Hide Sheet" => "Απόκρυψη φύλλου", + "Hierarchy & more" => "Ιεραρχία και άλλα", + "Highlighter" => "Εργαλείο επισήμανσης", + "How agents drive GridCraft (MCP / control channel)" => "Πώς οι πράκτορες χειρίζονται το GridCraft (MCP / κανάλι ελέγχου)", + "Import a text or CSV file" => "Εισαγωγή αρχείου κειμένου ή CSV", + "Insert\nSlicer" => "Εισαγωγή\nαναλυτή", + "Insert Function (⇧F3)" => "Εισαγωγή συνάρτησης (⇧F3)", + "Insert Link (⌘K)" => "Εισαγωγή σύνδεσης (⌘K)", + "Insert Sheet" => "Εισαγωγή φύλλου", + "Insert Slicer" => "Εισαγωγή αναλυτή", + "Insert a picture" => "Εισαγωγή εικόνας", + "Insert a slicer to filter a table" => "Εισαγωγή αναλυτή για φιλτράρισμα πίνακα", + "Insert an icon" => "Εισαγωγή εικονιδίου", + "Line or Area" => "Γραμμή ή περιοχή", + "Macros" => "Μακροεντολές", + "Macros and scripts in this workbook (Alt+F8)" => "Μακροεντολές και δέσμες ενεργειών αυτού του βιβλίου (Alt+F8)", + "Middle Align" => "Κατακόρυφη στοίχιση στο μέσο", + "More commands" => "Περισσότερες εντολές", + "Move or Copy Sheet…" => "Μετακίνηση ή αντιγραφή φύλλου…", + "Name Manager" => "Διαχείριση ονομάτων", + "Page Breaks" => "Αλλαγές σελίδας", + "Paper Size" => "Μέγεθος χαρτιού", + "Paste (⌘V)" => "Επικόλληση (⌘V)", + "Pen\nBlack" => "Μαύρο\nστυλό", + "Pen\nBlue" => "Μπλε\nστυλό", + "Pen\nRed" => "Κόκκινο\nστυλό", + "Pie or Doughnut" => "Πίτα ή δακτύλιος", + "Print Area" => "Περιοχή εκτύπωσης", + "Print Titles" => "Τίτλοι εκτύπωσης", + "Protect\nSheet" => "Προστασία\nφύλλου", + "Protect Sheet" => "Προστασία φύλλου", + "Protect Workbook structure" => "Προστασία δομής βιβλίου εργασίας", + "Recommended Charts" => "Προτεινόμενα γραφήματα", + "Redo (⌘Y)" => "Επανάληψη (⌘Y)", + "Remove Duplicates" => "Κατάργηση διπλοτύπων", + "Rename Sheet" => "Μετονομασία φύλλου", + "Save (⌘S)" => "Αποθήκευση (⌘S)", + "Scatter or Bubble" => "Διασπορά ή φυσαλίδες", + "Search and run any command" => "Αναζήτηση και εκτέλεση οποιασδήποτε εντολής", + "Search commands (⌘⇧Space)" => "Αναζήτηση εντολών (⌘⇧Space)", + "Select Data" => "Επιλογή δεδομένων", + "Select and move ink and shapes" => "Επιλογή και μετακίνηση μελανιού και σχημάτων", + "Series…" => "Σειρά…", + "Share: export or save a copy" => "Κοινή χρήση: εξαγωγή ή αποθήκευση αντιγράφου", + "Show Formulas (⌃`)" => "Εμφάνιση τύπων (⌃`)", + "Slicer" => "Αναλυτής", + "Sort & Filter" => "Ταξινόμηση και φίλτρο", + "Spelling (F7)" => "Ορθογραφικός έλεγχος (F7)", + "Statistic" => "Στατιστική", + "Switch Row/Column" => "Εναλλαγή γραμμής/στήλης", + "Table (⌘T)" => "Πίνακας (⌘T)", + "Table Styles" => "Στυλ πίνακα", + "Text Box" => "Πλαίσιο κειμένου", + "Text to Columns" => "Κείμενο σε στήλες", + "Top Align" => "Στοίχιση επάνω", + "Undo (⌘Z)" => "Αναίρεση (⌘Z)", + "Undo list" => "Λίστα αναιρέσεων", + "Unhide Sheet…" => "Εμφάνιση φύλλου…", + "Up" => "Πάνω", + "Version, contributors and the AI models that helped" => "Έκδοση, συντελεστές και μοντέλα ΤΝ που συνέβαλαν", + "Watch\nWindow" => "Παράθυρο\nπαρακολούθησης", + "What-If Analysis" => "Ανάλυση υποθετικών σεναρίων", + "Workbook\nStatistics" => "Στατιστικά\nβιβλίου εργασίας", + "Workbook Statistics" => "Στατιστικά βιβλίου εργασίας", + "Zoom to 100%" => "Μεγέθυνση στο 100%", + "Zoom to Selection" => "Μεγέθυνση στην επιλογή", + "Zoom…" => "Μεγέθυνση…", + "£ English (United Kingdom)" => "£ Αγγλικά (Ηνωμένο Βασίλειο)", + "¥ Japanese" => "¥ Ιαπωνικά", + "€ Euro" => "€ Ευρώ", + "New sheet (⇧F11)" => "Νέο φύλλο (⇧F11)", + "Next sheet" => "Επόμενο φύλλο", + "Previous sheet" => "Προηγούμενο φύλλο", + "Zoom In" => "Μεγέθυνση", + "Zoom Out" => "Σμίκρυνση", + "Dismiss" => "Κλείσιμο", + "OK" => "Εντάξει", + "Don't Save" => "Χωρίς αποθήκευση", + "Open…" => "Άνοιγμα…", + "Show password" => "Εμφάνιση κωδικού πρόσβασης", + "Start a new workbook" => "Δημιουργία νέου βιβλίου εργασίας", + "Household Budget" => "Οικογενειακός προϋπολογισμός", + "Quarterly Sales Dashboard" => "Πίνακας πωλήσεων τριμήνου", + "Gradebook" => "Βαθμολόγιο", + "this workbook" => "αυτό το βιβλίο εργασίας", + "This workbook" => "Αυτό το βιβλίο εργασίας", + "Do you want to save the changes you made to {title}?" => "Θέλετε να αποθηκεύσετε τις αλλαγές που κάνατε στο {title};", + "Save a copy as .{format}" => "Αποθήκευση αντιγράφου ως .{format}", + "Select a chart first." => "Επιλέξτε πρώτα ένα γράφημα.", + "Row Height" => "Ύψος γραμμής", + "Column Width" => "Πλάτος στήλης", + "Standard Width" => "Τυπικό πλάτος", + "Move or Copy" => "Μετακίνηση ή αντιγραφή", + "Protect Structure and Windows" => "Προστασία δομής και παραθύρων", + "Unprotect Workbook" => "Κατάργηση προστασίας βιβλίου εργασίας", + "Unprotect Sheet" => "Κατάργηση προστασίας φύλλου", + "Password" => "Κωδικός πρόσβασης", + "Paste Special" => "Ειδική επικόλληση", + "Series" => "Σειρές", + "Insert Hyperlink" => "Εισαγωγή υπερσύνδεσης", + "Create Sparklines" => "Δημιουργία μικρογραφημάτων", + "Page Setup" => "Διαμόρφωση σελίδας", + "Convert Text to Columns" => "Μετατροπή κειμένου σε στήλες", + "Goal Seek" => "Αναζήτηση στόχου", + "Create Forecast Worksheet" => "Δημιουργία φύλλου πρόβλεψης", + "Solver Parameters" => "Παράμετροι επίλυσης", + "Solver Results" => "Αποτελέσματα επίλυσης", + "Edit Name" => "Επεξεργασία ονόματος", + "New Name" => "Νέο όνομα", + "Format Cells" => "Μορφοποίηση κελιών", + "Formula Builder" => "Δημιουργός τύπων", + "Find and Replace" => "Εύρεση και αντικατάσταση", + "Go To" => "Μετάβαση", + "Insert Calculated Field" => "Εισαγωγή υπολογιζόμενου πεδίου", + "Go To Special" => "Ειδική μετάβαση", + "Conditional Formatting Rules Manager" => "Διαχείριση κανόνων μορφοποίησης υπό όρους", + "Search Commands" => "Αναζήτηση εντολών", + "Agent Control" => "Έλεγχος πρακτόρων", + "About GridCraft" => "Πληροφορίες για το GridCraft", + "Insert Chart" => "Εισαγωγή γραφήματος", + "Select Data Source" => "Επιλογή προέλευσης δεδομένων", + "Action Journal" => "Ιστορικό ενεργειών", + "Accessibility" => "Προσβασιμότητα", + "Chart Title" => "Τίτλος γραφήματος", + "Place Picture in Cell" => "Τοποθέτηση εικόνας σε κελί", + "Place Picture over Cells" => "Τοποθέτηση εικόνας πάνω από κελιά", + "Pick From List" => "Επιλογή από λίστα", + "Save a Copy" => "Αποθήκευση αντιγράφου", + "Save Changes?" => "Αποθήκευση αλλαγών;", + "Shift cells right" => "Μετατόπιση κελιών προς τα δεξιά", + "Shift cells down" => "Μετατόπιση κελιών προς τα κάτω", + "Shift cells left" => "Μετατόπιση κελιών προς τα αριστερά", + "Shift cells up" => "Μετατόπιση κελιών προς τα πάνω", + "Entire row" => "Ολόκληρη γραμμή", + "Entire column" => "Ολόκληρη στήλη", + "Row height (pixels):" => "Ύψος γραμμής (εικονοστοιχεία):", + "Column width (characters):" => "Πλάτος στήλης (χαρακτήρες):", + "Standard column width (pixels):" => "Τυπικό πλάτος στήλης (εικονοστοιχεία):", + "Name:" => "Όνομα:", + "Before sheet (position, 0 = first):" => "Πριν από το φύλλο (θέση, 0 = πρώτο):", + "Create a copy" => "Δημιουργία αντιγράφου", + "Sheets: {sheets}" => "Φύλλα: {sheets}", + "Password (optional):" => "Κωδικός πρόσβασης (προαιρετικά):", + "Password:" => "Κωδικός πρόσβασης:", + "Allow all users of this sheet to:" => "Να επιτρέπεται σε όλους τους χρήστες αυτού του φύλλου:", + "Format cells" => "Μορφοποίηση κελιών", + "Format columns" => "Μορφοποίηση στηλών", + "Format rows" => "Μορφοποίηση γραμμών", + "Insert rows" => "Εισαγωγή γραμμών", + "Delete rows" => "Διαγραφή γραμμών", + "Use AutoFilter" => "Χρήση αυτόματου φίλτρου", + " (password, unlocked)" => " (κωδικός πρόσβασης, ξεκλείδωτο)", + " (password)" => " (κωδικός πρόσβασης)", + "No ranges yet." => "Δεν έχουν οριστεί ακόμη περιοχές.", + "Ranges that stay editable when the sheet is protected:" => "Περιοχές που παραμένουν επεξεργάσιμες όταν το φύλλο προστατεύεται:", + "Action" => "Ενέργεια", + "Modify" => "Τροποποίηση", + "Unlock with password" => "Ξεκλείδωμα με κωδικό πρόσβασης", + "Title:" => "Τίτλος:", + "Refers to cells:" => "Αναφέρεται στα κελιά:", + "Range password:" => "Κωδικός πρόσβασης περιοχής:", + "New title (Modify):" => "Νέος τίτλος (τροποποίηση):", + "Remove the password (Modify)" => "Κατάργηση κωδικού πρόσβασης (τροποποίηση)", + "'{file}' is protected." => "Το '{file}' είναι προστατευμένο.", + "Unhide sheet:" => "Εμφάνιση φύλλου:", + "Hidden: {sheets}" => "Κρυφά: {sheets}", + "All" => "Όλα", + "Formulas (F)" => "Τύποι (F)", + "Values (V)" => "Τιμές (V)", + "Formats (T)" => "Μορφές (T)", + "Comments and notes (C)" => "Σχόλια και σημειώσεις (C)", + "Validation" => "Επικύρωση", + "All except borders" => "Όλα εκτός από περιγράμματα", + "Column widths" => "Πλάτη στηλών", + "Formulas and number formats" => "Τύποι και μορφές αριθμών", + "Values and number formats" => "Τιμές και μορφές αριθμών", + "Operation" => "Πράξη", + "Add" => "Πρόσθεση", + "Subtract" => "Αφαίρεση", + "Multiply" => "Πολλαπλασιασμός", + "Divide" => "Διαίρεση", + "Skip blanks" => "Παράλειψη κενών", + "Transpose (E)" => "Αντιμετάθεση (E)", + "Series in" => "Σειρές σε", + "Type" => "Τύπος", + "Linear" => "Γραμμική", + "Growth" => "Αύξηση", + "Date unit" => "Μονάδα ημερομηνίας", + "Day" => "Ημέρα", + "Weekday" => "Εργάσιμη ημέρα", + "Month" => "Μήνας", + "Year" => "Έτος", + "Step value:" => "Τιμή βήματος:", + "Stop value:" => "Τελική τιμή:", + "Start a conversation:" => "Έναρξη συνομιλίας:", + "Note:" => "Σημείωση:", + "Display:" => "Εμφάνιση:", + "Link to (web address, e-mail or Sheet!A1):" => "Σύνδεση με (ιστοσελίδα, email ή Sheet!A1):", + "ScreenTip:" => "Συμβουλή οθόνης:", + "Data Range:" => "Περιοχή δεδομένων:", + "Location Range:" => "Περιοχή τοποθεσίας:", + "Markers" => "Δείκτες", + "Footer:" => "Υποσέλιδο:", + "Left margin (in):" => "Αριστερό περιθώριο (ίντσες):", + "Right margin (in):" => "Δεξιό περιθώριο (ίντσες):", + "Top margin (in):" => "Επάνω περιθώριο (ίντσες):", + "Bottom margin (in):" => "Κάτω περιθώριο (ίντσες):", + "Header (in):" => "Κεφαλίδα (ίντσες):", + "Footer (in):" => "Υποσέλιδο (ίντσες):", + "Tab" => "Στηλοθέτης", + "Semicolon" => "Ερωτηματικό (;)", + "Comma" => "Κόμμα", + "Space" => "Διάστημα", + "Other:" => "Άλλο:", + "Treat consecutive delimiters as one" => "Αντιμετώπιση διαδοχικών διαχωριστικών ως ενός", + "Destination:" => "Προορισμός:", + "My data has headers" => "Τα δεδομένα μου έχουν επικεφαλίδες", + "Columns (blank = all, e.g. A,C):" => "Στήλες (κενό = όλες, π.χ. A,C):", + "Timeline range (blank: first column of the selection):" => "Περιοχή χρονογραμμής (κενό: πρώτη στήλη της επιλογής):", + "Values range (blank: second column of the selection):" => "Περιοχή τιμών (κενό: δεύτερη στήλη της επιλογής):", + "Confidence interval" => "Διάστημα εμπιστοσύνης", + "Confidence level (%):" => "Επίπεδο εμπιστοσύνης (%):", + "Seasonality (auto, 0 for none, or a season length):" => "Εποχικότητα (αυτόματη, 0 για καμία ή μήκος περιόδου):", + "Fill missing points using" => "Συμπλήρωση ελλειπόντων σημείων με", + "Interpolation" => "Παρεμβολή", + "Zeros" => "Μηδενικά", + "Aggregate duplicates using" => "Συνάθροιση διπλοτύπων με", + "Average" => "Μέσος όρος", + "Count" => "Πλήθος", + "CountA" => "Πλήθος μη κενών", + "Max" => "Μέγιστο", + "Median" => "Διάμεσος", + "Min" => "Ελάχιστο", + "Sum" => "Άθροισμα", + "Product" => "Γινόμενο", + "Include forecast statistics" => "Συμπερίληψη στατιστικών πρόβλεψης", + "Chart" => "Γράφημα", + "Line chart" => "Γράφημα γραμμών", + "Column chart" => "Γράφημα στηλών", + "At each change in (column letter):" => "Σε κάθε αλλαγή της στήλης (γράμμα):", + "Use function" => "Χρήση συνάρτησης", + "Add subtotal to (columns, e.g. C,D):" => "Προσθήκη μερικού αθροίσματος στις στήλες (π.χ. C,D):", + "Magnification" => "Μεγέθυνση", + "Custom (%):" => "Προσαρμοσμένο (%):", + "Scope (Workbook or sheet name):" => "Εμβέλεια (βιβλίο εργασίας ή όνομα φύλλου):", + "Comment:" => "Σχόλιο:", + "Refers to:" => "Αναφέρεται σε:", + "Allow" => "Επιτρέπεται", + "Any value" => "Οποιαδήποτε τιμή", + "Whole number" => "Ακέραιος αριθμός", + "Decimal" => "Δεκαδικός αριθμός", + "List" => "Λίστα", + "Text length" => "Μήκος κειμένου", + "between" => "μεταξύ", + "not between" => "όχι μεταξύ", + "equal to" => "ίσο με", + "not equal to" => "όχι ίσο με", + "greater than" => "μεγαλύτερο από", + "less than" => "μικρότερο από", + "greater than or equal to" => "μεγαλύτερο ή ίσο με", + "less than or equal to" => "μικρότερο ή ίσο με", + "Minimum / Source / Formula:" => "Ελάχιστο / Προέλευση / Τύπος:", + "Maximum:" => "Μέγιστο:", + "Ignore blank" => "Παράβλεψη κενών", + "In-cell dropdown" => "Αναπτυσσόμενη λίστα μέσα στο κελί", + "Input message:" => "Μήνυμα εισαγωγής:", + "Error style" => "Στυλ σφάλματος", + "Stop" => "Διακοπή", + "Warning" => "Προειδοποίηση", + "Information" => "Πληροφορίες", + "Error message:" => "Μήνυμα σφάλματος:", + "Format cells that are (value):" => "Μορφοποίηση κελιών με τιμή:", + "and:" => "και:", + "Format cells that contain the text:" => "Μορφοποίηση κελιών που περιέχουν κείμενο:", + "Format cells that contain a date occurring:" => "Μορφοποίηση κελιών με ημερομηνία που είναι:", + "Today" => "Σήμερα", + "Tomorrow" => "Αύριο", + "In the last 7 days" => "Τις τελευταίες 7 ημέρες", + "Last week" => "Την προηγούμενη εβδομάδα", + "This week" => "Αυτή την εβδομάδα", + "Next week" => "Την επόμενη εβδομάδα", + "Last month" => "Τον προηγούμενο μήνα", + "This month" => "Αυτόν τον μήνα", + "Next month" => "Τον επόμενο μήνα", + "Format values where this formula is true:" => "Μορφοποίηση τιμών για τις οποίες ισχύει ο τύπος:", + "with" => "με", + "Light Red Fill with Dark Red Text" => "Ανοιχτό κόκκινο γέμισμα με σκούρο κόκκινο κείμενο", + "Yellow Fill with Dark Yellow Text" => "Κίτρινο γέμισμα με σκούρο κίτρινο κείμενο", + "Green Fill with Dark Green Text" => "Πράσινο γέμισμα με σκούρο πράσινο κείμενο", + "Light Red Fill" => "Ανοιχτό κόκκινο γέμισμα", + "Red Text" => "Κόκκινο κείμενο", + "Red Border" => "Κόκκινο περίγραμμα", + "Formula:" => "Τύπος:", + "Select" => "Επιλογή", + "Blanks" => "Κενά", + "Errors" => "Σφάλματα", + "Numbers" => "Αριθμοί", + "Current region" => "Τρέχουσα περιοχή", + "Last cell" => "Τελευταίο κελί", + "Visible cells only" => "Μόνο ορατά κελιά", + "Conditional formats" => "Μορφές υπό όρους", + "Data validation" => "Επικύρωση δεδομένων", + "Horizontal axis title:" => "Τίτλος οριζόντιου άξονα:", + "Vertical axis title:" => "Τίτλος κατακόρυφου άξονα:", + "No picture selected" => "Δεν έχει επιλεγεί εικόνα", + "Picture file path (PNG or JPEG):" => "Διαδρομή αρχείου εικόνας (PNG ή JPEG):", + "Description (optional):" => "Περιγραφή (προαιρετικά):", + "Fits inside the selected cell and moves with its content." => "Χωρά στο επιλεγμένο κελί και μετακινείται μαζί με το περιεχόμενό του.", + "Choose a PNG or JPEG no larger than 16 MB." => "Επιλέξτε αρχείο PNG ή JPEG έως 16 MB.", + "About" => "Πληροφορίες", + "Contributors" => "Συντελεστές", + "Models" => "Μοντέλα", + "Version {version}" => "Έκδοση {version}", + "Join the ArtCraft Discord" => "Συμμετοχή στον διακομιστή Discord του ArtCraft", + "This workbook has no scripts or macros." => "Αυτό το βιβλίο εργασίας δεν έχει δέσμες ενεργειών ή μακροεντολές.", + "(unnamed)" => "(χωρίς όνομα)", + "— VBA project (preserved, not run)" => "— Έργο VBA (διατηρείται, δεν εκτελείται)", + "— 1 step" => "— 1 βήμα", + "— {steps} steps" => "— {steps} βήματα", + "Alignment" => "Στοίχιση", + "Font" => "Γραμματοσειρά", + "Border" => "Περίγραμμα", + "Format Cells|Fill" => "Γέμισμα", + "Protection" => "Προστασία", + "Category:" => "Κατηγορία:", + "Sample" => "Δείγμα", + "Type (custom format code):" => "Τύπος (προσαρμοσμένος κωδικός μορφής):", + "Vertical" => "Κατακόρυφα", + "Justify" => "Πλήρης στοίχιση", + "Center Across Selection" => "Στοίχιση στο κέντρο κατά μήκος της επιλογής", + "Distributed" => "Κατανεμημένη", + "Top" => "Επάνω", + "Bottom" => "Κάτω", + "Indent" => "Εσοχή", + "Orientation (degrees)" => "Προσανατολισμός (μοίρες)", + "Wrap text" => "Αναδίπλωση κειμένου", + "Shrink to fit" => "Σμίκρυνση για προσαρμογή", + "Bold" => "Έντονη γραφή", + "Italic" => "Πλάγια γραφή", + "None" => "Κανένα", + "Single" => "Μονή", + "Double" => "Διπλή", + "Single Accounting" => "Μονή λογιστική υπογράμμιση", + "Double Accounting" => "Διπλή λογιστική υπογράμμιση", + "Superscript" => "Εκθέτης", + "Subscript" => "Δείκτης", + "Color:" => "Χρώμα:", + "Diagonal ↘" => "Διαγώνιος ↘", + "Diagonal ↗" => "Διαγώνιος ↗", + "none" => "κανένα", + "thin" => "λεπτό", + "medium" => "μεσαίο", + "thick" => "παχύ", + "dashed" => "με παύλες", + "dotted" => "με κουκκίδες", + "double" => "διπλό", + "Background Color:" => "Χρώμα φόντου:", + "Locked" => "Κλειδωμένο", + "Hidden" => "Κρυφό", + "Search:" => "Αναζήτηση:", + "e.g. lookup, average, date" => "π.χ. αναζήτηση, μέσος όρος, ημερομηνία", + "Date & Time" => "Ημερομηνία και ώρα", + "Lookup & Reference" => "Αναζήτηση και αναφορά", + "Math & Trig" => "Μαθηματικά και τριγωνομετρία", + "Statistical" => "Στατιστική", + "Engineering" => "Μηχανική", + "Database" => "Βάση δεδομένων", + "Compatibility" => "Συμβατότητα", + "Web" => "Ιστός", + "Cube" => "Κύβος", + "Add-in and Automation" => "Πρόσθετα και αυτοματοποίηση", + "Find" => "Εύρεση", + "Replace" => "Αντικατάσταση", + "Find what:" => "Εύρεση:", + "Replace with:" => "Αντικατάσταση με:", + "Match case" => "Διάκριση πεζών και κεφαλαίων", + "Match entire cell contents" => "Ταίριασμα ολόκληρου περιεχομένου κελιού", + "Within workbook" => "Σε όλο το βιβλίο εργασίας", + "Replace All" => "Αντικατάσταση όλων", + "Find All" => "Εύρεση όλων", + "Find Next" => "Εύρεση επόμενου", + "All done. We made {count} replacements." => "Ολοκληρώθηκε. Έγιναν {count} αντικαταστάσεις.", + "{count} cell(s) found" => "Βρέθηκαν {count} κελιά", + "Reference:" => "Αναφορά:", + "Special…" => "Ειδικά…", + "My list has headers" => "Η λίστα μου έχει επικεφαλίδες", + "Sort by" => "Ταξινόμηση κατά", + "Then by" => "Έπειτα κατά", + "Cell Values" => "Τιμές κελιών", + "Cell Color" => "Χρώμα κελιού", + "A to Z" => "Α έως Ω", + "Z to A" => "Ω έως Α", + "+ Add Level" => "+ Προσθήκη επιπέδου", + "New…" => "Νέο…", + "Edit…" => "Επεξεργασία…", + "Name" => "Όνομα", + "Value" => "Τιμή", + "Refers To" => "Αναφέρεται σε", + "Scope" => "Εμβέλεια", + "Workbook" => "Βιβλίο εργασίας", + "No names defined" => "Δεν έχουν οριστεί ονόματα.", + "All Charts" => "Όλα τα γραφήματα", + "Clustered Column" => "Ομαδοποιημένες στήλες", + "Stacked Column" => "Σωρευμένες στήλες", + "100% Stacked Column" => "Σωρευμένες στήλες 100%", + "Clustered Bar" => "Ομαδοποιημένες ράβδοι", + "Stacked Bar" => "Σωρευμένες ράβδοι", + "100% Stacked Bar" => "Σωρευμένες ράβδοι 100%", + "Line" => "Γραμμή", + "Line with Markers" => "Γραμμή με δείκτες", + "Stacked Line" => "Σωρευμένες γραμμές", + "Pie" => "Πίτα", + "Doughnut" => "Δακτύλιος", + "Area" => "Περιοχή", + "Stacked Area" => "Σωρευμένη περιοχή", + "Scatter" => "Διασπορά", + "Scatter with Lines" => "Διασπορά με γραμμές", + "Radar" => "Ακτινωτό", + "Histogram" => "Ιστόγραμμα", + "Waterfall" => "Καταρράκτης", + "Funnel" => "Χοάνη", + "Combo" => "Συνδυαστικό", + "Chart data range:" => "Περιοχή δεδομένων γραφήματος:", + "Legend Entries (Series)" => "Καταχωρίσεις υπομνήματος (σειρές)", + "Series{n}" => "Σειρά {n}", + "Keep" => "Διατήρηση", + "Remove" => "Κατάργηση", + "Horizontal (Category) Axis Labels:" => "Ετικέτες οριζόντιου άξονα (κατηγορίας):", + "There are no conditional formatting rules on this sheet." => "Δεν υπάρχουν κανόνες μορφοποίησης υπό όρους σε αυτό το φύλλο.", + "applies to" => "εφαρμόζεται σε", + "Type a command, e.g. freeze, chart, bold…" => "Πληκτρολογήστε μια εντολή, π.χ. σταθεροποίηση, γράφημα, έντονη γραφή…", + "Set cell:" => "Ορισμός κελιού:", + "To value:" => "Σε τιμή:", + "By changing cell:" => "Με αλλαγή κελιού:", + "Goal Seeking found a solution: {value}" => "Η αναζήτηση στόχου βρήκε λύση: {value}", + "Analysis Tools" => "Εργαλεία ανάλυσης", + "Anova: Single Factor" => "Ανάλυση διακύμανσης: ένας παράγοντας", + "Correlation" => "Συσχέτιση", + "Covariance" => "Συνδιακύμανση", + "Descriptive Statistics" => "Περιγραφική στατιστική", + "Exponential Smoothing" => "Εκθετική εξομάλυνση", + "F-Test Two-Sample for Variances" => "Έλεγχος F δύο δειγμάτων για διακυμάνσεις", + "Moving Average" => "Κινητός μέσος όρος", + "Rank and Percentile" => "Κατάταξη και εκατοστημόριο", + "Regression" => "Παλινδρόμηση", + "t-Test: Paired Two Sample for Means" => "Έλεγχος t για συζευγμένα δείγματα", + "t-Test: Two-Sample Assuming Equal Variances" => "Έλεγχος t δύο δειγμάτων (ίσες διακυμάνσεις)", + "t-Test: Two-Sample Assuming Unequal Variances" => "Έλεγχος t δύο δειγμάτων (άνισες διακυμάνσεις)", + "Output options" => "Επιλογές εξόδου", + "Output Range:" => "Περιοχή εξόδου:", + "New Worksheet Ply:" => "Νέο φύλλο εργασίας:", + "Grouped By:" => "Ομαδοποίηση κατά:", + "Labels in first row" => "Ετικέτες στην πρώτη γραμμή", + "Input Range:" => "Περιοχή εισόδου:", + "Variable 1 Range:" => "Περιοχή μεταβλητής 1:", + "Variable 2 Range:" => "Περιοχή μεταβλητής 2:", + "Summary statistics" => "Συνοπτικά στατιστικά στοιχεία", + "Confidence Level for Mean (%), blank for none:" => "Επίπεδο εμπιστοσύνης μέσου όρου (%), κενό για κανένα:", + "Kth Largest (blank for none):" => "k-οστή μεγαλύτερη τιμή (κενό για καμία):", + "Kth Smallest (blank for none):" => "k-οστή μικρότερη τιμή (κενό για καμία):", + "Bin Range (blank for automatic bins):" => "Περιοχή κλάσεων (κενό για αυτόματες κλάσεις):", + "Pareto (sorted histogram)" => "Pareto (ταξινομημένο ιστόγραμμα)", + "Cumulative Percentage" => "Αθροιστικό ποσοστό", + "Alpha:" => "Άλφα:", + "Input Y Range:" => "Περιοχή εισόδου Y:", + "Input X Range:" => "Περιοχή εισόδου X:", + "Constant is Zero" => "Η σταθερά είναι μηδέν", + "Confidence Level (%):" => "Επίπεδο εμπιστοσύνης (%):", + "Residuals" => "Κατάλοιπα", + "Standardized Residuals" => "Τυποποιημένα κατάλοιπα", + "Normal Probability" => "Γράφημα κανονικής πιθανότητας", + "Interval:" => "Διάστημα:", + "Standard Errors" => "Τυπικά σφάλματα", + "Damping factor:" => "Συντελεστής απόσβεσης:", + "Hypothesized Mean Difference:" => "Υποθετική διαφορά μέσων όρων:", + "Set Objective:" => "Ορισμός στόχου:", + "To:" => "Σε:", + "Value Of:" => "Τιμή:", + "By Changing Variable Cells:" => "Με αλλαγή των κελιών μεταβλητών:", + "Subject to the Constraints:" => "Υπό τους περιορισμούς:", + "Make Unconstrained Variables Non-Negative" => "Να είναι μη αρνητικές οι μεταβλητές χωρίς περιορισμούς", + "Select a Solving Method:" => "Επιλέξτε μέθοδο επίλυσης:", + "GRG Nonlinear" => "GRG μη γραμμική", + "Solve" => "Επίλυση", + "Keep Solver Solution" => "Διατήρηση λύσης", + "Restore Original Values" => "Επαναφορά αρχικών τιμών", + "The spelling check is complete for the entire sheet." => "Ο ορθογραφικός έλεγχος ολοκληρώθηκε για ολόκληρο το φύλλο.", + "Not in Dictionary ({cell}):" => "Δεν υπάρχει στο λεξικό ({cell}):", + "Suggestions:" => "Προτάσεις:", + "(No suggestions)" => "(χωρίς προτάσεις)", + "Ignore Once" => "Παράβλεψη μία φορά", + "Add to Dictionary" => "Προσθήκη στο λεξικό", + "Change" => "Αλλαγή", + "Change All" => "Αλλαγή όλων", + "Forecast end (date or number; blank: a third of the history):" => "Τέλος πρόβλεψης (ημερομηνία ή αριθμός· κενό: ένα τρίτο του ιστορικού):", + "The output range already holds data. Replace it with the report?" => { + "Η περιοχή εξόδου περιέχει ήδη δεδομένα. Να αντικατασταθούν με την αναφορά;" + } + "Tab|Insert" => "Εισαγωγή", + "AutoSave" => "Αυτόματη αποθήκευση", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "Ομαλή μετακίνηση του περιγράμματος επιλογής στο νέο κελί αντί για απότομη μεταπήδηση" + } + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "Η δομή του βιβλίου εργασίας είναι κλειδωμένη: δεν επιτρέπεται προσθήκη, μετακίνηση, μετονομασία ή διαγραφή φύλλων." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Κλείδωμα της δομής του βιβλίου εργασίας ώστε να μην επιτρέπεται προσθήκη, μετακίνηση, μετονομασία ή διαγραφή φύλλων." + } + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "Ένα αρχείο CSV, μια ιστοσελίδα ή ένα PDF είναι αντίγραφο: το βιβλίο εργασίας διατηρεί το δικό του αρχείο." + } + _ => return None, + }) +} diff --git a/docs/localization-el.md b/docs/localization-el.md new file mode 100644 index 000000000..af8f24e0b --- /dev/null +++ b/docs/localization-el.md @@ -0,0 +1,17 @@ +# Greek (el) interface localization + +The UI now offers **Ελληνικά** via View > Interface language and uses Greek automatically +on a fresh installation when the system locale is `el` or `el-GR`. + +The localization follows the existing GridCraft interface translation infrastructure: +- `crates/ui-egui/src/i18n/el.rs` supplies Greek translations of UI strings. +- `crates/ui-egui/src/i18n.rs` registers `Language::El` (`el`), language selection, + persisted preferences, and translation tests. +- Command identifiers, spreadsheet content, function names and references remain stable. +- Greek UI translation **does not add a Greek spelling dictionary** or translate formula + function names, locale-specific separators or number formats. +- Unknown UI labels continue to fall back to the original English text. + +The Greek strings were translated specifically for GridCraft. They are not extracted from +proprietary spreadsheet software or localization assets. The MIT OR Apache-2.0 repository +licenses apply to this contribution. From 2d4a537c6a553ace9e056f30ca94d497d28641ed Mon Sep 17 00:00:00 2001 From: icsimpianti <323158913+icsimpianti@users.noreply.github.com> Date: Thu, 15 Oct 2026 08:52:36 +0200 Subject: [PATCH 07/33] i18n: add Italian (it) UI translation Adds Language::It ("it", native name "Italiano") with a new per-language module crates/ui-egui/src/i18n/it.rs, following the existing pattern (translate(text) -> Option<&'static str>). The catalog has 971 entries: every key the most complete catalog (pt) translates, plus the PivotTable Fields pane strings (from es) and Options|Editing. Labels follow Excel's Italian terminology (Foglio, Cartella di lavoro, Blocca riquadri, Unisci e allinea al centro, Somma automatica...). Function names are not touched. Also: it / it-IT / it_CH tags resolve to Italian (system-language default), Language::ALL and the coverage/tag/age tests include Italian, and docs/localization-parity.md lists the new language. Not compiled locally (no Rust toolchain on the author's machine); relying on CI. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/backstage.rs | 1 + crates/ui-egui/src/i18n.rs | 19 +- crates/ui-egui/src/i18n/it.rs | 993 ++++++++++++++++++++++++++++ crates/ui-egui/tests/interaction.rs | 1 + docs/localization-parity.md | 4 +- 5 files changed, 1016 insertions(+), 2 deletions(-) create mode 100644 crates/ui-egui/src/i18n/it.rs diff --git a/crates/ui-egui/src/backstage.rs b/crates/ui-egui/src/backstage.rs index 922baabc5..d131835d7 100644 --- a/crates/ui-egui/src/backstage.rs +++ b/crates/ui-egui/src/backstage.rs @@ -1034,6 +1034,7 @@ mod tests { assert_eq!(age(Language::Ja, 3.0 * DAY), "3 日前"); assert_eq!(age(Language::De, 3.0 * DAY), "vor 3 Tagen"); assert_eq!(age(Language::Fr, 90.0), "il y a 1 min"); + assert_eq!(age(Language::It, 3.0 * DAY), "3 giorni fa"); for lang in Language::ALL { for seconds in [10.0, 600.0, 7200.0, 1.5 * DAY, 5.0 * DAY, 30.0 * DAY, 200.0 * DAY, 2000.0 * DAY] { let words = age(lang, seconds); diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 061698df9..5fd1c15a8 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -13,6 +13,7 @@ mod cs; mod de; mod es; mod fr; +mod it; mod ko; mod pt; mod ru; @@ -35,10 +36,13 @@ pub enum Language { Cs, Fr, Sr, + It, } 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::It, + ]; /// The language's own name, shown in the switcher. pub fn name(self) -> &'static str { @@ -54,6 +58,7 @@ impl Language { Self::Cs => "Čeština", Self::Fr => "Français", Self::Sr => "Srpski", + Self::It => "Italiano", } } @@ -71,6 +76,7 @@ impl Language { Self::Cs => "cs", Self::Fr => "fr", Self::Sr => "sr", + Self::It => "it", } } @@ -91,6 +97,7 @@ impl Language { "cs" => Some(Self::Cs), "fr" => Some(Self::Fr), "sr" => Some(Self::Sr), + "it" => Some(Self::It), _ => None, } } @@ -129,6 +136,7 @@ impl Language { Self::Cs => cs::translate(text), Self::Fr => fr::translate(text), Self::Sr => sr::translate(text), + Self::It => it::translate(text), }; translated.unwrap_or_else(|| text.rsplit_once('|').map_or(text, |(_, label)| label)) } @@ -611,6 +619,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!(it::translate(english).is_some_and(|text| !text.is_empty()), "missing Italian: {english}"); } assert_eq!(Language::Ja.tr("Data"), "データ"); assert_eq!(Language::Zh.tr("Data"), "数据"); @@ -644,6 +653,11 @@ 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::It.tr("Data"), "Dati"); + assert_eq!(Language::It.tr("Sheet1!A1"), "Sheet1!A1"); + assert_eq!(Language::It.tr("Freeze Panes"), "Blocca riquadri"); + assert_eq!(Language::It.tr("Page Layout|Orientation"), "Orientamento"); + assert_eq!(Language::It.tr("Orientation"), "Orientamento"); assert_eq!(Language::parse("xx"), None); } @@ -685,6 +699,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("it-IT"), Some(Language::It)); + assert_eq!(Language::from_tag("it_CH.UTF-8"), Some(Language::It)); + assert_eq!(Language::parse("it"), Some(Language::It)); } #[test] diff --git a/crates/ui-egui/src/i18n/it.rs b/crates/ui-egui/src/i18n/it.rs new file mode 100644 index 000000000..80c181cdb --- /dev/null +++ b/crates/ui-egui/src/i18n/it.rs @@ -0,0 +1,993 @@ +//! Italian translations for the interface strings in i18n.rs. Labels follow Excel's Italian +//! wording (sentence case, «Blocca riquadri», «Unisci e allinea al centro»); anything absent falls +//! back to English. + +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Incolla", + "Paste Values" => "Incolla valori", + "Paste Formulas" => "Incolla formule", + "Paste Formatting" => "Incolla formattazione", + "Transpose" => "Trasponi", + "Paste Link" => "Incolla collegamento", + "Paste Special…" => "Incolla speciale…", + "Insert Copied Cells" => "Inserisci celle copiate", + "Insert Copied Cells…" => "Inserisci celle copiate…", + "Insert Cut Cells" => "Inserisci celle tagliate", + "Insert Paste" => "Inserisci e incolla", + "Cut (⌘X)" => "Taglia (⌘X)", + "Copy (⌘C)" => "Copia (⌘C)", + "Format Painter (double-click to keep it on)" => "Copia formato (doppio clic per mantenerlo attivo)", + "Bold (⌘B)" => "Grassetto (⌘B)", + "Italic (⌘I)" => "Corsivo (⌘I)", + "Underline (⌘U)" => "Sottolineato (⌘U)", + "Double Underline" => "Doppia sottolineatura", + "Strikethrough" => "Barrato", + "Underline" => "Sottolineato", + "Increase Font Size" => "Aumenta dimensione carattere", + "Decrease Font Size" => "Riduci dimensione carattere", + "Wrap Text" => "Testo a capo", + "Merge & Center" => "Unisci e allinea al centro", + "Merge Cells" => "Unisci celle", + "Merge Across" => "Unisci in orizzontale", + "Unmerge Cells" => "Separa celle", + "Fill Color" => "Colore riempimento", + "Font Color" => "Colore carattere", + "Borders" => "Bordi", + "Top\nAlign" => "Allinea\nin alto", + "Middle\nAlign" => "Allinea\nal centro", + "Bottom\nAlign" => "Allinea\nin basso", + "Left" => "Sinistra", + "Right" => "Destra", + "Center" => "Centro", + "Horizontal" => "Orizzontale", + "Vertical Text" => "Testo verticale", + "Decrease Indent" => "Riduci rientro", + "Increase Indent" => "Aumenta rientro", + "Orientation" => "Orientamento", + "Angle Counterclockwise" => "Ruota in senso antiorario", + "Angle Clockwise" => "Ruota in senso orario", + "Rotate Text Up" => "Ruota testo verso l'alto", + "Rotate Text Down" => "Ruota testo verso il basso", + "Accounting Number Format" => "Formato numero contabilità", + "Percent Style" => "Stile percentuale", + "Comma Style" => "Stile separatore", + "Increase Decimal" => "Aumenta decimali", + "Decrease Decimal" => "Riduci decimali", + "More Accounting Formats…" => "Altri formati contabilità…", + "Conditional\nFormatting" => "Formattazione\ncondizionale", + "Conditional Formatting" => "Formattazione condizionale", + "Format\nas Table" => "Formatta\ncome tabella", + "Cell\nStyles" => "Stili\ncella", + "Format Cells…" => "Formato celle…", + "Format Cell Alignment…" => "Formato allineamento celle…", + "Format\nPane" => "Riquadro\nFormato", + "Format" => "Formato", + "Insert" => "Inserisci", + "Insert Cells…" => "Inserisci celle…", + "Delete" => "Elimina", + "Delete Cells…" => "Elimina celle…", + "Insert Sheet Rows" => "Inserisci righe foglio", + "Insert Sheet Columns" => "Inserisci colonne foglio", + "Delete Sheet Rows" => "Elimina righe foglio", + "Delete Sheet Columns" => "Elimina colonne foglio", + "Row Height…" => "Altezza righe…", + "AutoFit Row Height" => "Adatta altezza righe", + "Column Width…" => "Larghezza colonne…", + "AutoFit Column Width" => "Adatta larghezza colonne", + "Default Width…" => "Larghezza predefinita…", + "Hide Rows" => "Nascondi righe", + "Unhide Rows" => "Scopri righe", + "Hide Columns" => "Nascondi colonne", + "Unhide Columns" => "Scopri colonne", + "Lock Cell" => "Blocca cella", + "Clear" => "Cancella", + "Clear All" => "Cancella tutto", + "Clear Formats" => "Cancella formati", + "Clear Contents" => "Cancella contenuto", + "Clear Comments and Notes" => "Cancella commenti e note", + "Clear Hyperlinks" => "Cancella collegamenti ipertestuali", + "AutoSum" => "Somma automatica", + "AutoSum (⌘⇧T)" => "Somma automatica (⌘⇧T)", + "Flash\nFill" => "Riempimento\nveloce", + "Flash Fill" => "Riempimento veloce", + "Fill" => "Riempimento", + "Clear Print Area" => "Cancella area di stampa", + "Find &\nSelect" => "Trova e\nseleziona", + "Find…" => "Trova…", + "Replace…" => "Sostituisci…", + "Go To…" => "Vai a…", + "Go To Special…" => "Vai a speciale…", + "PivotTable" => "Tabella pivot", + "Recommended\nCharts" => "Grafici\nconsigliati", + "Table" => "Tabella", + "Pictures" => "Immagini", + "Shapes" => "Forme", + "Icons" => "Icone", + "Text\nBox" => "Casella\ndi testo", + "Comment" => "Commento", + "New\nComment" => "Nuovo\ncommento", + "New Note" => "Nuova nota", + "Show/Hide Note" => "Mostra/Nascondi nota", + "Header &\nFooter" => "Intestazione e\npiè di pagina", + "Text to\nColumns" => "Testo in\ncolonne", + "Link" => "Collegamento", + "Symbol" => "Simbolo", + "Sparklines" => "Sparkline", + "Checkbox" => "Casella di controllo", + "Insert checkboxes in the selected cells" => "Inserisci caselle di controllo nelle celle selezionate", + "Header & Footer" => "Intestazione e piè di pagina", + "Draw with ink" => "Disegna a mano libera", + "Eraser" => "Gomma", + "Ink to\nShape" => "Da input penna\na forma", + "Select\nObjects" => "Seleziona\noggetti", + "Themes" => "Temi", + "Margins" => "Margini", + "Left Margin" => "Margine sinistro", + "Right Margin" => "Margine destro", + "Top Margin" => "Margine superiore", + "Bottom Margin" => "Margine inferiore", + "Header Margin" => "Margine intestazione", + "Footer Margin" => "Margine piè di pagina", + "Size" => "Dimensioni", + "Print\nArea" => "Area di\nstampa", + "Set Print Area" => "Imposta area di stampa", + "Breaks" => "Interruzioni", + "Insert Page Break" => "Inserisci interruzione di pagina", + "Remove Page Break" => "Rimuovi interruzione di pagina", + "Reset All Page Breaks" => "Reimposta tutte le interruzioni di pagina", + "Print\nTitles" => "Stampa\ntitoli", + "Sheet\nRight-to-Left" => "Foglio da destra\na sinistra", + "Sheet Right-to-Left" => "Foglio da destra a sinistra", + "Narrow" => "Stretti", + "Wide" => "Larghi", + "Normal" => "Normale", + "Portrait" => "Verticale", + "Landscape" => "Orizzontale", + "Custom Margins…" => "Margini personalizzati…", + "Insert\nFunction" => "Inserisci\nfunzione", + "Name\nManager" => "Gestione\nnomi", + "Define Name" => "Definisci nome", + "Use in Formula" => "Usa nella formula", + "Create from Selection" => "Crea da selezione", + "Trace Precedents" => "Individua precedenti", + "Trace Dependents" => "Individua dipendenti", + "Remove Arrows" => "Rimuovi frecce", + "Show Formulas" => "Mostra formule", + "Error Checking" => "Controllo errori", + "Evaluate Formula" => "Valuta formula", + "Watch Window" => "Finestra controlli", + "Calculation\nOptions" => "Opzioni di\ncalcolo", + "Calculate Now" => "Calcola ora", + "Calculate Sheet" => "Calcola foglio", + "Automatic" => "Automatico", + "Automatic Except for Data Tables" => "Automatico ad eccezione delle tabelle dati", + "Manual" => "Manuale", + "Sort &\nFilter" => "Ordina e\nfiltra", + "Sort" => "Ordina", + "Sort A to Z" => "Ordina dalla A alla Z", + "Sort Z to A" => "Ordina dalla Z alla A", + "Custom Sort…" => "Ordinamento personalizzato…", + "Filter" => "Filtro", + "Reapply" => "Riapplica", + "Get Data\n(Text/CSV)" => "Recupera dati\n(testo/CSV)", + "Remove\nDuplicates" => "Rimuovi\nduplicati", + "Data\nValidation" => "Convalida\ndati", + "Data Validation" => "Convalida dati", + "Data Validation…" => "Convalida dati…", + "Circle Invalid Data" => "Cerchia dati non validi", + "Clear Validation" => "Cancella convalida", + "Group" => "Raggruppa", + "Ungroup" => "Separa", + "Show Detail" => "Mostra dettagli", + "Hide Detail" => "Nascondi dettagli", + "Subtotal" => "Subtotale", + "Data\nAnalysis" => "Analisi\ndati", + "Data Analysis" => "Analisi dati", + "Solver" => "Solver", + "What-If\nAnalysis" => "Analisi di\nsimulazione", + "Data Table…" => "Tabella dati…", + "Scenario Manager…" => "Gestione scenari…", + "Goal Seek…" => "Ricerca obiettivo…", + "Forecast\nSheet" => "Foglio\nprevisioni", + "Spelling" => "Controllo ortografia", + "Check\nAccessibility" => "Verifica\naccessibilità", + "Threaded Comments" => "Commenti in thread", + "Show\nComments" => "Mostra\ncommenti", + "Previous" => "Precedente", + "Next" => "Successivo", + "Previous Comment" => "Commento precedente", + "Next Comment" => "Commento successivo", + "Show All Notes" => "Mostra tutte le note", + "Convert to Comments" => "Converti in commenti", + "Protect\nWorkbook" => "Proteggi cartella\ndi lavoro", + "Allow Edit\nRanges" => "Consenti modifica\nintervalli", + "Allow Edit Ranges" => "Consenti modifica intervalli", + "Unprotect\nSheet" => "Rimuovi protezione\nfoglio", + "Protect Sheet…" => "Proteggi foglio…", + "Comments" => "Commenti", + "Notes" => "Note", + "Page Break\nPreview" => "Anteprima interruzioni\ndi pagina", + "Page\nLayout" => "Layout\ndi pagina", + "Formula Bar" => "Barra della formula", + "Gridlines" => "Griglia", + "Headings" => "Intestazioni", + "Zoom" => "Zoom", + "100%" => "100%", + "Zoom to\nSelection" => "Zoom sulla\nselezione", + "Freeze\nPanes" => "Blocca\nriquadri", + "Freeze Panes" => "Blocca riquadri", + "Freeze Top Row" => "Blocca riga superiore", + "Freeze First Column" => "Blocca prima colonna", + "Unfreeze Panes" => "Sblocca riquadri", + "Dark Mode" => "Modalità scura", + "Interface language" => "Lingua dell'interfaccia", + "Interface size" => "Dimensione dell'interfaccia", + "Auto" => "Auto", + "Drag to freeze columns" => "Trascina per bloccare le colonne", + "Drag to freeze rows" => "Trascina per bloccare le righe", + "Command\nPalette" => "Riquadro\ncomandi", + "Agent\nControl" => "Controllo\nagenti", + "Action\nJournal" => "Registro\nazioni", + "About\nGridCraft" => "Informazioni su\nGridCraft", + "Share" => "Condividi", + "Add Chart\nElement" => "Aggiungi\nelemento grafico", + "Change\nChart Type" => "Cambia tipo\ndi grafico", + "Switch\nRow/Column" => "Inverti\nriga/colonna", + "Select\nData" => "Seleziona\ndati", + "Data Labels: None" => "Etichette dati: nessuna", + "Data Labels: Show" => "Etichette dati: mostra", + "Legend: None" => "Legenda: nessuna", + "Legend: Bottom" => "Legenda: in basso", + "Legend: Top" => "Legenda: in alto", + "Legend: Right" => "Legenda: a destra", + "Gridlines: None" => "Griglia: nessuna", + "Gridlines: Show" => "Griglia: mostra", + "Chart\nTitle" => "Titolo\ndel grafico", + "Delete\nChart" => "Elimina\ngrafico", + "Convert\nto Range" => "Converti\nin intervallo", + "Table\nStyles" => "Stili\ntabella", + "Top 10 Items" => "Primi 10 elementi", + "Top 10%" => "Primi 10%", + "Bottom 10 Items" => "Ultimi 10 elementi", + "Bottom 10%" => "Ultimi 10%", + "Above Average" => "Sopra la media", + "Below Average" => "Sotto la media", + "Clear Rules from Entire Sheet" => "Cancella regole da tutto il foglio", + "Clear Rules from Selected Cells" => "Cancella regole dalle celle selezionate", + "Constants" => "Costanti", + "Data Bars" => "Barre dei dati", + "Color Scales" => "Scale di colori", + "Icon Sets" => "Set di icone", + "Home" => "Home", + "Draw" => "Disegno", + "Page Layout" => "Layout di pagina", + "Formulas" => "Formule", + "Data" => "Dati", + "Review" => "Revisione", + "View" => "Visualizza", + "Automate" => "Automatizza", + "Table Design" => "Progettazione tabella", + "Chart Design" => "Progettazione grafico", + "Ready" => "Pronto", + "Enter" => "Immetti", + "Edit" => "Modifica", + "Point" => "Punta", + "Calculate" => "Calcola", + "Select destination and press Enter or choose Paste" => "Seleziona la destinazione e premi Invio o scegli Incolla", + "General" => "Generale", + "Number" => "Numero", + "Currency" => "Valuta", + "Accounting" => "Contabilità", + "Date" => "Data", + "Time" => "Ora", + "Percentage" => "Percentuale", + "Fraction" => "Frazione", + "Scientific" => "Scientifico", + "Text" => "Testo", + "Special" => "Speciale", + "Custom" => "Personalizzato", + "Short Date" => "Data breve", + "Long Date" => "Data estesa", + "More Number Formats…" => "Altri formati numero…", + "Financial" => "Finanziarie", + "Logical" => "Logiche", + "Date &\nTime" => "Data e\nora", + "Lookup &\nReference" => "Ricerca e\nriferimento", + "Math &\nTrig" => "Matematiche e\ntrigonometriche", + "More\nFunctions" => "Altre\nfunzioni", + "Page Layout|Orientation" => "Orientamento", + "Display theme" => "Tema di visualizzazione", + "Animations" => "Animazioni", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "Fa scorrere il contorno della selezione fino alla cella di destinazione invece di saltare" + } + "System" => "Sistema", + "Light" => "Chiaro", + "Dark" => "Scuro", + "Sheet Options|View" => "Visualizza", + "Print" => "Stampa", + // Page Layout view and the Header & Footer tab. + "Click to add data" => "Fai clic per aggiungere dati", + "Add header" => "Aggiungi intestazione", + "Add footer" => "Aggiungi piè di pagina", + "(none)" => "(nessuno)", + "Header" => "Intestazione", + "Footer" => "Piè di pagina", + "Page\nNumber" => "Numero\npagina", + "Number\nof Pages" => "Numero\npagine", + "Current\nDate" => "Data\ncorrente", + "Current\nTime" => "Ora\ncorrente", + "File\nPath" => "Percorso\nfile", + "File\nName" => "Nome\nfile", + "Sheet\nName" => "Nome\nfoglio", + "Go to\nHeader" => "Vai a\nintestazione", + "Go to\nFooter" => "Vai a\npiè di pagina", + "Page Number" => "Numero pagina", + "Number of Pages" => "Numero pagine", + "Current Date" => "Data corrente", + "Current Time" => "Ora corrente", + "File Path" => "Percorso file", + "File Name" => "Nome file", + "Sheet Name" => "Nome foglio", + "Go to Header" => "Vai a intestazione", + "Different First Page" => "Prima pagina diversa", + "Different Odd & Even Pages" => "Pagine pari e dispari diverse", + "Go to Footer" => "Vai a piè di pagina", + "Ruler" => "Righello", + // File › Backstage view. + "File" => "File", + "Back" => "Indietro", + "New" => "Nuovo", + "Open" => "Apri", + "Info" => "Informazioni", + "Save" => "Salva", + "Save As" => "Salva con nome", + "Export" => "Esporta", + "Close" => "Chiudi", + "Options" => "Opzioni", + "Blank workbook" => "Cartella di lavoro vuota", + "Recent" => "Recenti", + "No recent workbooks yet." => "Nessuna cartella di lavoro recente.", + "More workbooks" => "Altre cartelle di lavoro", + "Modified" => "Modificato", + "Not available" => "Non disponibile", + "Just now" => "Adesso", + "{n} min ago" => "{n} min fa", + "{n} h ago" => "{n} h fa", + "{n} days ago" => "{n} giorni fa", + "{n} weeks ago" => "{n} settimane fa", + "{n} months ago" => "{n} mesi fa", + "{n} years ago" => "{n} anni fa", + "Browse…" => "Sfoglia…", + "Not saved yet" => "Non ancora salvato", + "Location" => "Percorso", + "Sheets" => "Fogli", + "Protect Workbook" => "Proteggi cartella di lavoro", + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "La struttura dei fogli è bloccata: non è possibile aggiungere, spostare, rinominare o eliminare fogli." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Blocca la struttura dei fogli per impedire di aggiungere, spostare, rinominare o eliminare fogli." + } + "Properties" => "Proprietà", + "Title" => "Titolo", + "Subject" => "Oggetto", + "Author" => "Autore", + "Company" => "Società", + "Keywords" => "Parole chiave", + "Description" => "Descrizione", + "No workbook is open." => "Nessuna cartella di lavoro aperta.", + "Save as type" => "Salva come", + "Excel Workbook (*.xlsx)" => "Cartella di lavoro di Excel (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (delimitato dal separatore di elenco) (*.csv)", + "Web Page (*.html)" => "Pagina Web (*.html)", + "PDF (*.pdf)" => "PDF (*.pdf)", + "Download" => "Scarica", + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "Un file CSV, una pagina Web o un PDF è una copia: la cartella di lavoro mantiene il proprio file." + } + "Save the workbook under another name or in another folder." => "Salva la cartella di lavoro con un altro nome o in un'altra cartella.", + "Print Active Sheets" => "Stampa fogli attivi", + "Print Entire Workbook" => "Stampa intera cartella di lavoro", + "Fit Sheet on One Page" => "Adatta foglio a una pagina", + "Page Setup…" => "Imposta pagina…", + "Page {page} of {pages}" => "Pagina {page} di {pages}", + "Nothing to print." => "Niente da stampare.", + "Previous page" => "Pagina precedente", + "Next page" => "Pagina successiva", + "Create PDF" => "Crea PDF", + "Save the sheet as a PDF document that keeps its page layout." => "Salva il foglio come documento PDF che mantiene il layout di pagina.", + "Change File Type" => "Cambia tipo di file", + "CSV (Comma delimited)" => "CSV (delimitato dal separatore di elenco)", + "Save the active sheet as comma-separated text." => "Salva il foglio attivo come testo separato da virgole.", + "Web Page (.html)" => "Pagina Web (.html)", + "Save the workbook as a web page." => "Salva la cartella di lavoro come pagina Web.", + "Options|General" => "Generale", + "Options|Save" => "Salvataggio", + "Options|Editing" => "Modifica", + "Show formula bar" => "Mostra barra della formula", + "Enable AutoComplete for cell values" => "Abilita Completamento automatico per i valori delle celle", + "Save .xlsx workbooks automatically after every change" => "Salva automaticamente le cartelle di lavoro .xlsx dopo ogni modifica", + "Workbook calculation" => "Calcolo della cartella di lavoro", + "Enable iterative calculation" => "Abilita calcolo iterativo", + "Calculation settings are saved with the workbook." => "Le impostazioni di calcolo vengono salvate con la cartella di lavoro.", + "OK" => "OK", + "Cancel" => "Annulla", + "Don't Save" => "Non salvare", + "Open…" => "Apri…", + "Show password" => "Mostra password", + "Start a new workbook" => "Crea una nuova cartella di lavoro", + "Household Budget" => "Budget familiare", + "Quarterly Sales Dashboard" => "Dashboard vendite trimestrali", + "Gradebook" => "Registro dei voti", + "this workbook" => "questa cartella di lavoro", + "This workbook" => "Questa cartella di lavoro", + "Do you want to save the changes you made to {title}?" => "Vuoi salvare le modifiche apportate a {title}?", + "Save a copy as .{format}" => "Salva una copia come .{format}", + "Select a chart first." => "Seleziona prima un grafico.", + "Text Box" => "Casella di testo", + "Select Data" => "Seleziona dati", + "Row Height" => "Altezza righe", + "Column Width" => "Larghezza colonne", + "Standard Width" => "Larghezza standard", + "Rename Sheet" => "Rinomina foglio", + "Move or Copy" => "Sposta o copia", + "Protect Sheet" => "Proteggi foglio", + "Protect Structure and Windows" => "Proteggi struttura e finestre", + "Unprotect Workbook" => "Rimuovi protezione cartella di lavoro", + "Unprotect Sheet" => "Rimuovi protezione foglio", + "Password" => "Password", + "Unhide" => "Scopri", + "Paste Special" => "Incolla speciale", + "Series" => "Serie", + "New Comment" => "Nuovo commento", + "Insert Hyperlink" => "Inserisci collegamento ipertestuale", + "Create Sparklines" => "Crea Sparkline", + "Page Setup" => "Imposta pagina", + "Convert Text to Columns" => "Converti testo in colonne", + "Remove Duplicates" => "Rimuovi duplicati", + "Goal Seek" => "Ricerca obiettivo", + "Create Forecast Worksheet" => "Crea foglio di previsione", + "Solver Parameters" => "Parametri di Solver", + "Solver Results" => "Risultati di Solver", + "Edit Name" => "Modifica nome", + "New Name" => "Nuovo nome", + "Format Cells" => "Formato celle", + "Formula Builder" => "Generatore di formule", + "Find and Replace" => "Trova e sostituisci", + "Go To" => "Vai a", + "Insert Calculated Field" => "Inserisci campo calcolato", + "Go To Special" => "Vai a speciale", + "Name Manager" => "Gestione nomi", + "Conditional Formatting Rules Manager" => "Gestione regole di formattazione condizionale", + "Search Commands" => "Cerca comandi", + "Agent Control" => "Controllo agenti", + "About GridCraft" => "Informazioni su GridCraft", + "Insert Chart" => "Inserisci grafico", + "Select Data Source" => "Seleziona origine dati", + "Action Journal" => "Registro azioni", + "Macros" => "Macro", + "Workbook Statistics" => "Statistiche cartella di lavoro", + "Accessibility" => "Accessibilità", + "Chart Title" => "Titolo del grafico", + "Place Picture in Cell" => "Inserisci immagine nella cella", + "Place Picture over Cells" => "Inserisci immagine sopra le celle", + "Pick From List" => "Scegli dall'elenco", + "Save a Copy" => "Salva una copia", + "Save Changes?" => "Salvare le modifiche?", + "Shift cells right" => "Sposta celle a destra", + "Shift cells down" => "Sposta celle in basso", + "Shift cells left" => "Sposta celle a sinistra", + "Shift cells up" => "Sposta celle in alto", + "Entire row" => "Intera riga", + "Entire column" => "Intera colonna", + "Row height (pixels):" => "Altezza riga (pixel):", + "Column width (characters):" => "Larghezza colonna (caratteri):", + "Standard column width (pixels):" => "Larghezza standard colonna (pixel):", + "Name:" => "Nome:", + "Before sheet (position, 0 = first):" => "Prima del foglio (posizione, 0 = primo):", + "Create a copy" => "Crea una copia", + "Sheets: {sheets}" => "Fogli: {sheets}", + "Password (optional):" => "Password (facoltativa):", + "Password:" => "Password:", + "Allow all users of this sheet to:" => "Consenti a tutti gli utenti di questo foglio di:", + "Format cells" => "Formatta celle", + "Format columns" => "Formatta colonne", + "Format rows" => "Formatta righe", + "Insert rows" => "Inserisci righe", + "Delete rows" => "Elimina righe", + "Use AutoFilter" => "Usa Filtro automatico", + " (password, unlocked)" => " (password, sbloccato)", + " (password)" => " (password)", + "No ranges yet." => "Nessun intervallo.", + "Ranges that stay editable when the sheet is protected:" => "Intervalli che restano modificabili quando il foglio è protetto:", + "Action" => "Azione", + "Modify" => "Modifica", + "Unlock with password" => "Sblocca con password", + "Title:" => "Titolo:", + "Refers to cells:" => "Si riferisce alle celle:", + "Range password:" => "Password intervallo:", + "New title (Modify):" => "Nuovo titolo (Modifica):", + "Remove the password (Modify)" => "Rimuovi la password (Modifica)", + "'{file}' is protected." => "'{file}' è protetto.", + "Unhide sheet:" => "Scopri foglio:", + "Hidden: {sheets}" => "Nascosti: {sheets}", + "All" => "Tutto", + "Formulas (F)" => "Formule (F)", + "Values (V)" => "Valori (V)", + "Formats (T)" => "Formati (T)", + "Comments and notes (C)" => "Commenti e note (C)", + "Validation" => "Convalida", + "All except borders" => "Tutto tranne i bordi", + "Column widths" => "Larghezze colonne", + "Formulas and number formats" => "Formule e formati numero", + "Values and number formats" => "Valori e formati numero", + "Operation" => "Operazione", + "Add" => "Aggiungi", + "Subtract" => "Sottrai", + "Multiply" => "Moltiplica", + "Divide" => "Dividi", + "Skip blanks" => "Salta celle vuote", + "Transpose (E)" => "Trasponi (E)", + "Series in" => "Serie in", + "Columns" => "Colonne", + "Rows" => "Righe", + "Type" => "Tipo", + "Linear" => "Lineare", + "Growth" => "Esponenziale", + "Date unit" => "Unità di data", + "Day" => "Giorno", + "Weekday" => "Giorno lavorativo", + "Month" => "Mese", + "Year" => "Anno", + "Step value:" => "Incremento:", + "Stop value:" => "Valore limite:", + "Start a conversation:" => "Avvia una conversazione:", + "Note:" => "Nota:", + "Display:" => "Testo da visualizzare:", + "Link to (web address, e-mail or Sheet!A1):" => "Collega a (indirizzo Web, e-mail o Foglio!A1):", + "ScreenTip:" => "Descrizione comando:", + "Data Range:" => "Intervallo dati:", + "Location Range:" => "Intervallo di posizione:", + "Markers" => "Indicatori", + "Footer:" => "Piè di pagina:", + "Left margin (in):" => "Margine sinistro (poll.):", + "Right margin (in):" => "Margine destro (poll.):", + "Top margin (in):" => "Margine superiore (poll.):", + "Bottom margin (in):" => "Margine inferiore (poll.):", + "Header (in):" => "Intestazione (poll.):", + "Footer (in):" => "Piè di pagina (poll.):", + "Tab" => "Tabulazione", + "Semicolon" => "Punto e virgola", + "Comma" => "Virgola", + "Space" => "Spazio", + "Other:" => "Altro:", + "Treat consecutive delimiters as one" => "Considera delimitatori consecutivi come uno solo", + "Destination:" => "Destinazione:", + "My data has headers" => "I dati contengono intestazioni", + "Columns (blank = all, e.g. A,C):" => "Colonne (vuoto = tutte, ad es. A,C):", + "Timeline range (blank: first column of the selection):" => "Intervallo sequenza temporale (vuoto: prima colonna della selezione):", + "Values range (blank: second column of the selection):" => "Intervallo valori (vuoto: seconda colonna della selezione):", + "Confidence interval" => "Intervallo di confidenza", + "Confidence level (%):" => "Livello di confidenza (%):", + "Seasonality (auto, 0 for none, or a season length):" => "Stagionalità (automatica, 0 per nessuna, o la lunghezza di una stagione):", + "Fill missing points using" => "Compila punti mancanti usando", + "Interpolation" => "Interpolazione", + "Zeros" => "Zeri", + "Aggregate duplicates using" => "Aggrega duplicati usando", + "Average" => "Media", + "Count" => "Conteggio", + "CountA" => "Conta valori", + "Max" => "Max", + "Median" => "Mediana", + "Min" => "Min", + "Sum" => "Somma", + "Product" => "Prodotto", + "Include forecast statistics" => "Includi statistiche di previsione", + "Chart" => "Grafico", + "Line chart" => "Grafico a linee", + "Column chart" => "Grafico a colonne", + "At each change in (column letter):" => "A ogni cambiamento in (lettera di colonna):", + "Use function" => "Usa funzione", + "Add subtotal to (columns, e.g. C,D):" => "Aggiungi subtotale a (colonne, ad es. C,D):", + "Magnification" => "Ingrandimento", + "Custom (%):" => "Personalizzato (%):", + "Scope (Workbook or sheet name):" => "Ambito (cartella di lavoro o nome del foglio):", + "Comment:" => "Commento:", + "Refers to:" => "Riferito a:", + "Allow" => "Consenti", + "Any value" => "Qualsiasi valore", + "Whole number" => "Numero intero", + "Decimal" => "Decimale", + "List" => "Elenco", + "Text length" => "Lunghezza testo", + "between" => "tra", + "not between" => "non tra", + "equal to" => "uguale a", + "not equal to" => "diverso da", + "greater than" => "maggiore di", + "less than" => "minore di", + "greater than or equal to" => "maggiore o uguale a", + "less than or equal to" => "minore o uguale a", + "Minimum / Source / Formula:" => "Minimo / Origine / Formula:", + "Maximum:" => "Massimo:", + "Ignore blank" => "Ignora celle vuote", + "In-cell dropdown" => "Elenco a discesa nella cella", + "Input message:" => "Messaggio di input:", + "Error style" => "Stile errore", + "Stop" => "Stop", + "Warning" => "Avviso", + "Information" => "Informazioni", + "Error message:" => "Messaggio di errore:", + "Format cells that are (value):" => "Formatta celle che sono (valore):", + "and:" => "e:", + "Format cells that contain the text:" => "Formatta celle che contengono il testo:", + "Format cells that contain a date occurring:" => "Formatta celle che contengono una data:", + "Yesterday" => "Ieri", + "Today" => "Oggi", + "Tomorrow" => "Domani", + "In the last 7 days" => "Negli ultimi 7 giorni", + "Last week" => "Settimana scorsa", + "This week" => "Questa settimana", + "Next week" => "Settimana prossima", + "Last month" => "Mese scorso", + "This month" => "Questo mese", + "Next month" => "Mese prossimo", + "Format values where this formula is true:" => "Formatta valori per cui questa formula è vera:", + "with" => "con", + "Light Red Fill with Dark Red Text" => "Riempimento rosso chiaro con testo rosso scuro", + "Yellow Fill with Dark Yellow Text" => "Riempimento giallo con testo giallo scuro", + "Green Fill with Dark Green Text" => "Riempimento verde con testo verde scuro", + "Light Red Fill" => "Riempimento rosso chiaro", + "Red Text" => "Testo rosso", + "Red Border" => "Bordo rosso", + "Formula:" => "Formula:", + "Select" => "Seleziona", + "Blanks" => "Celle vuote", + "Errors" => "Errori", + "Numbers" => "Numeri", + "Current region" => "Area corrente", + "Last cell" => "Ultima cella", + "Visible cells only" => "Solo celle visibili", + "Conditional formats" => "Formati condizionali", + "Data validation" => "Convalida dati", + "Horizontal axis title:" => "Titolo asse orizzontale:", + "Vertical axis title:" => "Titolo asse verticale:", + "No picture selected" => "Nessuna immagine selezionata", + "Picture file path (PNG or JPEG):" => "Percorso del file immagine (PNG o JPEG):", + "Description (optional):" => "Descrizione (facoltativa):", + "Fits inside the selected cell and moves with its content." => "Si adatta alla cella selezionata e si sposta insieme al suo contenuto.", + "Choose a PNG or JPEG no larger than 16 MB." => "Scegli un file PNG o JPEG di dimensioni non superiori a 16 MB.", + "About" => "Informazioni", + "Contributors" => "Collaboratori", + "Models" => "Modelli", + "Version {version}" => "Versione {version}", + "Join the ArtCraft Discord" => "Unisciti al Discord di ArtCraft", + "This workbook has no scripts or macros." => "Questa cartella di lavoro non contiene script o macro.", + "(unnamed)" => "(senza nome)", + "— VBA project (preserved, not run)" => "— Progetto VBA (conservato, non eseguito)", + "— 1 step" => "— 1 passaggio", + "— {steps} steps" => "— {steps} passaggi", + "Alignment" => "Allineamento", + "Font" => "Carattere", + "Border" => "Bordo", + "Format Cells|Fill" => "Riempimento", + "Protection" => "Protezione", + "Category:" => "Categoria:", + "Sample" => "Campione", + "Type (custom format code):" => "Tipo (codice di formato personalizzato):", + "Vertical" => "Verticale", + "Justify" => "Giustificato", + "Center Across Selection" => "Al centro della selezione", + "Distributed" => "Distribuito", + "Top" => "In alto", + "Bottom" => "In basso", + "Indent" => "Rientro", + "Orientation (degrees)" => "Orientamento (gradi)", + "Wrap text" => "Testo a capo", + "Shrink to fit" => "Riduci e adatta", + "Bold" => "Grassetto", + "Italic" => "Corsivo", + "None" => "Nessuno", + "Single" => "Singola", + "Double" => "Doppia", + "Single Accounting" => "Contabilità singola", + "Double Accounting" => "Contabilità doppia", + "Superscript" => "Apice", + "Subscript" => "Pedice", + "Color:" => "Colore:", + "Outline" => "Contorno", + "Diagonal ↘" => "Diagonale ↘", + "Diagonal ↗" => "Diagonale ↗", + "none" => "nessuno", + "thin" => "sottile", + "medium" => "medio", + "thick" => "spesso", + "dashed" => "tratteggiato", + "dotted" => "punteggiato", + "double" => "doppio", + "Background Color:" => "Colore sfondo:", + "Locked" => "Bloccata", + "Hidden" => "Nascosta", + "Search:" => "Cerca:", + "e.g. lookup, average, date" => "ad es. cerca, media, data", + "Date & Time" => "Data e ora", + "Lookup & Reference" => "Ricerca e riferimento", + "Math & Trig" => "Matematiche e trigonometriche", + "Statistical" => "Statistiche", + "Engineering" => "Ingegneria", + "Database" => "Database", + "Compatibility" => "Compatibilità", + "Web" => "Web", + "Cube" => "Cubo", + "Add-in and Automation" => "Componenti aggiuntivi e automazione", + "Find" => "Trova", + "Replace" => "Sostituisci", + "Find what:" => "Trova:", + "Replace with:" => "Sostituisci con:", + "Match case" => "Maiuscole/minuscole", + "Match entire cell contents" => "Confronta intero contenuto cella", + "Within workbook" => "Nella cartella di lavoro", + "Replace All" => "Sostituisci tutto", + "Find All" => "Trova tutti", + "Find Next" => "Trova successivo", + "All done. We made {count} replacements." => "Operazione completata. Sono state effettuate {count} sostituzioni.", + "{count} cell(s) found" => "{count} cella/e trovata/e", + "Reference:" => "Riferimento:", + "Special…" => "Speciale…", + "My list has headers" => "L'elenco contiene intestazioni", + "Sort by" => "Ordina per", + "Then by" => "Quindi per", + "Cell Values" => "Valori cella", + "Cell Color" => "Colore cella", + "A to Z" => "Dalla A alla Z", + "Z to A" => "Dalla Z alla A", + "+ Add Level" => "+ Aggiungi livello", + "New…" => "Nuovo…", + "Edit…" => "Modifica…", + "Name" => "Nome", + "Value" => "Valore", + "Refers To" => "Riferito a", + "Scope" => "Ambito", + "Workbook" => "Cartella di lavoro", + "No names defined" => "Nessun nome definito", + "Recommended Charts" => "Grafici consigliati", + "All Charts" => "Tutti i grafici", + "Clustered Column" => "Colonne raggruppate", + "Stacked Column" => "Colonne in pila", + "100% Stacked Column" => "Colonne in pila 100%", + "Clustered Bar" => "Barre raggruppate", + "Stacked Bar" => "Barre in pila", + "100% Stacked Bar" => "Barre in pila 100%", + "Line" => "Linee", + "Line with Markers" => "Linee con indicatori", + "Stacked Line" => "Linee in pila", + "Pie" => "Torta", + "Doughnut" => "Anello", + "Area" => "Area", + "Stacked Area" => "Area in pila", + "Scatter" => "Dispersione", + "Scatter with Lines" => "Dispersione con linee", + "Radar" => "Radar", + "Histogram" => "Istogramma", + "Waterfall" => "Cascata", + "Funnel" => "Imbuto", + "Combo" => "Combinato", + "Chart data range:" => "Intervallo dati del grafico:", + "Legend Entries (Series)" => "Voci legenda (serie)", + "Series{n}" => "Serie{n}", + "Keep" => "Mantieni", + "Remove" => "Rimuovi", + "Horizontal (Category) Axis Labels:" => "Etichette asse orizzontale (categoria):", + "There are no conditional formatting rules on this sheet." => "In questo foglio non sono presenti regole di formattazione condizionale.", + "applies to" => "si applica a", + "Type a command, e.g. freeze, chart, bold…" => "Digita un comando, ad es. blocca, grafico, grassetto…", + "Set cell:" => "Imposta cella:", + "To value:" => "Al valore:", + "By changing cell:" => "Cambiando la cella:", + "Goal Seeking found a solution: {value}" => "Ricerca obiettivo ha trovato una soluzione: {value}", + "Analysis Tools" => "Strumenti di analisi", + "Anova: Single Factor" => "Analisi varianza: a un fattore", + "Correlation" => "Correlazione", + "Covariance" => "Covarianza", + "Descriptive Statistics" => "Statistica descrittiva", + "Exponential Smoothing" => "Livellamento esponenziale", + "F-Test Two-Sample for Variances" => "Test F a due campioni per varianze", + "Moving Average" => "Media mobile", + "Rank and Percentile" => "Rango e percentile", + "Regression" => "Regressione", + "t-Test: Paired Two Sample for Means" => "Test t: due campioni accoppiati per medie", + "t-Test: Two-Sample Assuming Equal Variances" => "Test t: due campioni assumendo uguale varianza", + "t-Test: Two-Sample Assuming Unequal Variances" => "Test t: due campioni assumendo varianze diverse", + "Output options" => "Opzioni di output", + "Output Range:" => "Intervallo di output:", + "New Worksheet Ply:" => "Nuovo foglio di lavoro:", + "Grouped By:" => "Raggruppato per:", + "Labels in first row" => "Etichette nella prima riga", + "Input Range:" => "Intervallo di input:", + "Variable 1 Range:" => "Intervallo variabile 1:", + "Variable 2 Range:" => "Intervallo variabile 2:", + "Summary statistics" => "Riepilogo statistiche", + "Confidence Level for Mean (%), blank for none:" => "Livello di confidenza per la media (%), vuoto per nessuno:", + "Kth Largest (blank for none):" => "K-esimo più grande (vuoto per nessuno):", + "Kth Smallest (blank for none):" => "K-esimo più piccolo (vuoto per nessuno):", + "Bin Range (blank for automatic bins):" => "Intervallo classi (vuoto per classi automatiche):", + "Pareto (sorted histogram)" => "Pareto (istogramma ordinato)", + "Cumulative Percentage" => "Percentuale cumulativa", + "Alpha:" => "Alfa:", + "Input Y Range:" => "Intervallo Y di input:", + "Input X Range:" => "Intervallo X di input:", + "Constant is Zero" => "Costante uguale a zero", + "Confidence Level (%):" => "Livello di confidenza (%):", + "Residuals" => "Residui", + "Standardized Residuals" => "Residui standardizzati", + "Normal Probability" => "Probabilità normale", + "Interval:" => "Intervallo:", + "Standard Errors" => "Errori standard", + "Damping factor:" => "Fattore di smorzamento:", + "Hypothesized Mean Difference:" => "Differenza ipotizzata tra le medie:", + "Set Objective:" => "Imposta obiettivo:", + "To:" => "A:", + "Value Of:" => "Valore di:", + "By Changing Variable Cells:" => "Cambiando celle variabili:", + "Subject to the Constraints:" => "Soggetto ai vincoli:", + "Make Unconstrained Variables Non-Negative" => "Rendi non negative le variabili senza vincoli", + "Select a Solving Method:" => "Seleziona un metodo di risoluzione:", + "GRG Nonlinear" => "GRG non lineare", + "Solve" => "Risolvi", + "Keep Solver Solution" => "Mantieni soluzione di Solver", + "Restore Original Values" => "Ripristina valori originali", + "The spelling check is complete for the entire sheet." => "Il controllo ortografico è stato completato per l'intero foglio.", + "Not in Dictionary ({cell}):" => "Non nel dizionario ({cell}):", + "Suggestions:" => "Suggerimenti:", + "(No suggestions)" => "(Nessun suggerimento)", + "Ignore Once" => "Ignora una volta", + "Add to Dictionary" => "Aggiungi al dizionario", + "Change" => "Cambia", + "Change All" => "Cambia tutto", + "$ English (United States)" => "$ Inglese (Stati Uniti)", + "Add Chart Element" => "Aggiungi elemento grafico", + "Align Left" => "Allinea a sinistra", + "Align Right" => "Allinea a destra", + "Bottom Align" => "Allinea in basso", + "Calculate Now (F9)" => "Calcola ora (F9)", + "Calculate Sheet (⇧F9)" => "Calcola foglio (⇧F9)", + "Calculation Options" => "Opzioni di calcolo", + "Cell Styles" => "Stili cella", + "Change Chart Type" => "Cambia tipo di grafico", + "Check Accessibility" => "Verifica accessibilità", + "Clear Filter" => "Cancella filtro", + "Column or Bar" => "Colonne o barre", + "Comments pane" => "Riquadro commenti", + "Convert the last ink stroke to a shape" => "Converti l'ultimo tratto a penna in una forma", + "Convert to Range" => "Converti in intervallo", + "Copy" => "Copia", + "Custom Sort" => "Ordinamento personalizzato", + "Cut" => "Taglia", + "Define Name…" => "Definisci nome…", + "Delete Comment" => "Elimina commento", + "Delete Sheet" => "Elimina foglio", + "Delete chart" => "Elimina grafico", + "Delete…" => "Elimina…", + "Dismiss" => "Chiudi", + "Down" => "Giù", + "Edit chart title" => "Modifica titolo del grafico", + "Erase ink strokes" => "Cancella tratti a penna", + "Every command run in this session (replayable)" => "Tutti i comandi eseguiti in questa sessione (ripetibili)", + "Expand formula bar" => "Espandi barra della formula", + "Filter (⌘⇧F)" => "Filtro (⌘⇧F)", + "Filter by Selected Cell's Value" => "Filtra in base al valore della cella selezionata", + "Find & Select" => "Trova e seleziona", + "Flash Fill (⌘E)" => "Riempimento veloce (⌘E)", + "Forecast Sheet" => "Foglio previsioni", + "Forecast end (date or number; blank: a third of the history):" => "Fine previsione (data o numero; vuoto: un terzo dello storico):", + "Format Chart pane" => "Riquadro Formato grafico", + "Format as Table" => "Formatta come tabella", + "Hide" => "Nascondi", + "Hide Sheet" => "Nascondi foglio", + "Hierarchy & more" => "Gerarchia e altro", + "Highlighter" => "Evidenziatore", + "How agents drive GridCraft (MCP / control channel)" => "Come gli agenti controllano GridCraft (MCP / canale di controllo)", + "Import a text or CSV file" => "Importa un file di testo o CSV", + "Insert Function" => "Inserisci funzione", + "Insert Function (⇧F3)" => "Inserisci funzione (⇧F3)", + "Insert Link (⌘K)" => "Inserisci collegamento (⌘K)", + "Insert Sheet" => "Inserisci foglio", + "Insert Slicer" => "Inserisci filtro dati", + "Insert a picture" => "Inserisci un'immagine", + "Insert a slicer to filter a table" => "Inserisci un filtro dati per filtrare una tabella", + "Insert an icon" => "Inserisci un'icona", + "Insert…" => "Inserisci…", + "Line or Area" => "Linee o aree", + "Link…" => "Collegamento…", + "Macros and scripts in this workbook (Alt+F8)" => "Macro e script in questa cartella di lavoro (Alt+F8)", + "Middle Align" => "Allinea al centro", + "More commands" => "Altri comandi", + "Move or Copy Sheet…" => "Sposta o copia foglio…", + "New sheet (⇧F11)" => "Nuovo foglio (⇧F11)", + "Next sheet" => "Foglio successivo", + "Page Breaks" => "Interruzioni di pagina", + "Paper Size" => "Dimensioni", + "Paste (⌘V)" => "Incolla (⌘V)", + "Pick From Drop-down List…" => "Scegli da elenco a discesa…", + "Pie or Doughnut" => "Torta o anello", + "Previous sheet" => "Foglio precedente", + "Print Area" => "Area di stampa", + "Print Titles" => "Stampa titoli", + "Protect Workbook structure" => "Proteggi struttura della cartella di lavoro", + "Redo (⌘Y)" => "Ripeti (⌘Y)", + "Save (⌘S)" => "Salva (⌘S)", + "Scatter or Bubble" => "Dispersione o bolle", + "Search and run any command" => "Cerca ed esegui qualsiasi comando", + "Search commands (⌘⇧Space)" => "Cerca comandi (⌘⇧Space)", + "Select and move ink and shapes" => "Seleziona e sposta tratti a penna e forme", + "Series…" => "Serie…", + "Share: export or save a copy" => "Condividi: esporta o salva una copia", + "Show Formulas (⌃`)" => "Mostra formule (⌃`)", + "Slicer" => "Filtro dati", + "Sort & Filter" => "Ordina e filtra", + "Spelling (F7)" => "Controllo ortografia (F7)", + "Statistic" => "Statistici", + "Switch Row/Column" => "Inverti riga/colonna", + "Table (⌘T)" => "Tabella (⌘T)", + "Table Styles" => "Stili tabella", + "Text to Columns" => "Testo in colonne", + "The output range already holds data. Replace it with the report?" => { + "L'intervallo di output contiene già dei dati. Sostituirli con il report?" + } + "Top Align" => "Allinea in alto", + "Undo (⌘Z)" => "Annulla (⌘Z)", + "Undo list" => "Elenco azioni annullabili", + "Unhide Sheet…" => "Scopri foglio…", + "Up" => "Su", + "Version, contributors and the AI models that helped" => "Versione, collaboratori e modelli di IA che hanno contribuito", + "What-If Analysis" => "Analisi di simulazione", + "Zoom In" => "Ingrandisci", + "Zoom Out" => "Riduci", + "Zoom to 100%" => "Zoom al 100%", + "Zoom to Selection" => "Zoom sulla selezione", + "Zoom…" => "Zoom…", + "£ English (United Kingdom)" => "£ Inglese (Regno Unito)", + "¥ Japanese" => "¥ Giapponese", + "€ Euro" => "€ Euro", + "Tab|Insert" => "Inserisci", + "AutoSave" => "Salvataggio automatico", + "Insert\nSlicer" => "Inserisci\nfiltro dati", + "Pen\nBlack" => "Penna\nnera", + "Pen\nBlue" => "Penna\nblu", + "Pen\nRed" => "Penna\nrossa", + "Protect\nSheet" => "Proteggi\nfoglio", + "Watch\nWindow" => "Finestra\ncontrolli", + "Workbook\nStatistics" => "Statistiche\ncartella di lavoro", + // The PivotTable Fields task pane. + "PivotTable Fields" => "Campi tabella pivot", + "Choose fields to add to report:" => "Scegli i campi da aggiungere al report:", + "Use a field's menu to move it between areas:" => "Usa il menu di un campo per spostarlo tra le aree:", + "Filters" => "Filtri", + "Values" => "Valori", + "Move to Row Labels" => "Sposta in Etichette di riga", + "Move to Column Labels" => "Sposta in Etichette di colonna", + "Move to Report Filter" => "Sposta in Filtro rapporto", + "Move to Values" => "Sposta in Valori", + "Summarize by Sum" => "Riepiloga per somma", + "Summarize by Count" => "Riepiloga per conteggio", + "Summarize by Average" => "Riepiloga per media", + "Summarize by Max" => "Riepiloga per massimo", + "Summarize by Min" => "Riepiloga per minimo", + "Show as No Calculation" => "Mostra come nessun calcolo", + "Show as % of Grand Total" => "Mostra come % del totale complessivo", + "Show as Running Total" => "Mostra come totale parziale", + "Show as Rank" => "Mostra come rango", + "Group by Years" => "Raggruppa per anni", + "Group by Quarters" => "Raggruppa per trimestri", + "Group by Months" => "Raggruppa per mesi", + "Remove Field" => "Rimuovi campo", + "Refresh" => "Aggiorna", + "Calculated Field…" => "Campo calcolato…", + "Report Layout" => "Layout del report", + "Compact" => "Compatto", + "Tabular" => "Tabulare", + _ => return None, + }) +} diff --git a/crates/ui-egui/tests/interaction.rs b/crates/ui-egui/tests/interaction.rs index b40769cf8..c2cb0bafc 100644 --- a/crates/ui-egui/tests/interaction.rs +++ b/crates/ui-egui/tests/interaction.rs @@ -364,6 +364,7 @@ fn language_switch_translates_the_ribbon_and_persists() { (Language::Ru, "Данные"), (Language::PtBr, "Dados"), (Language::De, "Daten"), + (Language::It, "Dati"), ] { h.state_mut().run("app.language.set", json!({"language": language.code()})).unwrap(); h.run_steps(2); // every locale renders the ribbon without panicking diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 09197ff6c..c9af22d8e 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-12 · **Change:** minor (Format Cells dialog looks its labels up in the catalog) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-15 · **Change:** minor (Italian catalog) · **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, @@ -53,6 +53,7 @@ separators, number/date formats, machine translation with agent review, and scri | Indonesian | id | 0 (0%) | no | Latin: yes | no | none | 5–8 h | | Japanese | ja | 268 (~12%) | no | CJK system-font fallback; IME unverified; no furigana display | no | menus only | 8–12 h | | German | de | 266 (~12%) | no | Latin: yes | no | menus only | 4–8 h | +| Italian | it | 971 (~44%) | dialogs, tooltips, pivot pane | Latin: yes | no | menus, File view, dialogs, pivot pane | 3–5 h | | 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 | @@ -78,6 +79,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-15 | minor | Italian catalog (`i18n/it.rs`, 971 entries, ~44%): every key the Brazilian Portuguese catalog translates plus the PivotTable Fields pane strings; `it` locale tags (it-IT, it-CH…) resolve to Italian. Labels follow Excel's Italian terminology; native-speaker review still pending | | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | | 2026-10-11 | minor | German ribbon catalog (`i18n/de.rs`, 266 labels, ~12%); `de` locale tags (de-DE, de-AT, de-CH…) resolve to German. PR #163 (localized German formulas/numbers) still open | From a770845ebf829bd2a6ab674c91efae533bc8c892 Mon Sep 17 00:00:00 2001 From: icsimpianti <323158913+icsimpianti@users.noreply.github.com> Date: Thu, 15 Oct 2026 09:21:15 +0200 Subject: [PATCH 08/33] i18n(it): align ten labels with Excel's Italian terminology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Larghezza predefinita, Cancella regole dall'intero foglio, Foglio previsione, Giorno feriale, Singola/Doppia contabilità, Statistiche, Layout rapporto, and the Space key name in the command search hint. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/i18n/it.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/ui-egui/src/i18n/it.rs b/crates/ui-egui/src/i18n/it.rs index 80c181cdb..92c564f4c 100644 --- a/crates/ui-egui/src/i18n/it.rs +++ b/crates/ui-egui/src/i18n/it.rs @@ -253,7 +253,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Bottom 10%" => "Ultimi 10%", "Above Average" => "Sopra la media", "Below Average" => "Sotto la media", - "Clear Rules from Entire Sheet" => "Cancella regole da tutto il foglio", + "Clear Rules from Entire Sheet" => "Cancella regole dall'intero foglio", "Clear Rules from Selected Cells" => "Cancella regole dalle celle selezionate", "Constants" => "Costanti", "Data Bars" => "Barre dei dati", @@ -430,7 +430,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Select Data" => "Seleziona dati", "Row Height" => "Altezza righe", "Column Width" => "Larghezza colonne", - "Standard Width" => "Larghezza standard", + "Standard Width" => "Larghezza predefinita", "Rename Sheet" => "Rinomina foglio", "Move or Copy" => "Sposta o copia", "Protect Sheet" => "Proteggi foglio", @@ -538,7 +538,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Growth" => "Esponenziale", "Date unit" => "Unità di data", "Day" => "Giorno", - "Weekday" => "Giorno lavorativo", + "Weekday" => "Giorno feriale", "Month" => "Mese", "Year" => "Anno", "Step value:" => "Incremento:", @@ -692,8 +692,8 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "None" => "Nessuno", "Single" => "Singola", "Double" => "Doppia", - "Single Accounting" => "Contabilità singola", - "Double Accounting" => "Contabilità doppia", + "Single Accounting" => "Singola contabilità", + "Double Accounting" => "Doppia contabilità", "Superscript" => "Apice", "Subscript" => "Pedice", "Color:" => "Colore:", @@ -880,7 +880,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Filter by Selected Cell's Value" => "Filtra in base al valore della cella selezionata", "Find & Select" => "Trova e seleziona", "Flash Fill (⌘E)" => "Riempimento veloce (⌘E)", - "Forecast Sheet" => "Foglio previsioni", + "Forecast Sheet" => "Foglio previsione", "Forecast end (date or number; blank: a third of the history):" => "Fine previsione (data o numero; vuoto: un terzo dello storico):", "Format Chart pane" => "Riquadro Formato grafico", "Format as Table" => "Formatta come tabella", @@ -920,7 +920,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Save (⌘S)" => "Salva (⌘S)", "Scatter or Bubble" => "Dispersione o bolle", "Search and run any command" => "Cerca ed esegui qualsiasi comando", - "Search commands (⌘⇧Space)" => "Cerca comandi (⌘⇧Space)", + "Search commands (⌘⇧Space)" => "Cerca comandi (⌘⇧Spazio)", "Select and move ink and shapes" => "Seleziona e sposta tratti a penna e forme", "Series…" => "Serie…", "Share: export or save a copy" => "Condividi: esporta o salva una copia", @@ -928,7 +928,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Slicer" => "Filtro dati", "Sort & Filter" => "Ordina e filtra", "Spelling (F7)" => "Controllo ortografia (F7)", - "Statistic" => "Statistici", + "Statistic" => "Statistiche", "Switch Row/Column" => "Inverti riga/colonna", "Table (⌘T)" => "Tabella (⌘T)", "Table Styles" => "Stili tabella", @@ -985,7 +985,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Remove Field" => "Rimuovi campo", "Refresh" => "Aggiorna", "Calculated Field…" => "Campo calcolato…", - "Report Layout" => "Layout del report", + "Report Layout" => "Layout rapporto", "Compact" => "Compatto", "Tabular" => "Tabulare", _ => return None, From e1e02f82f10d67cff4159a235c2ec9bbb8a7969f Mon Sep 17 00:00:00 2001 From: icsimpianti <323158913+icsimpianti@users.noreply.github.com> Date: Thu, 15 Oct 2026 09:21:40 +0200 Subject: [PATCH 09/33] i18n(it): Foglio previsione on the ribbon button too Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/i18n/it.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ui-egui/src/i18n/it.rs b/crates/ui-egui/src/i18n/it.rs index 92c564f4c..163e67d97 100644 --- a/crates/ui-egui/src/i18n/it.rs +++ b/crates/ui-egui/src/i18n/it.rs @@ -189,7 +189,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Data Table…" => "Tabella dati…", "Scenario Manager…" => "Gestione scenari…", "Goal Seek…" => "Ricerca obiettivo…", - "Forecast\nSheet" => "Foglio\nprevisioni", + "Forecast\nSheet" => "Foglio\nprevisione", "Spelling" => "Controllo ortografia", "Check\nAccessibility" => "Verifica\naccessibilità", "Threaded Comments" => "Commenti in thread", From c04c85579ab6014cb3bcd2dc02c9fa365f8a6c99 Mon Sep 17 00:00:00 2001 From: War2Darius <45015242+War2Darius@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:59:13 +0300 Subject: [PATCH 10/33] Add Ukrainian localization (uk.rs) --- crates/ui-egui/src/i18n/uk.rs | 415 ++++++++++++++++++++++++++++++++++ 1 file changed, 415 insertions(+) create mode 100644 crates/ui-egui/src/i18n/uk.rs diff --git a/crates/ui-egui/src/i18n/uk.rs b/crates/ui-egui/src/i18n/uk.rs new file mode 100644 index 000000000..389f3b68e --- /dev/null +++ b/crates/ui-egui/src/i18n/uk.rs @@ -0,0 +1,415 @@ +//! Ukrainian translations for the interface strings in i18n.rs. + +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Вставити", + "Paste Values" => "Вставити значення", + "Paste Formulas" => "Вставити формули", + "Paste Formatting" => "Вставити форматування", + "Transpose" => "Транспонувати", + "Paste Link" => "Вставити зв'язок", + "Paste Special…" => "Спеціальна вставка…", + "Insert Copied Cells" => "Вставити скопійовані комірки", + "Insert Copied Cells…" => "Вставити скопійовані комірки…", + "Insert Cut Cells" => "Вставити вирізані комірки", + "Insert Paste" => "Вставка зі зсувом", + "Cut (⌘X)" => "Вирізати (⌘X)", + "Copy (⌘C)" => "Копіювати (⌘C)", + "Format Painter (double-click to keep it on)" => "Формат за зразком (двічі клацніть, щоб закріпити)", + "Bold (⌘B)" => "Жирний (⌘B)", + "Italic (⌘I)" => "Курсив (⌘I)", + "Underline (⌘U)" => "Підкреслення (⌘U)", + "Double Underline" => "Подвійне підкреслення", + "Strikethrough" => "Перекреслення", + "Underline" => "Підкреслення", + "Increase Font Size" => "Збільшити розмір шрифту", + "Decrease Font Size" => "Зменшити розмір шрифту", + "Wrap Text" => "Переносити текст", + "Merge & Center" => "Об'єднати і розмістити по центру", + "Merge Cells" => "Об'єднати комірки", + "Merge Across" => "Об'єднати за рядками", + "Unmerge Cells" => "Роз'єднати комірки", + "Fill Color" => "Колір заливки", + "Font Color" => "Колір шрифту", + "Borders" => "Межі", + "Top\nAlign" => "За верхнім\nкраєм", + "Middle\nAlign" => "За серединою\nвертикально", + "Bottom\nAlign" => "За нижнім\nкраєм", + "Left" => "Ліворуч", + "Right" => "Праворуч", + "Center" => "По центру", + "Horizontal" => "За горизонталлю", + "Vertical Text" => "Вертикальний текст", + "Decrease Indent" => "Зменшити відступ", + "Increase Indent" => "Збільшити відступ", + "Orientation" => "Орієнтація", + "Angle Counterclockwise" => "Повернути проти годинникової стрілки", + "Angle Clockwise" => "Повернути за годинниковою стрілкою", + "Rotate Text Up" => "Повернути текст угору", + "Rotate Text Down" => "Повернути текст униз", + "Accounting Number Format" => "Фінансовий числовий формат", + "Percent Style" => "Відсотковий формат", + "Comma Style" => "Розділювач розрядів", + "Increase Decimal" => "Збільшити розрядність", + "Decrease Decimal" => "Зменшити розрядність", + "More Accounting Formats…" => "Інші фінансові формати…", + "Conditional\nFormatting" => "Умовне\nформатування", + "Conditional Formatting" => "Умовне форматування", + "Format\nas Table" => "Форматувати\nяк таблицю", + "Cell\nStyles" => "Стилі\nкомірок", + "Format Cells…" => "Формат комірок…", + "Format Cell Alignment…" => "Вирівнювання комірок…", + "Format\nPane" => "Область\nформатування", + "Format" => "Формат", + "Insert" => "Вставити", + "Insert Cells…" => "Вставити комірки…", + "Delete" => "Видалити", + "Delete Cells…" => "Видалити комірки…", + "Insert Sheet Rows" => "Вставити рядки аркуша", + "Insert Sheet Columns" => "Вставити стовпці аркуша", + "Delete Sheet Rows" => "Видалити рядки аркуша", + "Delete Sheet Columns" => "Видалити стовпці аркуша", + "Row Height…" => "Висота рядка…", + "AutoFit Row Height" => "Автопідбір висоти рядка", + "Column Width…" => "Ширина стовпця…", + "AutoFit Column Width" => "Автопідбір ширини стовпця", + "Default Width…" => "Ширина за замовчуванням…", + "Hide Rows" => "Сховати рядки", + "Unhide Rows" => "Показати рядки", + "Hide Columns" => "Сховати стовпці", + "Unhide Columns" => "Показати стовпці", + "Lock Cell" => "Заблокувати комірку", + "Clear" => "Очистити", + "Clear All" => "Очистити все", + "Clear Formats" => "Очистити формати", + "Clear Contents" => "Очистити вміст", + "Clear Comments and Notes" => "Видалити коментарі та нотатки", + "Clear Hyperlinks" => "Видалити гіперпосилання", + "AutoSum" => "Автосума", + "AutoSum (⌘⇧T)" => "Автосума (⌘⇧T)", + "Flash\nFill" => "Миттєве\nзаповнення", + "Flash Fill" => "Миттєве заповнення", + "Fill" => "Заповнити", + "Clear Print Area" => "Очистити область друку", + "Find &\nSelect" => "Знайти і\nвиділити", + "Find…" => "Знайти…", + "Replace…" => "Замінити…", + "Go To…" => "Перейти…", + "Go To Special…" => "Виділити групу комірок…", + "PivotTable" => "Зведена таблиця", + "Recommended\nCharts" => "Рекомендовані\nдіаграми", + "Table" => "Таблиця", + "Pictures" => "Зображення", + "Shapes" => "Фігури", + "Icons" => "Значки", + "Text\nBox" => "Текстове\nполе", + "Comment" => "Коментар", + "New\nComment" => "Новий\nкоментар", + "New Note" => "Нова нотатка", + "Show/Hide Note" => "Показати/сховати нотатку", + "Header &\nFooter" => "Верхній і\nнижній колонтитули", + "Text to\nColumns" => "Текст\nу стовпці", + "Link" => "Посилання", + "Symbol" => "Символ", + "Sparklines" => "Спарклайни", + "Checkbox" => "Прапорець", + "Insert checkboxes in the selected cells" => "Вставити прапорці у виділені комірки", + "Header & Footer" => "Верхній і нижній колонтитули", + "Draw with ink" => "Малювання від руки", + "Eraser" => "Гумка", + "Ink to\nShape" => "Перетворити рукописний\nввід на фігуру", + "Select\nObjects" => "Вибрати\nоб'єкти", + "Themes" => "Теми", + "Margins" => "Поля", + "Left Margin" => "Ліве поле", + "Right Margin" => "Праве поле", + "Top Margin" => "Верхнє поле", + "Bottom Margin" => "Нижнє поле", + "Header Margin" => "Поле верхнього колонтитула", + "Footer Margin" => "Поле нижнього колонтитула", + "Size" => "Розмір", + "Print\nArea" => "Область\nдруку", + "Set Print Area" => "Задати область друку", + "Breaks" => "Розриви", + "Insert Page Break" => "Вставити розрив сторінки", + "Remove Page Break" => "Видалити розрив сторінки", + "Reset All Page Breaks" => "Скинути всі розриви сторінок", + "Print\nTitles" => "Друкувати\nзаголовки", + "Sheet\nRight-to-Left" => "Аркуш\nправоруч наліво", + "Sheet Right-to-Left" => "Аркуш праворуч наліво", + "Narrow" => "Вузькі", + "Wide" => "Широкі", + "Normal" => "Звичайні", + "Portrait" => "Книжкова", + "Landscape" => "Альбомна", + "Custom Margins…" => "Нетипові поля…", + "Insert\nFunction" => "Вставити\nфункцію", + "Name\nManager" => "Менеджер\nімен", + "Define Name" => "Присвоїти ім'я", + "Use in Formula" => "Використати у формулі", + "Create from Selection" => "Створити з виділеного", + "Trace Precedents" => "Впливальні комірки", + "Trace Dependents" => "Залежні комірки", + "Remove Arrows" => "Прибрати стрілки", + "Show Formulas" => "Показати формули", + "Error Checking" => "Перевірка помилок", + "Evaluate Formula" => "Обчислити формулу", + "Watch Window" => "Окно контрольних значень", + "Calculation\nOptions" => "Параметри\nобчислень", + "Calculate Now" => "Обчислити зараз", + "Calculate Sheet" => "Обчислити аркуш", + "Automatic" => "Автоматично", + "Automatic Except for Data Tables" => "Автоматично, крім таблиць даних", + "Manual" => "Вручну", + "Sort &\nFilter" => "Сортування і\nфільтр", + "Sort" => "Сортування", + "Sort A to Z" => "Сортування від А до Я", + "Sort Z to A" => "Сортування від Я до А", + "Custom Sort…" => "Нетипове сортування…", + "Filter" => "Фільтр", + "Reapply" => "Повторити", + "Get Data\n(Text/CSV)" => "Отримати дані\n(текст/CSV)", + "Remove\nDuplicates" => "Видалити\nдублікати", + "Data\nValidation" => "Перевірка\nданих", + "Data Validation" => "Перевірка даних", + "Data Validation…" => "Перевірка даних…", + "Circle Invalid Data" => "Обвести неправильні дані", + "Clear Validation" => "Очистити перевірку даних", + "Group" => "Групувати", + "Ungroup" => "Розгрупувати", + "Show Detail" => "Показати деталі", + "Hide Detail" => "Сховати деталі", + "Subtotal" => "Проміжний підсумок", + "Data\nAnalysis" => "Аналіз даних", + "Data Analysis" => "Аналіз даних", + "Solver" => "Пошук рішення", + "What-If\nAnalysis" => "Аналіз «що\nякщо»", + "Data Table…" => "Таблиця даних…", + "Scenario Manager…" => "Менеджер сценаріїв…", + "Goal Seek…" => "Підбір параметра…", + "Forecast\nSheet" => "Аркуш\nпрогнозу", + "Spelling" => "Орфографія", + "Check\nAccessibility" => "Перевірка\nдоступності", + "Threaded Comments" => "Коментарі з гілками", + "Show\nComments" => "Показати\nкоментарі", + "Previous" => "Назад", + "Next" => "Далі", + "Previous Comment" => "Попередній коментар", + "Next Comment" => "Наступний коментар", + "Show All Notes" => "Показати всі нотатки", + "Convert to Comments" => "Перетворити на коментарі", + "Protect\nWorkbook" => "Захистити\nкнигу", + "Allow Edit\nRanges" => "Дозволити\nредагування діапазонів", + "Allow Edit Ranges" => "Дозволити редагування діапазонів", + "Unprotect\nSheet" => "Зняти захист\nаркуша", + "Protect Sheet…" => "Захистити аркуш…", + "Comments" => "Коментарі", + "Notes" => "Нотатки", + "Page Break\nPreview" => "Попередній перегляд\nрозривів сторінок", + "Page\nLayout" => "Розмітка\nсторінки", + "Formula Bar" => "Рядок формул", + "Gridlines" => "Сітка", + "Headings" => "Заголовки", + "Zoom" => "Масштаб", + "100%" => "100%", + "Zoom to\nSelection" => "Масштаб за\nвиділенням", + "Freeze\nPanes" => "Закріпити\nобласті", + "Freeze Panes" => "Закріпити області", + "Freeze Top Row" => "Закріпити верхній рядок", + "Freeze First Column" => "Закріпити перший стовпець", + "Unfreeze Panes" => "Зняти закріплення областей", + "Dark Mode" => "Темний режим", + "Interface language" => "Мова інтерфейсу", + "Interface size" => "Розмір інтерфейсу", + "Auto" => "Авто", + "Drag to freeze columns" => "Перетягніть, щоб закріпити стовпці", + "Drag to freeze rows" => "Перетягніть, щоб закріпити рядки", + "Command\nPalette" => "Палітра\nкоманд", + "Agent\nControl" => "Керування\nагентом", + "Action\nJournal" => "Журнал\nдій", + "About\nGridCraft" => "Про\nGridCraft", + "Share" => "Поділитися", + "Add Chart\nElement" => "Додати елемент\nдіаграми", + "Change\nChart Type" => "Змінити тип\nдіаграми", + "Switch\nRow/Column" => "Поміняти\nрядки/стовпці", + "Select\nData" => "Вибрати\nдані", + "Data Labels: None" => "Підписи даних: немає", + "Data Labels: Show" => "Підписи даних: показати", + "Legend: None" => "Легенда: немає", + "Legend: Bottom" => "Легенда: знизу", + "Legend: Top" => "Легенда: згори", + "Legend: Right" => "Легенда: праворуч", + "Gridlines: None" => "Лінії сітки: немає", + "Gridlines: Show" => "Лінії сітки: показати", + "Chart\nTitle" => "Назва\nдіаграми", + "Delete\nChart" => "Видалити\nдіаграму", + "Convert\nto Range" => "Перетворити\nна діапазон", + "Table\nStyles" => "Стилі\nтаблиць", + "Top 10 Items" => "Перші 10 елементів", + "Top 10%" => "Найбільші 10%", + "Bottom 10 Items" => "Останні 10 елементів", + "Bottom 10%" => "Найменші 10%", + "Above Average" => "Вище середнього", + "Below Average" => "Нижче середнього", + "Clear Rules from Entire Sheet" => "Очистити правила на всьому аркуші", + "Clear Rules from Selected Cells" => "Очистити правила для виділених комірок", + "Constants" => "Константи", + "Data Bars" => "Гістограми", + "Color Scales" => "Кольорові шкали", + "Icon Sets" => "Набори значків", + "Home" => "Головна", + "Draw" => "Малювання", + "Page Layout" => "Розмітка сторінки", + "Formulas" => "Формули", + "Data" => "Дані", + "Review" => "Рецензування", + "View" => "Вигляд", + "Automate" => "Автоматизація", + "Table Design" => "Конструктор таблиць", + "Chart Design" => "Конструктор діаграм", + "Ready" => "Готово", + "Enter" => "Ввід", + "Edit" => "Редагування", + "Point" => "Вказання", + "Calculate" => "Обчислення", + "Select destination and press Enter or choose Paste" => "Виберіть місце вставлення та натисніть Enter або виберіть «Вставити»", + "General" => "Загальний", + "Number" => "Числовий", + "Currency" => "Грошовий", + "Accounting" => "Фінансовий", + "Date" => "Дата", + "Time" => "Час", + "Percentage" => "Відсотковий", + "Fraction" => "Дробовий", + "Scientific" => "Експоненціальний", + "Text" => "Текстовий", + "Special" => "Спеціальний", + "Custom" => "Користувацький", + "Short Date" => "Коротка дата", + "Long Date" => "Довга дата", + "More Number Formats…" => "Інші числові формати…", + "Financial" => "Фінансові", + "Logical" => "Логічні", + "Date &\nTime" => "Дата і\nчас", + "Lookup &\nReference" => "Пошук і\nпосилання", + "Math &\nTrig" => "Математичні і\nтригонометричні", + "More\nFunctions" => "Інші\nфункції", + "Page Layout|Orientation" => "Орієнтація", + "Display theme" => "Тема оформлення", + "Animations" => "Анімація", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "Рамка виділення плавно ковзає до нової комірки, а не перескакує" + } + "System" => "Системна", + "Light" => "Світла", + "Dark" => "Темна", + "Sheet Options|View" => "На екрані", + "Print" => "Друк", + // Page Layout view and the Header & Footer tab. + "Click to add data" => "Клацніть, щоб додати дані", + "Add header" => "Додати верхній колонтитул", + "Add footer" => "Додати нижній колонтитул", + "(none)" => "(немає)", + "Header" => "Верхній колонтитул", + "Footer" => "Нижній колонтитул", + "Page\nNumber" => "Номер\nсторінки", + "Number\nof Pages" => "Кількість\nсторінок", + "Current\nDate" => "Поточна\nдата", + "Current\nTime" => "Поточний\nчас", + "File\nPath" => "Шлях\nдо файлу", + "File\nName" => "Ім'я\nфайлу", + "Sheet\nName" => "Ім'я\nаркуша", + "Go to\nHeader" => "Перейти до верхнього\nколонтитула", + "Go to\nFooter" => "Перейти до нижнього\nколонтитула", + "Page Number" => "Номер сторінки", + "Number of Pages" => "Кількість сторінок", + "Current Date" => "Поточна дата", + "Current Time" => "Поточний час", + "File Path" => "Шлях до файлу", + "File Name" => "Ім'я файлу", + "Sheet Name" => "Ім'я аркуша", + "Go to Header" => "Перейти до верхнього колонтитула", + "Different First Page" => "Окремий колонтитул для першої сторінки", + "Different Odd & Even Pages" => "Різні колонтитули для парних і непарних сторінок", + "Go to Footer" => "Перейти до нижнього колонтитула", + "Ruler" => "Лінійка", + // File › Backstage view. + "File" => "Файл", + "Back" => "Назад", + "New" => "Створити", + "Open" => "Відкрити", + "Info" => "Відомості", + "Save" => "Зберегти", + "Save As" => "Зберегти як", + "Export" => "Експорт", + "Close" => "Закрити", + "Options" => "Параметри", + "Blank workbook" => "Порожня книга", + "Recent" => "Останні", + "No recent workbooks yet." => "Нещодавніх книг поки немає.", + "More workbooks" => "Інші книги", + "Modified" => "Змінено", + "Not available" => "Недоступно", + "Just now" => "Щойно", + "Yesterday" => "Вчора", + "{n} min ago" => "{n} хв тому", + "{n} h ago" => "{n} год тому", + "{n} days ago" => "{n} дн тому", + "{n} weeks ago" => "{n} тиж тому", + "{n} months ago" => "{n} міс тому", + "{n} years ago" => "{n} р. тому", + "Browse…" => "Огляд…", + "Not saved yet" => "Ще не збережено", + "Location" => "Розташування", + "Sheets" => "Аркуші", + "Protect Workbook" => "Захистити книгу", + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "Структура аркушів заблокована: аркуші не можна додавати, переміщувати, перейменовувати чи видаляти." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Заблокувати структуру аркушів, щоб їх не можна було додавати, переміщувати, перейменовувати чи видаляти." + } + "Properties" => "Властивості", + "Title" => "Назва", + "Subject" => "Тема", + "Author" => "Автор", + "Company" => "Організація", + "Keywords" => "Ключові слова", + "Description" => "Опис", + "No workbook is open." => "Немає відкритих книг.", + "Save as type" => "Тип файлу", + "Excel Workbook (*.xlsx)" => "Книга Excel (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (розділювач — кома) (*.csv)", + "Web Page (*.html)" => "Веб-сторінка (*.html)", + "PDF (*.pdf)" => "Файл PDF (*.pdf)", + "Download" => "Завантажити", + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "CSV-файл, веб-сторінка чи PDF — це копія: книга залишається у своєму файлі." + } + "Save the workbook under another name or in another folder." => "Зберегти книгу під іншим іменем або в іншій теці.", + "Print Active Sheets" => "Надрукувати активні аркуші", + "Print Entire Workbook" => "Надрукувати всю книгу", + "Fit Sheet on One Page" => "Вмістити аркуш на одну сторінку", + "Page Setup…" => "Параметри сторінки…", + "Page {page} of {pages}" => "Сторінка {page} з {pages}", + "Nothing to print." => "Немає що друкувати.", + "Previous page" => "Попередня сторінка", + "Next page" => "Наступна сторінка", + "Create PDF" => "Створити PDF", + "Save the sheet as a PDF document that keeps its page layout." => "Зберегти аркуш як PDF-документ із збереженням розмітки сторінки.", + "Change File Type" => "Змінити тип файлу", + "CSV (Comma delimited)" => "CSV (розділювачі — коми)", + "Save the active sheet as comma-separated text." => "Зберегти активний аркуш як текст із розділювачами-комами.", + "Web Page (.html)" => "Веб-сторінка (.html)", + "Save the workbook as a web page." => "Зберегти книгу як веб-сторінку.", + "Options|General" => "Загальні", + "Options|Save" => "Збереження", + "Show formula bar" => "Показувати рядок формул", + "Enable AutoComplete for cell values" => "Увімкнути автозавершення значень комірок", + "Save .xlsx workbooks automatically after every change" => "Автоматично зберігати книги .xlsx після кожної зміни", + "Workbook calculation" => "Обчислення в книзі", + "Enable iterative calculation" => "Увімкнути ітеративні обчислення", + "Calculation settings are saved with the workbook." => "Параметри обчислень зберігаються разом із книгою.", + _ => return None, + }) +} From 0fe4cd840c90749eba7b55b97836d78c2b257e87 Mon Sep 17 00:00:00 2001 From: thanhbv102-arch Date: Sat, 17 Oct 2026 20:19:47 +0700 Subject: [PATCH 11/33] i18n: add Vietnamese interface translations Adds Language::Vi (vi), following the per-language module pattern (crates/ui-egui/src/i18n/.rs). All 398 strings in the master table are covered, checked by the completeness test; vi-VN locale tags resolve to Vietnamese. --- crates/ui-egui/src/i18n.rs | 16 +- crates/ui-egui/src/i18n/vi.rs | 416 ++++++++++++++++++++++++++++++++++ docs/localization-parity.md | 3 +- 3 files changed, 433 insertions(+), 2 deletions(-) create mode 100644 crates/ui-egui/src/i18n/vi.rs diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 061698df9..d8584bb8d 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -17,6 +17,7 @@ mod ko; mod pt; mod ru; mod sr; +mod vi; mod zh; #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] @@ -35,10 +36,12 @@ pub enum Language { Cs, Fr, Sr, + Vi, } 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::Vi]; /// 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::Vi => "Tiếng Việt", } } @@ -71,6 +75,7 @@ impl Language { Self::Cs => "cs", Self::Fr => "fr", Self::Sr => "sr", + Self::Vi => "vi", } } @@ -91,6 +96,7 @@ impl Language { "cs" => Some(Self::Cs), "fr" => Some(Self::Fr), "sr" => Some(Self::Sr), + "vi" => Some(Self::Vi), _ => None, } } @@ -129,6 +135,7 @@ impl Language { Self::Cs => cs::translate(text), Self::Fr => fr::translate(text), Self::Sr => sr::translate(text), + Self::Vi => vi::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!(vi::translate(english).is_some_and(|text| !text.is_empty()), "missing Vietnamese: {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::Vi.tr("Data"), "Dữ liệu"); + assert_eq!(Language::Vi.tr("Sheet1!A1"), "Sheet1!A1"); + assert_eq!(Language::Vi.tr("Page Layout|Orientation"), "Hướng giấy"); + assert_eq!(Language::Vi.tr("Orientation"), "Hướng chữ"); assert_eq!(Language::parse("xx"), None); } @@ -685,6 +697,8 @@ 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("vi-VN"), Some(Language::Vi)); + assert_eq!(Language::parse("vi"), Some(Language::Vi)); } #[test] diff --git a/crates/ui-egui/src/i18n/vi.rs b/crates/ui-egui/src/i18n/vi.rs new file mode 100644 index 000000000..06eaa8342 --- /dev/null +++ b/crates/ui-egui/src/i18n/vi.rs @@ -0,0 +1,416 @@ +//! Vietnamese translations for the interface strings in i18n.rs. Labels follow the wording +//! Vietnamese spreadsheet users know; anything absent falls back to English. + +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Dán", + "Paste Values" => "Dán giá trị", + "Paste Formulas" => "Dán công thức", + "Paste Formatting" => "Dán định dạng", + "Transpose" => "Chuyển vị", + "Paste Link" => "Dán liên kết", + "Paste Special…" => "Dán đặc biệt…", + "Insert Copied Cells" => "Chèn ô đã sao chép", + "Insert Copied Cells…" => "Chèn ô đã sao chép…", + "Insert Cut Cells" => "Chèn ô đã cắt", + "Insert Paste" => "Chèn và dán", + "Cut (⌘X)" => "Cắt (⌘X)", + "Copy (⌘C)" => "Sao chép (⌘C)", + "Format Painter (double-click to keep it on)" => "Sao định dạng (bấm đúp để giữ)", + "Bold (⌘B)" => "Đậm (⌘B)", + "Italic (⌘I)" => "Nghiêng (⌘I)", + "Underline (⌘U)" => "Gạch chân (⌘U)", + "Double Underline" => "Gạch chân đôi", + "Strikethrough" => "Gạch ngang", + "Underline" => "Gạch chân", + "Increase Font Size" => "Tăng cỡ chữ", + "Decrease Font Size" => "Giảm cỡ chữ", + "Wrap Text" => "Xuống dòng tự động", + "Merge & Center" => "Hợp nhất và căn giữa", + "Merge Cells" => "Hợp nhất ô", + "Merge Across" => "Hợp nhất theo hàng", + "Unmerge Cells" => "Bỏ hợp nhất ô", + "Fill Color" => "Màu tô", + "Font Color" => "Màu chữ", + "Borders" => "Viền", + "Top\nAlign" => "Căn\ntrên", + "Middle\nAlign" => "Căn\ngiữa dọc", + "Bottom\nAlign" => "Căn\ndưới", + "Left" => "Trái", + "Right" => "Phải", + "Center" => "Giữa", + "Horizontal" => "Ngang", + "Vertical Text" => "Chữ dọc", + "Decrease Indent" => "Giảm thụt lề", + "Increase Indent" => "Tăng thụt lề", + "Orientation" => "Hướng chữ", + "Page Layout|Orientation" => "Hướng giấy", + "Angle Counterclockwise" => "Xoay ngược chiều kim đồng hồ", + "Angle Clockwise" => "Xoay theo chiều kim đồng hồ", + "Rotate Text Up" => "Xoay chữ lên", + "Rotate Text Down" => "Xoay chữ xuống", + "Accounting Number Format" => "Định dạng số kế toán", + "Percent Style" => "Kiểu phần trăm", + "Comma Style" => "Kiểu dấu phân cách", + "Increase Decimal" => "Tăng số thập phân", + "Decrease Decimal" => "Giảm số thập phân", + "More Accounting Formats…" => "Định dạng kế toán khác…", + "Conditional\nFormatting" => "Định dạng\ncó điều kiện", + "Conditional Formatting" => "Định dạng có điều kiện", + "Format\nas Table" => "Định dạng\nthành bảng", + "Cell\nStyles" => "Kiểu\nô", + "Format Cells…" => "Định dạng ô…", + "Format Cell Alignment…" => "Căn chỉnh ô…", + "Format\nPane" => "Ngăn\nđịnh dạng", + "Format" => "Định dạng", + "Insert" => "Chèn", + "Insert Cells…" => "Chèn ô…", + "Delete" => "Xóa", + "Delete Cells…" => "Xóa ô…", + "Insert Sheet Rows" => "Chèn hàng trang tính", + "Insert Sheet Columns" => "Chèn cột trang tính", + "Delete Sheet Rows" => "Xóa hàng trang tính", + "Delete Sheet Columns" => "Xóa cột trang tính", + "Row Height…" => "Chiều cao hàng…", + "AutoFit Row Height" => "Tự động khớp chiều cao hàng", + "Column Width…" => "Độ rộng cột…", + "AutoFit Column Width" => "Tự động khớp độ rộng cột", + "Default Width…" => "Độ rộng mặc định…", + "Hide Rows" => "Ẩn hàng", + "Unhide Rows" => "Bỏ ẩn hàng", + "Hide Columns" => "Ẩn cột", + "Unhide Columns" => "Bỏ ẩn cột", + "Lock Cell" => "Khóa ô", + "Clear" => "Xóa", + "Clear All" => "Xóa tất cả", + "Clear Formats" => "Xóa định dạng", + "Clear Contents" => "Xóa nội dung", + "Clear Comments and Notes" => "Xóa chú thích và ghi chú", + "Clear Hyperlinks" => "Xóa siêu liên kết", + "AutoSum" => "Tự động tính tổng", + "AutoSum (⌘⇧T)" => "Tự động tính tổng (⌘⇧T)", + "Flash\nFill" => "Điền\nnhanh", + "Flash Fill" => "Điền nhanh", + "Fill" => "Điền", + "Clear Print Area" => "Xóa vùng in", + "Find &\nSelect" => "Tìm &\nChọn", + "Find…" => "Tìm…", + "Replace…" => "Thay thế…", + "Go To…" => "Đi tới…", + "Go To Special…" => "Đi tới đặc biệt…", + "PivotTable" => "PivotTable", + "Recommended\nCharts" => "Biểu đồ\nđề xuất", + "Table" => "Bảng", + "Pictures" => "Ảnh", + "Shapes" => "Hình", + "Icons" => "Biểu tượng", + "Text\nBox" => "Hộp\nvăn bản", + "Comment" => "Chú thích", + "New\nComment" => "Chú thích\nmới", + "New Note" => "Ghi chú mới", + "Show/Hide Note" => "Hiện/ẩn ghi chú", + "Header &\nFooter" => "Đầu trang &\nChân trang", + "Text to\nColumns" => "Tách\ncột", + "Link" => "Liên kết", + "Symbol" => "Ký hiệu", + "Sparklines" => "Biểu đồ thu nhỏ", + "Checkbox" => "Hộp kiểm", + "Insert checkboxes in the selected cells" => "Chèn hộp kiểm vào các ô đã chọn", + "Header & Footer" => "Đầu trang & Chân trang", + "Draw with ink" => "Vẽ bằng mực", + "Eraser" => "Tẩy", + "Ink to\nShape" => "Mực thành\nhình", + "Select\nObjects" => "Chọn\nđối tượng", + "Themes" => "Chủ đề", + "Margins" => "Lề", + "Left Margin" => "Lề trái", + "Right Margin" => "Lề phải", + "Top Margin" => "Lề trên", + "Bottom Margin" => "Lề dưới", + "Header Margin" => "Lề đầu trang", + "Footer Margin" => "Lề chân trang", + "Size" => "Khổ giấy", + "Print\nArea" => "Vùng\nin", + "Set Print Area" => "Đặt vùng in", + "Breaks" => "Ngắt trang", + "Insert Page Break" => "Chèn ngắt trang", + "Remove Page Break" => "Bỏ ngắt trang", + "Reset All Page Breaks" => "Đặt lại tất cả ngắt trang", + "Print\nTitles" => "In\ntiêu đề", + "Sheet\nRight-to-Left" => "Trang tính\nphải sang trái", + "Sheet Right-to-Left" => "Trang tính phải sang trái", + "Narrow" => "Hẹp", + "Wide" => "Rộng", + "Normal" => "Bình thường", + "Portrait" => "Dọc", + "Landscape" => "Ngang", + "Custom Margins…" => "Lề tùy chỉnh…", + "Insert\nFunction" => "Chèn\nhàm", + "Name\nManager" => "Trình quản lý\ntên", + "Define Name" => "Xác định tên", + "Use in Formula" => "Dùng trong công thức", + "Create from Selection" => "Tạo từ vùng chọn", + "Trace Precedents" => "Truy tìm ô tham chiếu", + "Trace Dependents" => "Truy tìm ô phụ thuộc", + "Remove Arrows" => "Bỏ mũi tên", + "Show Formulas" => "Hiện công thức", + "Error Checking" => "Kiểm tra lỗi", + "Evaluate Formula" => "Đánh giá công thức", + "Watch Window" => "Cửa sổ theo dõi", + "Calculation\nOptions" => "Tùy chọn\ntính toán", + "Calculate Now" => "Tính ngay", + "Calculate Sheet" => "Tính trang tính", + "Automatic" => "Tự động", + "Automatic Except for Data Tables" => "Tự động trừ bảng dữ liệu", + "Manual" => "Thủ công", + "Sort &\nFilter" => "Sắp xếp &\nLọc", + "Sort" => "Sắp xếp", + "Sort A to Z" => "Sắp xếp từ A đến Z", + "Sort Z to A" => "Sắp xếp từ Z đến A", + "Custom Sort…" => "Sắp xếp tùy chỉnh…", + "Filter" => "Lọc", + "Reapply" => "Áp dụng lại", + "Get Data\n(Text/CSV)" => "Lấy dữ liệu\n(Văn bản/CSV)", + "Remove\nDuplicates" => "Loại bỏ\ntrùng lặp", + "Data\nValidation" => "Xác thực\ndữ liệu", + "Data Validation" => "Xác thực dữ liệu", + "Data Validation…" => "Xác thực dữ liệu…", + "Circle Invalid Data" => "Khoanh dữ liệu không hợp lệ", + "Clear Validation" => "Xóa xác thực", + "Group" => "Nhóm", + "Ungroup" => "Bỏ nhóm", + "Show Detail" => "Hiện chi tiết", + "Hide Detail" => "Ẩn chi tiết", + "Subtotal" => "Tổng phụ", + "Data\nAnalysis" => "Phân tích\ndữ liệu", + "Data Analysis" => "Phân tích dữ liệu", + "Solver" => "Solver", + "What-If\nAnalysis" => "Phân tích\nWhat-If", + "Data Table…" => "Bảng dữ liệu…", + "Scenario Manager…" => "Trình quản lý kịch bản…", + "Goal Seek…" => "Tìm mục tiêu…", + "Forecast\nSheet" => "Trang tính\ndự báo", + "Spelling" => "Chính tả", + "Check\nAccessibility" => "Kiểm tra\ntrợ năng", + "Threaded Comments" => "Chú thích dạng chuỗi", + "Show\nComments" => "Hiện\nchú thích", + "Previous" => "Trước", + "Next" => "Tiếp", + "Previous Comment" => "Chú thích trước", + "Next Comment" => "Chú thích tiếp theo", + "Show All Notes" => "Hiện tất cả ghi chú", + "Convert to Comments" => "Chuyển thành chú thích", + "Protect\nWorkbook" => "Bảo vệ\nsổ làm việc", + "Allow Edit\nRanges" => "Cho phép sửa\nphạm vi", + "Allow Edit Ranges" => "Cho phép sửa phạm vi", + "Unprotect\nSheet" => "Bỏ bảo vệ\ntrang tính", + "Protect Sheet…" => "Bảo vệ trang tính…", + "Comments" => "Chú thích", + "Notes" => "Ghi chú", + "Page Break\nPreview" => "Xem trước\nngắt trang", + "Page\nLayout" => "Bố trí\ntrang", + "Formula Bar" => "Thanh công thức", + "Gridlines" => "Đường lưới", + "Headings" => "Tiêu đề hàng/cột", + "Zoom" => "Thu phóng", + "100%" => "100%", + "Zoom to\nSelection" => "Phóng to\nvùng chọn", + "Freeze\nPanes" => "Cố định\nngăn", + "Freeze Panes" => "Cố định ngăn", + "Freeze Top Row" => "Cố định hàng trên cùng", + "Freeze First Column" => "Cố định cột đầu tiên", + "Unfreeze Panes" => "Bỏ cố định ngăn", + "Dark Mode" => "Chế độ tối", + "Display theme" => "Chủ đề hiển thị", + "Animations" => "Hiệu ứng động", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "Trượt khung vùng chọn tới ô bạn di chuyển đến thay vì nhảy ngay tới đó" + } + "System" => "Hệ thống", + "Light" => "Sáng", + "Dark" => "Tối", + "Interface language" => "Ngôn ngữ giao diện", + "Interface size" => "Kích thước giao diện", + "Auto" => "Tự động", + "Drag to freeze columns" => "Kéo để cố định cột", + "Drag to freeze rows" => "Kéo để cố định hàng", + "Command\nPalette" => "Bảng\nlệnh", + "Agent\nControl" => "Điều khiển\nagent", + "Action\nJournal" => "Nhật ký\nthao tác", + "About\nGridCraft" => "Giới thiệu\nGridCraft", + "Share" => "Chia sẻ", + "Add Chart\nElement" => "Thêm thành phần\nbiểu đồ", + "Change\nChart Type" => "Đổi kiểu\nbiểu đồ", + "Switch\nRow/Column" => "Đổi\nhàng/cột", + "Select\nData" => "Chọn\ndữ liệu", + "Data Labels: None" => "Nhãn dữ liệu: Không", + "Data Labels: Show" => "Nhãn dữ liệu: Hiện", + "Legend: None" => "Chú giải: Không", + "Legend: Bottom" => "Chú giải: Dưới", + "Legend: Top" => "Chú giải: Trên", + "Legend: Right" => "Chú giải: Phải", + "Gridlines: None" => "Đường lưới: Không", + "Gridlines: Show" => "Đường lưới: Hiện", + "Chart\nTitle" => "Tiêu đề\nbiểu đồ", + "Delete\nChart" => "Xóa\nbiểu đồ", + "Convert\nto Range" => "Chuyển thành\nphạm vi", + "Table\nStyles" => "Kiểu\nbảng", + "Top 10 Items" => "10 mục đầu", + "Top 10%" => "10% đầu", + "Bottom 10 Items" => "10 mục cuối", + "Bottom 10%" => "10% cuối", + "Above Average" => "Trên trung bình", + "Below Average" => "Dưới trung bình", + "Clear Rules from Entire Sheet" => "Xóa quy tắc khỏi toàn bộ trang tính", + "Clear Rules from Selected Cells" => "Xóa quy tắc khỏi các ô đã chọn", + "Constants" => "Hằng số", + "Data Bars" => "Thanh dữ liệu", + "Color Scales" => "Thang màu", + "Icon Sets" => "Bộ biểu tượng", + "Home" => "Trang đầu", + "Draw" => "Vẽ", + "Page Layout" => "Bố trí trang", + "Formulas" => "Công thức", + "Data" => "Dữ liệu", + "Review" => "Xem lại", + "View" => "Xem", + "Automate" => "Tự động hóa", + "Table Design" => "Thiết kế bảng", + "Chart Design" => "Thiết kế biểu đồ", + "Ready" => "Sẵn sàng", + "Enter" => "Nhập", + "Edit" => "Sửa", + "Point" => "Trỏ", + "Calculate" => "Tính toán", + "Select destination and press Enter or choose Paste" => "Chọn vị trí đích rồi nhấn Enter hoặc chọn Dán", + "General" => "Chung", + "Number" => "Số", + "Currency" => "Tiền tệ", + "Accounting" => "Kế toán", + "Date" => "Ngày", + "Time" => "Giờ", + "Percentage" => "Phần trăm", + "Fraction" => "Phân số", + "Scientific" => "Khoa học", + "Text" => "Văn bản", + "Special" => "Đặc biệt", + "Custom" => "Tùy chỉnh", + "Short Date" => "Ngày dạng ngắn", + "Long Date" => "Ngày dạng dài", + "More Number Formats…" => "Định dạng số khác…", + "Financial" => "Tài chính", + "Logical" => "Logic", + "Date &\nTime" => "Ngày &\nGiờ", + "Lookup &\nReference" => "Tra cứu &\nTham chiếu", + "Math &\nTrig" => "Toán &\nLượng giác", + "More\nFunctions" => "Hàm\nkhác", + "Sheet Options|View" => "Xem", + "Print" => "In", + // Page Layout view and the Header & Footer tab. + "Click to add data" => "Bấm để thêm dữ liệu", + "Add header" => "Thêm đầu trang", + "Add footer" => "Thêm chân trang", + "(none)" => "(không có)", + "Header" => "Đầu trang", + "Footer" => "Chân trang", + "Page\nNumber" => "Số\ntrang", + "Number\nof Pages" => "Tổng\nsố trang", + "Current\nDate" => "Ngày\nhiện tại", + "Current\nTime" => "Giờ\nhiện tại", + "File\nPath" => "Đường dẫn\ntệp", + "File\nName" => "Tên\ntệp", + "Sheet\nName" => "Tên\ntrang tính", + "Go to\nHeader" => "Đi tới\nđầu trang", + "Go to\nFooter" => "Đi tới\nchân trang", + "Page Number" => "Số trang", + "Number of Pages" => "Tổng số trang", + "Current Date" => "Ngày hiện tại", + "Current Time" => "Giờ hiện tại", + "File Path" => "Đường dẫn tệp", + "File Name" => "Tên tệp", + "Sheet Name" => "Tên trang tính", + "Go to Header" => "Đi tới đầu trang", + "Different First Page" => "Trang đầu khác", + "Different Odd & Even Pages" => "Trang chẵn lẻ khác nhau", + "Go to Footer" => "Đi tới chân trang", + "Ruler" => "Thước", + // File › Backstage view. + "File" => "Tệp", + "Back" => "Quay lại", + "New" => "Mới", + "Open" => "Mở", + "Info" => "Thông tin", + "Save" => "Lưu", + "Save As" => "Lưu thành", + "Export" => "Xuất", + "Close" => "Đóng", + "Options" => "Tùy chọn", + "Blank workbook" => "Sổ làm việc trống", + "Recent" => "Gần đây", + "No recent workbooks yet." => "Chưa có sổ làm việc gần đây.", + "More workbooks" => "Sổ làm việc khác", + "Modified" => "Đã sửa đổi", + "Not available" => "Không khả dụng", + "Just now" => "Vừa xong", + "Yesterday" => "Hôm qua", + "{n} min ago" => "{n} phút trước", + "{n} h ago" => "{n} giờ trước", + "{n} days ago" => "{n} ngày trước", + "{n} weeks ago" => "{n} tuần trước", + "{n} months ago" => "{n} tháng trước", + "{n} years ago" => "{n} năm trước", + "Browse…" => "Duyệt…", + "Not saved yet" => "Chưa lưu", + "Location" => "Vị trí", + "Sheets" => "Trang tính", + "Protect Workbook" => "Bảo vệ sổ làm việc", + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "Cấu trúc trang tính đã bị khóa: không thể thêm, di chuyển, đổi tên hoặc xóa trang tính." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Khóa cấu trúc trang tính để không thể thêm, di chuyển, đổi tên hoặc xóa trang tính." + } + "Properties" => "Thuộc tính", + "Title" => "Tiêu đề", + "Subject" => "Chủ đề", + "Author" => "Tác giả", + "Company" => "Công ty", + "Keywords" => "Từ khóa", + "Description" => "Mô tả", + "No workbook is open." => "Chưa mở sổ làm việc nào.", + "Save as type" => "Lưu dưới dạng", + "Excel Workbook (*.xlsx)" => "Sổ làm việc Excel (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (phân cách bằng dấu phẩy) (*.csv)", + "Web Page (*.html)" => "Trang web (*.html)", + "PDF (*.pdf)" => "PDF (*.pdf)", + "Download" => "Tải xuống", + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "Tệp CSV, trang web hoặc PDF chỉ là bản sao: sổ làm việc vẫn giữ tệp gốc." + } + "Save the workbook under another name or in another folder." => "Lưu sổ làm việc với tên khác hoặc vào thư mục khác.", + "Print Active Sheets" => "In các trang tính hiện hoạt", + "Print Entire Workbook" => "In toàn bộ sổ làm việc", + "Fit Sheet on One Page" => "Vừa trang tính trên một trang", + "Page Setup…" => "Thiết lập trang…", + "Page {page} of {pages}" => "Trang {page} / {pages}", + "Nothing to print." => "Không có gì để in.", + "Previous page" => "Trang trước", + "Next page" => "Trang sau", + "Create PDF" => "Tạo PDF", + "Save the sheet as a PDF document that keeps its page layout." => "Lưu trang tính thành tài liệu PDF, giữ nguyên bố trí trang.", + "Change File Type" => "Đổi kiểu tệp", + "CSV (Comma delimited)" => "CSV (phân cách bằng dấu phẩy)", + "Save the active sheet as comma-separated text." => "Lưu trang tính hiện hoạt thành văn bản phân cách bằng dấu phẩy.", + "Web Page (.html)" => "Trang web (.html)", + "Save the workbook as a web page." => "Lưu sổ làm việc thành trang web.", + "Options|General" => "Chung", + "Options|Save" => "Lưu", + "Show formula bar" => "Hiện thanh công thức", + "Enable AutoComplete for cell values" => "Bật tự động hoàn thành giá trị ô", + "Save .xlsx workbooks automatically after every change" => "Tự động lưu sổ làm việc .xlsx sau mỗi thay đổi", + "Workbook calculation" => "Tính toán sổ làm việc", + "Enable iterative calculation" => "Bật tính toán lặp", + "Calculation settings are saved with the workbook." => "Thiết lập tính toán được lưu cùng sổ làm việc.", + _ => return None, + }) +} diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 09197ff6c..f6cebeb0c 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -54,7 +54,7 @@ separators, number/date formats, machine translation with agent review, and scri | Japanese | ja | 268 (~12%) | no | CJK system-font fallback; IME unverified; no furigana display | no | menus only | 8–12 h | | German | de | 266 (~12%) | no | Latin: yes | no | menus only | 4–8 h | | 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 | +| Vietnamese | vi | 398 (~18%) | no | Latin with stacked diacritics: unverified | no | menus, File view | 5–9 h | Other shipped languages: Russian (ru) and German (de), 266 labels each (~12%), menus only. @@ -78,6 +78,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-17 | minor | Vietnamese catalog (`i18n/vi.rs`, every key in the master table); `vi` locale tags resolve to Vietnamese | | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | | 2026-10-11 | minor | German ribbon catalog (`i18n/de.rs`, 266 labels, ~12%); `de` locale tags (de-DE, de-AT, de-CH…) resolve to German. PR #163 (localized German formulas/numbers) still open | From 122d3d9a312ac2efe5a87443e300355956611f78 Mon Sep 17 00:00:00 2001 From: bfenty <1398236+bfenty@users.noreply.github.com> Date: Mon, 19 Oct 2026 20:14:24 +0000 Subject: [PATCH 12/33] feat(formula): Spanish aliases for financial functions (VNA, TIR, PAGO, VA, VF) Closes #1986 Co-Authored-By: Claude --- crates/formula/src/input.rs | 12 ++++++++++++ crates/formula/tests/spanish_input.rs | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/crates/formula/src/input.rs b/crates/formula/src/input.rs index 8568023ed..12cc9cfbc 100644 --- a/crates/formula/src/input.rs +++ b/crates/formula/src/input.rs @@ -20,6 +20,18 @@ const SPANISH: &[(&str, &str)] = &[ ("COUNTIF", "CONTAR.SI"), ("VLOOKUP", "BUSCARV"), ("TODAY", "HOY"), + // Financial block (#1986): the loan-schedule and investment staples. + ("NPV", "VNA"), + ("IRR", "TIR"), + ("PMT", "PAGO"), + ("PV", "VA"), + ("FV", "VF"), + // Financial block (#1986): the loan-schedule and investment staples. + ("NPV", "VNA"), + ("IRR", "TIR"), + ("PMT", "PAGO"), + ("PV", "VA"), + ("FV", "VF"), ("TRUE", "VERDADERO"), ("FALSE", "FALSO"), ]; diff --git a/crates/formula/tests/spanish_input.rs b/crates/formula/tests/spanish_input.rs index fee688a86..627c3311f 100644 --- a/crates/formula/tests/spanish_input.rs +++ b/crates/formula/tests/spanish_input.rs @@ -15,6 +15,11 @@ fn spanish_aliases_and_argument_separators() { ("CONTAR.SI(A1:A10;\">0\")", "COUNTIF(A1:A10,\">0\")"), ("BUSCARV(A2;D:E;2;FALSO)", "VLOOKUP(A2,D:E,2,FALSE)"), ("HOY()", "TODAY()"), + ("VNA(0,1;A1:A5)", "NPV(0.1,A1:A5)"), + ("TIR(A1:A5;0,1)", "IRR(A1:A5,0.1)"), + ("PAGO(0,08/12;10;10000)", "PMT(0.08/12,10,10000)"), + ("VA(0,05;12;100)", "PV(0.05,12,100)"), + ("VF(0,05;12;100)", "FV(0.05,12,100)"), ("=verdadero", "TRUE"), ("=falso", "FALSE"), ("VERDADERO()", "TRUE()"), From 27760812de29a56ea34c16423c57ef872f9cca56 Mon Sep 17 00:00:00 2001 From: bmh129 <11478682+bmh129@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:38:08 -0500 Subject: [PATCH 13/33] i18n: test that translations keep the shape of their English MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The French catalog once shipped with over a hundred translations sitting on their neighbours' keys ("Close" read "Société"); main has since fixed them. A catalog shifted that way still covers every key, so the existing coverage tests don't catch it. A new test checks every language's translations keep the shape of their English: the same {placeholders}, and no line break in a one-line label (the two big ribbon buttons that wrap are exempt). Plus spot checks of French labels that were once misplaced. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/i18n.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 98919f8a4..a631c351c 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -647,6 +647,38 @@ mod tests { assert_eq!(Language::parse("xx"), None); } + /// A catalog whose translations slip onto their neighbours' keys still covers every key, so + /// check the shape of each translation against its English: placeholders survive, and a + /// one-line label (a menu item, a tooltip) doesn't turn into a two-line ribbon label. French + /// once shipped with over a hundred translations shifted this way ("Close" read "Société"). + #[test] + fn translations_keep_the_shape_of_their_english() { + let placeholders = + |s: &str| s.split('{').skip(1).filter_map(|rest| rest.split_once('}').map(|(name, _)| name.to_string())).collect::>(); + for language in Language::ALL { + for (english, _) in JAPANESE { + let label = english.rsplit_once('|').map_or(*english, |(_, label)| label); + let text = language.tr(english); + assert_eq!(placeholders(text), placeholders(label), "{language:?}: {english:?} => {text:?}"); + // Big ribbon buttons whose English fits on one line may still need two. + if !label.contains('\n') && !["AutoSum", "PivotTable"].contains(english) { + assert!(!text.contains('\n'), "{language:?}: one-line {english:?} => {text:?}"); + } + } + } + for (english, french) in [ + ("Close", "Fermer"), + ("File", "Fichier"), + ("Save", "Enregistrer"), + ("Animations", "Animations"), + ("Company", "Société"), + ("Show Detail", "Afficher le détail"), + ("Solver", "Solveur"), + ] { + assert_eq!(Language::Fr.tr(english), french); + } + } + #[test] fn german_cell_and_header_context_menus_are_fully_translated() { for label in [ From ad32e6a847a23d4431b11ff200b69a39f790ce85 Mon Sep 17 00:00:00 2001 From: midasdf <205497066+midasdf@users.noreply.github.com> Date: Sat, 17 Oct 2026 09:00:18 +0900 Subject: [PATCH 14/33] i18n(ja): translate every dialog, message and menu string the pt-BR catalog covers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Japanese catalog still lived inline in i18n.rs with its ribbon and widget labels, so with the interface set to 日本語 the dialog titles and labels, message boxes, Backstage/File-view items, template names and native menus showed in English. This moves it to i18n/ja.rs and adds the 545 keys the Brazilian Portuguese catalog translates beyond it: 943 keys, the coverage pt-BR has (~43% of ~2,200 strings), in Excel for Mac 日本語版 wording. CORE keeps the shared reference set every catalog covers, verbatim and in the same order (the cross-catalog coverage test still points at it); DIALOGS holds the new strings, and the lookup checks it first. One test parses pt.rs's source so the two catalogs cannot drift apart again, one checks that every key is unique across the two lists and every value is translated, and one spot-checks the high-value strings. Docs: the Japanese row and the "Where we are" bullet in docs/localization-parity.md (943, ~43%), a revision row, the ROADMAP Languages paragraph and progress log, and gaps.md §11. --- ROADMAP.md | 11 +- crates/ui-egui/src/i18n.rs | 428 +------------ crates/ui-egui/src/i18n/ja.rs | 1115 +++++++++++++++++++++++++++++++++ docs/gaps.md | 8 +- docs/localization-parity.md | 30 +- 5 files changed, 1149 insertions(+), 443 deletions(-) create mode 100644 crates/ui-egui/src/i18n/ja.rs diff --git a/ROADMAP.md b/ROADMAP.md index 070552d07..7adcbaeb2 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-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **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. @@ -93,7 +93,9 @@ The ribbon is translated into Japanese, Simplified Chinese, Korean, Brazilian Po and German (266–268 labels each, ~12% of ~2,200 strings; merged 10-10 in #31, #104, #82, German added 10-11), the interface follows the system language, and CJK, Thai and Hebrew text falls back to system fonts -(#38). Dialogs, menus and messages are English; formulas and number formats are en-US only. +(#38). Japanese (10-17) and Brazilian Portuguese also translate the dialog titles and labels, +message boxes, Backstage/File-view items, template names and native menus: 943 strings each, ~43%. +The remaining dialogs, menus and messages are English; formulas and number formats are en-US only. Localized German formulas and numbers are in PR #163. Detail: [localization-parity.md](docs/localization-parity.md). | Language | Code | Status | UI strings | @@ -104,9 +106,9 @@ Localized German formulas and numbers are in PR #163. Detail: [localization-pari | Hindi | hi | none | 0% | | Arabic | ar | none (no RTL layout, no shaping) | 0% | | French | fr | none | 0% | -| Portuguese | pt-BR | menus only | ~12% | +| Portuguese | pt-BR | menus, File view, dialogs | ~43% | | Indonesian | id | none | 0% | -| Japanese | ja | menus only | ~12% | +| Japanese | ja | menus, File view, dialogs, messages | ~43% | | German | de | menus only | ~12% | | Korean | ko | menus only | ~12% | | Vietnamese | vi | none | 0% | @@ -132,6 +134,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | What landed | |---|---| +| 2026-10-20 | Japanese interface catalog covers every key the Brazilian Portuguese catalog translates: the 398-label shared core plus 545 dialog, message, Backstage and menu strings (943 total, ~43% of ~2,200). A test parses `pt.rs`'s source, so the two catalogs stay in step | | 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) | diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 98919f8a4..5392ba999 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -13,6 +13,7 @@ mod cs; mod de; mod es; mod fr; +mod ja; mod ko; mod pt; mod ru; @@ -120,7 +121,7 @@ impl Language { let translated = match self { Self::En => None, Self::Es => es::translate(text), - Self::Ja => JAPANESE.iter().find(|(english, _)| *english == text).map(|(_, translated)| *translated), + Self::Ja => ja::translate(text), Self::Zh => zh::translate(text), Self::Ko => ko::translate(text), Self::Ru => ru::translate(text), @@ -173,435 +174,18 @@ pub fn set_current(ctx: &egui::Context, language: Language) { ctx.data_mut(|d| d.insert_temp(lang_key(), language)); } -/// English label → Japanese. Keys are the exact interface strings (command ids, file names and -/// document text are never translated); anything absent falls back to English. -const JAPANESE: &[(&str, &str)] = &[ - ("Paste", "貼り付け"), - ("Paste Values", "値の貼り付け"), - ("Paste Formulas", "数式の貼り付け"), - ("Paste Formatting", "書式の貼り付け"), - ("Transpose", "行列を入れ替え"), - ("Paste Link", "リンクの貼り付け"), - ("Paste Special…", "形式を選択して貼り付け…"), - ("Insert Copied Cells", "コピーしたセルの挿入"), - ("Insert Copied Cells…", "コピーしたセルの挿入…"), - ("Insert Cut Cells", "切り取ったセルの挿入"), - ("Insert Paste", "挿入貼り付け"), - ("Cut (⌘X)", "切り取り (⌘X)"), - ("Copy (⌘C)", "コピー (⌘C)"), - ("Format Painter (double-click to keep it on)", "書式のコピー/貼り付け (ダブルクリックで固定)"), - ("Bold (⌘B)", "太字 (⌘B)"), - ("Italic (⌘I)", "斜体 (⌘I)"), - ("Underline (⌘U)", "下線 (⌘U)"), - ("Double Underline", "二重下線"), - ("Strikethrough", "取り消し線"), - ("Underline", "下線"), - ("Increase Font Size", "フォントの拡大"), - ("Decrease Font Size", "フォントの縮小"), - ("Wrap Text", "折り返して全体を表示"), - ("Merge & Center", "セルを結合して中央揃え"), - ("Merge Cells", "セルの結合"), - ("Merge Across", "横方向に結合"), - ("Unmerge Cells", "セル結合の解除"), - ("Fill Color", "塗りつぶしの色"), - ("Font Color", "フォントの色"), - ("Borders", "罫線"), - ("Top\nAlign", "上揃え"), - ("Middle\nAlign", "中央揃え (縦)"), - ("Bottom\nAlign", "下揃え"), - ("Left", "左"), - ("Right", "右"), - ("Center", "中央"), - ("Horizontal", "水平"), - ("Vertical Text", "縦書き"), - ("Decrease Indent", "インデントを減らす"), - ("Increase Indent", "インデントを増やす"), - ("Orientation", "方向"), - ("Page Layout|Orientation", "印刷の向き"), - ("Angle Counterclockwise", "左回りに回転"), - ("Angle Clockwise", "右回りに回転"), - ("Rotate Text Up", "文字列を上に回転"), - ("Rotate Text Down", "文字列を下に回転"), - ("Accounting Number Format", "通貨表示形式"), - ("Percent Style", "パーセント表示"), - ("Comma Style", "桁区切りスタイル"), - ("Increase Decimal", "小数点以下の桁数を増やす"), - ("Decrease Decimal", "小数点以下の桁数を減らす"), - ("More Accounting Formats…", "その他の通貨表示形式…"), - ("Conditional\nFormatting", "条件付き書式"), - ("Conditional Formatting", "条件付き書式"), - ("Format\nas Table", "テーブルとして書式設定"), - ("Cell\nStyles", "セルのスタイル"), - ("Format Cells…", "セルの書式設定…"), - ("Format Cell Alignment…", "セルの配置…"), - ("Format\nPane", "書式ウィンドウ"), - ("Format", "書式"), - ("Insert", "挿入"), - ("Insert Cells…", "セルの挿入…"), - ("Delete", "削除"), - ("Delete Cells…", "セルの削除…"), - ("Insert Sheet Rows", "シートの行を挿入"), - ("Insert Sheet Columns", "シートの列を挿入"), - ("Delete Sheet Rows", "シートの行を削除"), - ("Delete Sheet Columns", "シートの列を削除"), - ("Row Height…", "行の高さ…"), - ("AutoFit Row Height", "行の高さを自動調整"), - ("Column Width…", "列の幅…"), - ("AutoFit Column Width", "列の幅を自動調整"), - ("Default Width…", "標準の幅…"), - ("Hide Rows", "行を表示しない"), - ("Unhide Rows", "再表示"), - ("Hide Columns", "列の表示/非表示"), - ("Unhide Columns", "再表示"), - ("Lock Cell", "セルのロック"), - ("Clear", "クリア"), - ("Clear All", "すべてクリア"), - ("Clear Formats", "書式のクリア"), - ("Clear Contents", "数式と値のクリア"), - ("Clear Comments and Notes", "コメントとメモのクリア"), - ("Clear Hyperlinks", "ハイパーリンクのクリア"), - ("AutoSum", "オート SUM"), - ("AutoSum (⌘⇧T)", "オート SUM (⌘⇧T)"), - ("Flash\nFill", "フラッシュ フィル"), - ("Flash Fill", "フラッシュ フィル"), - ("Fill", "フィル"), - ("Clear Print Area", "印刷範囲のクリア"), - ("Find &\nSelect", "検索と選択"), - ("Find…", "検索…"), - ("Replace…", "置換…"), - ("Go To…", "ジャンプ…"), - ("Go To Special…", "セルを選択…"), - ("PivotTable", "ピボットテーブル"), - ("Recommended\nCharts", "推奨グラフ"), - ("Table", "テーブル"), - ("Pictures", "画像"), - ("Shapes", "図形"), - ("Icons", "アイコン"), - ("Text\nBox", "テキスト ボックス"), - ("Comment", "コメント"), - ("New\nComment", "新しいコメント"), - ("New Note", "新しいメモ"), - ("Show/Hide Note", "メモの表示/非表示"), - ("Header &\nFooter", "ヘッダーとフッター"), - ("Text to\nColumns", "区切り位置"), - ("Link", "リンク"), - ("Symbol", "記号"), - ("Sparklines", "スパークライン"), - ("Checkbox", "チェックボックス"), - ("Insert checkboxes in the selected cells", "選択したセルにチェックボックスを挿入"), - ("Header & Footer", "ヘッダーとフッター"), - ("Draw with ink", "インクで描画"), - ("Eraser", "消しゴム"), - ("Ink to\nShape", "インクを図形に変換"), - ("Select\nObjects", "オブジェクトの選択"), - ("Themes", "テーマ"), - ("Margins", "余白"), - ("Left Margin", "左余白"), - ("Right Margin", "右余白"), - ("Top Margin", "上余白"), - ("Bottom Margin", "下余白"), - ("Header Margin", "ヘッダーの余白"), - ("Footer Margin", "フッターの余白"), - ("Size", "サイズ"), - ("Print\nArea", "印刷範囲"), - ("Set Print Area", "印刷範囲の設定"), - ("Breaks", "改ページ"), - ("Insert Page Break", "改ページの挿入"), - ("Remove Page Break", "改ページの解除"), - ("Reset All Page Breaks", "すべての改ページを解除"), - ("Print\nTitles", "印刷タイトル"), - ("Sheet\nRight-to-Left", "シートを右から左へ"), - ("Sheet Right-to-Left", "シートを右から左へ"), - ("Narrow", "狭い"), - ("Wide", "広い"), - ("Normal", "標準"), - ("Portrait", "縦"), - ("Landscape", "横"), - ("Custom Margins…", "ユーザー設定の余白…"), - ("Insert\nFunction", "関数の挿入"), - ("Name\nManager", "名前の管理"), - ("Define Name", "名前の定義"), - ("Use in Formula", "数式で使用"), - ("Create from Selection", "選択範囲から作成"), - ("Trace Precedents", "参照元のトレース"), - ("Trace Dependents", "参照先のトレース"), - ("Remove Arrows", "矢印の解除"), - ("Show Formulas", "数式の表示"), - ("Error Checking", "エラーチェック"), - ("Evaluate Formula", "数式の検証"), - ("Watch Window", "ウォッチ ウィンドウ"), - ("Calculation\nOptions", "計算方法の設定"), - ("Calculate Now", "再計算実行"), - ("Calculate Sheet", "シートの再計算"), - ("Automatic", "自動"), - ("Automatic Except for Data Tables", "データ テーブル以外は自動"), - ("Manual", "手動"), - ("Sort &\nFilter", "並べ替えとフィルター"), - ("Sort", "並べ替え"), - ("Sort A to Z", "昇順"), - ("Sort Z to A", "降順"), - ("Custom Sort…", "ユーザー設定の並べ替え…"), - ("Filter", "フィルター"), - ("Reapply", "再適用"), - ("Get Data\n(Text/CSV)", "データの取得 (テキスト/CSV)"), - ("Remove\nDuplicates", "重複の削除"), - ("Data\nValidation", "データの入力規則"), - ("Data Validation", "データの入力規則"), - ("Data Validation…", "データの入力規則…"), - ("Circle Invalid Data", "無効なデータをマーク"), - ("Clear Validation", "入力規則のクリア"), - ("Group", "グループ化"), - ("Ungroup", "グループ解除"), - ("Show Detail", "詳細データの表示"), - ("Hide Detail", "詳細を表示しない"), - ("Subtotal", "小計"), - ("Data\nAnalysis", "データ分析"), - ("Data Analysis", "データ分析"), - ("Solver", "ソルバー"), - ("What-If\nAnalysis", "What-If 分析"), - ("Data Table…", "データ テーブル…"), - ("Scenario Manager…", "シナリオ マネージャー…"), - ("Goal Seek…", "ゴール シーク…"), - ("Forecast\nSheet", "予測シート"), - ("Spelling", "スペルチェック"), - ("Check\nAccessibility", "アクセシビリティ チェック"), - ("Threaded Comments", "スレッド化されたコメント"), - ("Show\nComments", "コメントの表示"), - ("Previous", "前へ"), - ("Next", "次へ"), - ("Previous Comment", "前のコメント"), - ("Next Comment", "次のコメント"), - ("Show All Notes", "すべてのメモを表示"), - ("Convert to Comments", "コメントに変換"), - ("Protect\nWorkbook", "ブックの保護"), - ("Allow Edit\nRanges", "範囲の編集を許可"), - ("Allow Edit Ranges", "範囲の編集を許可"), - ("Unprotect\nSheet", "シート保護の解除"), - ("Protect Sheet…", "シートの保護…"), - ("Comments", "コメント"), - ("Notes", "メモ"), - ("Page Break\nPreview", "改ページ プレビュー"), - ("Page\nLayout", "ページ レイアウト"), - ("Formula Bar", "数式バー"), - ("Gridlines", "目盛線"), - ("Headings", "見出し"), - ("Zoom", "ズーム"), - ("100%", "100%"), - ("Zoom to\nSelection", "選択範囲を拡大"), - ("Freeze\nPanes", "ウィンドウ枠の固定"), - ("Freeze Panes", "ウィンドウ枠の固定"), - ("Freeze Top Row", "最上行の固定"), - ("Freeze First Column", "最左列の固定"), - ("Unfreeze Panes", "ウィンドウ枠固定の解除"), - ("Dark Mode", "ダーク モード"), - ("Display theme", "表示テーマ"), - ("Animations", "アニメーション"), - ( - "Glide the selection outline to the cell you move to instead of jumping there", - "選択範囲の枠を、移動先のセルまで滑らかに動かします(瞬時には切り替えません)", - ), - ("System", "システム"), - ("Light", "ライト"), - ("Dark", "ダーク"), - ("Interface language", "表示言語"), - ("Interface size", "表示サイズ"), - ("Auto", "自動"), - ("Drag to freeze columns", "ドラッグして列を固定"), - ("Drag to freeze rows", "ドラッグして行を固定"), - ("Command\nPalette", "コマンド パレット"), - ("Agent\nControl", "エージェント制御"), - ("Action\nJournal", "操作ジャーナル"), - ("About\nGridCraft", "GridCraft について"), - ("Share", "共有"), - ("Add Chart\nElement", "グラフ要素を追加"), - ("Change\nChart Type", "グラフの種類の変更"), - ("Switch\nRow/Column", "行/列の切り替え"), - ("Select\nData", "データの選択"), - ("Data Labels: None", "データ ラベル: なし"), - ("Data Labels: Show", "データ ラベル: 表示"), - ("Legend: None", "凡例: なし"), - ("Legend: Bottom", "凡例: 下"), - ("Legend: Top", "凡例: 上"), - ("Legend: Right", "凡例: 右"), - ("Gridlines: None", "目盛線: なし"), - ("Gridlines: Show", "目盛線: 表示"), - ("Chart\nTitle", "グラフ タイトル"), - ("Delete\nChart", "グラフの削除"), - ("Convert\nto Range", "範囲に変換"), - ("Table\nStyles", "テーブル スタイル"), - ("Top 10 Items", "上位 10 項目"), - ("Top 10%", "上位 10%"), - ("Bottom 10 Items", "下位 10 項目"), - ("Bottom 10%", "下位 10%"), - ("Above Average", "平均より上"), - ("Below Average", "平均より下"), - ("Clear Rules from Entire Sheet", "シート全体からルールをクリア"), - ("Clear Rules from Selected Cells", "選択したセルからルールをクリア"), - ("Constants", "定数"), - ("Data Bars", "データ バー"), - ("Color Scales", "カラー スケール"), - ("Icon Sets", "アイコン セット"), - ("Home", "ホーム"), - ("Draw", "描画"), - ("Page Layout", "ページ レイアウト"), - ("Formulas", "数式"), - ("Data", "データ"), - ("Review", "レビュー"), - ("View", "表示"), - ("Automate", "自動化"), - ("Table Design", "テーブル デザイン"), - ("Chart Design", "グラフ デザイン"), - ("Ready", "準備完了"), - ("Enter", "入力"), - ("Edit", "編集"), - ("Point", "ポイント"), - ("Calculate", "計算"), - ("Select destination and press Enter or choose Paste", "貼り付け先を選び、Enter キーを押すか [貼り付け] を選びます"), - ("General", "標準"), - ("Number", "数値"), - ("Currency", "通貨"), - ("Accounting", "会計"), - ("Date", "日付"), - ("Time", "時刻"), - ("Percentage", "パーセンテージ"), - ("Fraction", "分数"), - ("Scientific", "指数"), - ("Text", "文字列"), - ("Special", "特殊"), - ("Custom", "ユーザー設定"), - ("Short Date", "日付"), - ("Long Date", "長い日付"), - ("More Number Formats…", "その他の表示形式…"), - ("Financial", "財務"), - ("Logical", "論理"), - ("Date &\nTime", "日付/時刻"), - ("Lookup &\nReference", "検索/行列"), - ("Math &\nTrig", "数学/三角"), - ("More\nFunctions", "その他の関数"), - ("Sheet Options|View", "画面"), - ("Print", "印刷"), - // Page Layout view and the Header & Footer tab. - ("Click to add data", "クリックしてデータを追加"), - ("Add header", "ヘッダーの追加"), - ("Add footer", "フッターの追加"), - ("(none)", "(なし)"), - ("Header", "ヘッダー"), - ("Footer", "フッター"), - ("Page\nNumber", "ページ\n番号"), - ("Number\nof Pages", "ページ数"), - ("Current\nDate", "現在の\n日付"), - ("Current\nTime", "現在の\n時刻"), - ("File\nPath", "ファイルの\nパス"), - ("File\nName", "ファイル名"), - ("Sheet\nName", "シート名"), - ("Go to\nHeader", "ヘッダーに\n移動"), - ("Go to\nFooter", "フッターに\n移動"), - ("Page Number", "ページ番号"), - ("Number of Pages", "ページ数"), - ("Current Date", "現在の日付"), - ("Current Time", "現在の時刻"), - ("File Path", "ファイルのパス"), - ("File Name", "ファイル名"), - ("Sheet Name", "シート名"), - ("Go to Header", "ヘッダーに移動"), - ("Different First Page", "先頭ページのみ別指定"), - ("Different Odd & Even Pages", "奇数/偶数ページ別指定"), - ("Go to Footer", "フッターに移動"), - ("Ruler", "ルーラー"), - // File › Backstage view. - ("File", "ファイル"), - ("Back", "戻る"), - ("New", "新規"), - ("Open", "開く"), - ("Info", "情報"), - ("Save", "上書き保存"), - ("Save As", "名前を付けて保存"), - ("Export", "エクスポート"), - ("Close", "閉じる"), - ("Options", "オプション"), - ("Blank workbook", "空白のブック"), - ("Recent", "最近使ったアイテム"), - ("No recent workbooks yet.", "最近使ったブックはまだありません。"), - ("More workbooks", "その他のブック"), - ("Modified", "更新日時"), - ("Not available", "利用できません"), - ("Just now", "たった今"), - ("Yesterday", "昨日"), - ("{n} min ago", "{n} 分前"), - ("{n} h ago", "{n} 時間前"), - ("{n} days ago", "{n} 日前"), - ("{n} weeks ago", "{n} 週間前"), - ("{n} months ago", "{n} か月前"), - ("{n} years ago", "{n} 年前"), - ("Browse…", "参照…"), - ("Not saved yet", "まだ保存されていません"), - ("Location", "場所"), - ("Sheets", "シート"), - ("Protect Workbook", "ブックの保護"), - ( - "Sheet structure is locked: sheets can't be added, moved, renamed or deleted.", - "シートの構成はロックされています。シートの追加、移動、名前の変更、削除はできません。", - ), - ( - "Lock the sheet structure so sheets can't be added, moved, renamed or deleted.", - "シートの構成をロックして、シートの追加、移動、名前の変更、削除をできないようにします。", - ), - ("Properties", "プロパティ"), - ("Title", "タイトル"), - ("Subject", "件名"), - ("Author", "作成者"), - ("Company", "会社名"), - ("Keywords", "キーワード"), - ("Description", "説明"), - ("No workbook is open.", "ブックが開かれていません。"), - ("Save as type", "ファイルの種類"), - ("Excel Workbook (*.xlsx)", "Excel ブック (*.xlsx)"), - ("CSV UTF-8 (Comma delimited) (*.csv)", "CSV UTF-8 (コンマ区切り) (*.csv)"), - ("Web Page (*.html)", "Web ページ (*.html)"), - ("PDF (*.pdf)", "PDF ファイル (*.pdf)"), - ("Download", "ダウンロード"), - ( - "A CSV file, web page or PDF is a copy: the workbook keeps its own file.", - "CSV ファイル、Web ページ、PDF はコピーです。ブックは元のファイルのままです。", - ), - ("Save the workbook under another name or in another folder.", "ブックを別の名前または別のフォルダーに保存します。"), - ("Print Active Sheets", "作業中のシートを印刷"), - ("Print Entire Workbook", "ブック全体を印刷"), - ("Fit Sheet on One Page", "シートを 1 ページに印刷"), - ("Page Setup…", "ページ設定…"), - ("Page {page} of {pages}", "{page} / {pages} ページ"), - ("Nothing to print.", "印刷する内容がありません。"), - ("Previous page", "前のページ"), - ("Next page", "次のページ"), - ("Create PDF", "PDF の作成"), - ("Save the sheet as a PDF document that keeps its page layout.", "ページ レイアウトを保ったまま、シートを PDF ドキュメントとして保存します。"), - ("Change File Type", "ファイルの種類の変更"), - ("CSV (Comma delimited)", "CSV (コンマ区切り)"), - ("Save the active sheet as comma-separated text.", "作業中のシートをコンマ区切りのテキストとして保存します。"), - ("Web Page (.html)", "Web ページ (.html)"), - ("Save the workbook as a web page.", "ブックを Web ページとして保存します。"), - ("Options|General", "全般"), - ("Options|Save", "保存"), - ("Show formula bar", "数式バーを表示する"), - ("Enable AutoComplete for cell values", "セルの値にオートコンプリートを使用する"), - ("Save .xlsx workbooks automatically after every change", "変更のたびに .xlsx ブックを自動的に保存する"), - ("Workbook calculation", "ブックの計算"), - ("Enable iterative calculation", "反復計算を行う"), - ("Calculation settings are saved with the workbook.", "計算の設定はブックと共に保存されます。"), -]; - #[cfg(test)] mod tests { use super::*; #[test] fn translations_are_unique_and_preserve_unknown_text() { - for (i, (en, ja)) in JAPANESE.iter().enumerate() { + for (i, (en, ja)) in ja::CORE.iter().enumerate() { assert!(!ja.is_empty()); - assert!(JAPANESE.iter().take(i).all(|(other, _)| en != other)); + assert!(ja::CORE.iter().take(i).all(|(other, _)| en != other)); assert_eq!(Language::En.tr(en), en.rsplit_once('|').map_or(*en, |(_, label)| label)); } - for (english, _) in JAPANESE { + for (english, _) in ja::CORE { assert!(zh::translate(english).is_some_and(|text| !text.is_empty()), "missing Simplified Chinese: {english}"); assert!(ko::translate(english).is_some_and(|text| !text.is_empty()), "missing Korean: {english}"); assert!(ru::translate(english).is_some_and(|text| !text.is_empty()), "missing Russian: {english}"); @@ -687,7 +271,7 @@ mod tests { // `tr` returns a found translation as it is, so a catalog that keeps `context|` in its // value shows it on screen (File › Options read "Options|Général" in French). for language in Language::ALL { - for (english, _) in JAPANESE { + for (english, _) in ja::CORE { let shown = language.tr(english); assert!(!shown.contains('|'), "{} shows a context prefix for {english}: {shown}", language.code()); } diff --git a/crates/ui-egui/src/i18n/ja.rs b/crates/ui-egui/src/i18n/ja.rs new file mode 100644 index 000000000..61cb8242f --- /dev/null +++ b/crates/ui-egui/src/i18n/ja.rs @@ -0,0 +1,1115 @@ +//! Japanese translations for the interface strings in `i18n.rs`; labels follow Excel for Mac's +//! Japanese wording, and anything absent falls back to English. +//! +//! [`CORE`] is the shared reference catalog every language translates: the ribbon, sheet tabs, +//! widgets and the most common dialog labels. [`DIALOGS`] adds the dialog titles and labels, +//! message boxes, Backstage/File-view items, template names and native-menu strings the Brazilian +//! Portuguese catalog (`pt.rs`) covers on top of it. The two lists never overlap. + +/// English label → Japanese, the shared reference set every catalog covers. +pub(super) const CORE: &[(&str, &str)] = &[ + ("Paste", "貼り付け"), + ("Paste Values", "値の貼り付け"), + ("Paste Formulas", "数式の貼り付け"), + ("Paste Formatting", "書式の貼り付け"), + ("Transpose", "行列を入れ替え"), + ("Paste Link", "リンクの貼り付け"), + ("Paste Special…", "形式を選択して貼り付け…"), + ("Insert Copied Cells", "コピーしたセルの挿入"), + ("Insert Copied Cells…", "コピーしたセルの挿入…"), + ("Insert Cut Cells", "切り取ったセルの挿入"), + ("Insert Paste", "挿入貼り付け"), + ("Cut (⌘X)", "切り取り (⌘X)"), + ("Copy (⌘C)", "コピー (⌘C)"), + ("Format Painter (double-click to keep it on)", "書式のコピー/貼り付け (ダブルクリックで固定)"), + ("Bold (⌘B)", "太字 (⌘B)"), + ("Italic (⌘I)", "斜体 (⌘I)"), + ("Underline (⌘U)", "下線 (⌘U)"), + ("Double Underline", "二重下線"), + ("Strikethrough", "取り消し線"), + ("Underline", "下線"), + ("Increase Font Size", "フォントの拡大"), + ("Decrease Font Size", "フォントの縮小"), + ("Wrap Text", "折り返して全体を表示"), + ("Merge & Center", "セルを結合して中央揃え"), + ("Merge Cells", "セルの結合"), + ("Merge Across", "横方向に結合"), + ("Unmerge Cells", "セル結合の解除"), + ("Fill Color", "塗りつぶしの色"), + ("Font Color", "フォントの色"), + ("Borders", "罫線"), + ("Top\nAlign", "上揃え"), + ("Middle\nAlign", "中央揃え (縦)"), + ("Bottom\nAlign", "下揃え"), + ("Left", "左"), + ("Right", "右"), + ("Center", "中央"), + ("Horizontal", "水平"), + ("Vertical Text", "縦書き"), + ("Decrease Indent", "インデントを減らす"), + ("Increase Indent", "インデントを増やす"), + ("Orientation", "方向"), + ("Page Layout|Orientation", "印刷の向き"), + ("Angle Counterclockwise", "左回りに回転"), + ("Angle Clockwise", "右回りに回転"), + ("Rotate Text Up", "文字列を上に回転"), + ("Rotate Text Down", "文字列を下に回転"), + ("Accounting Number Format", "通貨表示形式"), + ("Percent Style", "パーセント表示"), + ("Comma Style", "桁区切りスタイル"), + ("Increase Decimal", "小数点以下の桁数を増やす"), + ("Decrease Decimal", "小数点以下の桁数を減らす"), + ("More Accounting Formats…", "その他の通貨表示形式…"), + ("Conditional\nFormatting", "条件付き書式"), + ("Conditional Formatting", "条件付き書式"), + ("Format\nas Table", "テーブルとして書式設定"), + ("Cell\nStyles", "セルのスタイル"), + ("Format Cells…", "セルの書式設定…"), + ("Format Cell Alignment…", "セルの配置…"), + ("Format\nPane", "書式ウィンドウ"), + ("Format", "書式"), + ("Insert", "挿入"), + ("Insert Cells…", "セルの挿入…"), + ("Delete", "削除"), + ("Delete Cells…", "セルの削除…"), + ("Insert Sheet Rows", "シートの行を挿入"), + ("Insert Sheet Columns", "シートの列を挿入"), + ("Delete Sheet Rows", "シートの行を削除"), + ("Delete Sheet Columns", "シートの列を削除"), + ("Row Height…", "行の高さ…"), + ("AutoFit Row Height", "行の高さを自動調整"), + ("Column Width…", "列の幅…"), + ("AutoFit Column Width", "列の幅を自動調整"), + ("Default Width…", "標準の幅…"), + ("Hide Rows", "行を表示しない"), + ("Unhide Rows", "再表示"), + ("Hide Columns", "列の表示/非表示"), + ("Unhide Columns", "再表示"), + ("Lock Cell", "セルのロック"), + ("Clear", "クリア"), + ("Clear All", "すべてクリア"), + ("Clear Formats", "書式のクリア"), + ("Clear Contents", "数式と値のクリア"), + ("Clear Comments and Notes", "コメントとメモのクリア"), + ("Clear Hyperlinks", "ハイパーリンクのクリア"), + ("AutoSum", "オート SUM"), + ("AutoSum (⌘⇧T)", "オート SUM (⌘⇧T)"), + ("Flash\nFill", "フラッシュ フィル"), + ("Flash Fill", "フラッシュ フィル"), + ("Fill", "フィル"), + ("Clear Print Area", "印刷範囲のクリア"), + ("Find &\nSelect", "検索と選択"), + ("Find…", "検索…"), + ("Replace…", "置換…"), + ("Go To…", "ジャンプ…"), + ("Go To Special…", "セルを選択…"), + ("PivotTable", "ピボットテーブル"), + ("Recommended\nCharts", "推奨グラフ"), + ("Table", "テーブル"), + ("Pictures", "画像"), + ("Shapes", "図形"), + ("Icons", "アイコン"), + ("Text\nBox", "テキスト ボックス"), + ("Comment", "コメント"), + ("New\nComment", "新しいコメント"), + ("New Note", "新しいメモ"), + ("Show/Hide Note", "メモの表示/非表示"), + ("Header &\nFooter", "ヘッダーとフッター"), + ("Text to\nColumns", "区切り位置"), + ("Link", "リンク"), + ("Symbol", "記号"), + ("Sparklines", "スパークライン"), + ("Checkbox", "チェックボックス"), + ("Insert checkboxes in the selected cells", "選択したセルにチェックボックスを挿入"), + ("Header & Footer", "ヘッダーとフッター"), + ("Draw with ink", "インクで描画"), + ("Eraser", "消しゴム"), + ("Ink to\nShape", "インクを図形に変換"), + ("Select\nObjects", "オブジェクトの選択"), + ("Themes", "テーマ"), + ("Margins", "余白"), + ("Left Margin", "左余白"), + ("Right Margin", "右余白"), + ("Top Margin", "上余白"), + ("Bottom Margin", "下余白"), + ("Header Margin", "ヘッダーの余白"), + ("Footer Margin", "フッターの余白"), + ("Size", "サイズ"), + ("Print\nArea", "印刷範囲"), + ("Set Print Area", "印刷範囲の設定"), + ("Breaks", "改ページ"), + ("Insert Page Break", "改ページの挿入"), + ("Remove Page Break", "改ページの解除"), + ("Reset All Page Breaks", "すべての改ページを解除"), + ("Print\nTitles", "印刷タイトル"), + ("Sheet\nRight-to-Left", "シートを右から左へ"), + ("Sheet Right-to-Left", "シートを右から左へ"), + ("Narrow", "狭い"), + ("Wide", "広い"), + ("Normal", "標準"), + ("Portrait", "縦"), + ("Landscape", "横"), + ("Custom Margins…", "ユーザー設定の余白…"), + ("Insert\nFunction", "関数の挿入"), + ("Name\nManager", "名前の管理"), + ("Define Name", "名前の定義"), + ("Use in Formula", "数式で使用"), + ("Create from Selection", "選択範囲から作成"), + ("Trace Precedents", "参照元のトレース"), + ("Trace Dependents", "参照先のトレース"), + ("Remove Arrows", "矢印の解除"), + ("Show Formulas", "数式の表示"), + ("Error Checking", "エラーチェック"), + ("Evaluate Formula", "数式の検証"), + ("Watch Window", "ウォッチ ウィンドウ"), + ("Calculation\nOptions", "計算方法の設定"), + ("Calculate Now", "再計算実行"), + ("Calculate Sheet", "シートの再計算"), + ("Automatic", "自動"), + ("Automatic Except for Data Tables", "データ テーブル以外は自動"), + ("Manual", "手動"), + ("Sort &\nFilter", "並べ替えとフィルター"), + ("Sort", "並べ替え"), + ("Sort A to Z", "昇順"), + ("Sort Z to A", "降順"), + ("Custom Sort…", "ユーザー設定の並べ替え…"), + ("Filter", "フィルター"), + ("Reapply", "再適用"), + ("Get Data\n(Text/CSV)", "データの取得 (テキスト/CSV)"), + ("Remove\nDuplicates", "重複の削除"), + ("Data\nValidation", "データの入力規則"), + ("Data Validation", "データの入力規則"), + ("Data Validation…", "データの入力規則…"), + ("Circle Invalid Data", "無効なデータをマーク"), + ("Clear Validation", "入力規則のクリア"), + ("Group", "グループ化"), + ("Ungroup", "グループ解除"), + ("Show Detail", "詳細データの表示"), + ("Hide Detail", "詳細を表示しない"), + ("Subtotal", "小計"), + ("Data\nAnalysis", "データ分析"), + ("Data Analysis", "データ分析"), + ("Solver", "ソルバー"), + ("What-If\nAnalysis", "What-If 分析"), + ("Data Table…", "データ テーブル…"), + ("Scenario Manager…", "シナリオ マネージャー…"), + ("Goal Seek…", "ゴール シーク…"), + ("Forecast\nSheet", "予測シート"), + ("Spelling", "スペルチェック"), + ("Check\nAccessibility", "アクセシビリティ チェック"), + ("Threaded Comments", "スレッド化されたコメント"), + ("Show\nComments", "コメントの表示"), + ("Previous", "前へ"), + ("Next", "次へ"), + ("Previous Comment", "前のコメント"), + ("Next Comment", "次のコメント"), + ("Show All Notes", "すべてのメモを表示"), + ("Convert to Comments", "コメントに変換"), + ("Protect\nWorkbook", "ブックの保護"), + ("Allow Edit\nRanges", "範囲の編集を許可"), + ("Allow Edit Ranges", "範囲の編集を許可"), + ("Unprotect\nSheet", "シート保護の解除"), + ("Protect Sheet…", "シートの保護…"), + ("Comments", "コメント"), + ("Notes", "メモ"), + ("Page Break\nPreview", "改ページ プレビュー"), + ("Page\nLayout", "ページ レイアウト"), + ("Formula Bar", "数式バー"), + ("Gridlines", "目盛線"), + ("Headings", "見出し"), + ("Zoom", "ズーム"), + ("100%", "100%"), + ("Zoom to\nSelection", "選択範囲を拡大"), + ("Freeze\nPanes", "ウィンドウ枠の固定"), + ("Freeze Panes", "ウィンドウ枠の固定"), + ("Freeze Top Row", "最上行の固定"), + ("Freeze First Column", "最左列の固定"), + ("Unfreeze Panes", "ウィンドウ枠固定の解除"), + ("Dark Mode", "ダーク モード"), + ("Display theme", "表示テーマ"), + ("Animations", "アニメーション"), + ( + "Glide the selection outline to the cell you move to instead of jumping there", + "選択範囲の枠を、移動先のセルまで滑らかに動かします(瞬時には切り替えません)", + ), + ("System", "システム"), + ("Light", "ライト"), + ("Dark", "ダーク"), + ("Interface language", "表示言語"), + ("Interface size", "表示サイズ"), + ("Auto", "自動"), + ("Drag to freeze columns", "ドラッグして列を固定"), + ("Drag to freeze rows", "ドラッグして行を固定"), + ("Command\nPalette", "コマンド パレット"), + ("Agent\nControl", "エージェント制御"), + ("Action\nJournal", "操作ジャーナル"), + ("About\nGridCraft", "GridCraft について"), + ("Share", "共有"), + ("Add Chart\nElement", "グラフ要素を追加"), + ("Change\nChart Type", "グラフの種類の変更"), + ("Switch\nRow/Column", "行/列の切り替え"), + ("Select\nData", "データの選択"), + ("Data Labels: None", "データ ラベル: なし"), + ("Data Labels: Show", "データ ラベル: 表示"), + ("Legend: None", "凡例: なし"), + ("Legend: Bottom", "凡例: 下"), + ("Legend: Top", "凡例: 上"), + ("Legend: Right", "凡例: 右"), + ("Gridlines: None", "目盛線: なし"), + ("Gridlines: Show", "目盛線: 表示"), + ("Chart\nTitle", "グラフ タイトル"), + ("Delete\nChart", "グラフの削除"), + ("Convert\nto Range", "範囲に変換"), + ("Table\nStyles", "テーブル スタイル"), + ("Top 10 Items", "上位 10 項目"), + ("Top 10%", "上位 10%"), + ("Bottom 10 Items", "下位 10 項目"), + ("Bottom 10%", "下位 10%"), + ("Above Average", "平均より上"), + ("Below Average", "平均より下"), + ("Clear Rules from Entire Sheet", "シート全体からルールをクリア"), + ("Clear Rules from Selected Cells", "選択したセルからルールをクリア"), + ("Constants", "定数"), + ("Data Bars", "データ バー"), + ("Color Scales", "カラー スケール"), + ("Icon Sets", "アイコン セット"), + ("Home", "ホーム"), + ("Draw", "描画"), + ("Page Layout", "ページ レイアウト"), + ("Formulas", "数式"), + ("Data", "データ"), + ("Review", "レビュー"), + ("View", "表示"), + ("Automate", "自動化"), + ("Table Design", "テーブル デザイン"), + ("Chart Design", "グラフ デザイン"), + ("Ready", "準備完了"), + ("Enter", "入力"), + ("Edit", "編集"), + ("Point", "ポイント"), + ("Calculate", "計算"), + ("Select destination and press Enter or choose Paste", "貼り付け先を選び、Enter キーを押すか [貼り付け] を選びます"), + ("General", "標準"), + ("Number", "数値"), + ("Currency", "通貨"), + ("Accounting", "会計"), + ("Date", "日付"), + ("Time", "時刻"), + ("Percentage", "パーセンテージ"), + ("Fraction", "分数"), + ("Scientific", "指数"), + ("Text", "文字列"), + ("Special", "特殊"), + ("Custom", "ユーザー設定"), + ("Short Date", "日付"), + ("Long Date", "長い日付"), + ("More Number Formats…", "その他の表示形式…"), + ("Financial", "財務"), + ("Logical", "論理"), + ("Date &\nTime", "日付/時刻"), + ("Lookup &\nReference", "検索/行列"), + ("Math &\nTrig", "数学/三角"), + ("More\nFunctions", "その他の関数"), + ("Sheet Options|View", "画面"), + ("Print", "印刷"), + ("Click to add data", "クリックしてデータを追加"), + ("Add header", "ヘッダーの追加"), + ("Add footer", "フッターの追加"), + ("(none)", "(なし)"), + ("Header", "ヘッダー"), + ("Footer", "フッター"), + ("Page\nNumber", "ページ\n番号"), + ("Number\nof Pages", "ページ数"), + ("Current\nDate", "現在の\n日付"), + ("Current\nTime", "現在の\n時刻"), + ("File\nPath", "ファイルの\nパス"), + ("File\nName", "ファイル名"), + ("Sheet\nName", "シート名"), + ("Go to\nHeader", "ヘッダーに\n移動"), + ("Go to\nFooter", "フッターに\n移動"), + ("Page Number", "ページ番号"), + ("Number of Pages", "ページ数"), + ("Current Date", "現在の日付"), + ("Current Time", "現在の時刻"), + ("File Path", "ファイルのパス"), + ("File Name", "ファイル名"), + ("Sheet Name", "シート名"), + ("Go to Header", "ヘッダーに移動"), + ("Different First Page", "先頭ページのみ別指定"), + ("Different Odd & Even Pages", "奇数/偶数ページ別指定"), + ("Go to Footer", "フッターに移動"), + ("Ruler", "ルーラー"), + ("File", "ファイル"), + ("Back", "戻る"), + ("New", "新規"), + ("Open", "開く"), + ("Info", "情報"), + ("Save", "上書き保存"), + ("Save As", "名前を付けて保存"), + ("Export", "エクスポート"), + ("Close", "閉じる"), + ("Options", "オプション"), + ("Blank workbook", "空白のブック"), + ("Recent", "最近使ったアイテム"), + ("No recent workbooks yet.", "最近使ったブックはまだありません。"), + ("More workbooks", "その他のブック"), + ("Modified", "更新日時"), + ("Not available", "利用できません"), + ("Just now", "たった今"), + ("Yesterday", "昨日"), + ("{n} min ago", "{n} 分前"), + ("{n} h ago", "{n} 時間前"), + ("{n} days ago", "{n} 日前"), + ("{n} weeks ago", "{n} 週間前"), + ("{n} months ago", "{n} か月前"), + ("{n} years ago", "{n} 年前"), + ("Browse…", "参照…"), + ("Not saved yet", "まだ保存されていません"), + ("Location", "場所"), + ("Sheets", "シート"), + ("Protect Workbook", "ブックの保護"), + ( + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted.", + "シートの構成はロックされています。シートの追加、移動、名前の変更、削除はできません。", + ), + ( + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted.", + "シートの構成をロックして、シートの追加、移動、名前の変更、削除をできないようにします。", + ), + ("Properties", "プロパティ"), + ("Title", "タイトル"), + ("Subject", "件名"), + ("Author", "作成者"), + ("Company", "会社名"), + ("Keywords", "キーワード"), + ("Description", "説明"), + ("No workbook is open.", "ブックが開かれていません。"), + ("Save as type", "ファイルの種類"), + ("Excel Workbook (*.xlsx)", "Excel ブック (*.xlsx)"), + ("CSV UTF-8 (Comma delimited) (*.csv)", "CSV UTF-8 (コンマ区切り) (*.csv)"), + ("Web Page (*.html)", "Web ページ (*.html)"), + ("PDF (*.pdf)", "PDF ファイル (*.pdf)"), + ("Download", "ダウンロード"), + ( + "A CSV file, web page or PDF is a copy: the workbook keeps its own file.", + "CSV ファイル、Web ページ、PDF はコピーです。ブックは元のファイルのままです。", + ), + ("Save the workbook under another name or in another folder.", "ブックを別の名前または別のフォルダーに保存します。"), + ("Print Active Sheets", "作業中のシートを印刷"), + ("Print Entire Workbook", "ブック全体を印刷"), + ("Fit Sheet on One Page", "シートを 1 ページに印刷"), + ("Page Setup…", "ページ設定…"), + ("Page {page} of {pages}", "{page} / {pages} ページ"), + ("Nothing to print.", "印刷する内容がありません。"), + ("Previous page", "前のページ"), + ("Next page", "次のページ"), + ("Create PDF", "PDF の作成"), + ("Save the sheet as a PDF document that keeps its page layout.", "ページ レイアウトを保ったまま、シートを PDF ドキュメントとして保存します。"), + ("Change File Type", "ファイルの種類の変更"), + ("CSV (Comma delimited)", "CSV (コンマ区切り)"), + ("Save the active sheet as comma-separated text.", "作業中のシートをコンマ区切りのテキストとして保存します。"), + ("Web Page (.html)", "Web ページ (.html)"), + ("Save the workbook as a web page.", "ブックを Web ページとして保存します。"), + ("Options|General", "全般"), + ("Options|Save", "保存"), + ("Show formula bar", "数式バーを表示する"), + ("Enable AutoComplete for cell values", "セルの値にオートコンプリートを使用する"), + ("Save .xlsx workbooks automatically after every change", "変更のたびに .xlsx ブックを自動的に保存する"), + ("Workbook calculation", "ブックの計算"), + ("Enable iterative calculation", "反復計算を行う"), + ("Calculation settings are saved with the workbook.", "計算の設定はブックと共に保存されます。"), +]; + +/// English label → Japanese for the dialog, message, Backstage and menu strings beyond [`CORE`]. +pub(super) const DIALOGS: &[(&str, &str)] = &[ + ("OK", "OK"), + ("Cancel", "キャンセル"), + ("Don't Save", "保存しない"), + ("Open…", "開く…"), + ("Show password", "パスワードの表示"), + ("Start a new workbook", "新しいブックの作成"), + ("Household Budget", "家計簿"), + ("Quarterly Sales Dashboard", "四半期売上ダッシュボード"), + ("Gradebook", "成績表"), + ("this workbook", "このブック"), + ("This workbook", "このブック"), + ("Do you want to save the changes you made to {title}?", "{title} への変更を保存しますか?"), + ("Save a copy as .{format}", ".{format} としてコピーを保存"), + ("Select a chart first.", "先にグラフを選択してください。"), + ("Text Box", "テキスト ボックス"), + ("Select Data", "データの選択"), + ("Row Height", "行の高さ"), + ("Column Width", "列の幅"), + ("Standard Width", "標準の幅"), + ("Rename Sheet", "シート名の変更"), + ("Move or Copy", "移動またはコピー"), + ("Protect Sheet", "シートの保護"), + ("Protect Structure and Windows", "構造とウィンドウの保護"), + ("Unprotect Workbook", "ブック保護の解除"), + ("Unprotect Sheet", "シート保護の解除"), + ("Password", "パスワード"), + ("Unhide", "再表示"), + ("Paste Special", "形式を選択して貼り付け"), + ("Series", "数列"), + ("New Comment", "新しいコメント"), + ("Insert Hyperlink", "ハイパーリンクの挿入"), + ("Create Sparklines", "スパークラインの作成"), + ("Page Setup", "ページ設定"), + ("Convert Text to Columns", "区切り位置指定ウィザード"), + ("Remove Duplicates", "重複の削除"), + ("Goal Seek", "ゴール シーク"), + ("Create Forecast Worksheet", "予測シートの作成"), + ("Solver Parameters", "ソルバー パラメーター"), + ("Solver Results", "ソルバーの結果"), + ("Edit Name", "名前の編集"), + ("New Name", "新しい名前"), + ("Format Cells", "セルの書式設定"), + ("Formula Builder", "数式ビルダー"), + ("Find and Replace", "検索と置換"), + ("Go To", "ジャンプ"), + ("Insert Calculated Field", "計算のフィールドの挿入"), + ("Go To Special", "セルを選択"), + ("Name Manager", "名前の管理"), + ("Conditional Formatting Rules Manager", "条件付き書式ルールの管理"), + ("Search Commands", "コマンドの検索"), + ("Agent Control", "エージェント制御"), + ("About GridCraft", "GridCraft について"), + ("Insert Chart", "グラフの挿入"), + ("Select Data Source", "データ ソースの選択"), + ("Action Journal", "操作ジャーナル"), + ("Macros", "マクロ"), + ("Workbook Statistics", "ブックの統計情報"), + ("Accessibility", "アクセシビリティ"), + ("Chart Title", "グラフ タイトル"), + ("Place Picture in Cell", "セルに画像を配置"), + ("Place Picture over Cells", "セルの上に画像を配置"), + ("Pick From List", "リストから選択"), + ("Save a Copy", "コピーを保存"), + ("Save Changes?", "変更を保存しますか?"), + ("Shift cells right", "セルを右に移動"), + ("Shift cells down", "セルを下に移動"), + ("Shift cells left", "セルを左に移動"), + ("Shift cells up", "セルを上に移動"), + ("Entire row", "行全体"), + ("Entire column", "列全体"), + ("Row height (pixels):", "行の高さ (ピクセル):"), + ("Column width (characters):", "列の幅 (文字数):"), + ("Standard column width (pixels):", "標準の列幅 (ピクセル):"), + ("Name:", "名前:"), + ("Before sheet (position, 0 = first):", "シートの前 (位置、0 = 先頭):"), + ("Create a copy", "コピーを作成する"), + ("Sheets: {sheets}", "シート: {sheets}"), + ("Password (optional):", "パスワード (省略可能):"), + ("Password:", "パスワード:"), + ("Allow all users of this sheet to:", "このシートのすべてのユーザーに許可する操作:"), + ("Format cells", "セルの書式設定"), + ("Format columns", "列の書式設定"), + ("Format rows", "行の書式設定"), + ("Insert rows", "行の挿入"), + ("Delete rows", "行の削除"), + ("Use AutoFilter", "オートフィルターを使用する"), + (" (password, unlocked)", " (パスワード、ロック解除)"), + (" (password)", " (パスワード)"), + ("No ranges yet.", "範囲はまだありません。"), + ("Ranges that stay editable when the sheet is protected:", "シートが保護されている間も編集できる範囲:"), + ("Action", "操作"), + ("Modify", "変更"), + ("Unlock with password", "パスワードでロック解除"), + ("Title:", "タイトル:"), + ("Refers to cells:", "参照先:"), + ("Range password:", "範囲のパスワード:"), + ("New title (Modify):", "新しいタイトル (変更):"), + ("Remove the password (Modify)", "パスワードの削除 (変更)"), + ("'{file}' is protected.", "'{file}' は保護されています。"), + ("Unhide sheet:", "再表示するシート:"), + ("Hidden: {sheets}", "非表示: {sheets}"), + ("All", "すべて"), + ("Formulas (F)", "数式 (F)"), + ("Values (V)", "値 (V)"), + ("Formats (T)", "書式 (T)"), + ("Comments and notes (C)", "コメントとメモ (C)"), + ("Validation", "入力規則"), + ("All except borders", "罫線を除くすべて"), + ("Column widths", "列幅"), + ("Formulas and number formats", "数式と数値の書式"), + ("Values and number formats", "値と数値の書式"), + ("Operation", "演算"), + ("Add", "加算"), + ("Subtract", "減算"), + ("Multiply", "乗算"), + ("Divide", "除算"), + ("Skip blanks", "空白セルを無視する"), + ("Transpose (E)", "行列を入れ替える (E)"), + ("Series in", "方向"), + ("Columns", "列"), + ("Rows", "行"), + ("Type", "種類"), + ("Linear", "線形"), + ("Growth", "等比"), + ("Date unit", "日付単位"), + ("Day", "日"), + ("Weekday", "曜日"), + ("Month", "月"), + ("Year", "年"), + ("Step value:", "増分値:"), + ("Stop value:", "停止値:"), + ("Start a conversation:", "会話を開始:"), + ("Note:", "メモ:"), + ("Display:", "表示文字列:"), + ("Link to (web address, e-mail or Sheet!A1):", "リンク先 (Web アドレス、電子メール アドレス、または Sheet!A1):"), + ("ScreenTip:", "スクリーン ヒント:"), + ("Data Range:", "データ範囲:"), + ("Location Range:", "配置先:"), + ("Markers", "マーカー"), + ("Footer:", "フッター:"), + ("Left margin (in):", "左余白 (インチ):"), + ("Right margin (in):", "右余白 (インチ):"), + ("Top margin (in):", "上余白 (インチ):"), + ("Bottom margin (in):", "下余白 (インチ):"), + ("Header (in):", "ヘッダー (インチ):"), + ("Footer (in):", "フッター (インチ):"), + ("Tab", "タブ"), + ("Semicolon", "セミコロン"), + ("Comma", "コンマ"), + ("Space", "スペース"), + ("Other:", "その他:"), + ("Treat consecutive delimiters as one", "連続した区切り文字は 1 文字として扱う"), + ("Destination:", "表示先:"), + ("My data has headers", "先頭行をデータの見出しとして使用する"), + ("Columns (blank = all, e.g. A,C):", "列 (空白 = すべて、例: A,C):"), + ("Timeline range (blank: first column of the selection):", "タイムラインの範囲 (空白: 選択範囲の最初の列):"), + ("Values range (blank: second column of the selection):", "値の範囲 (空白: 選択範囲の 2 番目の列):"), + ("Confidence interval", "信頼区間"), + ("Confidence level (%):", "信頼水準 (%):"), + ("Seasonality (auto, 0 for none, or a season length):", "周期性 (自動、なしの場合は 0、または 1 周期の長さ):"), + ("Fill missing points using", "欠落しているポイントの補完方法"), + ("Interpolation", "補間"), + ("Zeros", "ゼロ"), + ("Aggregate duplicates using", "重複を集計する方法"), + ("Average", "平均"), + ("Count", "個数"), + ("CountA", "空白を除く個数"), + ("Max", "最大値"), + ("Median", "中央値"), + ("Min", "最小値"), + ("Sum", "合計"), + ("Product", "積"), + ("Include forecast statistics", "予測の統計情報を含める"), + ("Chart", "グラフ"), + ("Line chart", "折れ線グラフ"), + ("Column chart", "縦棒グラフ"), + ("At each change in (column letter):", "基準 (列記号):"), + ("Use function", "集計の方法"), + ("Add subtotal to (columns, e.g. C,D):", "集計するフィールド (列、例: C,D):"), + ("Magnification", "倍率"), + ("Custom (%):", "ユーザー設定 (%):"), + ("Scope (Workbook or sheet name):", "範囲 (ブックまたはシート名):"), + ("Comment:", "コメント:"), + ("Refers to:", "参照先:"), + ("Allow", "入力値の種類"), + ("Any value", "任意の値"), + ("Whole number", "整数"), + ("Decimal", "小数"), + ("List", "リスト"), + ("Text length", "文字列の長さ"), + ("between", "次の値の間"), + ("not between", "次の値の間以外"), + ("equal to", "指定の値に等しい"), + ("not equal to", "指定の値に等しくない"), + ("greater than", "指定の値より大きい"), + ("less than", "指定の値より小さい"), + ("greater than or equal to", "指定の値以上"), + ("less than or equal to", "指定の値以下"), + ("Minimum / Source / Formula:", "最小値 / 元の値 / 数式:"), + ("Maximum:", "最大値:"), + ("Ignore blank", "空白を無視する"), + ("In-cell dropdown", "セル内のドロップダウン リスト"), + ("Input message:", "入力メッセージ:"), + ("Error style", "エラー メッセージのスタイル"), + ("Stop", "停止"), + ("Warning", "警告"), + ("Information", "情報"), + ("Error message:", "エラー メッセージ:"), + ("Format cells that are (value):", "セルの値が次の値のとき書式設定する (値):"), + ("and:", "と:"), + ("Format cells that contain the text:", "次の文字列を含むセルを書式設定:"), + ("Format cells that contain a date occurring:", "日付が次の期間にあるセルを書式設定:"), + ("Today", "今日"), + ("Tomorrow", "明日"), + ("In the last 7 days", "過去 7 日間"), + ("Last week", "先週"), + ("This week", "今週"), + ("Next week", "来週"), + ("Last month", "先月"), + ("This month", "今月"), + ("Next month", "来月"), + ("Format values where this formula is true:", "数式を使用して、書式設定するセルを決定:"), + ("with", "次の書式を適用"), + ("Light Red Fill with Dark Red Text", "濃い赤の文字、薄い赤の背景"), + ("Yellow Fill with Dark Yellow Text", "濃い黄色の文字、黄色の背景"), + ("Green Fill with Dark Green Text", "濃い緑の文字、緑の背景"), + ("Light Red Fill", "薄い赤の背景"), + ("Red Text", "赤の文字"), + ("Red Border", "赤い枠線"), + ("Formula:", "数式:"), + ("Select", "選択"), + ("Blanks", "空白セル"), + ("Errors", "エラー値"), + ("Numbers", "数値"), + ("Current region", "現在の領域"), + ("Last cell", "最後のセル"), + ("Visible cells only", "可視セルのみ"), + ("Conditional formats", "条件付き書式"), + ("Data validation", "入力規則"), + ("Horizontal axis title:", "横軸ラベル:"), + ("Vertical axis title:", "縦軸ラベル:"), + ("No picture selected", "画像が選択されていません"), + ("Picture file path (PNG or JPEG):", "画像ファイルのパス (PNG または JPEG):"), + ("Description (optional):", "説明 (省略可能):"), + ("Fits inside the selected cell and moves with its content.", "選択したセル内に収まり、内容と一緒に移動します。"), + ("Choose a PNG or JPEG no larger than 16 MB.", "16 MB 以下の PNG または JPEG を選択してください。"), + ("About", "バージョン情報"), + ("Contributors", "貢献者"), + ("Models", "モデル"), + ("Version {version}", "バージョン {version}"), + ("Join the ArtCraft Discord", "ArtCraft Discord に参加"), + ("This workbook has no scripts or macros.", "このブックにはスクリプトもマクロもありません。"), + ("(unnamed)", "(名前なし)"), + ("— VBA project (preserved, not run)", "— VBA プロジェクト (保持されますが、実行されません)"), + ("— 1 step", "— 1 ステップ"), + ("— {steps} steps", "— {steps} ステップ"), + ("Alignment", "配置"), + ("Font", "フォント"), + ("Border", "罫線"), + ("Format Cells|Fill", "塗りつぶし"), + ("Protection", "保護"), + ("Category:", "分類:"), + ("Sample", "サンプル"), + ("Type (custom format code):", "種類 (ユーザー定義の書式記号):"), + ("Vertical", "縦位置"), + ("Justify", "両端揃え"), + ("Center Across Selection", "選択範囲内で中央"), + ("Distributed", "均等割り付け"), + ("Top", "上"), + ("Bottom", "下"), + ("Indent", "インデント"), + ("Orientation (degrees)", "方向 (度)"), + ("Wrap text", "折り返して全体を表示する"), + ("Shrink to fit", "縮小して全体を表示する"), + ("Bold", "太字"), + ("Italic", "斜体"), + ("None", "なし"), + ("Single", "下線"), + ("Double", "二重下線"), + ("Single Accounting", "会計 (一重)"), + ("Double Accounting", "会計 (二重)"), + ("Superscript", "上付き"), + ("Subscript", "下付き"), + ("Color:", "色:"), + ("Outline", "外枠"), + ("Diagonal ↘", "斜め (右下がり)"), + ("Diagonal ↗", "斜め (右上がり)"), + ("none", "なし"), + ("thin", "細線"), + ("medium", "中線"), + ("thick", "太線"), + ("dashed", "破線"), + ("dotted", "点線"), + ("double", "二重線"), + ("Background Color:", "背景色:"), + ("Locked", "ロック"), + ("Hidden", "非表示"), + ("Search:", "検索:"), + ("e.g. lookup, average, date", "例: 検索、平均、日付"), + ("Date & Time", "日付/時刻"), + ("Lookup & Reference", "検索/行列"), + ("Math & Trig", "数学/三角"), + ("Statistical", "統計"), + ("Engineering", "エンジニアリング"), + ("Database", "データベース"), + ("Compatibility", "互換性"), + ("Web", "Web"), + ("Cube", "キューブ"), + ("Add-in and Automation", "アドインと自動化"), + ("Find", "検索"), + ("Replace", "置換"), + ("Find what:", "検索する文字列:"), + ("Replace with:", "置換後の文字列:"), + ("Match case", "大文字と小文字を区別する"), + ("Match entire cell contents", "セル内容が完全に同一である場合のみ検索"), + ("Within workbook", "ブック内"), + ("Replace All", "すべて置換"), + ("Find All", "すべて検索"), + ("Find Next", "次を検索"), + ("All done. We made {count} replacements.", "完了しました。{count} 件を置換しました。"), + ("{count} cell(s) found", "{count} 個のセルが見つかりました"), + ("Reference:", "参照:"), + ("Special…", "セルを選択…"), + ("My list has headers", "先頭行をデータの見出しとして使用する"), + ("Sort by", "最優先されるキー"), + ("Then by", "次に優先されるキー"), + ("Cell Values", "セルの値"), + ("Cell Color", "セルの色"), + ("A to Z", "昇順"), + ("Z to A", "降順"), + ("+ Add Level", "+ レベルの追加"), + ("New…", "新規作成…"), + ("Edit…", "編集…"), + ("Name", "名前"), + ("Value", "値"), + ("Refers To", "参照先"), + ("Scope", "範囲"), + ("Workbook", "ブック"), + ("No names defined", "定義された名前はありません"), + ("Recommended Charts", "推奨グラフ"), + ("All Charts", "すべてのグラフ"), + ("Clustered Column", "集合縦棒"), + ("Stacked Column", "積み上げ縦棒"), + ("100% Stacked Column", "100% 積み上げ縦棒"), + ("Clustered Bar", "集合横棒"), + ("Stacked Bar", "積み上げ横棒"), + ("100% Stacked Bar", "100% 積み上げ横棒"), + ("Line", "折れ線"), + ("Line with Markers", "マーカー付き折れ線"), + ("Stacked Line", "積み上げ折れ線"), + ("Pie", "円"), + ("Doughnut", "ドーナツ"), + ("Area", "面"), + ("Stacked Area", "積み上げ面"), + ("Scatter", "散布図"), + ("Scatter with Lines", "直線付き散布図"), + ("Radar", "レーダー"), + ("Histogram", "ヒストグラム"), + ("Waterfall", "ウォーターフォール"), + ("Funnel", "じょうご"), + ("Combo", "複合"), + ("Chart data range:", "グラフ データ範囲:"), + ("Legend Entries (Series)", "凡例項目 (系列)"), + ("Series{n}", "系列{n}"), + ("Keep", "残す"), + ("Remove", "削除"), + ("Horizontal (Category) Axis Labels:", "横軸 (項目) ラベル:"), + ("There are no conditional formatting rules on this sheet.", "このシートには条件付き書式ルールがありません。"), + ("applies to", "適用先"), + ("Type a command, e.g. freeze, chart, bold…", "コマンドを入力 (例: ウィンドウ枠の固定、グラフ、太字)…"), + ("Set cell:", "目的セル:"), + ("To value:", "目標値:"), + ("By changing cell:", "変化させるセル:"), + ("Goal Seeking found a solution: {value}", "ゴール シークで解が見つかりました: {value}"), + ("Analysis Tools", "分析ツール"), + ("Anova: Single Factor", "分散分析: 一元配置"), + ("Correlation", "相関"), + ("Covariance", "共分散"), + ("Descriptive Statistics", "基本統計量"), + ("Exponential Smoothing", "指数平滑"), + ("F-Test Two-Sample for Variances", "F 検定: 2 標本を使った分散の検定"), + ("Moving Average", "移動平均"), + ("Rank and Percentile", "順位と百分位数"), + ("Regression", "回帰"), + ("t-Test: Paired Two Sample for Means", "t 検定: 一対の標本による平均の検定"), + ("t-Test: Two-Sample Assuming Equal Variances", "t 検定: 等分散を仮定した 2 標本による検定"), + ("t-Test: Two-Sample Assuming Unequal Variances", "t 検定: 非等分散を仮定した 2 標本による検定"), + ("Output options", "出力オプション"), + ("Output Range:", "出力範囲:"), + ("New Worksheet Ply:", "新規ワークシート:"), + ("Grouped By:", "グループ化の基準:"), + ("Labels in first row", "先頭行をラベルとして使用"), + ("Input Range:", "入力範囲:"), + ("Variable 1 Range:", "変数 1 の範囲:"), + ("Variable 2 Range:", "変数 2 の範囲:"), + ("Summary statistics", "概要統計"), + ("Confidence Level for Mean (%), blank for none:", "平均の信頼度 (%、なしの場合は空白):"), + ("Kth Largest (blank for none):", "K 番目に大きい値 (なしの場合は空白):"), + ("Kth Smallest (blank for none):", "K 番目に小さい値 (なしの場合は空白):"), + ("Bin Range (blank for automatic bins):", "級の範囲 (空白の場合は自動):"), + ("Pareto (sorted histogram)", "パレート図 (並べ替えられたヒストグラム)"), + ("Cumulative Percentage", "累積比率"), + ("Alpha:", "アルファ:"), + ("Input Y Range:", "入力 Y 範囲:"), + ("Input X Range:", "入力 X 範囲:"), + ("Constant is Zero", "定数に 0 を使用"), + ("Confidence Level (%):", "信頼度 (%):"), + ("Residuals", "残差"), + ("Standardized Residuals", "標準化された残差"), + ("Normal Probability", "正規確率グラフ"), + ("Interval:", "間隔:"), + ("Standard Errors", "標準誤差"), + ("Damping factor:", "減衰係数:"), + ("Hypothesized Mean Difference:", "仮説平均との差異:"), + ("Set Objective:", "目的セルの設定:"), + ("To:", "目標値:"), + ("Value Of:", "値:"), + ("By Changing Variable Cells:", "変数セルの変更:"), + ("Subject to the Constraints:", "制約条件の対象:"), + ("Make Unconstrained Variables Non-Negative", "制約のない変数を非負数にする"), + ("Select a Solving Method:", "解決方法の選択:"), + ("GRG Nonlinear", "GRG 非線形"), + ("Solve", "解決"), + ("Keep Solver Solution", "ソルバー解を保存"), + ("Restore Original Values", "元の値を復元"), + ("The spelling check is complete for the entire sheet.", "シート全体のスペル チェックが完了しました。"), + ("Not in Dictionary ({cell}):", "辞書にない単語 ({cell}):"), + ("Suggestions:", "候補:"), + ("(No suggestions)", "(候補なし)"), + ("Ignore Once", "1 回無視"), + ("Add to Dictionary", "辞書に追加"), + ("Change", "変更"), + ("Change All", "すべて変更"), + ("$ English (United States)", "$ 英語 (米国)"), + ("Add Chart Element", "グラフ要素の追加"), + ("Align Left", "左揃え"), + ("Align Right", "右揃え"), + ("Bottom Align", "下揃え"), + ("Calculate Now (F9)", "再計算実行 (F9)"), + ("Calculate Sheet (⇧F9)", "シートの再計算 (⇧F9)"), + ("Calculation Options", "計算方法の設定"), + ("Cell Styles", "セルのスタイル"), + ("Change Chart Type", "グラフの種類の変更"), + ("Check Accessibility", "アクセシビリティ チェック"), + ("Clear Filter", "フィルターのクリア"), + ("Column or Bar", "縦棒または横棒"), + ("Comments pane", "コメント ウィンドウ"), + ("Convert the last ink stroke to a shape", "最後のインクのストロークを図形に変換"), + ("Convert to Range", "範囲に変換"), + ("Copy", "コピー"), + ("Custom Sort", "ユーザー設定の並べ替え"), + ("Cut", "切り取り"), + ("Define Name…", "名前の定義…"), + ("Delete Comment", "コメントの削除"), + ("Delete Sheet", "シートの削除"), + ("Delete chart", "グラフの削除"), + ("Delete…", "削除…"), + ("Dismiss", "閉じる"), + ("Down", "下へ"), + ("Edit chart title", "グラフ タイトルの編集"), + ("Erase ink strokes", "インクのストロークを消去"), + ("Every command run in this session (replayable)", "このセッションで実行されたすべてのコマンド (再生可能)"), + ("Expand formula bar", "数式バーの展開"), + ("Filter (⌘⇧F)", "フィルター (⌘⇧F)"), + ("Filter by Selected Cell's Value", "選択したセルの値でフィルター"), + ("Find & Select", "検索と選択"), + ("Flash Fill (⌘E)", "フラッシュ フィル (⌘E)"), + ("Forecast Sheet", "予測シート"), + ("Forecast end (date or number; blank: a third of the history):", "予測の終了 (日付または数値、空白の場合は履歴の 3 分の 1):"), + ("Format Chart pane", "グラフの書式設定ウィンドウ"), + ("Format as Table", "テーブルとして書式設定"), + ("Hide", "非表示"), + ("Hide Sheet", "シートの非表示"), + ("Hierarchy & more", "階層とその他"), + ("Highlighter", "蛍光ペン"), + ("How agents drive GridCraft (MCP / control channel)", "エージェントによる GridCraft の操作 (MCP / 制御チャネル)"), + ("Import a text or CSV file", "テキストまたは CSV ファイルのインポート"), + ("Insert Function", "関数の挿入"), + ("Insert Function (⇧F3)", "関数の挿入 (⇧F3)"), + ("Insert Link (⌘K)", "リンクの挿入 (⌘K)"), + ("Insert Sheet", "シートの挿入"), + ("Insert Slicer", "スライサーの挿入"), + ("Insert a picture", "画像の挿入"), + ("Insert a slicer to filter a table", "テーブルをフィルターするスライサーの挿入"), + ("Insert an icon", "アイコンの挿入"), + ("Insert…", "挿入…"), + ("Line or Area", "折れ線または面"), + ("Link…", "リンク…"), + ("Macros and scripts in this workbook (Alt+F8)", "このブックのマクロとスクリプト (Alt+F8)"), + ("Middle Align", "中央揃え"), + ("More commands", "その他のコマンド"), + ("Move or Copy Sheet…", "シートの移動またはコピー…"), + ("New sheet (⇧F11)", "新しいシート (⇧F11)"), + ("Next sheet", "次のシート"), + ("Page Breaks", "改ページ"), + ("Paper Size", "用紙サイズ"), + ("Paste (⌘V)", "貼り付け (⌘V)"), + ("Pick From Drop-down List…", "ドロップダウン リストから選択…"), + ("Pie or Doughnut", "円またはドーナツ"), + ("Previous sheet", "前のシート"), + ("Print Area", "印刷範囲"), + ("Print Titles", "印刷タイトル"), + ("Protect Workbook structure", "ブックの構造の保護"), + ("Redo (⌘Y)", "やり直し (⌘Y)"), + ("Save (⌘S)", "上書き保存 (⌘S)"), + ("Scatter or Bubble", "散布図またはバブル"), + ("Search and run any command", "任意のコマンドを検索して実行"), + ("Search commands (⌘⇧Space)", "コマンドの検索 (⌘⇧Space)"), + ("Select and move ink and shapes", "インクと図形の選択と移動"), + ("Series…", "数列…"), + ("Share: export or save a copy", "共有: エクスポートまたはコピーの保存"), + ("Show Formulas (⌃`)", "数式の表示 (⌃`)"), + ("Slicer", "スライサー"), + ("Sort & Filter", "並べ替えとフィルター"), + ("Spelling (F7)", "スペル チェック (F7)"), + ("Statistic", "統計"), + ("Switch Row/Column", "行/列の切り替え"), + ("Table (⌘T)", "テーブル (⌘T)"), + ("Table Styles", "テーブル スタイル"), + ("Text to Columns", "区切り位置"), + ("The output range already holds data. Replace it with the report?", "出力範囲には既にデータが入っています。レポートで置き換えますか?"), + ("Top Align", "上揃え"), + ("Undo (⌘Z)", "元に戻す (⌘Z)"), + ("Undo list", "元に戻す操作の一覧"), + ("Unhide Sheet…", "シートの再表示…"), + ("Up", "上へ"), + ("Version, contributors and the AI models that helped", "バージョン、貢献者、支援した AI モデル"), + ("What-If Analysis", "What-If 分析"), + ("Zoom In", "拡大"), + ("Zoom Out", "縮小"), + ("Zoom to 100%", "100% で表示"), + ("Zoom to Selection", "選択範囲に合わせる"), + ("Zoom…", "ズーム…"), + ("£ English (United Kingdom)", "£ 英語 (英国)"), + ("¥ Japanese", "¥ 日本語"), + ("€ Euro", "€ ユーロ"), + ("Tab|Insert", "挿入"), + ("AutoSave", "自動保存"), + ("Insert\nSlicer", "スライサーの\n挿入"), + ("Pen\nBlack", "ペン\n黒"), + ("Pen\nBlue", "ペン\n青"), + ("Pen\nRed", "ペン\n赤"), + ("Protect\nSheet", "シートの\n保護"), + ("Watch\nWindow", "ウォッチ\nウィンドウ"), + ("Workbook\nStatistics", "ブックの\n統計情報"), +]; + +/// Translates an interface label; `None` for a label the catalog does not know, so `i18n.rs` can +/// fall back to English. Dialog strings come first, the shared core second. +pub(super) fn translate(text: &str) -> Option<&'static str> { + DIALOGS.iter().chain(CORE).find(|(english, _)| *english == text).map(|(_, translated)| *translated) +} + +#[cfg(test)] +mod tests { + use std::collections::HashSet; + + use super::*; + + /// Every key the catalog holds, `DIALOGS` first. + fn catalog_keys() -> impl Iterator { + DIALOGS.iter().chain(CORE).map(|(english, _)| *english) + } + + /// The decoded value of the Rust string literal starting at byte `start` (its opening `"`), and + /// the byte index just past its closing quote. Escapes (`\n`, `\"`, `\\`, `\t`, `\u{…}`) are + /// decoded, so the keys compare equal to the ones in the tables above. + fn string_literal(source: &str, start: usize) -> Option<(String, usize)> { + if !source[start..].starts_with('"') { + return None; + } + let mut value = String::new(); + let mut chars = source[start + 1..].char_indices(); + while let Some((offset, c)) = chars.next() { + match c { + '"' => return Some((value, start + 1 + offset + 1)), + '\\' => match chars.next().map(|(_, c)| c) { + Some('n') => value.push('\n'), + Some('t') => value.push('\t'), + Some('r') => value.push('\r'), + Some('0') => value.push('\0'), + Some('\\') => value.push('\\'), + Some('"') => value.push('"'), + Some('\'') => value.push('\''), + Some('u') => { + let mut hex = String::new(); + for (_, c) in chars.by_ref() { + if c == '}' { + break; + } + if c != '{' { + hex.push(c); + } + } + if let Some(c) = u32::from_str_radix(&hex, 16).ok().and_then(char::from_u32) { + value.push(c); + } + } + // A line continuation (backslash, newline, indentation) adds nothing. + _ => {} + }, + _ => value.push(c), + } + } + None + } + + /// Every key `pt.rs` translates, read out of its source with a small scanner: a match arm is a + /// string literal whose `=>` is followed by another string literal, which covers the block form + /// (`"key" => { "value" }`) as well. Parsing the real source keeps the two catalogs from + /// drifting apart again instead of checking a remembered count. + fn portuguese_keys() -> Vec { + let source = include_str!("pt.rs"); + let mut literals: Vec<(String, usize, usize)> = Vec::new(); + let mut i = 0; + while i < source.len() { + let rest = &source[i..]; + if rest.starts_with("//") { + i += rest.find('\n').unwrap_or(rest.len()); + continue; + } + if rest.starts_with('"') { + let (value, end) = string_literal(source, i).unwrap(); + literals.push((value, i, end)); + i = end; + continue; + } + i += rest.chars().next().unwrap().len_utf8(); + } + let mut keys = Vec::new(); + for pair in literals.windows(2) { + let (key, _, end) = &pair[0]; + let start = pair[1].1; + let gap = source[*end..start].trim(); + if gap == "=>" || gap == "=> {" { + keys.push(key.clone()); + } + } + keys + } + + #[test] + fn keys_are_unique_and_every_value_is_translated() { + let mut seen = HashSet::new(); + for (english, japanese) in DIALOGS.iter().chain(CORE) { + assert!(!japanese.is_empty(), "empty translation for {english:?}"); + assert!(japanese.chars().any(|c| !c.is_whitespace()), "blank translation for {english:?}"); + assert!(seen.insert(*english), "duplicate key across CORE and DIALOGS: {english:?}"); + } + assert_eq!(seen.len(), catalog_keys().count()); + assert_eq!(CORE.len(), 398, "the shared reference set every catalog covers"); + assert_eq!(DIALOGS.len(), 545, "the dialog, message and menu strings beyond it"); + assert_eq!(catalog_keys().count(), 943); + } + + #[test] + fn covers_every_key_the_portuguese_catalog_translates() { + let portuguese = portuguese_keys(); + assert_eq!(portuguese.len(), 943, "pt.rs's arms changed: add the new keys here and update the count"); + let japanese: HashSet<&str> = catalog_keys().collect(); + for key in &portuguese { + assert!(japanese.contains(key.as_str()), "the Portuguese catalog translates {key:?}, the Japanese one does not"); + } + assert_eq!(japanese.len(), portuguese.len(), "the two catalogs hold the same key set"); + } + + #[test] + fn high_value_strings_use_excel_japanese_wording() { + for (english, japanese) in [ + ("OK", "OK"), + ("Cancel", "キャンセル"), + ("Don't Save", "保存しない"), + ("Text Box", "テキスト ボックス"), + ("Row Height", "行の高さ"), + ("Column Width", "列の幅"), + ("Sort", "並べ替え"), + ("Filter", "フィルター"), + ("Conditional Formatting", "条件付き書式"), + ("Do you want to save the changes you made to {title}?", "{title} への変更を保存しますか?"), + ("Save a copy as .{format}", ".{format} としてコピーを保存"), + ("Format Cells|Fill", "塗りつぶし"), + ("Insert\nSlicer", "スライサーの\n挿入"), + ] { + assert_eq!(translate(english), Some(japanese), "{english:?}"); + assert_eq!(crate::i18n::Language::Ja.tr(english), japanese, "{english:?}"); + } + // A `context|label` key shows only its label in English; an unknown label keeps the text. + assert_eq!(crate::i18n::Language::En.tr("Format Cells|Fill"), "Fill"); + assert_eq!(crate::i18n::Language::Ja.tr("Not in any catalog"), "Not in any catalog"); + } +} diff --git a/docs/gaps.md b/docs/gaps.md index 03e8672c5..85cd0f021 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -1,6 +1,6 @@ # Gaps -> **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-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365) Every known shortfall against Excel, one entry each, ranked by user impact (what blocks someone using GridCraft for real work first). This is the work list: pick from the top, check the open @@ -97,8 +97,10 @@ No alpha blockers: every core workflow passes the [alpha gate](roadmap.md#alpha- ## After beta ### 11. No localization at all (L) -- Ribbon-only catalog in five languages (#31, #104, #82; ~12% of strings each); dialogs, menus and - messages English; en-US function names and separators (#45); German in PR #163. **Estimate:** +- Catalog: ribbon-only in five languages (#31, #104, #82; ~12% of strings each), and 943 strings + (~43%) in Japanese (10-17) and Brazilian Portuguese, including the dialog labels, messages, File + view and menus. The remaining dialogs, menus and messages are English; en-US function names and + separators (#45); German in PR #163. **Estimate:** 100–165 h including #5. [localization-parity.md](localization-parity.md) ### 12. Get & Transform, external data, data model (F) diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 64876633d..ee846e6c3 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-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **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, @@ -9,18 +9,19 @@ right-to-left sheets and full complex-script support. Part of ## Where we are (measured from source on `main`, after the 2026-10-10 merges) -- **A first catalog exists, for the ribbon only.** `crates/ui-egui/src/i18n.rs` (merged 10-10 in - #31, #104, #82; German added 10-11) adds an interface-language preference that defaults to the - system language (closes #20) and a View-tab switcher, with English-keyed lookup tables: - Japanese 268 labels, Simplified Chinese, Korean, Russian, Brazilian Portuguese, German and Czech 266 - each. The tables are used by - the ribbon, sheet tabs and widgets (`ribbon.rs`, `tabs.rs`, `widgets.rs`), the Format Cells - dialog, every dialog title and the shared OK/Cancel buttons; the other dialogs, menus, - context menus, task panes, status messages, command labels and function descriptions are still - English literals. Untranslated labels fall back to English. +- **A first catalog exists.** `crates/ui-egui/src/i18n.rs` (merged 10-10 in #31, #104, #82; German + added 10-11) adds an interface-language preference that defaults to the system language (closes + #20) and a View-tab switcher, with English-keyed lookup tables: Simplified Chinese, Korean, + Russian, German and Czech 266–518 labels each, Brazilian Portuguese and Japanese 943 each. The + tables are used by the ribbon, sheet tabs and widgets (`ribbon.rs`, `tabs.rs`, `widgets.rs`), the + Format Cells dialog, every dialog title and the shared OK/Cancel buttons; Japanese and Portuguese + also cover the other dialog labels, message boxes, Backstage/File-view items, template names and + native menus (Japanese, 10-17: `i18n/ja.rs` keeps the shared 398-label core and adds 545 of those + strings). The remaining menus, context menus, task panes, status messages, command labels and + function descriptions are still English literals. Untranslated labels fall back to English. - **About 2,200 user-visible strings** in all (heuristic source scan: ~1,700 UI and command - strings plus ~500 function descriptions), so each shipped language covers **~12%** (measured - count / estimated total). + strings plus ~500 function descriptions), so the ribbon-only languages cover **~12%** and + Japanese and Portuguese **~43%** (measured count / estimated total). - **en-US only formulas and formats.** Function names, `,` argument separator, `.` decimal separator, en-US number and date formats (`crates/numfmt` says "en-US only"). Users ask for localized function names and `;` separators (#45). German with localized numbers and formulas @@ -54,9 +55,9 @@ separators, number/date formats, machine translation with agent review, and scri | Hindi | hi | 0 (0%) | no | Devanagari: **no shaping** | no | none | 12–18 h | | Arabic | ar | 0 (0%) | no | **no shaping, no RTL UI**; Sheet Right-to-Left mirrors the grid (#146) | no | none | 25–35 h | | French | fr | 0 (0%) | no | Latin: yes | no | none | 6–10 h | -| Portuguese | pt-BR | 923 (~42%) | dialogs and tooltips (dialogs take effect with #669) | Latin: yes | no | menus, File view, dialogs | 2–4 h | +| Portuguese | pt-BR | 943 (~43%) | dialogs and tooltips (dialogs take effect with #669) | Latin: yes | no | menus, File view, dialogs | 2–4 h | | Indonesian | id | 0 (0%) | no | Latin: yes | no | none | 5–8 h | -| Japanese | ja | 268 (~12%) | no | CJK system-font fallback; IME unverified; no furigana display | no | menus only | 8–12 h | +| Japanese | ja | 943 (~43%) | dialogs and messages | CJK system-font fallback; IME unverified; no furigana display | no | menus, File view, dialogs, messages | 3–5 h | | German | de | 266 (~12%) | no | Latin: yes | no | menus only | 4–8 h | | 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 | @@ -83,6 +84,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-20 | minor | Japanese catalog (`i18n/ja.rs`) covers every key the Brazilian Portuguese catalog translates: the 398-label shared core moved verbatim plus 545 dialog, message, Backstage and menu strings — 943 keys, ~12% → ~43%. A test parses `pt.rs`'s source, so the two catalogs can't drift apart again. Portuguese re-measured at 943 (was 923) | | 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 | From 60e113bcd712190919710e183be4e6f6c005a4c8 Mon Sep 17 00:00:00 2001 From: Stefan Fransen Date: Tue, 20 Oct 2026 18:10:09 +0200 Subject: [PATCH 15/33] i18n: Dutch (nl) interface language Adds a Dutch catalog (`i18n/nl.rs`, 518 labels) covering every key the other catalogs translate: ribbon, context menus, File view, dialog titles and the Options page. `nl-NL` and `nl-BE` locale tags resolve to Dutch. Updates localization parity and the roadmap. Co-Authored-By: Claude Fable 5.1 --- ROADMAP.md | 6 +- contributors/people.toml | 4 + crates/ui-egui/src/i18n.rs | 20 +- crates/ui-egui/src/i18n/nl.rs | 533 ++++++++++++++++++++++++++++++ crates/ui-egui/tests/file_menu.rs | 1 + docs/localization-parity.md | 5 +- 6 files changed, 564 insertions(+), 5 deletions(-) create mode 100644 crates/ui-egui/src/i18n/nl.rs 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 | From 45c91ede213658ba0c9496a3de4282c51dcff387 Mon Sep 17 00:00:00 2001 From: Stefan Fransen Date: Tue, 20 Oct 2026 18:16:28 +0200 Subject: [PATCH 16/33] i18n: Dutch (nl) interface language Unify the Freeze family on "blokkeren" (Excel's Dutch wording). Co-Authored-By: Claude Fable 5.1 --- crates/ui-egui/src/i18n/nl.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/ui-egui/src/i18n/nl.rs b/crates/ui-egui/src/i18n/nl.rs index aeedf3a13..d561aa931 100644 --- a/crates/ui-egui/src/i18n/nl.rs +++ b/crates/ui-egui/src/i18n/nl.rs @@ -216,8 +216,8 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "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", + "Freeze Top Row" => "Bovenste rij blokkeren", + "Freeze First Column" => "Eerste kolom blokkeren", "Unfreeze Panes" => "Titelblokkering opheffen", "Dark Mode" => "Donkere modus", "Display theme" => "Weergavethema", @@ -231,8 +231,8 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "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", + "Drag to freeze columns" => "Sleep om kolommen te blokkeren", + "Drag to freeze rows" => "Sleep om rijen te blokkeren", "Command\nPalette" => "Opdracht-\npalet", "Agent\nControl" => "Agent-\nbesturing", "Action\nJournal" => "Actie-\nlogboek", From c8a87f57dd719e838a1e4a221d1eca9cd4cf5aec Mon Sep 17 00:00:00 2001 From: Stefan Fransen Date: Tue, 20 Oct 2026 18:25:41 +0200 Subject: [PATCH 17/33] i18n: Dutch (nl) interface language Parity doc: state the Dutch coverage precisely (the shared key set the German, French and Czech catalogs cover, not the larger Portuguese one). Co-Authored-By: Claude Fable 5.1 --- docs/localization-parity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/localization-parity.md b/docs/localization-parity.md index bc7f072d5..8578ebc25 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -83,7 +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-20 | minor | Dutch (nl) interface catalog (`i18n/nl.rs`, 518 labels, ~24%): the shared key set every language must cover (ribbon, context menus, File view, dialog titles, Options page), matching the German, French and Czech catalogs; `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 | From 29adb198727e5299bf2ab87f33d07fa4b7d8aa79 Mon Sep 17 00:00:00 2001 From: Viorel Toader Date: Wed, 21 Oct 2026 10:39:03 +0300 Subject: [PATCH 18/33] Translate form-dialog field labels, choices and notes Page Setup, Insert and the other form dialogs drew their field labels in English in every interface language, though their titles and OK/Cancel were translated and most catalogs already carry the labels. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JadgGo4G2GHaAMNb3qyygk --- crates/ui-egui/src/dialogs.rs | 22 +++++----- .../ui-egui/tests/translated_form_fields.rs | 41 +++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 crates/ui-egui/tests/translated_form_fields.rs diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index fb899c702..9dee2c886 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -1389,12 +1389,14 @@ fn form(ui: &mut egui::Ui, d: &mut Dialog, confirm: &mut bool, open: &mut bool) /// Draws a dialog's `fields`, editing its values. fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { + // Field labels, choices and notes are English source strings, translated as they are drawn. + let lang = crate::i18n::current(ui.ctx()); egui::Grid::new("form").num_columns(1).spacing(vec2(8.0, 6.0)).show(ui, |ui| { for f in d.fields.clone() { match f { Field::Text { key, label } => { ui.vertical(|ui| { - ui.label(label); + ui.label(lang.tr(label)); let mut s = d .values .get(key) @@ -1414,17 +1416,17 @@ fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { Field::Password { key, label } => { // Masked as typed (Excel shows dots); "Show password" reveals it on purpose. ui.vertical(|ui| { - ui.label(label); + ui.label(lang.tr(label)); let mut s = d.values.get(key).and_then(Json::as_str).unwrap_or_default().to_string(); if ui.add(egui::TextEdit::singleline(&mut s).password(!d.show_password).desired_width(320.0)).changed() { d.values.insert(key.into(), json!(s)); } - ui.checkbox(&mut d.show_password, "Show password"); + ui.checkbox(&mut d.show_password, lang.tr("Show password")); }); } Field::Number { key, label } => { ui.horizontal(|ui| { - ui.label(label); + ui.label(lang.tr(label)); let mut n = d.values.get(key).and_then(Json::as_f64).unwrap_or(0.0); if ui.add(egui::DragValue::new(&mut n).speed(0.5)).changed() { d.values.insert(key.into(), json!(n)); @@ -1433,20 +1435,20 @@ fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { } Field::Choice { key, label, options } => { ui.vertical(|ui| { - ui.label(egui::RichText::new(label).strong()); + ui.label(egui::RichText::new(lang.tr(label)).strong()); let cur = d.values.get(key).and_then(Json::as_str).unwrap_or("").to_string(); if d.name == "dataValidation" { - let selected = options.iter().find(|(val, _)| *val == cur).map(|(_, text)| *text).unwrap_or(""); + let selected = options.iter().find(|(val, _)| *val == cur).map(|(_, text)| lang.tr(text)).unwrap_or(""); egui::ComboBox::from_id_salt(("dataValidation", key)).selected_text(selected).width(300.0).show_ui(ui, |ui| { for (val, text) in options { - if ui.selectable_label(cur == val, text).clicked() { + if ui.selectable_label(cur == val, lang.tr(text)).clicked() { d.set_value(key, json!(val)); } } }); } else { for (val, text) in options { - if ui.radio(cur == val, text).clicked() { + if ui.radio(cur == val, lang.tr(text)).clicked() { d.set_value(key, json!(val)); } } @@ -1455,12 +1457,12 @@ fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { } Field::Check { key, label } => { let mut b = d.values.get(key).and_then(Json::as_bool).unwrap_or(false); - if ui.checkbox(&mut b, label).changed() { + if ui.checkbox(&mut b, lang.tr(label)).changed() { d.values.insert(key.into(), json!(b)); } } Field::Note(t) => { - ui.label(egui::RichText::new(t).small()); + ui.label(egui::RichText::new(lang.tr(&t)).small()); } } ui.end_row(); diff --git a/crates/ui-egui/tests/translated_form_fields.rs b/crates/ui-egui/tests/translated_form_fields.rs new file mode 100644 index 000000000..6c3bc93ca --- /dev/null +++ b/crates/ui-egui/tests/translated_form_fields.rs @@ -0,0 +1,41 @@ +//! Form dialogs draw their field labels and choices in the interface language, as their titles +//! and OK/Cancel buttons already were (Page Setup showed "Left margin (in):" in every language). + +use egui_kittest::kittest::Queryable as _; +use gridcraft_engine::Session; +use gridcraft_ui_egui::SheetApp; +use serde_json::json; + +fn harness() -> egui_kittest::Harness<'static, SheetApp> { + let mut session = Session::new(); + session.new_workbook(); + let mut h = egui_kittest::Harness::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state( + |ui, app: &mut SheetApp| { + let ctx = ui.ctx().clone(); + app.logic(&ctx); + app.ui(ui); + }, + SheetApp::new(session, Default::default()), + ); + h.run_steps(4); + h +} + +#[test] +fn form_fields_are_translated() { + for (dialog, translated, english) in [ + ("pageSetup", ["Margem esquerda (pol.):", "Rodapé (pol.):"], ["Left margin (in):", "Footer (in):"]), + ("insertPaste", ["Deslocar células para a direita", "Deslocar células para baixo"], ["Shift cells right", "Shift cells down"]), + ] { + let mut h = harness(); + h.state_mut().run("app.language.set", json!({"language": "pt"})).unwrap(); + h.state_mut().open_dialog(dialog, json!({})); + h.run_steps(3); + for label in translated { + assert!(h.query_by_label_contains(label).is_some(), "{dialog}: no {label}"); + } + for label in english { + assert!(h.query_by_label_contains(label).is_none(), "{dialog}: {label} is untranslated"); + } + } +} From 028a02ba720ff380ac7e7f27f71d3c9a74e5784d Mon Sep 17 00:00:00 2001 From: Viorel Toader Date: Wed, 21 Oct 2026 09:49:25 +0300 Subject: [PATCH 19/33] Romanian (ro) interface language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds Romanian as an interface language: crates/ui-egui/src/i18n/ro.rs with 970 labels covering every key of the other catalogs, registered in Language (switcher, app.language.set, ro-* system locales). Context keys translate without their prefix; the File › Options kittest covers ro. English formulas and formats; no proofing. The catalog is an AI-assisted draft written from the meaning of the English labels; a native speaker has not yet reviewed it line by line. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JadgGo4G2GHaAMNb3qyygk --- crates/ui-egui/src/i18n.rs | 20 +- crates/ui-egui/src/i18n/ro.rs | 990 ++++++++++++++++++++++++++++++ crates/ui-egui/tests/file_menu.rs | 1 + docs/localization-parity.md | 3 +- 4 files changed, 1012 insertions(+), 2 deletions(-) create mode 100644 crates/ui-egui/src/i18n/ro.rs diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 98919f8a4..ad5c767d4 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -15,6 +15,7 @@ mod es; mod fr; mod ko; mod pt; +mod ro; mod ru; mod sr; mod zh; @@ -35,10 +36,12 @@ pub enum Language { Cs, Fr, Sr, + Ro, } 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::Ro]; /// 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::Ro => "Română", } } @@ -71,6 +75,7 @@ impl Language { Self::Cs => "cs", Self::Fr => "fr", Self::Sr => "sr", + Self::Ro => "ro", } } @@ -91,6 +96,7 @@ impl Language { "cs" => Some(Self::Cs), "fr" => Some(Self::Fr), "sr" => Some(Self::Sr), + "ro" => Some(Self::Ro), _ => None, } } @@ -129,6 +135,7 @@ impl Language { Self::Cs => cs::translate(text), Self::Fr => fr::translate(text), Self::Sr => sr::translate(text), + Self::Ro => ro::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!(ro::translate(english).is_some_and(|text| !text.is_empty()), "missing Romanian: {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::Ro.tr("Data"), "Date"); + assert_eq!(Language::Ro.tr("Sheet1!A1"), "Sheet1!A1"); + assert_eq!(Language::Ro.tr("Page Layout|Orientation"), "Orientare"); + assert_eq!(Language::Ro.tr("Orientation"), "Orientare text"); 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::Ro.tr("Options|General"), "General"); + assert_eq!(Language::Ro.tr("Options|Save"), "Salvare"); + assert_eq!(Language::Ro.tr("Sheet Options|View"), "Vizualizare"); } #[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("ro-RO"), Some(Language::Ro)); + assert_eq!(Language::from_tag("ro_MD.UTF-8"), Some(Language::Ro)); + assert_eq!(Language::parse("ro"), Some(Language::Ro)); } #[test] diff --git a/crates/ui-egui/src/i18n/ro.rs b/crates/ui-egui/src/i18n/ro.rs new file mode 100644 index 000000000..5fc8ad14b --- /dev/null +++ b/crates/ui-egui/src/i18n/ro.rs @@ -0,0 +1,990 @@ +//! Romanian translations for the interface strings in i18n.rs. +//! +//! Written from the plain meaning of the English labels in ordinary Romanian computing vocabulary; +//! no Microsoft Excel (or other product) localisation was consulted. Commands use the noun form +//! usual in Romanian software ("Salvare", "Inserare…") and messages address the user formally. +//! An AI-assisted draft (Claude) for a Romanian-speaking contributor, pending native-speaker review. + +pub(super) fn translate(text: &str) -> Option<&'static str> { + Some(match text { + "Paste" => "Lipire", + "Paste Values" => "Lipire valori", + "Paste Formulas" => "Lipire formule", + "Paste Formatting" => "Lipire formatare", + "Transpose" => "Transpunere", + "Paste Link" => "Lipire link", + "Paste Special…" => "Lipire specială…", + "Insert Copied Cells" => "Inserare celule copiate", + "Insert Copied Cells…" => "Inserare celule copiate…", + "Insert Cut Cells" => "Inserare celule decupate", + "Insert Paste" => "Inserare prin lipire", + "Cut (⌘X)" => "Decupare (⌘X)", + "Copy (⌘C)" => "Copiere (⌘C)", + "Format Painter (double-click to keep it on)" => "Pensulă de formatare (dublu clic pentru a o menține activă)", + "Bold (⌘B)" => "Aldin (⌘B)", + "Italic (⌘I)" => "Cursiv (⌘I)", + "Underline (⌘U)" => "Subliniere (⌘U)", + "Double Underline" => "Subliniere dublă", + "Strikethrough" => "Tăiere cu o linie", + "Underline" => "Subliniere", + "Increase Font Size" => "Mărire font", + "Decrease Font Size" => "Micșorare font", + "Wrap Text" => "Încadrare text", + "Merge & Center" => "Îmbinare și centrare", + "Merge Cells" => "Îmbinare celule", + "Merge Across" => "Îmbinare pe rânduri", + "Unmerge Cells" => "Anulare îmbinare celule", + "Fill Color" => "Culoare de umplere", + "Font Color" => "Culoare font", + "Borders" => "Borduri", + "Top\nAlign" => "Aliniere\nsus", + "Middle\nAlign" => "Aliniere\nla mijloc", + "Bottom\nAlign" => "Aliniere\njos", + "Left" => "Stânga", + "Right" => "Dreapta", + "Center" => "Centru", + "Horizontal" => "Orizontal", + "Vertical Text" => "Text vertical", + "Decrease Indent" => "Micșorare indent", + "Increase Indent" => "Mărire indent", + "Orientation" => "Orientare text", + "Angle Counterclockwise" => "Înclinare în sens invers acelor de ceasornic", + "Angle Clockwise" => "Înclinare în sensul acelor de ceasornic", + "Rotate Text Up" => "Rotire text în sus", + "Rotate Text Down" => "Rotire text în jos", + "Accounting Number Format" => "Format de număr contabil", + "Percent Style" => "Stil procent", + "Comma Style" => "Stil virgulă", + "Increase Decimal" => "Mărire zecimale", + "Decrease Decimal" => "Micșorare zecimale", + "More Accounting Formats…" => "Mai multe formate contabile…", + "Conditional\nFormatting" => "Formatare\ncondiționată", + "Conditional Formatting" => "Formatare condiționată", + "Format\nas Table" => "Formatare\nca tabel", + "Cell\nStyles" => "Stiluri de\ncelulă", + "Format Cells…" => "Formatare celule…", + "Format Cell Alignment…" => "Formatare aliniere celulă…", + "Format\nPane" => "Panou\nformatare", + "Format" => "Format", + "Insert" => "Inserare", + "Insert Cells…" => "Inserare celule…", + "Delete" => "Ștergere", + "Delete Cells…" => "Ștergere celule…", + "Insert Sheet Rows" => "Inserare rânduri în foaie", + "Insert Sheet Columns" => "Inserare coloane în foaie", + "Delete Sheet Rows" => "Ștergere rânduri din foaie", + "Delete Sheet Columns" => "Ștergere coloane din foaie", + "Row Height…" => "Înălțime rând…", + "AutoFit Row Height" => "Potrivire automată înălțime rând", + "Column Width…" => "Lățime coloană…", + "AutoFit Column Width" => "Potrivire automată lățime coloană", + "Default Width…" => "Lățime implicită…", + "Hide Rows" => "Ascundere rânduri", + "Unhide Rows" => "Reafișare rânduri", + "Hide Columns" => "Ascundere coloane", + "Unhide Columns" => "Reafișare coloane", + "Lock Cell" => "Blocare celulă", + "Clear" => "Golire", + "Clear All" => "Golire totală", + "Clear Formats" => "Golire formate", + "Clear Contents" => "Golire conținut", + "Clear Comments and Notes" => "Golire comentarii și note", + "Clear Hyperlinks" => "Golire hyperlinkuri", + "AutoSum" => "Însumare automată", + "AutoSum (⌘⇧T)" => "Însumare automată (⌘⇧T)", + "Flash\nFill" => "Completare\nrapidă", + "Flash Fill" => "Completare rapidă", + "Fill" => "Umplere", + "Clear Print Area" => "Golire zonă de imprimare", + "Find &\nSelect" => "Găsire și\nselectare", + "Find…" => "Găsire…", + "Replace…" => "Înlocuire…", + "Go To…" => "Salt la…", + "Go To Special…" => "Salt la special…", + "PivotTable" => "PivotTable", + "Recommended\nCharts" => "Diagrame\nrecomandate", + "Table" => "Tabel", + "Pictures" => "Imagini", + "Shapes" => "Forme", + "Icons" => "Pictograme", + "Text\nBox" => "Casetă\nde text", + "Comment" => "Comentariu", + "New\nComment" => "Comentariu\nnou", + "New Note" => "Notă nouă", + "Show/Hide Note" => "Afișare/ascundere notă", + "Header &\nFooter" => "Antet și\nsubsol", + "Text to\nColumns" => "Text în\ncoloane", + "Link" => "Link", + "Symbol" => "Simbol", + "Sparklines" => "Diagrame sparkline", + "Checkbox" => "Casetă de selectare", + "Insert checkboxes in the selected cells" => "Inserați casete de selectare în celulele selectate", + "Header & Footer" => "Antet și subsol", + "Draw with ink" => "Desenare cu cerneală", + "Eraser" => "Radieră", + "Ink to\nShape" => "Cerneală în\nformă", + "Select\nObjects" => "Selectare\nobiecte", + "Themes" => "Teme", + "Margins" => "Margini", + "Left Margin" => "Margine stânga", + "Right Margin" => "Margine dreapta", + "Top Margin" => "Margine sus", + "Bottom Margin" => "Margine jos", + "Header Margin" => "Margine antet", + "Footer Margin" => "Margine subsol", + "Size" => "Dimensiune", + "Print\nArea" => "Zonă de\nimprimare", + "Set Print Area" => "Setare zonă de imprimare", + "Breaks" => "Întreruperi", + "Insert Page Break" => "Inserare întrerupere de pagină", + "Remove Page Break" => "Eliminare întrerupere de pagină", + "Reset All Page Breaks" => "Reinițializare toate întreruperile de pagină", + "Print\nTitles" => "Imprimare\ntitluri", + "Sheet\nRight-to-Left" => "Foaie de la\ndreapta la stânga", + "Sheet Right-to-Left" => "Foaie de la dreapta la stânga", + "Narrow" => "Îngust", + "Wide" => "Lat", + "Normal" => "Normală", + "Portrait" => "Portret", + "Landscape" => "Peisaj", + "Custom Margins…" => "Margini personalizate…", + "Insert\nFunction" => "Inserare\nfuncție", + "Name\nManager" => "Manager\nde nume", + "Define Name" => "Definire nume", + "Use in Formula" => "Utilizare în formulă", + "Create from Selection" => "Creare din selecție", + "Trace Precedents" => "Trasare precedențe", + "Trace Dependents" => "Trasare dependențe", + "Remove Arrows" => "Eliminare săgeți", + "Show Formulas" => "Afișare formule", + "Error Checking" => "Verificare erori", + "Evaluate Formula" => "Evaluare formulă", + "Watch Window" => "Fereastră de urmărire", + "Calculation\nOptions" => "Opțiuni de\ncalcul", + "Calculate Now" => "Calculare acum", + "Calculate Sheet" => "Calculare foaie", + "Automatic" => "Automat", + "Automatic Except for Data Tables" => "Automat, cu excepția tabelelor de date", + "Manual" => "Manual", + "Sort &\nFilter" => "Sortare și\nfiltrare", + "Sort" => "Sortare", + "Sort A to Z" => "Sortare de la A la Z", + "Sort Z to A" => "Sortare de la Z la A", + "Custom Sort…" => "Sortare particularizată…", + "Filter" => "Filtrare", + "Reapply" => "Reaplicare", + "Get Data\n(Text/CSV)" => "Preluare date\n(text/CSV)", + "Remove\nDuplicates" => "Eliminare\ndubluri", + "Data\nValidation" => "Validare\ndate", + "Data Validation" => "Validare date", + "Data Validation…" => "Validare date…", + "Circle Invalid Data" => "Încercuire date nevalide", + "Clear Validation" => "Golire validare", + "Group" => "Grupare", + "Ungroup" => "Anulare grupare", + "Show Detail" => "Afișare detalii", + "Hide Detail" => "Ascundere detalii", + "Subtotal" => "Subtotal", + "Data\nAnalysis" => "Analiză\ndate", + "Data Analysis" => "Analiză date", + "Solver" => "Solver", + "What-If\nAnalysis" => "Analiză\nce-ar fi dacă", + "Data Table…" => "Tabel de date…", + "Scenario Manager…" => "Manager de scenarii…", + "Goal Seek…" => "Căutare rezultat…", + "Forecast\nSheet" => "Foaie de\nprognoză", + "Spelling" => "Ortografie", + "Check\nAccessibility" => "Verificare\naccesibilitate", + "Threaded Comments" => "Comentarii în fir", + "Show\nComments" => "Afișare\ncomentarii", + "Previous" => "Anteriorul", + "Next" => "Următorul", + "Previous Comment" => "Comentariul anterior", + "Next Comment" => "Comentariul următor", + "Show All Notes" => "Afișare toate notele", + "Convert to Comments" => "Conversie în comentarii", + "Protect\nWorkbook" => "Protejare\nregistru", + "Allow Edit\nRanges" => "Permitere editare\nzone", + "Allow Edit Ranges" => "Permitere editare zone", + "Unprotect\nSheet" => "Deprotejare\nfoaie", + "Protect Sheet…" => "Protejare foaie…", + "Comments" => "Comentarii", + "Notes" => "Note", + "Page Break\nPreview" => "Examinare\nsfârșituri de pagină", + "Page\nLayout" => "Aspect\npagină", + "Formula Bar" => "Bară de formule", + "Gridlines" => "Linii de grilă", + "Headings" => "Titluri", + "Zoom" => "Zoom", + "100%" => "100%", + "Zoom to\nSelection" => "Zoom la\nselecție", + "Freeze\nPanes" => "Înghețare\npanouri", + "Freeze Panes" => "Înghețare panouri", + "Freeze Top Row" => "Înghețare rândul de sus", + "Freeze First Column" => "Înghețare prima coloană", + "Unfreeze Panes" => "Anulare înghețare panouri", + "Dark Mode" => "Mod întunecat", + "Interface language" => "Limba interfeței", + "Interface size" => "Dimensiunea interfeței", + "Auto" => "Automat", + "Drag to freeze columns" => "Trageți pentru a îngheța coloane", + "Drag to freeze rows" => "Trageți pentru a îngheța rânduri", + "Command\nPalette" => "Paleta de\ncomenzi", + "Agent\nControl" => "Control prin\nagenți", + "Action\nJournal" => "Jurnal de\nacțiuni", + "About\nGridCraft" => "Despre\nGridCraft", + "Share" => "Partajare", + "Add Chart\nElement" => "Adăugare element\nde diagramă", + "Change\nChart Type" => "Schimbare\ntip diagramă", + "Switch\nRow/Column" => "Comutare\nrând/coloană", + "Select\nData" => "Selectare\ndate", + "Data Labels: None" => "Etichete de date: niciuna", + "Data Labels: Show" => "Etichete de date: afișare", + "Legend: None" => "Legendă: niciuna", + "Legend: Bottom" => "Legendă: jos", + "Legend: Top" => "Legendă: sus", + "Legend: Right" => "Legendă: dreapta", + "Gridlines: None" => "Linii de grilă: niciuna", + "Gridlines: Show" => "Linii de grilă: afișare", + "Chart\nTitle" => "Titlu\ndiagramă", + "Delete\nChart" => "Ștergere\ndiagramă", + "Convert\nto Range" => "Conversie\nîn zonă", + "Table\nStyles" => "Stiluri\nde tabel", + "Top 10 Items" => "Primele 10 elemente", + "Top 10%" => "Primele 10%", + "Bottom 10 Items" => "Ultimele 10 elemente", + "Bottom 10%" => "Ultimele 10%", + "Above Average" => "Peste medie", + "Below Average" => "Sub medie", + "Clear Rules from Entire Sheet" => "Golire reguli din toată foaia", + "Clear Rules from Selected Cells" => "Golire reguli din celulele selectate", + "Constants" => "Constante", + "Data Bars" => "Bare de date", + "Color Scales" => "Scale de culori", + "Icon Sets" => "Seturi de pictograme", + "Home" => "Pornire", + "Draw" => "Desenare", + "Page Layout" => "Aspect pagină", + "Formulas" => "Formule", + "Data" => "Date", + "Review" => "Revizuire", + "View" => "Vizualizare", + "Automate" => "Automatizare", + "Table Design" => "Design tabel", + "Chart Design" => "Proiectare diagramă", + "Ready" => "Gata", + "Enter" => "Enter", + "Edit" => "Editare", + "Point" => "Punct", + "Calculate" => "Calcul", + "Select destination and press Enter or choose Paste" => "Selectați destinația și apăsați Enter sau alegeți Lipire", + "General" => "General", + "Number" => "Număr", + "Currency" => "Monedă", + "Accounting" => "Contabilitate", + "Date" => "Dată", + "Time" => "Oră", + "Percentage" => "Procent", + "Fraction" => "Fracție", + "Scientific" => "Științific", + "Text" => "Text", + "Special" => "Special", + "Custom" => "Personalizat", + "Short Date" => "Dată scurtă", + "Long Date" => "Dată lungă", + "More Number Formats…" => "Mai multe formate de număr…", + "Financial" => "Financiare", + "Logical" => "Logice", + "Date &\nTime" => "Dată și\noră", + "Lookup &\nReference" => "Căutare și\nreferință", + "Math &\nTrig" => "Matematică și\ntrigonometrie", + "More\nFunctions" => "Mai multe\nfuncții", + "Page Layout|Orientation" => "Orientare", + "Display theme" => "Temă de afișare", + "Animations" => "Animații", + "Glide the selection outline to the cell you move to instead of jumping there" => { + "Mută lin conturul selecției la celula spre care vă deplasați, în loc să sară acolo" + } + "System" => "Sistem", + "Light" => "Luminoasă", + "Dark" => "Întunecată", + "Sheet Options|View" => "Vizualizare", + "Print" => "Imprimare", + "Click to add data" => "Faceți clic pentru a adăuga date", + "Add header" => "Adăugare antet", + "Add footer" => "Adăugare subsol", + "(none)" => "(niciunul)", + "Header" => "Antet", + "Footer" => "Subsol", + "Page\nNumber" => "Număr de\npagină", + "Number\nof Pages" => "Număr\nde pagini", + "Current\nDate" => "Data\ncurentă", + "Current\nTime" => "Ora\ncurentă", + "File\nPath" => "Calea\nfișierului", + "File\nName" => "Nume\nfișier", + "Sheet\nName" => "Numele\nfoii", + "Go to\nHeader" => "Salt la\nantet", + "Go to\nFooter" => "Salt la\nsubsol", + "Page Number" => "Număr de pagină", + "Number of Pages" => "Număr de pagini", + "Current Date" => "Data curentă", + "Current Time" => "Ora curentă", + "File Path" => "Calea fișierului", + "File Name" => "Nume fișier", + "Sheet Name" => "Numele foii", + "Go to Header" => "Salt la antet", + "Different First Page" => "Prima pagină diferită", + "Different Odd & Even Pages" => "Pagini pare și impare diferite", + "Go to Footer" => "Salt la subsol", + "Ruler" => "Riglă", + "File" => "Fișier", + "Back" => "Înapoi", + "New" => "Nou", + "Open" => "Deschidere", + "Info" => "Informații", + "Save" => "Salvare", + "Save As" => "Salvare ca", + "Export" => "Exportare", + "Close" => "Închidere", + "Options" => "Opțiuni", + "Blank workbook" => "Registru gol", + "Recent" => "Recente", + "No recent workbooks yet." => "Încă niciun registru recent.", + "More workbooks" => "Mai multe registre", + "Modified" => "Modificat", + "Not available" => "Indisponibil", + "Just now" => "Chiar acum", + "{n} min ago" => "acum {n} min", + "{n} h ago" => "acum {n} h", + "{n} days ago" => "acum {n} zile", + "{n} weeks ago" => "acum {n} săptămâni", + "{n} months ago" => "acum {n} luni", + "{n} years ago" => "acum {n} ani", + "Browse…" => "Răsfoire…", + "Not saved yet" => "Încă nesalvat", + "Location" => "Locație", + "Sheets" => "Foi", + "Protect Workbook" => "Protejare registru", + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => { + "Structura registrului este blocată: foile nu pot fi adăugate, mutate, redenumite sau șterse." + } + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => { + "Blochează structura registrului, ca foile să nu poată fi adăugate, mutate, redenumite sau șterse." + } + "Properties" => "Proprietăți", + "Title" => "Titlu", + "Subject" => "Subiect", + "Author" => "Autor", + "Company" => "Companie", + "Keywords" => "Cuvinte cheie", + "Description" => "Descriere", + "No workbook is open." => "Niciun registru nu este deschis.", + "Save as type" => "Tip fișier", + "Excel Workbook (*.xlsx)" => "Registru Excel (*.xlsx)", + "CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (delimitat prin virgulă) (*.csv)", + "Web Page (*.html)" => "Pagină web (*.html)", + "PDF (*.pdf)" => "PDF (*.pdf)", + "Download" => "Descărcare", + "A CSV file, web page or PDF is a copy: the workbook keeps its own file." => { + "Un fișier CSV, o pagină web sau un PDF este o copie: registrul își păstrează propriul fișier." + } + "Save the workbook under another name or in another folder." => "Salvează registrul cu alt nume sau în alt folder.", + "Print Active Sheets" => "Imprimare foi active", + "Print Entire Workbook" => "Imprimare tot registrul", + "Fit Sheet on One Page" => "Încadrare foaie pe o pagină", + "Page Setup…" => "Inițializare pagină…", + "Page {page} of {pages}" => "Pagina {page} din {pages}", + "Nothing to print." => "Nimic de imprimat.", + "Previous page" => "Pagina anterioară", + "Next page" => "Pagina următoare", + "Create PDF" => "Creare PDF", + "Save the sheet as a PDF document that keeps its page layout." => "Salvează foaia ca document PDF care își păstrează aspectul paginii.", + "Change File Type" => "Schimbare tip de fișier", + "CSV (Comma delimited)" => "CSV (delimitat prin virgulă)", + "Save the active sheet as comma-separated text." => "Salvează foaia activă ca text separat prin virgule.", + "Web Page (.html)" => "Pagină web (.html)", + "Save the workbook as a web page." => "Salvează registrul ca pagină web.", + "Options|General" => "General", + "Options|Save" => "Salvare", + "Show formula bar" => "Afișare bară de formule", + "Enable AutoComplete for cell values" => "Activare completare automată pentru valorile din celule", + "Save .xlsx workbooks automatically after every change" => "Salvează automat registrele .xlsx după fiecare modificare", + "Workbook calculation" => "Calculul registrului", + "Enable iterative calculation" => "Activare calcul iterativ", + "Calculation settings are saved with the workbook." => "Setările de calcul se salvează împreună cu registrul.", + "OK" => "OK", + "Cancel" => "Anulare", + "Don't Save" => "Nu salva", + "Open…" => "Deschidere…", + "Show password" => "Afișare parolă", + "Start a new workbook" => "Începeți un registru nou", + "Household Budget" => "Buget familial", + "Quarterly Sales Dashboard" => "Tablou de bord vânzări trimestriale", + "Gradebook" => "Catalog de note", + "this workbook" => "acest registru", + "This workbook" => "Acest registru", + "Do you want to save the changes you made to {title}?" => "Doriți să salvați modificările făcute în {title}?", + "Save a copy as .{format}" => "Salvare copie ca .{format}", + "Select a chart first." => "Selectați mai întâi o diagramă.", + "Text Box" => "Casetă de text", + "Select Data" => "Selectare date", + "Row Height" => "Înălțime rând", + "Column Width" => "Lățime coloană", + "Standard Width" => "Lățime standard", + "Rename Sheet" => "Redenumire foaie", + "Move or Copy" => "Mutare sau copiere", + "Protect Sheet" => "Protejare foaie", + "Protect Structure and Windows" => "Protejare structură și ferestre", + "Unprotect Workbook" => "Deprotejare registru", + "Unprotect Sheet" => "Deprotejare foaie", + "Password" => "Parolă", + "Unhide" => "Reafișare", + "Paste Special" => "Lipire specială", + "Series" => "Serie", + "New Comment" => "Comentariu nou", + "Insert Hyperlink" => "Inserare hyperlink", + "Create Sparklines" => "Creare diagrame sparkline", + "Page Setup" => "Configurare pagină", + "Convert Text to Columns" => "Conversie text în coloane", + "Remove Duplicates" => "Eliminare dubluri", + "Goal Seek" => "Căutare rezultat", + "Create Forecast Worksheet" => "Creare foaie de prognoză", + "Solver Parameters" => "Parametri Solver", + "Solver Results" => "Rezultate Solver", + "Edit Name" => "Editare nume", + "New Name" => "Nume nou", + "Format Cells" => "Formatare celule", + "Formula Builder" => "Generator de formule", + "Find and Replace" => "Găsire și înlocuire", + "Go To" => "Salt la", + "Insert Calculated Field" => "Inserare câmp calculat", + "Go To Special" => "Salt la special", + "Name Manager" => "Manager de nume", + "Conditional Formatting Rules Manager" => "Manager de reguli de formatare condiționată", + "Search Commands" => "Căutare comenzi", + "Agent Control" => "Control prin agenți", + "About GridCraft" => "Despre GridCraft", + "Insert Chart" => "Inserare diagramă", + "Select Data Source" => "Selectare sursă de date", + "Action Journal" => "Jurnal de acțiuni", + "Macros" => "Macrocomenzi", + "Workbook Statistics" => "Statistici registru", + "Accessibility" => "Accesibilitate", + "Chart Title" => "Titlu diagramă", + "Place Picture in Cell" => "Plasare imagine în celulă", + "Place Picture over Cells" => "Plasare imagine peste celule", + "Pick From List" => "Alegere din listă", + "Save a Copy" => "Salvare copie", + "Save Changes?" => "Salvați modificările?", + "Shift cells right" => "Deplasare celule la dreapta", + "Shift cells down" => "Deplasare celule în jos", + "Shift cells left" => "Deplasare celule la stânga", + "Shift cells up" => "Deplasare celule în sus", + "Entire row" => "Tot rândul", + "Entire column" => "Toată coloana", + "Row height (pixels):" => "Înălțime rând (pixeli):", + "Column width (characters):" => "Lățime coloană (caractere):", + "Standard column width (pixels):" => "Lățime standard coloană (pixeli):", + "Name:" => "Nume:", + "Before sheet (position, 0 = first):" => "Înainte de foaia (poziție, 0 = prima):", + "Create a copy" => "Crearea unei copii", + "Sheets: {sheets}" => "Foi: {sheets}", + "Password (optional):" => "Parolă (opțional):", + "Password:" => "Parolă:", + "Allow all users of this sheet to:" => "Permiteți tuturor utilizatorilor acestei foi să:", + "Format cells" => "Formatare celule", + "Format columns" => "Formatare coloane", + "Format rows" => "Formatare rânduri", + "Insert rows" => "Inserare rânduri", + "Delete rows" => "Ștergere rânduri", + "Use AutoFilter" => "Utilizare Filtru automat", + " (password, unlocked)" => " (parolă, deblocat)", + " (password)" => " (parolă)", + "No ranges yet." => "Încă nicio zonă.", + "Ranges that stay editable when the sheet is protected:" => "Zone care rămân editabile când foaia este protejată:", + "Action" => "Acțiune", + "Modify" => "Modificare", + "Unlock with password" => "Deblocare cu parolă", + "Title:" => "Titlu:", + "Refers to cells:" => "Se referă la celulele:", + "Range password:" => "Parola zonei:", + "New title (Modify):" => "Titlu nou (Modificare):", + "Remove the password (Modify)" => "Eliminare parolă (Modificare)", + "'{file}' is protected." => "„{file}” este protejat.", + "Unhide sheet:" => "Reafișare foaie:", + "Hidden: {sheets}" => "Ascunse: {sheets}", + "All" => "Toate", + "Formulas (F)" => "Formule (F)", + "Values (V)" => "Valori (V)", + "Formats (T)" => "Formate (T)", + "Comments and notes (C)" => "Comentarii și note (C)", + "Validation" => "Validare", + "All except borders" => "Tot, cu excepția bordurilor", + "Column widths" => "Lățimi coloane", + "Formulas and number formats" => "Formule și formate de număr", + "Values and number formats" => "Valori și formate de număr", + "Operation" => "Operație", + "Add" => "Adăugare", + "Subtract" => "Scădere", + "Multiply" => "Înmulțire", + "Divide" => "Împărțire", + "Skip blanks" => "Ignorare celule goale", + "Transpose (E)" => "Transpunere (E)", + "Series in" => "Serii în", + "Columns" => "Coloane", + "Rows" => "Rânduri", + "Type" => "Tip", + "Linear" => "Liniar", + "Growth" => "Creștere", + "Date unit" => "Unitate de dată", + "Day" => "Zi", + "Weekday" => "Zi a săptămânii", + "Month" => "Lună", + "Year" => "An", + "Step value:" => "Valoare pas:", + "Stop value:" => "Valoare de oprire:", + "Start a conversation:" => "Începeți o conversație:", + "Note:" => "Notă:", + "Display:" => "Afișare:", + "Link to (web address, e-mail or Sheet!A1):" => "Link către (adresă web, e-mail sau Foaie!A1):", + "ScreenTip:" => "Sfat ecran:", + "Data Range:" => "Zonă de date:", + "Location Range:" => "Zonă de amplasare:", + "Markers" => "Marcaje", + "Footer:" => "Subsol:", + "Left margin (in):" => "Margine stânga (in):", + "Right margin (in):" => "Margine dreapta (in):", + "Top margin (in):" => "Margine sus (in):", + "Bottom margin (in):" => "Margine jos (in):", + "Header (in):" => "Antet (in):", + "Footer (in):" => "Subsol (in):", + "Tab" => "Tab", + "Semicolon" => "Punct și virgulă", + "Comma" => "Virgulă", + "Space" => "Spațiu", + "Other:" => "Altele:", + "Treat consecutive delimiters as one" => "Delimitatorii consecutivi se tratează ca unul singur", + "Destination:" => "Destinație:", + "My data has headers" => "Datele mele au anteturi", + "Columns (blank = all, e.g. A,C):" => "Coloane (gol = toate, de ex. A,C):", + "Timeline range (blank: first column of the selection):" => "Zona cronologiei (gol: prima coloană a selecției):", + "Values range (blank: second column of the selection):" => "Zona valorilor (gol: a doua coloană a selecției):", + "Confidence interval" => "Interval de încredere", + "Confidence level (%):" => "Nivel de încredere (%):", + "Seasonality (auto, 0 for none, or a season length):" => "Sezonalitate (automată, 0 pentru niciuna sau lungimea unui sezon):", + "Fill missing points using" => "Completare puncte lipsă folosind", + "Interpolation" => "Interpolare", + "Zeros" => "Zerouri", + "Aggregate duplicates using" => "Agregare duplicate folosind", + "Average" => "Medie", + "Count" => "Numărare", + "CountA" => "Numărare valori (CountA)", + "Max" => "Max", + "Median" => "Mediană", + "Min" => "Min", + "Sum" => "Sumă", + "Product" => "Produs", + "Include forecast statistics" => "Includere statistici de prognoză", + "Chart" => "Diagramă", + "Line chart" => "Diagramă cu linii", + "Column chart" => "Diagramă cu coloane", + "At each change in (column letter):" => "La fiecare schimbare în (litera coloanei):", + "Use function" => "Utilizare funcție", + "Add subtotal to (columns, e.g. C,D):" => "Adaugă subtotal la (coloane, de ex. C,D):", + "Magnification" => "Mărire", + "Custom (%):" => "Particularizat (%):", + "Scope (Workbook or sheet name):" => "Domeniu (registru sau numele foii):", + "Comment:" => "Comentariu:", + "Refers to:" => "Se referă la:", + "Allow" => "Permitere", + "Any value" => "Orice valoare", + "Whole number" => "Număr întreg", + "Decimal" => "Zecimal", + "List" => "Listă", + "Text length" => "Lungime text", + "between" => "între", + "not between" => "nu este între", + "equal to" => "egal cu", + "not equal to" => "diferit de", + "greater than" => "mai mare decât", + "less than" => "mai mic decât", + "greater than or equal to" => "mai mare sau egal cu", + "less than or equal to" => "mai mic sau egal cu", + "Minimum / Source / Formula:" => "Minim / Sursă / Formulă:", + "Maximum:" => "Maxim:", + "Ignore blank" => "Ignorare celule goale", + "In-cell dropdown" => "Listă verticală în celulă", + "Input message:" => "Mesaj de intrare:", + "Error style" => "Stil eroare", + "Stop" => "Oprire", + "Warning" => "Avertisment", + "Information" => "Informații", + "Error message:" => "Mesaj de eroare:", + "Format cells that are (value):" => "Formatare celule care sunt (valoare):", + "and:" => "și:", + "Format cells that contain the text:" => "Formatare celule care conțin textul:", + "Format cells that contain a date occurring:" => "Formatare celule care conțin o dată:", + "Yesterday" => "Ieri", + "Today" => "Azi", + "Tomorrow" => "Mâine", + "In the last 7 days" => "În ultimele 7 zile", + "Last week" => "Săptămâna trecută", + "This week" => "Săptămâna aceasta", + "Next week" => "Săptămâna viitoare", + "Last month" => "Luna trecută", + "This month" => "Luna aceasta", + "Next month" => "Luna următoare", + "Format values where this formula is true:" => "Formatare valori pentru care această formulă este adevărată:", + "with" => "cu", + "Light Red Fill with Dark Red Text" => "Umplere roșu deschis cu text roșu închis", + "Yellow Fill with Dark Yellow Text" => "Umplere galbenă cu text galben închis", + "Green Fill with Dark Green Text" => "Umplere verde cu text verde închis", + "Light Red Fill" => "Umplere roșu deschis", + "Red Text" => "Text roșu", + "Red Border" => "Bordură roșie", + "Formula:" => "Formulă:", + "Select" => "Selectare", + "Blanks" => "Celule goale", + "Errors" => "Erori", + "Numbers" => "Numere", + "Current region" => "Regiunea curentă", + "Last cell" => "Ultima celulă", + "Visible cells only" => "Doar celulele vizibile", + "Conditional formats" => "Formate condiționate", + "Data validation" => "Validare date", + "Horizontal axis title:" => "Titlu axă orizontală:", + "Vertical axis title:" => "Titlu axă verticală:", + "No picture selected" => "Nicio imagine selectată", + "Picture file path (PNG or JPEG):" => "Calea fișierului imagine (PNG sau JPEG):", + "Description (optional):" => "Descriere (opțional):", + "Fits inside the selected cell and moves with its content." => "Se încadrează în celula selectată și se mută odată cu conținutul ei.", + "Choose a PNG or JPEG no larger than 16 MB." => "Alegeți un PNG sau JPEG de cel mult 16 MB.", + "About" => "Despre", + "Contributors" => "Contribuitori", + "Models" => "Modele", + "Version {version}" => "Versiunea {version}", + "Join the ArtCraft Discord" => "Intrați pe Discord-ul ArtCraft", + "This workbook has no scripts or macros." => "Acest registru nu are scripturi sau macrocomenzi.", + "(unnamed)" => "(fără nume)", + "— VBA project (preserved, not run)" => "— proiect VBA (păstrat, nu se rulează)", + "— 1 step" => "— 1 pas", + "— {steps} steps" => "— {steps} pași", + "Alignment" => "Aliniere", + "Font" => "Font", + "Border" => "Bordură", + "Format Cells|Fill" => "Umplere", + "Protection" => "Protecție", + "Category:" => "Categorie:", + "Sample" => "Eșantion", + "Type (custom format code):" => "Tip (cod de format particularizat):", + "Vertical" => "Vertical", + "Justify" => "Aliniere stânga-dreapta", + "Center Across Selection" => "Centrare în selecție", + "Distributed" => "Distribuit", + "Top" => "Sus", + "Bottom" => "Jos", + "Indent" => "Indentare", + "Orientation (degrees)" => "Orientare (grade)", + "Wrap text" => "Încadrare text", + "Shrink to fit" => "Micșorare pentru potrivire", + "Bold" => "Aldin", + "Italic" => "Cursiv", + "None" => "Niciunul", + "Single" => "Simplu", + "Double" => "Dublu", + "Single Accounting" => "Simplă contabilă", + "Double Accounting" => "Dublă contabilă", + "Superscript" => "Exponent", + "Subscript" => "Indice", + "Color:" => "Culoare:", + "Outline" => "Contur", + "Diagonal ↘" => "Diagonal ↘", + "Diagonal ↗" => "Diagonal ↗", + "none" => "niciunul", + "thin" => "subțire", + "medium" => "medie", + "thick" => "groasă", + "dashed" => "întreruptă", + "dotted" => "punctată", + "double" => "dublă", + "Background Color:" => "Culoare de fundal:", + "Locked" => "Blocat", + "Hidden" => "Ascuns", + "Search:" => "Căutare:", + "e.g. lookup, average, date" => "de ex. căutare, medie, dată", + "Date & Time" => "Data și ora", + "Lookup & Reference" => "Căutare și referință", + "Math & Trig" => "Matematică și trigonometrie", + "Statistical" => "Statistice", + "Engineering" => "Inginerie", + "Database" => "Bază de date", + "Compatibility" => "Compatibilitate", + "Web" => "Web", + "Cube" => "Cub", + "Add-in and Automation" => "Supliment și automatizare", + "Find" => "Găsire", + "Replace" => "Înlocuire", + "Find what:" => "De găsit:", + "Replace with:" => "Înlocuire cu:", + "Match case" => "Potrivire majuscule/minuscule", + "Match entire cell contents" => "Potrivire cu întregul conținut al celulei", + "Within workbook" => "În registru", + "Replace All" => "Înlocuire totală", + "Find All" => "Găsire toate", + "Find Next" => "Găsire următorul", + "All done. We made {count} replacements." => "Gata. Am făcut {count} înlocuiri.", + "{count} cell(s) found" => "Celule găsite: {count}", + "Reference:" => "Referință:", + "Special…" => "Special…", + "My list has headers" => "Lista mea are anteturi", + "Sort by" => "Sortare după", + "Then by" => "Apoi după", + "Cell Values" => "Valori celule", + "Cell Color" => "Culoare celulă", + "A to Z" => "De la A la Z", + "Z to A" => "De la Z la A", + "+ Add Level" => "+ Adăugare nivel", + "New…" => "Nou…", + "Edit…" => "Editare…", + "Name" => "Nume", + "Value" => "Valoare", + "Refers To" => "Se referă la", + "Scope" => "Domeniu", + "Workbook" => "Registru", + "No names defined" => "Niciun nume definit", + "Recommended Charts" => "Diagrame recomandate", + "All Charts" => "Toate diagramele", + "Clustered Column" => "Coloane grupate", + "Stacked Column" => "Coloane stivuite", + "100% Stacked Column" => "Coloane 100% stivuite", + "Clustered Bar" => "Bare grupate", + "Stacked Bar" => "Bare stivuite", + "100% Stacked Bar" => "Bare 100% stivuite", + "Line" => "Linie", + "Line with Markers" => "Linii cu marcaje", + "Stacked Line" => "Linii stivuite", + "Pie" => "Radială", + "Doughnut" => "Inel", + "Area" => "Arie", + "Stacked Area" => "Arie stivuită", + "Scatter" => "Dispersie", + "Scatter with Lines" => "Dispersie cu linii", + "Radar" => "Radar", + "Histogram" => "Histogramă", + "Waterfall" => "Cascadă", + "Funnel" => "Pâlnie", + "Combo" => "Combo", + "Chart data range:" => "Zonă de date a diagramei:", + "Legend Entries (Series)" => "Intrări legendă (serii)", + "Series{n}" => "Seria{n}", + "Keep" => "Păstrare", + "Remove" => "Eliminare", + "Horizontal (Category) Axis Labels:" => "Etichete axă orizontală (categorii):", + "There are no conditional formatting rules on this sheet." => "Nu există reguli de formatare condiționată în această foaie.", + "applies to" => "se aplică la", + "Type a command, e.g. freeze, chart, bold…" => "Scrieți o comandă, de ex. îngheța, diagramă, aldin…", + "Set cell:" => "Setare celulă:", + "To value:" => "Până la valoarea:", + "By changing cell:" => "Prin modificarea celulei:", + "Goal Seeking found a solution: {value}" => "Căutarea rezultatului a găsit o soluție: {value}", + "Analysis Tools" => "Instrumente de analiză", + "Anova: Single Factor" => "Anova: un singur factor", + "Correlation" => "Corelație", + "Covariance" => "Covarianță", + "Descriptive Statistics" => "Statistică descriptivă", + "Exponential Smoothing" => "Netezire exponențială", + "F-Test Two-Sample for Variances" => "Test F: două eșantioane pentru dispersii", + "Moving Average" => "Medie mobilă", + "Rank and Percentile" => "Rang și percentilă", + "Regression" => "Regresie", + "t-Test: Paired Two Sample for Means" => "Test t: două eșantioane perechi pentru medii", + "t-Test: Two-Sample Assuming Equal Variances" => "Test t: două eșantioane cu dispersii egale", + "t-Test: Two-Sample Assuming Unequal Variances" => "Test t: două eșantioane cu dispersii inegale", + "Output options" => "Opțiuni de ieșire", + "Output Range:" => "Zonă de ieșire:", + "New Worksheet Ply:" => "Foaie de lucru nouă:", + "Grouped By:" => "Grupat după:", + "Labels in first row" => "Etichete în primul rând", + "Input Range:" => "Zonă de intrare:", + "Variable 1 Range:" => "Zona variabilei 1:", + "Variable 2 Range:" => "Zona variabilei 2:", + "Summary statistics" => "Statistici rezumative", + "Confidence Level for Mean (%), blank for none:" => "Nivel de încredere pentru medie (%), gol pentru niciunul:", + "Kth Largest (blank for none):" => "Al k-lea cel mai mare (gol pentru niciunul):", + "Kth Smallest (blank for none):" => "Al k-lea cel mai mic (gol pentru niciunul):", + "Bin Range (blank for automatic bins):" => "Zonă de intervale (gol pentru intervale automate):", + "Pareto (sorted histogram)" => "Pareto (histogramă sortată)", + "Cumulative Percentage" => "Procent cumulativ", + "Alpha:" => "Alfa:", + "Input Y Range:" => "Zonă Y de intrare:", + "Input X Range:" => "Zonă X de intrare:", + "Constant is Zero" => "Constanta este zero", + "Confidence Level (%):" => "Nivel de încredere (%):", + "Residuals" => "Reziduuri", + "Standardized Residuals" => "Reziduuri standardizate", + "Normal Probability" => "Probabilitate normală", + "Interval:" => "Interval:", + "Standard Errors" => "Erori standard", + "Damping factor:" => "Factor de amortizare:", + "Hypothesized Mean Difference:" => "Diferența ipotetică a mediilor:", + "Set Objective:" => "Setare obiectiv:", + "To:" => "Către:", + "Value Of:" => "Valoarea:", + "By Changing Variable Cells:" => "Prin modificarea celulelor variabile:", + "Subject to the Constraints:" => "Supus restricțiilor:", + "Make Unconstrained Variables Non-Negative" => "Variabilele fără restricții devin nenegative", + "Select a Solving Method:" => "Selectați o metodă de rezolvare:", + "GRG Nonlinear" => "GRG neliniar", + "Solve" => "Rezolvare", + "Keep Solver Solution" => "Păstrare soluție Solver", + "Restore Original Values" => "Restaurare valori inițiale", + "The spelling check is complete for the entire sheet." => "Verificarea ortografiei s-a încheiat pentru toată foaia.", + "Not in Dictionary ({cell}):" => "Nu este în dicționar ({cell}):", + "Suggestions:" => "Sugestii:", + "(No suggestions)" => "(Nicio sugestie)", + "Ignore Once" => "Ignorare o dată", + "Add to Dictionary" => "Adăugați în dicționar", + "Change" => "Modificare", + "Change All" => "Modificare toate", + "$ English (United States)" => "$ Engleză (Statele Unite)", + "Add Chart Element" => "Adăugare element de diagramă", + "Align Left" => "Aliniere la stânga", + "Align Right" => "Aliniere la dreapta", + "Bottom Align" => "Aliniere jos", + "Calculate Now (F9)" => "Calculare acum (F9)", + "Calculate Sheet (⇧F9)" => "Calculare foaie (⇧F9)", + "Calculation Options" => "Opțiuni de calcul", + "Cell Styles" => "Stiluri de celulă", + "Change Chart Type" => "Schimbare tip diagramă", + "Check Accessibility" => "Verificare accesibilitate", + "Clear Filter" => "Golire filtru", + "Column or Bar" => "Coloane sau bare", + "Comments pane" => "Panou comentarii", + "Convert the last ink stroke to a shape" => "Conversia ultimei trăsături de cerneală în formă", + "Convert to Range" => "Conversie în zonă", + "Copy" => "Copiere", + "Custom Sort" => "Sortare particularizată", + "Cut" => "Decupare", + "Define Name…" => "Definire nume…", + "Delete Comment" => "Ștergere comentariu", + "Delete Sheet" => "Ștergere foaie", + "Delete chart" => "Ștergere diagramă", + "Delete…" => "Ștergere…", + "Dismiss" => "Închidere", + "Down" => "Jos", + "Edit chart title" => "Editare titlu diagramă", + "Erase ink strokes" => "Ștergere trăsături de cerneală", + "Every command run in this session (replayable)" => "Toate comenzile rulate în această sesiune (se pot reda)", + "Expand formula bar" => "Extindere bară de formule", + "Filter (⌘⇧F)" => "Filtrare (⌘⇧F)", + "Filter by Selected Cell's Value" => "Filtrare după valoarea celulei selectate", + "Find & Select" => "Găsire și selectare", + "Flash Fill (⌘E)" => "Completare rapidă (⌘E)", + "Forecast Sheet" => "Foaie de prognoză", + "Forecast end (date or number; blank: a third of the history):" => "Sfârșitul prognozei (dată sau număr; gol: o treime din istoric):", + "Format Chart pane" => "Panou Formatare diagramă", + "Format as Table" => "Formatare ca tabel", + "Hide" => "Ascundere", + "Hide Sheet" => "Ascundere foaie", + "Hierarchy & more" => "Ierarhie și altele", + "Highlighter" => "Marker", + "How agents drive GridCraft (MCP / control channel)" => "Cum controlează agenții GridCraft (MCP / canal de control)", + "Import a text or CSV file" => "Importă un fișier text sau CSV", + "Insert Function" => "Inserare funcție", + "Insert Function (⇧F3)" => "Inserare funcție (⇧F3)", + "Insert Link (⌘K)" => "Inserare link (⌘K)", + "Insert Sheet" => "Inserare foaie", + "Insert Slicer" => "Inserare slicer", + "Insert a picture" => "Inserați o imagine", + "Insert a slicer to filter a table" => "Inserați un slicer pentru a filtra un tabel", + "Insert an icon" => "Inserați o pictogramă", + "Insert…" => "Inserare…", + "Line or Area" => "Linii sau arie", + "Link…" => "Link…", + "Macros and scripts in this workbook (Alt+F8)" => "Macrocomenzi și scripturi din acest registru (Alt+F8)", + "Middle Align" => "Aliniere la mijloc", + "More commands" => "Mai multe comenzi", + "Move or Copy Sheet…" => "Mutare sau copiere foaie…", + "New sheet (⇧F11)" => "Foaie nouă (⇧F11)", + "Next sheet" => "Foaia următoare", + "Page Breaks" => "Întreruperi de pagină", + "Paper Size" => "Dimensiune hârtie", + "Paste (⌘V)" => "Lipire (⌘V)", + "Pick From Drop-down List…" => "Alegere din lista verticală…", + "Pie or Doughnut" => "Radială sau inel", + "Previous sheet" => "Foaia anterioară", + "Print Area" => "Zonă de imprimare", + "Print Titles" => "Imprimare titluri", + "Protect Workbook structure" => "Protejare structură registru", + "Redo (⌘Y)" => "Refacere (⌘Y)", + "Save (⌘S)" => "Salvare (⌘S)", + "Scatter or Bubble" => "Dispersie sau bule", + "Search and run any command" => "Căutați și rulați orice comandă", + "Search commands (⌘⇧Space)" => "Căutare comenzi (⌘⇧Space)", + "Select and move ink and shapes" => "Selectați și mutați cerneala și formele", + "Series…" => "Serie…", + "Share: export or save a copy" => "Partajare: exportați sau salvați o copie", + "Show Formulas (⌃`)" => "Afișare formule (⌃`)", + "Slicer" => "Slicer", + "Sort & Filter" => "Sortare și filtrare", + "Spelling (F7)" => "Ortografie (F7)", + "Statistic" => "Statistică", + "Switch Row/Column" => "Comutare rând/coloană", + "Table (⌘T)" => "Tabel (⌘T)", + "Table Styles" => "Stiluri de tabel", + "Text to Columns" => "Text în coloane", + "The output range already holds data. Replace it with the report?" => "Zona de ieșire conține deja date. Le înlocuiți cu raportul?", + "Top Align" => "Aliniere sus", + "Undo (⌘Z)" => "Anulare acțiune (⌘Z)", + "Undo list" => "Listă anulări", + "Unhide Sheet…" => "Reafișare foaie…", + "Up" => "Sus", + "Version, contributors and the AI models that helped" => "Versiune, contribuitori și modelele AI care au ajutat", + "What-If Analysis" => "Analiză ce-ar fi dacă", + "Zoom In" => "Mărire", + "Zoom Out" => "Micșorare", + "Zoom to 100%" => "Zoom la 100%", + "Zoom to Selection" => "Zoom la selecție", + "Zoom…" => "Zoom…", + "£ English (United Kingdom)" => "£ Engleză (Regatul Unit)", + "¥ Japanese" => "¥ Japoneză", + "€ Euro" => "€ Euro", + "Tab|Insert" => "Inserare", + "AutoSave" => "Salvare automată", + "Insert\nSlicer" => "Inserare\nslicer", + "Pen\nBlack" => "Pix\nnegru", + "Pen\nBlue" => "Pix\nalbastru", + "Pen\nRed" => "Pix\nroșu", + "Protect\nSheet" => "Protejare\nfoaie", + "Watch\nWindow" => "Fereastră de\nurmărire", + "Workbook\nStatistics" => "Statistici\nregistru", + "Calculated Field…" => "Câmp calculat…", + "Choose fields to add to report:" => "Alegeți câmpurile de adăugat în raport:", + "Compact" => "Compact", + "Filters" => "Filtre", + "Group by Months" => "Grupare pe luni", + "Group by Quarters" => "Grupare pe trimestre", + "Group by Years" => "Grupare pe ani", + "Move to Column Labels" => "Mutare la Etichete de coloană", + "Move to Report Filter" => "Mutare la Filtru raport", + "Move to Row Labels" => "Mutare la Etichete de rând", + "Move to Values" => "Mutare la Valori", + "PivotTable Fields" => "Câmpuri PivotTable", + "Refresh" => "Reîmprospătare", + "Remove Field" => "Eliminare câmp", + "Report Layout" => "Aspect raport", + "Show as % of Grand Total" => "Afișare ca % din totalul general", + "Show as No Calculation" => "Afișare fără calcul", + "Show as Rank" => "Afișare ca rang", + "Show as Running Total" => "Afișare ca total cumulat", + "Summarize by Average" => "Rezumare după medie", + "Summarize by Count" => "Rezumare după numărare", + "Summarize by Max" => "Rezumare după maxim", + "Summarize by Min" => "Rezumare după minim", + "Summarize by Sum" => "Rezumare după sumă", + "Tabular" => "Tabelar", + "Use a field's menu to move it between areas:" => "Folosiți meniul unui câmp ca să-l mutați între zone:", + "Values" => "Valori", + _ => return None, + }) +} diff --git a/crates/ui-egui/tests/file_menu.rs b/crates/ui-egui/tests/file_menu.rs index 6cce9cdba..23f55fe37 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")), + ("ro", ["General", "Salvare"], ["Opțiuni|General", "Opțiuni|Salvare"], ("Vizualizare", "Opțiuni foaie|Vizualizare")), ] { 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..374abb634 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-21 · **Change:** minor (Romanian interface catalog, 970 labels; previously 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 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, @@ -83,6 +83,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-21 | minor | Romanian interface (`ro`, Română): 970 labels covering every key of the other catalogs (`crates/ui-egui/src/i18n/ro.rs`), `ro-*` system locales, the View-tab switcher and `app.language.set`; context keys show no prefix (File › Options test). English formulas and formats; AI-assisted draft pending native-speaker review | | 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 | From 8e38fc21fa537da9038d2035745401e8569e50e4 Mon Sep 17 00:00:00 2001 From: Viorel Toader Date: Wed, 21 Oct 2026 10:16:07 +0300 Subject: [PATCH 20/33] =?UTF-8?q?Romanian:=20feminine=20st=C3=A2ng=C4=83/d?= =?UTF-8?q?reapt=C4=83=20for=20the=20margin=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JadgGo4G2GHaAMNb3qyygk --- crates/ui-egui/src/i18n/ro.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/ui-egui/src/i18n/ro.rs b/crates/ui-egui/src/i18n/ro.rs index 5fc8ad14b..597734441 100644 --- a/crates/ui-egui/src/i18n/ro.rs +++ b/crates/ui-egui/src/i18n/ro.rs @@ -126,8 +126,8 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Select\nObjects" => "Selectare\nobiecte", "Themes" => "Teme", "Margins" => "Margini", - "Left Margin" => "Margine stânga", - "Right Margin" => "Margine dreapta", + "Left Margin" => "Margine stângă", + "Right Margin" => "Margine dreaptă", "Top Margin" => "Margine sus", "Bottom Margin" => "Margine jos", "Header Margin" => "Margine antet", @@ -552,8 +552,8 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Location Range:" => "Zonă de amplasare:", "Markers" => "Marcaje", "Footer:" => "Subsol:", - "Left margin (in):" => "Margine stânga (in):", - "Right margin (in):" => "Margine dreapta (in):", + "Left margin (in):" => "Margine stângă (in):", + "Right margin (in):" => "Margine dreaptă (in):", "Top margin (in):" => "Margine sus (in):", "Bottom margin (in):" => "Margine jos (in):", "Header (in):" => "Antet (in):", From 43e64c50a2e9c0cdf7679db95a966e245fbdf1f5 Mon Sep 17 00:00:00 2001 From: Viorel Toader Date: Wed, 21 Oct 2026 10:57:20 +0300 Subject: [PATCH 21/33] =?UTF-8?q?Romanian:=20print=20settings=20and=20stat?= =?UTF-8?q?us,=20five=20form=20labels;=20Page=20Setup=E2=80=A6=20matches?= =?UTF-8?q?=20its=20dialog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JadgGo4G2GHaAMNb3qyygk --- crates/ui-egui/src/i18n/ro.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/i18n/ro.rs b/crates/ui-egui/src/i18n/ro.rs index 597734441..4cc3ae95b 100644 --- a/crates/ui-egui/src/i18n/ro.rs +++ b/crates/ui-egui/src/i18n/ro.rs @@ -392,7 +392,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Print Active Sheets" => "Imprimare foi active", "Print Entire Workbook" => "Imprimare tot registrul", "Fit Sheet on One Page" => "Încadrare foaie pe o pagină", - "Page Setup…" => "Inițializare pagină…", + "Page Setup…" => "Configurare pagină…", "Page {page} of {pages}" => "Pagina {page} din {pages}", "Nothing to print." => "Nimic de imprimat.", "Previous page" => "Pagina anterioară", @@ -985,6 +985,37 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Tabular" => "Tabelar", "Use a field's menu to move it between areas:" => "Folosiți meniul unui câmp ca să-l mutați între zone:", "Values" => "Valori", + "Header (&L left, &C center, &R right; &P page, &N pages, &D date, &A sheet):" => { + "Antet (&L stânga, &C centru, &R dreapta; &P pagina, &N pagini, &D data, &A foaia):" + } + "Forecast start (a date or number in the history; blank: after the last point):" => { + "Începutul prognozei (o dată sau un număr din istoric; gol: după ultimul punct):" + } + "Source:" => "Sursă:", + "End date:" => "Data de sfârșit:", + "Protect workbook for: Structure (sheets can't be added, moved, renamed, hidden or deleted)." => { + "Protejare registru pentru: structură (foile nu pot fi adăugate, mutate, redenumite, ascunse sau șterse)." + } + "Printer" => "Imprimantă", + "Select a printer" => "Selectați o imprimantă", + "Refresh printers" => "Reîmprospătare imprimante", + "Copies" => "Copii", + "Two-sided printing" => "Imprimare față-verso", + "Printer default" => "Setarea imprimantei", + "One-sided" => "O singură față", + "Two-sided: long edge" => "Față-verso: latura lungă", + "Two-sided: short edge" => "Față-verso: latura scurtă", + "Grayscale" => "Tonuri de gri", + "Finding printers…" => "Se caută imprimante…", + "No printers found. Configure a system printer or export a PDF." => { + "Nu s-a găsit nicio imprimantă. Configurați o imprimantă în sistem sau exportați un PDF." + } + "Printer discovery failed." => "Căutarea imprimantelor a eșuat.", + "Submitting print job…" => "Se trimite lucrarea de imprimare…", + "Print job submitted." => "Lucrarea de imprimare a fost trimisă.", + "Print job submitted: {receipt}" => "Lucrarea de imprimare a fost trimisă: {receipt}", + "Print failed: {error}" => "Imprimarea a eșuat: {error}", + "Print failed: the printing worker stopped." => "Imprimarea a eșuat: procesul de imprimare s-a oprit.", _ => return None, }) } From c26290cd04799b884f9667b9cc21689d1a457ff3 Mon Sep 17 00:00:00 2001 From: Viorel Toader Date: Wed, 21 Oct 2026 11:13:57 +0300 Subject: [PATCH 22/33] Show form notes that contain a pipe as they are tr reads | as a context separator, so translating the Open Hyperlink note cut a URL with a pipe down to the part after it. Notes carry user data (URLs, file and sheet names); one with a pipe is now drawn verbatim. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JadgGo4G2GHaAMNb3qyygk --- crates/ui-egui/src/dialogs.rs | 5 ++++- crates/ui-egui/tests/translated_form_fields.rs | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index 9dee2c886..b290117c4 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -1462,7 +1462,10 @@ fn form_fields(ui: &mut egui::Ui, d: &mut Dialog) { } } Field::Note(t) => { - ui.label(egui::RichText::new(lang.tr(&t)).small()); + // A note can carry user data (a URL, a file or sheet name); `tr` reads a `|` as a + // context separator, so such a note is shown as it is. + let text = if t.contains('|') { t.as_str() } else { lang.tr(&t) }; + ui.label(egui::RichText::new(text).small()); } } ui.end_row(); diff --git a/crates/ui-egui/tests/translated_form_fields.rs b/crates/ui-egui/tests/translated_form_fields.rs index 6c3bc93ca..35847a425 100644 --- a/crates/ui-egui/tests/translated_form_fields.rs +++ b/crates/ui-egui/tests/translated_form_fields.rs @@ -39,3 +39,17 @@ fn form_fields_are_translated() { } } } + +#[test] +fn notes_with_a_pipe_show_in_full() { + // `tr` reads `|` as a context separator; the Open Hyperlink note carries the URL, which must + // be shown whole so the user sees where the link really goes. + let url = "https://example.com/report|evil.example"; + for language in ["en", "pt"] { + let mut h = harness(); + h.state_mut().run("app.language.set", json!({"language": language})).unwrap(); + h.state_mut().open_dialog("openLink", json!({"url": url})); + h.run_steps(3); + assert!(h.query_by_label_contains(url).is_some(), "{language}: the link note lost part of {url}"); + } +} From c812881fa9f433e6dbd19047f52cd8192688a8d4 Mon Sep 17 00:00:00 2001 From: Nikolai Nyegaard Date: Wed, 21 Oct 2026 12:01:41 +0200 Subject: [PATCH 23/33] Backstage: list the languages alphabetically by their own name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - English (and Auto where offered) stays first as the source language and fallback; the rest sort by native name with accents folded, so Čeština is under C and Magyar under M; Cyrillic and CJK names follow the Latin ones - The list used the registry order, which is the order the languages were added --- crates/ui-egui/src/backstage.rs | 2 +- crates/ui-egui/src/i18n.rs | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/backstage.rs b/crates/ui-egui/src/backstage.rs index 922baabc5..f60ab06a0 100644 --- a/crates/ui-egui/src/backstage.rs +++ b/crates/ui-egui/src/backstage.rs @@ -948,7 +948,7 @@ fn options(app: &mut SheetApp, ui: &mut Ui) { ui.end_row(); ui.label(lang.tr("Interface language")); egui::ComboBox::from_id_salt("backstage_language").width(160.0).selected_text(lang.name()).show_ui(ui, |ui| { - for l in i18n::Language::ALL { + for l in i18n::Language::for_picker() { if ui.selectable_label(l == lang, l.name()).clicked() { app.run_or_alert("app.language.set", json!({"language": l.code()})); } diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 98919f8a4..7c0823b5b 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -40,6 +40,15 @@ pub enum Language { 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]; + /// Every language in the order the switcher lists them: English first (the source language), + /// then the rest by their own name with accents folded, so Čeština sits under C. Names in + /// other scripts follow the Latin ones in code point order: Cyrillic, then the CJK languages. + pub fn for_picker() -> Vec { + let mut rest: Vec = Self::ALL.into_iter().filter(|l| *l != Self::En).collect(); + rest.sort_by_cached_key(|l| name_sort_key(l.name())); + std::iter::once(Self::En).chain(rest).collect() + } + /// The language's own name, shown in the switcher. pub fn name(self) -> &'static str { match self { @@ -768,3 +777,39 @@ mod tests { } } } + +/// `name` lowercased with the Latin accents that occur in language names folded away, so a +/// byte-wise sort reads alphabetically. Other scripts are left as they are. +fn name_sort_key(name: &str) -> String { + name.chars() + .flat_map(char::to_lowercase) + .map(|c| match c { + 'à'..='å' | 'ā' | 'ă' | 'ą' => 'a', + 'ç' | 'ć' | 'č' => 'c', + 'è'..='ë' | 'ē' | 'ě' | 'ę' | 'ế' | 'ệ' => 'e', + 'ì'..='ï' | 'ī' => 'i', + 'ñ' | 'ń' | 'ň' => 'n', + 'ò'..='ö' | 'ø' | 'ő' => 'o', + 'ś' | 'š' => 's', + 'ù'..='ü' | 'ū' | 'ů' | 'ű' => 'u', + 'ý' | 'ÿ' => 'y', + 'ź' | 'ż' | 'ž' => 'z', + c => c, + }) + .collect() +} + +#[cfg(test)] +mod picker_order_tests { + use super::*; + + #[test] + fn picker_lists_english_first_then_names_alphabetically() { + let order = Language::for_picker(); + assert_eq!(order.first(), Some(&Language::En)); + assert_eq!(order.len(), Language::ALL.len()); + let keys: Vec = order[1..].iter().map(|l| name_sort_key(l.name())).collect(); + assert!(keys.windows(2).all(|w| w[0] <= w[1]), "{keys:?}"); + assert_eq!(name_sort_key("Čeština"), "cestina"); + } +} From 97aa04dc8029ee83ab636e1bfee831afbd3e818a Mon Sep 17 00:00:00 2001 From: midasdf <205497066+midasdf@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:51:09 +0900 Subject: [PATCH 24/33] =?UTF-8?q?i18n(ja):=20add=20the=20=C2=A711=20revisi?= =?UTF-8?q?on=20row=20and=20align=20the=20docs=20header=20dates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Japanese catalog's ribbon labels the review flagged are already in the head ("Save (⌘S)" is 上書き保存 (⌘S), "Insert\nSlicer" is スライサーの\n挿入, and the catalog test asserts the new value), so only the docs needed work: docs/gaps.md had no revision row for the §11 Japanese-catalog update. Add one dated 2026-10-20, and set the "Last updated" header of ROADMAP.md, docs/gaps.md and docs/localization-parity.md to the same date as their new rows. Every existing revision row keeps its original date. --- ROADMAP.md | 2 +- docs/gaps.md | 3 ++- docs/localization-parity.md | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 7adcbaeb2..c22612846 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-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365) +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-20 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **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. diff --git a/docs/gaps.md b/docs/gaps.md index 85cd0f021..7f01e7e15 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -1,6 +1,6 @@ # Gaps -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365) +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-20 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365) Every known shortfall against Excel, one entry each, ranked by user impact (what blocks someone using GridCraft for real work first). This is the work list: pick from the top, check the open @@ -170,6 +170,7 @@ No alpha blockers: every core workflow passes the [alpha gate](roadmap.md#alpha- | Date | Change | Summary | |---|---|---| +| 2026-10-20 | minor | §11: the Japanese catalog covers the dialogs, messages and menus — 943 keys (~43%), matching the pt-BR coverage; a test keeps the two catalogs in step | | 2026-10-12 | minor | rows auto-fit oversized fonts on open and whole-row/column formatting (#833) | | 2026-10-12 | minor | Page Layout view: dragging margins on the rulers (#792) removed from the §14 remainder | | 2026-10-12 | minor | §13: Forecast Sheet Forecast Start (hindcast) landed (#785) | diff --git a/docs/localization-parity.md b/docs/localization-parity.md index ee846e6c3..462a78176 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-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-20 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **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, From 0592dd0a5e20f4971e3d4f5943df11b242db31b6 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:35:14 +0000 Subject: [PATCH 25/33] Integration: #1091 fill Polish catalog gap (Options|Editing, English text) --- crates/ui-egui/src/i18n/pl.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ui-egui/src/i18n/pl.rs b/crates/ui-egui/src/i18n/pl.rs index d351b8597..b5234febf 100644 --- a/crates/ui-egui/src/i18n/pl.rs +++ b/crates/ui-egui/src/i18n/pl.rs @@ -399,6 +399,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Save the workbook as a web page." => "Zapisz skoroszyt jako stronę sieci Web.", "Options|General" => "Ogólne", "Options|Save" => "Zapisywanie", + "Options|Editing" => "Editing", "Show formula bar" => "Pokaż pasek formuły", "Enable AutoComplete for cell values" => "Włącz Autouzupełnianie dla wartości komórek", "Save .xlsx workbooks automatically after every change" => "Automatycznie zapisuj skoroszyty .xlsx po każdej zmianie", From 4e74bb762bb102c3d639955cd809dd0fc5ac6fc4 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:35:38 +0000 Subject: [PATCH 26/33] Integration: #1414 kittest for command search keyboard navigation --- crates/ui-egui/tests/dialog_focus.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/crates/ui-egui/tests/dialog_focus.rs b/crates/ui-egui/tests/dialog_focus.rs index 2dd047554..ee0896f8f 100644 --- a/crates/ui-egui/tests/dialog_focus.rs +++ b/crates/ui-egui/tests/dialog_focus.rs @@ -59,3 +59,23 @@ fn row_height_opens_with_the_height_ready_to_type() { }; assert!((height as f64 - 40.0).abs() < 0.6, "row 3 is 40 high, got {height}"); } + +#[test] +fn command_search_arrow_and_page_keys_move_the_selection_and_keep_the_search_focused() { + let mut h = harness(); + h.state_mut().open_dialog("commandSearch", json!({})); + h.run_steps(6); + h.input_mut().events.push(Event::Text("a".into())); + h.run_steps(3); + assert_eq!(h.state().dialog.as_ref().map(|d| d.list_index), Some(0)); + for _ in 0..2 { + h.key_press(Key::ArrowDown); + h.run_steps(2); + } + assert_eq!(h.state().dialog.as_ref().map(|d| d.list_index), Some(2), "two ArrowDown presses"); + h.key_press(Key::PageDown); + h.run_steps(2); + let after_page = h.state().dialog.as_ref().map(|d| d.list_index).unwrap_or(0); + assert!(after_page > 2, "PageDown moved past the third row, got {after_page}"); + assert!(h.ctx.memory(|m| m.focused()).is_some(), "the search field kept focus"); +} From 66e6c9f54e4b4f1917a418364f8ce8192cdfa8ba Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:36:01 +0000 Subject: [PATCH 27/33] Integration: #1468 fill Greek catalog gap (Options|Editing, English text) --- crates/ui-egui/src/i18n/el.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ui-egui/src/i18n/el.rs b/crates/ui-egui/src/i18n/el.rs index b87e9c0f0..1754d9689 100644 --- a/crates/ui-egui/src/i18n/el.rs +++ b/crates/ui-egui/src/i18n/el.rs @@ -305,6 +305,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Save the workbook as a web page." => "Αποθηκεύστε το βιβλίο εργασίας ως ιστοσελίδα.", "Options|General" => "Γενικά", "Options|Save" => "Αποθήκευση", + "Options|Editing" => "Editing", "Show formula bar" => "Εμφάνιση γραμμής τύπων", "Enable AutoComplete for cell values" => "Ενεργοποίηση αυτόματης συμπλήρωσης τιμών κελιών", "Save .xlsx workbooks automatically after every change" => "Αυτόματη αποθήκευση βιβλίων .xlsx μετά από κάθε αλλαγή", From 8bfe3102085d51eb3d2c31559bd862df16a381a8 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:37:49 +0000 Subject: [PATCH 28/33] Integration: #1770 register Ukrainian (Language::Uk) and fill 573 missing keys with English text --- crates/ui-egui/src/i18n.rs | 15 +- crates/ui-egui/src/i18n/uk.rs | 573 ++++++++++++++++++++++++++++++++++ 2 files changed, 586 insertions(+), 2 deletions(-) diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 99774b837..9ecfdcc46 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -22,6 +22,7 @@ mod pt; mod ru; mod sr; mod zh; +mod uk; #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -42,11 +43,12 @@ pub enum Language { Sr, Pl, It, + Uk, } impl Language { - pub const ALL: [Self; 14] = [ - Self::En, Self::Es, Self::El, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr, Self::Pl, Self::It, + pub const ALL: [Self; 15] = [ + Self::En, Self::Es, Self::El, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr, Self::Pl, Self::It, Self::Uk, ]; /// The language's own name, shown in the switcher. @@ -66,6 +68,7 @@ impl Language { Self::Sr => "Srpski", Self::Pl => "Polski", Self::It => "Italiano", + Self::Uk => "Українська", } } @@ -86,6 +89,7 @@ impl Language { Self::Sr => "sr", Self::Pl => "pl", Self::It => "it", + Self::Uk => "uk", } } @@ -109,6 +113,7 @@ impl Language { "sr" => Some(Self::Sr), "pl" => Some(Self::Pl), "it" => Some(Self::It), + "uk" => Some(Self::Uk), _ => None, } } @@ -150,6 +155,7 @@ impl Language { Self::Sr => sr::translate(text), Self::Pl => pl::translate(text), Self::It => it::translate(text), + Self::Uk => uk::translate(text), }; translated.unwrap_or_else(|| text.rsplit_once('|').map_or(text, |(_, label)| label)) } @@ -218,6 +224,7 @@ mod tests { assert!(sr::translate(english).is_some_and(|text| !text.is_empty()), "missing Serbian: {english}"); assert!(pl::translate(english).is_some_and(|text| !text.is_empty()), "missing Polish: {english}"); assert!(it::translate(english).is_some_and(|text| !text.is_empty()), "missing Italian: {english}"); + assert!(uk::translate(english).is_some_and(|text| !text.is_empty()), "missing Ukrainian: {english}"); } assert_eq!(Language::Ja.tr("Data"), "データ"); assert_eq!(Language::Zh.tr("Data"), "数据"); @@ -263,6 +270,8 @@ mod tests { assert_eq!(Language::It.tr("Freeze Panes"), "Blocca riquadri"); assert_eq!(Language::It.tr("Page Layout|Orientation"), "Orientamento"); assert_eq!(Language::It.tr("Orientation"), "Orientamento"); + assert_eq!(Language::Uk.tr("Data"), "Дані"); + assert_eq!(Language::Uk.tr("Sheet1!A1"), "Sheet1!A1"); assert_eq!(Language::parse("xx"), None); } @@ -398,6 +407,8 @@ mod tests { assert_eq!(Language::from_tag("it-IT"), Some(Language::It)); assert_eq!(Language::from_tag("it_CH.UTF-8"), Some(Language::It)); assert_eq!(Language::parse("it"), Some(Language::It)); + assert_eq!(Language::from_tag("uk-XX"), Some(Language::Uk)); + assert_eq!(Language::parse("uk"), Some(Language::Uk)); } #[test] diff --git a/crates/ui-egui/src/i18n/uk.rs b/crates/ui-egui/src/i18n/uk.rs index 389f3b68e..458bd912f 100644 --- a/crates/ui-egui/src/i18n/uk.rs +++ b/crates/ui-egui/src/i18n/uk.rs @@ -410,6 +410,579 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Workbook calculation" => "Обчислення в книзі", "Enable iterative calculation" => "Увімкнути ітеративні обчислення", "Calculation settings are saved with the workbook." => "Параметри обчислень зберігаються разом із книгою.", + "OK" => "OK", + "Cancel" => "Cancel", + "Don't Save" => "Don't Save", + "Open…" => "Open…", + "Show password" => "Show password", + "Start a new workbook" => "Start a new workbook", + "Household Budget" => "Household Budget", + "Quarterly Sales Dashboard" => "Quarterly Sales Dashboard", + "Gradebook" => "Gradebook", + "this workbook" => "this workbook", + "This workbook" => "This workbook", + "Do you want to save the changes you made to {title}?" => "Do you want to save the changes you made to {title}?", + "Save a copy as .{format}" => "Save a copy as .{format}", + "Select a chart first." => "Select a chart first.", + "Text Box" => "Text Box", + "Select Data" => "Select Data", + "Row Height" => "Row Height", + "Column Width" => "Column Width", + "Standard Width" => "Standard Width", + "Rename Sheet" => "Rename Sheet", + "Move or Copy" => "Move or Copy", + "Protect Sheet" => "Protect Sheet", + "Protect Structure and Windows" => "Protect Structure and Windows", + "Unprotect Workbook" => "Unprotect Workbook", + "Unprotect Sheet" => "Unprotect Sheet", + "Password" => "Password", + "Unhide" => "Unhide", + "Paste Special" => "Paste Special", + "Series" => "Series", + "New Comment" => "New Comment", + "Insert Hyperlink" => "Insert Hyperlink", + "Create Sparklines" => "Create Sparklines", + "Page Setup" => "Page Setup", + "Convert Text to Columns" => "Convert Text to Columns", + "Remove Duplicates" => "Remove Duplicates", + "Goal Seek" => "Goal Seek", + "Create Forecast Worksheet" => "Create Forecast Worksheet", + "Solver Parameters" => "Solver Parameters", + "Solver Results" => "Solver Results", + "Edit Name" => "Edit Name", + "New Name" => "New Name", + "Format Cells" => "Format Cells", + "Formula Builder" => "Formula Builder", + "Find and Replace" => "Find and Replace", + "Go To" => "Go To", + "Insert Calculated Field" => "Insert Calculated Field", + "Go To Special" => "Go To Special", + "Name Manager" => "Name Manager", + "Conditional Formatting Rules Manager" => "Conditional Formatting Rules Manager", + "Search Commands" => "Search Commands", + "Agent Control" => "Agent Control", + "About GridCraft" => "About GridCraft", + "Insert Chart" => "Insert Chart", + "Select Data Source" => "Select Data Source", + "Action Journal" => "Action Journal", + "Macros" => "Macros", + "Workbook Statistics" => "Workbook Statistics", + "Accessibility" => "Accessibility", + "Chart Title" => "Chart Title", + "Place Picture in Cell" => "Place Picture in Cell", + "Place Picture over Cells" => "Place Picture over Cells", + "Pick From List" => "Pick From List", + "Save a Copy" => "Save a Copy", + "Save Changes?" => "Save Changes?", + "Shift cells right" => "Shift cells right", + "Shift cells down" => "Shift cells down", + "Shift cells left" => "Shift cells left", + "Shift cells up" => "Shift cells up", + "Entire row" => "Entire row", + "Entire column" => "Entire column", + "Row height (pixels):" => "Row height (pixels):", + "Column width (characters):" => "Column width (characters):", + "Standard column width (pixels):" => "Standard column width (pixels):", + "Name:" => "Name:", + "Before sheet (position, 0 = first):" => "Before sheet (position, 0 = first):", + "Create a copy" => "Create a copy", + "Sheets: {sheets}" => "Sheets: {sheets}", + "Password (optional):" => "Password (optional):", + "Password:" => "Password:", + "Allow all users of this sheet to:" => "Allow all users of this sheet to:", + "Format cells" => "Format cells", + "Format columns" => "Format columns", + "Format rows" => "Format rows", + "Insert rows" => "Insert rows", + "Delete rows" => "Delete rows", + "Use AutoFilter" => "Use AutoFilter", + " (password, unlocked)" => " (password, unlocked)", + " (password)" => " (password)", + "No ranges yet." => "No ranges yet.", + "Ranges that stay editable when the sheet is protected:" => "Ranges that stay editable when the sheet is protected:", + "Action" => "Action", + "Modify" => "Modify", + "Unlock with password" => "Unlock with password", + "Title:" => "Title:", + "Refers to cells:" => "Refers to cells:", + "Range password:" => "Range password:", + "New title (Modify):" => "New title (Modify):", + "Remove the password (Modify)" => "Remove the password (Modify)", + "'{file}' is protected." => "'{file}' is protected.", + "Unhide sheet:" => "Unhide sheet:", + "Hidden: {sheets}" => "Hidden: {sheets}", + "All" => "All", + "Formulas (F)" => "Formulas (F)", + "Values (V)" => "Values (V)", + "Formats (T)" => "Formats (T)", + "Comments and notes (C)" => "Comments and notes (C)", + "Validation" => "Validation", + "All except borders" => "All except borders", + "Column widths" => "Column widths", + "Formulas and number formats" => "Formulas and number formats", + "Values and number formats" => "Values and number formats", + "Operation" => "Operation", + "Add" => "Add", + "Subtract" => "Subtract", + "Multiply" => "Multiply", + "Divide" => "Divide", + "Skip blanks" => "Skip blanks", + "Transpose (E)" => "Transpose (E)", + "Series in" => "Series in", + "Columns" => "Columns", + "Rows" => "Rows", + "Type" => "Type", + "Linear" => "Linear", + "Growth" => "Growth", + "Date unit" => "Date unit", + "Day" => "Day", + "Weekday" => "Weekday", + "Month" => "Month", + "Year" => "Year", + "Step value:" => "Step value:", + "Stop value:" => "Stop value:", + "Start a conversation:" => "Start a conversation:", + "Note:" => "Note:", + "Display:" => "Display:", + "Link to (web address, e-mail or Sheet!A1):" => "Link to (web address, e-mail or Sheet!A1):", + "ScreenTip:" => "ScreenTip:", + "Data Range:" => "Data Range:", + "Location Range:" => "Location Range:", + "Markers" => "Markers", + "Footer:" => "Footer:", + "Left margin (in):" => "Left margin (in):", + "Right margin (in):" => "Right margin (in):", + "Top margin (in):" => "Top margin (in):", + "Bottom margin (in):" => "Bottom margin (in):", + "Header (in):" => "Header (in):", + "Footer (in):" => "Footer (in):", + "Tab" => "Tab", + "Semicolon" => "Semicolon", + "Comma" => "Comma", + "Space" => "Space", + "Other:" => "Other:", + "Treat consecutive delimiters as one" => "Treat consecutive delimiters as one", + "Destination:" => "Destination:", + "My data has headers" => "My data has headers", + "Columns (blank = all, e.g. A,C):" => "Columns (blank = all, e.g. A,C):", + "Timeline range (blank: first column of the selection):" => "Timeline range (blank: first column of the selection):", + "Values range (blank: second column of the selection):" => "Values range (blank: second column of the selection):", + "Confidence interval" => "Confidence interval", + "Confidence level (%):" => "Confidence level (%):", + "Seasonality (auto, 0 for none, or a season length):" => "Seasonality (auto, 0 for none, or a season length):", + "Fill missing points using" => "Fill missing points using", + "Interpolation" => "Interpolation", + "Zeros" => "Zeros", + "Aggregate duplicates using" => "Aggregate duplicates using", + "Average" => "Average", + "Count" => "Count", + "CountA" => "CountA", + "Max" => "Max", + "Median" => "Median", + "Min" => "Min", + "Sum" => "Sum", + "Product" => "Product", + "Include forecast statistics" => "Include forecast statistics", + "Chart" => "Chart", + "Line chart" => "Line chart", + "Column chart" => "Column chart", + "At each change in (column letter):" => "At each change in (column letter):", + "Use function" => "Use function", + "Add subtotal to (columns, e.g. C,D):" => "Add subtotal to (columns, e.g. C,D):", + "Magnification" => "Magnification", + "Custom (%):" => "Custom (%):", + "Scope (Workbook or sheet name):" => "Scope (Workbook or sheet name):", + "Comment:" => "Comment:", + "Refers to:" => "Refers to:", + "Allow" => "Allow", + "Any value" => "Any value", + "Whole number" => "Whole number", + "Decimal" => "Decimal", + "List" => "List", + "Text length" => "Text length", + "between" => "between", + "not between" => "not between", + "equal to" => "equal to", + "not equal to" => "not equal to", + "greater than" => "greater than", + "less than" => "less than", + "greater than or equal to" => "greater than or equal to", + "less than or equal to" => "less than or equal to", + "Minimum / Source / Formula:" => "Minimum / Source / Formula:", + "Maximum:" => "Maximum:", + "Ignore blank" => "Ignore blank", + "In-cell dropdown" => "In-cell dropdown", + "Input message:" => "Input message:", + "Error style" => "Error style", + "Stop" => "Stop", + "Warning" => "Warning", + "Information" => "Information", + "Error message:" => "Error message:", + "Format cells that are (value):" => "Format cells that are (value):", + "and:" => "and:", + "Format cells that contain the text:" => "Format cells that contain the text:", + "Format cells that contain a date occurring:" => "Format cells that contain a date occurring:", + "Today" => "Today", + "Tomorrow" => "Tomorrow", + "In the last 7 days" => "In the last 7 days", + "Last week" => "Last week", + "This week" => "This week", + "Next week" => "Next week", + "Last month" => "Last month", + "This month" => "This month", + "Next month" => "Next month", + "Format values where this formula is true:" => "Format values where this formula is true:", + "with" => "with", + "Light Red Fill with Dark Red Text" => "Light Red Fill with Dark Red Text", + "Yellow Fill with Dark Yellow Text" => "Yellow Fill with Dark Yellow Text", + "Green Fill with Dark Green Text" => "Green Fill with Dark Green Text", + "Light Red Fill" => "Light Red Fill", + "Red Text" => "Red Text", + "Red Border" => "Red Border", + "Formula:" => "Formula:", + "Select" => "Select", + "Blanks" => "Blanks", + "Errors" => "Errors", + "Numbers" => "Numbers", + "Current region" => "Current region", + "Last cell" => "Last cell", + "Visible cells only" => "Visible cells only", + "Conditional formats" => "Conditional formats", + "Data validation" => "Data validation", + "Horizontal axis title:" => "Horizontal axis title:", + "Vertical axis title:" => "Vertical axis title:", + "No picture selected" => "No picture selected", + "Picture file path (PNG or JPEG):" => "Picture file path (PNG or JPEG):", + "Description (optional):" => "Description (optional):", + "Fits inside the selected cell and moves with its content." => "Fits inside the selected cell and moves with its content.", + "Choose a PNG or JPEG no larger than 16 MB." => "Choose a PNG or JPEG no larger than 16 MB.", + "About" => "About", + "Contributors" => "Contributors", + "Models" => "Models", + "Version {version}" => "Version {version}", + "Join the ArtCraft Discord" => "Join the ArtCraft Discord", + "This workbook has no scripts or macros." => "This workbook has no scripts or macros.", + "(unnamed)" => "(unnamed)", + "— VBA project (preserved, not run)" => "— VBA project (preserved, not run)", + "— 1 step" => "— 1 step", + "— {steps} steps" => "— {steps} steps", + "Alignment" => "Alignment", + "Font" => "Font", + "Border" => "Border", + "Format Cells|Fill" => "Fill", + "Protection" => "Protection", + "Category:" => "Category:", + "Sample" => "Sample", + "Type (custom format code):" => "Type (custom format code):", + "Vertical" => "Vertical", + "Justify" => "Justify", + "Center Across Selection" => "Center Across Selection", + "Distributed" => "Distributed", + "Top" => "Top", + "Bottom" => "Bottom", + "Indent" => "Indent", + "Orientation (degrees)" => "Orientation (degrees)", + "Wrap text" => "Wrap text", + "Shrink to fit" => "Shrink to fit", + "Bold" => "Bold", + "Italic" => "Italic", + "None" => "None", + "Single" => "Single", + "Double" => "Double", + "Single Accounting" => "Single Accounting", + "Double Accounting" => "Double Accounting", + "Superscript" => "Superscript", + "Subscript" => "Subscript", + "Color:" => "Color:", + "Outline" => "Outline", + "Diagonal ↘" => "Diagonal ↘", + "Diagonal ↗" => "Diagonal ↗", + "none" => "none", + "thin" => "thin", + "medium" => "medium", + "thick" => "thick", + "dashed" => "dashed", + "dotted" => "dotted", + "double" => "double", + "Background Color:" => "Background Color:", + "Locked" => "Locked", + "Hidden" => "Hidden", + "Search:" => "Search:", + "e.g. lookup, average, date" => "e.g. lookup, average, date", + "Date & Time" => "Date & Time", + "Lookup & Reference" => "Lookup & Reference", + "Math & Trig" => "Math & Trig", + "Statistical" => "Statistical", + "Engineering" => "Engineering", + "Database" => "Database", + "Compatibility" => "Compatibility", + "Web" => "Web", + "Cube" => "Cube", + "Add-in and Automation" => "Add-in and Automation", + "Find" => "Find", + "Replace" => "Replace", + "Find what:" => "Find what:", + "Replace with:" => "Replace with:", + "Match case" => "Match case", + "Match entire cell contents" => "Match entire cell contents", + "Within workbook" => "Within workbook", + "Replace All" => "Replace All", + "Find All" => "Find All", + "Find Next" => "Find Next", + "All done. We made {count} replacements." => "All done. We made {count} replacements.", + "{count} cell(s) found" => "{count} cell(s) found", + "Reference:" => "Reference:", + "Special…" => "Special…", + "My list has headers" => "My list has headers", + "Sort by" => "Sort by", + "Then by" => "Then by", + "Cell Values" => "Cell Values", + "Cell Color" => "Cell Color", + "A to Z" => "A to Z", + "Z to A" => "Z to A", + "+ Add Level" => "+ Add Level", + "New…" => "New…", + "Edit…" => "Edit…", + "Name" => "Name", + "Value" => "Value", + "Refers To" => "Refers To", + "Scope" => "Scope", + "Workbook" => "Workbook", + "No names defined" => "No names defined", + "Recommended Charts" => "Recommended Charts", + "All Charts" => "All Charts", + "Clustered Column" => "Clustered Column", + "Stacked Column" => "Stacked Column", + "100% Stacked Column" => "100% Stacked Column", + "Clustered Bar" => "Clustered Bar", + "Stacked Bar" => "Stacked Bar", + "100% Stacked Bar" => "100% Stacked Bar", + "Line" => "Line", + "Line with Markers" => "Line with Markers", + "Stacked Line" => "Stacked Line", + "Pie" => "Pie", + "Doughnut" => "Doughnut", + "Area" => "Area", + "Stacked Area" => "Stacked Area", + "Scatter" => "Scatter", + "Scatter with Lines" => "Scatter with Lines", + "Radar" => "Radar", + "Histogram" => "Histogram", + "Waterfall" => "Waterfall", + "Funnel" => "Funnel", + "Combo" => "Combo", + "Chart data range:" => "Chart data range:", + "Legend Entries (Series)" => "Legend Entries (Series)", + "Series{n}" => "Series{n}", + "Keep" => "Keep", + "Remove" => "Remove", + "Horizontal (Category) Axis Labels:" => "Horizontal (Category) Axis Labels:", + "There are no conditional formatting rules on this sheet." => "There are no conditional formatting rules on this sheet.", + "applies to" => "applies to", + "Type a command, e.g. freeze, chart, bold…" => "Type a command, e.g. freeze, chart, bold…", + "Set cell:" => "Set cell:", + "To value:" => "To value:", + "By changing cell:" => "By changing cell:", + "Goal Seeking found a solution: {value}" => "Goal Seeking found a solution: {value}", + "Analysis Tools" => "Analysis Tools", + "Anova: Single Factor" => "Anova: Single Factor", + "Correlation" => "Correlation", + "Covariance" => "Covariance", + "Descriptive Statistics" => "Descriptive Statistics", + "Exponential Smoothing" => "Exponential Smoothing", + "F-Test Two-Sample for Variances" => "F-Test Two-Sample for Variances", + "Moving Average" => "Moving Average", + "Rank and Percentile" => "Rank and Percentile", + "Regression" => "Regression", + "t-Test: Paired Two Sample for Means" => "t-Test: Paired Two Sample for Means", + "t-Test: Two-Sample Assuming Equal Variances" => "t-Test: Two-Sample Assuming Equal Variances", + "t-Test: Two-Sample Assuming Unequal Variances" => "t-Test: Two-Sample Assuming Unequal Variances", + "Output options" => "Output options", + "Output Range:" => "Output Range:", + "New Worksheet Ply:" => "New Worksheet Ply:", + "Grouped By:" => "Grouped By:", + "Labels in first row" => "Labels in first row", + "Input Range:" => "Input Range:", + "Variable 1 Range:" => "Variable 1 Range:", + "Variable 2 Range:" => "Variable 2 Range:", + "Summary statistics" => "Summary statistics", + "Confidence Level for Mean (%), blank for none:" => "Confidence Level for Mean (%), blank for none:", + "Kth Largest (blank for none):" => "Kth Largest (blank for none):", + "Kth Smallest (blank for none):" => "Kth Smallest (blank for none):", + "Bin Range (blank for automatic bins):" => "Bin Range (blank for automatic bins):", + "Pareto (sorted histogram)" => "Pareto (sorted histogram)", + "Cumulative Percentage" => "Cumulative Percentage", + "Alpha:" => "Alpha:", + "Input Y Range:" => "Input Y Range:", + "Input X Range:" => "Input X Range:", + "Constant is Zero" => "Constant is Zero", + "Confidence Level (%):" => "Confidence Level (%):", + "Residuals" => "Residuals", + "Standardized Residuals" => "Standardized Residuals", + "Normal Probability" => "Normal Probability", + "Interval:" => "Interval:", + "Standard Errors" => "Standard Errors", + "Damping factor:" => "Damping factor:", + "Hypothesized Mean Difference:" => "Hypothesized Mean Difference:", + "Set Objective:" => "Set Objective:", + "To:" => "To:", + "Value Of:" => "Value Of:", + "By Changing Variable Cells:" => "By Changing Variable Cells:", + "Subject to the Constraints:" => "Subject to the Constraints:", + "Make Unconstrained Variables Non-Negative" => "Make Unconstrained Variables Non-Negative", + "Select a Solving Method:" => "Select a Solving Method:", + "GRG Nonlinear" => "GRG Nonlinear", + "Solve" => "Solve", + "Keep Solver Solution" => "Keep Solver Solution", + "Restore Original Values" => "Restore Original Values", + "The spelling check is complete for the entire sheet." => "The spelling check is complete for the entire sheet.", + "Not in Dictionary ({cell}):" => "Not in Dictionary ({cell}):", + "Suggestions:" => "Suggestions:", + "(No suggestions)" => "(No suggestions)", + "Ignore Once" => "Ignore Once", + "Add to Dictionary" => "Add to Dictionary", + "Change" => "Change", + "Change All" => "Change All", + "$ English (United States)" => "$ English (United States)", + "Add Chart Element" => "Add Chart Element", + "Align Left" => "Align Left", + "Align Right" => "Align Right", + "Bottom Align" => "Bottom Align", + "Calculate Now (F9)" => "Calculate Now (F9)", + "Calculate Sheet (⇧F9)" => "Calculate Sheet (⇧F9)", + "Calculation Options" => "Calculation Options", + "Cell Styles" => "Cell Styles", + "Change Chart Type" => "Change Chart Type", + "Check Accessibility" => "Check Accessibility", + "Clear Filter" => "Clear Filter", + "Column or Bar" => "Column or Bar", + "Comments pane" => "Comments pane", + "Convert the last ink stroke to a shape" => "Convert the last ink stroke to a shape", + "Convert to Range" => "Convert to Range", + "Copy" => "Copy", + "Custom Sort" => "Custom Sort", + "Cut" => "Cut", + "Define Name…" => "Define Name…", + "Delete Comment" => "Delete Comment", + "Delete Sheet" => "Delete Sheet", + "Delete chart" => "Delete chart", + "Delete…" => "Delete…", + "Dismiss" => "Dismiss", + "Down" => "Down", + "Edit chart title" => "Edit chart title", + "Erase ink strokes" => "Erase ink strokes", + "Every command run in this session (replayable)" => "Every command run in this session (replayable)", + "Expand formula bar" => "Expand formula bar", + "Filter (⌘⇧F)" => "Filter (⌘⇧F)", + "Filter by Selected Cell's Value" => "Filter by Selected Cell's Value", + "Find & Select" => "Find & Select", + "Flash Fill (⌘E)" => "Flash Fill (⌘E)", + "Forecast Sheet" => "Forecast Sheet", + "Forecast end (date or number; blank: a third of the history):" => "Forecast end (date or number; blank: a third of the history):", + "Format Chart pane" => "Format Chart pane", + "Format as Table" => "Format as Table", + "Hide" => "Hide", + "Hide Sheet" => "Hide Sheet", + "Hierarchy & more" => "Hierarchy & more", + "Highlighter" => "Highlighter", + "How agents drive GridCraft (MCP / control channel)" => "How agents drive GridCraft (MCP / control channel)", + "Import a text or CSV file" => "Import a text or CSV file", + "Insert Function" => "Insert Function", + "Insert Function (⇧F3)" => "Insert Function (⇧F3)", + "Insert Link (⌘K)" => "Insert Link (⌘K)", + "Insert Sheet" => "Insert Sheet", + "Insert Slicer" => "Insert Slicer", + "Insert a picture" => "Insert a picture", + "Insert a slicer to filter a table" => "Insert a slicer to filter a table", + "Insert an icon" => "Insert an icon", + "Insert…" => "Insert…", + "Line or Area" => "Line or Area", + "Link…" => "Link…", + "Macros and scripts in this workbook (Alt+F8)" => "Macros and scripts in this workbook (Alt+F8)", + "Middle Align" => "Middle Align", + "More commands" => "More commands", + "Move or Copy Sheet…" => "Move or Copy Sheet…", + "New sheet (⇧F11)" => "New sheet (⇧F11)", + "Next sheet" => "Next sheet", + "Page Breaks" => "Page Breaks", + "Paper Size" => "Paper Size", + "Paste (⌘V)" => "Paste (⌘V)", + "Pick From Drop-down List…" => "Pick From Drop-down List…", + "Pie or Doughnut" => "Pie or Doughnut", + "Previous sheet" => "Previous sheet", + "Print Area" => "Print Area", + "Print Titles" => "Print Titles", + "Protect Workbook structure" => "Protect Workbook structure", + "Redo (⌘Y)" => "Redo (⌘Y)", + "Save (⌘S)" => "Save (⌘S)", + "Scatter or Bubble" => "Scatter or Bubble", + "Search and run any command" => "Search and run any command", + "Search commands (⌘⇧Space)" => "Search commands (⌘⇧Space)", + "Select and move ink and shapes" => "Select and move ink and shapes", + "Series…" => "Series…", + "Share: export or save a copy" => "Share: export or save a copy", + "Show Formulas (⌃`)" => "Show Formulas (⌃`)", + "Slicer" => "Slicer", + "Sort & Filter" => "Sort & Filter", + "Spelling (F7)" => "Spelling (F7)", + "Statistic" => "Statistic", + "Switch Row/Column" => "Switch Row/Column", + "Table (⌘T)" => "Table (⌘T)", + "Table Styles" => "Table Styles", + "Text to Columns" => "Text to Columns", + "The output range already holds data. Replace it with the report?" => "The output range already holds data. Replace it with the report?", + "Top Align" => "Top Align", + "Undo (⌘Z)" => "Undo (⌘Z)", + "Undo list" => "Undo list", + "Unhide Sheet…" => "Unhide Sheet…", + "Up" => "Up", + "Version, contributors and the AI models that helped" => "Version, contributors and the AI models that helped", + "What-If Analysis" => "What-If Analysis", + "Zoom In" => "Zoom In", + "Zoom Out" => "Zoom Out", + "Zoom to 100%" => "Zoom to 100%", + "Zoom to Selection" => "Zoom to Selection", + "Zoom…" => "Zoom…", + "£ English (United Kingdom)" => "£ English (United Kingdom)", + "¥ Japanese" => "¥ Japanese", + "€ Euro" => "€ Euro", + "Tab|Insert" => "Insert", + "AutoSave" => "AutoSave", + "Insert\nSlicer" => "Insert\nSlicer", + "Pen\nBlack" => "Pen\nBlack", + "Pen\nBlue" => "Pen\nBlue", + "Pen\nRed" => "Pen\nRed", + "Protect\nSheet" => "Protect\nSheet", + "Watch\nWindow" => "Watch\nWindow", + "Workbook\nStatistics" => "Workbook\nStatistics", + "Options|Editing" => "Editing", + "PivotTable Fields" => "PivotTable Fields", + "Choose fields to add to report:" => "Choose fields to add to report:", + "Use a field's menu to move it between areas:" => "Use a field's menu to move it between areas:", + "Filters" => "Filters", + "Values" => "Values", + "Move to Row Labels" => "Move to Row Labels", + "Move to Column Labels" => "Move to Column Labels", + "Move to Report Filter" => "Move to Report Filter", + "Move to Values" => "Move to Values", + "Summarize by Sum" => "Summarize by Sum", + "Summarize by Count" => "Summarize by Count", + "Summarize by Average" => "Summarize by Average", + "Summarize by Max" => "Summarize by Max", + "Summarize by Min" => "Summarize by Min", + "Show as No Calculation" => "Show as No Calculation", + "Show as % of Grand Total" => "Show as % of Grand Total", + "Show as Running Total" => "Show as Running Total", + "Show as Rank" => "Show as Rank", + "Group by Years" => "Group by Years", + "Group by Quarters" => "Group by Quarters", + "Group by Months" => "Group by Months", + "Remove Field" => "Remove Field", + "Refresh" => "Refresh", + "Calculated Field…" => "Calculated Field…", + "Report Layout" => "Report Layout", + "Compact" => "Compact", + "Tabular" => "Tabular", _ => return None, }) } From 905ef6a6a5c80ced100c661ef04d4657d30470e2 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:38:15 +0000 Subject: [PATCH 29/33] Integration: #2000 remove duplicated Spanish financial alias block --- crates/formula/src/input.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/formula/src/input.rs b/crates/formula/src/input.rs index 12cc9cfbc..6750513a7 100644 --- a/crates/formula/src/input.rs +++ b/crates/formula/src/input.rs @@ -26,12 +26,6 @@ const SPANISH: &[(&str, &str)] = &[ ("PMT", "PAGO"), ("PV", "VA"), ("FV", "VF"), - // Financial block (#1986): the loan-schedule and investment staples. - ("NPV", "VNA"), - ("IRR", "TIR"), - ("PMT", "PAGO"), - ("PV", "VA"), - ("FV", "VF"), ("TRUE", "VERDADERO"), ("FALSE", "FALSO"), ]; From 10ac46c243804e2b478d2673bf2d89c75b116030 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:39:04 +0000 Subject: [PATCH 30/33] Integration: #2102 fill Romanian catalog gap (Options|Editing, English text) --- crates/ui-egui/src/i18n/ro.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ui-egui/src/i18n/ro.rs b/crates/ui-egui/src/i18n/ro.rs index 4cc3ae95b..0f7ed19bc 100644 --- a/crates/ui-egui/src/i18n/ro.rs +++ b/crates/ui-egui/src/i18n/ro.rs @@ -1016,6 +1016,7 @@ pub(super) fn translate(text: &str) -> Option<&'static str> { "Print job submitted: {receipt}" => "Lucrarea de imprimare a fost trimisă: {receipt}", "Print failed: {error}" => "Imprimarea a eșuat: {error}", "Print failed: the printing worker stopped." => "Imprimarea a eșuat: procesul de imprimare s-a oprit.", + "Options|Editing" => "Editing", _ => return None, }) } From 47bf083d0a1e8092c8bcad7ad1f405f7ecc6b0c2 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:39:21 +0000 Subject: [PATCH 31/33] Integration: #2116 move name_sort_key and its test into the existing tests module --- crates/ui-egui/src/i18n.rs | 47 +++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 935c0cc80..551f6f237 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -227,6 +227,27 @@ pub fn set_current(ctx: &egui::Context, language: Language) { ctx.data_mut(|d| d.insert_temp(lang_key(), language)); } +/// `name` lowercased with the Latin accents that occur in language names folded away, so a +/// byte-wise sort reads alphabetically. Other scripts are left as they are. +fn name_sort_key(name: &str) -> String { + name.chars() + .flat_map(char::to_lowercase) + .map(|c| match c { + 'à'..='å' | 'ā' | 'ă' | 'ą' => 'a', + 'ç' | 'ć' | 'č' => 'c', + 'è'..='ë' | 'ē' | 'ě' | 'ę' | 'ế' | 'ệ' => 'e', + 'ì'..='ï' | 'ī' => 'i', + 'ñ' | 'ń' | 'ň' => 'n', + 'ò'..='ö' | 'ø' | 'ő' => 'o', + 'ś' | 'š' => 's', + 'ù'..='ü' | 'ū' | 'ů' | 'ű' => 'u', + 'ý' | 'ÿ' => 'y', + 'ź' | 'ż' | 'ž' => 'z', + c => c, + }) + .collect() +} + #[cfg(test)] mod tests { use super::*; @@ -494,32 +515,6 @@ mod tests { assert_eq!(Language::parse(l.code()), Some(l)); } } -} - -/// `name` lowercased with the Latin accents that occur in language names folded away, so a -/// byte-wise sort reads alphabetically. Other scripts are left as they are. -fn name_sort_key(name: &str) -> String { - name.chars() - .flat_map(char::to_lowercase) - .map(|c| match c { - 'à'..='å' | 'ā' | 'ă' | 'ą' => 'a', - 'ç' | 'ć' | 'č' => 'c', - 'è'..='ë' | 'ē' | 'ě' | 'ę' | 'ế' | 'ệ' => 'e', - 'ì'..='ï' | 'ī' => 'i', - 'ñ' | 'ń' | 'ň' => 'n', - 'ò'..='ö' | 'ø' | 'ő' => 'o', - 'ś' | 'š' => 's', - 'ù'..='ü' | 'ū' | 'ů' | 'ű' => 'u', - 'ý' | 'ÿ' => 'y', - 'ź' | 'ż' | 'ž' => 'z', - c => c, - }) - .collect() -} - -#[cfg(test)] -mod picker_order_tests { - use super::*; #[test] fn picker_lists_english_first_then_names_alphabetically() { From 36c9df453f2637401add0ce05b73add5a12e8e27 Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:39:29 +0000 Subject: [PATCH 32/33] Integration: order localization-parity revision rows newest first --- docs/localization-parity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/localization-parity.md b/docs/localization-parity.md index cfa8ee119..423e706a3 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -87,7 +87,6 @@ language (none so far) and of localized function names. |---|---|---| | 2026-10-21 | minor | Romanian interface (`ro`, Română): 970 labels covering every key of the other catalogs (`crates/ui-egui/src/i18n/ro.rs`), `ro-*` system locales, the View-tab switcher and `app.language.set`; context keys show no prefix (File › Options test). English formulas and formats; AI-assisted draft pending native-speaker review | | 2026-10-20 | minor | Japanese catalog (`i18n/ja.rs`) covers every key the Brazilian Portuguese catalog translates: the 398-label shared core moved verbatim plus 545 dialog, message, Backstage and menu strings — 943 keys, ~12% → ~43%. A test parses `pt.rs`'s source, so the two catalogs can't drift apart again. Portuguese re-measured at 943 (was 923) | -| 2026-10-15 | minor | Italian catalog (`i18n/it.rs`, 971 entries, ~44%): every key the Brazilian Portuguese catalog translates plus the PivotTable Fields pane strings; `it` locale tags (it-IT, it-CH…) resolve to Italian. Labels follow Excel's Italian terminology; native-speaker review still pending | | 2026-10-20 | minor | Dutch (nl) interface catalog (`i18n/nl.rs`, 518 labels, ~24%): the shared key set every language must cover (ribbon, context menus, File view, dialog titles, Options page), matching the German, French and Czech catalogs; `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 | @@ -96,6 +95,7 @@ language (none so far) and of localized function names. | 2026-10-19 | minor | Save as Web Page and copied HTML mark right-to-left sheets `dir="rtl"`, let General-aligned Arabic and Hebrew text align by its own direction (`dir="auto"`), and keep numbers on right-to-left sheets left to right and on the left | | 2026-10-19 | minor | French and Serbian kept the context in three `context\|label` translations ("Options\|Général", "Opcije\|Opšte" for `Options\|General`; also `Options\|Save`, `Sheet Options\|View`). `tr` shows a found translation as it is, so File › Options headings and the Sheet Options "View" checkboxes showed the prefix. Fixed; a test checks that no catalog shows a `\|` | | 2026-10-17 | minor | Vietnamese catalog (`i18n/vi.rs`, every key in the master table); `vi` locale tags resolve to Vietnamese | +| 2026-10-15 | minor | Italian catalog (`i18n/it.rs`, 971 entries, ~44%): every key the Brazilian Portuguese catalog translates plus the PivotTable Fields pane strings; `it` locale tags (it-IT, it-CH…) resolve to Italian. Labels follow Excel's Italian terminology; native-speaker review still pending | | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | | 2026-10-11 | minor | German ribbon catalog (`i18n/de.rs`, 266 labels, ~12%); `de` locale tags (de-DE, de-AT, de-CH…) resolve to German. PR #163 (localized German formulas/numbers) still open | From 21c3ec248ccfc6a1ca3cb2e2e78d65de5c387eca Mon Sep 17 00:00:00 2001 From: aiongg Date: Thu, 22 Oct 2026 02:51:29 +0000 Subject: [PATCH 33/33] Integration: cargo fmt --- crates/ui-egui/src/i18n.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 551f6f237..751cbdeae 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -17,15 +17,15 @@ mod fr; mod it; mod ja; mod ko; -mod pl; mod nl; +mod pl; mod pt; mod ro; mod ru; mod sr; +mod uk; mod vi; mod zh; -mod uk; #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -54,7 +54,24 @@ pub enum Language { impl Language { pub const ALL: [Self; 18] = [ - Self::En, Self::Es, Self::El, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr, Self::Pl, Self::It, Self::Uk, Self::Vi, Self::Nl, Self::Ro, + Self::En, + Self::Es, + Self::El, + Self::Zh, + Self::Ja, + Self::Ko, + Self::Ru, + Self::PtBr, + Self::De, + Self::Cs, + Self::Fr, + Self::Sr, + Self::Pl, + Self::It, + Self::Uk, + Self::Vi, + Self::Nl, + Self::Ro, ]; /// Every language in the order the switcher lists them: English first (the source language),