feat(10-02): backend strings, controller messages and declarative toolbar

- phrasebook ships the backend::lang admin strings (pl, en) with CLDR
  plural maps, loads them as namespace backend, applies
  pact.HasLangOverrides trees (lang/<locale>/<namespace>/<group>.yaml)
  after every namespace, and fails activation when a backend key cannot
  convert to plural forms
- Translator.Forms, Bundle, Resolved and Has serve keys as CLDR form maps
- Public GET /lang returns every backend::lang key for the request
  locale over the fallback locale, Cache-Control no-cache
- config_list, config_form and config_relation accept a strict messages
  block; omitted keys take framework defaults, schemas serve every message
  as CLDR forms, and activation fails on a missing phrase key
- toolbar.buttons is an ordered [create, delete] list; the Winter string
  form, duplicates, unknown actions and delete without showCheckboxes fail
  at boot, and create is dropped when the controller has no form
- Form schema serves the raw Winter redirects; scaffold emits the list
  syntax; form and relation schema routes are typed in the admin OpenAPI
This commit is contained in:
Jakub Zych
2026-09-27 16:16:32 +02:00
parent fe04dbc89e
commit c87148a34f
24 changed files with 2148 additions and 45 deletions

View File

@@ -0,0 +1,135 @@
# Framework admin strings (D-20), resolved as backend::lang.<group>.<key>.
# Winter backend key names are kept where Winter has them; values follow the
# admin design copy (D-06). Plural texts are CLDR maps (one, few, many,
# other), never pipe strings, so every key converts to the SPA's plural forms.
# Placeholders use :count, :name, :term and friends (D-24).
auth:
title: Witaj ponownie
login: Login lub e-mail
password: Hasło
invalid: Nieprawidłowe dane logowania
submit: Zaloguj
logout: Wyloguj
session_expired: Sesja wygasła. Zaloguj się ponownie.
nav:
plugins: Wtyczki
sections: Sekcje
breadcrumbs: Ścieżka nawigacji
empty: Brak dostępnych sekcji.
settings: Ustawienia
collapse: Zwiń menu
expand: Rozwiń menu
user_menu: Menu użytkownika
page:
not_found: Nie znaleziono strony.
list:
search_prompt: Szukaj…
no_records: Brak rekordów w tym widoku.
no_results: 0 wyników
loading: Wczytywanie…
load_failed: Nie udało się wczytać listy.
delete_selected: Usuń zaznaczone
prev_page: Poprzednia
next_page: Następna
records_per_page: Na stronę
column_switch_true: Tak
column_switch_false: Nie
column_created: Utworzono
column_updated: Zaktualizowano
pagination_range: ":from–:to z :total"
results:
one: ":count wynik"
few: ":count wyniki"
many: ":count wyników"
other: ":count wyniku"
empty_value: "—"
clear_search: Wyczyść wyszukiwanie
select_all: Zaznacz wszystkie na stronie
select_row: Zaznacz wiersz
sort_ascending: Sortuj rosnąco
sort_descending: Sortuj malejąco
form:
save: Zapisz
save_and_close: Zapisz i zamknij
cancel: Anuluj
delete: Usuń
none: — brak —
update: Edytuj
create: Utwórz
return_to_list: Wróć do listy
close: Zamknij
confirm: Potwierdź
saving: Zapisywanie…
deleting: Usuwanie…
add: Dodaj
remove_item: "Usuń: :name"
add_item: Dodaj…
select_placeholder: Wybierz…
loading_options: Wczytywanie…
no_options: Brak wyników
unsupported_field: "Nieobsługiwany typ pola: :type"
error_title: Nie udało się zapisać.
error_fields:
one: "Popraw :count pole oznaczone poniżej."
few: "Popraw :count pola oznaczone poniżej."
many: "Popraw :count pól oznaczonych poniżej."
other: "Popraw :count pola oznaczonego poniżej."
error_generic: Nie udało się zapisać zmian. Spróbuj ponownie.
unsaved_confirm: Masz niezapisane zmiany. Porzucić je?
tab_errors:
one: ":count błąd"
few: ":count błędy"
many: ":count błędów"
other: ":count błędu"
relation:
add: Dodaj
link: Dołącz
unlink: Odłącz
remove: Usuń
search: Szukaj…
add_count: "Dodaj (:count)"
candidates_range: ":from–:to z :total"
settings:
title: Ustawienia
empty: Brak dostępnych ustawień.
saved: Zapisano ustawienia
messages:
list:
record_count:
one: ":count rekord"
few: ":count rekordy"
many: ":count rekordów"
other: ":count rekordu"
create: Nowy rekord
empty_search: Nic nie znaleziono
empty_search_hint: Żaden rekord nie pasuje do frazy „:term”. Spróbuj innej frazy.
selected: "Zaznaczono :count"
delete_confirm: "Usunąć zaznaczone (:count)?"
deleted:
one: "Usunięto :count rekord"
few: "Usunięto :count rekordy"
many: "Usunięto :count rekordów"
other: "Usunięto :count rekordu"
form:
create: Nowy rekord
update: Edycja rekordu
saved: Zapisano
delete_confirm: Usunąć ten rekord?
deleted: Usunięto rekord
relation:
link: Dodaj
link_hint: Wybierz rekordy, które chcesz dołączyć.
candidate_search: Szukaj…
linked:
one: "Dołączono :count rekord"
few: "Dołączono :count rekordy"
many: "Dołączono :count rekordów"
other: "Dołączono :count rekordu"
unlink_selected: Odłącz zaznaczone
unlink_confirm: "Odłączyć zaznaczone (:count)?"
unlinked:
one: "Odłączono :count rekord"
few: "Odłączono :count rekordy"
many: "Odłączono :count rekordów"
other: "Odłączono :count rekordu"
empty: Brak powiązanych rekordów.