Internationalisation of Javascript views

This commit is contained in:
Maikel Linke
2015-10-01 11:13:06 +10:00
parent f8725a0174
commit ae96541112
45 changed files with 396 additions and 231 deletions

View File

@@ -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

View File

@@ -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'

View File

@@ -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

View File

@@ -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)]

View File

@@ -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()

View File

@@ -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

View File

@@ -3,7 +3,7 @@ Darkswarm.directive 'mapSearch', ($timeout)->
restrict: 'E'
require: '^googleMap'
replace: true
template: '<input id="pac-input" placeholder="Type in a location..."></input>'
template: '<input id="pac-input" placeholder="' + t('location_placeholder') + '"></input>'
link: (scope, elem, attrs, ctrl)->
$timeout =>
map = ctrl.getMap()

View File

@@ -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 "/"

View File

@@ -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)

View File

@@ -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

View File

@@ -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 ", "
(errors.filter (error) -> error?).join ", "

View File

@@ -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 = "/"

View File

@@ -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)->

View File

@@ -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)=>

View File

@@ -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 = {}

View File

@@ -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

View File

@@ -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 "/"

View File

@@ -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')}}"}

View File

@@ -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')}}"}

View File

@@ -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"}

View File

@@ -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

View File

@@ -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"}

View File

@@ -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",

View File

@@ -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"}
&nbsp;
.row.cta-container

View File

@@ -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 }}
&nbsp;
%a{"ng-click" => "expanded = !expanded"}
Price graph
{{t('price_graph')}}
%i.ofn-i_006-caret-up

View File

@@ -1,5 +1,5 @@
.progress
.right Fees
.right {{t('fees')}}
.meter
Item cost
{{t('item_cost')}}

View File

@@ -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

View File

@@ -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()" } } &times;
.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')}}" }

View File

@@ -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')}}" }

View File

@@ -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')}}" }

View File

@@ -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 &gt;
%a.button.primary{ type: "button", href: "/" } {{t('registration_finished_action')}} &gt;

View File

@@ -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')}}" }

View File

@@ -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&times;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')}}

View File

@@ -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&times;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')}}

View File

@@ -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')" } }

View File

@@ -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()" } }

View File

@@ -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')}}" }

View File

@@ -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
&nbsp;
%p Producers make yummy things to eat &amp;/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
&nbsp;
%p If youre not a producer, youre 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')}}" }

View File

@@ -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

View File

@@ -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]"}

View File

@@ -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')}}"}

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 <strong>find</strong> and <strong>contact</strong> 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 <strong>%{email}</strong> if it hasn't been activated before.<br/>
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 youre not a producer, youre 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 <span class=\"turquoise\">%{enterprise}</span> 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"