From c133b8fa74b611e0872bd738c614ba6978d1f65a Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Thu, 13 Nov 2014 09:18:59 +0100 Subject: [PATCH 01/13] correcciones de algunos textos en catalan y traduccion de en.yml --- config/locales/ca.yml | 28 ++--- config/locales/en.yml | 281 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 291 insertions(+), 18 deletions(-) diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 57a8eab..e26c4d1 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -21,13 +21,13 @@ ca: one: Demanda other: Demandes transfer: - one: Transferencia + one: Transferència other: Transferències post: - one: Anuncio - other: Anuncios + one: Anunci + other: Anuncis comment: - one: Comentario + one: Comentari other: Comentaris attributes: @@ -41,7 +41,7 @@ ca: one: Banc de Temps other: Bancs de Temps email: Correu - registration_date: Data de alta + registration_date: Data d'alta gender: Gènere registration_number: Codi d'usuari date_of_birth: Data de naixement @@ -68,7 +68,7 @@ ca: <<: *common_attributes name: Nom parent: Categoria pare - name_translations: Nom (traducciones) + name_translations: Nom (traduccions) transfer: <<: *common_attributes amount: Quantitat @@ -82,8 +82,8 @@ ca: tag_list: Etiquetes joinable: Es poden afegir altres permanent: Permanent - start_on: Comença el - end_on: Finalitza el + start_on: Comença al + end_on: Finalitza al # ETIQUETAS VARIADAS EN PLANTILLAS @@ -106,7 +106,7 @@ ca: sing_out: Desconnectar organization_list: welcome: Benvingut a Timeoverflow %{user}. - not_member: No ets membre de cap Banc de Temps, per fer servir el sistema hauràs de possar-te en contcat amb un dels Bancs de Temps del sistema + not_member: No ets membre de cap Banc de Temps, per fer servir el sistema hauràs de possar-te en contacte amb un dels Bancs de Temps del sistema time_bank: Banc de Temps email: Correu phone: Telèfon @@ -116,7 +116,7 @@ ca: neighborhood: Barri city: Ciutat tips: - entertag: Introdueix etiquetes separadas per comes + entertag: Introdueix etiquetes separades per comes user_not_found: "Usuari no trobat." # views/users/index... @@ -210,7 +210,7 @@ ca: no_movements: Sense intercanvis days_without_swaps: Dies sense intercanvis demographics: Dades demogràfiques - by_ages: Por edats + by_ages: Per edats num_people: "Nombre de Persones" unknown: Desconegut @@ -247,13 +247,13 @@ ca: save: Desar add_new: Crear nou cancel_membership: Esborrar definitivament - back: Enrrere + back: Enrere give_time: Transferir temps filter: Filtre all: Tot search: Cercar information: Informació - member_count: "Nombre d'usuarios:" + member_count: "Nombre d'usuaris:" balance: 'Balanç:' movements: Moviments date: Data @@ -272,7 +272,7 @@ ca: layouts: application: login: Entrar - edit_profile: Modificarb perfil + edit_profile: Modificar perfil edit_org: "Modificar %{organization}" report: report_title: "INFORME" diff --git a/config/locales/en.yml b/config/locales/en.yml index 179c14c..59e3bab 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,5 +1,278 @@ -# Sample localization file for English. Add more files in this directory for other locales. -# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. - en: - hello: "Hello world" + # NOMBRES DE LAS COSAS + activerecord: + + models: + # Para usar: + # User.model_name.human + user: + one: User + other: Users + organization: + one: Time Bank + other: Time Banks + category: + one: Category + other: Categories + offer: + one: Offer + other: Offers + inquiry: + one: Inquiry + other: Inquiries + transfer: + one: Transfer + other: Transfers + post: + one: Post + other: Posts + comment: + one: Comment + other: Comments + + attributes: + common: &common_attributes + created_at: Created + updated_at: Updated + user: + <<: *common_attributes + username: Name + organization: + one: Time Bank + other: Time Banks + email: Email + registration_date: Registration date + gender: Gender + registration_number: User code + date_of_birth: Date of birth + identity_document: Identity Document + phone: Phone + alt_phone: Alternative Phone + admin: Organization Administrator + superadmin: System Administrator + description: Description + unconfirmed_email: Unconfirmed Email + organization: + <<: *common_attributes + name: Name + reg_number_seq: User sequence number + theme: Theme + email: Email + phone: Phone + public_opening_times: Opening hours + description: Description + address: Address + neighborhood: Neighborhood + city: City + category: + <<: *common_attributes + name: Name + parent: Parent category + name_translations: Name (translations) + transfer: + <<: *common_attributes + amount: Quantity + reason: Comments + source: Source + post: + <<: *common_attributes + title: Title + description: Description + category: Category + tag_list: Tags + joinable: Can join others + permanent: Permanent + start_on: Start on + end_on: Ends on + + # ETIQUETAS VARIADAS EN PLANTILLAS + + application: + terms_conditions: terms of service + navbar: + administration: Administration + reports: Reports + stats: Statistics + users: Users + categories: Services + organizations: Organizations + statistics: Statistics + admin: Manage + adminshort: Admin + tags: Tags + sign_out: Logout + menu: + sign_in: Login + sing_out: Logout + organization_list: + welcome: Welcome to Timeoverflow %{user}. + not_member: You do not belong to any time bank at this moment, in order to use this platform you need to keep in touch with one of the time banks that have joint the platform + time_bank: Time Bank + email: Email + phone: Phone + public_opening_times: Opening hours + description: Description + address: Address + neighborhood: Neighborhood + city: City + tips: + entertag: Enter tags separated by commas + user_not_found: "User not found." + # views/users/index... + + users: + + index: + create: Create new user + manage_warning_angular: "You are going to change privileges for user {{username}}" + cancel_warning_angular: "You are going to delete account from the Time Bank for user {{username}}" + active_warning_angular: "You are going to change user account status for {{username}}" + actions: Actions + new: + new_user: New user + show: + phone: + one: Phone + other: Phones + data: User details + categories: Offered Services + account: Last transactions + inactive: "(Inactive)" + accounts: Accounts + created_at: "Registered:" + user_no: "User #:" + balance: "Balance:" + movements: "Transactions" + date: Date + from_to: From/To + post: Post + reason: Reason + quantity: Quantity + + give_time: + give_time: Give time to + form: + superadmin_warning: Warning!!! You are giving GOD PRIVILEGES to this user!! + admin_warning: Warning!!! You are giving privileges to this user!! + user_rows: + activate: Activate + deactivate: Deactivate + manage_warning: "You are going to change privileges for user %{user}" + cancel_warning: "You are going to delete account from the Time Bank for user %{user}" + active_warning: "You are going to change user account status for %{user}" + + tags: + alpha_grouped_index: + maintitle: Available Tags + terms: + accept: Accept + offers: + index: + offered_by: "Offered by %{size} people" + new_offer: "New offer" + filter: Filter + by_category: By category + by_tag: By Tag + show: + offered_by: "Offered by" + new: + submit: Create offer + + inquiries: + index: + new_inquiry: New inquiry + new: + submit: Create inquiry + + categories: + index: + all: All + tree: Main + global: Global + local: Local + add: Add service + + reports: + cat_with_users: + title: Offered Services + user_list: + title: User List + statistics: + statistics: Statistics + bank_activity: "Bank Activity" + per_month: "Per Month" + global_activity: "Global Activity" + users_reg: "Registered users" + num_swaps: "Transactions" + total_hours: "Hours transfered" + inactive_users: Inactive users + last_movement: Last transaction + no_movements: Without transactions + days_without_swaps: Days without transactions + demographics: Demographic data + by_ages: Per ages + num_people: "# of people" + unknown: Unknown + + stats: + min_balance: + title: Users Minimum Balance + + organizations: + index: + member_count: Number of users + new: + new: New bank + show: + contact_information: Contact information + give_time: + give_time: Give time to + + transfers: + computation: + joiner: " and " + hour: + one: ! '%{count} hour' + other: ! '%{count} hours' + minute: + one: ! '%{count} minute' + other: ! '%{count} minutes' + + global: + table: + actions: Actions + show: Show + edit: Update + delete: Delete + save: Save + add_new: Create new + cancel_membership: Permanent deletion + back: Back + give_time: Time transfer + filter: Filter + all: All + search: Search + information: Information + member_count: 'Number of users:' + balance: 'Balance:' + movements: Transactions + date: Data + source_destination: 'From/to' + announcements: Post + reason: Reason + amount: Quantity + demote: Demote to normal user + promote: Promote to administrator + + active_admin: + comments: + resource_type: Resource type + author_type: Author type + + layouts: + application: + login: Login + edit_profile: Update my profile + edit_org: "Update %{organization}" + report: + report_title: "REPORT" From 0a6f4cc382fef8db787fb4eee62e8829eaafe52b Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Thu, 13 Nov 2014 21:29:57 +0100 Subject: [PATCH 02/13] fixes in devise.ca.yml --- config/locales/devise.ca.yml | 6 +++--- vendor/assets/images/flags.png | 0 vendor/assets/stylesheets/flags.css | 0 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 vendor/assets/images/flags.png create mode 100644 vendor/assets/stylesheets/flags.css diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index 8cc7d9b..39f206d 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -25,7 +25,7 @@ ca: locked: "El teu compte ha estat bloquejat." not_found_in_database: "Correu o clau invàlida." timeout: "La teva sessió ha caducat. Si us plau, torna a entrar per continuar." - unauthenticated: "Has que entrar per continuar." + unauthenticated: "Has de entrar per continuar." unconfirmed: "Has de confiramar el teu compte abans de continuar." mailer: confirmation_instructions: @@ -35,7 +35,7 @@ ca: unlock_instructions: subject: "Instruccions de desbloqueig del compte" omniauth_callbacks: - failure: "No s'ha pogut autentificar desde %{kind} perque \"%{reason}\"." + failure: "No s'ha pogut autentificar desde %{kind} perquè \"%{reason}\"." success: "Autentificació realitzada desde el compte %{kind} ." passwords: no_token: "No pots accedir a aquesta pàgina si no vens d'un correu per restablir la contrasenya. Si vens d'un correu per a restablir la contrasenya, assegurat que has utilitzat la URL completa." @@ -92,4 +92,4 @@ ca: not_locked: "no es va bloquejar" not_saved: one: "1 error impedeix que aquest %{resource} es desi:" - other: "%{count} errors impedeix que aquest %{resource} es desi:" + other: "%{count} errors impedeixen que aquest %{resource} es desi:" diff --git a/vendor/assets/images/flags.png b/vendor/assets/images/flags.png new file mode 100644 index 0000000..e69de29 diff --git a/vendor/assets/stylesheets/flags.css b/vendor/assets/stylesheets/flags.css new file mode 100644 index 0000000..e69de29 From c42b4f3f0d6f432b4d0cbd4148f172c7cd8d4238 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Thu, 13 Nov 2014 22:43:41 +0100 Subject: [PATCH 03/13] added language selection in home. Created base static page per language --- app/assets/stylesheets/application.css.scss | 2 + app/views/application/_navbar.html.haml | 14 +- app/views/pages/home_ca.html.haml | 66 +++++ app/views/pages/home_en.html.haml | 66 +++++ vendor/assets/images/blank.png | Bin 0 -> 90 bytes vendor/assets/images/flags.png | Bin 0 -> 78853 bytes vendor/assets/stylesheets/flags.css | 257 ++++++++++++++++++++ 7 files changed, 404 insertions(+), 1 deletion(-) create mode 100644 app/views/pages/home_ca.html.haml create mode 100644 app/views/pages/home_en.html.haml create mode 100644 vendor/assets/images/blank.png diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss index f08704c..ab86b88 100644 --- a/app/assets/stylesheets/application.css.scss +++ b/app/assets/stylesheets/application.css.scss @@ -11,6 +11,8 @@ *= require_self */ +@import "flags"; + .post { border-top: solid black 1px; list-style: none; diff --git a/app/views/application/_navbar.html.haml b/app/views/application/_navbar.html.haml index eef7385..d7d17bf 100644 --- a/app/views/application/_navbar.html.haml +++ b/app/views/application/_navbar.html.haml @@ -81,8 +81,20 @@ = link_to m.organization do = glyph(:pencil) = t "layouts.application.edit_org", organization: m.organization - - else %li %a{href: new_user_session_path} = t "layouts.application.login" + + %li.divider{role: :presentation} + %li{role: :presentation} + = link_to page_path('home') do + = image_tag("blank.png",{class: "flag flag-es", alt: "Español"}) + + %li{role: :presentation} + = link_to page_path('home_ca') do + = image_tag("blank.png",{class: "flag flag-catalonia", alt: "Català"}) + + %li{role: :presentation} + = link_to page_path('home_en') do + = image_tag("blank.png",{class: "flag flag-gb", alt: "English"}) diff --git a/app/views/pages/home_ca.html.haml b/app/views/pages/home_ca.html.haml new file mode 100644 index 0000000..3f6cd3c --- /dev/null +++ b/app/views/pages/home_ca.html.haml @@ -0,0 +1,66 @@ += content_for :window_title do + TimeOverflow - Gestió on-line de Bancs de Temps + +.container-inner + - if current_user and !current_organization + = render 'organization_list' + .row + .col-sm-6 + .text-center + %h1 TimeOverflow + = image_tag "sand-clock.png", width: 50 + %h2 El software disenyat per y per als Bancs de Temps + %em TimeOverflow es libre, gratuito y colaborativo + + .text-left{style: "margin-top: 40px;"} + :markdown + Funcionalidades de **TimeOverflow**: + + * Gestión del Banco de Tiempo con perfiles de administración + * Altas/bajas/modificaciones de miembros + * Publicar ofertas y demandas + * Introducir cheques y gestionar la contabilidad + * Red social y banca on-line accesible por los miembros + * Los miembros de un Banco de Tiempo pueden acceder al sistema y contactar con otros miembros + * Publicar ofertas y demandas + * Pagar horas a otros miembros + + %h2 ¿Eres un Banco de Tiempo? + .text-center + %a.btn.btn-primary.btn-large{href: "http://adbdt.org/contacta/", style:"font-size:30px;margin-top:20px;"} + Solicita acceso a TimeOverflow + .text-center + %p + %em (nos pondremos en contacto contigo para ponerlo en marcha o haceros una demostración) + + .col-sm-6 + .text-center + %h2 ¿Ya eres miembro de un Banco de Tiempo que usa TimeOverflow? + %a.btn.btn-primary.btn-large{href: new_user_session_path, style:"font-size:30px;margin-top:20px;"} + Entra aquí + + %p + :markdown + Si eres una persona interesada en participar en un Banco de Tiempo, + busca tu Banco de Tiempo más cercano en + [bdtonline.org](http://www.bdtonline.org "Bancos de Tiempo"). + + = image_tag "oferta.png", class: "img-responsive center-block" + + %h2 Internet potencia los Bancos de Tiempo + :markdown + TimeOveflow está especialmente diseñado **por y para los Bancos de Tiempo** + que existen físicamente ([ver mapa](http://www.bdtonline.org "Bancos de Tiempo")), + su fin es potenciarlos gracias a Internet. + + Gracias al trabajo conjunto de [CoopDevs](https://github.com/coopdevs) + y la [ADBdT](http://adbdt.org "Asociación para el Desarrollo de los Bancos de Tiempo") + hoy podemos ofrecer el sofware **TimeOverflow** a todos los Bancos de + Tiempo que así lo deseen de manera libre y gratuita. + + El código fuente de TimeOverflow está disponible bajo una licencia + open source, ya se puede descargar en [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) + + .text-center + = link_to "https://github.com/coopdevs/timeoverflow", title: "TimeOverflow Github" do + = image_tag("github.png", alt: "Github logo", height: 30) diff --git a/app/views/pages/home_en.html.haml b/app/views/pages/home_en.html.haml new file mode 100644 index 0000000..9c70018 --- /dev/null +++ b/app/views/pages/home_en.html.haml @@ -0,0 +1,66 @@ += content_for :window_title do + TimeOverflow - Time Bank on-line management + +.container-inner + - if current_user and !current_organization + = render 'organization_list' + .row + .col-sm-6 + .text-center + %h1 TimeOverflow + = image_tag "sand-clock.png", width: 50 + %h2 The software designed by and for Time Banks + %em TimeOverflow es libre, gratuito y colaborativo + + .text-left{style: "margin-top: 40px;"} + :markdown + Funcionalidades de **TimeOverflow**: + + * Gestión del Banco de Tiempo con perfiles de administración + * Altas/bajas/modificaciones de miembros + * Publicar ofertas y demandas + * Introducir cheques y gestionar la contabilidad + * Red social y banca on-line accesible por los miembros + * Los miembros de un Banco de Tiempo pueden acceder al sistema y contactar con otros miembros + * Publicar ofertas y demandas + * Pagar horas a otros miembros + + %h2 ¿Eres un Banco de Tiempo? + .text-center + %a.btn.btn-primary.btn-large{href: "http://adbdt.org/contacta/", style:"font-size:30px;margin-top:20px;"} + Solicita acceso a TimeOverflow + .text-center + %p + %em (nos pondremos en contacto contigo para ponerlo en marcha o haceros una demostración) + + .col-sm-6 + .text-center + %h2 ¿Ya eres miembro de un Banco de Tiempo que usa TimeOverflow? + %a.btn.btn-primary.btn-large{href: new_user_session_path, style:"font-size:30px;margin-top:20px;"} + Entra aquí + + %p + :markdown + Si eres una persona interesada en participar en un Banco de Tiempo, + busca tu Banco de Tiempo más cercano en + [bdtonline.org](http://www.bdtonline.org "Bancos de Tiempo"). + + = image_tag "oferta.png", class: "img-responsive center-block" + + %h2 Internet potencia los Bancos de Tiempo + :markdown + TimeOveflow está especialmente diseñado **por y para los Bancos de Tiempo** + que existen físicamente ([ver mapa](http://www.bdtonline.org "Bancos de Tiempo")), + su fin es potenciarlos gracias a Internet. + + Gracias al trabajo conjunto de [CoopDevs](https://github.com/coopdevs) + y la [ADBdT](http://adbdt.org "Asociación para el Desarrollo de los Bancos de Tiempo") + hoy podemos ofrecer el sofware **TimeOverflow** a todos los Bancos de + Tiempo que así lo deseen de manera libre y gratuita. + + El código fuente de TimeOverflow está disponible bajo una licencia + open source, ya se puede descargar en [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) + + .text-center + = link_to "https://github.com/coopdevs/timeoverflow", title: "TimeOverflow Github" do + = image_tag("github.png", alt: "Github logo", height: 30) diff --git a/vendor/assets/images/blank.png b/vendor/assets/images/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..86f57a504f732b516a88b5b5b49a2a241203dc5e GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^JZv^(q?ydBUD9jv*Dd ll5Gw&$Qu~;Xh}G7F|3Pcc(Cy2({i9RgQu&X%Q~loCICVe7IXjr literal 0 HcmV?d00001 diff --git a/vendor/assets/images/flags.png b/vendor/assets/images/flags.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..da2bff7834d1a3bf61f646814337148886241662 100644 GIT binary patch literal 78853 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 literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/flags.css b/vendor/assets/stylesheets/flags.css index e69de29..3f4dd1b 100644 --- a/vendor/assets/stylesheets/flags.css +++ b/vendor/assets/stylesheets/flags.css @@ -0,0 +1,257 @@ +.flag { + width: 16px; + height: 11px; + background:url('/assets/flags.png') no-repeat +} + +.flag.flag-ad {background-position: -16px 0} +.flag.flag-ae {background-position: -32px 0} +.flag.flag-af {background-position: -48px 0} +.flag.flag-ag {background-position: -64px 0} +.flag.flag-ai {background-position: -80px 0} +.flag.flag-al {background-position: -96px 0} +.flag.flag-am {background-position: -112px 0} +.flag.flag-an {background-position: -128px 0} +.flag.flag-ao {background-position: -144px 0} +.flag.flag-ar {background-position: -160px 0} +.flag.flag-as {background-position: -176px 0} +.flag.flag-at {background-position: -192px 0} +.flag.flag-au {background-position: -208px 0} +.flag.flag-aw {background-position: -224px 0} +.flag.flag-az {background-position: -240px 0} +.flag.flag-ba {background-position: 0 -11px} +.flag.flag-bb {background-position: -16px -11px} +.flag.flag-bd {background-position: -32px -11px} +.flag.flag-be {background-position: -48px -11px} +.flag.flag-bf {background-position: -64px -11px} +.flag.flag-bg {background-position: -80px -11px} +.flag.flag-bh {background-position: -96px -11px} +.flag.flag-bi {background-position: -112px -11px} +.flag.flag-bj {background-position: -128px -11px} +.flag.flag-bm {background-position: -144px -11px} +.flag.flag-bn {background-position: -160px -11px} +.flag.flag-bo {background-position: -176px -11px} +.flag.flag-br {background-position: -192px -11px} +.flag.flag-bs {background-position: -208px -11px} +.flag.flag-bt {background-position: -224px -11px} +.flag.flag-bv {background-position: -240px -11px} +.flag.flag-bw {background-position: 0 -22px} +.flag.flag-by {background-position: -16px -22px} +.flag.flag-bz {background-position: -32px -22px} +.flag.flag-ca {background-position: -48px -22px} +.flag.flag-catalonia {background-position: -64px -22px} +.flag.flag-cd {background-position: -80px -22px} +.flag.flag-cf {background-position: -96px -22px} +.flag.flag-cg {background-position: -112px -22px} +.flag.flag-ch {background-position: -128px -22px} +.flag.flag-ci {background-position: -144px -22px} +.flag.flag-ck {background-position: -160px -22px} +.flag.flag-cl {background-position: -176px -22px} +.flag.flag-cm {background-position: -192px -22px} +.flag.flag-cn {background-position: -208px -22px} +.flag.flag-co {background-position: -224px -22px} +.flag.flag-cr {background-position: -240px -22px} +.flag.flag-cu {background-position: 0 -33px} +.flag.flag-cv {background-position: -16px -33px} +.flag.flag-cw {background-position: -32px -33px} +.flag.flag-cy {background-position: -48px -33px} +.flag.flag-cz {background-position: -64px -33px} +.flag.flag-de {background-position: -80px -33px} +.flag.flag-dj {background-position: -96px -33px} +.flag.flag-dk {background-position: -112px -33px} +.flag.flag-dm {background-position: -128px -33px} +.flag.flag-do {background-position: -144px -33px} +.flag.flag-dz {background-position: -160px -33px} +.flag.flag-ec {background-position: -176px -33px} +.flag.flag-ee {background-position: -192px -33px} +.flag.flag-eg {background-position: -208px -33px} +.flag.flag-eh {background-position: -224px -33px} +.flag.flag-england {background-position: -240px -33px} +.flag.flag-er {background-position: 0 -44px} +.flag.flag-es {background-position: -16px -44px} +.flag.flag-et {background-position: -32px -44px} +.flag.flag-eu {background-position: -48px -44px} +.flag.flag-fi {background-position: -64px -44px} +.flag.flag-fj {background-position: -80px -44px} +.flag.flag-fk {background-position: -96px -44px} +.flag.flag-fm {background-position: -112px -44px} +.flag.flag-fo {background-position: -128px -44px} +.flag.flag-fr {background-position: -144px -44px} +.flag.flag-ga {background-position: -160px -44px} +.flag.flag-gb {background-position: -176px -44px} +.flag.flag-gd {background-position: -192px -44px} +.flag.flag-ge {background-position: -208px -44px} +.flag.flag-gf {background-position: -224px -44px} +.flag.flag-gg {background-position: -240px -44px} +.flag.flag-gh {background-position: 0 -55px} +.flag.flag-gi {background-position: -16px -55px} +.flag.flag-gl {background-position: -32px -55px} +.flag.flag-gm {background-position: -48px -55px} +.flag.flag-gn {background-position: -64px -55px} +.flag.flag-gp {background-position: -80px -55px} +.flag.flag-gq {background-position: -96px -55px} +.flag.flag-gr {background-position: -112px -55px} +.flag.flag-gs {background-position: -128px -55px} +.flag.flag-gt {background-position: -144px -55px} +.flag.flag-gu {background-position: -160px -55px} +.flag.flag-gw {background-position: -176px -55px} +.flag.flag-gy {background-position: -192px -55px} +.flag.flag-hk {background-position: -208px -55px} +.flag.flag-hm {background-position: -224px -55px} +.flag.flag-hn {background-position: -240px -55px} +.flag.flag-hr {background-position: 0 -66px} +.flag.flag-ht {background-position: -16px -66px} +.flag.flag-hu {background-position: -32px -66px} +.flag.flag-ic {background-position: -48px -66px} +.flag.flag-id {background-position: -64px -66px} +.flag.flag-ie {background-position: -80px -66px} +.flag.flag-il {background-position: -96px -66px} +.flag.flag-im {background-position: -112px -66px} +.flag.flag-in {background-position: -128px -66px} +.flag.flag-io {background-position: -144px -66px} +.flag.flag-iq {background-position: -160px -66px} +.flag.flag-ir {background-position: -176px -66px} +.flag.flag-is {background-position: -192px -66px} +.flag.flag-it {background-position: -208px -66px} +.flag.flag-je {background-position: -224px -66px} +.flag.flag-jm {background-position: -240px -66px} +.flag.flag-jo {background-position: 0 -77px} +.flag.flag-jp {background-position: -16px -77px} +.flag.flag-ke {background-position: -32px -77px} +.flag.flag-kg {background-position: -48px -77px} +.flag.flag-kh {background-position: -64px -77px} +.flag.flag-ki {background-position: -80px -77px} +.flag.flag-km {background-position: -96px -77px} +.flag.flag-kn {background-position: -112px -77px} +.flag.flag-kp {background-position: -128px -77px} +.flag.flag-kr {background-position: -144px -77px} +.flag.flag-kurdistan {background-position: -160px -77px} +.flag.flag-kw {background-position: -176px -77px} +.flag.flag-ky {background-position: -192px -77px} +.flag.flag-kz {background-position: -208px -77px} +.flag.flag-la {background-position: -224px -77px} +.flag.flag-lb {background-position: -240px -77px} +.flag.flag-lc {background-position: 0 -88px} +.flag.flag-li {background-position: -16px -88px} +.flag.flag-lk {background-position: -32px -88px} +.flag.flag-lr {background-position: -48px -88px} +.flag.flag-ls {background-position: -64px -88px} +.flag.flag-lt {background-position: -80px -88px} +.flag.flag-lu {background-position: -96px -88px} +.flag.flag-lv {background-position: -112px -88px} +.flag.flag-ly {background-position: -128px -88px} +.flag.flag-ma {background-position: -144px -88px} +.flag.flag-mc {background-position: -160px -88px} +.flag.flag-md {background-position: -176px -88px} +.flag.flag-me {background-position: -192px -88px} +.flag.flag-mg {background-position: -208px -88px} +.flag.flag-mh {background-position: -224px -88px} +.flag.flag-mk {background-position: -240px -88px} +.flag.flag-ml {background-position: 0 -99px} +.flag.flag-mm {background-position: -16px -99px} +.flag.flag-mn {background-position: -32px -99px} +.flag.flag-mo {background-position: -48px -99px} +.flag.flag-mp {background-position: -64px -99px} +.flag.flag-mq {background-position: -80px -99px} +.flag.flag-mr {background-position: -96px -99px} +.flag.flag-ms {background-position: -112px -99px} +.flag.flag-mt {background-position: -128px -99px} +.flag.flag-mu {background-position: -144px -99px} +.flag.flag-mv {background-position: -160px -99px} +.flag.flag-mw {background-position: -176px -99px} +.flag.flag-mx {background-position: -192px -99px} +.flag.flag-my {background-position: -208px -99px} +.flag.flag-mz {background-position: -224px -99px} +.flag.flag-na {background-position: -240px -99px} +.flag.flag-nc {background-position: 0 -110px} +.flag.flag-ne {background-position: -16px -110px} +.flag.flag-nf {background-position: -32px -110px} +.flag.flag-ng {background-position: -48px -110px} +.flag.flag-ni {background-position: -64px -110px} +.flag.flag-nl {background-position: -80px -110px} +.flag.flag-no {background-position: -96px -110px} +.flag.flag-np {background-position: -112px -110px} +.flag.flag-nr {background-position: -128px -110px} +.flag.flag-nu {background-position: -144px -110px} +.flag.flag-nz {background-position: -160px -110px} +.flag.flag-om {background-position: -176px -110px} +.flag.flag-pa {background-position: -192px -110px} +.flag.flag-pe {background-position: -208px -110px} +.flag.flag-pf {background-position: -224px -110px} +.flag.flag-pg {background-position: -240px -110px} +.flag.flag-ph {background-position: 0 -121px} +.flag.flag-pk {background-position: -16px -121px} +.flag.flag-pl {background-position: -32px -121px} +.flag.flag-pm {background-position: -48px -121px} +.flag.flag-pn {background-position: -64px -121px} +.flag.flag-pr {background-position: -80px -121px} +.flag.flag-ps {background-position: -96px -121px} +.flag.flag-pt {background-position: -112px -121px} +.flag.flag-pw {background-position: -128px -121px} +.flag.flag-py {background-position: -144px -121px} +.flag.flag-qa {background-position: -160px -121px} +.flag.flag-re {background-position: -176px -121px} +.flag.flag-ro {background-position: -192px -121px} +.flag.flag-rs {background-position: -208px -121px} +.flag.flag-ru {background-position: -224px -121px} +.flag.flag-rw {background-position: -240px -121px} +.flag.flag-sa {background-position: 0 -132px} +.flag.flag-sb {background-position: -16px -132px} +.flag.flag-sc {background-position: -32px -132px} +.flag.flag-scotland {background-position: -48px -132px} +.flag.flag-sd {background-position: -64px -132px} +.flag.flag-se {background-position: -80px -132px} +.flag.flag-sg {background-position: -96px -132px} +.flag.flag-sh {background-position: -112px -132px} +.flag.flag-si {background-position: -128px -132px} +.flag.flag-sk {background-position: -144px -132px} +.flag.flag-sl {background-position: -160px -132px} +.flag.flag-sm {background-position: -176px -132px} +.flag.flag-sn {background-position: -192px -132px} +.flag.flag-so {background-position: -208px -132px} +.flag.flag-somaliland {background-position: -224px -132px} +.flag.flag-sr {background-position: -240px -132px} +.flag.flag-ss {background-position: 0 -143px} +.flag.flag-st {background-position: -16px -143px} +.flag.flag-sv {background-position: -32px -143px} +.flag.flag-sx {background-position: -48px -143px} +.flag.flag-sy {background-position: -64px -143px} +.flag.flag-sz {background-position: -80px -143px} +.flag.flag-tc {background-position: -96px -143px} +.flag.flag-td {background-position: -112px -143px} +.flag.flag-tf {background-position: -128px -143px} +.flag.flag-tg {background-position: -144px -143px} +.flag.flag-th {background-position: -160px -143px} +.flag.flag-tj {background-position: -176px -143px} +.flag.flag-tk {background-position: -192px -143px} +.flag.flag-tl {background-position: -208px -143px} +.flag.flag-tm {background-position: -224px -143px} +.flag.flag-tn {background-position: -240px -143px} +.flag.flag-to {background-position: 0 -154px} +.flag.flag-tr {background-position: -16px -154px} +.flag.flag-tt {background-position: -32px -154px} +.flag.flag-tv {background-position: -48px -154px} +.flag.flag-tw {background-position: -64px -154px} +.flag.flag-tz {background-position: -80px -154px} +.flag.flag-ua {background-position: -96px -154px} +.flag.flag-ug {background-position: -112px -154px} +.flag.flag-um {background-position: -128px -154px} +.flag.flag-us {background-position: -144px -154px} +.flag.flag-uy {background-position: -160px -154px} +.flag.flag-uz {background-position: -176px -154px} +.flag.flag-va {background-position: -192px -154px} +.flag.flag-vc {background-position: -208px -154px} +.flag.flag-ve {background-position: -224px -154px} +.flag.flag-vg {background-position: -240px -154px} +.flag.flag-vi {background-position: 0 -165px} +.flag.flag-vn {background-position: -16px -165px} +.flag.flag-vu {background-position: -32px -165px} +.flag.flag-wales {background-position: -48px -165px} +.flag.flag-wf {background-position: -64px -165px} +.flag.flag-ws {background-position: -80px -165px} +.flag.flag-ye {background-position: -96px -165px} +.flag.flag-yt {background-position: -112px -165px} +.flag.flag-za {background-position: -128px -165px} +.flag.flag-zanzibar {background-position: -144px -165px} +.flag.flag-zm {background-position: -160px -165px} +.flag.flag-zw {background-position: -176px -165px} From 4887c437dc42075a80baf8b7c0b7a20d88673e06 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Fri, 14 Nov 2014 09:48:51 +0100 Subject: [PATCH 04/13] Let user choose language --- app/assets/javascripts/global.js.coffee | 3 +++ app/assets/stylesheets/global.css.scss | 3 +++ app/controllers/global_controller.rb | 19 +++++++++++++++++++ app/helpers/global_helper.rb | 2 ++ app/views/application/_navbar.html.haml | 6 +++--- app/views/global/switch_lang.html.haml | 2 ++ config/routes.rb | 1 + spec/controllers/global_controller_spec.rb | 12 ++++++++++++ spec/helpers/global_helper_spec.rb | 15 +++++++++++++++ .../global/switch_lang.html.haml_spec.rb | 5 +++++ 10 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/global.js.coffee create mode 100644 app/assets/stylesheets/global.css.scss create mode 100644 app/controllers/global_controller.rb create mode 100644 app/helpers/global_helper.rb create mode 100644 app/views/global/switch_lang.html.haml create mode 100644 spec/controllers/global_controller_spec.rb create mode 100644 spec/helpers/global_helper_spec.rb create mode 100644 spec/views/global/switch_lang.html.haml_spec.rb diff --git a/app/assets/javascripts/global.js.coffee b/app/assets/javascripts/global.js.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/global.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/global.css.scss b/app/assets/stylesheets/global.css.scss new file mode 100644 index 0000000..094bcc0 --- /dev/null +++ b/app/assets/stylesheets/global.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the global controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/global_controller.rb b/app/controllers/global_controller.rb new file mode 100644 index 0000000..9378b5a --- /dev/null +++ b/app/controllers/global_controller.rb @@ -0,0 +1,19 @@ +class GlobalController < ApplicationController + def switch_lang + set_locale + + if current_user and current_organization + redirect_to new_user_session_path + else + l = session[:locale] + + case l + when 'es' + url='home' + else + url='home_'+l + end + redirect_to page_path(url) + end + end +end diff --git a/app/helpers/global_helper.rb b/app/helpers/global_helper.rb new file mode 100644 index 0000000..be6bce4 --- /dev/null +++ b/app/helpers/global_helper.rb @@ -0,0 +1,2 @@ +module GlobalHelper +end diff --git a/app/views/application/_navbar.html.haml b/app/views/application/_navbar.html.haml index d7d17bf..1c11c47 100644 --- a/app/views/application/_navbar.html.haml +++ b/app/views/application/_navbar.html.haml @@ -88,13 +88,13 @@ %li.divider{role: :presentation} %li{role: :presentation} - = link_to page_path('home') do + = link_to "/global/switch_lang?locale=es" do = image_tag("blank.png",{class: "flag flag-es", alt: "Español"}) %li{role: :presentation} - = link_to page_path('home_ca') do + = link_to "/global/switch_lang?locale=ca" do = image_tag("blank.png",{class: "flag flag-catalonia", alt: "Català"}) %li{role: :presentation} - = link_to page_path('home_en') do + = link_to "/global/switch_lang?locale=en" do = image_tag("blank.png",{class: "flag flag-gb", alt: "English"}) diff --git a/app/views/global/switch_lang.html.haml b/app/views/global/switch_lang.html.haml new file mode 100644 index 0000000..25a3398 --- /dev/null +++ b/app/views/global/switch_lang.html.haml @@ -0,0 +1,2 @@ +%h1 Global#switch_lang +%p Find me in app/views/global/switch_lang.html.haml diff --git a/config/routes.rb b/config/routes.rb index 311c15f..443d5aa 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Timeoverflow::Application.routes.draw do + get 'global/switch_lang' get 'tags/index' devise_for :users diff --git a/spec/controllers/global_controller_spec.rb b/spec/controllers/global_controller_spec.rb new file mode 100644 index 0000000..58a502a --- /dev/null +++ b/spec/controllers/global_controller_spec.rb @@ -0,0 +1,12 @@ +require 'spec_helper' + +describe GlobalController do + + describe "GET 'switch_lang'" do + it "returns http success" do + get 'switch_lang' + response.should be_success + end + end + +end diff --git a/spec/helpers/global_helper_spec.rb b/spec/helpers/global_helper_spec.rb new file mode 100644 index 0000000..f00766a --- /dev/null +++ b/spec/helpers/global_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the GlobalHelper. For example: +# +# describe GlobalHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +describe GlobalHelper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/views/global/switch_lang.html.haml_spec.rb b/spec/views/global/switch_lang.html.haml_spec.rb new file mode 100644 index 0000000..46d3bc2 --- /dev/null +++ b/spec/views/global/switch_lang.html.haml_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe "global/switch_lang.html.haml" do + pending "add some examples to (or delete) #{__FILE__}" +end From 380d3d59106a0f415288e4be6b786e081c666207 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Fri, 14 Nov 2014 18:54:36 +0100 Subject: [PATCH 05/13] devise working in english and translations for home cat and engl --- app/controllers/application_controller.rb | 9 +++- app/controllers/global_controller.rb | 26 ++++++---- app/views/application/_navbar.html.haml | 2 +- app/views/pages/home_ca.html.haml | 58 +++++++++++------------ app/views/pages/home_en.html.haml | 54 ++++++++++----------- config/locales/devise.en.yml | 11 +++++ config/routes.rb | 1 + 7 files changed, 93 insertions(+), 68 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b6b91ea..c2693ef 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -20,7 +20,8 @@ class ApplicationController < ActionController::Base if params[:locale] session[:locale] = params[:locale] end - I18n.locale = session[:locale] || I18n.default_locale + # we look first at session then at default client locale and ultimately at default locale in rails + I18n.locale = session[:locale] || extract_locale_from_accept_language_header || I18n.default_locale true end @@ -79,4 +80,10 @@ class ApplicationController < ActionController::Base def authenticate_superuser! superuser? || redirect_to(root_path) end + + # To get locate from client supplied information + # see http://guides.rubyonrails.org/i18n.html#setting-the-locale-from-the-client-supplied-information + def extract_locale_from_accept_language_header + request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first + end end diff --git a/app/controllers/global_controller.rb b/app/controllers/global_controller.rb index 9378b5a..3ec49f3 100644 --- a/app/controllers/global_controller.rb +++ b/app/controllers/global_controller.rb @@ -1,19 +1,25 @@ class GlobalController < ApplicationController + def switch_lang set_locale if current_user and current_organization - redirect_to new_user_session_path + redirect_to offers_path else - l = session[:locale] - - case l - when 'es' - url='home' - else - url='home_'+l - end - redirect_to page_path(url) + go_home end end + + def go_home + l = session[:locale] + + case l + when 'es' + url='home' + else + url='home_'+l + end + redirect_to page_path(url) + end + end diff --git a/app/views/application/_navbar.html.haml b/app/views/application/_navbar.html.haml index 1c11c47..58a66ed 100644 --- a/app/views/application/_navbar.html.haml +++ b/app/views/application/_navbar.html.haml @@ -1,7 +1,7 @@ %nav.navbar.navbar-static-top.navbar-inverse{role: :navigation} .container .navbar-header - %a.navbar-brand(href="/") TimeOverflow + %a.navbar-brand(href="/global/go_home") TimeOverflow %ul.nav.navbar-nav - if current_user and current_organization diff --git a/app/views/pages/home_ca.html.haml b/app/views/pages/home_ca.html.haml index 3f6cd3c..926c6b6 100644 --- a/app/views/pages/home_ca.html.haml +++ b/app/views/pages/home_ca.html.haml @@ -9,57 +9,57 @@ .text-center %h1 TimeOverflow = image_tag "sand-clock.png", width: 50 - %h2 El software disenyat per y per als Bancs de Temps - %em TimeOverflow es libre, gratuito y colaborativo + %h2 El software disenyat per i per als Bancs de Temps + %em TimeOverflow és lliure, gratuït i col·laboratiu .text-left{style: "margin-top: 40px;"} :markdown - Funcionalidades de **TimeOverflow**: + Funcionalitats de **TimeOverflow**: - * Gestión del Banco de Tiempo con perfiles de administración - * Altas/bajas/modificaciones de miembros - * Publicar ofertas y demandas - * Introducir cheques y gestionar la contabilidad - * Red social y banca on-line accesible por los miembros - * Los miembros de un Banco de Tiempo pueden acceder al sistema y contactar con otros miembros - * Publicar ofertas y demandas - * Pagar horas a otros miembros + * Gestió del Banc de Temps amb perfils d'administració + * Altes/baixes/modificacions de membres + * Publicar ofertes i demandes + * Introduir xecs i gestionar la comptabilitat + * Xarxa social i banca en línia accessible pels membres + * Els membres d'un Banc de Temps poden accedir al sistema i contactar amb altres membres + * Publicar ofertes i demandes + * Pagar hores a altres membres - %h2 ¿Eres un Banco de Tiempo? + %h2 Ets un Banc de Temps? .text-center - %a.btn.btn-primary.btn-large{href: "http://adbdt.org/contacta/", style:"font-size:30px;margin-top:20px;"} - Solicita acceso a TimeOverflow + %a.btn.btn-primary.btn-large{href: "http://adbdt.org/ca/contacta/", style:"font-size:30px;margin-top:20px;"} + Sol·licita accés a TimeOverflow .text-center %p - %em (nos pondremos en contacto contigo para ponerlo en marcha o haceros una demostración) + %em (ens posarem en contacte amb tu per posar-lo en marxa o fer-vos una demostració) .col-sm-6 .text-center - %h2 ¿Ya eres miembro de un Banco de Tiempo que usa TimeOverflow? + %h2 Ja ets membre d'un Banc de Temps que fa servir TimeOverflow? %a.btn.btn-primary.btn-large{href: new_user_session_path, style:"font-size:30px;margin-top:20px;"} Entra aquí %p :markdown - Si eres una persona interesada en participar en un Banco de Tiempo, - busca tu Banco de Tiempo más cercano en - [bdtonline.org](http://www.bdtonline.org "Bancos de Tiempo"). + Si ets una persona interessada a participar en un Banc de Temps, + busca el teu Banc de Temps més proper a + [bdtonline.org](http://www.bdtonline.org "Bancs de Temps"). = image_tag "oferta.png", class: "img-responsive center-block" - %h2 Internet potencia los Bancos de Tiempo + %h2 Internet potencia els Bancs de Temps :markdown - TimeOveflow está especialmente diseñado **por y para los Bancos de Tiempo** - que existen físicamente ([ver mapa](http://www.bdtonline.org "Bancos de Tiempo")), - su fin es potenciarlos gracias a Internet. + TimeOveflow està especialment dissenyat ** per i per als Bancs de Temps ** + que existeixen físicament([veure mapa](http://www.bdtonline.org "Bancs de Temps")), + la seva fi és potenciar gràcies a Internet. - Gracias al trabajo conjunto de [CoopDevs](https://github.com/coopdevs) - y la [ADBdT](http://adbdt.org "Asociación para el Desarrollo de los Bancos de Tiempo") - hoy podemos ofrecer el sofware **TimeOverflow** a todos los Bancos de - Tiempo que así lo deseen de manera libre y gratuita. + Gràcies al treball conjunt de [CoopDevs](https://github.com/coopdevs) + i la [ADBdT](http://adbdt.org/ca "Associació per al Desenvolupament dels Bancs de Temps") + avui podem oferir el sofware **TimeOverflow** a tots els Bancs de + Temps que així ho desitgin de manera lliure i gratuïta. - El código fuente de TimeOverflow está disponible bajo una licencia - open source, ya se puede descargar en [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) + El codi font de TimeOverflow està disponible sota una llicència + open source, ja es pot descarregar a [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) .text-center = link_to "https://github.com/coopdevs/timeoverflow", title: "TimeOverflow Github" do diff --git a/app/views/pages/home_en.html.haml b/app/views/pages/home_en.html.haml index 9c70018..fab9fe2 100644 --- a/app/views/pages/home_en.html.haml +++ b/app/views/pages/home_en.html.haml @@ -10,56 +10,56 @@ %h1 TimeOverflow = image_tag "sand-clock.png", width: 50 %h2 The software designed by and for Time Banks - %em TimeOverflow es libre, gratuito y colaborativo + %em TimeOverflow is open source, free and collaborative .text-left{style: "margin-top: 40px;"} :markdown - Funcionalidades de **TimeOverflow**: + Features of **TimeOverflow**: - * Gestión del Banco de Tiempo con perfiles de administración - * Altas/bajas/modificaciones de miembros - * Publicar ofertas y demandas - * Introducir cheques y gestionar la contabilidad - * Red social y banca on-line accesible por los miembros - * Los miembros de un Banco de Tiempo pueden acceder al sistema y contactar con otros miembros - * Publicar ofertas y demandas - * Pagar horas a otros miembros + * Time Bank management with administration roles + * Creation/deletion/updates of bank members + * Posting of offers and inquiries + * Enter checks and manage accounting + * Social network and online banking accessible by members + * Members of a Time Bank can access the system and connect with other members + * Posting of offers and inquiries + * Pay hours to other members - %h2 ¿Eres un Banco de Tiempo? + %h2 Are you a Time Bank? .text-center %a.btn.btn-primary.btn-large{href: "http://adbdt.org/contacta/", style:"font-size:30px;margin-top:20px;"} - Solicita acceso a TimeOverflow + Request access to TimeOverflow .text-center %p - %em (nos pondremos en contacto contigo para ponerlo en marcha o haceros una demostración) + %em (We will contact you to start it up or make you a demonstration) .col-sm-6 .text-center - %h2 ¿Ya eres miembro de un Banco de Tiempo que usa TimeOverflow? + %h2 Already a member of a Time Bank that uses TimeOverflow? %a.btn.btn-primary.btn-large{href: new_user_session_path, style:"font-size:30px;margin-top:20px;"} - Entra aquí + Click here %p :markdown - Si eres una persona interesada en participar en un Banco de Tiempo, - busca tu Banco de Tiempo más cercano en + If you are a person interested in participating in a Time Bank, + find your closest Time Bank at [bdtonline.org](http://www.bdtonline.org "Bancos de Tiempo"). = image_tag "oferta.png", class: "img-responsive center-block" - %h2 Internet potencia los Bancos de Tiempo + %h2 Internet enhances Time Banks activity :markdown - TimeOveflow está especialmente diseñado **por y para los Bancos de Tiempo** - que existen físicamente ([ver mapa](http://www.bdtonline.org "Bancos de Tiempo")), - su fin es potenciarlos gracias a Internet. + TimeOveflow is specially designed **for and by Time Banks** + that physically exist ([see map](http://www.bdtonline.org "Bancos de Tiempo")), + and its purpose is to boost them thanks to Internet. - Gracias al trabajo conjunto de [CoopDevs](https://github.com/coopdevs) - y la [ADBdT](http://adbdt.org "Asociación para el Desarrollo de los Bancos de Tiempo") - hoy podemos ofrecer el sofware **TimeOverflow** a todos los Bancos de - Tiempo que así lo deseen de manera libre y gratuita. + Thanks to the joint job of [CoopDevs](https://github.com/coopdevs) + and [ADBdT](http://adbdt.org "Association for the Development of Time Banks") + today que can offer the software **TimeOverflow** to all Time Banks + that want it, open and for free. - El código fuente de TimeOverflow está disponible bajo una licencia - open source, ya se puede descargar en [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) + The source code of TimeOverflow is available based on an open source + license and you can download it at [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) .text-center = link_to "https://github.com/coopdevs/timeoverflow", title: "TimeOverflow Github" do diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index d5b4520..997ed11 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -2,6 +2,14 @@ en: devise: + shared: + links: + sign_in: "Login" + sign_up: "Register" + forgot_your_password: "I do not remember my password" + didnt_receive_confirmation_instructions: "Resend confirmation email" + didnt_receive_unlock_instructions: "Receive unlock instructions" + sign_in_with: "Login with %{provider}" confirmations: confirmed: "Your account was successfully confirmed." confirmed_and_signed_in: "Your account was successfully confirmed. You are now signed in." @@ -44,6 +52,9 @@ en: sessions: signed_in: "Signed in successfully." signed_out: "Signed out successfully." + new: + sign_in: "Login" + remember_me: "Remember me" unlocks: send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes." send_paranoid_instructions: "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes." diff --git a/config/routes.rb b/config/routes.rb index 443d5aa..8a8edaf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,6 @@ Timeoverflow::Application.routes.draw do get 'global/switch_lang' + get 'global/go_home' get 'tags/index' devise_for :users From 9377c4647f50e660b4745aaa4ec5bf4e5b18f8f8 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Fri, 14 Nov 2014 19:24:12 +0100 Subject: [PATCH 06/13] red background inactive users. Add a user redirects to user list --- app/controllers/users_controller.rb | 2 +- app/views/users/_user_rows.html.haml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index f9e1d0d..6c76c7b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -44,7 +44,7 @@ class UsersController < ApplicationController if @user.persisted? @user.add_to_organization current_organization - redirect_to @user + redirect_to users_path else redirect_to :action => "new" end diff --git a/app/views/users/_user_rows.html.haml b/app/views/users/_user_rows.html.haml index 9e3bd34..f7ebeb8 100644 --- a/app/views/users/_user_rows.html.haml +++ b/app/views/users/_user_rows.html.haml @@ -1,4 +1,4 @@ -%tr{ "ng-repeat" => "user in users | orderBy:sort | filter:filterTerm" } +%tr{ "ng-repeat" => "user in users | orderBy:sort | filter:filterTerm", "ng-class" => "{'bg-danger': !user.active}" } %td %img{ "ng-src" => "{{user.avatar}}", height: "32px", width: "32px" } %td {{user.member_id}} @@ -38,4 +38,3 @@ %span{ "ng-if" => "!user.active" } .glyphicon.glyphicon-ok = t ".activate" - From e2b4a4588ce12073fcb43371a954e14a5a49c0c8 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 12:03:41 +0100 Subject: [PATCH 07/13] Created rspec tests for global controller and fixed two defects --- app/controllers/application_controller.rb | 13 +++- app/controllers/global_controller.rb | 1 + spec/controllers/global_controller_spec.rb | 83 ++++++++++++++++++++-- 3 files changed, 91 insertions(+), 6 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c2693ef..4af5616 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,5 +1,6 @@ class ApplicationController < ActionController::Base before_filter :configure_permitted_parameters, if: :devise_controller? + before_filter :setup_vars include Pundit protect_from_forgery @@ -19,9 +20,14 @@ class ApplicationController < ActionController::Base def set_locale if params[:locale] session[:locale] = params[:locale] + else + l=extract_locale_from_accept_language_header + # we check that provided locale from browser is in our supported list of languages + # if not, we use the default from rails conf + session[:locale] = @supported_langs.include?(l)? l: I18n.default_locale.to_s end - # we look first at session then at default client locale and ultimately at default locale in rails - I18n.locale = session[:locale] || extract_locale_from_accept_language_header || I18n.default_locale + + I18n.locale = session[:locale] true end @@ -50,6 +56,9 @@ class ApplicationController < ActionController::Base end end + def setup_vars + @supported_langs=%w(es ca en) + end private diff --git a/app/controllers/global_controller.rb b/app/controllers/global_controller.rb index 3ec49f3..9119908 100644 --- a/app/controllers/global_controller.rb +++ b/app/controllers/global_controller.rb @@ -22,4 +22,5 @@ class GlobalController < ApplicationController redirect_to page_path(url) end + end diff --git a/spec/controllers/global_controller_spec.rb b/spec/controllers/global_controller_spec.rb index 58a502a..a9c08dc 100644 --- a/spec/controllers/global_controller_spec.rb +++ b/spec/controllers/global_controller_spec.rb @@ -2,11 +2,86 @@ require 'spec_helper' describe GlobalController do - describe "GET 'switch_lang'" do - it "returns http success" do - get 'switch_lang' - response.should be_success + context "User not logged and GET 'switch_lang' using browser's locale" do + subject { get 'switch_lang' } + + context 'browser in spanish' + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') + + #response.should be_success + subject.should redirect_to('/home') + end + + context 'browser in catalan' + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + + #response.should be_success + subject.should redirect_to('/home_ca') + end + + context 'broser in english' + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') + + #response.should be_success + subject.should redirect_to('/home_en') + end + + context 'browser in non-supported language' + it "redirects to spanish default home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('fr') + + #response.should be_success + subject.should redirect_to('/home') + end + end + + context "User not logged and GET 'switch_lang' by selection in navbar in english" do + subject { get 'switch_lang', {:locale => 'en'} } + + it "redirects to english home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + #ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header) + + #response.should be_success + subject.should redirect_to('/home_en') end end + context "User not logged and GET 'switch_lang' by selection in navbar in spanish" do + subject { get 'switch_lang', {:locale => 'es'} } + + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + #ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header) + + #response.should be_success + subject.should redirect_to('/home') + end + end + + context "User not logged and GET 'switch_lang' by selection in navbar in catalan" do + subject { get 'switch_lang', {:locale => 'ca'} } + it "redirects to catalan home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + #ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header) + + #response.should be_success + subject.should redirect_to('/home_ca') + end + end + end From 30700adced3ece6233cf440524542a1cd4836d0c Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 12:08:08 +0100 Subject: [PATCH 08/13] fixed comments on tests --- spec/controllers/global_controller_spec.rb | 28 +++++++--------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/spec/controllers/global_controller_spec.rb b/spec/controllers/global_controller_spec.rb index a9c08dc..fae52be 100644 --- a/spec/controllers/global_controller_spec.rb +++ b/spec/controllers/global_controller_spec.rb @@ -11,7 +11,7 @@ describe GlobalController do # context ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') - #response.should be_success + #response.should redirect to home spanish subject.should redirect_to('/home') end @@ -21,7 +21,7 @@ describe GlobalController do # context ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') - #response.should be_success + #response.should redirect to home catalan subject.should redirect_to('/home_ca') end @@ -31,7 +31,7 @@ describe GlobalController do # context ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') - #response.should be_success + #response.should redirect to home english subject.should redirect_to('/home_en') end @@ -41,7 +41,7 @@ describe GlobalController do # context ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('fr') - #response.should be_success + #response.should redirect to default home (spanish) subject.should redirect_to('/home') end end @@ -50,11 +50,7 @@ describe GlobalController do subject { get 'switch_lang', {:locale => 'en'} } it "redirects to english home" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - #ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header) - - #response.should be_success + #response.should redirect to home_en subject.should redirect_to('/home_en') end end @@ -63,11 +59,7 @@ describe GlobalController do subject { get 'switch_lang', {:locale => 'es'} } it "redirects to spanish home" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - #ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header) - - #response.should be_success + #response.should redirect to home (spanish) subject.should redirect_to('/home') end end @@ -75,13 +67,9 @@ describe GlobalController do context "User not logged and GET 'switch_lang' by selection in navbar in catalan" do subject { get 'switch_lang', {:locale => 'ca'} } it "redirects to catalan home" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - #ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header) - - #response.should be_success + #response.should redirect to home_ca subject.should redirect_to('/home_ca') end end - + end From 31efb0a0726e2a8b4a579252e1ad33b0717523d7 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 12:44:10 +0100 Subject: [PATCH 09/13] fixed issue setting up right language --- app/controllers/application_controller.rb | 11 +-- spec/controllers/global_controller_spec.rb | 83 ++++++++++++++++++---- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4af5616..d59f036 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -19,14 +19,15 @@ class ApplicationController < ActionController::Base def set_locale if params[:locale] - session[:locale] = params[:locale] + locale=params[:locale] + session[:locale] = locale else - l=extract_locale_from_accept_language_header - # we check that provided locale from browser is in our supported list of languages - # if not, we use the default from rails conf - session[:locale] = @supported_langs.include?(l)? l: I18n.default_locale.to_s + locale=extract_locale_from_accept_language_header end + # we check that provided locale from browser is in our supported list of languages + # if not, we use the default from rails conf + session[:locale] ||= @supported_langs.include?(locale)? locale: I18n.default_locale.to_s I18n.locale = session[:locale] true end diff --git a/spec/controllers/global_controller_spec.rb b/spec/controllers/global_controller_spec.rb index fae52be..2054eef 100644 --- a/spec/controllers/global_controller_spec.rb +++ b/spec/controllers/global_controller_spec.rb @@ -1,11 +1,13 @@ require 'spec_helper' describe GlobalController do + let! (:test_organization) { Fabricate(:organization)} + let! (:member) { Fabricate(:member, organization: test_organization)} context "User not logged and GET 'switch_lang' using browser's locale" do subject { get 'switch_lang' } - context 'browser in spanish' + context 'browser in spanish' do it "redirects to spanish home" do # We stub the method that extracts browsers language info and force to return expected value for # context @@ -14,18 +16,20 @@ describe GlobalController do #response.should redirect to home spanish subject.should redirect_to('/home') end - - context 'browser in catalan' - it "redirects to spanish home" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') - - #response.should redirect to home catalan - subject.should redirect_to('/home_ca') end - context 'broser in english' + context 'browser in catalan' do + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + + #response.should redirect to home catalan + subject.should redirect_to('/home_ca') + end + end + + context 'broser in english' do it "redirects to spanish home" do # We stub the method that extracts browsers language info and force to return expected value for # context @@ -34,8 +38,9 @@ describe GlobalController do #response.should redirect to home english subject.should redirect_to('/home_en') end + end - context 'browser in non-supported language' + context 'browser in non-supported language' do it "redirects to spanish default home" do # We stub the method that extracts browsers language info and force to return expected value for # context @@ -44,6 +49,7 @@ describe GlobalController do #response.should redirect to default home (spanish) subject.should redirect_to('/home') end + end end context "User not logged and GET 'switch_lang' by selection in navbar in english" do @@ -72,4 +78,57 @@ describe GlobalController do end end +# +# Now we test with a user logged +# +context "User logged and GET 'switch_lang' using browser's locale" do + login(member.user) + subject { get 'switch_lang' } + + context 'browser in spanish' do + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') + + #response.should redirect to home spanish + subject.should redirect_to('/home') + end + end + + context 'browser in catalan' do + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + + #response.should redirect to home catalan + subject.should redirect_to('/home_ca') + end + end + + context 'broser in english' do + it "redirects to spanish home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') + + #response.should redirect to home english + subject.should redirect_to('/home_en') + end + end + + context 'browser in non-supported language' do + it "redirects to spanish default home" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('fr') + + #response.should redirect to default home (spanish) + subject.should redirect_to('/home') + end + end +end + + end From 69317fc642186237d80a87fac016098fcf2efb43 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 15:13:16 +0100 Subject: [PATCH 10/13] Added rspec tests using capybara --- Gemfile | 1 + Gemfile.lock | 12 ++ app/views/application/_navbar.html.haml | 6 +- spec/controllers/global_controller_spec.rb | 128 +++++++++++++++------ spec/spec_helper.rb | 1 + 5 files changed, 110 insertions(+), 38 deletions(-) diff --git a/Gemfile b/Gemfile index 02fe369..d7a97c0 100644 --- a/Gemfile +++ b/Gemfile @@ -68,6 +68,7 @@ end group :development, :test do gem "rspec-rails", '~> 2.14' + gem "capybara", '~> 2.4.4' end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index bd6ed1b..c90733e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -72,6 +72,12 @@ GEM sass (~> 3.3) thor builder (3.2.2) + capybara (2.4.4) + mime-types (>= 1.16) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (~> 2.0) choice (0.1.6) coderay (1.1.0) coffee-rails (4.0.1) @@ -146,10 +152,13 @@ GEM treetop (~> 1.4.8) memcachier (0.0.2) mime-types (1.25.1) + mini_portile (0.6.1) minitest (5.3.4) multi_json (1.10.1) ngannotate-rails (0.9.2) rails (>= 3.1) + nokogiri (1.6.4.1) + mini_portile (~> 0.6.0) orm_adapter (0.5.0) paranoia (2.0.0) activerecord (~> 4.0) @@ -257,6 +266,8 @@ GEM multi_json (~> 1.0, >= 1.0.2) warden (1.2.3) rack (>= 1.0) + xpath (2.0.0) + nokogiri (~> 1.3) PLATFORMS ruby @@ -266,6 +277,7 @@ DEPENDENCIES awesome_print better_errors binding_of_caller + capybara (~> 2.4.4) coffee-rails dalli database_cleaner diff --git a/app/views/application/_navbar.html.haml b/app/views/application/_navbar.html.haml index 58a66ed..6490186 100644 --- a/app/views/application/_navbar.html.haml +++ b/app/views/application/_navbar.html.haml @@ -88,13 +88,13 @@ %li.divider{role: :presentation} %li{role: :presentation} - = link_to "/global/switch_lang?locale=es" do + = link_to "/global/switch_lang?locale=es", id: 'es_flag' do = image_tag("blank.png",{class: "flag flag-es", alt: "Español"}) %li{role: :presentation} - = link_to "/global/switch_lang?locale=ca" do + = link_to "/global/switch_lang?locale=ca", id: 'ca_flag' do = image_tag("blank.png",{class: "flag flag-catalonia", alt: "Català"}) %li{role: :presentation} - = link_to "/global/switch_lang?locale=en" do + = link_to "/global/switch_lang?locale=en", id: 'en_flag' do = image_tag("blank.png",{class: "flag flag-gb", alt: "English"}) diff --git a/spec/controllers/global_controller_spec.rb b/spec/controllers/global_controller_spec.rb index 2054eef..0ab2f58 100644 --- a/spec/controllers/global_controller_spec.rb +++ b/spec/controllers/global_controller_spec.rb @@ -1,10 +1,7 @@ require 'spec_helper' describe GlobalController do - let! (:test_organization) { Fabricate(:organization)} - let! (:member) { Fabricate(:member, organization: test_organization)} - - context "User not logged and GET 'switch_lang' using browser's locale" do + describe "User not logged and GET 'switch_lang' using browser's locale" do subject { get 'switch_lang' } context 'browser in spanish' do @@ -52,7 +49,7 @@ describe GlobalController do end end - context "User not logged and GET 'switch_lang' by selection in navbar in english" do + describe "User not logged and GET 'switch_lang' by selection in navbar in english" do subject { get 'switch_lang', {:locale => 'en'} } it "redirects to english home" do @@ -61,7 +58,7 @@ describe GlobalController do end end - context "User not logged and GET 'switch_lang' by selection in navbar in spanish" do + describe "User not logged and GET 'switch_lang' by selection in navbar in spanish" do subject { get 'switch_lang', {:locale => 'es'} } it "redirects to spanish home" do @@ -70,7 +67,7 @@ describe GlobalController do end end - context "User not logged and GET 'switch_lang' by selection in navbar in catalan" do + describe "User not logged and GET 'switch_lang' by selection in navbar in catalan" do subject { get 'switch_lang', {:locale => 'ca'} } it "redirects to catalan home" do #response.should redirect to home_ca @@ -78,57 +75,118 @@ describe GlobalController do end end + + # + # Now with user logged in in different default browser languages + # + + describe "User logged and GET 'switch_lang' using browser's locale" do + + let! (:test_organization) { Fabricate(:organization)} + let! (:member) { Fabricate(:member, organization: test_organization) } + + context 'browser in spanish' do + it "redirects to spanish offers page" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') + + login(member.user) + visit offers_path + + current_path.should == "/offers" + + page.body.should include('Ofertas') + end + end + + context 'browser in catalan' do + it "redirects to catalan offers page" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + + login(member.user) + visit offers_path + + current_path.should == "/offers" + + page.body.should include('Ofertes') + end + end + + context 'browser in catalan' do + it "redirects to catalan offers page" do + # We stub the method that extracts browsers language info and force to return expected value for + # context + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') + + login(member.user) + visit offers_path + + current_path.should == "/offers" + + page.body.should include('Offers') + end + end + end + # -# Now we test with a user logged +# Now with user logged in having selected language # -context "User logged and GET 'switch_lang' using browser's locale" do - login(member.user) - subject { get 'switch_lang' } + +describe "User logged and GET 'switch_lang' using browser's locale" do + + let! (:test_organization) { Fabricate(:organization)} + let! (:member) { Fabricate(:member, organization: test_organization) } context 'browser in spanish' do - it "redirects to spanish home" do + it "redirects to spanish offers page" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('it') - #response.should redirect to home spanish - subject.should redirect_to('/home') + visit '/' + click_link 'es_flag' + login(member.user) + visit offers_path + + current_path.should == "/offers" + page.body.should include('Ofertas') end end context 'browser in catalan' do - it "redirects to spanish home" do + it "redirects to catalan offers page" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('it') + visit '/' + click_link 'en_flag' + login(member.user) + visit offers_path - #response.should redirect to home catalan - subject.should redirect_to('/home_ca') + current_path.should == "/offers" + page.body.should include('Offers') end end - context 'broser in english' do - it "redirects to spanish home" do + context 'browser in catalan' do + it "redirects to catalan offers page" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('it') + visit '/' + click_link 'ca_flag' + login(member.user) + visit offers_path - #response.should redirect to home english - subject.should redirect_to('/home_en') - end - end - - context 'browser in non-supported language' do - it "redirects to spanish default home" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('fr') - - #response.should redirect to default home (spanish) - subject.should redirect_to('/home') + current_path.should == "/offers" + page.body.should include('Ofertes') end end end + end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f1df85c..54ef868 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,6 +3,7 @@ ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' +require 'capybara/rails' # Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. From 23e27c6c02b59347087215ffcc65557d4ef09e33 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 16:39:13 +0100 Subject: [PATCH 11/13] All tests are successful again --- spec/controllers/global_controller_spec.rb | 100 ++++++++---------- spec/controllers/inquiries_controller_spec.rb | 2 + spec/controllers/tags_controller_spec.rb | 2 + spec/controllers/transfers_controller_spec.rb | 5 +- spec/spec_helper.rb | 6 ++ 5 files changed, 61 insertions(+), 54 deletions(-) diff --git a/spec/controllers/global_controller_spec.rb b/spec/controllers/global_controller_spec.rb index 0ab2f58..0298e53 100644 --- a/spec/controllers/global_controller_spec.rb +++ b/spec/controllers/global_controller_spec.rb @@ -1,6 +1,9 @@ require 'spec_helper' describe GlobalController do + include_context "stub browser locale" + before { set_browser_locale('it') } + describe "User not logged and GET 'switch_lang' using browser's locale" do subject { get 'switch_lang' } @@ -8,7 +11,7 @@ describe GlobalController do it "redirects to spanish home" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') + set_browser_locale('es') #response.should redirect to home spanish subject.should redirect_to('/home') @@ -19,7 +22,7 @@ describe GlobalController do it "redirects to spanish home" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + set_browser_locale('ca') #response.should redirect to home catalan subject.should redirect_to('/home_ca') @@ -30,7 +33,7 @@ describe GlobalController do it "redirects to spanish home" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') + set_browser_locale('en') #response.should redirect to home english subject.should redirect_to('/home_en') @@ -41,7 +44,8 @@ describe GlobalController do it "redirects to spanish default home" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('fr') + # We stub to an invalid locale to check it redirects to the right default one + set_browser_locale('fr') #response.should redirect to default home (spanish) subject.should redirect_to('/home') @@ -89,7 +93,7 @@ describe GlobalController do it "redirects to spanish offers page" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('es') + set_browser_locale('es') login(member.user) visit offers_path @@ -104,7 +108,7 @@ describe GlobalController do it "redirects to catalan offers page" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('ca') + set_browser_locale('ca') login(member.user) visit offers_path @@ -119,7 +123,7 @@ describe GlobalController do it "redirects to catalan offers page" do # We stub the method that extracts browsers language info and force to return expected value for # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('en') + set_browser_locale('en') login(member.user) visit offers_path @@ -131,62 +135,52 @@ describe GlobalController do end end -# -# Now with user logged in having selected language -# + # + # Now with user logged in having selected language + # -describe "User logged and GET 'switch_lang' using browser's locale" do + describe "User logged and GET 'switch_lang' using browser's locale" do - let! (:test_organization) { Fabricate(:organization)} - let! (:member) { Fabricate(:member, organization: test_organization) } + let! (:test_organization) { Fabricate(:organization)} + let! (:member) { Fabricate(:member, organization: test_organization) } - context 'browser in spanish' do - it "redirects to spanish offers page" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('it') + context 'user clicks in Spanish flag' do + it "redirects to spanish offers page" do + + visit '/' + click_link 'es_flag' + login(member.user) + visit offers_path - visit '/' - click_link 'es_flag' - login(member.user) - visit offers_path - - current_path.should == "/offers" - page.body.should include('Ofertas') + current_path.should == "/offers" + page.body.should include('Ofertas') + end end - end - context 'browser in catalan' do - it "redirects to catalan offers page" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('it') - visit '/' - click_link 'en_flag' - login(member.user) - visit offers_path + context 'user clicks in English flag' do + it "redirects to catalan offers page" do - current_path.should == "/offers" - page.body.should include('Offers') + visit '/' + click_link 'en_flag' + login(member.user) + visit offers_path + + current_path.should == "/offers" + page.body.should include('Offers') + end end - end - context 'browser in catalan' do - it "redirects to catalan offers page" do - # We stub the method that extracts browsers language info and force to return expected value for - # context - ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return('it') - visit '/' - click_link 'ca_flag' - login(member.user) - visit offers_path + context 'user clicks in catalan flag' do + it "redirects to catalan offers page" do - current_path.should == "/offers" - page.body.should include('Ofertes') + visit '/' + click_link 'ca_flag' + login(member.user) + visit offers_path + + current_path.should == "/offers" + page.body.should include('Ofertes') + end end end end - - - -end diff --git a/spec/controllers/inquiries_controller_spec.rb b/spec/controllers/inquiries_controller_spec.rb index 5424c87..d3d0f72 100644 --- a/spec/controllers/inquiries_controller_spec.rb +++ b/spec/controllers/inquiries_controller_spec.rb @@ -5,6 +5,8 @@ describe InquiriesController do let (:member) { Fabricate(:member, organization: test_organization)} let (:another_member) { Fabricate(:member, organization: test_organization)} let! (:inquiry) { Fabricate(:inquiry, user: member.user, organization: test_organization)} + include_context "stub browser locale" + before { set_browser_locale('ca') } describe "GET #index" do context "with a logged user" do diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb index abeaffc..5c3c152 100644 --- a/spec/controllers/tags_controller_spec.rb +++ b/spec/controllers/tags_controller_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe TagsController do + include_context "stub browser locale" + before { set_browser_locale('it') } describe "GET 'index'" do it "returns http success" do diff --git a/spec/controllers/transfers_controller_spec.rb b/spec/controllers/transfers_controller_spec.rb index 122b2b9..938da17 100644 --- a/spec/controllers/transfers_controller_spec.rb +++ b/spec/controllers/transfers_controller_spec.rb @@ -5,10 +5,13 @@ describe TransfersController do let (:member_admin) { Fabricate(:member, organization: test_organization, manager: true)} let (:member_giver) { Fabricate(:member, organization: test_organization) } let (:member_taker) { Fabricate(:member, organization: test_organization) } - + include_context "stub browser locale" + before { set_browser_locale('ca') } + describe "POST #create" do before { login(user) } + context "with valid params" do context "with an admin user logged" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 54ef868..7cc4091 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -69,3 +69,9 @@ RSpec.configure do |config| # Controllers must render the content of the view config.render_views end + +RSpec.shared_context 'stub browser locale' do + def set_browser_locale(locale) + ApplicationController.any_instance.stub(:extract_locale_from_accept_language_header).and_return(locale) + end +end From eeac23d969e71d49a8462a9fbdd3f9649de9252c Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 16:49:51 +0100 Subject: [PATCH 12/13] Added tests for offers --- spec/controllers/offers_controller_spec.rb | 86 ++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 spec/controllers/offers_controller_spec.rb diff --git a/spec/controllers/offers_controller_spec.rb b/spec/controllers/offers_controller_spec.rb new file mode 100644 index 0000000..1315237 --- /dev/null +++ b/spec/controllers/offers_controller_spec.rb @@ -0,0 +1,86 @@ +require 'spec_helper' + +describe OffersController do + let (:test_organization) { Fabricate(:organization)} + let (:member) { Fabricate(:member, organization: test_organization)} + let (:another_member) { Fabricate(:member, organization: test_organization)} + let! (:offer) { Fabricate(:offer, user: member.user, organization: test_organization)} + include_context "stub browser locale" + before { set_browser_locale('ca') } + + describe "GET #index" do + context "with a logged user" do + it "populates and array of offers" do + login(another_member.user) + + get 'index' + expect(assigns(:offers)).to eq([offer]) + end + end + end + + + describe "GET #show" do + context "with valid params" do + context "with a logged user" do + it "assigns the requested offer to @offer" do + login(another_member.user) + + get 'show', id: offer.id + expect(assigns(:offer)).to eq(offer) + end + end + end + end + + describe "POST #create" do + context "with valid params" do + context "with a logged user" do + it "creates a new offer" do + login(another_member.user) + + expect { + post 'create', offer: Fabricate.to_params(:offer) + }.to change(Offer,:count).by(1) + end + end + end + end + + describe "PUT #update" do + context "with valid params" do + context "with a logged user" do + it "located the requested @offer" do + login(member.user) + + put 'update', id: offer.id, offer: Fabricate.to_params(:offer) + expect(assigns(:offer)).to eq(offer) + end + + it "changes @offer's attributes" do + login(member.user) + + put 'update', id: offer.id, offer: Fabricate.to_params(:offer, user: member, title: "New title", description: "New description") + + offer.reload + expect(offer.title).to eq("New title") + expect(offer.description).to eq("New description") + end + end + end + + context "with invalid params" do + context "with a logged user" do + it "does not change @offer's attributes" do + login(member.user) + + put :update, id: offer.id, offer: Fabricate.to_params(:offer, user: nil, title: "New title", description: "New description") + + expect(offer.title).not_to eq("New title") + expect(offer.description).not_to eq("New description") + end + end + end + end + +end From 9ea32a5803abd97ae4bd75e3f254330a611cf6e6 Mon Sep 17 00:00:00 2001 From: Dani Macho Date: Sun, 16 Nov 2014 17:35:03 +0100 Subject: [PATCH 13/13] Added tests for users, some still failing --- spec/controllers/users_controller_spec.rb | 146 ++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 spec/controllers/users_controller_spec.rb diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb new file mode 100644 index 0000000..e9e333a --- /dev/null +++ b/spec/controllers/users_controller_spec.rb @@ -0,0 +1,146 @@ +require 'spec_helper' + +describe UsersController do + let (:test_organization) { Fabricate(:organization)} + let (:member_admin) { Fabricate(:member, organization: test_organization, manager: true)} + let (:member) { Fabricate(:member, organization: test_organization)} + let! (:user) { member.user } + let! (:admin_user) { member_admin.user} + include_context "stub browser locale" + before { set_browser_locale('ca') } + + describe "GET #index" do + context "with an normal logged user" do + it "populates and array of users" do + login(member.user) + + get 'index' + expect(assigns(:users)).to eq([user,admin_user]) + end + end + context "with an admin logged user" do + it "populates and array of users" do + login(member_admin.user) + + get 'index' + expect(assigns(:users)).to eq([user,admin_user]) + end + end + end + + + describe "GET #show" do + context "with valid params" do + context "with a normal logged user" do + it "assigns the requested user to @user" do + login(member.user) + + get 'show', id: user.id + expect(assigns(:user)).to eq(user) + end + end + context "with an admin logged user" do + it "assigns the requested user to @user" do + login(member_admin.user) + + get 'show', id: user.id + expect(assigns(:user)).to eq(user) + end + end + end + end + + describe "POST #create" do + context "with valid params" do + subject {post 'create', user: Fabricate.to_params(:user)} + + context "with a normal logged user" do + it "does not create a new user" do + login(member.user) + + # TODO: + # Expect exception... + # + expect { + post 'create', user: Fabricate.to_params(:user) + }.to change(User,:count).by(0) + end + end + + context "with an admin logged user" do + it "creates a new user" do + login(member_admin.user) + + expect { + subject + }.to change(User,:count).by(1) + + subject.should redirect_to('/members') + + end + end + end + end + + describe "PUT #update" do + context "with valid params" do + context "with a logged" do + + context "normal user" do + it "located the requested @user" do + login(member.user) + + put 'update', id: user.id, user: Fabricate.to_params(:user) + expect(assigns(:user)).to eq(user) + end + + # + # TODO RAISE EXCEPTION + # + it "changes @user's attributes" do + login(member.user) + + put 'update', id: user.id, user: Fabricate.to_params(:user, username: user.username, email: user.email, phone:'1234', alt_phone: "4321") + + user.reload + expect(user.phone).not_to eq("1234") + expect(user.alt_phone).not_to eq("4321") + end + end + + context "admin user" do + it "located the requested @user" do + login(member_admin.user) + + put 'update', id: user.id, user: Fabricate.to_params(:user) + expect(assigns(:user)).to eq(user) + end + + it "changes @user's attributes" do + login(member_admin.user) + + put 'update', id: user.id, user: Fabricate.to_params(:user, username: user.username, email: user.email, phone:'1234', alt_phone: "4321") + + user.reload + expect(user.phone).to eq("1234") + expect(user.alt_phone).to eq("4321") + end + end + end + end + + context "with invalid params" do + context "with a logged admin user" do + it "does not change @user's attributes" do + login(member_admin.user) + + put :update, id: user.id, user: Fabricate.to_params(:user, username: nil, email: nil, phone: "1234", alt_phone: "4321") + + expect(user.phone).not_to eq("1234") + expect(user.alt_phone).not_to eq("4321") + end + end + end + end + +end