diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 017491ce..da969f84 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -105,7 +105,10 @@ module ApplicationHelper current_locale_is_public = false options = I18n.public_locales.map do |available_locale| current_locale_is_public = true if I18n.locale == available_locale - [translate('locale_name', :locale => available_locale), available_locale] + # Include fallbacks data on the tag. Right now it's used in blog + # localization, but may conceivably be used for something else later. + [translate('locale_name', :locale => available_locale), available_locale, + {'data-fallbacks' => I18n.fallbacks[available_locale].join(',')}] end unless current_locale_is_public diff --git a/public/javascripts/outfits/new.js b/public/javascripts/outfits/new.js index 4a1f29fb..05cef1a8 100644 --- a/public/javascripts/outfits/new.js +++ b/public/javascripts/outfits/new.js @@ -169,11 +169,42 @@ $(function () { body += '…'; }*/ el.find('h2').text(header).wrapInner($('', {href: url})); - el.find('div').html(body); + var contentEl = el.find('div'); + contentEl.html(body); $('', {'id': 'blog-preview-comments', href: url + '#disqus_thread'}).appendTo(el); if(image) { el.find('img').attr('src', image).parent().attr('href', url); } + + // Localize + var localizedBodies = {}; + contentEl.find('.locale').each(function () { + var localizedBody = $(this); + var locale = localizedBody.attr('class').match(/locale-(\S+)/)[1]; + localizedBodies[locale] = localizedBody; + }); + + var fallbacks = $('#locale option:selected').attr('data-fallbacks').split(','); + var bestLocale = null; + for(var i = 0; i < fallbacks.length; i++) { + if(localizedBodies.hasOwnProperty(fallbacks[i])) { + bestLocale = fallbacks[i]; + break; + } + } + + if(bestLocale) { + // I feel bad doing all this in JS rather than CSS, but sometimes you + // gotta do what you gotta do if you wanna support any number of locales. + for(var locale in localizedBodies) { + localizedBodies[locale].hide(); + } + + localizedBodies[bestLocale].show(); + + contentEl.find('.no-locale').hide(); + } + el.fadeIn('medium'); addDisqusCount(); });