diff --git a/scm-webapp/src/main/webapp/resources/extjs/i18n/ext-lang-es.js b/scm-webapp/src/main/webapp/resources/extjs/i18n/ext-lang-es.js
new file mode 100644
index 0000000000..7f303733d5
--- /dev/null
+++ b/scm-webapp/src/main/webapp/resources/extjs/i18n/ext-lang-es.js
@@ -0,0 +1,319 @@
+/*!
+ * Ext JS Library 3.3.1
+ * Copyright(c) 2006-2010 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/*
+ * Spanish/Latin American Translation by genius551v 04-08-2007
+ * Revised by efege, 2007-04-15.
+ * Revised by Rafaga2k 10-01-2007 (mm/dd/yyyy)
+ * Revised by FeDe 12-13-2007 (mm/dd/yyyy)
+ * Synchronized with 2.2 version of ext-lang-en.js (provided by Condor 8 aug 2008)
+ * by halkon_polako 14-aug-2008
+ */
+
+Ext.UpdateManager.defaults.indicatorText = '
Cargando...
';
+
+if(Ext.DataView){
+ Ext.DataView.prototype.emptyText = "";
+}
+
+if(Ext.grid.GridPanel){
+ Ext.grid.GridPanel.prototype.ddText = "{0} fila(s) seleccionada(s)";
+}
+
+if(Ext.LoadMask){
+ Ext.LoadMask.prototype.msg = "Cargando...";
+}
+
+Date.monthNames = [
+ "Enero",
+ "Febrero",
+ "Marzo",
+ "Abril",
+ "Mayo",
+ "Junio",
+ "Julio",
+ "Agosto",
+ "Septiembre",
+ "Octubre",
+ "Noviembre",
+ "Diciembre"
+];
+
+Date.getShortMonthName = function(month) {
+ return Date.monthNames[month].substring(0, 3);
+};
+
+Date.monthNumbers = {
+ Ene : 0,
+ Feb : 1,
+ Mar : 2,
+ Abr : 3,
+ May : 4,
+ Jun : 5,
+ Jul : 6,
+ Ago : 7,
+ Sep : 8,
+ Oct : 9,
+ Nov : 10,
+ Dic : 11
+};
+
+Date.getMonthNumber = function(name) {
+ return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
+};
+
+Date.dayNames = [
+ "Domingo",
+ "Lunes",
+ "Martes",
+ "Mi\u00E9rcoles",
+ "Jueves",
+ "Viernes",
+ "S\u00E1bado"
+];
+
+Date.getShortDayName = function(day) {
+ if (day==3) return "Mié";
+ if (day==6) return "Sáb";
+ return Date.dayNames[day].substring(0, 3);
+};
+
+Date.parseCodes.S.s = "(?:st|nd|rd|th)";
+
+if(Ext.MessageBox){
+ Ext.MessageBox.buttonText = {
+ ok : "Aceptar",
+ cancel : "Cancelar",
+ yes : "S\u00ED",
+ no : "No"
+ };
+}
+
+if(Ext.util.Format){
+ Ext.util.Format.date = function(v, format){
+ if(!v) return "";
+ if(!(v instanceof Date)) v = new Date(Date.parse(v));
+ return v.dateFormat(format || "d/m/Y");
+ };
+}
+
+if(Ext.DatePicker){
+ Ext.apply(Ext.DatePicker.prototype, {
+ todayText : "Hoy",
+ minText : "Esta fecha es anterior a la fecha m\u00EDnima",
+ maxText : "Esta fecha es posterior a la fecha m\u00E1xima",
+ disabledDaysText : "",
+ disabledDatesText : "",
+ monthNames : Date.monthNames,
+ dayNames : Date.dayNames,
+ nextText : 'Mes Siguiente (Control+Right)',
+ prevText : 'Mes Anterior (Control+Left)',
+ monthYearText : 'Seleccione un mes (Control+Up/Down para desplazar el a\u00F1o)',
+ todayTip : "{0} (Barra espaciadora)",
+ format : "d/m/Y",
+ okText : " Ok ",
+ cancelText : "Cancelar",
+ startDay : 1
+ });
+}
+
+if(Ext.PagingToolbar){
+ Ext.apply(Ext.PagingToolbar.prototype, {
+ beforePageText : "P\u00E1gina",
+ afterPageText : "de {0}",
+ firstText : "Primera p\u00E1gina",
+ prevText : "P\u00E1gina anterior",
+ nextText : "P\u00E1gina siguiente",
+ lastText : "Última p\u00E1gina",
+ refreshText : "Actualizar",
+ displayMsg : "Mostrando {0} - {1} de {2}",
+ emptyMsg : 'Sin datos para mostrar'
+ });
+}
+
+if(Ext.form.Field){
+ Ext.form.Field.prototype.invalidText = "El valor en este campo es inv\u00E1lido";
+}
+
+if(Ext.form.TextField){
+ Ext.apply(Ext.form.TextField.prototype, {
+ minLengthText : "El tama\u00F1o m\u00EDnimo para este campo es de {0}",
+ maxLengthText : "El tama\u00F1o m\u00E1ximo para este campo es de {0}",
+ blankText : "Este campo es obligatorio",
+ regexText : "",
+ emptyText : null
+ });
+}
+
+if(Ext.form.NumberField){
+ Ext.apply(Ext.form.NumberField.prototype, {
+ decimalSeparator : ".",
+ decimalPrecision : 2,
+ minText : "El valor m\u00EDnimo para este campo es de {0}",
+ maxText : "El valor m\u00E1ximo para este campo es de {0}",
+ nanText : "{0} no es un n\u00FAmero v\u00E1lido"
+ });
+}
+
+if(Ext.form.DateField){
+ Ext.apply(Ext.form.DateField.prototype, {
+ disabledDaysText : "Deshabilitado",
+ disabledDatesText : "Deshabilitado",
+ minText : "La fecha para este campo debe ser posterior a {0}",
+ maxText : "La fecha para este campo debe ser anterior a {0}",
+ invalidText : "{0} no es una fecha v\u00E1lida - debe tener el formato {1}",
+ format : "d/m/Y",
+ altFormats : "d/m/Y|d-m-y|d-m-Y|d/m|d-m|dm|dmy|dmY|d|Y-m-d",
+ startDay : 1
+ });
+}
+
+if(Ext.form.ComboBox){
+ Ext.apply(Ext.form.ComboBox.prototype, {
+ loadingText : "Cargando...",
+ valueNotFoundText : undefined
+ });
+}
+
+if(Ext.form.VTypes){
+ Ext.apply(Ext.form.VTypes, {
+ emailText : 'Este campo debe ser una direcci\u00F3n de correo electr\u00F3nico con el formato "usuario@dominio.com"',
+ urlText : 'Este campo debe ser una URL con el formato "http:/'+'/www.dominio.com"',
+ alphaText : 'Este campo s\u00F3lo debe contener letras y _',
+ alphanumText : 'Este campo s\u00F3lo debe contener letras, n\u00FAmeros y _'
+ });
+}
+
+if(Ext.form.HtmlEditor){
+ Ext.apply(Ext.form.HtmlEditor.prototype, {
+ createLinkText : "Por favor proporcione la URL para el enlace:",
+ buttonTips : {
+ bold : {
+ title: 'Negritas (Ctrl+B)',
+ text: 'Transforma el texto seleccionado en Negritas.',
+ cls: 'x-html-editor-tip'
+ },
+ italic : {
+ title: 'It\u00E1lica (Ctrl+I)',
+ text: 'Transforma el texto seleccionado en It\u00E1licas.',
+ cls: 'x-html-editor-tip'
+ },
+ underline : {
+ title: 'Subrayado (Ctrl+U)',
+ text: 'Subraya el texto seleccionado.',
+ cls: 'x-html-editor-tip'
+ },
+ increasefontsize : {
+ title: 'Aumentar la fuente',
+ text: 'Aumenta el tama\u00F1o de la fuente',
+ cls: 'x-html-editor-tip'
+ },
+ decreasefontsize : {
+ title: 'Reducir la fuente',
+ text: 'Reduce el tama\u00F1o de la fuente.',
+ cls: 'x-html-editor-tip'
+ },
+ backcolor : {
+ title: 'Color de fondo',
+ text: 'Modifica el color de fondo del texto seleccionado.',
+ cls: 'x-html-editor-tip'
+ },
+ forecolor : {
+ title: 'Color de la fuente',
+ text: 'Modifica el color del texto seleccionado.',
+ cls: 'x-html-editor-tip'
+ },
+ justifyleft : {
+ title: 'Alinear a la izquierda',
+ text: 'Alinea el texto a la izquierda.',
+ cls: 'x-html-editor-tip'
+ },
+ justifycenter : {
+ title: 'Centrar',
+ text: 'Centrar el texto.',
+ cls: 'x-html-editor-tip'
+ },
+ justifyright : {
+ title: 'Alinear a la derecha',
+ text: 'Alinea el texto a la derecha.',
+ cls: 'x-html-editor-tip'
+ },
+ insertunorderedlist : {
+ title: 'Lista de vi\u00F1etas',
+ text: 'Inicia una lista con vi\u00F1etas.',
+ cls: 'x-html-editor-tip'
+ },
+ insertorderedlist : {
+ title: 'Lista numerada',
+ text: 'Inicia una lista numerada.',
+ cls: 'x-html-editor-tip'
+ },
+ createlink : {
+ title: 'Enlace',
+ text: 'Inserta un enlace de hipertexto.',
+ cls: 'x-html-editor-tip'
+ },
+ sourceedit : {
+ title: 'C\u00F3digo Fuente',
+ text: 'Pasar al modo de edici\u00F3n de c\u00F3digo fuente.',
+ cls: 'x-html-editor-tip'
+ }
+ }
+ });
+}
+
+if(Ext.grid.GridView){
+ Ext.apply(Ext.grid.GridView.prototype, {
+ sortAscText : "Ordenar en forma ascendente",
+ sortDescText : "Ordenar en forma descendente",
+ columnsText : "Columnas"
+ });
+}
+
+if(Ext.grid.GroupingView){
+ Ext.apply(Ext.grid.GroupingView.prototype, {
+ emptyGroupText : '(Ninguno)',
+ groupByText : 'Agrupar por este campo',
+ showGroupsText : 'Mostrar en grupos'
+ });
+}
+
+if(Ext.grid.PropertyColumnModel){
+ Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
+ nameText : "Nombre",
+ valueText : "Valor",
+ dateFormat : "j/m/Y"
+ });
+}
+
+if(Ext.layout.BorderLayout && Ext.layout.BorderLayout.SplitRegion){
+ Ext.apply(Ext.layout.BorderLayout.SplitRegion.prototype, {
+ splitTip : "Arrastre para redimensionar.",
+ collapsibleSplitTip : "Arrastre para redimensionar. Doble clic para ocultar."
+ });
+}
+
+if(Ext.form.TimeField){
+ Ext.apply(Ext.form.TimeField.prototype, {
+ minText : "La hora en este campo debe ser igual o posterior a {0}",
+ maxText : "La hora en este campo debe ser igual o anterior a {0}",
+ invalidText : "{0} no es una hora v\u00E1lida",
+ format : "g:i A",
+ altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H"
+ });
+}
+
+if(Ext.form.CheckboxGroup){
+ Ext.apply(Ext.form.CheckboxGroup.prototype, {
+ blankText : "Debe seleccionar al menos un \u00E9tem de este grupo"
+ });
+}
+
+if(Ext.form.RadioGroup){
+ Ext.apply(Ext.form.RadioGroup.prototype, {
+ blankText : "Debe seleccionar un \u00E9tem de este grupo"
+ });
+}
diff --git a/scm-webapp/src/main/webapp/resources/js/i18n/es.js b/scm-webapp/src/main/webapp/resources/js/i18n/es.js
new file mode 100644
index 0000000000..15460c2fec
--- /dev/null
+++ b/scm-webapp/src/main/webapp/resources/js/i18n/es.js
@@ -0,0 +1,668 @@
+/*
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+if (Ext.form.VTypes) {
+
+ Ext.override(Ext.form.VTypes, {
+ // sonia.config.js
+ pluginurlText: 'Este campo debe ser una URL. Formato: \n\
+ "http://plugins.scm-manager.org/scm-plugin-backend/api/{version}/plugins?os={os}&arch={arch}&snapshot=false"',
+ passwordText: '¡Las contraseñas no coinciden!',
+ nameTest: 'El nombre no es válido.',
+ usernameText: 'El nombre de usuario no es válido.',
+ repositoryNameText: 'El nombre del repositorio no es válido.'
+ });
+
+}
+
+// sonia.util.js
+
+if (Ext.util.Format) {
+
+ Ext.apply(Ext.util.Format, {
+ timeAgoJustNow: 'Ahora',
+ timeAgoOneMinuteAgo: 'Hace un minuto',
+ timeAgoOneMinuteFromNow: 'Dentro de un minuto',
+ timeAgoMinutes: 'Minutos',
+ timeAgoOneHourAgo: 'Hace una hora',
+ timeAgoOneHourFromNow: 'Dentro de una hora',
+ timeAgoHours: 'Horas',
+ timeAgoYesterday: 'Ayer',
+ timeAgoTomorrow: 'Mañana',
+ timeAgoDays: 'Días',
+ timeAgoLastWeek: 'La semana pasada',
+ timeAgoNextWeek: 'La próxima semana',
+ timeAgoWeeks: 'Semanas',
+ timeAgoLastMonth: 'El mes pasado',
+ timeAgoNextMonth: 'El próximo mes',
+ timeAgoMonths: 'Meses',
+ timeAgoLastYear: 'El año pasado',
+ timeAgoNextYear: 'El próximo año',
+ timeAgoYears: 'Años',
+ timeAgoLastCentury: 'El siglo pasado',
+ timeAgoNextCentury: 'El próximo siglo',
+ timeAgoCenturies: 'Siglos'
+ });
+
+}
+
+// sonia.login.js
+
+if (Sonia.login.Form) {
+
+ Ext.override(Sonia.login.Form, {
+ usernameText: 'Nombre de usuario',
+ passwordText: 'Contraseña',
+ loginText: 'Iniciar sesión',
+ cancelText: 'Cancelar',
+ waitTitleText: 'Conectando',
+ WaitMsgText: 'Enviando datos...',
+ failedMsgText: '¡Error de acceso!',
+ failedDescriptionText: 'O el nombre de usuario o la contraseña son incorrectos o usted \n\
+ no tiene suficientes permisos. Por favor inténtelo de nuevo.',
+ accountLockedText: 'La cuenta está bloqueada.',
+ accountTemporaryLockedText: 'En este momento la cuenta está bloqueada. \n\
+ Inténtelo más tarde.',
+ rememberMeText: 'Recuérdame'
+ });
+
+}
+
+if (Sonia.login.Window) {
+
+ Ext.override(Sonia.login.Window, {
+ titleText: 'Iniciar sesión'
+ });
+
+}
+
+// sonia.rest.js
+
+if (Sonia.rest.JsonStore) {
+
+ Ext.override(Sonia.rest.JsonStore, {
+ errorTitleText: 'Error',
+ errorMsgText: 'No se pudieron cargar los datos. Estado del servidor: {0}'
+ });
+
+}
+
+if (Sonia.rest.Grid) {
+
+ Ext.override(Sonia.rest.Grid, {
+ emptyText: 'No se encontraron datos.'
+ });
+
+}
+
+if (Sonia.rest.FormPanel) {
+
+ Ext.override(Sonia.rest.FormPanel, {
+ okText: 'Aceptar',
+ cancelText: 'Cancelar',
+ addText: 'Añadir',
+ removeText: 'Eliminar'
+ });
+
+}
+
+if (Sonia.repository.ChangesetPanel) {
+
+ Ext.apply(Sonia.repository.ChangesetPanel, {
+ diffLabel: 'Diferenciar',
+ rawDiffLabel: 'Fichero de diferencias'
+ });
+
+}
+
+// sonia.repository.js
+
+if (Sonia.repository.DefaultPanel) {
+
+ Ext.apply(Sonia.repository.DefaultPanel, {
+ title: 'Repositorio',
+ html: 'Añada o seleccione un repositorio'
+ });
+
+}
+
+if (Sonia.repository.Grid) {
+
+ Ext.override(Sonia.repository.Grid, {
+ colNameText: 'Nombre',
+ colTypeText: 'Tipo',
+ colContactText: 'Contacto',
+ colDescriptionText: 'Descripción',
+ colCreationDateText: 'Fecha de creación',
+ colUrlText: 'URL',
+ colArchiveText: 'Archivo',
+ emptyText: 'El repositorio no está configurado',
+ formTitleText: 'Repositorio',
+ unknownType: 'Desconocido'
+ });
+
+}
+
+if (Sonia.repository.FormPanel) {
+
+ Ext.override(Sonia.repository.FormPanel, {
+ colGroupPermissionText: 'Es un grupo',
+ colNameText: 'Nombre',
+ colTypeText: 'Tipo',
+ formTitleText: 'Ajustes',
+ nameText: 'Nombre',
+ typeText: 'Tipo',
+ contactText: 'Contacto',
+ descriptionText: 'Descripción',
+ publicText: 'Público',
+ permissionText: 'Permisos',
+ errorTitleText: 'Error',
+ updateErrorMsgText: 'Error al actualizar el repositorio',
+ createErrorMsgText: 'Error el crear el repositorio',
+ // help
+ nameHelpText: 'El nombre del repositorio. Este nombre es parte de la URL del repositorio.',
+ typeHelpText: 'El tipo del repositorio (por ejemplo, Mercurial, Git o Subversion).',
+ contactHelpText: 'La dirección de correo electrónico de la persona responsable del repositorio.',
+ descriptionHelpText: 'Una breve descripción del repositorio.',
+ publicHelpText: 'Un repositorio público puede ser leído por cualquier persona.',
+ permissionHelpText: 'Los permisos de gestión para un usuario o un grupo específico.
\n\
+ Permisos:
READ = lectura
WRITE = lectura y escritura
\n\
+ OWNER = lectura, escritura y gestión de propiedades y permisos'
+ });
+
+}
+
+if (Sonia.repository.Panel) {
+
+ Ext.override(Sonia.repository.Panel, {
+ titleText: 'Repositorio',
+ filterText: 'Filtrar: ',
+ searchText: 'Buscar: ',
+ archiveText: 'Archivar',
+ unarchiveText: 'Restaurar',
+ archiveTitleText: 'Archivar el repositorio',
+ unarchiveTitleText: 'Restaurar el repositorio',
+ archiveMsgText: '¿Archivar el repositorio "{0}"?',
+ unarchiveMsgText: '¿Restaurar el repositorio "{0}"?',
+ errorArchiveMsgText: 'Error al archivar el repositorio.',
+ errorUnarchiveMsgText: 'Error al restaurar el repositorio.',
+ displayArchivedRepositoriesText: 'Archivo',
+ emptyText: 'Añada o seleccione un repositorio',
+ removeTitleText: 'Eliminar el repositorio',
+ removeMsgText: 'Eliminar el repositorio "{0}"?',
+ errorTitleText: 'Error',
+ errorMsgText: 'Error al eliminar el repositorio'
+ });
+
+}
+
+if (Sonia.repository.PermissionFormPanel) {
+
+ Ext.override(Sonia.repository.PermissionFormPanel, {
+ titleText: 'Permisos'
+ });
+
+}
+
+if (Sonia.repository.ChangesetViewerPanel) {
+
+ Ext.override(Sonia.repository.ChangesetViewerPanel, {
+ // spanish ??
+ changesetViewerTitleText: 'Commits {0}' //Confirmaciones
+ });
+
+}
+
+if (Sonia.repository.InfoPanel) {
+
+ Ext.override(Sonia.repository.InfoPanel, {
+ nameText: 'Nombre: ',
+ typeText: 'Tipo: ',
+ contactText: 'Contacto: ',
+ urlText: 'URL: ',
+ // spanish ??
+ changesetViewerText: 'Commits', //Confirmaciones
+ accessText: 'Acceso:',
+ accessReadOnly: 'Acceso de solo lectura',
+ accessReadWrite: 'Acceso de lectura y escritura'
+ });
+
+}
+
+if (Sonia.repository.ExtendedInfoPanel) {
+
+ Ext.override(Sonia.repository.ExtendedInfoPanel, {
+ // spanish ??
+ checkoutText: 'Checkout: ', //Obtener
+ repositoryBrowserText: 'Código fuente'
+ });
+
+}
+
+if (Sonia.repository.RepositoryBrowser) {
+
+ Ext.override(Sonia.repository.RepositoryBrowser, {
+ repositoryBrowserTitleText: 'Código fuente {0}',
+ emptyText: 'Este directorio está vacio',
+ colNameText: 'Nombre',
+ colLengthText: 'Longitud',
+ colLastModifiedText: 'Última modificación',
+ colDescriptionText: 'Descripción'
+ });
+
+}
+
+if (Sonia.repository.ChangesetViewerGrid) {
+
+ Ext.override(Sonia.repository.ChangesetViewerGrid, {
+ // spanish ??
+ emptyText: 'No hay commits disponibles' //confirmaciones
+ });
+
+}
+
+if (Sonia.repository.ImportWindow) {
+
+ Ext.override(Sonia.repository.ImportWindow, {
+ titleText: 'Importar repositorios',
+ okText: 'Aceptar',
+ closeText: 'Cerrar'
+ });
+
+}
+
+// sonia.config.js
+
+if (Sonia.config.ScmConfigPanel) {
+
+ Ext.override(Sonia.config.ScmConfigPanel, {
+ titleText: 'Ajustes generales',
+ servnameText: 'Nombre del servidor',
+ dateFormatText: 'Formato de la fecha',
+ enableForwardingText: 'Habilitar el reenvío (mod_proxy)',
+ forwardPortText: 'Puerto para el reenvío',
+ pluginRepositoryText: 'Repositorio de plugins',
+ allowAnonymousAccessText: 'Permitir el acceso anónimo',
+ enableSSLText: 'Activar SSL',
+ sslPortText: 'Puerto SSL',
+ adminGroupsText: 'Grupos de administradores',
+ adminUsersText: 'Usuarios administradores',
+ enableProxyText: 'Activar proxy',
+ proxyServerText: 'Servidor proxy',
+ proxyPortText: 'Puerto para el proxy',
+ proxyUserText: 'Usuario para el proxy',
+ proxyPasswordText: 'Contraseña para el proxy',
+ proxyExcludesText: 'Excepciones para el proxy',
+ baseUrlText: 'URL base',
+ forceBaseUrlText: 'Forzar a URL base',
+ disableGroupingGridText: 'Desactivar la agrupación de repositorios',
+ enableRepositoryArchiveText: 'Habilitar el archivado de repositorios',
+ submitText: 'Enviando ...',
+ loadingText: 'Cargando ...',
+ errorTitleText: 'Error',
+ errorMsgText: 'No se pudo cargar la configuración.',
+ errorSubmitMsgText: 'No se pudo enviar la configuración.',
+ loginAttemptLimitText: 'Intentos de inicio de sesión fallidos',
+ loginAttemptLimitTimeoutText: 'Tiempo de espera para inicio de sesión',
+ // help
+ servernameHelpText: 'El nombre de este servidor. Este nombre será parte de la URL del repositorio.',
+ dateFormatHelpText: 'Formato de la fecha. Por favor, eche un vistazo a\n\
+ http://momentjs.com/docs/#/displaying/format/.',
+ pluginRepositoryHelpText: 'La URL del repositorio de plugins.
Descripción de los {comodines}:\n\
+
version = Versión de SCM-Manager
os = Sistema Operativo
arch = Arquitectura',
+ enableForwardingHelpText: 'Habilitar el reenvío de puerto de Apache mod_proxy.',
+ forwardPortHelpText: 'El puerto para el reenvío de puerto de Apache mod_proxy.',
+ allowAnonymousAccessHelpText: 'Los usuarios anónimos pueden leer los repositorios públicos.',
+ enableSSLHelpText: 'Habilitar conexiones seguras a través de HTTPS.',
+ sslPortHelpText: 'El puerto SSL.',
+ adminGroupsHelpText: 'Lista de grupos con derechos de administrador separados por comas.',
+ adminUsersHelpText: 'Lista de usuarios con derechos de administrador separados por comas.',
+ loginAttemptLimitHelpText: 'El número máximo de inicios de sesión fallidos. Un valor de -1 desactiva el límite.',
+ loginAttemptLimitTimeoutHelpText: 'El tiempo, en segundos, que un usuario será bloqueado temporalmente debido a muchos intentos fallidos de inicio de sesión.',
+ enableProxyHelpText: 'Usar la configuración del proxy.',
+ proxyServerHelpText: 'El servidor proxy.',
+ proxyPortHelpText: 'El puerto para el proxy',
+ proxyUserHelpText: 'El nombre de usuario para la autenticación en el servidor proxy.',
+ proxyPasswordHelpText: 'La contraseña del usuario para la autenticación en el servidor proxy.',
+ proxyExcludesHelpText: 'Una lista separada por comas de los patrones globales de nombre de servidor que serán excluidos de la configuración del proxy',
+ baseUrlHelpText: 'La URL completa del servidor, incluyendo el contexto, por ejemplo: http://localhost:8080/scm.',
+ forceBaseUrlHelpText: 'Redirige a la URL base si la solicitud proviene de otra URL.',
+ disableGroupingGridHelpText: 'Desactiva la agrupación de repositorios. Si se cambia este valor, la página se tiene que volver a cargar.',
+ enableRepositoryArchiveHelpText: 'Habilita el archivado de repositorios. Si se cambia este valor, la página se tiene que volver a cargar.'
+ });
+
+}
+
+if (Sonia.config.ConfigForm) {
+
+ Ext.override(Sonia.config.ConfigForm, {
+ title: 'Configuración',
+ saveButtonText: 'Guardar',
+ resetButtontext: 'Reestablecer',
+ submitText: 'Enviando ...',
+ loadingText: 'Cargando ...',
+ failedText: 'Se ha producido un error desconocido.'
+ });
+
+}
+
+// sonia.user.js
+
+if (Sonia.user.DefaultPanel) {
+
+ Ext.apply(Sonia.user.DefaultPanel, {
+ title: 'Usuario',
+ html: 'Añada o seleccione un usuario.'
+ });
+
+}
+
+if (Sonia.user.Grid) {
+
+ Ext.override(Sonia.user.Grid, {
+ titleText: 'Usuario',
+ colNameText: 'Nombre',
+ colDisplayNameText: 'Mostrar nombre',
+ colMailText: 'Correo electrónico',
+ colActiveText: 'Activo',
+ colAdminText: 'Administrador',
+ colCreationDateText: 'Fecha de creación',
+ colLastModifiedText: 'Última modificación',
+ colTypeText: 'Tipo'
+ });
+
+}
+
+if (Sonia.user.FormPanel) {
+
+ Ext.override(Sonia.user.FormPanel, {
+ nameText: 'Nombre',
+ displayNameText: 'Mostrar nombre',
+ mailText: 'Correo electrónico',
+ passwordText: 'Contraseña',
+ adminText: 'Administrador',
+ activeText: 'Activo',
+ errorTitleText: 'Error',
+ updateErrorMsgText: 'No se ha podido actualizar el usuario',
+ createErrorMsgText: 'No se ha podido crear el usuario',
+ passwordMinLengthText: 'La contraseña debe tener al menos 6 caracteres',
+ // help
+ usernameHelpText: 'Nombre único de usuario.',
+ displayNameHelpText: 'Muestra el nombre del usuario.',
+ mailHelpText: 'Dirección de correo electrónico del usuario.',
+ passwordHelpText: 'Contraseña en texto plano del usuario.',
+ passwordConfirmHelpText: 'Repita la contraseña para la validación.',
+ adminHelpText: 'Un administrador puede crear, editar y borrar repositorios, grupos y usuarios.',
+ activeHelpText: 'Activa o desactiva el usuario.'
+ });
+
+}
+
+if (Sonia.user.Panel) {
+
+ Ext.override(Sonia.user.Panel, {
+ titleText: 'Usuario',
+ emptyText: 'Añada o seleccione un usuario',
+ removeTitleText: 'Eliminar usuario',
+ removeMsgText: '¿Eliminar el usuario "{0}"?',
+ showOnlyActiveText: 'Mostrar solo activos: ',
+ errorTitleText: 'Error',
+ errorMsgText: 'No se ha podido eliminar el usuario'
+ });
+
+}
+
+
+// sonia.group.js
+
+if (Sonia.group.DefaultPanel) {
+
+ Ext.apply(Sonia.group.DefaultPanel, {
+ title: 'Grupo',
+ html: 'Añada o seleccione un grupo'
+ });
+
+}
+
+if (Sonia.group.Grid) {
+
+ Ext.override(Sonia.group.Grid, {
+ colNameText: 'Nombre',
+ colDescriptionText: 'Descripción',
+ colMembersText: 'Miembros',
+ colCreationDateText: 'Fecha de creación',
+ colTypeText: 'Tipo',
+ emptyGroupStoreText: 'El grupo no está configurado.',
+ groupFormTitleText: 'Grupo'
+ });
+
+}
+
+if (Sonia.group.FormPanel) {
+
+ Ext.override(Sonia.group.FormPanel, {
+ colMemberText: 'Miembro',
+ titleText: 'Ajustes',
+ nameText: 'Nombre',
+ descriptionText: 'Descripción',
+ membersText: 'Miembros',
+ errorTitleText: 'Error',
+ updateErrorMsgText: 'No se pudo actualizar el grupo',
+ createErrorMsgText: 'No se pudo crear el grupo',
+ // help
+ nameHelpText: 'Nombre único del grupo.',
+ descriptionHelpText: 'Una breve descripción del grupo.',
+ membersHelpText: 'Nombres de usuario de los miembros del grupo.'
+ });
+
+}
+
+if (Sonia.group.Panel) {
+
+ Ext.override(Sonia.group.Panel, {
+ titleText: 'Grupo',
+ emptyText: 'Añada o seleccione un grupo',
+ removeTitleText: 'Eliminar grupo',
+ removeMsgText: '¿Eliminar el grupo "{0}"?',
+ errorTitleText: 'Error',
+ errorMsgText: 'No se pudo eliminar el grupo.'
+ });
+
+}
+
+// sonia.action.js
+
+if (Sonia.action.ChangePasswordWindow) {
+
+ Ext.override(Sonia.action.ChangePasswordWindow, {
+ titleText: 'Cambiar contraseña',
+ oldPasswordText: 'Clave antigua', // Better 'Contraseña antigua' change dialog size
+ newPasswordText: 'Clave nueva', // Better 'Contraseña nueva' change dialog size
+ confirmPasswordText: 'Confirma clave', // Better 'Confirma clave' change dialog size
+ okText: 'Aceptar',
+ cancelText: 'Cancelar',
+ connectingText: 'Conectando',
+ failedText: '¡No se pudo cambiar la contraseña!',
+ waitMsgText: 'Enviando datos ...'
+ });
+
+}
+
+if (Sonia.action.ExceptionWindow) {
+
+ // ??
+ Ext.override(Sonia.action.ExceptionWindow, {
+ okText: 'Aceptar',
+ detailsText: 'Detalles',
+ exceptionText: 'Excepción'
+ });
+
+}
+
+// sonia.plugin.js
+
+if (Sonia.plugin.Center) {
+
+ Ext.override(Sonia.plugin.Center, {
+ waitTitleText: 'Por favor espere',
+ errorTitleText: 'Error',
+ restartText: 'Reinicie el servidor para activar el pugin.',
+ installWaitMsgText: 'Instalando el plugin.',
+ installSuccessText: 'Instalación correcta',
+ installFailedText: 'La instalación falló',
+ uninstallWaitMsgText: 'Desinstalando el plugin.',
+ uninstallSuccessText: 'Desinstalación correcta',
+ uninstallFailedText: 'La desinstalación falló',
+ updateWaitMsgText: 'Actualizando el plugin.',
+ updateSuccessText: 'Actualización correcta',
+ updateFailedText: 'La actualización falló'
+
+ /*
+ Better:
+
+ installSuccessText: 'El plugin se instaló correctamente',
+ installFailedText: 'La instalación del plugin ha fallado',
+
+ uninstallSuccessText: 'El plugin se desinstaló correctamente',
+ uninstallFailedText: 'La desinstalación del plugin ha fallado',
+
+ updateSuccessText: 'El plugin se actualizó correctamente',
+ updateFailedText: 'La actualización del plugin ha fallado'
+
+ But needed change dialog size
+ */
+ });
+
+}
+
+if (Sonia.plugin.Grid) {
+
+ Ext.override(Sonia.plugin.Grid, {
+ colNameText: 'Nombre',
+ colAuthorText: 'Autor',
+ colDescriptionText: 'Descripción',
+ colVersionText: 'Versión',
+ colActionText: 'Acción',
+ colUrlText: 'URL',
+ colCategoryText: 'Categoría',
+ emptyText: 'No hay plugins disponibles.',
+ btnReload: 'Actualizar',
+ btnInstallPackage: 'Instalar paquete',
+ uploadWindowTitle: 'Cargar paquete de plugins'
+ });
+
+}
+
+if (Sonia.plugin.UploadForm) {
+
+ Ext.override(Sonia.plugin.UploadForm, {
+ emptyText: 'Seleccione un paquete de plugins',
+ uploadFieldLabel: 'Paquete',
+ waitMsg: 'Cargando el paquete ...',
+ btnUpload: 'Cargar',
+ btnReset: 'Limpiar'
+ });
+
+}
+
+// sonia.scm.js
+
+if (Sonia.scm.Main) {
+
+ Ext.override(Sonia.scm.Main, {
+ tabRepositoriesText: 'Repositorios',
+ navChangePasswordText: 'Cambiar contraseña',
+ sectionMainText: 'Principal',
+ sectionSecurityText: 'Seguridad',
+ navRepositoriesText: 'Repositorios',
+ sectionConfigText: 'Configuración',
+ navGeneralConfigText: 'General',
+ tabGeneralConfigText: 'Configuración general',
+ navRepositoryTypesText: 'Repositorios',
+ navImportRepositoriesText: 'Importar repositorios',
+ tabRepositoryTypesText: 'Configuración de repositorios',
+ navPluginsText: 'Plugins',
+ tabPluginsText: 'Configuración de plugins',
+ navUsersText: 'Usuarios',
+ tabUsersText: 'Usuarios',
+ navGroupsText: 'Grupos',
+ tabGroupsText: 'Grupos',
+ sectionLoginText: 'Iniciar sesión',
+ navLoginText: 'Iniciar sesión',
+ sectionLogoutText: 'Cerrar sesión',
+ navLogoutText: 'Cerrar sesión',
+ logoutFailedText: '¡Ha ocurrido un error al salir!',
+ errorTitle: 'Error',
+ errorMessage: 'Se ha producido un error desconocido.',
+ errorSessionExpiredTitle: 'Sesión expirada',
+ errorSessionExpiredMessage: 'Su sesión ha expirado. Por favor, inicie sesión de nuevo.',
+ errorNoPermissionsTitle: 'Sin permiso',
+ errorNoPermissionsMessage: 'Usted no tiene permiso para realizar esta acción.',
+ errorNotFoundTitle: 'No encontrado',
+ errorNotFoundMessage: 'El recurso no se pudo encontrar.',
+ loggedInTextTemplate: 'conectado como {state.user.name} - ',
+ userInfoMailText: 'Correo electrónico',
+ userInfoGroupsText: 'Grupos'
+ });
+
+}
+
+if (Sonia.panel.SyntaxHighlighterPanel) {
+
+ Ext.override(Sonia.panel.SyntaxHighlighterPanel, {
+ loadErrorTitleText: 'Error',
+ loadErrorMsgText: 'No se pudo cargar el fichero'
+ });
+
+}
+
+
+if (Sonia.rest.Panel) {
+
+ Ext.override(Sonia.rest.Panel, {
+ addText: 'Añadir',
+ removeText: 'Eliminar',
+ reloadText: 'Actualizar'
+ });
+
+}
+
+// sonia.security.permissionspanel.js
+if (Sonia.security.PermissionsPanel) {
+
+ Ext.override(Sonia.security.PermissionsPanel, {
+ addText: 'Añadir',
+ removeText: 'Eliminar',
+ reloadText: 'Actualizar',
+ titleText: 'Permisos'
+ });
+
+}
\ No newline at end of file