---
name: load_translations
kind: function
lang: py
domain: core
version: "1.0.0"
purity: impure
signature: "def load_translations(locales_dir: str) -> dict[str, dict]"
description: "Carga todos los archivos JSON de un directorio de locales. Cada archivo {locale}.json se indexa por nombre sin extension. Retorna {} si el directorio no existe o esta vacio."
tags: [i18n, translation, locale, json, files]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [json, os]
params:
  - name: locales_dir
    desc: "Ruta al directorio con archivos de traducción JSON ({locale}.json)"
output: "Diccionario con clave=nombre_locale y valor=contenido del JSON"
tested: true
tests: ["carga multiples locales", "directorio inexistente retorna dict vacio", "ignora archivos no json", "locale con estructura anidada"]
test_file_path: "python/functions/core/load_translations_test.py"
file_path: "python/functions/core/load_translations.py"
---

## Ejemplo

```python
from load_translations import load_translations
from t import _set_translations, t

# Estructura de archivos:
# locales/
#   en.json  →  {"report": {"done": "Done", "sectionStart": "Section: {title}"}}
#   es.json  →  {"report": {"done": "Listo"}}

translations = load_translations("locales/")
_set_translations(translations, default_locale="en")

t("report.done", locale="es")
# → "Listo"
```

## Notas

Lee el filesystem, por eso es impura. Los errores de JSON malformado se propagan directamente (`json.JSONDecodeError`). Los errores de acceso al directorio se propagan como `OSError`. Companera natural de `t_py_core` — el flujo tipico es: `load_translations` al inicio de la app → `_set_translations` → llamadas a `t` durante la ejecucion. Inspirada conceptualmente en el modulo `locale.py` de MiroFish (AGPL-3.0); reimplementada desde cero.
