aboutsummaryrefslogtreecommitdiffstats
path: root/es/docs/developers
diff options
context:
space:
mode:
Diffstat (limited to 'es/docs/developers')
-rw-r--r--es/docs/developers/api.md87
-rw-r--r--es/docs/developers/directory_structure.md216
-rw-r--r--es/docs/developers/i18n.md176
-rw-r--r--es/docs/developers/index.md80
-rw-r--r--es/docs/developers/overview.md49
5 files changed, 608 insertions, 0 deletions
diff --git a/es/docs/developers/api.md b/es/docs/developers/api.md
new file mode 100644
index 000000000..dd4d66ac9
--- /dev/null
+++ b/es/docs/developers/api.md
@@ -0,0 +1,87 @@
+---
+layout: es/page
+title: API
+---
+
+# API de Alaveteli
+
+<p class="lead">
+ Existen dos partes del API para acceder a datos o insertarlos programáticamente: el API de lectura y el API de escritura.
+</p>
+
+## API de lectura
+
+Se proporciona a través de las versiones JSON de la mayoría de las entidades del sistema, así como mediante
+fuentes de difusión Atom para las entidades de listados:
+
+### Fuentes de difusión Atom
+
+Hay fuentes Atom en la mayoría de páginas que incluyen listados de solicitudes de información pública,
+que pueden utilizarse para recibir actualizaciones y enlaces en formato XML. Puede encontrar la URL de la fuente Atom de
+las siguientes maneras:
+
+* Busque los enlaces de la fuente RSS.
+* Examine la etiqueta `<link rel="alternate" type="application/atom+xml">` en el encabezado del código HTML.
+* Añada `/feed` al inicio de otra URL.
+
+Incluso las solicitudes complejas de búsqueda cuentan con fuentes Atom. Puede utilizarlas de múltiples maneras,
+por ejemplo, para realizar búsquedas por autoridad, por tipo de archivo, por intervalo de fechas o por estado.
+Consulte los consejos de búsqueda avanzada para obtener más información.
+
+### Datos JSON estructurados
+
+Hay unas cuantas páginas con versiones JSON, que permiten descargar información sobre
+objetos de forma estructurada. Puede encontrarlas de los siguientes modos:
+
+* Añada `.json` al final de la URL.
+* Busque la etiqueta `<link rel="alternate" type="application/json">` en el encabezado del código HTML.
+
+Los usuarios, autoridades y solicitudes disponen de versiones JSON que contienen información
+básica sobre ellos. Cada fuente Atom tiene su equivalente en JSON, que incluye información
+sobre el listado de eventos de la fuente.
+
+### Iniciar nuevas solicitudes programáticamente
+
+Para animar a los usuarios a crear enlaces hacia una autoridad pública en particular, utilice direcciones URL
+con el formato `http://<susitio>/new/<nombre_url_organismopublico>`. Estos son los
+parámetros que puede añadir a estas URL, ya sea propiamente en la URL o a partir de un formulario:
+
+* `title`: resumen por defecto de la nueva solicitud.
+* `default_letter`: texto por defecto del cuerpo de la carta. El saludo y la firma locales lo rodean.
+* `body`: constituye una alternativa a `default_letter` y permite editar el texto completo de la solicitud, permitiendo modificar el saludo y la firma.
+* `tags`: lista de etiquetas separada por espacios que permite encontrar y enlazar cualquier solicitud realizada posteriormente, por ejemplo `openlylocal spending_id:12345`. El símbolo `:` indica que se trata de una etiqueta de máquina. Los valores de las etiquetas de máquina también pueden incluir puntos, útiles para identificadores URI.
+
+## API de escritura
+
+El API de escritura está diseñada para ser utilizada por organismos públicos al crear sus propias
+solicitudes en el sistema. Actualmente se utiliza en el software de [registro de información
+pública](https://github.com/mysociety/foi-register) de mySociety para soportar el uso de
+Alaveteli como registro de divulgación para toda actividad de información pública procedente de
+un organismo público en concreto.
+
+Todas las solicitudes deben incluir una clave del API como una variable `k`. Esta clave puede visualizarse
+en cada una de las páginas de la autoridad desde la interfaz de administración. Otras variables deben
+enviarse como se indica a continuación:
+
+* `/api/v2/request`: ENVÍA los siguientes datos json como una variable de tipo formulario `json` para crear una nueva solicitud:
+ * `title`: título de la solicitud.
+ * `body`: cuerpo de la solicitud.
+ * `external_user_name`: nombre de la persona que ha originado la solicitud.
+ * `external_url`: URL donde puede encontrarse una copia canónica de la solicitud
+ Devuelve contenido JSON con una `url` para la nueva solicitud junto con su `id`.
+* `/api/v2/request/<id>.json`: RECIBE toda la información sobre una solicitud.
+* `/api/v2/request/<id>.json`: ENVÍA correspondencia adicional respecto a una solicitud:
+ * Como variable de tipo formulario `json`:
+ * `direction`: `request` (solicitud procedente del usuario, por ejemplo, como seguimiento, recordatorio, etc.) o `response` (respuesta procedente de la autoridad).
+ * `body`: mensaje.
+ * `state`: opcional, permite que la autoridad incluya un valor de estado `state` de solicitud al enviar una actualización. Valores permitidos: `waiting_response` (esperando respuesta), `rejected` (rechazada), `successful` (satisfactoria) y `partially_successful` (parcialmente satisfactoria). Solo se utiliza en dirección `response` (respuesta).
+ * `sent_at`: hora en la que se ha enviado la correspondencia en formato ISO-8601.
+ * (Opcionalmente) la variable `attachments` (adjuntos) como `multipart/form-data`:
+ * Elementos adjuntos en la correspondencia. Solo pueden adjuntarse en mensajes en dirección `response` (respuesta).
+* `/api/v2/request/<id>/update.json`: ENVÍA un nuevo estado para la solicitud:
+ * Como variable de tipo formulario `json`:
+ * `state`: estimación por parte del usuario del `state` (estado) de una solicitud que ha recibido una respuesta de la autoridad. Valores permitidos: `waiting_response` (esperando respuesta), `rejected` (rechazada), `successful` (satisfactoria) y `partially_successful` (parcialmente satisfactoria). Solo debería utilizarse para comentarios por parte del usuario; si una autoridad desea actualizar el estado `state`, debe utilizar `/api/v2/request/<id>.json` en su lugar.
+
+
+
+
diff --git a/es/docs/developers/directory_structure.md b/es/docs/developers/directory_structure.md
new file mode 100644
index 000000000..cd8ac358c
--- /dev/null
+++ b/es/docs/developers/directory_structure.md
@@ -0,0 +1,216 @@
+---
+layout: es/page
+title: Estructura de directorios
+---
+
+
+# Estructura de directorios de Alaveteli
+
+<p class="lead">Esta página ofrece una vista general sobre dónde encontrar distintos datos en
+los directorios de Alaveteli.</p>
+
+Si solo está instalando Alaveteli, **probablemente nunca necesite preocuparse de esto**;
+es bastante más práctico cuando un desarrollador planea llevar a cabo cambios más
+significativos en el código. No necesita estar familiarizado con
+Ruby para realizar la instalación o aplicar [modificaciones básicas en
+ella]({{ page.baseurl }}/docs/customising/).
+
+<!-- (y en caso de hacerlo,
+recuerde consultar la página sobre [cómo comentar los cambios realizados]({{ page.baseurl }}/feeding-back)).-->
+
+Alaveteli utiliza Ruby on Rails, una infraestructura web de tipo «modelo-vista-controlador» común;
+si está familiarizado con Rails, ya conocerá estos detalles. Para obtener más información
+sobre la estructura de Rails, consulte el [sitio web de Ruby on Rails](http://guides.rubyonrails.org/getting_started.html).
+
+## Directorios principales y funciones de cada uno de ellos
+
+<dl class="dir-structure">
+ <dt>
+ app
+ </dt>
+ <dd>
+ <p><em>núcleo del código de aplicación de Alaveteli</em></p>
+ <dl>
+ <dt>
+ assets
+ </dt>
+ <dd>
+ <em>recursos estáticos que requieren una compilación previa para poder dar servicio</em>
+ <dl>
+ <dt>
+ fonts
+ </dt>
+ <dt>
+ images
+ </dt>
+ <dt>
+ javascripts
+ </dt>
+ <dt class="last">
+ stylesheets
+ </dt>
+ <dd class="last">
+ <p><em>hojas de estilo en formato CSS o <a href="http://sass-lang.com/">SCSS</a></em></p>
+ <p>Las hojas de estilo SCSS se compilan como CSS.</p>
+ </dd>
+ </dl>
+ </dd>
+ <dt>
+ controllers
+ </dt>
+ <dt>
+ helpers
+ </dt>
+ <dt>
+ mailers
+ </dt>
+ <dt>
+ models
+ </dt>
+ <dt class="last">
+ views
+ </dt>
+ </dl>
+ </dd>
+ <dt>cache
+ </dt>
+ <dd><p><em>archivos temporales de descarga, datos adjuntos y plantillas</em></p>
+ </dd>
+ <dt>
+ commonlib
+ </dt>
+ <dd>
+ <p><em>librería de funciones comunes de mySociety</em></p>
+ <p>
+ Mantenemos una <a href="https://github.com/mysociety/commonlib">librería
+ común</a>, que utilizamos en muchos de nuestros proyectos (no solo en
+ Alaveteli). Está implementada como un <a
+ href="http://git-scm.com/book/en/Git-Tools-Submodules">submódulo de git</a>
+ para que Alaveteli la contenga aunque el código sea independiente. Normalmente no
+ es necesario tener nada de esto en cuenta (ya que git lo gestiona automáticamente),
+ pero si realmente <em>necesita</em> cambiar algo al respecto, tenga en cuenta que
+ se trata de un repositorio independiente.
+ </p>
+ </dd>
+ <dt>
+ config
+ </dt>
+ <dd>
+ <p><em>archivos de configuración</em></p>
+ <p>
+ El archivo primario de configuración es <code>general.yml</code>. Este archivo no se halla en el
+ repositorio de git (ya que contendrá información específica de su instalación, incluida la
+ contraseña de la base de datos), pero hay archivos de ejemplo.
+ </p>
+ </dd>
+ <dt>
+ db
+ </dt>
+ <dd>
+ <p><em>archivos de base de datos</em></p>
+ <dl>
+ <dt class="last">
+ migrate
+ </dt>
+ <dd class="last">
+ Migración de Rails (actualización del esquema de la base de datos hacia arriba
+ o abajo a medida que se desarrolla el código).
+ </dd>
+ </dl>
+ </dd>
+ <dt>
+ doc
+ </dt>
+ <dd>
+ <p><em>documentación</em></p>
+ <p>
+ Se trata de información técnica adicional añadida a la <a
+ href="{{ page.baseurl }}/docs/">documentación principal</a> (la que
+ está leyendo actualmente), que se almacena en el repositorio de git,
+ en la rama <code>gh-pages</code> y se publica como páginas de GitHub.
+ </p>
+ </dd>
+ <dt>
+ lib
+ </dt>
+ <dd>
+ <p><em>librerías personalizadas</em></p>
+ <dl>
+ <dt>
+ tasks
+ </dt>
+ <dd>Tareas de <a href="http://guides.rubyonrails.org/command_line.html#rake">Rake</a>.
+ </dd>
+ <dt class="last">
+ themes
+ </dt>
+ <dd class="last">Aquí vive su tema de Alaveteli.
+ </dd>
+ </dl>
+ </dd>
+ <dt>
+ locale
+ </dt>
+ <dd>
+ <p><em>traducciones (internacionalización/i18n)</em></p>
+ <p>
+ Las cadenas de texto de traducción se almacenan en archivos <code>.po</code> dentro de directorios específicos para
+ la localización y codificación. Por ejemplo, <code>es/</code> contiene las traducciones para el sitio en español.
+ </p>
+ </dd>
+ <dt>
+ log
+ </dt>
+ <dd>
+ <p><em>archivos de registro de aplicación</em></p>
+ </dd>
+ <dt>
+ public
+ </dt>
+ <dd> <p><em>archivos estáticos que pueden dar servicio directamente</em></p>
+ </dd>
+ <dt>
+ script
+ </dt>
+ <dd>
+ <p><em>shell scripts para el servidor</em></p>
+ <p>
+ Por ejemplo, <code>alert-overdue-requests</code> ejecuta el script
+ que encuentra solicitudes que han superado el límite de tiempo y las envía por
+ correo electrónico.
+ </p>
+ </dd>
+ <dt>
+ spec
+ </dt>
+ <dd>
+ <p><em>pruebas</em></p>
+ <p>
+ El entorno de pruebas de Alaveteli funciona con <a href="http://rspec.info/">rspec</a>.
+ </p>
+ </dd>
+ <dt>
+ tmp
+ </dt>
+ <dd>
+ <p>
+ <em>archivos temporales</em>
+ </p>
+ </dd>
+ <dt class="last">
+ vendor
+ </dt>
+ <dd class="last">
+ <p><em>software de terceros</em></p>
+ <dl>
+ <dt class="last">bundle</dt>
+ <dd class="last">
+ <p>
+ <em>paquete de gems necesario para ejecutar Alaveteli</em>
+ </p>
+ </dd>
+ </dl>
+ </dd>
+</dl>
+
+Hemos omitido algunos subdirectorios menos importantes para mantener la claridad.
diff --git a/es/docs/developers/i18n.md b/es/docs/developers/i18n.md
new file mode 100644
index 000000000..5110959fc
--- /dev/null
+++ b/es/docs/developers/i18n.md
@@ -0,0 +1,176 @@
+---
+layout: es/page
+title: Internacionalización (para desarrolladores)
+---
+
+# Internacionalización en el código
+
+<p class="lead">
+ Esta página describe algunos aspectos técnicos de la internacionalización del
+ código de Alaveteli. Está principalmente dirigida a desarrolladores que están trabajando
+ en la base del código; si tan solo desea traducir Alaveteli a su idioma, consulte la
+ <a href="{{ page.baseurl }}/docs/customising/translation">traducción de Alaveteli</a>
+ en su lugar.
+</p>
+
+## Notas de implementación
+
+Las traducciones implementadas para el proyecto se hallan en ``locale/``.
+
+Recomendamos que las traducciones se lleven a cabo en
+[Transifex](https://www.transifex.net/projects/p/alaveteli/),
+debido a que los traductores pueden trabajar a través de su interfaz gráfica en lugar de tener que editar
+<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">archivos `.po` y `.pot`</a>
+directamente. Básicamente, Transifex tan solo captura el trabajo de los traductores y lo convierte
+en los archivos que Alaveteli necesita (mediante el uso de gettext).
+
+### Cómo obtener las últimas traducciones en su sitio web
+
+Por ejemplo, para implementar traducciones en inglés y español a la vez:
+
+ * Asegúrese de que los archivos `.po` correspondientes se hallan en ```locale/en/app.po``` y ```locale/es/app.po```
+ (por ejemplo, descargándolos desde Transifex).
+ * Asigne a <code><a href="{{ page.baseurl }}/docs/customising/config/#available_locales">AVAILABLE_LOCALES</a></code>
+ el valor <code>en&nbsp;es</code>.
+
+### Qué hacer si no dispone de las traducciones completas para una versión anterior de Alaveteli
+
+Antes de elaborar una nueva versión de Alaveteli los archivos de traducción se
+extraen de Transifex y se añaden al directorio ``locale/`` de Alaveteli en
+github, donde se hallan las traducciones más completas para la versión anterior.
+Después los archivos ubicados en Transifex se actualizan con las nuevas cadenas de texto
+que necesitan ser traducidas para la nueva actualización. En este punto también se eliminan las cadenas de texto
+anteriores que ya no se utilizan en la nueva versión. La última
+[etiqueta de versión](https://github.com/mysociety/alaveteli/releases)
+para una actualización en github debería contener las traducciones más completas procedentes de Transifex para dicha
+versión.
+
+Si utiliza una versión antigua de Alaveteli y desea añadir o modificar las traducciones,
+puede editar los archivos .po directamente utilizando un programa local, como
+[PoEdit](http://poedit.net/).
+
+### Cómo añadir nuevas cadenas de texto a la traducción
+
+Necesita hacer esto en caso de que haya añadido al código nuevas cadenas de texto que necesiten traducirse
+(o si ha modificado alguna cadena ya existente).
+
+Para actualizar los
+<a href="{{ page.baseurl }}/docs/glossary/#po" class="glossary__link">archivos `.po` o `.pot`</a>
+para cada idioma, ejecute el comando:
+
+ bundle exec rake gettext:store_model_attributes
+
+seguido del comando:
+
+ bundle exec rake gettext:find
+
+Si `gettext:find` solo crea el archivo `locale/im-config.pot`, necesitará aplicar
+la acción unset a la variable de entorno `TEXTDOMAIN` e intentarlo de nuevo.
+
+Para obtener más información sobre las traducciones, consulte la página de
+[traducción de Alaveteli]({{ page.baseurl }}/docs/customising/translation/).
+
+
+## Detalles de implementación técnica
+
+### Obtener la localización actual
+
+Este es un tema complejo debido a que existen dos métodos rivales para definir una
+combinación de localización y territorio. El método mediante POSIX (y gettext y Transifex) es
+de tipo `en_GB` y el método mediante Rails, de tipo `en-US`. Debido a que utilizamos gettext y
+Transifex para las traducciones, debemos lidiar con ambos.
+
+ * Para la versión de localización de Rails seleccionada actualmente, utilice `I18n.locale`.
+ * Para la versión de localización de POSIX, utilice `FastGettext.locale`.
+
+## I18n en plantillas
+
+Antes de añadir cadenas de texto i18n a la fuente, debería leer las
+[guías de internacionalización](http://mysociety.github.io/internationalization.html)
+que se aplican en todos nuestros proyectos.
+
+Algunos consejos para añadir cadenas de texto al código de Alaveteli:
+
+* Cadenas simples: ```<% = _("String to translate") %>```
+* Cadenas que incluyen variables: ayude al traductor mediante la inserción de cadenas
+ que puedan ser interpoladas, de forma que la variable tenga un significado. Por ejemplo,
+ ```<%= "Nothing found for '" + h(@query) + "'" %>``` puede convertirse en ```<%=
+ _("Nothing found for '{{search_terms}}'", :search_terms => h(@query)) %>```
+* Cadenas que incluyen números: ```<%= n_('%d request', '%d requests', @quantity) % @quantity %>```
+* Permitimos algo de código HTML entre líneas cuando proporciona un contexto con significado, por ejemplo:
+
+```
+_('<a href="{{browse_url}}">Browse all</a> or <a href="{{add_url}}">ask us to add it</a>.',
+ :browse_url => @browse_url, :add_url => @add_url)
+```
+
+Pueden aplicarse normas similares a cadenas de texto en el código fuente en Ruby.
+
+## Acceso programático a entidades PublicBody traducidas
+
+Además de las plantillas, la única área adicional de i18n actualmente implementada es la de entidades
+PublicBody.
+
+La implementación permite obtener distintas localizaciones de una entidad PublicBody, como:
+
+```ruby
+ PublicBody.with_locale("es") do
+ puts PublicBody.find(230).name
+ end
+```
+
+Normalmente este es todo el código que necesita conocer. Existe un método
+```self.locale_from_params()```, disponible en todos los modelos, que devuelve una localización
+especificada como ```locale=xx``` en la cadena de búsqueda y que retorna a la localización
+por defecto, que puede utilizar en conjunto con el método ```with_locale```
+superior. Todas las uniones en las tablas internas de traducción deberían ser gestionadas
+normalmente de forma automática, pero existen algunas excepciones, indicadas a continuación.
+
+### Sobrescribir los mutadores de campos del modelo
+
+Internamente utilizamos el [complemento Globalize](https://github.com/globalize/globalize)
+para localizar campos del modelo. Cuando la columna «foo» ha sido marcada en el modelo como
+```:translates```, Globalize sobrescribe ```foo.baz = 12``` para establecer el valor en la columna
+```baz``` de la tabla ```foo_translations```.
+
+Uno de los efectos secundarios de la forma en que esta tarea se lleva a cabo consiste en que, si
+desea sobrescribir un mutador de atributo específico, necesitará llamar explícitamente a la maquinaria
+de Globalize, más o menos de esta manera:
+
+```ruby
+ def name=(name)
+ globalize.write(self.class.locale || I18n.locale, "name", name)
+ self["name"] = short_name
+ # your other stuff here
+ end
+```
+
+### Búsqueda
+
+Los métodos mágicos ```find_first_by_<attr>``` y ```find_all_by_<attr>```
+deberían funcionar. Si desea realizar una búsqueda más programática, necesita unir
+la tabla de traducción, por ejemplo:
+
+```ruby
+ query = "#{translated_attr_name(someattr) = ? AND #{translated_attr_name('locale')} IN (?)"
+ locales = Globalize.fallbacks(locale || I18n.locale).map(&:to_s)
+ find(
+ :first,
+ :joins => :translations,
+ :conditions => [query, value, locales],
+ :readonly => false
+ )
+```
+
+Es posible que también necesite efectuar algunas uniones o condiciones SQL de bajo nivel. Consulte
+```PublicBodyController.list``` para ver un ejemplo de una consulta con una condición explícitamente
+dependiente de la localización (busque la variable ```locale_condition```)
+
+## Traducción y actualizaciones
+
+El gestor de actualizaciones forzará una detención de la traducción justo antes de que se finalice una nueva
+versión. Durante este tiempo, si su trabajo está programado para ser incluido en dicha versión,
+no debe introducir nuevas cadenas en el código. Esta detención ofrece a los traductores el tiempo necesario
+para completar y revisar sus traducciones respecto a todas las cadenas de texto conocidas.
+Consulte más información sobre la [traducción de Alaveteli]({{ page.baseurl }}/docs/customising/translation/).
+
diff --git a/es/docs/developers/index.md b/es/docs/developers/index.md
new file mode 100644
index 000000000..3b7b0eee1
--- /dev/null
+++ b/es/docs/developers/index.md
@@ -0,0 +1,80 @@
+---
+layout: es/page
+title: Para desarrolladores
+---
+
+# Información para desarrolladores
+
+<p class="lead">
+ Alaveteli es un proyecto de código abierto. Los desarrolladores a tiempo completo de mySociety junto con desarrolladores de todo el mundo contribuyen de forma activa en la base del código. Estos enlaces y notas le ayudarán si también desea ayudar.
+</p>
+
+* El software está escrito en **Ruby on Rails 3.x**. Soportamos postgresql como
+ sistema gestor de base de datos. Se necesita un agente de transferencia de correo (MTA)
+ configurado, como exim, para analizar los correos recibidos. Disponemos de servidores de
+ producción implementados en Debian (Squeeze y Wheezy) y en Ubuntu (12.04 LTS). Por motivos
+ de rendimiento, recomendamos el uso de [Varnish](https://www.varnish-cache.org).
+
+* Para ayudarle a entender qué hace el código, le recomendamos que lea esta [vista general
+ de alto nivel]({{ page.baseurl }}/docs/developers/overview/), que incluye un esquema de
+ los modelos y las relaciones entre ellos.
+
+* Consulte la [documentación del API]({{ page.baseurl }}/docs/developers/api/) para averiguar
+ cómo extraer e introducir datos en Alaveteli.
+
+* Si necesita modificar o añadir cadenas de texto en la interfaz, consulte nuestras [guías
+ de internacionalización](http://mysociety.github.io/internationalization.html),
+ donde encontrará notas sobre nuestro uso de `gettext`.
+
+* Utilizamos el [modelo de ramas de flujo
+ de git](http://nvie.com/posts/a-successful-git-branching-model/) con un pequeño cambio:
+ actualmente nuestra rama `develop` se denomina `rails-3-develop`, por lo que
+ la última versión de desarrollo siempre se halla en la
+ [rama
+ rails-3-develop](https://github.com/mysociety/alaveteli/tree/rails-3-develop). La última
+ versión estable se encuentra siempre en la [rama
+ maestra](https://github.com/mysociety/alaveteli). Si tiene previsto colaborar en
+ la elaboración del software, es posible que las [extensiones de flujo de
+ git](https://github.com/nvie/gitflow) le resultes prácticas.
+
+* La instalación del software es un tanto compleja, pero poco a poco se vuelve más sencilla.
+ Si utiliza Debian o Ubuntu, debería poder poner en funcionamiento una versión en varias horas.
+ Si dispone de su propio servidor, ejecute el
+ [script de instalación]({{ page.baseurl }}/docs/installing/script/) o siga las
+ indicaciones de
+ [instalación manual]({{ page.baseurl }}/docs/installing/manual_install/).
+ Alternativamente existe una [AMI EC2 de Alaveteli]({{ page.baseurl }}/docs/installing/ami/)
+ que puede ayudarle a ponerlo en marcha rápidamente.
+ [Póngase en contacto]({{ page.baseurl }}/community/) a través de la lista de correo del proyecto o mediante IRC
+ para obtener ayuda.
+
+* Un paso inicial estándar en la personalización de su implementación es la [escritura de un
+ tema]({{ page.baseurl }}/docs/customising/themes/). **Si solo va a leer un apartado,
+ ¡que sea este!**
+
+* Al igual que numerosos sitios construidos con Ruby on Rails, el software no proporciona un rendimiento muy elevado (consulte
+ [estas notas sobre los problemas de rendimiento](https://github.com/mysociety/alaveteli/wiki/Performance-issues) recopiladas a través del tiempo con
+ WhatDoTheyKnow). El sitio funcionará sobre un servidor con 512 MB de memoria RAM, pero se recomienda un mínimo
+ de 2 GB. La implementación detrás de [Varnish](https://www.varnish-cache.org) también resulta esencial. Consulte las
+ [buenas prácticas en el servidor de producción]({{ page.baseurl }}/docs/running/server/) para obtener más información.
+
+* Existe un conjunto de [proposiciones de mejora](https://github.com/mysociety/alaveteli/wiki/Proposals-for-enhancements),
+ tales como un mayor número de funcionalidades centradas en el usuario, pero consulte también...
+
+* ...las [publicaciones de github](https://github.com/mysociety/alaveteli/issues). Marcamos
+ las publicaciones con la etiqueta **suitable for volunteers** (adecuada para voluntarios) cuando creemos que
+ son especialmente adecuadas para quien busca una tarea relativamente pequeña a la que dedicarse.
+
+* Intentamos garantizar que cada modificación confirmada cuente con su publicación correspondiente en el gestor.
+ Así los registros de modificaciones se vuelven más sencillos, pues podemos reunir todos los cambios propios de
+ una actualización concreta respecto a un objetivo intermedio en el gestor de publicaciones, [como esta actualización
+ 0.4](https://github.com/mysociety/alaveteli/issues?milestone=7&state=closed).
+
+* Si experimenta problemas de memoria, consulte [esta publicación del blog sobre estrategias utilizadas
+ anteriormente](https://www.mysociety.org/2009/09/17/whatdotheyknow-growing-pains-and-ruby-memory-leaks/).
+
+* Si edita el código en un Mac, consulte estas [notas de instalación en MacOS X]({{ page.baseurl }}/docs/installing/macos/). <!-- [[OS X Quickstart]] -->
+
+* Intentamos seguir unas buenas prácticas similares en todos nuestros proyectos: visite
+ [mysociety.github.io](http://mysociety.github.io/) para obtener información sobre temas tales como nuestros
+ [estándares de código](http://mysociety.github.io/coding-standards.html).
diff --git a/es/docs/developers/overview.md b/es/docs/developers/overview.md
new file mode 100644
index 000000000..c24474e4f
--- /dev/null
+++ b/es/docs/developers/overview.md
@@ -0,0 +1,49 @@
+---
+layout: es/page
+title: Vista general de alto nivel
+---
+
+# Vista general de alto nivel
+
+<p class="lead">
+ Esta página describe el proceso y las entidades que forman Alaveteli.
+ Es una vista de alto nivel sobre cómo trabaja Alaveteli para ayudarle a orientarse respecto al código.
+</p>
+
+_Consulte también el [esquema](#esquema) en la parte inferior de esta página._
+
+La entidad principal es **InfoRequest**, que representa una solicitud de información por parte de un
+**User** a un **PublicBody**. Una nueva InfoRequest resulta en un **OutgoingMessage** inicial, que
+representa el primer correo electrónico.
+
+Una vez elaborada una InfoRequest, se monitoriza su estado mediante **InfoRequestEvents**. Por
+ejemplo, el estado inicial de una nueva InfoRequest es `awaiting_response` y cuenta con un
+InfoRequestEvent asociado del tipo `initial_request`. Un evento de InfoRequest puede disponer de
+un OutgoingMessage o de un IncomingMessage, así como no tener ninguno asociado.
+
+Las respuestas son recibidas por el sistema mediante el flujo de mensajes de correo de tipo raw (representados por **RawEmail**)
+desde el MTA en un script ubicado en `scripts/mailin`. Esta acción analiza el correo, intenta identificar la
+InfoRequest asociada y genera un **IncomingMessage**, que hace referencia tanto al RawEmail como a la InfoRequest.
+
+Cualquier User puede elaborar **Comments** en las InfoRequests.
+
+Todos los eventos (por ejemplo, Comments y OutgoingMessages) son monitorizados en InfoRequestEvent.
+
+Una **TrackThing** consiste en una búsqueda delimitada que permite a los usuarios recibir alertas cuando se encuentran
+eventos coincidentes con sus criterios. (Su funcionamiento cambió después de que lo lanzáramos, así que
+aún existe código obsoleto propio de características que hemos descartado).
+
+El **MailServerLog** representa los archivos de registro analizados por el MTA. Las entradas del
+MailServerLog son creadas por un administrador de tipo cron que ejecuta
+`scripts/load-mail-server-logs`. Esta acción comprueba los correos entrantes y los asocia con las
+InfoRequests; después `script/check-recent-requests-send` comprueba estos registros para garantizar que
+cuentan con información de remitente (envelope-from) en el encabezado (con el objetivo de combatir el spam).
+
+## Esquema
+
+<a href="{{ site.baseurl }}assets/img/railsmodels.png"><img src="{{ site.baseurl }}assets/img/railsmodels.png"></a>
+
+Este esquema de los modelos de Rails fue generado a partir del código el 19 de diciembre de 2012 utilizando
+[Railroad](http://railroad.rubyforge.org/).
+
+El comando de railroad es: `railroad -M | dot -Tpng > railsmodels.png`