- 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
25 lines
798 B
Go
25 lines
798 B
Go
package cabana
|
|
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
// adminLangPrefix is the only namespace the public bundle serves (D-20).
|
|
const adminLangPrefix = "backend::lang."
|
|
|
|
// langBundle serves GET {prefix}/api/v1/lang: every backend::lang key as CLDR
|
|
// forms for the request locale, with the fallback locale's keys underneath.
|
|
// It is public (the login screen needs it) and never includes another
|
|
// namespace.
|
|
func (s *service) langBundle(w http.ResponseWriter, r *http.Request) {
|
|
tr := s.translator()
|
|
locale := schemaLocale(r.Context(), tr)
|
|
data := map[string]map[string]string{}
|
|
if tr != nil {
|
|
locale = tr.Resolved(locale, adminLangPrefix)
|
|
data = tr.Bundle(locale, adminLangPrefix)
|
|
}
|
|
w.Header().Set("Cache-Control", "no-cache")
|
|
WriteData(w, http.StatusOK, data, map[string]any{"locale": locale})
|
|
}
|