Apariencia
Traducciones y locales
La traducción gettext está en el paquete separado boctulus/simplerest-i18n. Los catálogos viven bajo LOCALE_PATH, que por defecto apunta a app/Locale/. El Composer del core no declara ese paquete; el autoload de este checkout no demuestra una instalación consumidora.
Idioma y dominio
El paquete declara los helpers globales setLang(?string $lang) y trans(string $text, $domain = null). Translate ofrece operaciones adicionales:
php
use Boctulus\Simplerest\Core\Libs\i18n\Translate;
setLang('es_AR');
Translate::bind('messages');
echo trans('Welcome');setLang() normaliza guiones, mayúsculas y sufijos de encoding; elige un locale existente y no cambia el idioma si no encuentra uno compatible. bind($domain, $path) selecciona dominio y catálogo. Si falta una traducción, trans() devuelve el msgid. Locale, dominio y catálogos son estado estático: en procesos persistentes define cómo reiniciarlos o aislarlos.
Catálogos y fallback
El loader busca LC_MESSAGES/<dominio>.po y los procesa con POParser. El fallback predeterminado es en_US. Si hay catálogo regional y catálogo base, combina fallback, idioma base y variante regional; la variante puede reemplazar valores previos. Si falta el catálogo base, trata el regional como completo y no añade automáticamente el idioma base.
Translate::useGettext(true) opta por la extensión gettext cuando está disponible; no se activa automáticamente. La extensión y la estructura de catálogos determinan si bind() usa bindtextdomain() o el parser .po.
API adicional y límites
setFallbackLocale(),getLocale(),getLocaleChain()ygetDomain()gestionan o consultan el estado.exportLangDef()genera.poy puede invocarmsgfmtpara escribir.mo; no se ejecutó porque escribe archivos.convertPot()procesa archivos*.pot.phppara catálogos PHP.LangDetectorofrece una heurística por palabras para inglés, español, italiano, hindi y bengalí; no se conecta automáticamente consetLang()ni con la negociación HTTP.
transChoice() consulta pluralForms, pero el loader no la llena desde los catálogos. No asumas que las entradas plurales quedan listas para ese método tras bind(). Validator enlaza el dominio validator y usa trans(); consulta la referencia de validación para el límite de dependencia Composer.
Hay tests de traducción inspeccionados, pero no ejecutados. No se cambió el locale ni se generó o compiló un catálogo durante la revisión.