From 3078156dbbbb683481002cbc5db24bf6f5ea0836 Mon Sep 17 00:00:00 2001 From: Dan Hansen Date: Tue, 25 Jan 2011 21:42:26 -0600 Subject: [PATCH] javascript i18n wip --- app/controllers/localize_controller.rb | 13 ++++ app/helpers/localize_helper.rb | 8 +++ app/views/aspects/index.html.haml | 2 + config/assets.yml | 3 +- config/locales/diaspora/da.yml | 17 ++++++ config/locales/diaspora/de.yml | 17 ++++++ config/locales/diaspora/el.yml | 17 ++++++ config/locales/diaspora/en.yml | 2 + config/locales/diaspora/es.yml | 17 ++++++ config/locales/diaspora/fr.yml | 17 ++++++ config/locales/diaspora/he.yml | 17 ++++++ config/locales/diaspora/hu.yml | 17 ++++++ config/locales/diaspora/id.yml | 17 ++++++ config/locales/diaspora/it.yml | 17 ++++++ config/locales/diaspora/nl.yml | 17 ++++++ config/locales/diaspora/pt-PT.yml | 17 ++++++ config/locales/diaspora/ro.yml | 17 ++++++ config/locales/diaspora/sv.yml | 17 ++++++ config/routes.rb | 2 + public/javascripts/vendor/jquery.charcount.js | 58 ++++++++++++++++++ public/javascripts/widgets/i18n.js | 61 +++++++++++++++++++ public/javascripts/widgets/timeago.js | 41 +++++++++++++ 22 files changed, 410 insertions(+), 1 deletion(-) create mode 100644 app/controllers/localize_controller.rb create mode 100644 app/helpers/localize_helper.rb create mode 100644 public/javascripts/vendor/jquery.charcount.js create mode 100644 public/javascripts/widgets/i18n.js create mode 100644 public/javascripts/widgets/timeago.js diff --git a/app/controllers/localize_controller.rb b/app/controllers/localize_controller.rb new file mode 100644 index 000000000..29f07299f --- /dev/null +++ b/app/controllers/localize_controller.rb @@ -0,0 +1,13 @@ +class LocalizeController < ApplicationController + before_filter :authenticate_user! + + include LocalizeHelper + + def show + if current_user + render :json => localize current_user.language + else + redirect_to aspects_path + end + end +end \ No newline at end of file diff --git a/app/helpers/localize_helper.rb b/app/helpers/localize_helper.rb new file mode 100644 index 000000000..174c359ea --- /dev/null +++ b/app/helpers/localize_helper.rb @@ -0,0 +1,8 @@ +module LocalizeHelper + def localize language + yml_path = File.join(Rails.root, "config/locales/diaspora/", "#{language}.yml") + yaml = YAML::load IO.read(yml_path) + + yaml[language]["javascripts"] + end +end \ No newline at end of file diff --git a/app/views/aspects/index.html.haml b/app/views/aspects/index.html.haml index 835b179af..a68daec9e 100644 --- a/app/views/aspects/index.html.haml +++ b/app/views/aspects/index.html.haml @@ -5,6 +5,8 @@ - content_for :head do = include_javascripts :home + :javascript + Diaspora.widgets.i18n.loadLocale(#{localize(current_user.language).to_json}, "#{current_user.language}"); .span-15.append-2 = render 'aspects/no_contacts_message', :aspect => @aspect, :contact_count => @contacts.count diff --git a/config/assets.yml b/config/assets.yml index bc04d24e7..4536fc6d8 100644 --- a/config/assets.yml +++ b/config/assets.yml @@ -21,7 +21,8 @@ javascripts: - public/javascripts/diaspora.js - public/javascripts/widgets/alert.js - public/javascripts/widgets/embedder.js - + - public/javascripts/widgets/i18n.js + - public/javascripts/widgets/timeago.js mobile: - public/javascripts/vendor/jquery144.min.js - public/javascripts/custom-mobile-scripting.js diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml index 8d2e61d83..4499c1f2d 100644 --- a/config/locales/diaspora/da.yml +++ b/config/locales/diaspora/da.yml @@ -493,3 +493,20 @@ da: no_person_constructed: "Ingen person kunne konstrueres fra dette hcard." not_enabled: "det ser ikke ud til at webfinger er aktiveret på %{account}s domæne" xrd_fetch_failed: "der opstod en fejl i forbindelse med hentning af xrd fra kontoen %{account}" + javascripts: + timeago: + prefixAgo: "for" + prefixFromNow: "om" + suffixAgo: "siden" + suffixFromNow: "" + seconds: "mindre end et minut" + minute: "ca. et minut" + minutes: "%d minutter" + hour: "ca. en time" + hours: "ca. %d timer" + day: "en dag" + days: "%d dage" + month: "ca. en måned" + months: "%d måneder" + year: "ca. et år" + years: "%d år" diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml index 477ca13ab..e39bdd446 100644 --- a/config/locales/diaspora/de.yml +++ b/config/locales/diaspora/de.yml @@ -493,3 +493,20 @@ de: no_person_constructed: "Konnte keine Person aus dieser hcard erstellen." not_enabled: "Webfinger scheint nicht für den Server von %{account} verfügbar zu sein." xrd_fetch_failed: "Die XRD-Datei von %{account} konnte nicht heruntergeladen werden" + javascripts: + timeago: + prefixAgo: "vor" + prefixFromNow: "in" + suffixAgo: "" + suffixFromNow: "" + seconds: "wenigen Sekunden" + minute: "etwa einer Minute" + minutes: "%d Minuten" + hour: "etwa einer Stunde" + hours: "%d Stunden" + day: "etwa einem Tag" + days: "%d Tagen" + month: "etwa einem Monat" + months: "%d Monaten" + year: "etwa einem Jahr" + years: "%d Jahren" diff --git a/config/locales/diaspora/el.yml b/config/locales/diaspora/el.yml index 3ab4480e5..2b7a74681 100644 --- a/config/locales/diaspora/el.yml +++ b/config/locales/diaspora/el.yml @@ -493,3 +493,20 @@ el: no_person_constructed: "No person could be constructed from this hcard." not_enabled: "webfinger does not seem to be enabled for %{account}'s host" xrd_fetch_failed: "there was an error getting the xrd from account %{account}" + javascripts: + timeago: + prefixAgo: "πριν" + prefixFromNow: "σε" + suffixAgo: "" + suffixFromNow: "" + seconds: "λιγότερο από ένα λεπτό" + minute: "περίπου ένα λεπτό" + minutes: "%d λεπτά" + hour: "περίπου μία ώρα" + hours: "περίπου %d ώρες" + day: "μία μέρα" + days: "%d μέρες" + month: "περίπου ένα μήνα" + months: "%d μήνες" + year: "περίπου ένα χρόνο" + years: "%d χρόνια" diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 4ccc208b8..6c378144e 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -498,3 +498,5 @@ en: pagination: next: "Next" previous: "Previous" + javascripts: + confirm_dialog: "Are you sure?" diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml index 379c2dec5..e80f23647 100644 --- a/config/locales/diaspora/es.yml +++ b/config/locales/diaspora/es.yml @@ -493,3 +493,20 @@ es: no_person_constructed: "No person could be constructed from this hcard." not_enabled: "el webfinger parece no estar habilitado para el host de %{account}" xrd_fetch_failed: "hubo un error al recibir el xrd desde la cuenta %{account}" + javascripts: + timeago: + prefixAgo: "hace" + prefixFromNow: "dentro de" + suffixAgo: "" + suffixFromNow: "" + seconds: "menos de un minuto" + minute: "un minuto" + minutes: "unos %d minutos" + hour: "una hora" + hours: "%d horas" + day: "un día" + days: "%d días" + month: "un mes" + months: "%d meses" + year: "un año" + years: "%d años" diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml index 94c3a9027..50c34adae 100644 --- a/config/locales/diaspora/fr.yml +++ b/config/locales/diaspora/fr.yml @@ -493,3 +493,20 @@ fr: no_person_constructed: "Cette hcard semble être invalide." not_enabled: "webfinger ne semble pas être activé sur l'hôte de %{account}'s" xrd_fetch_failed: "une erreur est survenue lors de la récupération du xrd du compte %{account}" + javascripts: + timeago: + prefixAgo: "il y a" + prefixFromNow: "d'ici" + suffixAgo: "" + suffixFromNow: "" + seconds: "moins d'une minute" + minute: "environ une minute" + minutes: "environ %d minutes" + hour: "environ une heure" + hours: "environ %d heures" + day: "environ un jour" + days: "environ %d jours" + month: "environ un mois" + months: "environ %d mois" + year: "un an" + years: "%d ans" diff --git a/config/locales/diaspora/he.yml b/config/locales/diaspora/he.yml index 37e2c15da..bf5570764 100644 --- a/config/locales/diaspora/he.yml +++ b/config/locales/diaspora/he.yml @@ -493,3 +493,20 @@ he: no_person_constructed: "לא ניתן להרכיב איש קשר מ־hcard זה." not_enabled: "נראה כי webfinger אינו פעיל עבור המארח של %{account}" xrd_fetch_failed: "אירעה שגיאה בקבלת ה־xrd מהחשבון %{account}" + javascripts: + timeago: + prefixAgo: "לפני" + prefixFromNow: "מעכשיו" + suffixAgo: "" + suffixFromNow: "" + seconds: "פחות מדקה" + minute: "דקה" + minutes: "%d דקות" + hour: "שעה" + hours: "%d שעות" + day: "יום" + days: "%d ימים" + month: "חודש" + months: "%d חודשים" + year: "שנה" + years: "%d שנים" diff --git a/config/locales/diaspora/hu.yml b/config/locales/diaspora/hu.yml index b0ecfd8d8..496b4fa88 100644 --- a/config/locales/diaspora/hu.yml +++ b/config/locales/diaspora/hu.yml @@ -493,3 +493,20 @@ hu: no_person_constructed: "Ebből a hCard névjegyből nem lehet személyt létrehozni." not_enabled: "a webfinger nincs engedélyezve %{account} kiszolgálóján" xrd_fetch_failed: "%{account} fiókjából nem sikerült az XRD kiolvasása" + javascripts: + timeago: + prefixAgo: "" + prefixFromNow: "" + suffixAgo: "" + suffixFromNow: "" + seconds: "kevesebb mint egy perce" + minute: "körülbelül egy perce" + minutes: "%d perce" + hour: "körülbelül egy órája" + hours: "körülbelül %d órája" + day: "körülbelül egy napja" + days: "%d napja" + month: "körülbelül egy hónapja" + months: "%d hónapja" + year: "körülbelül egy éve" + years: "%d éve" diff --git a/config/locales/diaspora/id.yml b/config/locales/diaspora/id.yml index 52c5a9518..76a374d5b 100644 --- a/config/locales/diaspora/id.yml +++ b/config/locales/diaspora/id.yml @@ -493,3 +493,20 @@ id: no_person_constructed: "No person could be constructed from this hcard." not_enabled: "webfinger does not seem to be enabled for %{account}'s host" xrd_fetch_failed: "there was an error getting the xrd from account %{account}" + javascripts: + timeago: + prefixAgo: "" + prefixFromNow: "" + suffixAgo: "yang lalu" + suffixFromNow: "dari sekarang" + seconds: "kurang dari semenit" + minute: "sekitar satu menit" + minutes: "%d menit" + hour: "sekitar sejam" + hours: "sekitar %d jam" + day: "sehari" + days: "%d hari" + month: "sekitar sebulan" + months: "%d tahun" + year: "sekitar setahun" + years: "%d tahun" diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml index b0a29fe3a..00bb1b9a2 100644 --- a/config/locales/diaspora/it.yml +++ b/config/locales/diaspora/it.yml @@ -493,3 +493,20 @@ it: no_person_constructed: "Questa hcard non contiene i dati di una persona." not_enabled: "webfinger non attivo sull'host di %{account}" xrd_fetch_failed: "impossibile recuperare il xrd dall'account %{account}" + javascripts: + timeago: + prefixAgo: "" + prefixFromNow: "" + suffixAgo: "fa" + suffixFromNow: "da ora" + seconds: "meno di un minuto" + minute: "circa un minuto" + minutes: "%d minuti" + hour: "circa un'ora" + hours: "circa %d ore" + day: "un giorno" + days: "%d giorni" + month: "circa un mese" + months: "%d mesi" + year: "circa un anno" + years: "%d anni" diff --git a/config/locales/diaspora/nl.yml b/config/locales/diaspora/nl.yml index 1dab5f1f4..4e176ef08 100644 --- a/config/locales/diaspora/nl.yml +++ b/config/locales/diaspora/nl.yml @@ -493,3 +493,20 @@ nl: no_person_constructed: "Er kon geen persoon worden gemaakt van deze hcard." not_enabled: "webfinger lijkt niet aan te staan voor %{account}'s provider" xrd_fetch_failed: "er was een probleem bij het verkrijgen van de xrd van het account %{account}" + javascript: + timeago: + prefixAgo: "" + prefixFromNow: "" + suffixAgo: "geleden" + suffixFromNow: "vanaf nu" + seconds: "iets minder dan een minute" + minute: "ongeveer een minuut" + minutes: "%d minuten" + hour: "ongeveer een uur" + hours: "ongeveer %d uren" + day: "een dag" + days: "%d dagen" + month: "ongeveer een maand" + months: "%d maanden" + year: "ongeveer een jaar" + years: "%d jaar" diff --git a/config/locales/diaspora/pt-PT.yml b/config/locales/diaspora/pt-PT.yml index 08509007c..54a589f31 100644 --- a/config/locales/diaspora/pt-PT.yml +++ b/config/locales/diaspora/pt-PT.yml @@ -493,3 +493,20 @@ pt-PT: no_person_constructed: "No person could be constructed from this hcard." not_enabled: "webfinger does not seem to be enabled for %{account}'s host" xrd_fetch_failed: "there was an error getting the xrd from account %{account}" + javascripts: + timeago: + prefixAgo: "" + prefixFromNow: "" + suffixAgo: "atrás" + suffixFromNow: "a partir de agora" + seconds: "menos de um minuto" + minute: "cerca de um minuto" + minutes: "%d minutos" + hour: "cerca de uma hora" + hours: "cerca de %d horas" + day: "um dia" + days: "%d dias" + month: "cerca de um mês" + months: "%d meses" + year: "cerca de um ano" + years: "%d anos" diff --git a/config/locales/diaspora/ro.yml b/config/locales/diaspora/ro.yml index 636b2630f..2f4d3636b 100644 --- a/config/locales/diaspora/ro.yml +++ b/config/locales/diaspora/ro.yml @@ -493,3 +493,20 @@ ro: no_person_constructed: "No person could be constructed from this hcard." not_enabled: "webfinger does not seem to be enabled for %{account}'s host" xrd_fetch_failed: "there was an error getting the xrd from account %{account}" + javascripts: + timeago: + prefixAgo: "acum" + prefixFromNow: "in timp de" + suffixAgo: "" + suffixFromNow: "" + seconds: "mai putin de un minut" + minute: "un minut" + minutes: "%d minute" + hour: "o ora" + hours: "%d ore" + day: "o zi" + days: "%d zile" + month: "o luna" + months: "%d luni" + year: "un an" + years: "%d ani" diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml index 817f9a8f9..bffa94683 100644 --- a/config/locales/diaspora/sv.yml +++ b/config/locales/diaspora/sv.yml @@ -493,3 +493,20 @@ sv: no_person_constructed: "Den här personen kunde inte hittas (hcard-fel)." not_enabled: "Webfinger verkar inte vara påslaget på %{account}'s server" xrd_fetch_failed: "kunde inte hämta xrd-fil från kontot %{account}" + javascripts: + timeago: + prefixAgo: "för" + prefixFromNow: "om" + suffixAgo: "sedan" + suffixFromNow: "" + seconds: "mindre än en minut" + minute: "ungefär en minut" + minutes: "%d minuter" + hour: "ungefär en timme" + hours: "ungefär %d timmar" + day: "en dag" + days: "%d dagar" + month: "ungefär en månad" + months: "%d månader" + year: "ungefär ett år" + years: "%d år" diff --git a/config/routes.rb b/config/routes.rb index 27c4ae00c..33373d58f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -56,6 +56,8 @@ Diaspora::Application.routes.draw do match 'receive/users/:guid', :to => 'publics#receive' match 'hub', :to => 'publics#hub' + match 'localize', :to => "localize#show" + #root root :to => 'home#show' end diff --git a/public/javascripts/vendor/jquery.charcount.js b/public/javascripts/vendor/jquery.charcount.js new file mode 100644 index 000000000..67d1442d4 --- /dev/null +++ b/public/javascripts/vendor/jquery.charcount.js @@ -0,0 +1,58 @@ +/* + * Character Count Plugin - jQuery plugin + * Dynamic character count for text areas and input fields + * written by Alen Grakalic + * http://cssglobe.com/post/7161/jquery-plugin-simplest-twitterlike-dynamic-character-count-for-textareas + * + * Copyright (c) 2009 Alen Grakalic (http://cssglobe.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * Built for jQuery library + * http://jquery.com + * + */ + +(function($) { + + $.fn.charCount = function(options){ + + // default configuration properties + var defaults = { + allowed: 140, + warning: 25, + css: 'counter', + counterElement: 'span', + cssWarning: 'warning', + cssExceeded: 'exceeded', + counterText: '' + }; + + var options = $.extend(defaults, options); + + function calculate(obj){ + var count = $(obj).val().length; + var available = options.allowed - count; + if(available <= options.warning && available >= 0){ + $(obj).next().addClass(options.cssWarning); + } else { + $(obj).next().removeClass(options.cssWarning); + } + if(available < 0){ + $(obj).next().addClass(options.cssExceeded); + } else { + $(obj).next().removeClass(options.cssExceeded); + } + $(obj).next().html(options.counterText + available); + }; + + this.each(function() { + $(this).after('<'+ options.counterElement +' class="' + options.css + '">'+ options.counterText +''); + calculate(this); + $(this).keyup(function(){calculate(this)}); + $(this).change(function(){calculate(this)}); + }); + + }; + +})(jQuery); diff --git a/public/javascripts/widgets/i18n.js b/public/javascripts/widgets/i18n.js new file mode 100644 index 000000000..755b539b4 --- /dev/null +++ b/public/javascripts/widgets/i18n.js @@ -0,0 +1,61 @@ +/** + * Created by . + * User: dan + * Date: Jan 25, 2011 + * Time: 5:18:32 PM + * To change this template use File | Settings | File Templates. + */ +Diaspora.widgets.add("i18n", function() { + this.start = $.noop; + + this.callbacks = []; + this.language = undefined; + this.locale = undefined; + this.ready = false; + + this.loadLocale = function(locale, language) { + this.ready = true; + this.language = language; + + if(typeof locale !== "undefined") { + this.locale = locale; + this.triggerCallbacks(); + return; + } + + if(!this.locale) { + function setLocale(data) { + this.locale = $.parseJSON(data); + this.triggerCallbacks(); + } + + $.getJSON("/localize", setLocale); + } + }; + + this.triggerCallbacks = function() { + for(var i = 0; i < this.callbacks.length; i++) { + this.callbacks[i](); + } + }; + + this.onLocaleLoaded = function(callback) { + if(this.ready) { + callback(); + return; + } + + this.callbacks.push(callback); + }; + + this.t = function(item, views) { + var ret, + _item = item.split("."); + + while(part = _item.shift()) { + ret = (ret) ? ret[part] : this.locale[part]; + } + + return $.mustache(ret, views || {}); + }; +}); \ No newline at end of file diff --git a/public/javascripts/widgets/timeago.js b/public/javascripts/widgets/timeago.js new file mode 100644 index 000000000..1926c7d4c --- /dev/null +++ b/public/javascripts/widgets/timeago.js @@ -0,0 +1,41 @@ +/** + * Created by . + * User: dan + * Date: Jan 25, 2011 + * Time: 8:49:02 PM + * To change this template use File | Settings | File Templates. + */ +Diaspora.widgets.add("timeago", function() { + this.start = function() { + Diaspora.widgets.i18n.onLocaleLoaded(function() { + + if(Diaspora.widgets.i18n.language === "en") { + return; + } + + jQuery.timeago.settings.strings = { + prefixAgo: Diaspora.widgets.i18n.t("timeago.prefixAgo"), + prefixFromNow: Diaspora.widgets.i18n.t("timeago.prefixFromNow"), + suffixAgo: Diaspora.widgets.i18n.t("timeago.suffixAgo"), + suffixFromNow: Diaspora.widgets.i18n.t("timeago.suffixFromNow"), + seconds: Diaspora.widgets.i18n.t("timeago.seconds"), + minute: Diaspora.widgets.i18n.t("timeago.minute"), + minutes: Diaspora.widgets.i18n.t("timeago.minutes"), + hour: Diaspora.widgets.i18n.t("timeago.hour"), + hours: Diaspora.widgets.i18n.t("timeago.hours"), + day: Diaspora.widgets.i18n.t("timeago.day"), + days: Diaspora.widgets.i18n.t("timeago.days"), + month: Diaspora.widgets.i18n.t("timeago.month"), + months: Diaspora.widgets.i18n.t("timeago.months"), + year: Diaspora.widgets.i18n.t("timeago.year"), + years: Diaspora.widgets.i18n.t("timeago.years") + }; + + Diaspora.widgets.timeago.updateTimeAgo("abbr"); + }); + }; + + this.updateTimeAgo = function(selector) { + $(selector).timeago(); + }; +}); \ No newline at end of file