From 7f72992d06c14c1517c9b207aa0eae70da8adcc4 Mon Sep 17 00:00:00 2001
From: foramontano <64919325+foramontano@users.noreply.github.com>
Date: Wed, 9 Sep 2020 16:05:55 +0200
Subject: [PATCH] Foramontano/adding languages (#89)

- Doc that describes the steps to add a new language  to Spacedeck Open
- New file with translated entries for using in Spacedeck Open in Spanish
- Include 'es' as new locale in Spacedeck Open
- Include a radiobutton for users could select the new language
---
 docs/adding_languages.md    |  26 +++
 locales/es.js               | 324 ++++++++++++++++++++++++++++++++++++
 spacedeck.js                |   2 +-
 views/partials/account.html |   3 +
 views/spacedeck.html        |   2 +
 5 files changed, 356 insertions(+), 1 deletion(-)
 create mode 100644 docs/adding_languages.md
 create mode 100644 locales/es.js

diff --git a/docs/adding_languages.md b/docs/adding_languages.md
new file mode 100644
index 0000000..5972973
--- /dev/null
+++ b/docs/adding_languages.md
@@ -0,0 +1,26 @@
+## Adding a new language to Spacedeck Open
+
+To add a new language to Spacedeck Open, follow these steps:
+
+*The steps are ilustrated with Spanish (locale 'es') as the new language*
+
+- Include the new locale ('es') at the locale list (./spacedeck.js)
+```
+    locales: ["en",..., "es"],
+```
+- Create the new translation file (/locales/**es.js** thar it's a copy of /locales/en.js). and translate the entries.
+- Include the javascript for letting Spanish info accesible (at the end of /views/spacedeck.html)
+
+  ```
+    ...
+    window.locales.es = {};
+    ...
+    window.locales.es.translation = {% include "./../locales/es.js" %};
+  </script>
+  ```
+- Include a radiobutton for users could seleect the new language (/views/partials/account.html)
+  ```
+    <label class="radio" v-bind:class="{checked: user.prefs_language=='es'}" v-on:click="save_user_language('es')">
+      <input type="radio" id="user-preferences_language" name="language" value="es"><span>Español</span>
+    </label>
+  ```
diff --git a/locales/es.js b/locales/es.js
new file mode 100644
index 0000000..b51ebf6
--- /dev/null
+++ b/locales/es.js
@@ -0,0 +1,324 @@
+{
+	"ok": "OK",
+	"cancel": "Cancelar",
+	"close": "Cerrar",
+	"open": "Abrir",
+	"folder": "Directorio",
+	"save": "Salvar",
+	"saved": "Salvado",
+	"created": "creado",
+	"duplicate": "Duplicar",
+	"delete": "Borrar",
+	"remove": "Eliminar",
+	"set": "ajustar",
+	"reset": "reiniciar",
+	"thanks": "Gracias",
+	"share": "Compartir",
+	"signup": "Regístrate",
+	"login": "Iniciar sesión",
+	"logout": "Cerrar sesión",
+	"email": "Correo Electrónico",
+	"password": "Contraseña",
+	"width": "Anchura",
+	"height": "Altura",
+	"nick": "Nombre",
+	"role": "Rol",
+	"members": "Miembros",
+	"actions": "Acciones",
+	"or": "o",
+	"you": "tú",
+	"via": "via",
+	"by": "por",
+	"zero": "Cero",
+	"page": "Página",
+	"new": "Nuevo",
+	"copy": "Copiar",
+	"home": "Inicio",
+	"owner": "Propietario",
+	"space": "Espacio",
+	"second": "Segundo",
+	"not_found": "No encontrado.",
+	"untitled_space": "Espacio sin título",
+	"untitled_folder": "Directorio sin título",
+	"untitled": "sin título",
+	"sure": "Está seguro?",
+	"specify": "Por favor, Especifica",
+	"confirm": "Por favor, Confirma",
+	"error_unknown_email": "Esta combinación correo electrónico/contraseña no es conocida.",
+	"error_password_confirmation": "La contraseña introducida no coincide.",
+	"error_domain_blocked": "Tu dominio está bloqueado.",
+	"error_user_email_already_used": "Esta dirección de correo electrónico ya se está usando.",
+	"support": "Soporte para Spacedeck",
+	"offline": "Offline. Clica para más.",
+	"error": "Lo siento, pero algo salió mal. Por favor, contacta con support@spacedeck.com",
+	"welcome": "Bienvenido",
+	"claim": "Tu Pizarra digital.",
+	"trynow": "Inténtalo ahora.",
+	"about": "Sobre nosotros.",
+	"terms": "Términos",
+	"contact": "Contacto",
+	"privacy": "Privacidad",
+	"business_adress": "Dirección de Negocios",
+	"post_adress": "Dirección postal",
+	"phone": "Teléfono",
+	"ceo": "Director gerente",
+	"name": "Nombre",
+	"confirm_subject": "Correo electrónico de confirmación de Spacedeck",
+	"confirm_body": "Gracias por iniciar sesión en Spacedeck.\nPor favor, clica en el siguiente enlace para confirmar tu dirección de correo electrónico.\n",
+	"confirm_action": "Confirmar Ahora",
+	"team_invite_membership_subject": "Inivitación de equipo para %s",
+	"team_invite_membership_body": "Has sido invitado a %s en Spacedeck. Por favor, clica en el siguiente enlace para aceptar la invitación.",
+	"team_invite_user_body": "Has sido invitado a %s en Spacedeck.\nTu contraseña temporal es \"%s\".\nPor favor, clica en el siguiente enlace para aceptar la invitación.",
+	"team_invite_admin_body": "%s fue invitado tu equipo: %s. La contraseña temporal es \"%s\".",
+	"team_invite_membership_acction": "Aceptar",
+	"team_new_member_subject": "Un nuevo Miembro para el Equipo %s se ha registrado",
+	"team_new_member_body": "%s se acaba de unir al Equipo %s en Spacedeck.",
+	"space_invite_membership_subject": "%s te invitó al Espacio %s ",
+	"space_invite_membership_body": "Has sido invitado por %s para unirte al Espacio %s en Spacedeck. Por favor, clica en el siguiente enlace para aceptar la invitación.",
+	"space_invite_membership_action": "Aceptar",
+	"folder_invite_membership_subject": "Espacio",
+	"folder_invite_membership_body": "Has sido invitado a un Equipo en Spacedeck. Por favor, clica en el siguiente enlace para aceptar la invitación.",
+	"folder_invite_membership_acction": "Aceptar",
+	"login_google": "Iniciar sesión con Google",
+	"save_changes": "Salvar Cambios",
+	"upgrade": "Mejorar",
+	"upgrade_now": "Mejorar ahora",
+	"create_space": "Crear Espacio",
+	"create_folder": "Crear Directorio",
+	"email_unconfirmed": "Correo electrónico no confirmado",
+	"confirmation_sent": "Correo electrónico enviado",
+	"folder_filter": "Filtro",
+	"sort_by": "Ordenar por",
+	"last_modified": "Última Modificación",
+	"last_opened": "Última Apertura",
+	"title": "Título",
+	"edit_team": "Editar Equipo",
+	"edit_account": "Edit Cuenta",
+	"log_out": "Cerrar Sesión",
+	"no_spaces_yet": "¡Bienvenido! Puedes crear Espacios y Directorios aquí utilizando los botones que se encuentran en la esquina superior izquierda.",
+	"new_folder_title": "Nuevo título para el directorio",
+	"folder_settings": "Ajustes de Directorio",
+	"upload_cover_image": "Cargar imagen de cubierta",
+	"spacedeck_pro_ad_folders": "Con Spacedeck Pro, puedes organizar un ilimitado número de Espacios y Directorios, y gestionar el control de acceso para cada Directorio. ¿Te gustaría aprender más sobre las características Pro?",
+	"spacedeck_pro_ad_versions": "Con Spacedeck Pro, puedes organizar un ilimitado número de versiones para cada Espacio así como realizar un seguimiento de su progreso o mantener instantáneas ('snapshots') seguras. ¿Te gustaría aprender más sobre las características Pro?",
+	"spacedeck_pro_ad_pdf": "Con Spacedeck Pro, puedes exportar tus Espacios como PDFs para su archivo, envío por correo, o impresión. ¿Te gustaría aprender más sobre las características Pro?",
+	"spacedeck_pro_ad_zip": "Con Spacedeck Pro, puedes exportar los contenidos de un Espacio empaquetado como un fichero ZIP. ¿Te gustaría aprender más sobre las características Pro?",
+	"spacedeck_pro_ad_colors": "Con Spacedeck Pro, puedes puedes usar tus propios colores usando un selector de color profesional.",
+	"profile_caption": "Perfil",
+	"upload_avatar": "Cardar Avatar",
+	"uploading_avatar": "Cargando Avatar…",
+	"avatar_dimensions": "Dimensiones recomendadas: 200×200 pixels.",
+	"profile_name": "Nombre",
+	"profile_email": "Dirección de correo electrónico",
+	"send_again": "Enviar de nuevo",
+	"confirmation_sent_long": "Correo electrónico con enlace de confirmación enviado. Por favor, revisa tu bandeja de entrada de Correo.",
+	"confirmation_sent_another": "Otro enlace de confirmación enviado.",
+	"confirmation_sent_dialog_text": "Te hemos enviado un correo explicando como confirmar tu dirección de correo electrónico.",
+	"payment_caption": "Pago",
+	"language_caption": "Idioma",
+	"notifications_caption": "Notificaciones",
+	"notifications_option_chat": "Infórmame via correo electrónico sobre nuevos cometarios",
+	"notifications_option_spaces": "Envíame un resumen diario de lo que sucedió en mis Espacios y Directorios.",
+	"password_caption": "Contraseña",
+	"current_password": "Contraseña Actual",
+	"new_password": "Nueva Contraseña",
+	"verify_password": "Verificar Contraseña",
+	"change_password": "Cambiar Contraseña",
+	"reset_password": "Reiniciar Contraseña",
+	"terminate_caption": "Borrar Cuenta",
+	"terminate_warning": "Si borras tu cuenta, todos los Espacios, Directorios y Mensajes (incluyendo todo el contenido que tú y otras personas crearon en tus Espacios) serán destruidos.",
+	"terminate_warning2": "Esta acción no puede deshacerse.",
+	"terminate_reason": "Mensaje",
+	"terminate_reason_caption": "Ayúdannos a mejorar compartiendo las razones por las que cancelas la cuenta.",
+	"terminate_terminate": "Terminar",
+	"space_blank1": "¡Bienvenido a un nuevo Espacio en blanco!",
+	"space_blank2": "Suelta ficheros, pega enlaces",
+	"space_blank3": "o utilizar las herramientas que aparecen abajo",
+	"space_blank4": "para rellenar este Espacio con contenido.",
+	"draft": "Borrador",
+	"publish": "Publicar",
+	"published": "Publicado",
+	"save_version": "Salvar Versión",
+	"version_saved": "Versión Salvada",
+	"post": "Publicar mensaje",
+	"chat_invite_cta1": "¡La Collaboración es divertida!",
+	"chat_invite_cta2": "¿Por qué no ",
+	"chat_invite_cta3": "invitar a algunas personas",
+	"chat_invite_cta4": "a trabajar contigo?",
+	"chat_message_placeholder": "Escribe tu mensaje…",
+	"view": "Ver",
+	"edit": "Editar",
+	"present": "Presentar",
+	"chat": "Chatear",
+	"meta": "Metadatos",
+	"tool_search": "Buscar",
+	"tool_upload": "Cargar",
+	"tool_text": "Texto",
+	"tool_shape": "Dar forma",
+	"tool_zones": "Zonas",
+	"tool_canvas": "Fondo pizarra",
+	"search_media": "Buscar multimedia…",
+	"type_here": "Escriba aquí",
+	"text_formats": "Formatos",
+	"format_p": "Párrafos",
+	"format_bullets": "Lista con 'Bullets'",
+	"format_numbers": "Lista Numérica",
+	"format_h1": "Titular 1",
+	"format_h2": "Titular 2",
+	"format_h3": "Titular 3",
+	"font_size": "Tamaño de Fuente",
+	"line_height": "Altura de la Línea",
+	"tool_align": "Alinear",
+	"tool_styles": "Estilos",
+	"tool_bullets": "'Bullets'",
+	"tool_numbers": "Números",
+	"color_fill": "Rellenar",
+	"color_stroke": "Trazo",
+	"color_text": "Texto",
+	"tool_type": "Tipo",
+	"tool_box": "Caja",
+	"tool_link": "Enlace",
+	"tool_layout": "Disposición",
+	"tool_options": "Opciones",
+	"tool_stroke": "Trazar",
+	"tool_delete": "Borrar",
+	"tool_lock": "Bloquear",
+	"tool_copy": "Copiar",
+	"stack": "Apilar",
+	"tool_circle": "Círculo",
+	"tool_hexagon": "Hexágono",
+	"tool_square": "Cuadrado",
+	"tool_diamond": "Diamante",
+	"tool_bubble": "Burbuja",
+	"tool_cloud": "Nube",
+	"tool_burst": "Ráfaga",
+	"tool_star": "Estrella",
+	"tool_heart": "Corazón",
+	"tool_scribble": "Garabatear",
+	"tool_line": "Líneas",
+	"tool_arrow": "Flecha",
+	"search_media_placeholder": "Buscar multimedia en web…",
+	"add_zone": "Nueva Zona",
+	"palette": "Paleta",
+	"picker": "Selector",
+	"background_image_caption": "Imagen",
+	"background_color_caption": "Color",
+	"upload_background_caption": "Clica para cargar una imagen de fondo",
+	"upload_background": "Cargar Fundo",
+	"access_caption": "Acceso",
+	"versions_caption": "Versiones",
+	"info_caption": "Información",
+	"mode_private": "Privado: Solo miembros pueden visualizar o editar",
+	"mode_public": "Público: Cualquiera con el enlace puede visualizar",
+	"invite_collaborators": "Invitar Colaboradores",
+	"revoke_access": "Anular Acceso",
+	"invite": "Enviar Invitaciones",
+	"invitee_email_address": "Dirección de correo electrónico del nuevo miembro",
+	"optional_message": "Mensaje optional",
+	"role_viewer": "Visualizador",
+	"role_editor": "Editor",
+	"role_admin": "Administrador",
+	"new_space_title": "Nuevo título para el Espacio",
+	"team": "Equipo",
+	"search": "Buscar",
+	"search_no_results": "Búsqueda sin resultados",
+	"search_clear": "Limpiar búsqueda",
+	"rename": "Renombrar",
+	"mobile": "teléfono móvl",
+	"image": "imagen",
+	"tool_filter": "fíltro",
+	"canel": "canel",
+	"invite_membership_action": "Acción afiliación de miembros",
+	"viewer": "visualizador",
+	"editor": "editor",
+	"admin": "administrador",
+	"logging_in": "iniciando sesión",
+	"password_confirmation": "Confirmación de Contraseña",
+	"confirm_again": "Te hemos enviado un correo electrónico explicando cómo puedes confirmar tu dirección de correo electrónico.",
+	"confirmed": "Tú Cuenta ha sido confirmada satisfactoriamente. Gracias.",
+	"signing_up": "Registrándote",
+	"password_check_inbox": "Por favor, comprueba tu bandeja de entrada de correo electrónico",
+	"new_space": "Nuevo Espacio",
+	"tool_more": "Más",
+	"what_is_your_name": "¡Bienvenido a %s! Por favor, elige un nombre de usuario.",
+	"lang": "es",
+	"landing_title": "Tu Pizarra en la Web.",
+	"landing_claim": "Spacedeck te permite combinar fácilmente todo tipo de multimedia en pizarras virtuales: notas de texto, fotos, enlaces web, incluso videos y grabaciones de audio. ",
+	"landing_example": "Las personas usan Spacedeck para organizar en equipo sus ideas y así poder ver proyectos completos de un vistazo, o bien en escuelas y universidades para obtener experiencias de aprendizaje más enriquecedoras y conectadas.",
+	"spaces": "Mis Espacios",
+	"access_editor_link": "Enlace de Edición Instantanea",
+	"access_editor_link_desc": "Proporciona este enlace a cualquier persona que deba poder editar instantáneamente este Espacio, no se requiere una cuenta: ",
+	"access_editor_link_desc_slug": "Este enlace también contiene el nombre del Espacio. ",
+	"access_anonymous_edit_blocking": "Los editores anónimos únicamente pueden cambiar sus propios elementos",
+	"access_current_members": "Miembros Actuales",
+	"access_new_members": "Invita Nuevos Miembros",
+	"access_no_members": "Los Miembros de este Espacio se mostrarán aquí.",
+	"comments": "comentarios",
+	"landing_customers": "Confiado por multitudes.",
+	"landing_features_title": "Sencillo de usar.",
+	"landing_features_text": "El nuevo Spacedeck 6 tiene un hermoso y optimizado interfaz de usuario que hace que tu trabajo sea más fácil y divertido que nunca, al tiempo que te brinda funciones aún más poderosas:",
+	"landing_features_1": "<b>Arrastra & suelta</b> imágenes, vídeos y áudios desde tu computadora o desde la web",
+	"landing_features_2": "<b>Escribe texto y formatéalo</b> con pleno control sobre fuente, color y estilo",
+	"landing_features_3": "<b>Dibuja, anota y resalta</b> incluyendo contornos gráficos",
+	"landing_features_4": "Convierte tu tablero en un <b>área de presentación con zoom</b>",
+	"landing_features_5": "<b>Colabora y chatea</b> en tiempo real con compañeros de equipo, alumnos y amigos.",
+	"landing_features_6": "<b>Comparte Espacios</b> en la web o via correo electrónico",
+	"landing_features_7": "<b>Exporta tu trabajo</b> como fichero imprimible PDF o como ZIP",
+	"landing_pricing": "Increiblemente asequible.",
+	"landing_pricing_lite": "Uso Libre/Personal",
+	"landing_pricing_lite_text": "La versión sencilla y completa para recopilar imágenes y tomar notas.",
+	"landing_pricing_pro_features_list": "<ul><li>Espacios ilimitados</li><li>Estructura de Directorios</li><li>Exportación a ficheros PDF y ZIP</li><li>Sin Marcas de Agua</li><li>Personaliza tu fondo</li><li>Historial de Actividad</li><li>20 GB de Almacenamiento</li><ul>",
+	"landing_pricing_pro": "€4,90/Usuario/Mes <br><small>o 49,90/Usuario/Año</small>",
+	"landing_pricing_pro_text": "Con todo la potencia que esperas.",
+	"landing_pricing_pro_features": "Con toda la potencia que esperas.",
+	"welcome_subject": "Bienvenido a Spacedeck",
+	"welcome_body": "¡Hola!\nGracias por registrárte en Spacedeck.<br>Esperamos que disfrutes trabajando con Espacios.<br>Recuerda, tu cuenta incluye colaboradores ilimitados. Siénte libre de compartir tus Espacios con amigos y colegas de todo el mundo.",
+	"invite_emails": "Dirección/ones de correo electrónico separadas por coma (,)",
+	"history_recently_updated": "Recientemente Actualizado",
+	"history_recently_empty": "Aún no ha pasado nada.",
+	"parent_folder": "Directorio padre",
+	"created_by": "Creado por",
+	"last_updated": "Última actualización",
+	"feedback_sent": "¡Muchas gracias por tu comentarios!",
+	"role_member": "Miembro",
+	"team_invite_membership_action": "Aceptar invitación",
+	"space_message_subject": "Nuevo Mensaje en el Espacio %s",
+	"space_message_body": "%s escribió en  %s: \n",
+	"pro_ad_history_headline": "Cuando actualices a Spacedeck Pro, verás el historial de actualizaciones recientes en todos tus Espacios (compartidos) aquí.",
+	"password_reset_subject": "Restablecer contraseña para Spacedeck",
+	"password_reset_body": "Has solicitado el restablecimiento de tu contraseña en Spacedeck.\nPor favor, clica en el siguiente enlace para establecer una nueva contraseña.",
+	"password_reset_action": "Restablecer Ahora",
+	"was_offline": "La conexión con Spacedeck se ha interrupido. Si tienes trabajo sin salvar, mantén abierta, por favor, esta pestaña del navegadorhasta que la conexión esté restablecida, entonces toca los objetos no salvados.",
+	"subscription_failed_user_subject": "Problemas con el pago en tu Spacedeck",
+	"subscription_failed_user_body": "Desafortunadamente, no pudimos procesar su método de pago. Puede crear fácilmente un nuevo método de pago que incluya PayPal en la configuración de su cuenta.",
+	"subscription_failed_team_subject": "Problemas con el pago en tu Spacedeck",
+	"subscription_failed_team_body": "Desafortunadamente, no pudimos procesar su método de pago para tu Cuenta de Equipo. Corrija su método de pago lo antes posible.",
+	"team_name": "Nombre del Equipo",
+	"subdomain": "Subdominio",
+	"team_adresses": "Direcciones de correo electrónico del Equipo",
+	"add": "Añadir",
+	"invited": "invitado",
+	"duplicate_destination": "¿En qué directorio quieres duplicar este Espacio??",
+	"duplicate_confirm": "Duplicar %s en la directorio %s?",
+	"duplicate_success": "%s fue duplicado en %s.",
+	"goto_space": "Ve al Espacio %s",
+	"goto_folder": "Ve al Directorio %s",
+	"stay_here": "Permanece aquí",
+	"sharing": "Compartiendo",
+	"list": "Lista para Exportar",
+	"link": "Enlace",
+	"download_space": "Espacio de Descarga",
+	"type": "Tipo",
+	"download": "Descarga",
+	"Previous Zone": "Zona Previa",
+	"Next Zone": "Zona Siguiente",
+	"promote": "Promover",
+	"demote": "Degradar",
+	"more": "Más",
+	"lock": "Bloquear",
+	"unlock": "Desbloquear",
+	"follow_present": "Seguir",
+	"mute_present": "Dejar de Seguir",
+	"follow_present_help": "Si alguien más está presentando este espacio, los otros miembros siguen automáticamente la presentación. Active o desactive el seguimiento con este botón.",
+	"export": "exportar"
+}
diff --git a/spacedeck.js b/spacedeck.js
index ee96a5f..830ddd4 100644
--- a/spacedeck.js
+++ b/spacedeck.js
@@ -34,7 +34,7 @@ console.log("Booting Spacedeck Open… (environment: " + app.get('env') + ")");
 app.use(logger(isProduction ? 'combined' : 'dev'));
 
 i18n.expressBind(app, {
-  locales: ["en", "de", "fr", "oc"],
+  locales: ["en", "de", "fr", "oc", "es"],
   defaultLocale: "en",
   cookieName: "spacedeck_locale",
   devMode: (app.get('env') == 'development')
diff --git a/views/partials/account.html b/views/partials/account.html
index 046be8a..1eba3b6 100644
--- a/views/partials/account.html
+++ b/views/partials/account.html
@@ -107,6 +107,9 @@
         </label>
         <label class="radio" v-bind:class="{checked: user.prefs_language=='oc'}" v-on:click="save_user_language('oc')">
           <input type="radio" id="user-preferences_language" name="language" value="oc"><span>Occitan</span>
+        </label>
+        <label class="radio" v-bind:class="{checked: user.prefs_language=='es'}" v-on:click="save_user_language('es')">
+          <input type="radio" id="user-preferences_language" name="language" value="es"><span>Español</span>
         </label>        
       </div>
     </div>
diff --git a/views/spacedeck.html b/views/spacedeck.html
index 426e51d..47f5837 100644
--- a/views/spacedeck.html
+++ b/views/spacedeck.html
@@ -85,9 +85,11 @@
     window.locales.de = {};
     window.locales.fr = {};
     window.locales.oc = {};    
+    window.locales.es = {};    
     window.locales.en.translation = {% include "./../locales/en.js" %};
     window.locales.de.translation = {% include "./../locales/de.js" %};
     window.locales.fr.translation = {% include "./../locales/fr.js" %};
     window.locales.oc.translation = {% include "./../locales/oc.js" %};    
+    window.locales.es.translation = {% include "./../locales/es.js" %};        
   </script>
 </html>
-- 
GitLab