Stop referencing Neopia, just do modeling inline

I hope this doesn't cause problems! But yeah, with Puma doing threading, and maybe switching to Falcon someday to get even better concurrency properties, I feel like this will probably be fine?

And it makes the UX a loootttt better, to be back in the world where all these forms just work, whew.
This commit is contained in:
Emi Matchu 2023-10-12 22:30:16 -07:00
parent e00ee08ae7
commit 2e152735c5
10 changed files with 225 additions and 343 deletions

View file

@ -1,10 +1,11 @@
(function () { // don't need to export anything in here (function () {
// don't need to export anything in here
var preview_el = $('#pet-preview'), var preview_el = $("#pet-preview"),
img_el = preview_el.find('img'), img_el = preview_el.find("img"),
response_el = preview_el.find('span'); response_el = preview_el.find("span");
var defaultPreviewUrl = img_el.attr('src'); var defaultPreviewUrl = img_el.attr("src");
preview_el.click(function () { preview_el.click(function () {
Preview.Job.current.visit(); Preview.Job.current.visit();
@ -12,25 +13,29 @@
var Preview = { var Preview = {
clear: function () { clear: function () {
if(typeof Preview.Job.fallback != 'undefined') Preview.Job.fallback.setAsCurrent(); if (typeof Preview.Job.fallback != "undefined")
Preview.Job.fallback.setAsCurrent();
}, },
displayLoading: function () { displayLoading: function () {
preview_el.addClass('loading'); preview_el.addClass("loading");
response_el.text('Loading...'); response_el.text("Loading...");
}, },
failed: function () { failed: function () {
preview_el.addClass('hidden'); preview_el.addClass("hidden");
}, },
notFound: function (key, options) { notFound: function (key, options) {
Preview.failed(); Preview.failed();
response_el.empty(); response_el.empty();
$('#preview-' + key + '-template').tmpl(options).appendTo(response_el); $("#preview-" + key + "-template")
.tmpl(options)
.appendTo(response_el);
}, },
updateWithName: function (name_el) { updateWithName: function (name_el) {
var name = name_el.val(), job; var name = name_el.val(),
if(name) { job;
if (name) {
currentName = name; currentName = name;
if(!Preview.Job.current || name != Preview.Job.current.name) { if (!Preview.Job.current || name != Preview.Job.current.name) {
job = new Preview.Job.Name(name); job = new Preview.Job.Name(name);
job.setAsCurrent(); job.setAsCurrent();
Preview.displayLoading(); Preview.displayLoading();
@ -38,8 +43,8 @@
} else { } else {
Preview.clear(); Preview.clear();
} }
} },
} };
function loadNotable() { function loadNotable() {
// TODO: add HTTPS to notables // TODO: add HTTPS to notables
@ -51,13 +56,13 @@
// Preview.Job.fallback.setAsCurrent(); // Preview.Job.fallback.setAsCurrent();
// } // }
// }); // });
if(!Preview.Job.current) { if (!Preview.Job.current) {
Preview.Job.fallback.setAsCurrent(); Preview.Job.fallback.setAsCurrent();
} }
} }
function loadFeature() { function loadFeature() {
$.getJSON('/donations/features', function(features) { $.getJSON("/donations/features", function (features) {
if (features.length > 0) { if (features.length > 0) {
var feature = features[Math.floor(Math.random() * features.length)]; var feature = features[Math.floor(Math.random() * features.length)];
Preview.Job.fallback = new Preview.Job.Feature(feature); Preview.Job.fallback = new Preview.Job.Feature(feature);
@ -76,177 +81,172 @@
var job = this, var job = this,
quality = 2; quality = 2;
job.loading = false; job.loading = false;
function getImageSrc() { function getImageSrc() {
if (key.substr(0, 3) === 'a:-') { if (key.substr(0, 3) === "a:-") {
// lol lazy code for prank image :P // lol lazy code for prank image :P
// TODO: HTTPS? // TODO: HTTPS?
return "http://swfimages.impress.openneo.net" + return (
"/biology/000/000/0-2/" + key.substr(2) + "/300x300.png"; "http://swfimages.impress.openneo.net" +
} else if (base === 'cp' || base === 'cpn') { "/biology/000/000/0-2/" +
return petImage(base + '/' + key, quality); key.substr(2) +
} else if (base === 'url') { "/300x300.png"
);
} else if (base === "cp" || base === "cpn") {
return petImage(base + "/" + key, quality);
} else if (base === "url") {
return key; return key;
} else { } else {
throw new Error("unrecognized image base " + base); throw new Error("unrecognized image base " + base);
} }
} }
function load() { function load() {
job.loading = true; job.loading = true;
img_el.attr('src', getImageSrc()); img_el.attr("src", getImageSrc());
} }
this.increaseQualityIfPossible = function () { this.increaseQualityIfPossible = function () {
if(quality == 2) { if (quality == 2) {
quality = 4; quality = 4;
load(); load();
} }
} };
this.setAsCurrent = function () { this.setAsCurrent = function () {
Preview.Job.current = job; Preview.Job.current = job;
load(); load();
} };
this.notFound = function() { this.notFound = function () {
Preview.notFound('pet-not-found'); Preview.notFound("pet-not-found");
} };
} };
Preview.Job.Name = function (name) { Preview.Job.Name = function (name) {
this.name = name; this.name = name;
Preview.Job.apply(this, [name, 'cpn']); Preview.Job.apply(this, [name, "cpn"]);
this.visit = function() { this.visit = function () {
$('.main-pet-name').val(this.name).closest('form').submit(); $(".main-pet-name").val(this.name).closest("form").submit();
} };
} };
Preview.Job.Hash = function (hash, form) { Preview.Job.Hash = function (hash, form) {
Preview.Job.apply(this, [hash, 'cp']); Preview.Job.apply(this, [hash, "cp"]);
this.visit = function() { this.visit = function () {
window.location = "/wardrobe?color=" + form.find('.color').val() + "&species=" + window.location =
form.find('.species').val(); "/wardrobe?color=" +
} form.find(".color").val() +
} "&species=" +
form.find(".species").val();
};
};
Preview.Job.Feature = function(feature) { Preview.Job.Feature = function (feature) {
Preview.Job.apply(this, [feature.outfit_image_url, 'url']); Preview.Job.apply(this, [feature.outfit_image_url, "url"]);
this.name = "Thanks for donating, " + feature.donor_name + "!"; // TODO: i18n this.name = "Thanks for donating, " + feature.donor_name + "!"; // TODO: i18n
this.visit = function() { this.visit = function () {
window.location = '/donate'; window.location = "/donate";
} };
this.notFound = function() { this.notFound = function () {
// The outfit thumbnail hasn't generated or is missing or something. // The outfit thumbnail hasn't generated or is missing or something.
// Let's fall back to a boring image for now. // Let's fall back to a boring image for now.
var boring = new Preview.Job.Feature({ var boring = new Preview.Job.Feature({
donor_name: feature.donor_name, donor_name: feature.donor_name,
outfit_image_url: defaultPreviewUrl outfit_image_url: defaultPreviewUrl,
}); });
boring.setAsCurrent(); boring.setAsCurrent();
} };
} };
$(function () { $(function () {
var previewWithNameTimeout; var previewWithNameTimeout;
var name_el = $('.main-pet-name'); var name_el = $(".main-pet-name");
name_el.val(PetQuery.name); name_el.val(PetQuery.name);
Preview.updateWithName(name_el); Preview.updateWithName(name_el);
name_el.keyup(function () { name_el.keyup(function () {
if(previewWithNameTimeout) { if (previewWithNameTimeout) {
clearTimeout(previewWithNameTimeout); clearTimeout(previewWithNameTimeout);
Preview.Job.current.loading = false; Preview.Job.current.loading = false;
} }
var name_el = $(this); var name_el = $(this);
previewWithNameTimeout = setTimeout(function() { previewWithNameTimeout = setTimeout(function () {
Preview.updateWithName(name_el); Preview.updateWithName(name_el);
}, 250); }, 250);
}); });
img_el.load(function () { img_el
if(Preview.Job.current.loading) { .load(function () {
Preview.Job.loading = false; if (Preview.Job.current.loading) {
Preview.Job.current.increaseQualityIfPossible(); Preview.Job.loading = false;
preview_el.removeClass('loading').removeClass('hidden').addClass('loaded'); Preview.Job.current.increaseQualityIfPossible();
response_el.text(Preview.Job.current.name); preview_el
} .removeClass("loading")
}).error(function () { .removeClass("hidden")
if(Preview.Job.current.loading) { .addClass("loaded");
Preview.Job.loading = false; response_el.text(Preview.Job.current.name);
Preview.Job.current.notFound(); }
} })
}); .error(function () {
if (Preview.Job.current.loading) {
$('.species, .color').change(function () { Preview.Job.loading = false;
var type = {}, nameComponents = {}; Preview.Job.current.notFound();
var form = $(this).closest('form'); }
form.find('select').each(function () { });
var el = $(this), selectedEl = el.children(':selected'), key = el.attr('name');
$(".species, .color").change(function () {
var type = {},
nameComponents = {};
var form = $(this).closest("form");
form.find("select").each(function () {
var el = $(this),
selectedEl = el.children(":selected"),
key = el.attr("name");
type[key] = selectedEl.val(); type[key] = selectedEl.val();
nameComponents[key] = selectedEl.text(); nameComponents[key] = selectedEl.text();
}); });
name = nameComponents.color + ' ' + nameComponents.species; name = nameComponents.color + " " + nameComponents.species;
Preview.displayLoading(); Preview.displayLoading();
$.ajax({ $.ajax({
url: '/species/' + type.species + '/color/' + type.color + '/pet_type.json', url:
"/species/" +
type.species +
"/color/" +
type.color +
"/pet_type.json",
data: { data: {
'for': 'image' for: "image",
}, },
dataType: 'json', dataType: "json",
success: function (data) { success: function (data) {
var job; var job;
if(data) { if (data) {
job = new Preview.Job.Hash(data.image_hash, form); job = new Preview.Job.Hash(data.image_hash, form);
job.name = name; job.name = name;
job.setAsCurrent(); job.setAsCurrent();
} else { } else {
Preview.notFound('pet-type-not-found', { Preview.notFound("pet-type-not-found", {
color_name: nameComponents.color, color_name: nameComponents.color,
species_name: nameComponents.species species_name: nameComponents.species,
}); });
} }
} },
}); });
}); });
var neopiaError = document.location.search.match(/neopia%5Berror%5D=([^&]+)/); $(".load-pet-to-wardrobe").submit(function (e) {
if (neopiaError !== null) { if ($(this).find(".main-pet-name").val() === "" && Preview.Job.current) {
var message = decodeURI(neopiaError[1]).replace(/\+/g, ' ');
if (message === "pet not found") {
$('#pet-not-found').show();
} else {
var el = $('#neopia-error');
var text = el.text().replace('%{message}', message);
el.text(text).show();
}
}
$('.load-pet-to-wardrobe').submit(function(e) {
if ($(this).find('.main-pet-name').val() === "" && Preview.Job.current) {
e.preventDefault(); e.preventDefault();
Preview.Job.current.visit(); Preview.Job.current.visit();
} }
}); });
function setNeopiaStatus(isOnline) {
$('#outfit-forms').attr('data-neopia-status', isOnline ? 'online' : 'offline');
}
Neopia.Status.get().then(function(r) {
setNeopiaStatus(!!r.status);
}).fail(function() {
setNeopiaStatus(false);
});
}); });
$('#latest-contribution-created-at').timeago(); $("#latest-contribution-created-at").timeago();
})(); })();

View file

@ -35,7 +35,7 @@ body.outfits-new
a a
color: #0a58ca color: #0a58ca
#pet-not-found, #neopia-error #pet-not-found
display: none display: none
#outfit-forms #outfit-forms
@ -93,15 +93,6 @@ body.outfits-new
font-size: 175% font-size: 175%
select select
font-size: 120% font-size: 120%
[data-require-neopia-status=offline]
display: none
&[data-neopia-status=offline]
[data-require-neopia-status=online]
display: none
[data-require-neopia-status=offline]
display: block
[data-require-neopia-status=offline] .load-pet-to-wardrobe legend a
font-size: 85%
#description, #top-contributors #description, #top-contributors
float: left float: left
#description #description

View file

@ -45,10 +45,8 @@ class OutfitsController < ApplicationController
end end
def new def new
unless localized_fragment_exist?("outfits#new neopia_online start_from_scratch_form pranks_funny=#{Color.pranks_funny?}") && localized_fragment_exist?("outfits#new neopia_offline start_from_scratch_form pranks_funny=#{Color.pranks_funny?}") @colors = Color.funny.alphabetical
@colors = Color.funny.alphabetical @species = Species.alphabetical
@species = Species.alphabetical
end
newest_items = Item.newest.select([:id, :updated_at, :thumbnail_url, :rarity_index]). newest_items = Item.newest.select([:id, :updated_at, :thumbnail_url, :rarity_index]).
includes(:translations).limit(18) includes(:translations).limit(18)

View file

@ -53,7 +53,7 @@ class PetsController < ApplicationController
def destination def destination
case (params[:destination] || params[:origin]) case (params[:destination] || params[:origin])
when 'wardrobe' then wardrobe_path + '#' when 'wardrobe' then wardrobe_path + '?'
when 'needed_items' then needed_items_path + '?' when 'needed_items' then needed_items_path + '?'
else root_path + '#' else root_path + '#'
end end

View file

@ -50,14 +50,6 @@ module OutfitsHelper
content_tag(:dd, search_query_description(base, filter_key)) content_tag(:dd, search_query_description(base, filter_key))
end end
def neopia_host
Rails.configuration.neopia_host
end
def remote_load_pet_path
"https://#{neopia_host}/api/1/pet/customization"
end
def render_predicted_missing_species_by_color(species_by_color) def render_predicted_missing_species_by_color(species_by_color)
key_prefix = 'outfits.new.newest_items.unmodeled.content' key_prefix = 'outfits.new.newest_items.unmodeled.content'
@ -115,17 +107,6 @@ module OutfitsHelper
text_field_tag 'name', nil, options text_field_tag 'name', nil, options
end end
def modeling_i18n_tag
localized_cache('modeling_i18n') do
modeling_i18n = {
modeledBodyTitle: t('.newest_items.modeled.body_title'),
pet: t('.newest_items.modeled.pet'),
neopetsUsernamesForm: t('.newest_items.modeled.neopets_usernames_form')
}
javascript_tag("var ModelingI18n = #{modeling_i18n.to_json};")
end
end
def prank_color_message(unfunny_human_name, artist_name, artist_url) def prank_color_message(unfunny_human_name, artist_name, artist_url)
content_key_base = Color.pranks_funny? ? 'funny' : 'unfunny' content_key_base = Color.pranks_funny? ? 'funny' : 'unfunny'
if artist_url if artist_url

View file

@ -3,7 +3,6 @@
= advertise_campaign_progress @campaign = advertise_campaign_progress @campaign
%p#pet-not-found.alert= t 'pets.load.not_found' %p#pet-not-found.alert= t 'pets.load.not_found'
%p#neopia-error.alert= t 'pets.load.neopia_error'
%section.pardon-our-dust %section.pardon-our-dust
= image_tag 'pardon-our-dust/worker.png', class: 'thumbnail', = image_tag 'pardon-our-dust/worker.png', class: 'thumbnail',
@ -23,45 +22,21 @@
%h1= t 'app_name' %h1= t 'app_name'
%h2= t '.tagline' %h2= t '.tagline'
%div{'data-require-neopia-status' => 'online'} = form_tag load_pet_path, method: 'POST', class: 'primary load-pet-to-wardrobe' do
= form_tag remote_load_pet_path, method: 'GET', class: 'primary load-pet-to-wardrobe' do = hidden_field_tag 'destination', 'wardrobe'
= hidden_field_tag 'impress_user', current_user.try(:id) %fieldset
- localized_cache action_suffix: 'outfits#new neopia_online main_load_pet_form_content' do %legend= t '.load_pet'
= hidden_field_tag 'redirect', "#{wardrobe_url}\#{q}" = pet_name_tag class: 'main-pet-name'
%fieldset %button{:type => "submit"}
%legend= t '.neopia_online.load_pet' = t '.submit.primary'
= pet_name_tag class: 'main-pet-name'
%button{:type => "submit"}
= t '.submit.primary'
- localized_cache "outfits#new neopia_online start_from_scratch_form pranks_funny=#{Color.pranks_funny?}" do = form_tag wardrobe_path, method: 'GET', class: 'secondary start-from-scratch', authenticity_token: false do
= form_tag wardrobe_path, method: 'GET', class: 'secondary start-from-scratch', authenticity_token: false do %fieldset
%fieldset %legend= t '.start_from_scratch'
%legend= t '.neopia_online.start_from_scratch' = pet_attribute_select 'color', @colors, 8
= pet_attribute_select 'color', @colors, 8 = pet_attribute_select 'species', @species
= pet_attribute_select 'species', @species %button{:type => "submit"}
%button{:type => "submit"} = t('.submit.secondary')
= t('.submit.secondary')
%div{'data-require-neopia-status' => 'offline'}
- localized_cache "outfits#new neopia_offline start_from_scratch_form pranks_funny=#{Color.pranks_funny?}" do
= form_tag wardrobe_path, method: 'GET', class: 'primary start-from-scratch', authenticity_token: false do
%fieldset
%legend= t '.neopia_offline.start_from_scratch'
= pet_attribute_select 'color', @colors, 8
= pet_attribute_select 'species', @species
%button{:type => "submit"}
= t('.submit.primary')
= form_tag remote_load_pet_path, method: 'GET', class: 'secondary load-pet-to-wardrobe' do
= hidden_field_tag 'impress_user', current_user.try(:id)
- localized_cache action_suffix: 'outfits#new neopia_offline main_load_pet_form_content' do
= hidden_field_tag 'redirect', "#{wardrobe_url}\#{q}"
%fieldset
%legend= t '.neopia_offline.load_pet.main_html', link: link_to(t('.neopia_offline.load_pet.link_content'), 'http://blog.openneo.net/')
= pet_name_tag class: 'main-pet-name'
%button{:type => "submit"}
= t '.submit.secondary'
%ul#sections %ul#sections
- localized_cache :action_suffix => 'your_items_module' do - localized_cache :action_suffix => 'your_items_module' do
@ -95,9 +70,7 @@
%div %div
%h4= t '.modeling_hub.tagline' %h4= t '.modeling_hub.tagline'
%p= t '.modeling_hub.description' %p= t '.modeling_hub.description'
= form_tag remote_load_pet_path, method: 'POST' do = form_tag load_pet_path, method: 'POST' do
= hidden_field_tag 'impress_user', current_user.try(:id)
= hidden_field_tag 'redirect', "#{root_url}\#{q}"
= pet_name_tag placeholder: t('.modeling_hub.load_pet.placeholder'), = pet_name_tag placeholder: t('.modeling_hub.load_pet.placeholder'),
required: true required: true
= submit_tag t('.modeling_hub.load_pet.submit') = submit_tag t('.modeling_hub.load_pet.submit')
@ -110,7 +83,6 @@
#whats-new #whats-new
- if @newest_unmodeled_items.present? - if @newest_unmodeled_items.present?
#modeling-neopets-users{'data-usernames' => @neopets_usernames.to_json}
%h3= t '.newest_items.unmodeled.header' %h3= t '.newest_items.unmodeled.header'
%ul#newest-unmodeled-items %ul#newest-unmodeled-items
- @newest_unmodeled_items.each do |item| - @newest_unmodeled_items.each do |item|
@ -146,10 +118,6 @@
%script#preview-pet-not-found-template{:type => 'text/x-jquery-tmpl'} %script#preview-pet-not-found-template{:type => 'text/x-jquery-tmpl'}
= t '.preview.pet_not_found' = t '.preview.pet_not_found'
- content_for :meta do
%meta{name: 'neopia-host', content: neopia_host}
- content_for :javascripts do - content_for :javascripts do
= include_javascript_libraries :jquery20, :jquery_tmpl = include_javascript_libraries :jquery20, :jquery_tmpl
= modeling_i18n_tag = javascript_include_tag 'ajax_auth', 'react', 'jquery.timeago', 'pet_query', 'outfits/new'
= javascript_include_tag 'ajax_auth', 'react', 'jquery.timeago', 'pet_query', 'modeling', 'outfits/new'

View file

@ -5,20 +5,20 @@ en-MEEP:
infinite_closet: Infinite Meepit infinite_closet: Infinite Meepit
modeling_hub: Meepiting Hub modeling_hub: Meepiting Hub
locale_name: English (meep!) locale_name: English (meep!)
activerecord: activerecord:
attributes: attributes:
closet_list: closet_list:
name: Nameep name: Nameep
description: Descreeption description: Descreeption
user: user:
contact_neopets_connection_id: Meep Neomail to contact_neopets_connection_id: Meep Neomail to
layouts: layouts:
application: application:
title_tagline: Preview customized Neopets' meeps and meepits title_tagline: Preview customized Neopets' meeps and meepits
userbar: userbar:
greeting: Meep, %{user_name}! greeting: Meep, %{user_name}!
contributions_summary: contributions_summary:
@ -29,7 +29,7 @@ en-MEEP:
settings: Setteeps settings: Setteeps
logout: Meep out logout: Meep out
login: Meep in login: Meep in
footer: footer:
blog: Bleep blog: Bleep
source_code: Source Meep source_code: Source Meep
@ -37,14 +37,13 @@ en-MEEP:
contact: Meeptact contact: Meeptact
suggestions: Suggesteeps suggestions: Suggesteeps
email: Questions, comments, meepits email: Questions, comments, meepits
copyright: copyright: Images © 2000%{year} Neopets, Inc. All Rights Reserved.
Images © 2000%{year} Neopets, Inc. All Rights Reserved.
Used With Permission. Meep. Used With Permission. Meep.
items: items:
title_tagline: Neopets customization meep and meepits database title_tagline: Neopets customization meep and meepits database
search: Meep search: Meep
new: new:
title: Meep broken image title: Meep broken image
explanation_html: explanation_html:
@ -52,36 +51,33 @@ en-MEEP:
get things quite right, and sometimes that can be meeped by just get things quite right, and sometimes that can be meeped by just
meeping the conversion again. If reconversion doesn't seem to meep the meeping the conversion again. If reconversion doesn't seem to meep the
meep, consider sending us a meep at %{contact_link}. Meep! meep, consider sending us a meep at %{contact_link}. Meep!
call_to_action: call_to_action: Which of these meeps looked meeped? We'll put it in line for remeeping.
Which of these meeps looked meeped? We'll put it in line for remeeping.
submit: Meep as broken submit: Meep as broken
converted_at_html: Conveeped %{converted_at_ago} ago converted_at_html: Conveeped %{converted_at_ago} ago
reported_at_html: Repeeped %{reported_at_ago} ago reported_at_html: Repeeped %{reported_at_ago} ago
closet_hangers: closet_hangers:
closet_hanger: closet_hanger:
submit: Submeep submit: Submeep
delete: Deleep delete: Deleep
create: create:
success: success:
owned: owned:
in_list: in_list: Meep! You own %{count} of the %{item_name} in the %{list_name} list.
Meep! You own %{count} of the %{item_name} in the %{list_name} list.
unlisted: Meep! You own %{count} of the %{item_name}. unlisted: Meep! You own %{count} of the %{item_name}.
wanted: wanted:
in_list: in_list: Meep! You want %{count} of the %{item_name} in the %{list_name} list.
Meep! You want %{count} of the %{item_name} in the %{list_name} list.
unlisted: Meep! You want %{count} of the %{item_name}. unlisted: Meep! You want %{count} of the %{item_name}.
invalid: invalid:
owned: "We couldn't meep how many %{item_name} you own: %{errors}" owned: "We couldn't meep how many %{item_name} you own: %{errors}"
wanted: "We couldn't meep how many %{item_name} you want: %{errors}" wanted: "We couldn't meep how many %{item_name} you want: %{errors}"
destroy: destroy:
success: success:
owned: Meep! You do not own the %{item_name}. owned: Meep! You do not own the %{item_name}.
wanted: Meep! You do not want the %{item_name}. wanted: Meep! You do not want the %{item_name}.
index: index:
title_for: title_for:
you: Your Meeps you: Your Meeps
@ -114,9 +110,8 @@ en-MEEP:
add_item_html: Meep <strong>%{item_name}</strong> add_item_html: Meep <strong>%{item_name}</strong>
add_to_list_html: Meep to <strong>%{list_name}</strong> add_to_list_html: Meep to <strong>%{list_name}</strong>
add_to_group_html: Meep to <strong>%{group_name}</strong>, no list add_to_group_html: Meep to <strong>%{group_name}</strong>, no list
already_in_collection_html: already_in_collection_html: It's already meeped in <strong>%{collection_name}</strong>
It's already meeped in <strong>%{collection_name}</strong>
petpage: petpage:
title: Export to meeppage title: Export to meeppage
your_items_link: Back to Your Meeps your_items_link: Back to Your Meeps
@ -127,16 +122,15 @@ en-MEEP:
have to meep. The HTML is flexible, so, if you're the artsy type, you're have to meep. The HTML is flexible, so, if you're the artsy type, you're
free to meep with the styles all you want! free to meep with the styles all you want!
instructions: instructions:
main_html: main_html: Meep the HTML from the box below, then paste it into
Meep the HTML from the box below, then paste it into
%{edit_petpage_link}. Then meep to the Neoboards to show off! Have %{edit_petpage_link}. Then meep to the Neoboards to show off! Have
fun! fun!
edit_petpage_link_content: your meepit's page edit_petpage_link_content: your meepit's page
petpage_content: petpage_content:
unlisted_header: (Not in a meep) unlisted_header: (Not in a meep)
footer: I meeped this list on Dreep to Impreep. You can, too! footer: I meeped this list on Dreep to Impreep. You can, too!
visibility: visibility:
private: private:
name: Preevate name: Preevate
@ -153,11 +147,11 @@ en-MEEP:
description: description:
items: These items will be publicly meeped for trades items: These items will be publicly meeped for trades
list: Items in this list will be publicly meeped for trades list: Items in this list will be publicly meeped for trades
update_quantities: update_quantities:
success: Successfully meeped how many of the %{item_name} you own and want. success: Successfully meeped how many of the %{item_name} you own and want.
invalid: "We couldn't meep those quantities: %{errors}" invalid: "We couldn't meep those quantities: %{errors}"
closet_lists: closet_lists:
closet_list: closet_list:
submit: Submeep submit: Submeep
@ -171,10 +165,10 @@ en-MEEP:
Are you sure you want to deleep "%{list_name}"? Even if you do, we'll Are you sure you want to deleep "%{list_name}"? Even if you do, we'll
remember that you want these items. remember that you want these items.
empty: This meep is empty. empty: This meep is empty.
edit: edit:
title: Meepiting list "%{list_name}" title: Meepiting list "%{list_name}"
form: form:
your_items_link: Back to Your Meeps your_items_link: Back to Your Meeps
name: name:
@ -184,26 +178,24 @@ en-MEEP:
visibility: visibility:
label: Who can meep this list? label: Who can meep this list?
description: description:
hint: hint: Why are these meepits in the same meep? What are your terms for
Why are these meepits in the same meep? What are your terms for
meeping? Or you can meep this blank. meeping? Or you can meep this blank.
markup_hint_html: markup_hint_html: We _<em>support</em>_ **<strong>Meepdown</strong>** and some HTML.
We _<em>support</em>_ **<strong>Meepdown</strong>** and some HTML.
submit: Meep list submit: Meep list
groups: groups:
owned_by: owned_by:
you: Meeps you own you: Meeps you own
another_user: Meeps %{user_name} owns another_user: Meeps %{user_name} owns
wanted_by: wanted_by:
you: Meeps you want you: Meeps you want
another_user: Meeps %{user_name} wants another_user: Meeps %{user_name} wants
new: new:
title: Meep an items list title: Meep an items list
unlisted_name: Not in a meep unlisted_name: Not in a meep
contributions: contributions:
contributed_description: contributed_description:
parents: parents:
@ -216,21 +208,20 @@ en-MEEP:
swf_asset_html: "%{item_description} on a new body meep" swf_asset_html: "%{item_description} on a new body meep"
pet_type_html: "%{pet_type_description} for the first meep" pet_type_html: "%{pet_type_description} for the first meep"
pet_state_html: "a new meep for %{pet_type_description}" pet_state_html: "a new meep for %{pet_type_description}"
contribution: contribution:
description_html: "%{user_link} meeped us %{contributed_description}" description_html: "%{user_link} meeped us %{contributed_description}"
created_at_html: "%{created_at_ago} ameep" created_at_html: "%{created_at_ago} ameep"
index: index:
title: Recent Contribeeptions title: Recent Contribeeptions
user_summary: "%{user_name} currently has %{user_points} meeps" user_summary: "%{user_name} currently has %{user_points} meeps"
no_contributions: There are no contribeeptions here. no_contributions: There are no contribeeptions here.
items: items:
index: index:
title_with_query: Searching Infinite Meepit for "%{query}" title_with_query: Searching Infinite Meepit for "%{query}"
no_results_html: no_results_html: We couldn't meep any wearables that meeped %{query_html}.
We couldn't meep any wearables that meeped %{query_html}.
Meep! Meep!
modeling_request: modeling_request:
main_html: main_html:
@ -252,7 +243,7 @@ en-MEEP:
nc: nc:
query: blue is:nc query: blue is:nc
description: returns any NC Meep item with the meep "blue" in it description: returns any NC Meep item with the meep "blue" in it
pb: pb:
query: collar -is:pb query: collar -is:pb
description: description:
returns any item with the meep "collar" in it that isn't from a returns any item with the meep "collar" in it that isn't from a
@ -267,7 +258,7 @@ en-MEEP:
header: New Meeps header: New Meeps
species_search: species_search:
header: Can't decide? Meep by species header: Can't decide? Meep by species
item: item:
nc: nc:
abbr: MC abbr: MC
@ -278,7 +269,7 @@ en-MEEP:
wanted: wanted:
abbr: Weented abbr: Weented
description: You want this meepit description: You want this meepit
show: show:
rarity: Meepity rarity: Meepity
resources: resources:
@ -310,18 +301,16 @@ en-MEEP:
preview: preview:
header: Meepview header: Meepview
customize_more: Customize meep customize_more: Customize meep
requirements_not_met: requirements_not_met: Javascript and Flash are required to preview meepits. Meep!
Javascript and Flash are required to preview meepits. Meep!
not_found: not_found:
main_html: main_html: We've never meeped the %{item_name} on the %{color_name}
We've never meeped the %{item_name} on the %{color_name}
%{species_name} before. Have you? If so, please %{modeling_link} and %{species_name} before. Have you? If so, please %{modeling_link} and
we'll meep our datameep instantly. Meep! we'll meep our datameep instantly. Meep!
modeling_link_content: meep it for us modeling_link_content: meep it for us
contributors: contributors:
header: Meeped to you by header: Meeped to you by
footer: Meep! footer: Meep!
neopets_page_import_tasks: neopets_page_import_tasks:
create: create:
success: Page %{index} meeped! success: Page %{index} meeped!
@ -339,31 +328,28 @@ en-MEEP:
updated_hangers: updated_hangers:
one: We updated the quantity for 1 of your meepits. one: We updated the quantity for 1 of your meepits.
other: We updated the quantity for %{count} of your meepits. other: We updated the quantity for %{count} of your meepits.
no_changes: no_changes: We already had this data meeped to your account,
We already had this data meeped to your account,
so we didn't meep any changes. so we didn't meep any changes.
no_data: We didn't meep any wearables, so we didn't meep any changes. no_data: We didn't meep any wearables, so we didn't meep any changes.
unknown_items: unknown_items:
one: one: "We also meeped an item we didn't recognize: %{item_names}. Please
"We also meeped an item we didn't recognize: %{item_names}. Please
meep it for us and we'll update our database instantly. Thanks!" meep it for us and we'll update our database instantly. Thanks!"
other: other:
"We also meeped %{count} items we didn't recognize: %{item_names}. "We also meeped %{count} items we didn't recognize: %{item_names}.
Please meep them for us and we'll update our database instantly. Please meep them for us and we'll update our database instantly.
Thanks!" Thanks!"
next_page: next_page: Now the frame should contain page %{next_index}.
Now the frame should contain page %{next_index}.
Meep that source code over, too. Meep that source code over, too.
done: That was the last meepit of your Neopets %{name}. done: That was the last meepit of your Neopets %{name}.
parse_error: parse_error:
We had trouble meeping your source code. Is it a valid HTML document? We had trouble meeping your source code. Is it a valid HTML document?
Make sure you meeped the computery-looking result of clicking View Make sure you meeped the computery-looking result of clicking View
Frame Source, and not the pretty-looking page itself. Frame Source, and not the pretty-looking page itself.
names: names:
closet: meepit closet: meepit
safety_deposit: safety demeepit safety_deposit: safety demeepit
new: new:
title: Meeport from %{name}, Page %{index} title: Meeport from %{name}, Page %{index}
your_items_link: Back to Your Meeps your_items_link: Back to Your Meeps
@ -372,14 +358,12 @@ en-MEEP:
submit: Meep items submit: Meep items
help: help:
welcome: Welcome to the bulk %{name} meeporter! welcome: Welcome to the bulk %{name} meeporter!
intro: intro: We're going to meep it as easy as possible to meeport your
We're going to meep it as easy as possible to meeport your
Neopets.com %{name} data into your Dress to Impress meepit list. Neopets.com %{name} data into your Dress to Impress meepit list.
Here's how it meeps. Here's how it meeps.
check_frame: check_frame:
header: header:
main_html: main_html: Check the framed Neopets.com meep on the left,
Check the framed Neopets.com meep on the left,
meeping to %{page_link}. meeping to %{page_link}.
page_link_content: meep %{index} of your %{name} page_link_content: meep %{index} of your %{name}
check_login: check_login:
@ -397,8 +381,7 @@ en-MEEP:
It's never a good idea to meep in inside of a frame, unless It's never a good idea to meep in inside of a frame, unless
you're a web programmer pro who can meep that the frame does, you're a web programmer pro who can meep that the frame does,
in fact, meep to Neopets.com. To be safe, %{login_link}. in fact, meep to Neopets.com. To be safe, %{login_link}.
login_link_content: login_link_content: meep up another window, meep the URL, and meep in safely
meep up another window, meep the URL, and meep in safely
check_content: check_content:
summary: Meep that the page is, in fact, your %{name}. summary: Meep that the page is, in fact, your %{name}.
details: details:
@ -414,16 +397,14 @@ en-MEEP:
<strong>In Firefox</strong>, right-meep the frame, choose <strong>In Firefox</strong>, right-meep the frame, choose
<strong>This Frame</strong>, then <strong>View Frame <strong>This Frame</strong>, then <strong>View Frame
Source</strong>. Source</strong>.
other_html: other_html: In other meepits, right-meep and look for something similar.
In other meepits, right-meep and look for something similar.
troubleshooting: troubleshooting:
main_html: main_html:
If you're still having trouble, try %{page_link}, right-meeping, If you're still having trouble, try %{page_link}, right-meeping,
and meeping View Source. and meeping View Source.
page_link_content: meeping the page in a new window page_link_content: meeping the page in a new window
copy_source: copy_source:
header: header: Meeplight the entire source code,
Meeplight the entire source code,
and meepy-paste it into the box on the right. and meepy-paste it into the box on the right.
shortcuts: shortcuts:
"Some meepy shortcuts: Ctrl-A to select all the text, Ctrl-C to "Some meepy shortcuts: Ctrl-A to select all the text, Ctrl-C to
@ -435,19 +416,16 @@ en-MEEP:
and quantity of meepits in your %{name}, and add that to your Dress and quantity of meepits in your %{name}, and add that to your Dress
to Impress meepit list. I meep that it's all safe, but, if you're to Impress meepit list. I meep that it's all safe, but, if you're
concerned, find a meepit and meep out the source code to be sure. concerned, find a meepit and meep out the source code to be sure.
neopets_users: neopets_users:
create: create:
success: success:
zero: zero: Okay. We meeped %{user_name}'s pets, but already had these items
Okay. We meeped %{user_name}'s pets, but already had these items
meeped to your account. meeped to your account.
one: one: Success! We meeped %{user_name}'s pets, and meeped 1 item.
Success! We meeped %{user_name}'s pets, and meeped 1 item. other: Success! We meeped %{user_name}'s pets, and meeped %{count} items.
other:
Success! We meeped %{user_name}'s pets, and meeped %{count} items.
not_found: Could not meep user %{user_name}. Is it meeped correctly? not_found: Could not meep user %{user_name}. Is it meeped correctly?
new: new:
title: Meemport from pets title: Meemport from pets
your_items_link: Back to Your Meeps your_items_link: Back to Your Meeps
@ -456,11 +434,11 @@ en-MEEP:
from all your pets. It's meepy! from all your pets. It's meepy!
username_label: Meopets Username username_label: Meopets Username
submit: Meemport all pets submit: Meemport all pets
outfits: outfits:
destroy: destroy:
success: Outfit "%{outfit_name}" succeessfully demeeped. success: Outfit "%{outfit_name}" succeessfully demeeped.
edit: edit:
item: item:
controls: controls:
@ -471,8 +449,7 @@ en-MEEP:
add: Closeet add: Closeet
remove: Uncloseet remove: Uncloseet
pet_type: pet_type:
not_found: not_found: We haven't meeped that combination before. Have you?
We haven't meeped that combination before. Have you?
Meep the pet's name if you have! Meep the pet's name if you have!
form: form:
submit: Meep submit: Meep
@ -493,8 +470,7 @@ en-MEEP:
submit: Meep submit: Meep
cancel: Unmeep cancel: Unmeep
preview: preview:
requirements: requirements: Flash and Javascript (but not Java!) are required to meep outfeets.
Flash and Javascript (but not Java!) are required to meep outfeets.
big_picture: Big Meepit big_picture: Big Meepit
download: Downmeep download: Downmeep
mode: mode:
@ -527,11 +503,11 @@ en-MEEP:
We know how hard it can be to meep track of your ideas, We know how hard it can be to meep track of your ideas,
especially if you end up having a lot of them. especially if you end up having a lot of them.
**But Dress to Impress makes it meepy.** **But Dress to Impress makes it meepy.**
Once you have an idea for an outfit, you can **meep it, meep it, Once you have an idea for an outfit, you can **meep it, meep it,
and meep it again later**, either to update your design or and meep it again later**, either to update your design or
finally make your dream a reality. finally make your dream a reality.
**Thousands of users have already meeped tens of thousands of **Thousands of users have already meeped tens of thousands of
outfits. Will you be next?** outfits. Will you be next?**
sign_in: Log in to meep this outfit sign_in: Log in to meep this outfit
@ -589,23 +565,19 @@ en-MEEP:
login: Meep in to use these filters. login: Meep in to use these filters.
userbar: userbar:
session_message: session_message:
signed_in: signed_in: You will be meeped out, then brought back to this exact outfit.
You will be meeped out, then brought back to this exact outfit. not_signed_in: You will be meeped in, then brought back to this exact outfit.
not_signed_in:
You will be meeped in, then brought back to this exact outfit.
new: new:
tagline: Meeps made meepy! tagline: Meeps made meepy!
preview: preview:
pet_type_not_found: pet_type_not_found: We haven't meeped a %{color_name} %{species_name}. Meep?
We haven't meeped a %{color_name} %{species_name}. Meep?
pet_not_found: Pet not meeped. pet_not_found: Pet not meeped.
submit: submit:
primary: Meep my outfit! primary: Meep my outfit!
secondary: Meep secondary: Meep
neopia_online: load_pet: Enter your pet's meep
load_pet: Enter your pet's meep start_from_scratch: Or meep from scratch
start_from_scratch: Or meep from scratch
your_items: your_items:
tagline: Meep and meep! tagline: Meep and meep!
description: description:
@ -630,8 +602,7 @@ en-MEEP:
submit: meep submit: meep
latest_contribution: latest_contribution:
header: Contribumeeps header: Contribumeeps
description_html: description_html: "%{user_link} meeped us %{contributed_description}.
"%{user_link} meeped us %{contributed_description}.
Meep, %{user_link}!" Meep, %{user_link}!"
blog: blog:
link: OpenNeo Meep link: OpenNeo Meep
@ -644,9 +615,9 @@ en-MEEP:
other: Or meepy the %{color} %{species_list}? other: Or meepy the %{color} %{species_list}?
call_to_action: If so, please meep it above! Meep! call_to_action: If so, please meep it above! Meep!
species_list: species_list:
words_connector: '! ' words_connector: "! "
two_words_connector: ' meep ' two_words_connector: " meep "
last_word_connector: '! meep ' last_word_connector: "! meep "
modeled: modeled:
header: These items have already been meeped—meep for your help! header: These items have already been meeped—meep for your help!
body_title: You just finished meeping this—meep so much! body_title: You just finished meeping this—meep so much!
@ -660,22 +631,20 @@ en-MEEP:
error: Couldn't load. Meep again? error: Couldn't load. Meep again?
title: Meep %{pet} as a model, especially if they're meeping the %{item}! title: Meep %{pet} as a model, especially if they're meeping the %{item}!
pet_query: pet_query:
notice_html: notice_html: Thanks for meeping us <strong>%{pet_name}</strong>.
Thanks for meeping us <strong>%{pet_name}</strong>.
Meep up the good work! Meep up the good work!
outfit: outfit:
edit: eedit edit: eedit
delete: demeep delete: demeep
delete_confirmation: delete_confirmation: Are you sure you want to demeep the outfit %{outfit_name}?
Are you sure you want to demeep the outfit %{outfit_name}?
show: show:
default_outfit_name: Meeped outfit default_outfit_name: Meeped outfit
edit: Meep edit: Meep
clone: Meep a copy clone: Meep a copy
creation_summary_html: Meeped by %{user_link}, %{created_at_ago} ago creation_summary_html: Meeped by %{user_link}, %{created_at_ago} ago
pet_states: pet_states:
description: description:
main: "%{gender} %{mood}" main: "%{gender} %{mood}"
@ -689,7 +658,7 @@ en-MEEP:
glitched: "#!@?!?" glitched: "#!@?!?"
unconverted: Unconveeped unconverted: Unconveeped
unlabeled: Unleeped unlabeled: Unleeped
pets: pets:
bulk: bulk:
needed_items: needed_items:
@ -713,7 +682,7 @@ en-MEEP:
waiting: Weeting… waiting: Weeting…
loading: Leeding… loading: Leeding…
submission_success: "%{points} peeps" submission_success: "%{points} peeps"
load: load:
not_found: We couldn't meep a pet by that name. Is it meeped correctly? not_found: We couldn't meep a pet by that name. Is it meeped correctly?
asset_download_error: asset_download_error:
@ -722,17 +691,17 @@ en-MEEP:
pet_download_error: pet_download_error:
We couldn't meep to Neopets to meep up the pet. Maybe they're down. We couldn't meep to Neopets to meep up the pet. Maybe they're down.
Please try meep later! Please try meep later!
users: users:
index: index:
not_found: We don't have a meepit named %{name}. Is it meeped correctly? not_found: We don't have a meepit named %{name}. Is it meeped correctly?
top_contributors: top_contributors:
title: Top Conmeeputors title: Top Conmeeputors
rank: Reep rank: Reep
user: Meepit user: Meepit
points: Peeps points: Peeps
update: update:
success: Settings successfully meeped. success: Settings successfully meeped.
invalid: "Could not meep settings: %{errors}" invalid: "Could not meep settings: %{errors}"

View file

@ -663,20 +663,8 @@ en:
submit: submit:
primary: Plan my outfit! primary: Plan my outfit!
secondary: Go secondary: Go
neopia_online: load_pet: Enter your pet's name
load_pet: Enter your pet's name start_from_scratch: Or start from scratch
start_from_scratch: Or start from scratch
neopia_offline:
start_from_scratch: Choose a pet to get started
load_pet:
main_html: Or try your pet's name %{link}
link_content: (but it looks like Neopets.com is ignoring us)
load_pet:
legend: Enter your pet's name
submit: Plan my outfit!
start_from_scratch:
legend: Or start from scratch
submit: Go
your_items: your_items:
tagline: Track and trade! tagline: Track and trade!
description: Make lists of the items you own and want, description: Make lists of the items you own and want,
@ -718,16 +706,6 @@ en:
last_word_connector: ", or " last_word_connector: ", or "
modeled: modeled:
header: These items have already been modeled—thanks for your help! header: These items have already been modeled—thanks for your help!
body_title: You just finished modeling this—thanks so much!
neopets_usernames_form:
label: neopets username
submit: add
pet:
status:
success: Thanks! <3
unworn: Not wearing this item.
error: Couldn't load. Try again?
title: Submit %{pet} as a model, especially if they're wearing the %{item}!
pet_query: pet_query:
notice_html: Thanks for showing us <strong>%{pet_name}</strong>. notice_html: Thanks for showing us <strong>%{pet_name}</strong>.
Keep up the good work! Keep up the good work!
@ -797,7 +775,6 @@ en:
pet_download_error: pet_download_error:
We couldn't connect to Neopets to look up the pet. Maybe they're down. We couldn't connect to Neopets to look up the pet. Maybe they're down.
Please try again later! Please try again later!
neopia_error: 'We couldn''t load that pet: "%{message}". Try again later?'
swf_assets: swf_assets:
links: links:

View file

@ -468,9 +468,8 @@ es:
submit: submit:
primary: ¡Diseñar mi atuendo! primary: ¡Diseñar mi atuendo!
secondary: Ir secondary: Ir
neopia_online: load_pet: Escribe el nombre de tu pet
load_pet: Escribe el nombre de tu pet start_from_scratch: O empieza a partir de una plantilla
start_from_scratch: O empieza a partir de una plantilla
your_items: your_items:
tagline: ¡Añade e intercambia! tagline: ¡Añade e intercambia!
description: Crea listas de los objetos que tú tienes y quieres. ¡Compártelas con el mundo! description: Crea listas de los objetos que tú tienes y quieres. ¡Compártelas con el mundo!

View file

@ -466,9 +466,8 @@ pt:
submit: submit:
primary: Planeje minha roupa! primary: Planeje minha roupa!
secondary: Vai secondary: Vai
neopia_online: load_pet: Digite o nome do seu pet
load_pet: Digite o nome do seu pet start_from_scratch: Ou comece do zero
start_from_scratch: Ou comece do zero
your_items: your_items:
tagline: Acompanhe e troque! tagline: Acompanhe e troque!
description: Faça listas de itens que você tem e que procura, e compartilhe com o mundo. description: Faça listas de itens que você tem e que procura, e compartilhe com o mundo.