diff --git a/app/helpers/closet_hangers_helper.rb b/app/helpers/closet_hangers_helper.rb index a80364f8..97b6c420 100644 --- a/app/helpers/closet_hangers_helper.rb +++ b/app/helpers/closet_hangers_helper.rb @@ -1,8 +1,8 @@ require 'cgi' module ClosetHangersHelper - def closet_hangers_help_class - 'hidden' unless @user.closet_hangers.empty? + def closet_hangers_help_class(user) + 'hidden' unless user.closet_hangers.empty? end def closet_hanger_partial_class(hanger) @@ -12,18 +12,10 @@ module ClosetHangersHelper end end - def closet_hanger_verb(owned, positive=true) - ClosetHanger.verb(closet_hanger_subject, owned, positive) - end - def send_neomail_url(user) "http://www.neopets.com/neomessages.phtml?type=send&recipient=#{CGI.escape @user.neopets_username}" end - def closet_hanger_subject - public_perspective? ? @user.name : :you - end - def hangers_group_visibility_field_name(owned) owned ? :owned_closet_hangers_visibility : :wanted_closet_hangers_visibility end @@ -34,7 +26,7 @@ module ClosetHangersHelper end end - def closet_visibility_descriptions(subject='these items') + def closet_visibility_descriptions(subject=:items) content = '' ClosetVisibility.levels.each do |level| content << content_tag(:li, level.description(subject), 'data-id' => level.id) @@ -71,6 +63,12 @@ module ClosetHangersHelper :closet_list => {:hangers_owned => owned} link_to(content, path, options) end + + def long_closet_visibility_choices(subject) + ClosetVisibility.levels.map do |level| + ["#{level.human_name}: #{level.description(subject)}", level.id] + end + end def nc_icon_url "http://#{request.host}#{image_path 'nc.png'}" @@ -144,8 +142,12 @@ module ClosetHangersHelper translate "closet_lists.groups.#{ownership_key}.you" else translate "closet_lists.groups.#{ownership_key}.another_user", - :user_name => subject.name + :user_name => subject end end + + def closet_hangers_subject(user) + public_perspective? ? user.name : :you + end end diff --git a/app/helpers/closet_lists_helper.rb b/app/helpers/closet_lists_helper.rb index e03c6b95..c112069c 100644 --- a/app/helpers/closet_lists_helper.rb +++ b/app/helpers/closet_lists_helper.rb @@ -1,12 +1,8 @@ module ClosetListsHelper def closet_list_delete_confirmation(closet_list) - "Are you sure you want to delete \"#{closet_list.name}\"?".tap do |msg| - unless closet_list.hangers.empty? - msg << " Even if you do, we'll remember that you " + - ClosetHanger.verb(:you, closet_list.hangers_owned) + - " these items." - end - end + ownership_key = closet_list.hangers_owned? ? 'owned' : 'wanted' + translate("closet_lists.closet_list.delete_confirmation.#{ownership_key}", + :list_name => closet_list.name) end def closet_list_description_format(list) @@ -15,10 +11,10 @@ module ClosetListsHelper end def hangers_owned_options - @hangers_owned_options ||= [true, false].map do |owned| - verb = ClosetHanger.verb(:i, owned) - ["items I #{verb}", owned] - end + [ + [translate("closet_lists.form.hangers_owned_options.owned"), true], + [translate("closet_lists.form.hangers_owned_options.wanted"), false] + ] end def render_sorted_hangers(list, show_controls) diff --git a/app/models/closet_visibility.rb b/app/models/closet_visibility.rb index 4cbc0e9a..bdaa3ade 100644 --- a/app/models/closet_visibility.rb +++ b/app/models/closet_visibility.rb @@ -9,34 +9,27 @@ module ClosetVisibility end end - def description(subject=nil) - if subject - @description.sub('$SUBJECT', subject).capitalize - else - @description - end + def description(subject=:items) + I18n.translate "closet_hangers.visibility.#{name}.description.#{subject}" end def human_name - name.to_s.humanize + I18n.translate "closet_hangers.visibility.#{name}.name" end end LEVELS = [ Level.new( :id => 0, - :name => :private, - :description => "Only you can see $SUBJECT" + :name => :private ), Level.new( :id => 1, - :name => :public, - :description => "Anyone who visits this page can see $SUBJECT" + :name => :public ), Level.new( :id => 2, - :name => :trading, - :description => "$SUBJECT will be publicly listed for trades" + :name => :trading ) ] diff --git a/app/views/closet_hangers/_closet_hanger.html.haml b/app/views/closet_hangers/_closet_hanger.html.haml index 9f5bee40..8ed2079a 100644 --- a/app/views/closet_hangers/_closet_hanger.html.haml +++ b/app/views/closet_hangers/_closet_hanger.html.haml @@ -8,11 +8,11 @@ = return_to_field_tag = f.hidden_field :list_id = f.hidden_field :owned - = f.number_field :quantity, :min => 0, :required => true, :title => "You own #{pluralize closet_hanger.quantity, closet_hanger.item.name}" - = f.submit "Save" + = f.number_field :quantity, :min => 0, :required => true + = f.submit t('.submit') - if show_controls = form_tag [current_user, closet_hanger], :method => :delete, :class => 'closet-hanger-destroy' do = return_to_field_tag = hidden_field_tag 'closet_hanger[owned]', closet_hanger.owned - = submit_tag "Remove" + = submit_tag t('.delete') diff --git a/app/views/closet_hangers/_help.en-meep.html.haml b/app/views/closet_hangers/_help.en-meep.html.haml new file mode 100644 index 00000000..a93c6c1e --- /dev/null +++ b/app/views/closet_hangers/_help.en-meep.html.haml @@ -0,0 +1,35 @@ +#closet-hangers-help{:class => closet_hangers_help_class(user)} + :markdown + **These are your meepits! You can meep what items you want and own, and + share [this page](#{request.fullpath}) with the world**. Just meep up an + item in the search form above to get started. + + **You can also meep your items into lists.** + [Building an Up For Trade list is a good meep to start][uft]. You can + make lists for trade items with different market values, a private list of + what you meep for that next outfit, or whatever you like. You can also + drag-and-drop items in and out of lists. It's pretty fun. + + **Your meepits also have privacy settings.** + Items can be **private**, so only you can meep them. They can be **public**, + so you can meep this page with friends. They can even be **trading**, + meaning that we'll meepit on the item's [Infinite Closet][ic] page that + you own or want that item. + + **We try to meep trading easy.** If there's some meepit you want, you can + pull up that item's [Infinite Closet][ic] page to see if anyone is offering + it, and see what *that* user wants + in exchange. It's all pretty spiffy. Also, if you plan to trade, your should + meep your Neopets username so that + when other users come here they know how to contact you. + + **Have fun!** If you have any [neat ideas][suggestions] or [general praise and + bug reports][mail], we love to meep them. And, if you enjoy this feature, + [please consider donating to keep Dress to Impress meeping and feeping][donate]. + Meep! + + [donate]: #{donate_path} + [ic]: #{items_path} + [mail]: mailto:#{contact_email} + [suggestions]: #{feedback_url} + [uft]: #{new_user_closet_list_path(user, :closet_list => {:hangers_owned => true, :name => 'Up For Trade', :visibility => ClosetVisibility[:trading].id})} diff --git a/app/views/closet_hangers/_help.en.html.haml b/app/views/closet_hangers/_help.en.html.haml new file mode 100644 index 00000000..e9840bdd --- /dev/null +++ b/app/views/closet_hangers/_help.en.html.haml @@ -0,0 +1,35 @@ +#closet-hangers-help{:class => closet_hangers_help_class(user)} + :markdown + **These are your items! You can track what items you want and own, and + share [this page](#{request.fullpath}) with the world**. Just look up an + item in the search form above to get started. + + **You can also sort your items into lists.** + [Building an Up For Trade list is a good place to start][uft]. You can + make lists for trade items with different market values, a private list of + what you need for that next outfit, or whatever you like. You can also + drag-and-drop items in and out of lists. It's pretty fun. + + **Your items also have privacy settings.** + Items can be **private**, so only you can see them. They can be **public**, + so you can share this page with friends. They can even be **trading**, + meaning that we'll mention on the item's [Infinite Closet][ic] page that + you own or want that item. + + **We try to make trading easy.** If there's some item you want, you can + pull up that item's [Infinite Closet][ic] page to see if anyone is offering + it, and see what *that* user wants + in exchange. It's all pretty spiffy. Also, if you plan to trade, your should + add your Neopets username so that + when other users come here they know how to contact you. + + **Have fun!** If you have any [neat ideas][suggestions] or [general praise and + bug reports][mail], we love to hear them. And, if you enjoy this feature, + [please consider donating to keep Dress to Impress running and improving][donate]. + Thanks! + + [donate]: #{donate_path} + [ic]: #{items_path} + [mail]: mailto:#{contact_email} + [suggestions]: #{feedback_url} + [uft]: #{new_user_closet_list_path(user, :closet_list => {:hangers_owned => true, :name => 'Up For Trade', :visibility => ClosetVisibility[:trading].id})} diff --git a/app/views/closet_hangers/index.html.haml b/app/views/closet_hangers/index.html.haml index e4431b72..6fb56f24 100644 --- a/app/views/closet_hangers/index.html.haml +++ b/app/views/closet_hangers/index.html.haml @@ -1,13 +1,13 @@ - unless public_perspective? - - title 'Your Items' + - title t('.title_for.you') - add_body_class 'current-user' - secondary_nav do - %span#toggle-help Need help? + %span#toggle-help= t('.toggle_help') = form_tag items_path, :method => :get, :id => 'closet-hangers-items-search', 'data-current-user-id' => current_user.id do - = text_field_tag :q, nil, :placeholder => "Find items to add" - = submit_tag 'Search', :name => nil + = text_field_tag :q, nil, :placeholder => t('.item_search_placeholder') + = submit_tag t('.item_search_submit'), :name => nil - else - - title "#{@user.name}'s Items" + - title t('.title_for.another_user', :user_name => @user.name) - secondary_nav do %span#toggle-compare Compare with Your Items @@ -17,82 +17,44 @@ #closet-hangers-contact - if public_perspective? - if @user.neopets_username? - = link_to "Neomail #{@user.neopets_username}", send_neomail_url(@user) + = link_to t('.send_neomail', :neopets_username => @user.neopets_username), + send_neomail_url(@user) - else %span#edit-contact-link-to-replace-form.edit-contact-link{:class => @user.neopets_username? ? 'has-value' : nil} - %span#contact-link-no-value - Add your Neopets username + %span#contact-link-no-value= t '.neopets_username.add' %span#contact-link-has-value - Edit - = surround '"' do - Neomail - %span= @user.neopets_username + = t '.neopets_username.edit', + :neopets_username => @user.neopets_username = form_for @user do |f| = f.label :neopets_username = f.text_field :neopets_username - = f.submit "Save" - %span#cancel-contact-link cancel - -- unless public_perspective? - #closet-hangers-help{:class => closet_hangers_help_class} - :markdown - **These are your items! You can track what items you want and own, and - share [this page](#{request.fullpath}) with the world**. Just look up an - item in the search form above to get started. - - **You can also sort your items into lists.** - [Building an Up For Trade list is a good place to start][uft]. You can - make lists for trade items with different market values, a private list of - what you need for that next outfit, or whatever you like. You can also - drag-and-drop items in and out of lists. It's pretty fun. - - **Your items also have privacy settings.** - Items can be **private**, so only you can see them. They can be **public**, - so you can share this page with friends. They can even be **trading**, - meaning that we'll mention on the item's [Infinite Closet][ic] page that - you own or want that item. - - **We try to make trading easy.** If there's some item you want, you can - pull up that item's [Infinite Closet][ic] page to see if anyone is offering - it, and see what *that* user wants - in exchange. It's all pretty spiffy. Also, if you plan to trade, your should - add your Neopets username so that - when other users come here they know how to contact you. - - **Have fun!** If you have any [neat ideas][suggestions] or [general praise and - bug reports][mail], we love to hear them. And, if you enjoy this feature, - [please consider donating to keep Dress to Impress running and improving][donate]. - Thanks! - - [donate]: #{donate_path} - [ic]: #{items_path} - [mail]: mailto:#{contact_email} - [suggestions]: #{feedback_url} - [uft]: #{new_user_closet_list_path(@user, :closet_list => {:hangers_owned => true, :name => 'Up For Trade', :visibility => ClosetVisibility[:trading].id})} + = f.submit t('.neopets_username.submit') + %span#cancel-contact-link= t('.neopets_username.cancel') - unless public_perspective? + = render :partial => 'help', :locals => {:user => @user} + #closet-hangers-extras #closet-hangers-share - %label{:for => 'closet-hangers-share-box'} Public URL: - %input#closet-hangers-share-box{:type => 'text', :value => user_closet_hangers_url(@user), :readonly => true} - - = link_to "Import from closet", new_closet_page_path - = link_to "Import from SDB", new_safety_deposit_page_path - = link_to "Import from pets", new_neopets_user_path - = link_to "Export to petpage", petpage_user_closet_hangers_path(@user) - + %label{:for => 'closet-hangers-share-box'}= t '.public_url_label' + %input#closet-hangers-share-box{:type => 'text', + :value => user_closet_hangers_url(@user), + :readonly => true} + = link_to t('.import_from.closet'), new_closet_page_path + = link_to t('.import_from.safety_deposit'), new_safety_deposit_page_path + = link_to t('.import_from.neopets_user'), new_neopets_user_path + = link_to t('.export_to.petpage'), petpage_user_closet_hangers_path(@user) #closet-hangers{:class => public_perspective? ? nil : 'current-user'} - [true, false].each do |owned| .closet-hangers-group{'data-owned' => owned.to_s, :id => "closet-hangers-group-#{owned}"} %header - %h3 - Items #{closet_hanger_subject} #{closet_hanger_verb(owned)} - %span.toggle.show show - %span.toggle.hide hide + %h3= closet_lists_group_name(closet_hangers_subject(@user), owned) + %span.toggle.show= t '.toggle_group.show' + %span.toggle.hide= t '.toggle_group.hide' - unless public_perspective? - = link_to_add_closet_list 'Add new list', :owned => owned, :class => 'add-closet-list' + = link_to_add_closet_list t('.add_list'), :owned => owned, :class => 'add-closet-list' .closet-hangers-group-content = render_closet_lists(@closet_lists_by_owned[owned]) - if !public_perspective? || unlisted_hangers_count(owned) > 0 @@ -102,15 +64,14 @@ = form_for @user, :html => {:class => 'visibility-form'} do |f| = f.select hangers_group_visibility_field_name(owned), closet_visibility_choices(:human_name) - = f.submit "Save" + = f.submit t('.unlisted.submit') = closet_visibility_descriptions - if has_lists?(owned) - %h4 (Not in a list) + %h4= t '.unlisted.header' .closet-list-content .closet-list-hangers = render_unlisted_closet_hangers(owned) - %span.empty-list - There aren't any items here. + %span.empty-list= t '.unlisted.empty' - content_for :stylesheets do = stylesheet_link_tag 'south-street/jquery-ui' diff --git a/app/views/closet_lists/_closet_list.html.haml b/app/views/closet_lists/_closet_list.html.haml index 077d927a..488982fb 100644 --- a/app/views/closet_lists/_closet_list.html.haml +++ b/app/views/closet_lists/_closet_list.html.haml @@ -3,12 +3,12 @@ - if show_controls = form_for [current_user, closet_list], :html => {:class => 'visibility-form'} do |f| = f.select :visibility, closet_visibility_choices(:human_name) - = f.submit "Save" - = closet_visibility_descriptions('items in this list') + = f.submit t('.submit') + = closet_visibility_descriptions(:list) .closet-list-controls - = link_to 'Edit', edit_user_closet_list_path(closet_list.user_id, closet_list) + = link_to t('.edit'), edit_user_closet_list_path(closet_list.user_id, closet_list) = form_tag user_closet_list_path(closet_list.user_id, closet_list), :method => 'delete' do - = submit_tag 'Delete', :confirm => closet_list_delete_confirmation(closet_list) + = submit_tag t('.delete'), :confirm => closet_list_delete_confirmation(closet_list) %h4= closet_list.name .closet-list-content @@ -18,5 +18,6 @@ .closet-list-hangers - unless closet_list.hangers.empty? = render_sorted_hangers(closet_list, show_controls) - %span.empty-list This list is empty. + + %span.empty-list= t('.empty') diff --git a/app/views/closet_lists/_form.html.haml b/app/views/closet_lists/_form.html.haml index fb84c0d2..af8e4317 100644 --- a/app/views/closet_lists/_form.html.haml +++ b/app/views/closet_lists/_form.html.haml @@ -1,31 +1,22 @@ - secondary_nav do - = link_to 'Back to Your Items', user_closet_hangers_path(current_user), :class => 'button' + = link_to t('.your_items_link'), user_closet_hangers_path(current_user), :class => 'button' = form_for [@closet_list.user, @closet_list] do |f| %ul.fields %li = f.label :name - %span.hint Like "up for trade" or "NC wishlist" + %span.hint= t '.name_hint' = f.text_field :name, :required => true %li - = f.label :hangers_owned, 'This is a list for…'.html_safe + = f.label :hangers_owned, t('.hangers_owned_label') = f.select :hangers_owned, hangers_owned_options %li - = f.label :visibility, 'Who can see this list?' - = f.select :visibility, closet_visibility_choices(:description, 'Items in this list') + = f.label :visibility, t('.visibility_label') + = f.select :visibility, long_closet_visibility_choices(:list) %li = f.label :description - %span.hint - Why are these items in a list? What are your terms for trading? - Or you can leave this blank. + %span.hint= t '.description_hint' = f.text_area :description - %span.hint - We - = surround '_' do - %em support - = surround '**' do - %strong Markdown - and - some HTML. - = f.submit 'Save list' + %span.hint= t '.description_markup_hint_html' + = f.submit t('.submit') diff --git a/app/views/closet_lists/edit.html.haml b/app/views/closet_lists/edit.html.haml index d5ed6893..04a1bd7d 100644 --- a/app/views/closet_lists/edit.html.haml +++ b/app/views/closet_lists/edit.html.haml @@ -1,3 +1,3 @@ -- title "Editing list \"#{@closet_list.name}\"" +- title t('.title', :list_name => @closet_list.name) = render 'form' diff --git a/app/views/closet_lists/new.html.haml b/app/views/closet_lists/new.html.haml index af941cfe..381b2e1b 100644 --- a/app/views/closet_lists/new.html.haml +++ b/app/views/closet_lists/new.html.haml @@ -1,3 +1,3 @@ -- title 'Create an items list' +- title t('.title') = render 'form' diff --git a/config/locales/en-meep.yml b/config/locales/en-meep.yml index 468cd4d8..9760028d 100644 --- a/config/locales/en-meep.yml +++ b/config/locales/en-meep.yml @@ -5,6 +5,15 @@ en-meep: infinite_closet: Infinite Meepit modeling_hub: Meepiting Hub + activerecord: + attributes: + closet_list: + name: Nameep + description: Descreeption + + user: + neopets_username: Neopets usermeep + layouts: application: title_tagline: Preview customized Neopets' meeps and meepits @@ -48,8 +57,89 @@ en-meep: converted_at_html: Conveeped %{converted_at_ago} ago reported_at_html: Repeeped %{reported_at_ago} ago + closet_hangers: + closet_hanger: + submit: Submeep + delete: Deleep + + index: + title_for: + you: Your Meeps + another_user: "%{user_name}'s meeps" + toggle_help: Need meep? + item_search_placeholder: Find meeps to add + item_search_submit: Meep + send_neomail: Neomeep %{neopets_username} + neopets_username: + add: Add your Neopets usermeep + edit: Edit "Neomeep %{neopets_username}" + submit: Meep + cancel: Unmeep + public_url_label: "Public Meepit:" + import_from: + closet: Impeep from closet + safety_deposit: Impeep from SDB + neopets_user: Impeep from pets + export_to: + petpage: Expeep to petpage + toggle_group: + show: meep + hide: unmeep + add_list: Meep new list + unlisted: + submit: Meep + header: (Not in a meepit) + empty: There aren't any meepits here. + + visibility: + private: + name: Preevate + description: + items: Only you can meep these items + list: Only you can meep this list + public: + name: Publeek + description: + items: Anyone who looks up your items can meep these items + list: Anyone who looks up your items can meep this list + trading: + name: Tradeeng + description: + items: These items will be publicly meeped for trades + list: Items in this list will be publicly meeped for trades + closet_lists: - unlisted_name: Not in a meep + closet_list: + submit: Submeep + edit: Meepit + delete: Deleep + delete_confirmation: + owned: + Are you sure you want to deleep "%{list_name}"? Even if you do, we'll + remember that you own these items. + wanted: + Are you sure you want to deleep "%{list_name}"? Even if you do, we'll + remember that you want these items. + empty: This meep is empty. + + edit: + title: Meepiting list "%{list_name}" + + form: + your_items_link: Back to Your Meeps + name_hint: Like "meep for trade" or "NC meeplist" + hangers_owned_label: This is a meep for… + hangers_owned_options: + owned: Meepits you own + wanted: Meepits you want + visibility_label: Who can meep this list? + description_hint: + Why are these meepits in the same meep? What are your terms for meeping? + Or you can meep this blank. + description_markup_hint_html: + We _support_ **Meepdown** and some HTML. + submit: Meep list + groups: owned_by: you: Meeps you own @@ -57,6 +147,11 @@ en-meep: wanted_by: you: Meeps you want another_user: Meeps %{user_name} wants + + new: + title: Meep an items list + + unlisted_name: Not in a meep contributions: contributed_description: diff --git a/config/locales/en.yml b/config/locales/en.yml index 1394679b..106b0346 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -5,6 +5,15 @@ en: infinite_closet: Infinite Closet modeling_hub: Modeling Hub + activerecord: + attributes: + closet_list: + name: Name + description: Description + + user: + neopets_username: Neopets username + layouts: application: title_tagline: Preview customized Neopets' clothing and wearables @@ -49,8 +58,89 @@ en: converted_at_html: Converted %{converted_at_ago} ago reported_at_html: Reported %{reported_at_ago} ago + closet_hangers: + closet_hanger: + submit: Save + delete: Remove + + index: + title_for: + you: Your Items + another_user: "%{user_name}'s items" + toggle_help: Need help? + item_search_placeholder: Find items to add + item_search_submit: Search + send_neomail: Neomail %{neopets_username} + neopets_username: + add: Add your Neopets username + edit: Edit "Neomail %{neopets_username}" + submit: Save + cancel: Cancel + public_url_label: "Public URL:" + import_from: + closet: Import from closet + safety_deposit: Import from SDB + neopets_user: Import from pets + export_to: + petpage: Export to petpage + toggle_group: + show: show + hide: hide + add_list: Add new list + unlisted: + submit: Save + header: (Not in a list) + empty: There aren't any items here. + + visibility: + private: + name: Private + description: + items: Only you can see these items + list: Only you can see this list + public: + name: Public + description: + items: Anyone who looks up your items can see these items + list: Anyone who looks up your items can see this list + trading: + name: Trading + description: + items: These items will be publicly listed for trades + list: Items in this list will be publicly listed for trades + closet_lists: - unlisted_name: Not in a list + closet_list: + submit: Save + edit: Edit + delete: Delete + delete_confirmation: + owned: + Are you sure you want to delete "%{list_name}"? Even if you do, we'll + remember that you own these items. + wanted: + Are you sure you want to delete "%{list_name}"? Even if you do, we'll + remember that you want these items. + empty: This list is empty. + + edit: + title: Editing list "%{list_name}" + + form: + your_items_link: Back to Your Items + name_hint: Like "up for trade" or "NC wishlist" + hangers_owned_label: This is a list for… + hangers_owned_options: + owned: Items you own + wanted: Items you want + visibility_label: Who can see this list? + description_hint: + Why are these items in the same list? What are your terms for trading? + Or you can leave this blank. + description_markup_hint_html: + We _support_ **Markdown** and some HTML. + submit: Save list + groups: owned_by: you: Items you own @@ -58,7 +148,11 @@ en: wanted_by: you: Items you want another_user: Items %{user_name} wants - + + new: + title: Create an items list + + unlisted_name: Not in a list contributions: contributed_description: