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,119 @@
# Framework admin strings (D-20), resolved as backend::lang.<group>.<key>.
# English equivalents of the Polish copy; plural texts are CLDR maps (one,
# other), never pipe strings. Placeholders use :count, :name, :term (D-24).
auth:
title: Welcome back
login: Login or email
password: Password
invalid: Invalid login details
submit: Sign in
logout: Sign out
session_expired: Your session has expired. Please sign in again.
nav:
plugins: Plugins
sections: Sections
breadcrumbs: Breadcrumbs
empty: No sections are available.
settings: Settings
collapse: Collapse menu
expand: Expand menu
user_menu: User menu
page:
not_found: Page not found.
list:
search_prompt: Search…
no_records: There are no records in this view.
no_results: 0 results
loading: Loading…
load_failed: The list could not be loaded.
delete_selected: Delete selected
prev_page: Previous
next_page: Next
records_per_page: Per page
column_switch_true: "Yes"
column_switch_false: "No"
column_created: Created
column_updated: Updated
pagination_range: ":from–:to of :total"
results:
one: ":count result"
other: ":count results"
empty_value: "—"
clear_search: Clear search
select_all: Select all on this page
select_row: Select row
sort_ascending: Sort ascending
sort_descending: Sort descending
form:
save: Save
save_and_close: Save and close
cancel: Cancel
delete: Delete
none: — none —
update: Edit
create: Create
return_to_list: Back to list
close: Close
confirm: Confirm
saving: Saving…
deleting: Deleting…
add: Add
remove_item: "Remove: :name"
add_item: Add…
select_placeholder: Select…
loading_options: Loading…
no_options: No results
unsupported_field: "Unsupported field type: :type"
error_title: Could not save.
error_fields:
one: "Fix :count field marked below."
other: "Fix :count fields marked below."
error_generic: The changes could not be saved. Please try again.
unsaved_confirm: You have unsaved changes. Discard them?
tab_errors:
one: ":count error"
other: ":count errors"
relation:
add: Add
link: Link
unlink: Unlink
remove: Remove
search: Search…
add_count: "Add (:count)"
candidates_range: ":from–:to of :total"
settings:
title: Settings
empty: No settings are available.
saved: Settings saved
messages:
list:
record_count:
one: ":count record"
other: ":count records"
create: New record
empty_search: Nothing found
empty_search_hint: No record matches “:term”. Try another search.
selected: ":count selected"
delete_confirm: "Delete the selected (:count)?"
deleted:
one: "Deleted :count record"
other: "Deleted :count records"
form:
create: New record
update: Edit record
saved: Saved
delete_confirm: Delete this record?
deleted: Record deleted
relation:
link: Add
link_hint: Choose the records to link.
candidate_search: Search…
linked:
one: "Linked :count record"
other: "Linked :count records"
unlink_selected: Unlink selected
unlink_confirm: "Unlink the selected (:count)?"
unlinked:
one: "Unlinked :count record"
other: "Unlinked :count records"
empty: No linked records.