-
Notifications
You must be signed in to change notification settings - Fork 0
PT BR Resolucao de mensagens
O domínio guarda códigos estáveis e argumentos de interpolação, não texto humano. IErrorMessageResolver transforma esses valores em mensagem na borda de transporte. A implementação JSON carrega catálogos no startup; o adaptador Azure App Configuration lê uma hierarquia IConfiguration a cada consulta.
flowchart TD
Request[Cultura pedida, por exemplo pt-BR] --> Exact{Código existe em pt-BR?}
Exact -->|sim| Template[Usar template]
Exact -->|não| Parent{Código existe na cultura pai pt?}
Parent -->|sim| Template
Parent -->|não| Default{Código existe no catálogo invariante ou default?}
Default -->|sim| Template
Default -->|não| Code[Devolver Error.Code]
Template --> Interpolate[Substituir tokens de argumentos conhecidos]
Interpolate --> Message[Mensagem resolvida]
Somente um nível de cultura pai é examinado antes do catálogo invariante/default. Placeholders {token} conhecidos são substituídos a partir de Error.Arguments; placeholders desconhecidos permanecem visíveis, o que ajuda a diagnosticar divergência de catálogo. Se nenhum catálogo definir o código, o próprio Error.Code estável é devolvido.
AddOffside usa um catálogo invariante e catálogos de cultura opcionais. O invariante/default é obrigatório. Os arquivos são lidos para memória, portanto alterá-los após o startup não atualiza um resolver já criado. O registro de paths e catálogos está em Mensagens e culturas.
AddOffsideAzureAppConfiguration(services, configuration, ...) recebe um IConfiguration já populado pelo host. Ele não conecta ao Azure, seleciona labels, instala o provider nem configura refresh. O resolver apenas consulta a configuração recebida sob Errors (ou a seção configurada), usando default como catálogo invariante. Como a consulta ocorre a cada chamada, novos valores aparecem depois — e somente depois — do refresh feito pelo próprio provider do host.
Um CultureInfo explícito tem precedência. Caso contrário, o adaptador ASP.NET lê Accept-Language e usa apenas o primeiro range. Ele não ordena ranges por peso q nem negocia contra uma lista de culturas suportadas. Range inicial ausente, wildcard ou inválido cai para CultureInfo.CurrentUICulture.
Quando negociação completa for necessária, configure middleware de localização no host para selecionar CurrentUICulture ou passe a cultura explicitamente; não espere que Offside implemente toda a negociação HTTP.
Código e docs/ são canônicos · Code and docs/ are canonical · Base dbca345372483477097385eb43d850484b00ec13 · 2026-08-22 · Repositório / Repository