diff --git a/app/assets/javascripts/darkswarm/cart.js.coffee b/app/assets/javascripts/darkswarm/cart.js.coffee index 471991143a..1e971c8bb4 100644 --- a/app/assets/javascripts/darkswarm/cart.js.coffee +++ b/app/assets/javascripts/darkswarm/cart.js.coffee @@ -15,5 +15,5 @@ $(document).ready -> $('td.cart-adjustments a').click -> $('.cart_adjustment').toggle() - $(this).html('Item Handling Fees (included in item totals)') + $(this).html(t('item_handling_fees')) false diff --git a/app/assets/javascripts/darkswarm/controllers/authentication/forgot_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/authentication/forgot_controller.js.coffee index 175e18d2a2..85920de958 100644 --- a/app/assets/javascripts/darkswarm/controllers/authentication/forgot_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/authentication/forgot_controller.js.coffee @@ -7,6 +7,6 @@ Darkswarm.controller "ForgotCtrl", ($scope, $http, $location, AuthenticationServ $http.post("/user/spree_user/password", {spree_user: $scope.spree_user}).success (data)-> $scope.sent = true .error (data) -> - $scope.errors = "Email address not found" + $scope.errors = t 'email_not_found' else - $scope.errors = "You must provide an email address" + $scope.errors = t 'email_required' diff --git a/app/assets/javascripts/darkswarm/controllers/authentication/login_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/authentication/login_controller.js.coffee index 144cf0dfef..f91e137ca7 100644 --- a/app/assets/javascripts/darkswarm/controllers/authentication/login_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/authentication/login_controller.js.coffee @@ -2,7 +2,7 @@ Darkswarm.controller "LoginCtrl", ($scope, $http, $window, AuthenticationService $scope.path = "/login" $scope.submit = -> - Loading.message = "Hold on a moment, we're logging you in" + Loading.message = t 'logging_in' $http.post("/user/spree_user/sign_in", {spree_user: $scope.spree_user}).success (data)-> if Redirections.after_login $window.location.href = $window.location.origin + Redirections.after_login diff --git a/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee index 374f0b35d5..924df3c447 100644 --- a/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee @@ -3,18 +3,18 @@ Darkswarm.controller "PaymentCtrl", ($scope, $timeout) -> $scope.name = "payment" $scope.months = [ - {key: "January", value: "1"}, - {key: "February", value: "2"}, - {key: "March", value: "3"}, - {key: "April", value: "4"}, - {key: "May", value: "5"}, - {key: "June", value: "6"}, - {key: "July", value: "7"}, - {key: "August", value: "8"}, - {key: "September", value: "9"}, - {key: "October", value: "10"}, - {key: "November", value: "11"}, - {key: "December", value: "12"}, + {key: t("january"), value: "1"}, + {key: t("february"), value: "2"}, + {key: t("march"), value: "3"}, + {key: t("april"), value: "4"}, + {key: t("may"), value: "5"}, + {key: t("june"), value: "6"}, + {key: t("july"), value: "7"}, + {key: t("august"), value: "8"}, + {key: t("september"), value: "9"}, + {key: t("october"), value: "10"}, + {key: t("november"), value: "11"}, + {key: t("december"), value: "12"}, ] $scope.years = [moment().year()..(moment().year()+15)] diff --git a/app/assets/javascripts/darkswarm/directives/change_hub.js.coffee b/app/assets/javascripts/darkswarm/directives/change_hub.js.coffee index a699e18902..8629edfce2 100644 --- a/app/assets/javascripts/darkswarm/directives/change_hub.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/change_hub.js.coffee @@ -10,7 +10,7 @@ Darkswarm.directive "ofnChangeHub", (CurrentHub, Cart) -> if cart_will_need_emptying() elm.bind 'click', (ev)-> - if confirm "Are you sure? This will change your selected hub and remove any items in your shopping cart." + if confirm t('confirm_hub_change') Cart.clear() else ev.preventDefault() diff --git a/app/assets/javascripts/darkswarm/directives/change_order_cycle.js.coffee b/app/assets/javascripts/darkswarm/directives/change_order_cycle.js.coffee index a747e5c219..b2478a6fad 100644 --- a/app/assets/javascripts/darkswarm/directives/change_order_cycle.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/change_order_cycle.js.coffee @@ -12,7 +12,7 @@ Darkswarm.directive "ofnChangeOrderCycle", (OrderCycle, Cart, storage) -> elm.bind 'change', (ev)-> if cart_needs_emptying() - if confirm "Are you sure? This will change your selected order cycle and remove any items in your shopping cart." + if confirm t('confirm_oc_change') Cart.clear() scope.changeOrderCycle() else diff --git a/app/assets/javascripts/darkswarm/directives/map_search.js.coffee b/app/assets/javascripts/darkswarm/directives/map_search.js.coffee index 88456db2a3..f67407ffb3 100644 --- a/app/assets/javascripts/darkswarm/directives/map_search.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/map_search.js.coffee @@ -3,7 +3,7 @@ Darkswarm.directive 'mapSearch', ($timeout)-> restrict: 'E' require: '^googleMap' replace: true - template: '' + template: '' link: (scope, elem, attrs, ctrl)-> $timeout => map = ctrl.getMap() diff --git a/app/assets/javascripts/darkswarm/directives/registration_limit_modal.js.coffee b/app/assets/javascripts/darkswarm/directives/registration_limit_modal.js.coffee index 2b38b3d31f..fce9a7ee59 100644 --- a/app/assets/javascripts/darkswarm/directives/registration_limit_modal.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/registration_limit_modal.js.coffee @@ -9,5 +9,5 @@ Darkswarm.directive "ofnRegistrationLimitModal", (Navigation, $modal, Loading) - scope.modalInstance.result.then scope.close, scope.close scope.close = -> - Loading.message = "Taking you back to the home page" + Loading.message = t 'going_back_to_home_page' Navigation.go "/" diff --git a/app/assets/javascripts/darkswarm/filters/dates.js.coffee b/app/assets/javascripts/darkswarm/filters/dates.js.coffee index d223411e99..7b5dd861d5 100644 --- a/app/assets/javascripts/darkswarm/filters/dates.js.coffee +++ b/app/assets/javascripts/darkswarm/filters/dates.js.coffee @@ -5,6 +5,6 @@ Darkswarm.filter "date_in_words", -> Darkswarm.filter "sensible_timeframe", (date_in_wordsFilter)-> (date) -> if moment().add('days', 2) < moment(date) - "Orders open" + t 'orders_open' else - "Closing #{date_in_wordsFilter(date)}" + t('closing') + date_in_wordsFilter(date) diff --git a/app/assets/javascripts/darkswarm/i18n.js.coffee b/app/assets/javascripts/darkswarm/i18n.js.coffee new file mode 100644 index 0000000000..857437a51d --- /dev/null +++ b/app/assets/javascripts/darkswarm/i18n.js.coffee @@ -0,0 +1,15 @@ +# Declares the translation function t. +# You can use t('login') in Javascript. +window.t = (key, options = {}) -> + if I18n == undefined + console.log 'The I18n object is undefined. Cannot translate text.' + return key + text = I18n[key] + return key if text == undefined + text = text.split("%{#{name}}").join(value) for name, value of options + text + +# Provides the translation function t on all scopes. +# You can write {{t('login')}} in all templates. +window.Darkswarm.run ($rootScope) -> + $rootScope.t = t diff --git a/app/assets/javascripts/darkswarm/mixins/fieldset_mixin.js.coffee b/app/assets/javascripts/darkswarm/mixins/fieldset_mixin.js.coffee index ee4058221c..e5aa1375c0 100644 --- a/app/assets/javascripts/darkswarm/mixins/fieldset_mixin.js.coffee +++ b/app/assets/javascripts/darkswarm/mixins/fieldset_mixin.js.coffee @@ -32,10 +32,10 @@ window.FieldsetMixin = ($scope)-> errors = for error, invalid of $scope.error(path) if invalid switch error - when "required" then "can't be blank" - when "number" then "must be number" - when "email" then "must be email address" + when "required" then t('error_required') + when "number" then t('error_number') + when "email" then t('error_email') #server_errors = $scope.Order.errors[path.replace('order.', '')] #errors.push server_errors if server_errors? - (errors.filter (error) -> error?).join ", " \ No newline at end of file + (errors.filter (error) -> error?).join ", " diff --git a/app/assets/javascripts/darkswarm/services/authentication_service.js.coffee b/app/assets/javascripts/darkswarm/services/authentication_service.js.coffee index c83022b579..10f75675f8 100644 --- a/app/assets/javascripts/darkswarm/services/authentication_service.js.coffee +++ b/app/assets/javascripts/darkswarm/services/authentication_service.js.coffee @@ -28,6 +28,6 @@ Darkswarm.factory "AuthenticationService", (Navigation, $modal, $location, Redir if location.pathname in ["/", "/checkout"] Navigation.navigate "/" else - Loading.message = "Taking you back to the home page" + Loading.message = t 'going_back_to_home_page' location.hash = "" location.pathname = "/" diff --git a/app/assets/javascripts/darkswarm/services/cart.js.coffee b/app/assets/javascripts/darkswarm/services/cart.js.coffee index 7550b151f0..ed7d9ac273 100644 --- a/app/assets/javascripts/darkswarm/services/cart.js.coffee +++ b/app/assets/javascripts/darkswarm/services/cart.js.coffee @@ -44,7 +44,7 @@ Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, storage)-> unsaved: => @dirty = true $(window).bind "beforeunload", -> - "Your order hasn't been saved yet. Give us a few seconds to finish!" + t 'order_not_saved_yet' line_items_present: => @line_items.filter (li)-> diff --git a/app/assets/javascripts/darkswarm/services/checkout.js.coffee b/app/assets/javascripts/darkswarm/services/checkout.js.coffee index a12ed1ae45..652ecd02f9 100644 --- a/app/assets/javascripts/darkswarm/services/checkout.js.coffee +++ b/app/assets/javascripts/darkswarm/services/checkout.js.coffee @@ -6,7 +6,7 @@ Darkswarm.factory 'Checkout', (CurrentOrder, ShippingMethods, PaymentMethods, $h ship_address_same_as_billing: true submit: -> - Loading.message = "Submitting your order: please wait" + Loading.message = t 'submitting_order' $http.put('/checkout', {order: @preprocess()}).success (data, status)=> Navigation.go data.path .error (response, status)=> diff --git a/app/assets/javascripts/darkswarm/services/enterprise_registration_service.js.coffee b/app/assets/javascripts/darkswarm/services/enterprise_registration_service.js.coffee index 702a382eb0..c4055bb93c 100644 --- a/app/assets/javascripts/darkswarm/services/enterprise_registration_service.js.coffee +++ b/app/assets/javascripts/darkswarm/services/enterprise_registration_service.js.coffee @@ -11,7 +11,7 @@ Darkswarm.factory "EnterpriseRegistrationService", ($http, RegistrationService, @enterprise[key] = value create: => - Loading.message = "Creating " + @enterprise.name + Loading.message = t('creating') + " " + @enterprise.name $http( method: "POST" url: "/api/enterprises" @@ -28,14 +28,13 @@ Darkswarm.factory "EnterpriseRegistrationService", ($http, RegistrationService, Loading.clear() if data?.errors? errors = ("#{k.capitalize()} #{v[0]}" for k, v of data.errors when v.length > 0) - alert "Failed to create your enterprise.\n" + errors.join('\n') + alert t('failed_to_create_enterprise') + "\n" + errors.join('\n') else - alert('Failed to create your enterprise.\nPlease ensure all fields are completely filled out.') + alert(t('failed_to_create_enterprise_unknown')) ) - # RegistrationService.select('about') update: (step) => - Loading.message = "Updating " + @enterprise.name + Loading.message = t('updating') + " " + @enterprise.name $http( method: "PUT" url: "/api/enterprises/#{@enterprise.id}" @@ -48,9 +47,8 @@ Darkswarm.factory "EnterpriseRegistrationService", ($http, RegistrationService, RegistrationService.select(step) ).error((data) -> Loading.clear() - alert('Failed to update your enterprise.\nPlease ensure all fields are completely filled out.') + alert(t('failed_to_create_enterprise_unknown')) ) - # RegistrationService.select(step) prepare: => enterprise = {} diff --git a/app/assets/javascripts/darkswarm/services/filter_selectors.js.coffee b/app/assets/javascripts/darkswarm/services/filter_selectors.js.coffee index 47ed12806d..ca80ae344c 100644 --- a/app/assets/javascripts/darkswarm/services/filter_selectors.js.coffee +++ b/app/assets/javascripts/darkswarm/services/filter_selectors.js.coffee @@ -16,11 +16,11 @@ Darkswarm.factory "FilterSelectorsService", -> filterText: (active)=> total = @totalActive() if total == 0 - if active then "Hide filters" else "Filter by" + if active then t('hide_filters') else t('filter_by') else if total == 1 - "1 filter applied" + t 'one_filter_applied' else - "#{@totalActive()} filters applied" + @totalActive() + t('x_filters_applied') clearAll: => for selector in @selectors diff --git a/app/assets/javascripts/darkswarm/services/registration_service.js.coffee b/app/assets/javascripts/darkswarm/services/registration_service.js.coffee index 530d118025..bb45a7ad79 100644 --- a/app/assets/javascripts/darkswarm/services/registration_service.js.coffee +++ b/app/assets/javascripts/darkswarm/services/registration_service.js.coffee @@ -19,5 +19,5 @@ angular.module('Darkswarm').factory "RegistrationService", (Navigation, $modal, @current_step close: -> - Loading.message = "Taking you back to the home page" + Loading.message = t 'going_back_to_home_page' Navigation.go "/" diff --git a/app/assets/javascripts/templates/forgot.html.haml b/app/assets/javascripts/templates/forgot.html.haml index 646d5832c2..ebe5c36abd 100644 --- a/app/assets/javascripts/templates/forgot.html.haml +++ b/app/assets/javascripts/templates/forgot.html.haml @@ -1,5 +1,5 @@ %tab#forgot{"ng-controller" => "ForgotCtrl", - heading: "Forgot Password?", + heading: "{{t('forgot_password')}}", active: "active(path)", select: "select(path)"} @@ -8,7 +8,7 @@ .row .large-12.columns .alert-box.success.radius{"ng-show" => "sent"} - An email with instructions on resetting your password has been sent! + {{t('password_reset_sent')}} %div{"ng-show" => "!sent"} .alert-box.alert{"ng-show" => "errors != null"} @@ -16,7 +16,7 @@ .row .large-12.columns - %label{for: "email"} Your email + %label{for: "email"} {{t('signup_email')}} %input.title.input-text{name: "email", type: "email", id: "email", @@ -27,4 +27,4 @@ %input.button.primary{name: "commit", tabindex: "3", type: "submit", - value: "Reset password"} + value: "{{t('reset_password')}}"} diff --git a/app/assets/javascripts/templates/login.html.haml b/app/assets/javascripts/templates/login.html.haml index 992dfd265a..f002a393a1 100644 --- a/app/assets/javascripts/templates/login.html.haml +++ b/app/assets/javascripts/templates/login.html.haml @@ -1,5 +1,5 @@ %tab#login-content{"ng-controller" => "LoginCtrl", - heading: "Log in", + heading: "{{t('label_login')}}", active: "active(path)", select: "select(path)"} %form{"ng-submit" => "submit()"} @@ -9,7 +9,7 @@ {{ errors }} .row .large-12.columns - %label{for: "email"} Email + %label{for: "email"} {{t('email')}} %input.title.input-text{name: "email", type: "email", id: "email", @@ -17,7 +17,7 @@ "ng-model" => "spree_user.email"} .row .large-12.columns - %label{for: "password"} Password + %label{for: "password"} {{t('password')}} %input.title.input-text{name: "password", type: "password", id: "password", @@ -31,10 +31,10 @@ id: "remember_me", value: "1", "ng-model" => "spree_user.remember_me"} - %label{for: "remember_me"} Remember Me + %label{for: "remember_me"} {{t('remember_me')}} .row .large-12.columns %input.button.primary{name: "commit", tabindex: "3", type: "submit", - value: "Log in"} + value: "{{t('label_login')}}"} diff --git a/app/assets/javascripts/templates/partials/contact.html.haml b/app/assets/javascripts/templates/partials/contact.html.haml index 165fd69d80..da8fdaa8ac 100644 --- a/app/assets/javascripts/templates/partials/contact.html.haml +++ b/app/assets/javascripts/templates/partials/contact.html.haml @@ -1,6 +1,6 @@ %div.contact-container{bindonce: true} %div.modal-centered{"bo-if" => "enterprise.email || enterprise.website || enterprise.phone"} - %p.modal-header Contact + %p.modal-header {{t('contact')}} %p{"bo-if" => "enterprise.phone", "bo-text" => "enterprise.phone"} %p.word-wrap{"ng-if" => "enterprise.email"} diff --git a/app/assets/javascripts/templates/partials/enterprise_details.html.haml b/app/assets/javascripts/templates/partials/enterprise_details.html.haml index 3a9d97f59e..2d896baf3c 100644 --- a/app/assets/javascripts/templates/partials/enterprise_details.html.haml +++ b/app/assets/javascripts/templates/partials/enterprise_details.html.haml @@ -3,7 +3,7 @@ / TODO: Rob add logic for taxons and properties too: / %div{"ng-if" => "enterprise.long_description.length > 0 || enterprise.logo"} %div - %p.modal-header About + %p.modal-header {{t('label_about')}} / TODO: Rob - add in taxons and properties and property pop-overs -# TODO: Add producer taxons and properties here diff --git a/app/assets/javascripts/templates/partials/follow.html.haml b/app/assets/javascripts/templates/partials/follow.html.haml index 4e2a00086a..c4081cd94f 100644 --- a/app/assets/javascripts/templates/partials/follow.html.haml +++ b/app/assets/javascripts/templates/partials/follow.html.haml @@ -1,5 +1,5 @@ %div.modal-centered{bindonce: true, "bo-if" => "enterprise.twitter || enterprise.facebook || enterprise.linkedin || enterprise.instagram"} - %p.modal-header Follow + %p.modal-header {{t('follow')}} .follow-icons %span{"bo-if" => "enterprise.twitter"} %a{"bo-href-i" => "http://twitter.com/{{enterprise.twitter}}", target: "_blank"} diff --git a/app/assets/javascripts/templates/partials/hub_details.html.haml b/app/assets/javascripts/templates/partials/hub_details.html.haml index 17fabe846a..c7282abe80 100644 --- a/app/assets/javascripts/templates/partials/hub_details.html.haml +++ b/app/assets/javascripts/templates/partials/hub_details.html.haml @@ -2,16 +2,16 @@ .cta-container.small-12.columns .row .small-4.columns - %label{"active-table-hub-link" => "enterprise", change: "Change shop to:", shop: "Shop now at:"} + %label{"active-table-hub-link" => "enterprise", change: "{{t('change_shop')}}", shop: "{{t('shop_at')}}"} .small-8.columns.right %label.right{"bo-if" => "enterprise.pickup || enterprise.delivery"} - Delivery options: + {{t('hubs_delivery_options')}}: %span{"bo-if" => "enterprise.pickup"} %i.ofn-i_038-takeaway - Pickup + {{t('hubs_pickup')}} %span{"bo-if" => "enterprise.delivery"} %i.ofn-i_039-delivery - Delivery + {{t('hubs_delivery')}} .row .columns.small-12 %a.cta-hub{"bo-href" => "enterprise.path", diff --git a/app/assets/javascripts/templates/partials/producer_details.html.haml b/app/assets/javascripts/templates/partials/producer_details.html.haml index 08ac6ea1f1..36718e0cb9 100644 --- a/app/assets/javascripts/templates/partials/producer_details.html.haml +++ b/app/assets/javascripts/templates/partials/producer_details.html.haml @@ -6,10 +6,7 @@ .row .columns.small-12.fat %div{"bo-if" => "enterprise.name"} - %label - Shop for - %span.turquoise{"bo-text" => "enterprise.name"} - products at: + %label{"bo-html" => "t('shop_for_products_html', {enterprise: enterprise.name})"} %div.show-for-medium-up{"bo-if" => "!enterprise.name"}   .row.cta-container diff --git a/app/assets/javascripts/templates/price_breakdown.html.haml b/app/assets/javascripts/templates/price_breakdown.html.haml index 21104b71a0..8bb6bb5caf 100644 --- a/app/assets/javascripts/templates/price_breakdown.html.haml +++ b/app/assets/javascripts/templates/price_breakdown.html.haml @@ -4,35 +4,35 @@ .collapsed{"ng-show" => "!expanded"} %price-percentage{percentage: 'variant.basePricePercentage'} %a{"ng-click" => "expanded = !expanded"} - Full price breakdown + {{t('price_breakdown')}} %i.ofn-i_005-caret-down .expanded{"ng-show" => "expanded"} %ul %li.cost .right {{ variant.price | localizeCurrency }} - Item cost + {{t('item_cost')}} %li.admin-fee{"bo-if" => "variant.fees.admin"} .right {{ variant.fees.admin | localizeCurrency }} - Admin fee + {{t('admin_fee')}} %li.sales-fee{"bo-if" => "variant.fees.sales"} .right {{ variant.fees.sales | localizeCurrency }} - Sales fee + {{t('sales_fee')}} %li.packing-fee{"bo-if" => "variant.fees.packing"} .right {{ variant.fees.packing | localizeCurrency }} - Packing fee + {{t('packing_fee')}} %li.transport-fee{"bo-if" => "variant.fees.transport"} .right {{ variant.fees.transport | localizeCurrency }} - Transport fee + {{t('transport_fee')}} %li.fundraising-fee{"bo-if" => "variant.fees.fundraising"} .right {{ variant.fees.fundraising | localizeCurrency }} - Fundraising fee + {{t('fundraising_fee')}} %li.total %strong .right = {{ variant.price_with_fees | localizeCurrency }}   %a{"ng-click" => "expanded = !expanded"} - Price graph + {{t('price_graph')}} %i.ofn-i_006-caret-up diff --git a/app/assets/javascripts/templates/price_percentage.html.haml b/app/assets/javascripts/templates/price_percentage.html.haml index e577d86d7a..bb3ce9d01f 100644 --- a/app/assets/javascripts/templates/price_percentage.html.haml +++ b/app/assets/javascripts/templates/price_percentage.html.haml @@ -1,5 +1,5 @@ .progress - .right Fees + .right {{t('fees')}} .meter - Item cost + {{t('item_cost')}} diff --git a/app/assets/javascripts/templates/product_modal.html.haml b/app/assets/javascripts/templates/product_modal.html.haml index 481fa67c20..294e8738eb 100644 --- a/app/assets/javascripts/templates/product_modal.html.haml +++ b/app/assets/javascripts/templates/product_modal.html.haml @@ -3,7 +3,7 @@ .columns.small-12.large-6.product-header %h3{"bo-text" => "product.name"} %span - %em from + %em {{t('products_from')}} %span{"bo-text" => "enterprise.name"} %br diff --git a/app/assets/javascripts/templates/registration/about.html.haml b/app/assets/javascripts/templates/registration/about.html.haml index 9c57240dfe..4742d5deb1 100644 --- a/app/assets/javascripts/templates/registration/about.html.haml +++ b/app/assets/javascripts/templates/registration/about.html.haml @@ -3,9 +3,9 @@ .row .small-12.columns %header - %h2 Nice one! + %h2 {{t('enterprise_about_headline')}} %h5 - Now let's flesh out the details about + {{t('enterprise_about_message')}} %span{ ng: { class: "{brick: !enterprise.is_primary_producer, turquoise: enterprise.is_primary_producer}" } } {{ enterprise.name }} @@ -13,45 +13,45 @@ .row .small-12.columns .alert-box.info{ "ofn-inline-alert" => true, ng: { show: "visible" } } - %h6 Success! {{ enterprise.name }} added to the Open Food Network - %span If you exit this wizard at any stage, you need to click the confirmation link in the email you have received. This will take you to your admin interface where you can continue setting up your profile. + %h6 {{t('enterprise_success', {enterprise: enterprise.name})}} + %span {{t('enterprise_registration_exit_message')}} %a.close{ ng: { click: "close()" } } × .small-12.large-8.columns .row .small-12.columns .field - %label{ for: 'enterprise_description' } Short Description: - %input.chunky{ id: 'enterprise_description', placeholder: "A short sentence describing your enterprise", ng: { model: 'enterprise.description' } } + %label{ for: 'enterprise_description' } {{t('enterprise_description')}}: + %input.chunky{ id: 'enterprise_description', placeholder: "{{t('enterprise_description_placeholder')}}", ng: { model: 'enterprise.description' } } .row .small-12.columns .field - %label{ for: 'enterprise_long_desc' } Long Description: - %textarea.chunky{ id: 'enterprise_long_desc', rows: 6, placeholder: "This is your opportunity to tell the story of your enterprise - what makes you different and wonderful? We'd suggest keeping your description to under 600 characters or 150 words.", ng: { model: 'enterprise.long_description' } } - %small {{ enterprise.long_description.length }} characters / up to 600 recommended + %label{ for: 'enterprise_long_desc' } {{t('enterprise_long_desc')}}: + %textarea.chunky{ id: 'enterprise_long_desc', rows: 6, placeholder: "{{t('enterprise_long_desc_placeholder')}}", ng: { model: 'enterprise.long_description' } } + %small {{t('enterprise_long_desc_length', {num: enterprise.long_description.length})}} .small-12.large-4.columns .row .small-12.columns .field - %label{ for: 'enterprise_abn' } ABN: - %input.chunky{ id: 'enterprise_abn', placeholder: "eg. 99 123 456 789", ng: { model: 'enterprise.abn' } } + %label{ for: 'enterprise_abn' } {{t('enterprise_abn')}}: + %input.chunky{ id: 'enterprise_abn', placeholder: "{{t('enterprise_abn_placeholder')}}", ng: { model: 'enterprise.abn' } } .row .small-12.columns .field - %label{ for: 'enterprise_acn' } ACN: - %input.chunky{ id: 'enterprise_acn', placeholder: "eg. 123 456 789", ng: { model: 'enterprise.acn' } } + %label{ for: 'enterprise_acn' } {{t('enterprise_acn')}}: + %input.chunky{ id: 'enterprise_acn', placeholder: "{{t('enterprise_acn_placeholder')}}", ng: { model: 'enterprise.acn' } } .row .small-12.columns .field %label{ for: 'enterprise_charges_sales_tax' }= t(:charges_sales_tax) %input{ id: 'enterprise_charges_sales_tax_true', type: 'radio', name: 'charges_sales_tax', value: 'true', required: true, ng: { model: 'enterprise.charges_sales_tax' } } - %label{ for: 'enterprise_charges_sales_tax_true' } Yes + %label{ for: 'enterprise_charges_sales_tax_true' } {{t('yes')}} %input{ id: 'enterprise_charges_sales_tax_false', type: 'radio', name: 'charges_sales_tax', value: 'false', required: true, ng: { model: 'enterprise.charges_sales_tax' } } - %label{ for: 'enterprise_charges_sales_tax_false' } No + %label{ for: 'enterprise_charges_sales_tax_false' } {{t('no')}} %span.error.small-12.columns{ ng: { show: "about.charges_sales_tax.$error.required && submitted" } } - You need to make a selection. + {{t('enterprise_tax_required')}} .row.buttons.pad-top .small-12.columns - %input.button.primary.right{ type: "submit", value: "Continue" } + %input.button.primary.right{ type: "submit", value: "{{t('continue')}}" } diff --git a/app/assets/javascripts/templates/registration/contact.html.haml b/app/assets/javascripts/templates/registration/contact.html.haml index 916a614c0b..88c217e456 100644 --- a/app/assets/javascripts/templates/registration/contact.html.haml +++ b/app/assets/javascripts/templates/registration/contact.html.haml @@ -3,28 +3,28 @@ .row .small-12.columns %header - %h2 Greetings! + %h2 {{t('registration_greeting')}} %h5 - Who is responsible for managing {{ enterprise.name }}? + {{t('who_is_managing_enterprise', {enterprise: enterprise.name})}} %form{ name: 'contact', novalidate: true, ng: { controller: "RegistrationFormCtrl", submit: "selectIfValid('type',contact)" } } .row.content .small-12.medium-12.large-7.columns .row .small-12.columns.field - %label{ for: 'enterprise_contact' } Primary Contact: + %label{ for: 'enterprise_contact' } {{t('enterprise_contact')}}: %input.chunky.small-12.columns{ id: 'enterprise_contact', name: 'contact', required: true, placeholder: "Contact Name", ng: { model: 'enterprise.contact' } } %span.error.small-12.columns{ ng: { show: "contact.contact.$error.required && submitted" } } - You need to enter a primary contact. + {{t('enterprise_contact_required')}} .row .small-12.columns.field - %label{ for: 'enterprise_email' } Email address: + %label{ for: 'enterprise_email' } {{t('enterprise_email')}}: %input.chunky.small-12.columns{ id: 'enterprise_email', name: 'email', type: 'email', required: true, placeholder: "eg. charlie@thefarm.com", ng: { model: 'enterprise.email' } } %span.error.small-12.columns{ ng: { show: "(contact.email.$error.email || contact.email.$error.required) && submitted" } } - You need to enter valid email address. + {{t('enterprise_email_required')}} .row .small-12.columns.field - %label{ for: 'enterprise_phone' } Phone number: + %label{ for: 'enterprise_phone' } {{t('enterprise_phone')}}: %input.chunky.small-12.columns{ id: 'enterprise_phone', name: 'phone', placeholder: "eg. (03) 1234 5678", ng: { model: 'enterprise.phone' } } .small-12.medium-12.large-5.hide-for-small-only / %h6 @@ -43,5 +43,5 @@ .row.buttons .small-12.columns - %input.button.secondary{ type: "button", value: "Back", ng: { click: "select('details')" } } - %input.button.primary.right{ type: "submit", value: "Continue" } + %input.button.secondary{ type: "button", value: "{{t('back')}}", ng: { click: "select('details')" } } + %input.button.primary.right{ type: "submit", value: "{{t('continue')}}" } diff --git a/app/assets/javascripts/templates/registration/details.html.haml b/app/assets/javascripts/templates/registration/details.html.haml index f1c0503f78..7543cc30ce 100644 --- a/app/assets/javascripts/templates/registration/details.html.haml +++ b/app/assets/javascripts/templates/registration/details.html.haml @@ -3,75 +3,62 @@ .row .small-12.columns %header - %h2 Let's Get Started - %h5{ bo: { if: "enterprise.type != 'own'" } } Woot! First we need to know a little bit about your enterprise: - %h5{ bo: { if: "enterprise.type == 'own'" } } Woot! First we need to know a little bit about your farm: + %h2 {{t('registration_detail_headline')}} + %h5{ bo: { if: "enterprise.type != 'own'" } } {{t('registration_detail_enterprise')}} + %h5{ bo: { if: "enterprise.type == 'own'" } } {{t('registration_detail_producer')}} %form{ name: 'details', novalidate: true, ng: { controller: "RegistrationFormCtrl", submit: "selectIfValid('contact',details)" } } .row .small-12.medium-9.large-12.columns.end .field - %label{ for: 'enterprise_name', bo: { if: "enterprise.type != 'own'" } } Enterprise Name: - %label{ for: 'enterprise_name', bo: { if: "enterprise.type == 'own'" } } Farm Name: - %input.chunky{ id: 'enterprise_name', name: 'name', placeholder: "e.g. Charlie's Awesome Farm", required: true, ng: { model: 'enterprise.name' } } + %label{ for: 'enterprise_name', bo: { if: "enterprise.type != 'own'" } } {{t('registration_detail_name_enterprise')}} + %label{ for: 'enterprise_name', bo: { if: "enterprise.type == 'own'" } } {{t('registration_detail_name_producer')}} + %input.chunky{ id: 'enterprise_name', name: 'name', placeholder: "{{t('registration_detail_name_placeholder')}}", required: true, ng: { model: 'enterprise.name' } } %span.error{ ng: { show: "details.name.$error.required && submitted" } } - Please choose a unique name for your enterprise + {{t('registration_detail_name_error')}} .row .small-12.medium-9.large-6.columns .field - %label{ for: 'enterprise_address' } Address line 1: - %input.chunky{ id: 'enterprise_address', name: 'address1', required: true, placeholder: "e.g. 123 Cranberry Drive", required: true, ng: { model: 'enterprise.address.address1' } } + %label{ for: 'enterprise_address' } {{t('registration_detail_address1')}} + %input.chunky{ id: 'enterprise_address', name: 'address1', required: true, placeholder: "{{t('registration_detail_address1_placeholder')}}", required: true, ng: { model: 'enterprise.address.address1' } } %span.error{ ng: { show: "details.address1.$error.required && submitted" } } - Please enter an address + {{t('registration_detail_address1_error')}} .field - %label{ for: 'enterprise_address2' } Address line 2: + %label{ for: 'enterprise_address2' } {{t('registration_detail_address2')}} %input.chunky{ id: 'enterprise_address2', name: 'address2', required: false, placeholder: "", required: false, ng: { model: 'enterprise.address.address2' } } .small-12.medium-9.large-6.columns.end .row .small-12.medium-8.large-8.columns .field - %label{ for: 'enterprise_city' } Suburb: - %input.chunky{ id: 'enterprise_city', name: 'city', required: true, placeholder: "e.g. Northcote", ng: { model: 'enterprise.address.city' } } + %label{ for: 'enterprise_city' } {{t('registration_detail_suburb')}} + %input.chunky{ id: 'enterprise_city', name: 'city', required: true, placeholder: "{{t('registration_detail_suburb_placeholder')}}", ng: { model: 'enterprise.address.city' } } %span.error{ ng: { show: "details.city.$error.required && submitted" } } - Please enter a suburb + {{t('registration_detail_suburb_error')}} .small-12.medium-4.large-4.columns .field - %label{ for: 'enterprise_zipcode' } Postcode: - %input.chunky{ id: 'enterprise_zipcode', name: 'zipcode', required: true, placeholder: "e.g. 3070", ng: { model: 'enterprise.address.zipcode' } } + %label{ for: 'enterprise_zipcode' } {{t('registration_detail_postcode')}} + %input.chunky{ id: 'enterprise_zipcode', name: 'zipcode', required: true, placeholder: "{{t('registration_detail_postcode_placeholder')}}", ng: { model: 'enterprise.address.zipcode' } } %span.error{ ng: { show: "details.zipcode.$error.required && submitted" } } - Postcode required + {{t('registration_detail_postcode_error')}} .row .small-12.medium-4.large-4.columns .field - %label{ for: 'enterprise_state' } State: + %label{ for: 'enterprise_state' } {{t('registration_detail_state')}} %select.chunky{ id: 'enterprise_state', name: 'state', ng: { model: 'enterprise.address.state_id', options: 's.id as s.abbr for s in enterprise.country.states', show: 'countryHasStates()', required: 'countryHasStates()' } } %span.error{ ng: { show: "details.state.$error.required && submitted" } } - State required + {{t('registration_detail_state_error')}} .small-12.medium-8.large-8.columns .field - %label{ for: 'enterprise_country' } Country: + %label{ for: 'enterprise_country' } {{t('registration_detail_country')}} %select.chunky{ id: 'enterprise_country', name: 'country', required: true, ng: { model: 'enterprise.country', options: 'c as c.name for c in countries' } } %span.error{ ng: { show: "details.country.$error.required && submitted" } } - Please select a country - / .small-12.medium-12.large-5.hide-for-small-only - / %h6 - / Location display - / %i.ofn-i_013-help.has-tip{ 'data-tooltip' => true, title: "Choose how you want to display your enterprise's address on the Open Food Network. By default, full location is shown everywhere including street name and number."} - / .row - / .small-12.columns - / %label.indent-checkbox - / %input{ type: 'checkbox', id: 'enterpise_suburb_only', ng: { model: 'enterprise.suburb_only' } } - / Hide my street name and street number from the public (ie. only show the suburb) - / .small-12.columns - / %label.indent-checkbox - / %input{ type: 'checkbox', id: 'enterprise_on_map', ng: { model: 'enterprise.on_map' } } - / Blur my location on the map (show an approximate, not exact pin) + {{t('registration_detail_country_error')}} .row.buttons .small-12.columns %hr - %input.button.primary.right{ type: "submit", value: "Continue" } + %input.button.primary.right{ type: "submit", value: "{{t('continue')}}" } diff --git a/app/assets/javascripts/templates/registration/finished.html.haml b/app/assets/javascripts/templates/registration/finished.html.haml index 46cca9daf5..92136147e1 100644 --- a/app/assets/javascripts/templates/registration/finished.html.haml +++ b/app/assets/javascripts/templates/registration/finished.html.haml @@ -2,23 +2,16 @@ .row .small-12.columns.pad-top %header - %h2 Finished! + %h2 {{t('registration_finished_headline')}} .panel.callout %p - Thanks for filling out the details for - %span{ ng: { class: "{brick: !enterprise.is_primary_producer, turquoise: enterprise.is_primary_producer}" } } - {{ enterprise.name }} - %p You can change or update your enterprise at any stage by logging into Open Food Network and going to Admin. + {{t('registration_finished_thanks', {enterprise: enterprise.name})}} + %p {{t('registration_finished_login')}} .row .small-12.columns.text-center %h4 - Activate - %span{ ng: { class: "{brick: !enterprise.is_primary_producer, turquoise: enterprise.is_primary_producer}" } } - {{ enterprise.name }} + {{t('registration_finished_activate', {enterprise: enterprise.name})}} - %p - We've sent a confirmation email to - %strong {{ enterprise.email }} if it hasn't been activated before. - %br Please follow the instructions there to make your enterprise visible on the Open Food Network. + %p{ "ng-bind-html" => "t('registration_finished_activate_instruction_html', {email: enterprise.email})"} - %a.button.primary{ type: "button", href: "/" } Open Food Network home > + %a.button.primary{ type: "button", href: "/" } {{t('registration_finished_action')}} > diff --git a/app/assets/javascripts/templates/registration/images.html.haml b/app/assets/javascripts/templates/registration/images.html.haml index 5b2ac39b5a..45d9cf2015 100644 --- a/app/assets/javascripts/templates/registration/images.html.haml +++ b/app/assets/javascripts/templates/registration/images.html.haml @@ -3,8 +3,8 @@ .row .small-12.columns %header - %h2 Thanks! - %h5 Let's upload some pretty pictures so your profile looks great! :) + %h2 {{t('registration_images_headline')}} + %h5 {{t('registration_images_description')}} %form{ name: 'images', novalidate: true, ng: { controller: "RegistrationFormCtrl", submit: "select('social')" } } .row{ ng: { repeat: 'image_step in imageSteps', show: "imageStep == image_step" } } @@ -18,5 +18,5 @@ .row.buttons.pad-top{ ng: { if: "imageStep == 'promo'" } } .small-12.columns - %input.button.secondary{ type: "button", value: "Back", ng: { click: "imageSelect('logo')" } } - %input.button.primary.right{ type: "submit", value: "Continue" } + %input.button.secondary{ type: "button", value: "{{t('back')}}", ng: { click: "imageSelect('logo')" } } + %input.button.primary.right{ type: "submit", value: "{{t('continue')}}" } diff --git a/app/assets/javascripts/templates/registration/images/logo.html.haml b/app/assets/javascripts/templates/registration/images/logo.html.haml index 7dd08c90dc..9c0b02ca87 100644 --- a/app/assets/javascripts/templates/registration/images/logo.html.haml +++ b/app/assets/javascripts/templates/registration/images/logo.html.haml @@ -4,42 +4,42 @@ .row .small-12.columns.center %h4 - Step 1. Select Logo Image + {{t('select_logo')}} .row .small-12.columns.center %span.small - Tip: Square images will work best, preferably at least 300×300px + {{t('logo_tip')}} .row.pad-top .small-12.columns .image-select.small-12.columns - %label.small-12.columns.button{ for: 'image-select' } Choose a logo image + %label.small-12.columns.button{ for: 'image-select' } {{t('logo_label')}} %input#image-select{ type: 'file', hidden: true, 'nv-file-select' => true, uploader: "imageUploader", options: '{ alias: imageStep }' } .row.show-for-large-up .large-12.columns %span#or.large-12.columns - OR + {{t('action_or')}} .row.show-for-large-up .large-12.columns #image-over{ 'nv-file-over' => true, uploader: "imageUploader" } - Drag and drop your logo here + {{t('logo_drag')}} .small-12.medium-12.large-6.columns .row .small-12.columns.center .row .small-12.columns.center %h4 - Step 2. Review Your Logo + {{t('review_logo')}} .row .small-12.columns.center %span.small - Tip: for best results, your logo should fill the available space + {{t('review_logo_tip')}} .row.pad-top .small-12.columns.center #image-placeholder.logo %img{ ng: { show: "imageSrc() && !imageUploader.isUploading", src: '{{ imageSrc() }}' } } .message{ ng: { hide: "imageSrc() || imageUploader.isUploading" } } - Your logo will appear here for review once uploaded + {{t('logo_placeholder')}} .loading{ ng: { hide: "!imageUploader.isUploading" } } %img.spinner{ src: "/assets/spinning-circles.svg" } %br/ - Uploading... + {{t('uploading')}} diff --git a/app/assets/javascripts/templates/registration/images/promo.html.haml b/app/assets/javascripts/templates/registration/images/promo.html.haml index 6c3327c942..61a382ecaa 100644 --- a/app/assets/javascripts/templates/registration/images/promo.html.haml +++ b/app/assets/javascripts/templates/registration/images/promo.html.haml @@ -2,42 +2,42 @@ .row .small-12.columns.center %h4 - Step 3. Select Promo Image + {{t('select_promo_image')}} .row .small-12.medium-12.large-5.columns.center .row .small-12.columns.center %span.small - Tip: Shown as a banner, preferred size is 1200×260px + {{t('promo_image_tip')}} .row.pad-top .small-12.columns .image-select.small-12.columns - %label.small-12.columns.button{ for: 'image-select' } Choose a promo image + %label.small-12.columns.button{ for: 'image-select' } {{t('promo_image_label')}} %input#image-select{ type: 'file', hidden: true, 'nv-file-select' => true, uploader: "imageUploader", options: '{ alias: imageStep }' } .large-2.columns %span#or.horizontal.large-12.columns - OR + {{t('action_or')}} .large-5.columns #image-over{ 'nv-file-over' => true, uploader: "imageUploader" } - Drag and drop your promo here + {{t('promo_image_drag')}} .small-12.medium-12.large-12.columns.pad-top .row .small-12.columns.center %h4 - Step 4. Review Your Promo Banner + {{t('review_promo_image')}} .row .small-12.columns.center .row .small-12.columns.center %span.small - Tip: for best results, your promo image should fill the available space + {{t('review_promo_image_tip')}} .row.pad-top .small-12.columns.center #image-placeholder.promo %img{ ng: { show: "imageSrc() && !imageUploader.isUploading", src: '{{ imageSrc() }}' } } .message{ ng: { hide: "imageSrc() || imageUploader.isUploading" } } - Your logo will appear here for review once uploaded + {{t('promo_image_placeholder')}} .loading{ ng: { hide: "!imageUploader.isUploading" } } %img.spinner{ src: "/assets/spinning-circles.svg" } %br/ - Uploading... + {{t('uploading')}} diff --git a/app/assets/javascripts/templates/registration/introduction.html.haml b/app/assets/javascripts/templates/registration/introduction.html.haml index 48553de09a..6288c7aa4f 100644 --- a/app/assets/javascripts/templates/registration/introduction.html.haml +++ b/app/assets/javascripts/templates/registration/introduction.html.haml @@ -1,46 +1,41 @@ .row .small-12.columns %header - %h2 Hi there! + %h2 {{t('registration_greeting')}} %h4 %small %i.ofn-i_040-hub - You can now create a profile for your Producer or Hub + {{t('registration_intro')}} .hide-for-large-up %hr - %input.button.small.primary{ type: "button", value: "Let's get started!", ng: { click: "select('details')" } } + %input.button.small.primary{ type: "button", value: "{{t('registration_action')}}", ng: { click: "select('details')" } } %hr .row{ 'data-equalizer' => true } .small-12.medium-12.large-6.columns.pad-top{ 'data-equalizer-watch' => true } - %h5 You'll need: + %h5 {{t('registration_checklist')}}: %ul.check-list %li - 5-10 minutes + {{t('registration_time')}} %li - Enterprise address + {{t('registration_enterprise_address')}} %li - Primary contact details + {{t('registration_contact_details')}} %li - Your logo image + {{t('registration_logo')}} %li - Landscape image for your profile + {{t('registration_promo_image')}} %li - 'About Us' text + {{t('registration_about_us')}} .small-9.medium-8.large-5.columns.pad-top.end{ 'data-equalizer-watch' => true} %h5 - What do I get? - %p - Your profile helps people - %strong find - and - %strong contact - you on the Open Food Network. - %p Use this space to tell the story of your enterprise, to help drive connections to your social and online presence. - %p It's also the first step towards trading on the Open Food Network, or opening an online store. + {{t('registration_outcome_headline')}} + %p{ "ng-bind-html" => "t('registration_outcome1_html')" } + %p {{t('registration_outcome2')}} + %p {{t('registration_outcome3')}} .row.show-for-large-up .small-12.columns %hr - %input.button.primary.right{ type: "button", value: "Let's get started!", ng: { click: "select('details')" } } + %input.button.primary.right{ type: "button", value: "{{t('registration_action')}}", ng: { click: "select('details')" } } diff --git a/app/assets/javascripts/templates/registration/limit_reached.html.haml b/app/assets/javascripts/templates/registration/limit_reached.html.haml index 778d980289..776332b94c 100644 --- a/app/assets/javascripts/templates/registration/limit_reached.html.haml +++ b/app/assets/javascripts/templates/registration/limit_reached.html.haml @@ -1,16 +1,16 @@ .row .small-12.columns %header - %h2 Oh no! - %h4 You have reached the limit! + %h2 {{t('limit_reached_headline')}} + %h4 {{t('limit_reached_message')}} .row .small-12.medium-3.large-2.columns.text-right.hide-for-small-only %img{:src => "/assets/potatoes.png"} .small-12.medium-9.large-10.columns %p - You have reached the limit for the number of enterprises you are allowed to own on the + {{t('limit_reached_text')}} %strong Open Food Network. .row .small-12.columns %hr - %input.button.primary{ type: "button", value: "Return to the homepage", ng: { click: "close()" } } + %input.button.primary{ type: "button", value: "{{t('limit_reached_action')}}", ng: { click: "close()" } } diff --git a/app/assets/javascripts/templates/registration/social.html.haml b/app/assets/javascripts/templates/registration/social.html.haml index 4f448734f1..5225256eee 100644 --- a/app/assets/javascripts/templates/registration/social.html.haml +++ b/app/assets/javascripts/templates/registration/social.html.haml @@ -4,12 +4,9 @@ .row .small-12.columns %header - %h2 Final step! + %h2 {{t('enterprise_final_step')}} %h5 - How can people find - %span{ ng: { class: "{brick: !enterprise.is_primary_producer, turquoise: enterprise.is_primary_producer}" } } - {{ enterprise.name }} - online? + {{t('enterprise_social_text', {enterprise: enterprise.name})}} %form{ name: 'social', novalidate: true, ng: { controller: "RegistrationFormCtrl", submit: "update('finished',social)" } } .row.content @@ -17,33 +14,33 @@ .row .small-12.columns .field - %label{ for: 'enterprise_website' } Website: - %input.chunky{ id: 'enterprise_website', placeholder: "eg. openfoodnetwork.org.au", ng: { model: 'enterprise.website' } } + %label{ for: 'enterprise_website' } {{t('website')}}: + %input.chunky{ id: 'enterprise_website', placeholder: "{{t('website_placeholder')}}", ng: { model: 'enterprise.website' } } .row .small-12.columns .field - %label{ for: 'enterprise_facebook' } Facebook: - %input.chunky{ id: 'enterprise_facebook', placeholder: "eg. www.facebook.com/PageNameHere", ng: { model: 'enterprise.facebook' } } + %label{ for: 'enterprise_facebook' } {{t('facebook')}}: + %input.chunky{ id: 'enterprise_facebook', placeholder: "{{t('facebook_placeholder')}}", ng: { model: 'enterprise.facebook' } } .row .small-12.columns .field - %label{ for: 'enterprise_linkedin' } LinkedIn: - %input.chunky{ id: 'enterprise_linkedin', placeholder: "eg. www.linkedin.com/YourNameHere", ng: { model: 'enterprise.linkedin' } } + %label{ for: 'enterprise_linkedin' } {{t('linkedin')}}: + %input.chunky{ id: 'enterprise_linkedin', placeholder: "{{t('linkedin_placeholder')}}", ng: { model: 'enterprise.linkedin' } } .small-12.large-5.columns .row .small-12.columns .field - %label{ for: 'enterprise_twitter' } Twitter: - %input.chunky{ id: 'enterprise_twitter', placeholder: "eg. @twitter_handle", ng: { model: 'enterprise.twitter' } } + %label{ for: 'enterprise_twitter' } {{t('twitter')}}: + %input.chunky{ id: 'enterprise_twitter', placeholder: "{{t('twitter_placeholder')}}", ng: { model: 'enterprise.twitter' } } .row .small-12.columns .field - %label{ for: 'enterprise_instagram' } Instagram: - %input.chunky{ id: 'enterprise_instagram', placeholder: "eg. @instagram_handle", ng: { model: 'enterprise.instagram' } } + %label{ for: 'enterprise_instagram' } {{t('instagram')}}: + %input.chunky{ id: 'enterprise_instagram', placeholder: "{{t('instagram_placeholder')}}", ng: { model: 'enterprise.instagram' } } .row.buttons .small-12.columns - %input.button.secondary{ type: "button", value: "Back", ng: { click: "select('images')" } } - %input.button.primary.right{ type: "submit", value: "Continue" } + %input.button.secondary{ type: "button", value: "{{t('back')}}", ng: { click: "select('images')" } } + %input.button.primary.right{ type: "submit", value: "{{t('continue')}}" } diff --git a/app/assets/javascripts/templates/registration/type.html.haml b/app/assets/javascripts/templates/registration/type.html.haml index 9593bfa89c..e1a5e09376 100644 --- a/app/assets/javascripts/templates/registration/type.html.haml +++ b/app/assets/javascripts/templates/registration/type.html.haml @@ -6,11 +6,9 @@ .small-12.columns %header %h2 - Last step to add - %span{ ng: { class: "{brick: !enterprise.is_primary_producer, turquoise: enterprise.is_primary_producer}" } } - {{ enterprise.name }}! + {{t('registration_type_headline', {enterprise: enterprise.name})}} %h4 - Are you a producer? + {{t('registration_type_question')}} %form{ name: 'type', novalidate: true, ng: { controller: "RegistrationFormCtrl", submit: "create(type)" } } .row#enterprise-types{ 'data-equalizer' => true, bo: { if: "enterprise.type != 'own'" } } @@ -19,32 +17,32 @@ .small-12.medium-6.large-6.columns{ 'data-equalizer-watch' => true } %a.btnpanel#producer-panel{ href: "#", ng: { click: "enterprise.is_primary_producer = true", class: "{selected: enterprise.is_primary_producer}" } } %i.ofn-i_059-producer - %h4 Yes, I'm a producer + %h4 {{t('registration_type_producer')}} .small-12.medium-6.large-6.columns{ 'data-equalizer-watch' => true } %a.btnpanel#hub-panel{ href: "#", ng: { click: "enterprise.is_primary_producer = false", class: "{selected: enterprise.is_primary_producer == false}" } } %i.ofn-i_063-hub - %h4 No, I'm not a producer + %h4 {{t('registration_type_no_producer')}} .row .small-12.columns %input.chunky{ id: 'enterprise_is_primary_producer', name: 'is_primary_producer', hidden: true, required: true, ng: { model: 'enterprise.is_primary_producer' } } %span.error{ ng: { show: "type.is_primary_producer.$error.required && submitted" } } - Please choose one. Are you are producer? + {{t('registration_type_error')}} .row .small-12.columns .panel.callout .left %i.ofn-i_013-help   - %p Producers make yummy things to eat &/or drink. You're a producer if you grow it, raise it, brew it, bake it, ferment it, milk it or mould it. + %p {{t('registration_type_producer_help')}} .panel.callout .left %i.ofn-i_013-help   - %p If you’re not a producer, you’re probably someone who sells and distributes food. You might be a hub, coop, buying group, retailer, wholesaler or other. + %p {{t('registration_type_no_producer_help')}} .row.buttons .small-12.columns - %input.button.secondary{ type: "button", value: "Back", ng: { click: "select('contact')" } } - %input.button.primary.right{ type: "submit", value: "Create Profile" } + %input.button.secondary{ type: "button", value: "{{t('back')}}", ng: { click: "select('contact')" } } + %input.button.primary.right{ type: "submit", value: "{{t('create_profile')}}" } diff --git a/app/assets/javascripts/templates/registration_authentication.html.haml b/app/assets/javascripts/templates/registration_authentication.html.haml index c7bfbabeca..05e1d45154 100644 --- a/app/assets/javascripts/templates/registration_authentication.html.haml +++ b/app/assets/javascripts/templates/registration_authentication.html.haml @@ -1,7 +1,7 @@ .container .row.modal-centered - %h2 Welcome to the Open Food Network! - %h5 Start By Signing Up (or logging in): + %h2 {{t('welcome_to_ofn')}} + %h5 {{t('signup_or_login')}}: %div{"ng-controller" => "AuthenticationCtrl"} %tabset %ng-include{src: "'signup.html'"} @@ -9,9 +9,9 @@ %ng-include{src: "'forgot.html'"} %div{ ng: { show: "active('/signup')"} } %hr - Already have an account? + {{t('have_an_account')}} %a{ href: "", ng: { click: "select('/login')"}} - Log in now. + {{t('action_login')}} %a.close-reveal-modal{"ng-click" => "$close()"} %i.ofn-i_009-close diff --git a/app/assets/javascripts/templates/shop_variant.html.haml b/app/assets/javascripts/templates/shop_variant.html.haml index 04048f3cd0..1d6a090935 100644 --- a/app/assets/javascripts/templates/shop_variant.html.haml +++ b/app/assets/javascripts/templates/shop_variant.html.haml @@ -5,7 +5,7 @@ .bulk-buy.inline{"bo-if" => "variant.product.group_buy"} %i.ofn-i_056-bulk>< %em>< - \ Bulk + \ {{t('bulk')}} -# WITHOUT GROUP BUY .small-5.medium-3.large-3.columns.text-right{"bo-if" => "!variant.product.group_buy"} @@ -30,7 +30,7 @@ integer: true, min: 0, "ng-model" => "variant.line_item.quantity", - placeholder: "min", + placeholder: "{{t('shop_variant_quantity_min')}}", "ofn-disable-scroll" => true, max: "{{variant.on_demand && 9999 || variant.count_on_hand }}", name: "variants[{{variant.id}}]", id: "variants_{{variant.id}}"} @@ -40,7 +40,7 @@ integer: true, min: 0, "ng-model" => "variant.line_item.max_quantity", - placeholder: "max", + placeholder: "{{t('shop_variant_quantity_max')}}", "ofn-disable-scroll" => true, max: "{{variant.on_demand && 9999 || variant.count_on_hand }}", name: "variant_attributes[{{variant.id}}][max_quantity]"} diff --git a/app/assets/javascripts/templates/signup.html.haml b/app/assets/javascripts/templates/signup.html.haml index 28bec19b49..48f75e1a44 100644 --- a/app/assets/javascripts/templates/signup.html.haml +++ b/app/assets/javascripts/templates/signup.html.haml @@ -1,11 +1,11 @@ %tab#sign-up-content{"ng-controller" => "SignupCtrl", - heading: "Sign up", + heading: "{{t('label_signup')}}", active: "active(path)", select: "select(path)"} %form{"ng-submit" => "submit()"} .row .large-12.columns - %label{for: "email"} Your email + %label{for: "email"} {{t('signup_email')}} %input.title.input-text{name: "email", type: "email", id: "email", @@ -15,7 +15,7 @@ {{ errors.email.join(' ') }} .row .large-12.columns - %label{for: "password"} Choose a password + %label{for: "password"} {{t('choose_password')}} %input.title.input-text{name: "password", type: "password", id: "password", @@ -26,7 +26,7 @@ {{ errors.password.join(' ') }} .row .large-12.columns - %label{for: "password_confirmation"} Confirm password + %label{for: "password_confirmation"} {{t('confirm_password')}} %input.title.input-text{name: "password_confirmation", type: "password", id: "password_confirmation", @@ -38,4 +38,4 @@ %input.button.primary{name: "commit", tabindex: "3", type: "submit", - value: "Sign up now"} + value: "{{t('action_signup')}}"} diff --git a/app/views/layouts/_i18n_translations.html.haml b/app/views/layouts/_i18n_translations.html.haml new file mode 100644 index 0000000000..376c162d60 --- /dev/null +++ b/app/views/layouts/_i18n_translations.html.haml @@ -0,0 +1,5 @@ +- # TODO: load json from separate file that can be cached +%script + window.I18n = + = I18n.backend.send(:translations)[I18n.locale].with_indifferent_access.to_json.html_safe + diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index 88075a3171..b97efc0ed0 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -11,6 +11,7 @@ %link{href: "https://fonts.googleapis.com/css?family=Roboto:400,300italic,400italic,300,700,700italic|Oswald:300,400,700", rel: "stylesheet", type: "text/css"} = yield :scripts + = render "layouts/i18n_translations" %script{src: "//maps.googleapis.com/maps/api/js?libraries=places,geometry&sensor=false"} = split_stylesheet_link_tag "darkswarm/all" = javascript_include_tag "darkswarm/all" diff --git a/app/views/layouts/registration.html.haml b/app/views/layouts/registration.html.haml index 4709393fd0..320c80d35e 100644 --- a/app/views/layouts/registration.html.haml +++ b/app/views/layouts/registration.html.haml @@ -11,6 +11,7 @@ %link{href: "https://fonts.googleapis.com/css?family=Roboto:400,300italic,400italic,300,700,700italic|Oswald:300,400,700", rel: "stylesheet", type: "text/css"} = yield :scripts + = render "layouts/i18n_translations" %script{src: "//maps.googleapis.com/maps/api/js?libraries=places&sensor=false"} = stylesheet_link_tag "darkswarm/all" = javascript_include_tag "darkswarm/all" diff --git a/config/locales/en.yml b/config/locales/en.yml index a44f0317a9..d15ed32443 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -453,3 +453,181 @@ See the %{link} to find out more about %{sitename}'s features and to start using products_max_quantity: Max quantity products_distributor: Distributor products_distributor_info: When you select a distributor for your order, their address and pickup times will be displayed here. + + # keys used in javascript + password: Password + remember_me: Remember Me + are_you_sure: "Are you sure?" + orders_open: Orders open + closing: "Closing " + going_back_to_home_page: "Taking you back to the home page" + creating: Creating + updating: Updating + failed_to_create_enterprise: "Failed to create your enterprise." + failed_to_create_enterprise_unknown: "Failed to create your enterprise.\nPlease ensure all fields are completely filled out." + order_not_saved_yet: "Your order hasn't been saved yet. Give us a few seconds to finish!" + filter_by: "Filter by" + hide_filters: "Hide filters" + one_filter_applied: "1 filter applied" + x_filters_applied: " filters applied" + submitting_order: "Submitting your order: please wait" + confirm_hub_change: "Are you sure? This will change your selected hub and remove any items in your shopping cart." + confirm_oc_change: "Are you sure? This will change your selected order cycle and remove any items in your shopping cart." + location_placeholder: "Type in a location..." + error_required: "can't be blank" + error_number: "must be number" + error_email: "must be email address" + item_handling_fees: "Item Handling Fees (included in item totals)" + january: "January" + february: "February" + march: "March" + april: "April" + may: "May" + june: "June" + july: "July" + august: "August" + september: "September" + october: "October" + november: "November" + december: "December" + email_not_found: "Email address not found" + email_required: "You must provide an email address" + logging_in: "Hold on a moment, we're logging you in" + signup_email: "Your email" + choose_password: "Choose a password" + confirm_password: "Confirm password" + action_signup: "Sign up now" + welcome_to_ofn: "Welcome to the Open Food Network!" + signup_or_login: "Start By Signing Up (or logging in)" + have_an_account: "Already have an account?" + action_login: "Log in now." + forgot_password: "Forgot Password?" + password_reset_sent: "An email with instructions on resetting your password has been sent!" + reset_password: "Reset password" + registration_greeting: "Greetings!" + who_is_managing_enterprise: "Who is responsible for managing %{enterprise}?" + enterprise_contact: "Primary Contact" + enterprise_contact_required: "You need to enter a primary contact." + enterprise_email: "Email address" + enterprise_email_required: "You need to enter valid email address." + enterprise_phone: "Phone number" + back: "Back" + continue: "Continue" + limit_reached_headline: "Oh no!" + limit_reached_message: "You have reached the limit!" + limit_reached_text: "You have reached the limit for the number of enterprises you are allowed to own on the" + limit_reached_action: "Return to the homepage" + select_promo_image: "Step 3. Select Promo Image" + promo_image_tip: "Tip: Shown as a banner, preferred size is 1200×260px" + promo_image_label: "Choose a promo image" + action_or: "OR" + promo_image_drag: "Drag and drop your promo here" + review_promo_image: "Step 4. Review Your Promo Banner" + review_promo_image_tip: "Tip: for best results, your promo image should fill the available space" + promo_image_placeholder: "Your logo will appear here for review once uploaded" + uploading: "Uploading..." + select_logo: "Step 1. Select Logo Image" + logo_tip: "Tip: Square images will work best, preferably at least 300×300px" + logo_label: "Choose a logo image" + logo_drag: "Drag and drop your logo here" + review_logo: "Step 2. Review Your Logo" + review_logo_tip: "Tip: for best results, your logo should fill the available space" + logo_placeholder: "Your logo will appear here for review once uploaded" + enterprise_about_headline: "Nice one!" + enterprise_about_message: "Now let's flesh out the details about" + enterprise_success: "Success! %{enterprise} added to the Open Food Network " + enterprise_registration_exit_message: "If you exit this wizard at any stage, you need to click the confirmation link in the email you have received. This will take you to your admin interface where you can continue setting up your profile." + enterprise_description: "Short Description" + enterprise_description_placeholder: "A short sentence describing your enterprise" + enterprise_long_desc: "Long Description" + enterprise_long_desc_placeholder: "This is your opportunity to tell the story of your enterprise - what makes you different and wonderful? We'd suggest keeping your description to under 600 characters or 150 words." + enterprise_long_desc_length: "%{num} characters / up to 600 recommended" + enterprise_abn: "ABN" + enterprise_abn_placeholder: "eg. 99 123 456 789" + enterprise_acn: "ACN" + enterprise_acn_placeholder: "eg. 123 456 789" + yes: "Yes" + no: "No" + enterprise_tax_required: "You need to make a selection." + enterprise_final_step: "Final step!" + enterprise_social_text: "How can people find %{enterprise} online?" + website: "Website" + website_placeholder: "eg. openfoodnetwork.org.au" + facebook: "Facebook" + facebook_placeholder: "eg. www.facebook.com/PageNameHere" + linkedin: "LinkedIn" + linkedin_placeholder: "eg. www.linkedin.com/YourNameHere" + twitter: "Twitter" + twitter_placeholder: "eg. @twitter_handle" + instagram: "Instagram" + instagram_placeholder: "eg. @instagram_handle" + registration_greeting: "Hi there!" + registration_intro: "You can now create a profile for your Producer or Hub" + registration_action: "Let's get started!" + registration_checklist: "You'll need" + registration_time: "5-10 minutes" + registration_enterprise_address: "Enterprise address" + registration_contact_details: "Primary contact details" + registration_logo: "Your logo image" + registration_promo_image: "Landscape image for your profile" + registration_about_us: "'About Us' text" + registration_outcome_headline: "What do I get?" + registration_outcome1_html: "Your profile helps people find and contact you on the Open Food Network." + registration_outcome2: "Use this space to tell the story of your enterprise, to help drive connections to your social and online presence. " + registration_outcome3: "It's also the first step towards trading on the Open Food Network, or opening an online store." + registration_finished_headline: "Finished!" + registration_finished_thanks: "Thanks for filling out the details for %{enterprise}." + registration_finished_login: "You can change or update your enterprise at any stage by logging into Open Food Network and going to Admin." + registration_finished_activate: "Activate %{enterprise}." + registration_finished_activate_instruction_html: "We've sent a confirmation email to %{email} if it hasn't been activated before.
+Please follow the instructions there to make your enterprise visible on the Open Food Network." + registration_finished_action: "Open Food Network home" + registration_type_headline: "Last step to add %{enterprise}" + registration_type_question: "Are you a producer?" + registration_type_producer: "Yes, I'm a producer" + registration_type_no_producer: "No, I'm not a producer" + registration_type_error: "Please choose one. Are you are producer?" + registration_type_producer_help: "Producers make yummy things to eat &/or drink. You're a producer if you grow it, raise it, brew it, bake it, ferment it, milk it or mould it." + registration_type_no_producer_help: "If you’re not a producer, you’re probably someone who sells and distributes food. You might be a hub, coop, buying group, retailer, wholesaler or other." + create_profile: "Create Profile" + registration_images_headline: "Thanks!" + registration_images_description: "Let's upload some pretty pictures so your profile looks great! :)" + registration_detail_headline: "Let's Get Started" + registration_detail_enterprise: "Woot! First we need to know a little bit about your enterprise:" + registration_detail_producer: "Woot! First we need to know a little bit about your farm:" + registration_detail_name_enterprise: "Enterprise Name:" + registration_detail_name_producer: "Farm Name:" + registration_detail_name_placeholder: "e.g. Charlie's Awesome Farm" + registration_detail_name_error: "Please choose a unique name for your enterprise" + registration_detail_address1: "Address line 1:" + registration_detail_address1_placeholder: "e.g. 123 Cranberry Drive" + registration_detail_address1_error: "Please enter an address" + registration_detail_address2: "Address line 2:" + registration_detail_suburb: "Suburb:" + registration_detail_suburb_placeholder: "e.g. Northcote" + registration_detail_suburb_error: "Please enter a suburb" + registration_detail_postcode: "Postcode:" + registration_detail_postcode_placeholder: "e.g. 3070" + registration_detail_postcode_error: "Postcode required" + registration_detail_state: "State:" + registration_detail_state_error: "State required" + registration_detail_country: "Country:" + registration_detail_country_error: "Please select a country" + registration_detail_: "" + fees: "Fees" + item_cost: "Item cost" + bulk: "Bulk" + shop_variant_quantity_min: "min" + shop_variant_quantity_max: "max" + contact: "Contact" + follow: "Follow" + shop_for_products_html: "Shop for %{enterprise} products at:" + change_shop: "Change shop to:" + shop_at: "Shop now at:" + price_breakdown: "Full price breakdown" + admin_fee: "Admin fee" + sales_fee: "Sales fee" + packing_fee: "Packing fee" + transport_fee: "Transport fee" + fundraising_fee: "Fundraising fee" + price_graph: "Price graph"