diff options
author | Gareth Rees <gareth@mysociety.org> | 2015-01-14 15:36:58 +0000 |
---|---|---|
committer | Gareth Rees <gareth@mysociety.org> | 2015-04-07 16:23:12 +0100 |
commit | fd6c56d63c9db313db33beb5d5097f6ea3d468dc (patch) | |
tree | 0ce4af30157998d5251f5b30384537000e5d9f9f /es/docs/developers | |
parent | c0a1b9c2334c0159fe5fbea79bd41c07d67eff2e (diff) |
Add Spanish docs/developers/i18n
Diffstat (limited to 'es/docs/developers')
-rw-r--r-- | es/docs/developers/i18n.md | 176 |
1 files changed, 176 insertions, 0 deletions
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 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/). + |