Idioma y texto
Los identificadores de código y los comentarios deben estar en inglés.
El texto no inglés visible para el usuario debe vivir en archivos de traducción, no directamente en el código fuente PHP/Blade. Informa esta regla solo cuando el texto se muestre claramente al usuario, como etiquetas, botones, encabezados, notificaciones, diálogos, mensajes de validación, correos o salida de Blade.
No uses esta regla para exigir wrappers de traducción para texto que ya está en inglés. El uso de helpers de traducción es una cuestión de consistencia aparte.
Al agregar nuevo texto localizado visible para el usuario, usa helpers de traducción y actualiza cada archivo JSON de locale del proyecto que exista para la UI, normalmente lang/en.json y lang/es.json. No agregues el helper en PHP/Blade sin verificar o agregar las entradas correspondientes en esos archivos de locale.
Al corregir texto no inglés visible para el usuario, prefiere una clave de traducción literal como __('Format saved'), __('Edit') o __('Remote'). No inventes claves de traducción abstractas, numeradas, con forma de variable o con namespace como __('validator.text1'), __('message_1') o __('module.section.label') a menos que el proyecto ya tenga esa convención o el cambio actual agregue explícitamente las entradas de traducción requeridas como parte de un cambio deliberado de i18n.
Al reemplazar texto no inglés visible para el usuario con un helper de traducción, actualiza el archivo JSON de traducción apropiado en el mismo cambio, a menos que la clave ya exista. Conserva el texto visible original exactamente como valor de traducción, incluidos acentos, puntuación, mayúsculas y espacios. No dejes el código fuente cambiado a __('English key') sin agregar o verificar la entrada JSON correspondiente.
El texto largo es la excepción a la clave literal. Una página legal, una política o el cuerpo de un correo es un bloque de prosa que no tiene un literal corto que pueda nombrarlo, y se reescribe con el tiempo sin que cambie el código. Dale una clave con nombre en un archivo de locale propio, como lang/es/legal.php, en lugar de una entrada JSON. El bloque conserva el marcado inline que le corresponde — un <strong> alrededor de un término definido, una etiqueta en negrita al abrir un elemento de lista — y la página lo renderiza sin escape, pasando cualquier valor que interpole ya escapado.
Una fecha que le dice al lector cuándo se revisó por última vez un documento pertenece al texto, junto al texto cuya fecha indica. No la derives del sistema de archivos: filemtime() en un archivo Blade lee la vista compilada, así que limpiar la caché de vistas vuelve a marcar silenciosamente un documento legal como revisado hoy, e incluso contra la fuente se movería cada vez que se toque el marcado por razones no relacionadas.
Mueve el texto largo en el idioma en que fue escrito y luego tradúcelo en un cambio separado. Reubicar y traducir a la vez deja un diff donde no se puede comprobar nada: una cláusula que se perdió en el movimiento se ve exactamente igual que una cláusula reformulada en la traducción. Mover primero mantiene el texto verificable frente a la página de la que salió.
No apliques la regla de texto visible para el usuario a tests que afirman el texto renderizado esperado. Las aserciones de tests pueden contener o referenciar exactamente el texto no inglés que verifican porque no se renderizan a los usuarios.
No apliques la regla de texto visible para el usuario a valores internos persistidos, valores de enum/base de datos, claves de arrays, nombres de rutas, nombres de eventos, config keys o tokens de comparación que no se renderizan directamente a los usuarios. Por ejemplo, un mapa de estado a color con claves de valores de estado en español almacenados es lógica interna, no texto visible.