diff --git a/app/views/templates/stream_faces.jst b/app/views/templates/stream_faces.jst
new file mode 100644
index 000000000..fb59576c4
--- /dev/null
+++ b/app/views/templates/stream_faces.jst
@@ -0,0 +1,5 @@
+<% _.each(people, function(person) { %>
+
+
+
+<% }) %>
diff --git a/config/assets.yml b/config/assets.yml
index 7417168a0..c9a543c7d 100644
--- a/config/assets.yml
+++ b/config/assets.yml
@@ -3,23 +3,32 @@ embed_assets: datauri
compress_assets: on
gzip_assets: off
javascripts:
- flash_socket:
- - public/javascripts/vendor/FABridge.js
- - public/javascripts/vendor/swfobject.js
- - public/javascripts/vendor/web_socket.js
jquery:
- - public/javascripts/vendor/jquery162.min.js
+ - public/javascripts/vendor/jquery-1.7.1.min.js
+
main:
+ - public/javascripts/vendor/underscore.js
+ - public/javascripts/vendor/backbone.js
+
+ - public/javascripts/vendor/markdown.js
+
+ - public/javascripts/app/app.js
+ - public/javascripts/app/router.js
+ - public/javascripts/app/views.js
+ - public/javascripts/app/models/post.js
+ - public/javascripts/app/models/*
+ - public/javascripts/app/collections/*
+ - public/javascripts/app/views/stream_object_view.js
+ - public/javascripts/app/views/*
+
- public/javascripts/rails.validations.js
- public/javascripts/rails.js
- public/javascripts/vendor/jquery.hotkeys.js
- public/javascripts/vendor/jquery.autoresize.min.js
- public/javascripts/vendor/jquery-ui-1.8.9.custom.min.js
- public/javascripts/vendor/jquery.charcount.js
- - public/javascripts/vendor/jquery-debounce.js
- public/javascripts/vendor/jquery.expander.js
- public/javascripts/vendor/timeago.js
- - public/javascripts/vendor/Mustache.js
- public/javascripts/vendor/facebox.js
- public/javascripts/jquery.infinitescroll-custom.js
- public/javascripts/jquery.autocomplete-custom.js
@@ -33,8 +42,6 @@ javascripts:
- public/javascripts/widgets/*.js
- public/javascripts/view.js
- - public/javascripts/stream.js
- - public/javascripts/content-updater.js
- public/javascripts/aspects-dropdown.js
- public/javascripts/contact-edit.js
- public/javascripts/contact-list.js
@@ -46,11 +53,12 @@ javascripts:
login:
- public/javascripts/login.js
mobile:
+ - public/javascripts/vendor/jquery-1.7.1.min.js
- public/javascripts/vendor/jquery.charcount.js
- public/javascripts/rails.js # we only include this to hijack ajax requests
- public/javascripts/vendor/mbp-helper.js
- public/javascripts/mobile.js
-
+
mailchimp:
- public/javascripts/vendor/mailchimp/jquery.form.js
- public/javascripts/vendor/mailchimp/jquery.validate.js
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index 2512a3dd1..8c22e3ae1 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -881,9 +881,6 @@ en:
no_applications: "You haven't registered any applications yet."
streams:
- recently: "recently:"
- commented_on: "commented on"
- posted: "posted"
community_spotlight_stream: "Community Spotlight"
aspects_stream: "Aspects"
mentioned_stream: "@Mentions"
diff --git a/config/locales/javascript/javascript.ar.yml b/config/locales/javascript/javascript.ar.yml
index 128bd5db8..4d8e64c25 100644
--- a/config/locales/javascript/javascript.ar.yml
+++ b/config/locales/javascript/javascript.ar.yml
@@ -10,11 +10,11 @@ ar:
add_to_aspect: "أضف مراسلا"
all_aspects: "جميع الفئات"
toggle:
- few: "في {{count}} فئات"
- many: "في {{count}} فئات"
- one: "في {{count}} فئة"
- other: "في {{count}} فئات"
- two: "في {{count}} فئات"
+ few: "في <%= count %> فئات"
+ many: "في <%= count %> فئات"
+ one: "في <%= count %> فئة"
+ other: "في <%= count %> فئات"
+ two: "في <%= count %> فئات"
zero: "حدّد الفئات"
comments:
hide: "أخفِ التعليقات"
@@ -32,7 +32,7 @@ ar:
public: "عام - مشاركتك ستكون متاحة للجميع ومفهرسة في محركات البحث"
reshares:
duplicate: "رائع، أليس كذلك؟ أعدت نشر هذه المشاركة مسبقا"
- search_for: "إبحث عن {{name}}"
+ search_for: "إبحث عن <%= name %>"
show_more: المزيد
timeago:
day: "منذ يوم"
@@ -51,6 +51,6 @@ ar:
years: "منذ %d أعوام"
videos:
unknown: "نوع فيديو غير معروف"
- watch: "شاهد هذا الفيديو عبر {{provider}}"
+ watch: "شاهد هذا الفيديو عبر <%= provider %>"
web_sockets:
disconnected: "الـ websocket مغلق; الرسائل لن تنشر بعد الآن"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.bg.yml b/config/locales/javascript/javascript.bg.yml
index 03fdb2e24..a7acd3b52 100644
--- a/config/locales/javascript/javascript.bg.yml
+++ b/config/locales/javascript/javascript.bg.yml
@@ -9,16 +9,16 @@ bg:
aspect_dropdown:
add_to_aspect: "Избиране на аспект(и)"
all_aspects: "Във всеки аспект"
- error: "Не е възможно започване на споделяне с {{name}}. Вероятно ги игнорирате?"
+ error: "Не е възможно започване на споделяне с <%= name %>. Вероятно ги игнорирате?"
select_aspects: "Избиране на аспект(и)"
- started_sharing_with: "Започнахте да споделяте с {{name}}!"
- stopped_sharing_with: "Престанахте да споделяте с {{name}}."
+ started_sharing_with: "Започнахте да споделяте с <%= name %>!"
+ stopped_sharing_with: "Престанахте да споделяте с <%= name %>."
toggle:
- few: "В {{count}} аспекта"
- many: "В {{count}} аспекта"
- one: "В {{count}} аспект"
- other: "В {{count}} аспекта"
- two: "В {{count}} аспекта"
+ few: "В <%= count %> аспекта"
+ many: "В <%= count %> аспекта"
+ one: "В <%= count %> аспект"
+ other: "В <%= count %> аспекта"
+ two: "В <%= count %> аспекта"
zero: "Избиране на аспект(и)"
aspect_navigation:
deselect_all: Никой
@@ -32,7 +32,7 @@ bg:
failed_to_post_message: "Съобщението не бе публикувано!"
getting_started:
alright_ill_wait: "Добре, ще изчакам."
- hey: "Здравейте, {{name}}!"
+ hey: "Здравейте, <%= name %>!"
no_tags: "Не следите нито една марка! Желаете ли да продължите въпреки това?"
preparing_your_stream: "Вашият персонализиран поток се подготвя..."
infinite_scroll:
@@ -45,10 +45,10 @@ bg:
public: "Публично - публикацията ще бъде видима за всеки, а съдържанието ѝ ще бъде налично за търсещите машини"
reshares:
duplicate: "Вече сте споделили публикацията!"
- search_for: "Търсене за {{name}}"
+ search_for: "Търсене за <%= name %>"
show_more: "покажи още"
tags:
- wasnt_that_interesting: "Е, вероятно марката #{{tagName}} не е чак толкова интересна..."
+ wasnt_that_interesting: "Е, вероятно марката #<%= tagName %> не е чак толкова интересна..."
timeago:
day: ден
days: "%d дни"
@@ -67,4 +67,4 @@ bg:
years: "%d години"
videos:
unknown: "Неизвестен вид видео"
- watch: "Гледайте видеото в {{provider}}"
\ No newline at end of file
+ watch: "Гледайте видеото в <%= provider %>"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.br.yml b/config/locales/javascript/javascript.br.yml
index 10d75a891..96b5713b3 100644
--- a/config/locales/javascript/javascript.br.yml
+++ b/config/locales/javascript/javascript.br.yml
@@ -9,11 +9,11 @@ br:
aspect_dropdown:
add_to_aspect: "Add to aspect"
toggle:
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- one: "In {{count}} aspect"
- other: "In {{count}} aspects"
- two: "In {{count}} aspects"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspects"
+ two: "In <%= count %> aspects"
zero: "Add to aspect"
confirm_dialog: "Emaoc'h sur?"
getting_started:
@@ -22,7 +22,7 @@ br:
at_least_one_aspect: "Dav eo deoc'h embann un arvez da'n nebeutañ"
reshares:
duplicate: "You've already reshared that post!"
- search_for: "Klask war-lerc'h {{name}}"
+ search_for: "Klask war-lerc'h <%= name %>"
timeago:
day: "un devezh"
days: "%d a zevezhioù"
@@ -39,4 +39,4 @@ br:
years: "%d a vloavezhioù"
videos:
unknown: "Stumm ar video dianav"
- watch: "Sellet ouzh ar video gant {{provider}}"
\ No newline at end of file
+ watch: "Sellet ouzh ar video gant <%= provider %>"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ca.yml b/config/locales/javascript/javascript.ca.yml
index 557a1742f..0ed15e8c0 100644
--- a/config/locales/javascript/javascript.ca.yml
+++ b/config/locales/javascript/javascript.ca.yml
@@ -26,9 +26,9 @@ ca:
year: "aproximadament un any"
years: "%d anys"
videos:
- watch: "Visualitza aquest video a {{provider}}"
+ watch: "Visualitza aquest video a <%= provider %>"
unknown: "El tipus de vídeo és desconegut"
- search_for: "Cerca per {{name}}"
+ search_for: "Cerca per <%= name %>"
publisher:
at_least_one_aspect: "Heu de publicar en almenys un aspecte."
limited: "Limitat - la vostra publicació només serà visible per a la gent amb qui esteu compartint"
@@ -41,16 +41,16 @@ ca:
add_to_aspect: "Afegeix el contacte"
select_aspects: "Selecciona els aspectes"
all_aspects: "Tots els aspectes"
- stopped_sharing_with: "Heu deixat de compartir amb {{name}}."
- started_sharing_with: "Heu començat a compartir amb {{name}}!"
- error: "No s'ha pogut començar a compartir amb {{name}}. L'esteu ignorant?"
+ stopped_sharing_with: "Heu deixat de compartir amb <%= name %>."
+ started_sharing_with: "Heu començat a compartir amb <%= name %>!"
+ error: "No s'ha pogut començar a compartir amb <%= name %>. L'esteu ignorant?"
toggle:
zero: "Selecciona els aspectes"
- one: "En {{count}} aspecte"
- two: "En {{count}} aspectes"
- few: "En {{count}} aspectes"
- many: "En {{count}} aspectes"
- other: "En {{count}} aspectes"
+ one: "En <%= count %> aspecte"
+ two: "En <%= count %> aspectes"
+ few: "En <%= count %> aspectes"
+ many: "En <%= count %> aspectes"
+ other: "En <%= count %> aspectes"
show_more: "mostra'n més"
failed_to_like: "No s'ha pogut comunicar que us agrada!"
failed_to_post_message: "No s'ha pogut publicar el missatge!"
@@ -64,11 +64,11 @@ ca:
deselect_all: "Desselecciona'ls tots"
no_aspects: "No heu seleccionat cap aspecte"
getting_started:
- hey: "Ei, {{name}}!"
+ hey: "Ei, <%= name %>!"
no_tags: "Ei, no heu seguit cap etiqueta! Voleu continuar igualment?"
alright_ill_wait: "D'acord, m'esperaré."
preparing_your_stream: "S'està preparant el vostre flux personalitzat…"
photo_uploader:
looking_good: "Vaja, teniu un aspecte fantàstic!"
tags:
- wasnt_that_interesting: "D'acord, es possible que #{{tagName}} no fos tan interessant…"
+ wasnt_that_interesting: "D'acord, es possible que #<%= tagName %> no fos tan interessant…"
diff --git a/config/locales/javascript/javascript.cs.yml b/config/locales/javascript/javascript.cs.yml
index f0e6d13dd..be84c1d24 100644
--- a/config/locales/javascript/javascript.cs.yml
+++ b/config/locales/javascript/javascript.cs.yml
@@ -10,11 +10,11 @@ cs:
add_to_aspect: "Přidat kontakt"
all_aspects: "Všechny aspekty"
toggle:
- few: "Ve {{count}} aspektech"
- many: "V {{count}} aspektech"
- one: "V {{count}} aspektu"
- other: "Ve {{count}} aspektech"
- two: "Ve {{count}} aspektech"
+ few: "Ve <%= count %> aspektech"
+ many: "V <%= count %> aspektech"
+ one: "V <%= count %> aspektu"
+ other: "Ve <%= count %> aspektech"
+ two: "Ve <%= count %> aspektech"
zero: "Vybrat aspekty"
comments:
hide: "skrýt komentáře"
@@ -32,7 +32,7 @@ cs:
public: "Veřejné - váši zprávu si bude moci přečíst kdokoliv a může být nalezena vyhledávači"
reshares:
duplicate: "Tato zprávu už sdílíte!"
- search_for: "Hledat {{name}}"
+ search_for: "Hledat <%= name %>"
show_more: "zobrazit více"
timeago:
day: "1 dnem"
@@ -51,6 +51,6 @@ cs:
years: "%d roky"
videos:
unknown: "Neznámý typ videa"
- watch: "Podívejte se na tohle video na {{provider}}"
+ watch: "Podívejte se na tohle video na <%= provider %>"
web_sockets:
disconnected: "Websocket je uzavřen, příspěvky již nebude možno sledovat živě."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.cy.yml b/config/locales/javascript/javascript.cy.yml
index d87c543c0..ade007522 100644
--- a/config/locales/javascript/javascript.cy.yml
+++ b/config/locales/javascript/javascript.cy.yml
@@ -10,14 +10,14 @@ cy:
add_to_aspect: "Ychwanegu cysylltiad"
all_aspects: "Agweddau i gŷd"
select_aspects: "Dewis agweddau"
- started_sharing_with: "Rydych chi'n rhannu gyda {{name}}!"
- stopped_sharing_with: "Dydych chi ddim yn rhannu nawr gyda {{name}}."
+ started_sharing_with: "Rydych chi'n rhannu gyda <%= name %>!"
+ stopped_sharing_with: "Dydych chi ddim yn rhannu nawr gyda <%= name %>."
toggle:
- few: "Mewn {{count}} agweddau"
- many: "Mewn {{count}} agweddau"
- one: "Mewn {{count}} agwedd"
- other: "Mewn {{count}} agweddau"
- two: "Mewn {{count}} agweddau"
+ few: "Mewn <%= count %> agweddau"
+ many: "Mewn <%= count %> agweddau"
+ one: "Mewn <%= count %> agwedd"
+ other: "Mewn <%= count %> agweddau"
+ two: "Mewn <%= count %> agweddau"
zero: "Dewiswch agweddau"
aspect_navigation:
deselect_all: "Dad-ddewis i gŷd"
@@ -31,7 +31,7 @@ cy:
failed_to_post_message: "Methwyd i bostio neges!"
getting_started:
alright_ill_wait: "O'r gorau - 'dwi'n aros..."
- hey: "Hei, {{name}}!"
+ hey: "Hei, <%= name %>!"
no_tags: "Hei, dydych chi ddim yn dilyn unrhyw tagiau! Dal ymlaen beth bynnag?"
preparing_your_stream: "Preparing your personalised stream..."
infinite_scroll:
@@ -40,10 +40,10 @@ cy:
looking_good: "OMG, rydych chi'n ymddangos yn neis iawn!"
reshares:
duplicate: "Mae hynny'n dda, eh? Rydych chi wedi rhannu'r bost eisoes!"
- search_for: "Chwilio am {{name}}"
+ search_for: "Chwilio am <%= name %>"
show_more: "dangos mwy"
tags:
- wasnt_that_interesting: "OK, mae'n debyg nid yw #{{tagName}} yn ddiddorol iawn..."
+ wasnt_that_interesting: "OK, mae'n debyg nid yw #<%= tagName %> yn ddiddorol iawn..."
timeago:
day: diwrnod
days: "%d diwrnod"
@@ -60,4 +60,4 @@ cy:
years: "%d blyddynoedd"
videos:
unknown: "Math o fideo anhysbys"
- watch: "Gwyliwch y fideo ar {{provider}}"
\ No newline at end of file
+ watch: "Gwyliwch y fideo ar <%= provider %>"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.da.yml b/config/locales/javascript/javascript.da.yml
index 210158891..8635c15cf 100644
--- a/config/locales/javascript/javascript.da.yml
+++ b/config/locales/javascript/javascript.da.yml
@@ -9,16 +9,16 @@ da:
aspect_dropdown:
add_to_aspect: "Tilføj kontakt"
all_aspects: "Alle aspekter"
- error: "Kunne ikke begynde at dele med {{name}}. Ignorerer du vedkommende?"
+ error: "Kunne ikke begynde at dele med <%= name %>. Ignorerer du vedkommende?"
select_aspects: "Vælg aspekter"
- started_sharing_with: "Du er begyndt at dele med {{name}}!"
- stopped_sharing_with: "Du deler ikke længere med {{name}}."
+ started_sharing_with: "Du er begyndt at dele med <%= name %>!"
+ stopped_sharing_with: "Du deler ikke længere med <%= name %>."
toggle:
- few: "I {{count}} aspekter"
- many: "I {{count}} aspekter"
- one: "I {{count}} aspekt"
- other: "I {{count}} aspekter"
- two: "I {{count}} aspekter"
+ few: "I <%= count %> aspekter"
+ many: "I <%= count %> aspekter"
+ one: "I <%= count %> aspekt"
+ other: "I <%= count %> aspekter"
+ two: "I <%= count %> aspekter"
zero: "Vælg aspekter"
aspect_navigation:
deselect_all: "Fravælg alle"
@@ -32,7 +32,7 @@ da:
failed_to_post_message: "Kunne ikke indsende besked!"
getting_started:
alright_ill_wait: "Okay, jeg venter."
- hey: "Hej {{name}}!"
+ hey: "Hej <%= name %>!"
no_tags: "Du har ikke fulgt nogen tags! Vil du fortsætte alligevel?"
preparing_your_stream: "Forbereder din personlige strøm..."
infinite_scroll:
@@ -45,10 +45,10 @@ da:
public: "Offentlig - dit indlæg vil være synligt for alle og kan findes af søgemaskiner"
reshares:
duplicate: "Du har allerede delt indlægget!"
- search_for: "Søg efter {{name}}"
+ search_for: "Søg efter <%= name %>"
show_more: "Vis mere"
tags:
- wasnt_that_interesting: "OK, jeg formoder #{{tagName}} ikke var så spændende igen..."
+ wasnt_that_interesting: "OK, jeg formoder #<%= tagName %> ikke var så spændende igen..."
timeago:
day: "en dag"
days: "%d dage"
@@ -67,6 +67,6 @@ da:
years: "%d år"
videos:
unknown: "Ukendt videotype"
- watch: "Se denne video på {{provider}}"
+ watch: "Se denne video på <%= provider %>"
web_sockets:
disconnected: "Forbindelse er lukket; indlæg vil ikke længere blive opdateret live."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.de.yml b/config/locales/javascript/javascript.de.yml
index f0073f290..d0592c474 100644
--- a/config/locales/javascript/javascript.de.yml
+++ b/config/locales/javascript/javascript.de.yml
@@ -9,16 +9,16 @@ de:
aspect_dropdown:
add_to_aspect: "Kontakt hinzufügen"
all_aspects: "Alle Aspekte"
- error: "Konnte nicht anfangen, mit {{name}} zu teilen. Ignorierst du sie/ihn?"
+ error: "Konnte nicht anfangen, mit <%= name %> zu teilen. Ignorierst du sie/ihn?"
select_aspects: "Wähle Aspekte aus"
- started_sharing_with: "Du hast angefangen, mit {{name}} zu teilen!"
- stopped_sharing_with: "Du hast aufgehört, mit {{name}} zu teilen!"
+ started_sharing_with: "Du hast angefangen, mit <%= name %> zu teilen!"
+ stopped_sharing_with: "Du hast aufgehört, mit <%= name %> zu teilen!"
toggle:
- few: "In {{count}} Aspekten"
- many: "In {{count}} Aspekten"
+ few: "In <%= count %> Aspekten"
+ many: "In <%= count %> Aspekten"
one: "In einem Aspekt"
- other: "In {{count}} Aspekten"
- two: "In {{count}} Aspekten"
+ other: "In <%= count %> Aspekten"
+ two: "In <%= count %> Aspekten"
zero: "Aspekt auswählen"
aspect_navigation:
deselect_all: "Auswahl aufheben"
@@ -44,10 +44,10 @@ de:
public: "Öffentlich - dein Beitrag ist für alle sichtbar und kann von Suchmaschinen gefunden werden"
reshares:
duplicate: "Du hast diesen Beitrag bereits weitergesagt!"
- search_for: "Nach {{name}} suchen"
+ search_for: "Nach <%= name %> suchen"
show_more: "Mehr zeigen"
tags:
- wasnt_that_interesting: "OK, ich nehme an, #{{tagName}} war nicht so interessant..."
+ wasnt_that_interesting: "OK, ich nehme an, #<%= tagName %> war nicht so interessant..."
timeago:
day: "einem Tag"
days: "%d Tagen"
@@ -66,6 +66,6 @@ de:
years: "%d Jahren"
videos:
unknown: "Unbekanntes Videoformat"
- watch: "Dieses Video auf {{provider}} ansehen"
+ watch: "Dieses Video auf <%= provider %> ansehen"
web_sockets:
disconnected: "Der Websocket ist geschlossen. Beiträge werden nicht länger in Echtzeit aktualisiert."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.de_formal.yml b/config/locales/javascript/javascript.de_formal.yml
index 0afa35458..02ef14c90 100644
--- a/config/locales/javascript/javascript.de_formal.yml
+++ b/config/locales/javascript/javascript.de_formal.yml
@@ -10,14 +10,14 @@ de_formal:
add_to_aspect: "Kontakt hinzufügen"
all_aspects: "Alle Aspekte"
select_aspects: "Wählen Sie Aspekte aus"
- started_sharing_with: "Sie haben angefangen, mit {{name}} zu teilen!"
- stopped_sharing_with: "Sie haben aufgehört, mit {{name}} zu teilen!"
+ started_sharing_with: "Sie haben angefangen, mit <%= name %> zu teilen!"
+ stopped_sharing_with: "Sie haben aufgehört, mit <%= name %> zu teilen!"
toggle:
- few: "In {{count}} Aspekten"
- many: "In {{count}} Aspekten"
+ few: "In <%= count %> Aspekten"
+ many: "In <%= count %> Aspekten"
one: "In einem Aspekt"
- other: "In {{count}} Aspekten"
- two: "In {{count}} Aspekten"
+ other: "In <%= count %> Aspekten"
+ two: "In <%= count %> Aspekten"
zero: "Aspekt auswählen"
aspect_navigation:
deselect_all: "Auswahl aufheben"
@@ -43,10 +43,10 @@ de_formal:
public: "Öffentlich - Ihr Beitrag ist für alle sichtbar und kann von Suchmaschinen gefunden werden"
reshares:
duplicate: "Sie haben diesen Beitrag bereits weitergesagt!"
- search_for: "Nach {{name}} suchen"
+ search_for: "Nach <%= name %> suchen"
show_more: "Mehr zeigen"
tags:
- wasnt_that_interesting: "OK, ich nehme an, #{{tagName}} war nicht so interessant..."
+ wasnt_that_interesting: "OK, ich nehme an, #<%= tagName %> war nicht so interessant..."
timeago:
day: "einem Tag"
days: "%d Tagen"
@@ -65,6 +65,6 @@ de_formal:
years: "%d Jahren"
videos:
unknown: "Unbekanntes Videoformat"
- watch: "Dieses Video auf {{provider}} ansehen"
+ watch: "Dieses Video auf <%= provider %> ansehen"
web_sockets:
disconnected: "Der Websocket ist geschlossen. Beiträge werden nicht länger in Echtzeit aktualisiert."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.el.yml b/config/locales/javascript/javascript.el.yml
index 23ffffa7f..93f59f64e 100644
--- a/config/locales/javascript/javascript.el.yml
+++ b/config/locales/javascript/javascript.el.yml
@@ -9,16 +9,16 @@ el:
aspect_dropdown:
add_to_aspect: "Προσθήκη επαφής"
all_aspects: "Όλες οι πτυχές"
- error: "Δεν μπορεί να ξεκινήσει ο διαμοιρασμός με το χρήστη {{name}}. Μήπως τον αγνοείτε;"
+ error: "Δεν μπορεί να ξεκινήσει ο διαμοιρασμός με το χρήστη <%= name %>. Μήπως τον αγνοείτε;"
select_aspects: "Επιλογή πτυχών"
- started_sharing_with: "Ξεκινήσατε να διαμοιράζεστε με τον χρήστη {{name}}!"
- stopped_sharing_with: "Σταματήσατε να διαμοιράζεστε με τον χρήστη {{name}}."
+ started_sharing_with: "Ξεκινήσατε να διαμοιράζεστε με τον χρήστη <%= name %>!"
+ stopped_sharing_with: "Σταματήσατε να διαμοιράζεστε με τον χρήστη <%= name %>."
toggle:
- few: "Σε {{count}} πτυχές"
- many: "Σε {{count}} πτυχές"
- one: "Σε {{count}} πτυχή"
- other: "Σε {{count}} πτυχές"
- two: "Σε {{count}} πτυχές"
+ few: "Σε <%= count %> πτυχές"
+ many: "Σε <%= count %> πτυχές"
+ one: "Σε <%= count %> πτυχή"
+ other: "Σε <%= count %> πτυχές"
+ two: "Σε <%= count %> πτυχές"
zero: "Επιλέξτε πτυχές"
aspect_navigation:
deselect_all: "Εξαίρεση όλων"
@@ -32,7 +32,7 @@ el:
failed_to_post_message: "Αποτυχία δημοσίευσης μηνύματος!"
getting_started:
alright_ill_wait: "Εντάξει, θα περιμένω."
- hey: "Γεια σου, {{name}}!"
+ hey: "Γεια σου, <%= name %>!"
no_tags: "Γεια, δεν ακολουθείς ακόμα καμία ετικέτα! Συνεχίζουμε παρ' όλ' αυτά;"
preparing_your_stream: "Ετοιμάζεται η προσωπική σας ροή..."
infinite_scroll:
@@ -45,10 +45,10 @@ el:
public: "Δημόσιο - οι δημοσιεύσεις σας θα είναι ορατές στον καθένα και θα μπορούν να βρεθούν από τις μηχανές αναζήτησης."
reshares:
duplicate: "Αυτό είναι τόσο καλό ε; Έχετε ήδη κοινοποιήσει αυτή τη δημοσίευση!"
- search_for: "Αναζήτηση για {{name}}"
+ search_for: "Αναζήτηση για <%= name %>"
show_more: "Προβολή περισσότερων"
tags:
- wasnt_that_interesting: "OK, φαντάζομαι πως το #{{tagName}} δεν ήταν και τόσο ενδιαφέρον τελικά..."
+ wasnt_that_interesting: "OK, φαντάζομαι πως το #<%= tagName %> δεν ήταν και τόσο ενδιαφέρον τελικά..."
timeago:
day: "μία μέρα"
days: "%d μέρες"
@@ -65,6 +65,6 @@ el:
years: "%d χρόνια"
videos:
unknown: "Άγνωστος τύπος βίντεο"
- watch: "Δείτε το βίντεο στο {{provider}}"
+ watch: "Δείτε το βίντεο στο <%= provider %>"
web_sockets:
disconnected: "Το websocket είναι κλειστό: οι δημοσιεύσεις δεν θα αναμεταδίδονται ζωντανά πλέον."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index 3497eba47..ebf27c377 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -6,6 +6,8 @@
en:
javascripts:
confirm_dialog: "Are you sure?"
+ delete: "Delete"
+ ignore: "Ignore"
timeago:
prefixAgo: ""
prefixFromNow: ""
@@ -23,31 +25,28 @@ en:
year: "about a year"
years: "%d years"
videos:
- watch: "Watch this video on {{provider}}"
+ watch: "Watch this video on <%= provider %>"
unknown: "Unknown video type"
- search_for: "Search for {{name}}"
+ search_for: "Search for <%= name %>"
publisher:
at_least_one_aspect: "You must publish to at least one aspect"
limited: "Limited - your post will only be seen by people you are sharing with"
public: "Public - your post will be visible to everyone and found by search engines"
infinite_scroll:
no_more: "No more posts."
- web_sockets:
- disconnected: "The websocket is closed; posts will no longer be streamed live."
aspect_dropdown:
add_to_aspect: "Add contact"
select_aspects: "Select aspects"
all_aspects: "All aspects"
- stopped_sharing_with: "You have stopped sharing with {{name}}."
- started_sharing_with: "You have started sharing with {{name}}!"
- error: "Couldn't start sharing with {{name}}. Are you ignoring them?"
+ stopped_sharing_with: "You have stopped sharing with <%= name %>."
+ started_sharing_with: "You have started sharing with <%= name %>!"
+ error: "Couldn't start sharing with <%= name %>. Are you ignoring them?"
toggle:
zero: "Select aspects"
- one: "In {{count}} aspect"
- two: "In {{count}} aspects"
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- other: "In {{count}} aspects"
+ one: "In <%= count %> aspect"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ other: "In <%= count %> aspects"
show_more: "show more"
failed_to_like: "Failed to like!"
failed_to_post_message: "Failed to post message!"
@@ -61,11 +60,61 @@ en:
deselect_all: "Deselect all"
no_aspects: "No aspects selected"
getting_started:
- hey: "Hey, {{name}}!"
+ hey: "Hey, <%= name %>!"
no_tags: "Hey, you haven't followed any tags! Continue anyway?"
alright_ill_wait: "Alright, I'll wait."
preparing_your_stream: "Preparing your personalized stream..."
photo_uploader:
looking_good: "OMG, you look awesome!"
tags:
- wasnt_that_interesting: "OK, I suppose #{{tagName}} wasn't all that interesting..."
+ wasnt_that_interesting: "OK, I suppose #<%= tagName %> wasn't all that interesting..."
+
+ stream:
+ hide: "Hide"
+ public: "Public"
+ limited: "Limited"
+ like: "Like"
+ unlike: "Unlike"
+ reshare: "Reshare"
+ comment: "Comment"
+ original_post_deleted: "Original post deleted by author."
+ nsfw: "This post has been flagged NSFW by its author."
+ show: "Show"
+
+ likes:
+ zero: "<%= count %> Likes"
+ one: "<%= count %> Like"
+ few: "<%= count %> Likes"
+ many: "<%= count %> Likes"
+ other: "<%= count %> Likes"
+
+ reshares:
+ zero: "<%= count %> Reshares"
+ one: "<%= count %> Reshare"
+ few: "<%= count %> Reshares"
+ many: "<%= count %> Reshares"
+ other: "<%= count %> Reshares"
+
+ more_comments:
+ zero: "Show <%= count %> more comments"
+ one: "Show <%= count %> more comment"
+ few: "Show <%= count %> more comments"
+ many: "Show <%= count %> more comments"
+ other: "Show <%= count %> more comments"
+
+ header:
+ home: "Home"
+ profile: "Profile"
+ contacts: "Contacts"
+ settings: "Settings"
+ log_out: "Log out"
+
+ notifications: "Notifications"
+ messages: "Messages"
+
+ search: "Find people or #tags"
+
+ recent_notifications: "Recent Notifications"
+ mark_all_as_read: "Mark all as read"
+ view_all: "View all"
+
diff --git a/config/locales/javascript/javascript.en_1337.yml b/config/locales/javascript/javascript.en_1337.yml
index 4d31fd9c5..bf6906149 100644
--- a/config/locales/javascript/javascript.en_1337.yml
+++ b/config/locales/javascript/javascript.en_1337.yml
@@ -10,11 +10,11 @@ en_1337:
add_to_aspect: "4DD N00B"
all_aspects: "4LL 45P3C75"
toggle:
- few: "1N {{count}} 45P3C75"
- many: "1N {{count}} 45P3C75"
- one: "1N {{count}} 45P3C7"
- other: "1N {{count}} 45P3C75"
- two: "1N {{count}} 45P3C75"
+ few: "1N <%= count %> 45P3C75"
+ many: "1N <%= count %> 45P3C75"
+ one: "1N <%= count %> 45P3C7"
+ other: "1N <%= count %> 45P3C75"
+ two: "1N <%= count %> 45P3C75"
zero: "4DD N00B"
aspect_navigation:
deselect_all: "D353L3C7 4LL"
@@ -36,7 +36,7 @@ en_1337:
public: "PUBL1C - Y0UR 5P4M W1LL B3 V151BL3 2 3V3RY0N3 4ND F0UND BY S34RCH 3NG1N35!"
reshares:
duplicate: "U H4V3 4LR34DY R35P4MM3D 7HI5!"
- search_for: "S34RCH F0R {{name}}"
+ search_for: "S34RCH F0R <%= name %>"
show_more: "5H0W M0R3!"
timeago:
day: "4 D4Y"
@@ -54,6 +54,6 @@ en_1337:
years: "%d Y34R5"
videos:
unknown: "UNK0WN V1D30 7YP3"
- watch: "W47CH 7H15 V1D30 0N {{provider}}"
+ watch: "W47CH 7H15 V1D30 0N <%= provider %>"
web_sockets:
disconnected: D15C0NN3C73D!
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.en_pirate.yml b/config/locales/javascript/javascript.en_pirate.yml
index 6d8198ead..e8a4c117a 100644
--- a/config/locales/javascript/javascript.en_pirate.yml
+++ b/config/locales/javascript/javascript.en_pirate.yml
@@ -9,11 +9,11 @@ en_pirate:
aspect_dropdown:
add_to_aspect: "Add to aspect"
toggle:
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- one: "In {{count}} aspect"
- other: "In {{count}} aspects"
- two: "In {{count}} aspects"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspects"
+ two: "In <%= count %> aspects"
zero: "Add to aspect"
getting_started:
preparing_your_stream: "Preparing your personialized stream..."
diff --git a/config/locales/javascript/javascript.en_shaw.yml b/config/locales/javascript/javascript.en_shaw.yml
index ee5af1508..3106e50e6 100644
--- a/config/locales/javascript/javascript.en_shaw.yml
+++ b/config/locales/javascript/javascript.en_shaw.yml
@@ -9,11 +9,11 @@ en_shaw:
aspect_dropdown:
add_to_aspect: "𐑨𐑛 𐑑 𐑨𐑕𐑐𐑧𐑒𐑑"
toggle:
- few: "𐑦𐑯 {{count}} 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
- many: "𐑦𐑯 {{count}} 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
- one: "𐑦𐑯 {{count}} 𐑨𐑕𐑐𐑧𐑒𐑑"
- other: "𐑦𐑯 {{count}} 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
- two: "In {{count}} aspects"
+ few: "𐑦𐑯 <%= count %> 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
+ many: "𐑦𐑯 <%= count %> 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
+ one: "𐑦𐑯 <%= count %> 𐑨𐑕𐑐𐑧𐑒𐑑"
+ other: "𐑦𐑯 <%= count %> 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
+ two: "In <%= count %> aspects"
zero: "𐑨𐑛 𐑑 𐑨𐑕𐑐𐑧𐑒𐑑"
comments:
hide: "𐑣𐑲𐑛 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
@@ -29,7 +29,7 @@ en_shaw:
at_least_one_aspect: "𐑿 𐑥𐑳𐑕𐑑 𐑐𐑳𐑚𐑤𐑦𐑖 𐑑 𐑨𐑑 𐑤𐑰𐑕𐑑 𐑢𐑳𐑯 𐑨𐑕𐑐𐑧𐑒𐑑"
reshares:
duplicate: "𐑿𐑝 𐑷𐑤𐑮𐑧𐑛𐑦 𐑮𐑦𐑖𐑺𐑛 𐑞𐑨𐑑 𐑐𐑴𐑕𐑑!"
- search_for: "𐑕𐑻𐑗 𐑓𐑹 {{name}}"
+ search_for: "𐑕𐑻𐑗 𐑓𐑹 <%= name %>"
show_more: "𐑖𐑴 𐑥𐑹"
timeago:
day: "𐑩 𐑛𐑱"
@@ -49,6 +49,6 @@ en_shaw:
years: "%d 𐑘𐑽𐑟"
videos:
unknown: "𐑩𐑯𐑯𐑴𐑯 𐑝𐑦𐑛𐑦𐑴 𐑑𐑲𐑐"
- watch: "𐑢𐑷𐑗 𐑞𐑦𐑕 𐑝𐑦𐑛𐑦𐑴 𐑪𐑯 {{provider}}"
+ watch: "𐑢𐑷𐑗 𐑞𐑦𐑕 𐑝𐑦𐑛𐑦𐑴 𐑪𐑯 <%= provider %>"
web_sockets:
disconnected: "𐑞 𐑢𐑧𐑚𐑕𐑪𐑒𐑩𐑑 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛; 𐑐𐑴𐑕𐑑𐑕 𐑢𐑦𐑤 𐑯𐑴 𐑤𐑪𐑙𐑜𐑼 𐑚𐑰 𐑕𐑑𐑮𐑰𐑥𐑛 𐑤𐑲𐑝."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.eo.yml b/config/locales/javascript/javascript.eo.yml
index 37b8f493b..548a1e084 100644
--- a/config/locales/javascript/javascript.eo.yml
+++ b/config/locales/javascript/javascript.eo.yml
@@ -9,16 +9,16 @@ eo:
aspect_dropdown:
add_to_aspect: "Aldoni kontakton"
all_aspects: "Ĉiuj aspektoj"
- error: "Ne estis eble komunigi kun {{name}}. Ĉu vi ignoras ilin?"
+ error: "Ne estis eble komunigi kun <%= name %>. Ĉu vi ignoras ilin?"
select_aspects: "Elekti aspektojn"
- started_sharing_with: "Vi komencis komunigi kun {{name}}!"
- stopped_sharing_with: "Vi ĉesis komunigi kun {{name}}."
+ started_sharing_with: "Vi komencis komunigi kun <%= name %>!"
+ stopped_sharing_with: "Vi ĉesis komunigi kun <%= name %>."
toggle:
- few: "En {{count}} aspektoj"
- many: "En {{count}} aspektoj"
- one: "En {{count}} aspekto"
- other: "En {{count}} aspektoj"
- two: "En {{count}} aspektoj"
+ few: "En <%= count %> aspektoj"
+ many: "En <%= count %> aspektoj"
+ one: "En <%= count %> aspekto"
+ other: "En <%= count %> aspektoj"
+ two: "En <%= count %> aspektoj"
zero: "Elekti aspektojn"
aspect_navigation:
deselect_all: "Malselekti ĉiujn"
@@ -32,7 +32,7 @@ eo:
failed_to_post_message: "Ne povis afiŝi mesaĝon!"
getting_started:
alright_ill_wait: "En ordo, mi atendos."
- hey: "Hej, {{name}}!"
+ hey: "Hej, <%= name %>!"
no_tags: "Hej, vi ne sekvas iun etikedon! Ĉu tamen daŭrigi?"
preparing_your_stream: "Preparante vian personan torenton..."
infinite_scroll:
@@ -45,10 +45,10 @@ eo:
public: "Publika - via afiŝo vidoteblos de ĉiuj kaj trovotos de retserĉaplikaĵoj."
reshares:
duplicate: "Nu, ĉu tiel bone? Vi jam rekonigis tiun afiŝon!"
- search_for: "Serĉi por {{name}}"
+ search_for: "Serĉi por <%= name %>"
show_more: "vidi plu"
tags:
- wasnt_that_interesting: "Nu, mi supozas, ke #{{tagName}} ne estis tiel interese..."
+ wasnt_that_interesting: "Nu, mi supozas, ke #<%= tagName %> ne estis tiel interese..."
timeago:
day: "unu tago"
days: "%d tagoj"
@@ -67,6 +67,6 @@ eo:
years: "%d jaroj"
videos:
unknown: "nekonata tipo de videaĵo"
- watch: "Vidi tiun ĉi videon je {{provider}}"
+ watch: "Vidi tiun ĉi videon je <%= provider %>"
web_sockets:
disconnected: "La reta kontaktoskatolo estas fermita; afiŝoj ne plu rekte fluos."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.es-AR.yml b/config/locales/javascript/javascript.es-AR.yml
index fcb5960bd..b14bbf066 100644
--- a/config/locales/javascript/javascript.es-AR.yml
+++ b/config/locales/javascript/javascript.es-AR.yml
@@ -9,16 +9,16 @@ es-AR:
aspect_dropdown:
add_to_aspect: "Agregar contacto"
all_aspects: "Todos los aspectos"
- error: "No se pudo empezar a compartir con {{name}}. ¿Será que lo/a estás ignorando?"
+ error: "No se pudo empezar a compartir con <%= name %>. ¿Será que lo/a estás ignorando?"
select_aspects: "Selecciona aspectos"
- started_sharing_with: "Empezaste a compartir con {{name}}!"
- stopped_sharing_with: "Dejaste de compartir con {{name}}."
+ started_sharing_with: "Empezaste a compartir con <%= name %>!"
+ stopped_sharing_with: "Dejaste de compartir con <%= name %>."
toggle:
- few: "En {{count}} aspectos"
- many: "En {{count}} aspectos"
- one: "En {{count}} aspecto"
- other: "En {{count}} aspectos"
- two: "En {{count}} aspectos"
+ few: "En <%= count %> aspectos"
+ many: "En <%= count %> aspectos"
+ one: "En <%= count %> aspecto"
+ other: "En <%= count %> aspectos"
+ two: "En <%= count %> aspectos"
zero: "Seleccionar aspectos"
aspect_navigation:
deselect_all: "De-seleccionar todo"
@@ -32,7 +32,7 @@ es-AR:
failed_to_post_message: "¡No pudo publicarse el mensaje!"
getting_started:
alright_ill_wait: "Todo bien, voy a esperar."
- hey: "Che, {{name}}!"
+ hey: "Che, <%= name %>!"
no_tags: "¡Che, no estás siguiendo ningún tag! ¿Continuar de todos modos?"
preparing_your_stream: "Preparando tu stream personalizado..."
infinite_scroll:
@@ -45,10 +45,10 @@ es-AR:
public: "Publica - tu publicación sera visible para cualquiera y los buscadores podrán encontrarla"
reshares:
duplicate: "¿Te gustó eh? ¡Ya habías compartido esa publicación!"
- search_for: "Buscar a {{name}}"
+ search_for: "Buscar a <%= name %>"
show_more: "mostrar más"
tags:
- wasnt_that_interesting: "OK, supongamos que #{{tagName}} no era tan interesante..."
+ wasnt_that_interesting: "OK, supongamos que #<%= tagName %> no era tan interesante..."
timeago:
day: "un día"
days: "%d días"
@@ -67,6 +67,6 @@ es-AR:
years: "%d años"
videos:
unknown: "Tipo de video desconocido"
- watch: "Ver este video en {{provider}}"
+ watch: "Ver este video en <%= provider %>"
web_sockets:
disconnected: "La conexión WebSocket está cerrada; las publicaciones ya no serán transmitidas en vivo."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.es.yml b/config/locales/javascript/javascript.es.yml
index b1dd2b595..98af3ccb4 100644
--- a/config/locales/javascript/javascript.es.yml
+++ b/config/locales/javascript/javascript.es.yml
@@ -9,16 +9,16 @@ es:
aspect_dropdown:
add_to_aspect: "Añadir contacto"
all_aspects: "Todos los aspectos"
- error: "No podría empezar a compartir con {{name}}. ¿Vas a ignonarl@?"
+ error: "No podría empezar a compartir con <%= name %>. ¿Vas a ignonarl@?"
select_aspects: "Elige los aspectos"
- started_sharing_with: "¡Ahora sigues los mensajes públicos de {{name}}!"
- stopped_sharing_with: "Ya no compartes más con {{name}}."
+ started_sharing_with: "¡Ahora sigues los mensajes públicos de <%= name %>!"
+ stopped_sharing_with: "Ya no compartes más con <%= name %>."
toggle:
- few: "En {{count}} aspectos"
- many: "En {{count}} aspectos"
- one: "En {{count}} aspecto"
- other: "En {{count}} aspectos"
- two: "En {{count}} aspectos"
+ few: "En <%= count %> aspectos"
+ many: "En <%= count %> aspectos"
+ one: "En <%= count %> aspecto"
+ other: "En <%= count %> aspectos"
+ two: "En <%= count %> aspectos"
zero: "Elige los aspectos"
aspect_navigation:
deselect_all: "Desmarcar todos"
@@ -32,7 +32,7 @@ es:
failed_to_post_message: "¡Fallo al publicar el mensaje!"
getting_started:
alright_ill_wait: "Está bien, esperaré."
- hey: "¡Hola, {{name}}!"
+ hey: "¡Hola, <%= name %>!"
no_tags: "¡Eih, aún no sigues ninguna etiqueta! ¿Quieres continuar de todas formas?"
preparing_your_stream: "Preparando tus novedades personalizadas..."
infinite_scroll:
@@ -45,10 +45,10 @@ es:
public: "Público - tu publicación es visible para todos, incluyendo buscadores"
reshares:
duplicate: "Que bien, ¿eh? ¡Has compartido esa publicación!"
- search_for: "Buscar a {{name}}"
+ search_for: "Buscar a <%= name %>"
show_more: "mostrar más"
tags:
- wasnt_that_interesting: "OK, supongo que #{{tagName}} no era tan interesante..."
+ wasnt_that_interesting: "OK, supongo que #<%= tagName %> no era tan interesante..."
timeago:
day: "1 día"
days: "%d días"
@@ -67,6 +67,6 @@ es:
years: "%d años"
videos:
unknown: "Tipo de video desconocido"
- watch: "Ver este video con {{provider}}"
+ watch: "Ver este video con <%= provider %>"
web_sockets:
disconnected: "El canal está cerrado; las publicaciones no serán actualizadas al momento."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.eu.yml b/config/locales/javascript/javascript.eu.yml
index 651a264ee..fd50b02c8 100644
--- a/config/locales/javascript/javascript.eu.yml
+++ b/config/locales/javascript/javascript.eu.yml
@@ -10,14 +10,14 @@ eu:
add_to_aspect: "Adiskidea gehitu"
all_aspects: "Alderdi guztiak"
select_aspects: "Alderdiak aukeratu"
- started_sharing_with: "{{name}}(r)ekin harremanetan hasi zara!"
- stopped_sharing_with: "Jada ez zaude {{name}}(r)ekin harremanetan."
+ started_sharing_with: "<%= name %>(r)ekin harremanetan hasi zara!"
+ stopped_sharing_with: "Jada ez zaude <%= name %>(r)ekin harremanetan."
toggle:
- few: "{{count}} alderdietan"
- many: "{{count}} alderdietan"
- one: "Alderdi {{count}}ean"
- other: "{{count}} alderdietan"
- two: "{{count}} alderditan"
+ few: "<%= count %> alderdietan"
+ many: "<%= count %> alderdietan"
+ one: "Alderdi <%= count %>ean"
+ other: "<%= count %> alderdietan"
+ two: "<%= count %> alderditan"
zero: "Alderdial hautatu"
aspect_navigation:
deselect_all: "Guztiak deshautatu"
@@ -31,7 +31,7 @@ eu:
failed_to_post_message: "Huts egin du mezuaren bidalketak!"
getting_started:
alright_ill_wait: "Beno, itxarongo dut."
- hey: "Aizu, {{name}}!"
+ hey: "Aizu, <%= name %>!"
no_tags: "Aizu, ez duzu etiketarik jarraitzen! Jarraitu hala ere?"
preparing_your_stream: "Zure kronologia pertsonalizatua prestatzen..."
infinite_scroll:
@@ -44,10 +44,10 @@ eu:
public: "Publikoa - zure mezua edonork ikusi ahalko du, bai eta bilaketa zerbitzuetan agertu ere"
reshares:
duplicate: "Oso ona, e? Dagoeneko birpartekatu duzu mezu hori!"
- search_for: "Bilatu {{name}}"
+ search_for: "Bilatu <%= name %>"
show_more: "erakutsi gehiago"
tags:
- wasnt_that_interesting: "Beno, suposatzen dut #{{tagName}} ez zela oso interesgarria..."
+ wasnt_that_interesting: "Beno, suposatzen dut #<%= tagName %> ez zela oso interesgarria..."
timeago:
day: "egun bat"
days: "%d egun"
@@ -65,6 +65,6 @@ eu:
years: "%d urte"
videos:
unknown: "Bideo mota ezezaguna"
- watch: "Ikusi bideo hau {{provider}}(e)n"
+ watch: "Ikusi bideo hau <%= provider %>(e)n"
web_sockets:
disconnected: "Websocketa itxita dago; mezuak ez dira denbora errealean azalduko."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.fi.yml b/config/locales/javascript/javascript.fi.yml
index 635399e3a..465fe9450 100644
--- a/config/locales/javascript/javascript.fi.yml
+++ b/config/locales/javascript/javascript.fi.yml
@@ -9,16 +9,16 @@ fi:
aspect_dropdown:
add_to_aspect: "Lisää kontakti"
all_aspects: "Kaikki näkymät"
- error: "Ei voitu aloittaa jakamaan käyttäjän {{name}} kanssa. Oletko sivuuttanut hänet?"
+ error: "Ei voitu aloittaa jakamaan käyttäjän <%= name %> kanssa. Oletko sivuuttanut hänet?"
select_aspects: "Valitse näkymät"
- started_sharing_with: "Olet alkanut jakaa käyttäjän {{name}} kanssa!"
- stopped_sharing_with: "Olet lopettanut jakamisen käyttäjän {{name}} kanssa."
+ started_sharing_with: "Olet alkanut jakaa käyttäjän <%= name %> kanssa!"
+ stopped_sharing_with: "Olet lopettanut jakamisen käyttäjän <%= name %> kanssa."
toggle:
- few: "{{count}} näkymässä"
- many: "{{count}} näkymässä"
- one: "{{count}} näkymässä"
- other: "{{count}} näkymässä"
- two: "{{count}} näkymässä"
+ few: "<%= count %> näkymässä"
+ many: "<%= count %> näkymässä"
+ one: "<%= count %> näkymässä"
+ other: "<%= count %> näkymässä"
+ two: "<%= count %> näkymässä"
zero: "Valitse näkymät"
aspect_navigation:
deselect_all: "Poista valinnat"
@@ -32,7 +32,7 @@ fi:
failed_to_post_message: "Viestin lähetys epäonnistui!"
getting_started:
alright_ill_wait: "Okei, minä odotan."
- hey: "Hei {{name}}!"
+ hey: "Hei <%= name %>!"
no_tags: "Hei, et seuraa yhtäkään tagia! Jatketaanko silti?"
preparing_your_stream: "Yksilöllistä virtaasi valmistellaan..."
infinite_scroll:
@@ -45,10 +45,10 @@ fi:
public: "Julkinen - viestisi näkyvät kaikille mukaan lukien hakukoneet ja niiden tulokset"
reshares:
duplicate: "Olet jo uudelleenjakanut viesti!"
- search_for: "Etsi nimellä {{name}}"
+ search_for: "Etsi nimellä <%= name %>"
show_more: "näytä lisää"
tags:
- wasnt_that_interesting: "OK, #{{tagName}} ei tainnut ollakaan kovin kiinnostava aihe..."
+ wasnt_that_interesting: "OK, #<%= tagName %> ei tainnut ollakaan kovin kiinnostava aihe..."
timeago:
day: päivä
days: "%d päivää"
@@ -65,6 +65,6 @@ fi:
years: "%d vuotta"
videos:
unknown: "Tuntematon videomuoto"
- watch: "Katso video {{provider}} :ssa"
+ watch: "Katso video <%= provider %> :ssa"
web_sockets:
disconnected: "Yhteys on suljettu; viestejä ei enää esitetä reaaliaikaisesti."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.fr.yml b/config/locales/javascript/javascript.fr.yml
index 89eb0cb5c..27b5c074d 100644
--- a/config/locales/javascript/javascript.fr.yml
+++ b/config/locales/javascript/javascript.fr.yml
@@ -9,16 +9,16 @@ fr:
aspect_dropdown:
add_to_aspect: "Ajouter le contact"
all_aspects: "Tous les aspects"
- error: "Impossible de partager avec {{name}}. Ignorez-vous cette personne ?"
+ error: "Impossible de partager avec <%= name %>. Ignorez-vous cette personne ?"
select_aspects: "Choisir les aspects"
- started_sharing_with: "Vous avez commencé à partager avec {{name}} !"
- stopped_sharing_with: "Vous avez arrêté de partager avec {{name}}."
+ started_sharing_with: "Vous avez commencé à partager avec <%= name %> !"
+ stopped_sharing_with: "Vous avez arrêté de partager avec <%= name %>."
toggle:
- few: "Dans {{count}} aspects"
- many: "Dans {{count}} aspects"
- one: "Dans {{count}} aspect"
- other: "Dans {{count}} aspects"
- two: "Dans {{count}} aspects"
+ few: "Dans <%= count %> aspects"
+ many: "Dans <%= count %> aspects"
+ one: "Dans <%= count %> aspect"
+ other: "Dans <%= count %> aspects"
+ two: "Dans <%= count %> aspects"
zero: "Sélectionnez les aspects"
aspect_navigation:
deselect_all: "Désélectionner tout"
@@ -32,7 +32,7 @@ fr:
failed_to_post_message: "Impossible de partager le message !"
getting_started:
alright_ill_wait: "Bon, je vais attendre."
- hey: "Hey, {{name}} !"
+ hey: "Hey, <%= name %> !"
no_tags: "Hey, vous ne suivez aucun tag ! Continuer quand même ?"
preparing_your_stream: "Préparation de votre flux personnalisé..."
infinite_scroll:
@@ -45,10 +45,10 @@ fr:
public: "Public - votre message sera visible de tous et trouvé par les moteurs de recherche"
reshares:
duplicate: "C'est si bien que ça ? Vous avez déjà repartagé ce message !"
- search_for: "Chercher {{name}}"
+ search_for: "Chercher <%= name %>"
show_more: "Voir plus"
tags:
- wasnt_that_interesting: "Ok, je suppose que #{{tagName}} n'est pas la seule chose qui vous intéresse..."
+ wasnt_that_interesting: "Ok, je suppose que #<%= tagName %> n'est pas la seule chose qui vous intéresse..."
timeago:
day: "environ un jour"
days: "environ %d jours"
@@ -67,6 +67,6 @@ fr:
years: "%d ans"
videos:
unknown: "Type de vidéo inconnu"
- watch: "Voir cette vidéo sur {{provider}}"
+ watch: "Voir cette vidéo sur <%= provider %>"
web_sockets:
disconnected: "Le WebSocket est fermé, les messages ne seront plus diffusés en direct."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.gl.yml b/config/locales/javascript/javascript.gl.yml
index 4babce17a..aa438d056 100644
--- a/config/locales/javascript/javascript.gl.yml
+++ b/config/locales/javascript/javascript.gl.yml
@@ -9,10 +9,10 @@ gl:
aspect_dropdown:
add_to_aspect: "Engadir a un aspecto"
toggle:
- few: "En {{count}} aspectos"
- many: "En {{count}} aspectos"
+ few: "En <%= count %> aspectos"
+ many: "En <%= count %> aspectos"
one: "Nun aspecto"
- other: "En {{count}} aspectos"
+ other: "En <%= count %> aspectos"
zero: "Engadir a un aspecto"
comments:
hide: "Agochar os comentarios"
@@ -24,7 +24,7 @@ gl:
no_more: "Non hai máis publicacións."
publisher:
at_least_one_aspect: "Ten que publicalo polo menos nun aspecto."
- search_for: "Buscar por «{{name}}»"
+ search_for: "Buscar por «<%= name %>»"
show_more: "Amosar máis"
timeago:
day: "un día."
@@ -44,6 +44,6 @@ gl:
years: "%d anos."
videos:
unknown: "Tipo de vídeo descoñecido"
- watch: "Ver o vídeo en {{provider}}"
+ watch: "Ver o vídeo en <%= provider %>"
web_sockets:
disconnected: "Pechouse o conector web, as publicacións deixarán de aparecer en canto se publiquen."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.he.yml b/config/locales/javascript/javascript.he.yml
index 32ae0a9fd..4d0f63f28 100644
--- a/config/locales/javascript/javascript.he.yml
+++ b/config/locales/javascript/javascript.he.yml
@@ -14,11 +14,11 @@ he:
started_sharing_with: "{{name}}! התחלת לשתף עם"
stopped_sharing_with: "{{name}} הפסקת לשתף עם"
toggle:
- few: "{{count}} תחומי עניין ב"
- many: "{{count}} תחומי עניין ב"
- one: "{{count}}בתחום עניין "
- other: "ב־{{count}} היבטים"
- two: "ב־{{count}} היבטים"
+ few: "<%= count %> תחומי עניין ב"
+ many: "<%= count %> תחומי עניין ב"
+ one: "<%= count %> בתחום עניין "
+ other: "ב־<%= count %> היבטים"
+ two: "ב־<%= count %> היבטים"
zero: "בחר תחום עניין"
aspect_navigation:
deselect_all: "בטל את הסימון"
@@ -32,7 +32,7 @@ he:
failed_to_post_message: "פרסום ההודעה נכשל!"
getting_started:
alright_ill_wait: "בסדר, אני אמתין."
- hey: "שלום, {{name}}!"
+ hey: "שלום, <%= name %>!"
no_tags: "?היי, לא עקבת אחרי אף תגית! לאן אתה רוצה להמשיך"
preparing_your_stream: "החדשות האישיות שלך בשלבי הכנה"
infinite_scroll:
@@ -45,10 +45,10 @@ he:
public: "ציבורי - הרשומה שלך תהיה גלויה לכולם וניתן יהיה למצוא אותה במנועי חיפוש"
reshares:
duplicate: "כבר שיתפת רשומה זו בעבר "
- search_for: " {{name}}חיפוש אחר"
+ search_for: " <%= name %>חיפוש אחר"
show_more: "הצגת עוד"
tags:
- wasnt_that_interesting: "...זה לא היה כל כך מעניין#{{tagName}} אוקיי, אני מניח "
+ wasnt_that_interesting: "...זה לא היה כל כך מעניין#<%= tagName %> אוקיי, אני מניח "
timeago:
day: יום
days: "%d ימים"
@@ -67,6 +67,6 @@ he:
years: "%d שנים"
videos:
unknown: "סוג הווידאו אינו ידוע"
- watch: " {{provider}}צפייה בסרטון וידאו זה באתר"
+ watch: " <%= provider %>צפייה בסרטון וידאו זה באתר"
web_sockets:
- disconnected: "צינור ההודעות סגור; הודעות לא יוצגו בזמן אמת"
\ No newline at end of file
+ disconnected: "צינור ההודעות סגור; הודעות לא יוצגו בזמן אמת"
diff --git a/config/locales/javascript/javascript.hu.yml b/config/locales/javascript/javascript.hu.yml
index ad62e52a9..b7e283784 100644
--- a/config/locales/javascript/javascript.hu.yml
+++ b/config/locales/javascript/javascript.hu.yml
@@ -9,16 +9,16 @@ hu:
aspect_dropdown:
add_to_aspect: "Hozzáadás a csoporthoz"
all_aspects: "Összes csoport"
- error: "Nem indult el a megosztás vele: {{name}}. Visszavonod?"
+ error: "Nem indult el a megosztás vele: <%= name %>. Visszavonod?"
select_aspects: "Csoportok kiválasztása"
- started_sharing_with: "Mostantól megosztassz vele: {{name}}!"
- stopped_sharing_with: "Nem osztassz meg többé vele: {{name}}."
+ started_sharing_with: "Mostantól megosztassz vele: <%= name %>!"
+ stopped_sharing_with: "Nem osztassz meg többé vele: <%= name %>."
toggle:
- few: "{{count}} csoportban"
- many: "{{count}} csoportban"
- one: "{{count}} csoportban"
- other: "{{count}} csoportban"
- two: "{{count}} csoportban"
+ few: "<%= count %> csoportban"
+ many: "<%= count %> csoportban"
+ one: "<%= count %> csoportban"
+ other: "<%= count %> csoportban"
+ two: "<%= count %> csoportban"
zero: "Csoportok kiválasztása"
aspect_navigation:
deselect_all: "Összes kijelölés megszüntetése"
@@ -32,7 +32,7 @@ hu:
failed_to_post_message: "Üzenet elküldése sikertelen!"
getting_started:
alright_ill_wait: "Rendben, várok!"
- hey: "Szia {{name}}!"
+ hey: "Szia <%= name %>!"
no_tags: "Hékás, nem követtél egy #címkét sem! Így is folytatod?"
preparing_your_stream: "Személyre szabott hírfolyamod előkészítése..."
infinite_scroll:
@@ -45,10 +45,10 @@ hu:
public: "Nyilvános - ezt a bejegyzést bárki láthatja az interneten."
reshares:
duplicate: "Jó mi? De már egyszer megosztottad ezt a bejegyzést!"
- search_for: "{{name}} keresése."
+ search_for: "<%= name %> keresése."
show_more: tovább
tags:
- wasnt_that_interesting: "Oké, azt hiszem a #{{tagName}} nem volt annyira érdekes."
+ wasnt_that_interesting: "Oké, azt hiszem a #<%= tagName %> nem volt annyira érdekes."
timeago:
day: "egy nappal"
days: "%d nappal"
@@ -65,6 +65,6 @@ hu:
years: "%d évvel"
videos:
unknown: "Ismeretlen videó tipus"
- watch: "Videó megtekintése itt: {{provider}}"
+ watch: "Videó megtekintése itt: <%= provider %>"
web_sockets:
disconnected: "A websocket zárolva van. A bejegyzések nem lesznek előben stream-elve."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.id.yml b/config/locales/javascript/javascript.id.yml
index 8656f5253..5e69536b5 100644
--- a/config/locales/javascript/javascript.id.yml
+++ b/config/locales/javascript/javascript.id.yml
@@ -9,11 +9,11 @@ id:
aspect_dropdown:
add_to_aspect: "Add to aspect"
toggle:
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- one: "In {{count}} aspect"
- other: "In {{count}} aspects"
- two: "In {{count}} aspects"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspects"
+ two: "In <%= count %> aspects"
zero: "Add to aspect"
getting_started:
preparing_your_stream: "Preparing your personialized stream..."
diff --git a/config/locales/javascript/javascript.is.yml b/config/locales/javascript/javascript.is.yml
index 1c5bbfa54..42a900e61 100644
--- a/config/locales/javascript/javascript.is.yml
+++ b/config/locales/javascript/javascript.is.yml
@@ -9,11 +9,11 @@ is:
aspect_dropdown:
add_to_aspect: "Add to aspect"
toggle:
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- one: "In {{count}} aspect"
- other: "In {{count}} aspects"
- two: "In {{count}} aspects"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspects"
+ two: "In <%= count %> aspects"
zero: "Add to aspect"
confirm_dialog: "Ertu viss?"
getting_started:
@@ -35,4 +35,4 @@ is:
years: "%d ára"
videos:
unknown: "Óþekkt vídeó tegund"
- watch: "Horfa á þetta vídeó á {{provider}}"
\ No newline at end of file
+ watch: "Horfa á þetta vídeó á <%= provider %>"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.it.yml b/config/locales/javascript/javascript.it.yml
index 924687a50..cfbbde881 100644
--- a/config/locales/javascript/javascript.it.yml
+++ b/config/locales/javascript/javascript.it.yml
@@ -9,16 +9,16 @@ it:
aspect_dropdown:
add_to_aspect: Aggiungi
all_aspects: "Tutti gli aspetti"
- error: "Non è possibile condividere con {{name}}. E' tra gli utenti ignorati?"
+ error: "Non è possibile condividere con <%= name %>. E' tra gli utenti ignorati?"
select_aspects: "Scegli gli aspetti"
- started_sharing_with: "Hai iniziato a condividere con {{name}}!"
- stopped_sharing_with: "Hai smesso di condividere con {{name}}."
+ started_sharing_with: "Hai iniziato a condividere con <%= name %>!"
+ stopped_sharing_with: "Hai smesso di condividere con <%= name %>."
toggle:
- few: "In {{count}} aspetti"
- many: "In {{count}} aspetti"
- one: "In {{count}} aspetto"
- other: "In {{count}} aspetti"
- two: "In {{count}} aspetti"
+ few: "In <%= count %> aspetti"
+ many: "In <%= count %> aspetti"
+ one: "In <%= count %> aspetto"
+ other: "In <%= count %> aspetti"
+ two: "In <%= count %> aspetti"
zero: "Scegli gli aspetti"
aspect_navigation:
deselect_all: "Deseleziona tutti"
@@ -32,7 +32,7 @@ it:
failed_to_post_message: "Invio messaggio fallito!"
getting_started:
alright_ill_wait: "Perfetto, aspetterò."
- hey: "Ciao, {{name}}!"
+ hey: "Ciao, <%= name %>!"
no_tags: "Non hai scelto di seguire alcun tag, vuoi continuare comunque?"
preparing_your_stream: "Sto preparando il tuo stream personalizzato..."
infinite_scroll:
@@ -45,10 +45,10 @@ it:
public: "Pubblico - il tuo post sarà visibile a tutti, inclusi i motori di ricerca"
reshares:
duplicate: "Bello eh? Ma hai già condiviso quel post!"
- search_for: "Ricerca per {{name}}"
+ search_for: "Ricerca per <%= name %>"
show_more: continua...
tags:
- wasnt_that_interesting: "OK, immagino che #{{tagName}} non fosse così interessante..."
+ wasnt_that_interesting: "OK, immagino che #<%= tagName %> non fosse così interessante..."
timeago:
day: "un giorno"
days: "%d giorni"
@@ -66,6 +66,6 @@ it:
years: "%d anni"
videos:
unknown: "Tipo di video sconosciuto"
- watch: "Guarda questo video su {{provider}}"
+ watch: "Guarda questo video su <%= provider %>"
web_sockets:
disconnected: "Il websocket è chiuso; i post non saranno più aggiornati in tempo reale."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ja.yml b/config/locales/javascript/javascript.ja.yml
index 801da2034..7a4b70509 100644
--- a/config/locales/javascript/javascript.ja.yml
+++ b/config/locales/javascript/javascript.ja.yml
@@ -9,11 +9,11 @@ ja:
aspect_dropdown:
add_to_aspect: "Add to aspect"
toggle:
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- one: "In {{count}} aspect"
- other: "In {{count}} aspects"
- two: "In {{count}} aspects"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspects"
+ two: "In <%= count %> aspects"
zero: "Add to aspect"
confirm_dialog: 本当にいいですか。
getting_started:
@@ -24,7 +24,7 @@ ja:
at_least_one_aspect: アスペクトを選択してから投稿してください。
reshares:
duplicate: "You've already reshared that post!"
- search_for: "{{name}}を検索する"
+ search_for: "<%= name %>を検索する"
timeago:
day: 1日
days: "%d日"
@@ -42,6 +42,6 @@ ja:
years: "%d年"
videos:
unknown: 動画の種類が不明です
- watch: "{{provider}}で動画を視聴する"
+ watch: "<%= provider %>で動画を視聴する"
web_sockets:
disconnected: 接続が解除されました。投稿のリアルタイム更新を中断します。
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ka.yml b/config/locales/javascript/javascript.ka.yml
index 5a7da807a..0ce619fe4 100644
--- a/config/locales/javascript/javascript.ka.yml
+++ b/config/locales/javascript/javascript.ka.yml
@@ -9,16 +9,16 @@ ka:
aspect_dropdown:
add_to_aspect: "კონტაქტის დამატება"
all_aspects: "ყველა ასპექტი"
- error: "{{name}}-თან გაზიარების დაწყება ვერ მოხერხდა. იგნორირება ხომ არ გაუკეთეთ მას?"
+ error: "<%= name %>-თან გაზიარების დაწყება ვერ მოხერხდა. იგნორირება ხომ არ გაუკეთეთ მას?"
select_aspects: "აირჩიეთ ასპექტები"
- started_sharing_with: "თქვნ დაიწყეთ {{name}}-თან გაზიარება!"
- stopped_sharing_with: "თქვენ შეწყვიტეთ {{name}}-თან გაზიარება."
+ started_sharing_with: "თქვნ დაიწყეთ <%= name %>-თან გაზიარება!"
+ stopped_sharing_with: "თქვენ შეწყვიტეთ <%= name %>-თან გაზიარება."
toggle:
- few: "{{count}} ასპექტში"
- many: "{{count}} ასპექტში"
- one: "{{count}} ასპექტში"
- other: "{{count}} ასპექტში"
- two: "{{count}} ასპექტში"
+ few: "<%= count %> ასპექტში"
+ many: "<%= count %> ასპექტში"
+ one: "<%= count %> ასპექტში"
+ other: "<%= count %> ასპექტში"
+ two: "<%= count %> ასპექტში"
zero: "აირჩიეთ ასპექტები"
aspect_navigation:
deselect_all: "მონიშვნის მოხსნა"
@@ -32,7 +32,7 @@ ka:
failed_to_post_message: "შეტყობინების გამოცხადება ჩაიშალა!"
getting_started:
alright_ill_wait: "კარგი, მოვიცდი."
- hey: "ჰეი, {{name}}!"
+ hey: "ჰეი, <%= name %>!"
no_tags: "ჰეი, თქვენ არ მიყვებით არცერთ ტეგს! მაინც გსურთ გაგრძელება?"
preparing_your_stream: "თქვენი პერსონალიზებული ნაკადი მზადდება..."
infinite_scroll:
@@ -45,10 +45,10 @@ ka:
public: "საჯარო - თქვენს პოსტს დაინახავს ყველა და მას მოძებნილი იქნებიან საძიბო სისტემებით"
reshares:
duplicate: "ასეთი მაგარია? თქვენ უკვე გააზიარეთ ეს პოსტი!"
- search_for: "ძებნა {{name}}"
+ search_for: "ძებნა <%= name %>"
show_more: "მეტის ჩვენება"
tags:
- wasnt_that_interesting: "კარგი, მე ვფიქრობ რომ #{{tagName}} არც ისე საინტერესო იყო..."
+ wasnt_that_interesting: "კარგი, მე ვფიქრობ რომ #<%= tagName %> არც ისე საინტერესო იყო..."
timeago:
day: დღე
days: "%d დღე"
@@ -67,6 +67,6 @@ ka:
years: "%d წელი"
videos:
unknown: "ვიდეოს ტიპი უცნობია"
- watch: "ვიდეოს ნახვა საიტზე {{provider}}"
+ watch: "ვიდეოს ნახვა საიტზე <%= provider %>"
web_sockets:
disconnected: "ვებ-სოკეტი დახურულია; განხადებების ნაკადი აღარ მოედინება პირდაპირ."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ko.yml b/config/locales/javascript/javascript.ko.yml
index f7543a6cb..d742dc959 100644
--- a/config/locales/javascript/javascript.ko.yml
+++ b/config/locales/javascript/javascript.ko.yml
@@ -9,16 +9,16 @@ ko:
aspect_dropdown:
add_to_aspect: "애스펙에 넣기"
all_aspects: "모든 에스팩"
- error: "{{name}}님과 공유를 시작할 수 없습니다. 혹시 무시하고 있습니까?"
+ error: "<%= name %>님과 공유를 시작할 수 없습니다. 혹시 무시하고 있습니까?"
select_aspects: "에스팩 선택"
- started_sharing_with: "{{name}}님과의 공유를 시작합니다!"
- stopped_sharing_with: "{{name}}님과의 공유를 멈췄습니다."
+ started_sharing_with: "<%= name %>님과의 공유를 시작합니다!"
+ stopped_sharing_with: "<%= name %>님과의 공유를 멈췄습니다."
toggle:
- few: "애스펙 {{count}}개 안에 있습니다"
- many: "애스펙 {{count}}개 안에 있습니다"
+ few: "애스펙 <%= count %>개 안에 있습니다"
+ many: "애스펙 <%= count %>개 안에 있습니다"
one: "애스펙 한 개 안에 있습니다"
- other: "애스펙 {{count}}개 안에 있습니다"
- two: "{{count}}개의 에스팩에서"
+ other: "애스펙 <%= count %>개 안에 있습니다"
+ two: "<%= count %>개의 에스팩에서"
zero: "애스펙에 넣기"
aspect_navigation:
deselect_all: "선택 해제"
@@ -31,7 +31,7 @@ ko:
failed_to_like: "좋아요를 실패했습니다!"
failed_to_post_message: "메시지 게시를 실패하였습니다!"
getting_started:
- hey: "{{name}}님 안녕하세요?"
+ hey: "<%= name %>님 안녕하세요?"
no_tags: "태그를 팔로우하지 않았습니다. 그래도 계속하시겠습니까?"
preparing_your_stream: "개인화 스트림 준비중···"
infinite_scroll:
@@ -44,10 +44,10 @@ ko:
public: "공개 - 내 게시물을 누구나 볼 수 있고 검색 엔진으로 찾을 수 있습니다"
reshares:
duplicate: "이미 재공유된 게시물입니다!"
- search_for: "{{name}} 검색"
+ search_for: "<%= name %> 검색"
show_more: "더 보기"
tags:
- wasnt_that_interesting: "처리했습니다. #{{tagName}} 태그는 흥미롭지 않았군요?"
+ wasnt_that_interesting: "처리했습니다. #<%= tagName %> 태그는 흥미롭지 않았군요?"
timeago:
day: 하루
days: "%d일"
@@ -65,6 +65,6 @@ ko:
years: "%d년"
videos:
unknown: "알 수 없는 동영상 형식"
- watch: "동영상을 {{provider}}에서 보기"
+ watch: "동영상을 <%= provider %>에서 보기"
web_sockets:
disconnected: "웹소켓이 닫혔습니다. 앞으로는 게시물이 실시간으로 제공되지 않습니다."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ml.yml b/config/locales/javascript/javascript.ml.yml
index ae68b7c87..7d7cf3f89 100644
--- a/config/locales/javascript/javascript.ml.yml
+++ b/config/locales/javascript/javascript.ml.yml
@@ -24,8 +24,8 @@ ml:
years: "%d വര്ഷങ്ങള്ക്ക്"
videos:
unknown: "അജ്ഞാതമായ തരം വീഡിയോ"
- watch: "ഈ വീഡിയോ {{provider}}ല് കാണുക"
- search_for: "{{name}}നായി തിരയുക"
+ watch: "ഈ വീഡിയോ <%= provider %>ല് കാണുക"
+ search_for: "<%= name %>നായി തിരയുക"
infinite_scroll:
no_more: "കൂടുതല് പോസ്റ്റുകളൊന്നുമില്ല."
publisher:
@@ -40,10 +40,10 @@ ml:
add_to_aspect: "Add to aspect"
toggle:
zero: "Add to aspect"
- one: "In {{count}} aspect"
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- other: "In {{count}} aspects"
+ one: "In <%= count %> aspect"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ other: "In <%= count %> aspects"
show_more: "show more"
failed_to_like: "Failed to like!"
failed_to_post_message: "Failed to post message!"
diff --git a/config/locales/javascript/javascript.ms.yml b/config/locales/javascript/javascript.ms.yml
index 7e34d682e..5c7349409 100644
--- a/config/locales/javascript/javascript.ms.yml
+++ b/config/locales/javascript/javascript.ms.yml
@@ -9,16 +9,16 @@ ms:
aspect_dropdown:
add_to_aspect: "Tambah kenalan"
all_aspects: "Semua aspek"
- error: "Tidak dapat berkongsi dengan {{name}}. Adakah anda mengabaikan mereka?"
+ error: "Tidak dapat berkongsi dengan <%= name %>. Adakah anda mengabaikan mereka?"
select_aspects: "Pilih kenalan"
- started_sharing_with: "Anda telah mula berkongsi dengan {{name}}!"
- stopped_sharing_with: "Anda telah berhenti berkongsi dengan {{name}}."
+ started_sharing_with: "Anda telah mula berkongsi dengan <%= name %>!"
+ stopped_sharing_with: "Anda telah berhenti berkongsi dengan <%= name %>."
toggle:
- few: "Dalam {{count}} aspek"
- many: "Dalam {{count}} aspek"
- one: "Dalam {{count}} aspek"
- other: "dalam {{count}} aspek"
- two: "Dalam {{count}} aspek"
+ few: "Dalam <%= count %> aspek"
+ many: "Dalam <%= count %> aspek"
+ one: "Dalam <%= count %> aspek"
+ other: "dalam <%= count %> aspek"
+ two: "Dalam <%= count %> aspek"
zero: "Pilih aspek"
aspect_navigation:
deselect_all: "menyahpilih semua"
@@ -32,7 +32,7 @@ ms:
failed_to_post_message: "Gagal untuk pos mesej!"
getting_started:
alright_ill_wait: "Baiklah, saya akan tunggu."
- hey: "Hei, {{name}}!"
+ hey: "Hei, <%= name %>!"
no_tags: "Hei, anda tidak mengikuti mana-mana tag! Teruskan juga?"
preparing_your_stream: "Menyediakan strim peribadi anda..."
infinite_scroll:
@@ -45,10 +45,10 @@ ms:
public: "Awam - Pos anda akan dilihat oleh semua orang dan dijumpai oleh enjin carian"
reshares:
duplicate: "Yang baik, kan? Anda telah berkongsi semula pos itu!"
- search_for: "Mencari {{name}}"
+ search_for: "Mencari <%= name %>"
show_more: "tunjuk lagi"
tags:
- wasnt_that_interesting: "OK, saya mengandaikan # {{tagName}} tidak semua yang menarik..."
+ wasnt_that_interesting: "OK, saya mengandaikan # <%= tagName %> tidak semua yang menarik..."
timeago:
day: sehari
days: "%d hari"
@@ -67,6 +67,6 @@ ms:
years: "%d tahun"
videos:
unknown: "Jenis video tidak diketahui"
- watch: "Tonton video ini di {{provider}}"
+ watch: "Tonton video ini di <%= provider %>"
web_sockets:
disconnected: "Websocket ditutup; pos tidak lagi akan distrim secara langsung."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.nb.yml b/config/locales/javascript/javascript.nb.yml
index ce98d2027..f5efdd061 100644
--- a/config/locales/javascript/javascript.nb.yml
+++ b/config/locales/javascript/javascript.nb.yml
@@ -9,16 +9,16 @@ nb:
aspect_dropdown:
add_to_aspect: "Legg til kategori"
all_aspects: "Alle kategorier"
- error: "Kunne ikke begynne å dele med {{name}}. Ignorerer du dem?"
+ error: "Kunne ikke begynne å dele med <%= name %>. Ignorerer du dem?"
select_aspects: "Velg kategori"
- started_sharing_with: "Du har begynt å dele med {{name}}!"
- stopped_sharing_with: "Du har sluttet å dele med {{name}}."
+ started_sharing_with: "Du har begynt å dele med <%= name %>!"
+ stopped_sharing_with: "Du har sluttet å dele med <%= name %>."
toggle:
- few: "I {{count}} kategorier"
- many: "I {{count}} kategorier"
- one: "I {{count}} kategori"
- other: "I {{count}} kategorier"
- two: "I {{count}} kategorier"
+ few: "I <%= count %> kategorier"
+ many: "I <%= count %> kategorier"
+ one: "I <%= count %> kategori"
+ other: "I <%= count %> kategorier"
+ two: "I <%= count %> kategorier"
zero: "Legg til kategori"
aspect_navigation:
deselect_all: "Avmerk alle"
@@ -32,7 +32,7 @@ nb:
failed_to_post_message: "Klarte ikke å publisere post!"
getting_started:
alright_ill_wait: "Greit, jeg venter."
- hey: "Hei, {{name}}!"
+ hey: "Hei, <%= name %>!"
no_tags: "Hei, du har ikke fulgt noen tagger! Fortsett likevel?"
preparing_your_stream: "Preparing your personialized stream..."
infinite_scroll:
@@ -45,10 +45,10 @@ nb:
public: "Offentlig - posten din vil være synlig for alle og kan bli funnet av søkemotorer"
reshares:
duplicate: "du har allerede delt denne posten!"
- search_for: "Søk etter {{name}}"
+ search_for: "Søk etter <%= name %>"
show_more: "vis mer"
tags:
- wasnt_that_interesting: "OK, jeg skjønner at #{{tagName}} ikke var så spennende likevel..."
+ wasnt_that_interesting: "OK, jeg skjønner at #<%= tagName %> ikke var så spennende likevel..."
timeago:
day: "en dag"
days: "%d dager"
@@ -67,4 +67,4 @@ nb:
years: "%d år"
videos:
unknown: "Ukjent videotype"
- watch: "Se denne videoen på {{provider}}"
\ No newline at end of file
+ watch: "Se denne videoen på <%= provider %>"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.nl.yml b/config/locales/javascript/javascript.nl.yml
index 9e5015176..72919bf28 100644
--- a/config/locales/javascript/javascript.nl.yml
+++ b/config/locales/javascript/javascript.nl.yml
@@ -11,11 +11,11 @@ nl:
all_aspects: "Alle aspecten"
select_aspects: "Selecteer aspecten"
toggle:
- few: "In {{count}} aspecten"
- many: "In {{count}} aspecten"
- one: "In {{count}} aspect"
- other: "In {{count}} aspecten"
- two: "In {{count}} aspecten"
+ few: "In <%= count %> aspecten"
+ many: "In <%= count %> aspecten"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspecten"
+ two: "In <%= count %> aspecten"
zero: "Voeg toe aan aspect"
aspect_navigation:
deselect_all: "Alles deselecteren"
@@ -38,7 +38,7 @@ nl:
public: "Openbaar - je post is zichtbaar voor iedereen en kan gevonden worden door zoekmachines"
reshares:
duplicate: "Je hebt deze post al doorgegeven!"
- search_for: "Zoek naar {{name}}"
+ search_for: "Zoek naar <%= name %>"
show_more: "laat meer zien"
timeago:
day: "een dag"
@@ -56,6 +56,6 @@ nl:
years: "%d jaar"
videos:
unknown: "Onbekend video type"
- watch: "Bekijk deze video op {{provider}}"
+ watch: "Bekijk deze video op <%= provider %>"
web_sockets:
disconnected: "De websocket is gesloten; posts worden niet langer live gestreamd."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.nn.yml b/config/locales/javascript/javascript.nn.yml
index 4dc7c5636..38817459b 100644
--- a/config/locales/javascript/javascript.nn.yml
+++ b/config/locales/javascript/javascript.nn.yml
@@ -9,16 +9,16 @@ nn:
aspect_dropdown:
add_to_aspect: "Legg til kontakt"
all_aspects: "Alle aspekta"
- error: "Klarte ikkje å byrja å dela med {{name}}. Ignorerer du dei?"
+ error: "Klarte ikkje å byrja å dela med <%= name %>. Ignorerer du dei?"
select_aspects: "Vel aspekt"
- started_sharing_with: "Du har byrja å dela med {{name}}."
- stopped_sharing_with: "Du deler ikkje lenger med {{name}}."
+ started_sharing_with: "Du har byrja å dela med <%= name %>."
+ stopped_sharing_with: "Du deler ikkje lenger med <%= name %>."
toggle:
- few: "I {{count}} aspekt"
- many: "I {{count}} aspekt"
- one: "I {{count}} aspekt"
- other: "I {{count}} aspekt"
- two: "I {{count}} aspekt"
+ few: "I <%= count %> aspekt"
+ many: "I <%= count %> aspekt"
+ one: "I <%= count %> aspekt"
+ other: "I <%= count %> aspekt"
+ two: "I <%= count %> aspekt"
zero: "Vel aspekt"
aspect_navigation:
deselect_all: "Vel vekk alle"
@@ -32,7 +32,7 @@ nn:
failed_to_post_message: "Klarte ikkje å senda meldinga."
getting_started:
alright_ill_wait: "Greitt, eg ventar."
- hey: "Hei, {{name}}!"
+ hey: "Hei, <%= name %>!"
no_tags: "Du har ikkje følgt nokon etikett. Vil du likevel halda fram?"
preparing_your_stream: "Lagar den tilpassa straumen din …"
infinite_scroll:
@@ -45,10 +45,10 @@ nn:
public: "Offentleg - alle kan sjå meldinga di og ho kan bli funnen av søkjemotorar"
reshares:
duplicate: "Så bra, altså? Men du har allereie delt meldinga :-)"
- search_for: "Leit etter {{name}}"
+ search_for: "Leit etter <%= name %>"
show_more: "syn meir"
tags:
- wasnt_that_interesting: "Greitt, #{{tagName}} var vel kanskje ikkje så interessant …"
+ wasnt_that_interesting: "Greitt, #<%= tagName %> var vel kanskje ikkje så interessant …"
timeago:
day: "om dagen"
days: "%d dagar"
@@ -65,6 +65,6 @@ nn:
years: "%d år"
videos:
unknown: "Ukjend videotype"
- watch: "Sjå denne videoen hos {{provider}}"
+ watch: "Sjå denne videoen hos <%= provider %>"
web_sockets:
disconnected: "Nettendepunktet er lukka - meldingane vil ikkje lenger kunna strøymast direkte."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.pl.yml b/config/locales/javascript/javascript.pl.yml
index 231bea44b..e384d1902 100644
--- a/config/locales/javascript/javascript.pl.yml
+++ b/config/locales/javascript/javascript.pl.yml
@@ -9,16 +9,16 @@ pl:
aspect_dropdown:
add_to_aspect: "Dodaj kontakt"
all_aspects: "Wszystkie aspekty"
- error: "Nie można zacząć dzielić się z {{name}}. Może ich ignorujesz?"
+ error: "Nie można zacząć dzielić się z <%= name %>. Może ich ignorujesz?"
select_aspects: "Wybierz aspekty"
- started_sharing_with: "Od teraz dzielisz się z {{name}}!"
- stopped_sharing_with: "Nie dzielisz się już z {{name}}."
+ started_sharing_with: "Od teraz dzielisz się z <%= name %>!"
+ stopped_sharing_with: "Nie dzielisz się już z <%= name %>."
toggle:
- few: "W {{count}} aspektach"
- many: "W {{count}} aspektach"
- one: "W {{count}} aspekcie"
- other: "W {{count}} aspektach"
- two: "W {{count}} aspektach"
+ few: "W <%= count %> aspektach"
+ many: "W <%= count %> aspektach"
+ one: "W <%= count %> aspekcie"
+ other: "W <%= count %> aspektach"
+ two: "W <%= count %> aspektach"
zero: "Wybierz aspekty"
aspect_navigation:
deselect_all: "Odznacz wszystkie"
@@ -32,7 +32,7 @@ pl:
failed_to_post_message: "Nie można wysłać wiadomości!"
getting_started:
alright_ill_wait: "Dobrze, poczekam."
- hey: "Hej, {{name}}!"
+ hey: "Hej, <%= name %>!"
no_tags: "Hej, nie obserwujesz żadnych znaczników! Kontynuować mimo to?"
preparing_your_stream: "Przygotowanie spersonalizowanego strumienia..."
infinite_scroll:
@@ -45,10 +45,10 @@ pl:
public: "Publiczny - wpis będzie widoczny dla wszystkich i można go znaleźć przez wyszukiwarki"
reshares:
duplicate: "Już przekaza@{m:łeś|f:łaś|n:no} dalej ten wpis!"
- search_for: "Znajdź: {{name}}"
+ search_for: "Znajdź: <%= name %>"
show_more: "wyświetl więcej"
tags:
- wasnt_that_interesting: "OK, przypuszczam, że #{{tagName}} nie był, aż tak interesujący..."
+ wasnt_that_interesting: "OK, przypuszczam, że #<%= tagName %> nie był, aż tak interesujący..."
timeago:
day: dzień
days: "%d dni"
@@ -67,6 +67,6 @@ pl:
years: "%d lat"
videos:
unknown: "Nieznany typ wideo"
- watch: "Zobacz ten film na {{provider}}"
+ watch: "Zobacz ten film na <%= provider %>"
web_sockets:
disconnected: "Kanał komunikacji jest zamknięty; wpisy nie będą publikowane online."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.pt-BR.yml b/config/locales/javascript/javascript.pt-BR.yml
index cb25a9202..cc0cccf38 100644
--- a/config/locales/javascript/javascript.pt-BR.yml
+++ b/config/locales/javascript/javascript.pt-BR.yml
@@ -9,16 +9,16 @@ pt-BR:
aspect_dropdown:
add_to_aspect: "Adicionar contato"
all_aspects: "Todos aspectos"
- error: "Não foi possível compartilhar com {{name}}. Deseja ignorar isto?"
+ error: "Não foi possível compartilhar com <%= name %>. Deseja ignorar isto?"
select_aspects: "Selecione os aspectos"
- started_sharing_with: "Você começou a compartilhar com {{name}}!"
- stopped_sharing_with: "Você parou de compartilhar com {{name}}."
+ started_sharing_with: "Você começou a compartilhar com <%= name %>!"
+ stopped_sharing_with: "Você parou de compartilhar com <%= name %>."
toggle:
- few: "Em {{count}} aspectos"
- many: "Em {{count}} aspectos"
- one: "Em {{count}} aspecto"
- other: "Em {{count}} aspectos"
- two: "Em {{count}} aspectos"
+ few: "Em <%= count %> aspectos"
+ many: "Em <%= count %> aspectos"
+ one: "Em <%= count %> aspecto"
+ other: "Em <%= count %> aspectos"
+ two: "Em <%= count %> aspectos"
zero: "Adicione para aspecto"
aspect_navigation:
deselect_all: "Desmarcar tudo"
@@ -32,7 +32,7 @@ pt-BR:
failed_to_post_message: "Falha em postar a mensagem!"
getting_started:
alright_ill_wait: "Tudo bem, eu esperarei."
- hey: "Ei, {{name}}!"
+ hey: "Ei, <%= name %>!"
no_tags: "Ei, você não está seguindo todas as tags! Continuar assim mesmo?"
preparing_your_stream: "Preparando seu fluxo personalizado..."
infinite_scroll:
@@ -45,10 +45,10 @@ pt-BR:
public: "Pública - a sua postagem será totalmente visível na web e poderá ser encontrada pelos mecanismos de buscas, Google, Bing e etc..."
reshares:
duplicate: "Você já compartilhou essa postagem."
- search_for: "Procurar por {{name}}"
+ search_for: "Procurar por <%= name %>"
show_more: "mostrar mais"
tags:
- wasnt_that_interesting: "Ok, eu acho que #{{tagName}} não era tão interessante..."
+ wasnt_that_interesting: "Ok, eu acho que #<%= tagName %> não era tão interessante..."
timeago:
day: "um dia"
days: "%d dias"
@@ -65,6 +65,6 @@ pt-BR:
years: "%d anos"
videos:
unknown: "Tipo de vídeo desconhecido"
- watch: "Assista este vídeo no {{provider}}"
+ watch: "Assista este vídeo no <%= provider %>"
web_sockets:
disconnected: "A conexão foi encerrada, não é mais possível transmitir novas postagens."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.pt-PT.yml b/config/locales/javascript/javascript.pt-PT.yml
index 15f3d3a9d..66aa51468 100644
--- a/config/locales/javascript/javascript.pt-PT.yml
+++ b/config/locales/javascript/javascript.pt-PT.yml
@@ -9,16 +9,16 @@ pt-PT:
aspect_dropdown:
add_to_aspect: "Adicionar contacto"
all_aspects: "Todos os aspectos"
- error: "Não foi possível começar a partilhar com {{name}}. Você está a ignorá-los?"
+ error: "Não foi possível começar a partilhar com <%= name %>. Você está a ignorá-los?"
select_aspects: "Seleccionar aspectos"
- started_sharing_with: "Começou a partilhar com {{name}}!"
- stopped_sharing_with: "Deixou de partilhar com {{name}}."
+ started_sharing_with: "Começou a partilhar com <%= name %>!"
+ stopped_sharing_with: "Deixou de partilhar com <%= name %>."
toggle:
- few: "Em {{count}} aspectos"
- many: "Em {{count}} aspectos"
- one: "Em {{count}} aspecto"
- other: "Em {{count}} aspectos"
- two: "Em {{count}} aspectos"
+ few: "Em <%= count %> aspectos"
+ many: "Em <%= count %> aspectos"
+ one: "Em <%= count %> aspecto"
+ other: "Em <%= count %> aspectos"
+ two: "Em <%= count %> aspectos"
zero: "Seleccione os aspectos"
aspect_navigation:
deselect_all: "Desmarcar todos"
@@ -32,7 +32,7 @@ pt-PT:
failed_to_post_message: "Falhou ao publicar a mensagem!"
getting_started:
alright_ill_wait: "Tudo bem, eu esperarei."
- hey: "Ei, {{name}}!"
+ hey: "Ei, <%= name %>!"
no_tags: "Ei, não está a seguir nenhuma etiqueta! Continuar mesmo assim?"
preparing_your_stream: "A preparar o seu Stream personalizado..."
infinite_scroll:
@@ -45,10 +45,10 @@ pt-PT:
public: "Público - A sua publicação será visível para todos e encontrada por motores de busca"
reshares:
duplicate: "Que bom, hein? Você já republicou essa mensagem!"
- search_for: "Procurar por {{name}}"
+ search_for: "Procurar por <%= name %>"
show_more: "mostrar mais"
tags:
- wasnt_that_interesting: "OK, suponho que #{{tagName}} não era assim tão interessante..."
+ wasnt_that_interesting: "OK, suponho que #<%= tagName %> não era assim tão interessante..."
timeago:
day: "um dia"
days: "%d dias"
@@ -67,6 +67,6 @@ pt-PT:
years: "%d anos"
videos:
unknown: "Formato de vídeo desconhecido"
- watch: "Visualize este vídeo no {{provider}}"
+ watch: "Visualize este vídeo no <%= provider %>"
web_sockets:
disconnected: "A websocket está fechada; as publicações não serão distribuídas em directo."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ro.yml b/config/locales/javascript/javascript.ro.yml
index c2e9ec81a..31114e55a 100644
--- a/config/locales/javascript/javascript.ro.yml
+++ b/config/locales/javascript/javascript.ro.yml
@@ -9,16 +9,16 @@ ro:
aspect_dropdown:
add_to_aspect: "Adaugă la contacte"
all_aspects: "Toate aspectele"
- error: "Nu sa putut incepe impartirea de publicatii cu {{name}}. Ii ignorati cumva ?"
+ error: "Nu sa putut incepe impartirea de publicatii cu <%= name %>. Ii ignorati cumva ?"
select_aspects: "Selectează aspecte"
- started_sharing_with: "Ati inceput sa impartiti publicatii cu {{name}}!"
- stopped_sharing_with: "Nu mai imparti publicatii cu {{name}}."
+ started_sharing_with: "Ati inceput sa impartiti publicatii cu <%= name %>!"
+ stopped_sharing_with: "Nu mai imparti publicatii cu <%= name %>."
toggle:
- few: "În {{count}} aspecte"
- many: "În {{count}} aspecte"
- one: "În {{count}} aspect"
- other: "În {{count}} aspecte"
- two: "In {{count}} aspecte"
+ few: "În <%= count %> aspecte"
+ many: "În <%= count %> aspecte"
+ one: "În <%= count %> aspect"
+ other: "În <%= count %> aspecte"
+ two: "In <%= count %> aspecte"
zero: "Selectati aspecte"
aspect_navigation:
deselect_all: "Deselectează tot"
@@ -32,7 +32,7 @@ ro:
failed_to_post_message: "Nu sa reusit trimiterea mesajului!"
getting_started:
alright_ill_wait: "In regulă, o să aștept."
- hey: "Salutare, {{name}}!"
+ hey: "Salutare, <%= name %>!"
no_tags: "Hopa, nu urmati nicio eticheta! Continuati si asa ?"
preparing_your_stream: "Se pregateste fluxul personalizat pentru dvs..."
infinite_scroll:
@@ -44,10 +44,10 @@ ro:
limited: "Limitat - publicatia va fi vazuta doar de catre persoanele cu care imparti publicatii"
reshares:
duplicate: "E chiar asa de tare, hmm? Ati mai raspandit o data aceasta publicatie!"
- search_for: "Caută {{name}}"
+ search_for: "Caută <%= name %>"
show_more: "arată mai mult"
tags:
- wasnt_that_interesting: "Bine, presupun ca #{{tagName}} nu a fost chiar atat de interesant..."
+ wasnt_that_interesting: "Bine, presupun ca #<%= tagName %> nu a fost chiar atat de interesant..."
timeago:
day: "o zi"
days: "%d zile"
@@ -66,6 +66,6 @@ ro:
years: "%d ani"
videos:
unknown: "Format de video necunoscut"
- watch: "Vizualizează acest video pe {{provider}}"
+ watch: "Vizualizează acest video pe <%= provider %>"
web_sockets:
disconnected: "Websocket-ul e închis; posturile nu vor mai fi transmise în direct."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.ru.yml b/config/locales/javascript/javascript.ru.yml
index f724bc75a..110da0cb6 100644
--- a/config/locales/javascript/javascript.ru.yml
+++ b/config/locales/javascript/javascript.ru.yml
@@ -9,16 +9,16 @@ ru:
aspect_dropdown:
add_to_aspect: "Добавить контакт"
all_aspects: "Все аспекты"
- error: "Невозможно начать делиться с пользователем {{name}}. Возможно, вы его заблокировали?"
+ error: "Невозможно начать делиться с пользователем <%= name %>. Возможно, вы его заблокировали?"
select_aspects: "Выбрать аспекты"
- started_sharing_with: "Вы начали делиться с {{name}}!"
- stopped_sharing_with: "Вы перестали делиться с {{name}}."
+ started_sharing_with: "Вы начали делиться с <%= name %>!"
+ stopped_sharing_with: "Вы перестали делиться с <%= name %>."
toggle:
- few: "В {{count}} аспектах"
- many: "В {{count}} аспектах"
- one: "В {{count}} аспекте"
- other: "В {{count}} аспектах"
- two: "В {{count}} аспектах"
+ few: "В <%= count %> аспектах"
+ many: "В <%= count %> аспектах"
+ one: "В <%= count %> аспекте"
+ other: "В <%= count %> аспектах"
+ two: "В <%= count %> аспектах"
zero: "Выбрать аспекты"
aspect_navigation:
deselect_all: "Выключить все"
@@ -32,7 +32,7 @@ ru:
failed_to_post_message: "Не удалось отправить сообщение!"
getting_started:
alright_ill_wait: "Хорошо, я подожду."
- hey: "Привет, {{name}}!"
+ hey: "Привет, <%= name %>!"
no_tags: "Вы не следите ни за одной меткой! Все равно продолжить?"
preparing_your_stream: "Подготовка вашего личного потока..."
infinite_scroll:
@@ -45,10 +45,10 @@ ru:
public: "Публичная - ваша запись будет видна всем, включая поисковые системы"
reshares:
duplicate: "Настолько круто, да? Вы уже поделились этой записью!"
- search_for: "Искать {{name}}"
+ search_for: "Искать <%= name %>"
show_more: "показать больше"
tags:
- wasnt_that_interesting: "Что ж, видимо, метка #{{tagName}} была не такой уж интересной..."
+ wasnt_that_interesting: "Что ж, видимо, метка #<%= tagName %> была не такой уж интересной..."
timeago:
day: день
days: "%d дней[-я]"
@@ -66,6 +66,6 @@ ru:
years: "%d лет"
videos:
unknown: "Неизвестный видеоформат"
- watch: "Смотреть это видео на {{provider}}"
+ watch: "Смотреть это видео на <%= provider %>"
web_sockets:
disconnected: "WebSocket закрыт; сообщения больше не будут транслироваться в прямом эфире."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.sk.yml b/config/locales/javascript/javascript.sk.yml
index 8f8714995..b05e1c7ac 100644
--- a/config/locales/javascript/javascript.sk.yml
+++ b/config/locales/javascript/javascript.sk.yml
@@ -9,16 +9,16 @@ sk:
aspect_dropdown:
add_to_aspect: "Pridať kontakt"
all_aspects: "Všetky kategórie"
- error: "Nemôžete sa začať deliť s použ. {{name}}. Neignorujete ho (ju)?"
+ error: "Nemôžete sa začať deliť s použ. <%= name %>. Neignorujete ho (ju)?"
select_aspects: "Vyberte si kategórie"
- started_sharing_with: "Začali ste sa deliť s použ. {{name}}!"
- stopped_sharing_with: "Prestali ste sa deliť s použ. {{name}}."
+ started_sharing_with: "Začali ste sa deliť s použ. <%= name %>!"
+ stopped_sharing_with: "Prestali ste sa deliť s použ. <%= name %>."
toggle:
- few: "V(o) {{count}} kategóriách"
- many: "V(o) {{count}} kategóriách"
- one: "V {{count}} kategórii"
- other: "V(o) {{count}} kategóriách"
- two: "V(o) {{count}} kategóriách"
+ few: "V(o) <%= count %> kategóriách"
+ many: "V(o) <%= count %> kategóriách"
+ one: "V <%= count %> kategórii"
+ other: "V(o) <%= count %> kategóriách"
+ two: "V(o) <%= count %> kategóriách"
zero: "Vyberte si kategórie"
aspect_navigation:
deselect_all: "Odznačiť všetky"
@@ -32,7 +32,7 @@ sk:
failed_to_post_message: "Správu sa nepodarilo poslať!"
getting_started:
alright_ill_wait: "V poriadku, počkám."
- hey: "Hej, {{name}}!"
+ hey: "Hej, <%= name %>!"
no_tags: "Hej, nesledujete žiadne značky! Chcete aj tak pokračovať?"
preparing_your_stream: "Pripravuje sa vaša upravená nástenka..."
infinite_scroll:
@@ -45,10 +45,10 @@ sk:
public: "Verejný - váš príspevok pomocou vyhľadávačov uvidí a nájde každý"
reshares:
duplicate: "To je dobré, čo? Tento príspevok ste už raz znova zdieľali!"
- search_for: "Hľadať {{name}}"
+ search_for: "Hľadať <%= name %>"
show_more: "Zobraziť viac"
tags:
- wasnt_that_interesting: "Dobre, značka #{{tagName}} asi nebola veľmi zaujímavá..."
+ wasnt_that_interesting: "Dobre, značka #<%= tagName %> asi nebola veľmi zaujímavá..."
timeago:
day: včera
days: "pred %d dňami"
@@ -65,6 +65,6 @@ sk:
years: "pred %d rokmi"
videos:
unknown: "Neznámy typ videa"
- watch: "Pozrite sa na toto video na sieti {{provider}}"
+ watch: "Pozrite sa na toto video na sieti <%= provider %>"
web_sockets:
disconnected: "Webová zásuvka (websocket) je odpojená; príspevky sa už viac nebudú spracúvať v reálnom čase."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.sl.yml b/config/locales/javascript/javascript.sl.yml
index 0433fb0d0..d0636238b 100644
--- a/config/locales/javascript/javascript.sl.yml
+++ b/config/locales/javascript/javascript.sl.yml
@@ -9,16 +9,16 @@ sl:
aspect_dropdown:
add_to_aspect: "Dodaj stik"
all_aspects: "Vsi pogledi"
- error: "Ne morem začeti deliti s {{name}}. Ali ste jih ignorirali?"
+ error: "Ne morem začeti deliti s <%= name %>. Ali ste jih ignorirali?"
select_aspects: "Izberi poglede"
- started_sharing_with: "Začeli ste deliti z {{name}}!"
- stopped_sharing_with: "Prenehali ste deliti z {{name}}."
+ started_sharing_with: "Začeli ste deliti z <%= name %>!"
+ stopped_sharing_with: "Prenehali ste deliti z <%= name %>."
toggle:
- few: "V {{count}} pogledih"
- many: "V {{count}} pogledih"
- one: "V {{count}} pogledu"
- other: "V {{count}} pogledih"
- two: "V {{count}} pogledih"
+ few: "V <%= count %> pogledih"
+ many: "V <%= count %> pogledih"
+ one: "V <%= count %> pogledu"
+ other: "V <%= count %> pogledih"
+ two: "V <%= count %> pogledih"
zero: "Izberi pogled"
aspect_navigation:
deselect_all: "Označi nič"
@@ -32,7 +32,7 @@ sl:
failed_to_post_message: "Objava ni uspela!"
getting_started:
alright_ill_wait: "V redu, bom počakal."
- hey: "Hej, {{name}}!"
+ hey: "Hej, <%= name %>!"
no_tags: "Hej, niste sledili nobeni oznaki! Vseeno nadaljuj?"
preparing_your_stream: "Pripravljanje vašega osebnega toka ..."
infinite_scroll:
@@ -45,10 +45,10 @@ sl:
public: "Javno - Vaša objava bo vidna vsem, prikazana bo tudi v spletnih iskalnikih"
reshares:
duplicate: "To objavo ste že ponovno delili"
- search_for: "Išči {{name}}"
+ search_for: "Išči <%= name %>"
show_more: "pokaži več"
tags:
- wasnt_that_interesting: "Vredu, mislim, da zaznamek #{{tagName}} ni bil tako zanimiv ..."
+ wasnt_that_interesting: "Vredu, mislim, da zaznamek #<%= tagName %> ni bil tako zanimiv ..."
timeago:
day: včeraj
days: "pred %d dnem"
@@ -65,6 +65,6 @@ sl:
years: "pred %d leti"
videos:
unknown: "Neznan tip videa"
- watch: "Glej ta video na {{provider}}"
+ watch: "Glej ta video na <%= provider %>"
web_sockets:
disconnected: "Ta spletni vtič je zaprt; objave se ne bodo več prenašale v živo."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.sv.yml b/config/locales/javascript/javascript.sv.yml
index 2a156b540..27c84bdcf 100644
--- a/config/locales/javascript/javascript.sv.yml
+++ b/config/locales/javascript/javascript.sv.yml
@@ -9,16 +9,16 @@ sv:
aspect_dropdown:
add_to_aspect: "Lägg till kontakt"
all_aspects: "Alla aspekter"
- error: "Det går inte att börja dela med {{name}}. Ignorerar du dem?"
+ error: "Det går inte att börja dela med <%= name %>. Ignorerar du dem?"
select_aspects: "Välj aspekter"
- started_sharing_with: "Du har börjat dela med {{name}}!"
- stopped_sharing_with: "Du har slutat dela med {{name}}."
+ started_sharing_with: "Du har börjat dela med <%= name %>!"
+ stopped_sharing_with: "Du har slutat dela med <%= name %>."
toggle:
- few: "I {{count}} aspekter"
- many: "I {{count}} aspekter"
- one: "I {{count}} aspekt"
- other: "I {{count}} aspekter"
- two: "I {{count}} aspekter"
+ few: "I <%= count %> aspekter"
+ many: "I <%= count %> aspekter"
+ one: "I <%= count %> aspekt"
+ other: "I <%= count %> aspekter"
+ two: "I <%= count %> aspekter"
zero: "Välj aspekter"
aspect_navigation:
deselect_all: "Visa ingen"
@@ -32,7 +32,7 @@ sv:
failed_to_post_message: "Misslyckades att posta meddelande!"
getting_started:
alright_ill_wait: "Okej, jag väntar."
- hey: "Hej, {{name}}!"
+ hey: "Hej, <%= name %>!"
no_tags: "Du, du följer ju inte några taggar! Vill du fortsätta ändå?"
preparing_your_stream: "Förbereder din personliga ström..."
infinite_scroll:
@@ -45,10 +45,10 @@ sv:
public: "Publikt - ditt inlägg visas för alla och i söktjänster"
reshares:
duplicate: "Du gillar detta va? Du har nämligen redan spridit detta inlägg vidare!"
- search_for: "Sök efter {{name}}"
+ search_for: "Sök efter <%= name %>"
show_more: "visa mer"
tags:
- wasnt_that_interesting: "OK, jag antar att #{{tagName}} inte var så intressant..."
+ wasnt_that_interesting: "OK, jag antar att #<%= tagName %> inte var så intressant..."
timeago:
day: "en dag"
days: "%d dagar"
@@ -67,6 +67,6 @@ sv:
years: "%d år"
videos:
unknown: "Okänd videotyp"
- watch: "Se den här videon på {{provider}}"
+ watch: "Se den här videon på <%= provider %>"
web_sockets:
disconnected: "WebSocketen är stängd; inlägg kommer inte längre att bli direktstreamade."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.te.yml b/config/locales/javascript/javascript.te.yml
index c591b0dd4..0d1dc0a6c 100644
--- a/config/locales/javascript/javascript.te.yml
+++ b/config/locales/javascript/javascript.te.yml
@@ -8,11 +8,11 @@ te:
javascripts:
aspect_dropdown:
toggle:
- few: "In {{count}} aspects"
- many: "In {{count}} aspects"
- one: "In {{count}} aspect"
- other: "In {{count}} aspects"
- two: "In {{count}} aspects"
+ few: "In <%= count %> aspects"
+ many: "In <%= count %> aspects"
+ one: "In <%= count %> aspect"
+ other: "In <%= count %> aspects"
+ two: "In <%= count %> aspects"
zero: "Select aspects"
aspect_navigation:
select_all: "అన్నిటినీ ఎంచుకో"
@@ -20,12 +20,12 @@ te:
hide: "వ్యాఖ్యలను దాచు"
show: "అన్ని వ్యాఖ్యలను చూపించు"
getting_started:
- hey: "ఓయ్, {{name}}!"
+ hey: "ఓయ్, <%= name %>!"
infinite_scroll:
no_more: "ఇంక టపాలు లేవు."
reshares:
duplicate: "ఓహో, అది బాగుందా? ఆ టపాని మీరు ఇప్పటికే పంచుకున్నారు!"
- search_for: "{{name}} కోసం వెతకండి"
+ search_for: "<%= name %> కోసం వెతకండి"
show_more: "మరిన్ని చూపించు"
timeago:
day: "ఒక రోజు"
@@ -42,4 +42,4 @@ te:
year: "దాదాపు సంవత్సరం"
years: "%d సంవత్సరాల"
videos:
- watch: "ఈ వీడియోని {{provider}}లో చూడండి"
\ No newline at end of file
+ watch: "ఈ వీడియోని <%= provider %>లో చూడండి"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.tr.yml b/config/locales/javascript/javascript.tr.yml
index 5a9d1ed19..3c3232578 100644
--- a/config/locales/javascript/javascript.tr.yml
+++ b/config/locales/javascript/javascript.tr.yml
@@ -11,14 +11,14 @@ tr:
all_aspects: "Tüm yönler"
error: "{{name}} ile paylaşım başlatılamadı. Onu yasaklamış olmayasınız?"
select_aspects: "Yönleri seç"
- started_sharing_with: "{{name}} sizinle paylaşıma başladı!"
- stopped_sharing_with: "{{name}} sizinle paylaşımı durdurdu."
+ started_sharing_with: "<%= name %> sizinle paylaşıma başladı!"
+ stopped_sharing_with: "<%= name %> sizinle paylaşımı durdurdu."
toggle:
- few: "{{count}} yön"
- many: "{{count}} yön"
- one: "{{count}} yön"
- other: "{{count}} yön"
- two: "{{count}} yön"
+ few: "<%= count %> yön"
+ many: "<%= count %> yön"
+ one: "<%= count %> yön"
+ other: "<%= count %> yön"
+ two: "<%= count %> yön"
zero: "Yön seç"
aspect_navigation:
deselect_all: "Tümünü kaldır"
@@ -32,7 +32,7 @@ tr:
failed_to_post_message: "Gönderi başarısız oldu!"
getting_started:
alright_ill_wait: "Tamam, ben bekleyeceğim."
- hey: "Merhaba, {{name}}!"
+ hey: "Merhaba, <%= name %>!"
no_tags: "Hey, hiç etiket takip etmiyorsunuz! Gerçekten devam etmek istiyor musun?"
preparing_your_stream: "Kişiselleştirilmiş akışınız hazırlanıyor..."
infinite_scroll:
@@ -45,10 +45,10 @@ tr:
public: "Genel - gönderi herkes tarafından görünür ve arama motorları tarafından bulunur olacak"
reshares:
duplicate: "Bu iyi, değil mi? Zaten bu gönderiyi tekrar paylaştın!"
- search_for: "{{name}} Ara"
+ search_for: "<%= name %> Ara"
show_more: "daha fazlasını göster"
tags:
- wasnt_that_interesting: "Tamam, benim #{{tagName}} o kadar da ilginç değil..."
+ wasnt_that_interesting: "Tamam, benim #<%= tagName %> o kadar da ilginç değil..."
timeago:
day: "1 gün"
days: "%d gün"
@@ -67,6 +67,6 @@ tr:
years: "%d yıl"
videos:
unknown: "Bilinmeyen video tipi"
- watch: "Bu videoyu {{provider}}'da izle"
+ watch: "Bu videoyu <%= provider %>'da izle"
web_sockets:
disconnected: "Websocket kapalı; gönderiler bundan sonra canlı akış olacak."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.uk.yml b/config/locales/javascript/javascript.uk.yml
index b1e890c5e..b311a9325 100644
--- a/config/locales/javascript/javascript.uk.yml
+++ b/config/locales/javascript/javascript.uk.yml
@@ -9,16 +9,16 @@ uk:
aspect_dropdown:
add_to_aspect: "Додати контакт"
all_aspects: "Усі аспекти"
- error: "Неможливо почати ділитися з користувачем {{name}}. Можливо, ви його заблокували?"
+ error: "Неможливо почати ділитися з користувачем <%= name %>. Можливо, ви його заблокували?"
select_aspects: "Вибрати аспекти"
- started_sharing_with: "Ви почали ділитися з {{name}}!"
- stopped_sharing_with: "Ви перестали ділитися з {{name}}."
+ started_sharing_with: "Ви почали ділитися з <%= name %>!"
+ stopped_sharing_with: "Ви перестали ділитися з <%= name %>."
toggle:
- few: "У {{count}} аспектах"
- many: "У {{count}} аспектах"
- one: "У {{count}} аспектах"
- other: "У {{count}} аспектах"
- two: "У {{count}} аспектах"
+ few: "У <%= count %> аспектах"
+ many: "У <%= count %> аспектах"
+ one: "У <%= count %> аспектах"
+ other: "У <%= count %> аспектах"
+ two: "У <%= count %> аспектах"
zero: "Вибрати аспекти"
aspect_navigation:
deselect_all: "Відмінити всі"
@@ -32,7 +32,7 @@ uk:
failed_to_post_message: "Не вдалося відправити повідомлення!"
getting_started:
alright_ill_wait: "Добре, я почекаю."
- hey: "Привіт, {{name}}!"
+ hey: "Привіт, <%= name %>!"
no_tags: "Ви не стежите ні за однією міткою! Все одно продовжити?"
preparing_your_stream: "Підготовка вашого особистого потоку..."
infinite_scroll:
@@ -45,10 +45,10 @@ uk:
public: "Публічна - ваш запис буде видний усім, включаючи пошукові системи"
reshares:
duplicate: "Настільки круто, так? Ви вже поділилися цим записом!"
- search_for: "Шукати {{name}}"
+ search_for: "Шукати <%= name %>"
show_more: "показати більше"
tags:
- wasnt_that_interesting: "OK, мабуть, стежити за міткою #{{tagName}} було не так вже цікаво..."
+ wasnt_that_interesting: "OK, мабуть, стежити за міткою #<%= tagName %> було не так вже цікаво..."
timeago:
day: день
days: "%d днів[-я]"
@@ -67,6 +67,6 @@ uk:
years: "%d років"
videos:
unknown: "Невідомий відеоформат"
- watch: "Дивитися це відео на {{provider}}"
+ watch: "Дивитися це відео на <%= provider %>"
web_sockets:
disconnected: "WebSocket закритий; повідомлення більше не транслюватимуться в прямому ефірі."
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.vi.yml b/config/locales/javascript/javascript.vi.yml
index 7f75125b8..4250dc50a 100644
--- a/config/locales/javascript/javascript.vi.yml
+++ b/config/locales/javascript/javascript.vi.yml
@@ -9,16 +9,16 @@ vi:
aspect_dropdown:
add_to_aspect: "Thêm liên lạc"
all_aspects: "Tất cả mối quan hệ"
- error: "Không thể bắt đầu chia sẻ với {{name}}. Bạn có bỏ qua họ?"
+ error: "Không thể bắt đầu chia sẻ với <%= name %>. Bạn có bỏ qua họ?"
select_aspects: "Chọn mối quan hệ"
- started_sharing_with: "Bạn đã bắt đầu chia sẻ với {{name}}!"
- stopped_sharing_with: "Bạn đã ngưng chia sẻ với {{name}}."
+ started_sharing_with: "Bạn đã bắt đầu chia sẻ với <%= name %>!"
+ stopped_sharing_with: "Bạn đã ngưng chia sẻ với <%= name %>."
toggle:
- few: "Trong {{count}} mối quan hệ"
- many: "Trong {{count}} mối quan hệ"
- one: "Trong {{count}} mối quan hệ"
- other: "Trong {{count}} mối quan hệ"
- two: "Trong {{count}} mối quan hệ"
+ few: "Trong <%= count %> mối quan hệ"
+ many: "Trong <%= count %> mối quan hệ"
+ one: "Trong <%= count %> mối quan hệ"
+ other: "Trong <%= count %> mối quan hệ"
+ two: "Trong <%= count %> mối quan hệ"
zero: "Chọn mối quan hệ"
aspect_navigation:
deselect_all: "Bỏ chọn tất cả"
@@ -31,7 +31,7 @@ vi:
failed_to_post_message: "Đăng tin thất bại!"
getting_started:
alright_ill_wait: "Được rồi, tôi sẽ chờ."
- hey: "Này, {{name}}!"
+ hey: "Này, <%= name %>!"
no_tags: "Bạn chưa theo dõi thẻ nào cả! Tiếp tục?"
preparing_your_stream: "Preparing your personialized stream..."
photo_uploader:
@@ -42,7 +42,7 @@ vi:
public: "Công khai - tin của bạn được mọi người và máy tìm kiếm nhìn thấy"
reshares:
duplicate: "Bạn đã chia sẻ lại tin đó!"
- search_for: "Tìm {{name}}"
+ search_for: "Tìm <%= name %>"
show_more: "hiện thêm"
timeago:
day: "một ngày"
@@ -60,4 +60,4 @@ vi:
years: "%d năm"
videos:
unknown: "Chưa biết kiểu video"
- watch: "Xem video này trên {{provider}}"
\ No newline at end of file
+ watch: "Xem video này trên <%= provider %>"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.zh-CN.yml b/config/locales/javascript/javascript.zh-CN.yml
index 1f83e4c22..075ac57b8 100644
--- a/config/locales/javascript/javascript.zh-CN.yml
+++ b/config/locales/javascript/javascript.zh-CN.yml
@@ -9,11 +9,11 @@ zh-CN:
aspect_dropdown:
add_to_aspect: 添加到视图
toggle:
- few: "在{{count}}个视图中"
- many: "在{{count}}个视图中"
- one: "在{{count}}个视图中"
- other: "在{{count}}个视图中"
- two: "In {{count}} aspects"
+ few: "在<%= count %>个视图中"
+ many: "在<%= count %>个视图中"
+ one: "在<%= count %>个视图中"
+ other: "在<%= count %>个视图中"
+ two: "In <%= count %> aspects"
zero: 添加到视图
comments:
hide: 隐藏评论
@@ -29,7 +29,7 @@ zh-CN:
at_least_one_aspect: 发布时请选择至少一个情景
reshares:
duplicate: "You've already reshared that post!"
- search_for: "搜索 {{name}}"
+ search_for: "搜索 <%= name %>"
show_more: 查看更多
timeago:
day: 1天
@@ -47,6 +47,6 @@ zh-CN:
years: "%d年"
videos:
unknown: 未知视频格式
- watch: "在 {{provider}} 上看观看视频"
+ watch: "在 <%= provider %> 上看观看视频"
web_sockets:
disconnected: websocket已关闭,内容不会再实时更新。
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.zh-TW.yml b/config/locales/javascript/javascript.zh-TW.yml
index cf891c33c..78e1dfb02 100644
--- a/config/locales/javascript/javascript.zh-TW.yml
+++ b/config/locales/javascript/javascript.zh-TW.yml
@@ -9,16 +9,16 @@ zh-TW:
aspect_dropdown:
add_to_aspect: 加聯絡人
all_aspects: 所有面向
- error: "無法開始和 {{name}} 分享. 你還在忽視他們嗎?"
+ error: "無法開始和 <%= name %> 分享. 你還在忽視他們嗎?"
select_aspects: 選面向
- started_sharing_with: "你開始和 {{name}} 分享了!"
- stopped_sharing_with: "你停止和 {{name}} 分享了."
+ started_sharing_with: "你開始和 <%= name %> 分享了!"
+ stopped_sharing_with: "你停止和 <%= name %> 分享了."
toggle:
- few: "在{{count}}個面向中"
- many: "在{{count}}個面向中"
- one: "在{{count}}個面向中"
- other: "在{{count}}個面向中"
- two: "在{{count}}個面向中"
+ few: "在<%= count %>個面向中"
+ many: "在<%= count %>個面向中"
+ one: "在<%= count %>個面向中"
+ other: "在<%= count %>個面向中"
+ two: "在<%= count %>個面向中"
zero: 選面向
aspect_navigation:
deselect_all: 全不選
@@ -32,7 +32,7 @@ zh-TW:
failed_to_post_message: 貼文失敗!
getting_started:
alright_ill_wait: "好吧, 以後再說."
- hey: "嘿, {{name}}!"
+ hey: "嘿, <%= name %>!"
no_tags: "嘿, 你還沒有追蹤任何標籤! 要往下一步嗎?"
preparing_your_stream: 整理你個人的流水帳中...
infinite_scroll:
@@ -45,10 +45,10 @@ zh-TW:
public: "公開 - 所有人都能看到你的貼文, 包括搜尋引擎"
reshares:
duplicate: "很棒對吧? 你已經轉貼過該篇貼文了!"
- search_for: "搜尋 {{name}}"
+ search_for: "搜尋 <%= name %>"
show_more: 顯示更多
tags:
- wasnt_that_interesting: "OK, 我想 #{{tagName}} 大概沒那麼有趣..."
+ wasnt_that_interesting: "OK, 我想 #<%= tagName %> 大概沒那麼有趣..."
timeago:
day: 一天
days: "%d天"
@@ -67,6 +67,6 @@ zh-TW:
years: "%d年"
videos:
unknown: 不明的影片類別
- watch: "從 {{provider}} 看這部影片"
+ watch: "從 <%= provider %> 看這部影片"
web_sockets:
disconnected: "Websocket 已斷線; 貼文不會再即時更新了."
\ No newline at end of file
diff --git a/features/comments.feature b/features/comments.feature
index df0509574..74c7feb0d 100644
--- a/features/comments.feature
+++ b/features/comments.feature
@@ -40,7 +40,7 @@ Feature: commenting
Then I should see "hahaha" within "li.comment div.content"
And I should see "less than a minute ago" within "li.comment time"
- Scenario: delete a comment
+ Scenario: delete a comment
When I sign in as "bob@bob.bob"
And I am on "alice@alice.alice"'s page
Then I should see "Look at this dog"
@@ -48,7 +48,7 @@ Feature: commenting
And I fill in "Comment" with "is that a poodle?"
And I press "Comment"
And I wait for the ajax to finish
- When I hover over the ".comment.posted"
+ When I hover over the ".comment"
And I preemptively confirm the alert
And I click to delete the first comment
And I wait for the ajax to finish
@@ -66,7 +66,7 @@ Feature: commenting
Then the first comment field should be closed
When I focus the comment field
Then the first comment field should be open
-
+
Scenario: comment on a status show page
When I sign in as "bob@bob.bob"
And I am on "alice@alice.alice"'s page
diff --git a/features/connects_users.feature b/features/connects_users.feature
index 78889f72d..4faee4641 100644
--- a/features/connects_users.feature
+++ b/features/connects_users.feature
@@ -1,7 +1,7 @@
@javascript
Feature: following and being followed
- Background:
+ Background:
Given a user with email "bob@bob.bob"
And a user with email "alice@alice.alice"
@@ -14,7 +14,7 @@ Feature: following and being followed
And I fill in "status_message_fake_text" with "I am following you"
And I press "Share"
Then I go to the destroy user session page
-
+
Scenario: seeing a follower's posts on their profile page, but not in your stream
When I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
@@ -89,15 +89,15 @@ Feature: following and being followed
Then I should see "Besties"
Then I should see "Mention"
- Then I should not see "Message"
+ Then I should not see "Message" within "#profile"
Scenario: interacting with the profile page of someone who follows you but who you do not follow
Given I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
Then I should see "Add contact"
- And I should not see "Mention"
- And I should not see "Message"
+ Then I should not see "Mention" within "#profile"
+ Then I should not see "Message" within "#profile"
Scenario: interacting with the profile page of someone you follow who also follows you
Given I sign in as "alice@alice.alice"
diff --git a/features/follows_tags.feature b/features/follows_tags.feature
index 8e289a8f5..01f09e88f 100644
--- a/features/follows_tags.feature
+++ b/features/follows_tags.feature
@@ -10,7 +10,6 @@ Feature: posting
When I sign in as "bob@bob.bob"
And I post a status with the text "I am da #boss"
- And I am on the home page
When I go to the destroy user session page
And I sign in as "alice@alice.alice"
And I search for "#boss"
@@ -29,13 +28,12 @@ Feature: posting
Then I should see "I am da #boss" within "body"
Scenario: can stop following a tag from the tag page
- When I hover over the ".button.tag_following"
- And I press "Following #boss"
- And I go to the home page
+ When I press "Following #boss"
+ And I go to the tag_followings page
Then I should not see "#boss" within ".left_nav"
Scenario: can stop following a tag from the homepage
- When I go to the home page
+ When I go to the tag_followings page
And I preemptively confirm the alert
And I hover over the "li.unfollow#tag-following-boss"
And I follow "unfollow_boss"
diff --git a/features/infinite_scroll.feature b/features/infinite_scroll.feature
deleted file mode 100644
index ccab29ae2..000000000
--- a/features/infinite_scroll.feature
+++ /dev/null
@@ -1,40 +0,0 @@
-@javascript
-Feature: infinite scroll
- In order to browse without disruption
- As medium-sized internet grazing animal
- I want the stream to infinite scroll
-
- Background:
- Given many posts from alice for bob
- And I resize my window to 800x600
- And I sign in as "bob@bob.bob"
- And I follow "Your Aspects"
- And I wait for the ajax to finish
-
- Scenario: on the main stream
- When I go to the home page
- And I wait for the ajax to finish
- Then I should see 15 posts
- And I should see "alice - 15 - #seeded"
-
- When I scroll down
- Then I should see 30 posts
- And I should see "alice - 30 - #seeded"
-
- Scenario: On a tag page
- When I go to the tag page for "seeded"
- Then I should see 15 posts
- And I should see "alice - 15 - #seeded"
-
- When I scroll down
- Then I should see 30 posts
- And I should see "alice - 30 - #seeded"
-
- Scenario: On a profile page
- And I am on "alice@alice.alice"'s page
- Then I should see 15 posts
- And I should see "alice - 15 - #seeded"
-
- When I scroll down
- Then I should see 30 posts
- And I should see "alice - 30 - #seeded"
diff --git a/features/manages_aspects.feature b/features/manages_aspects.feature
index f369f84d4..a67d0015d 100644
--- a/features/manages_aspects.feature
+++ b/features/manages_aspects.feature
@@ -14,6 +14,7 @@ Feature: User manages contacts
Scenario: creating an aspect from homepage
Given I am signed in
+ And I go to the aspects page
When I follow "Add an aspect"
And I fill in "Name" with "losers" in the modal window
And I press "Create" in the modal window
@@ -34,7 +35,7 @@ Feature: User manages contacts
Scenario: deleting an aspect from homepage
Given I am signed in
And I have an aspect called "People"
- When I am on the home page
+ When I am on the aspects page
And I click on "People" aspect edit icon
And I wait for the ajax to finish
And I preemptively confirm the alert
@@ -77,14 +78,6 @@ Feature: User manages contacts
When I follow "Contacts"
Then I should see "Community Spotlight" within ".span-18"
- Scenario: clicking on the manage aspects link in the right nav with zero contacts directs a user to the featured users page
- Given I am signed in
- And I have 0 contacts
- And I am on the home page
-
- When I follow "Manage your aspects."
- Then I should see "Community Spotlight" within ".span-18"
-
Scenario: clicking on the contacts link in the header with contacts does not send a user to the featured users page
Given I am signed in
And I have 2 contacts
diff --git a/features/notifications.feature b/features/notifications.feature
index 8677685a2..850a42914 100644
--- a/features/notifications.feature
+++ b/features/notifications.feature
@@ -14,7 +14,7 @@ Feature: Notifications
And I add the person to my "Besties" aspect
And I go to the destroy user session page
When I sign in as "alice@alice.alice"
- And I follow "notification" in the header
+ And I follow "Notifications" in the header
And I wait for the ajax to finish
Then the notification dropdown should be visible
Then I should see "started sharing with you"
@@ -32,10 +32,10 @@ Feature: Notifications
And I wait for the ajax to finish
And I go to the destroy user session page
When I sign in as "alice@alice.alice"
- And I follow "notification" in the header
- And I wait for the ajax to finish
+ And I follow "Notifications" in the header
+ #And I wait for the ajax to finish
Then the notification dropdown should be visible
- And I wait for the ajax to finish
+ #And I wait for the ajax to finish
Then I should see "reshared your post"
And I should have 1 email delivery
@@ -49,7 +49,7 @@ Feature: Notifications
And I wait for the ajax to finish
And I go to the destroy user session page
When I sign in as "alice@alice.alice"
- And I follow "notification" in the header
+ And I follow "Notifications" in the header
And I wait for the ajax to finish
Then the notification dropdown should be visible
And I wait for the ajax to finish
@@ -67,7 +67,7 @@ Feature: Notifications
And I wait for the ajax to finish
And I go to the destroy user session page
When I sign in as "alice@alice.alice"
- And I follow "notification" in the header
+ And I follow "Notifications" in the header
And I wait for the ajax to finish
Then the notification dropdown should be visible
And I wait for the ajax to finish
@@ -78,7 +78,7 @@ Feature: Notifications
Given a user with email "bob@bob.bob" is connected with "alice@alice.alice"
And Alice has a post mentioning Bob
When I sign in as "bob@bob.bob"
- And I follow "notification" in the header
+ And I follow "Notifications" in the header
And I wait for the ajax to finish
Then the notification dropdown should be visible
And I wait for the ajax to finish
diff --git a/features/posts_from_main_page.feature b/features/posts_from_main_page.feature
index 41bcddf12..c749c2a24 100644
--- a/features/posts_from_main_page.feature
+++ b/features/posts_from_main_page.feature
@@ -75,7 +75,6 @@ Feature: posting from the main page
And I click to delete the first uploaded photo
And I wait for the ajax to finish
Then I should not see an uploaded image within the photo drop zone
- And the publisher should be collapsed
Scenario: back out of uploading a picture to a post with text
Given I expand the publisher
@@ -132,24 +131,6 @@ Feature: posting from the main page
And I go to the aspects page
Then I should not see "I am eating a yogurt"
- Scenario: change aspects in the middle of the post writing
- When I select only "NotPostingThingsHere" aspect
- And I expand the publisher
- And I fill in "status_message_fake_text" with "I am eating a yogurt"
- And I follow "PostingTo" within "#aspect_nav"
- And I follow "NotPostingThingsHere" within "#aspect_nav"
- And I wait for the ajax to finish
- Then the publisher should be expanded
- When I append " and also cornflakes" to the publisher
- And I press "Share"
- And I wait for the ajax to finish
- And I am on the aspects page
- And I select only "PostingTo" aspect
- Then I should see "I am eating a yogurt and also cornflakes"
- When I am on the aspects page
- And I select only "NotPostingThingsHere" aspect
- Then I should not see "I am eating a yogurt and also cornflakes"
-
Scenario: change post target aspects with the aspect-dropdown before posting
When I expand the publisher
And I press the aspect dropdown
@@ -193,16 +174,14 @@ Feature: posting from the main page
Then I should not see "I am eating a yogurt"
Then I should not see "And cornflakes also"
+ # (NOTE) make this a jasmine spec
Scenario: reject deletion one of my posts
When I expand the publisher
And I fill in "status_message_fake_text" with "I am eating a yogurt"
And I press "Share"
And I wait for the ajax to finish
- When I click the aspects title
And I hover over the ".stream_element"
And I preemptively reject the alert
And I click to delete the first post
Then I should see "I am eating a yogurt"
- And I should see first post deletion link
- And I should not see ajax loader on deletion link place
diff --git a/features/reshare.feature b/features/reshare.feature
index 7b606be8c..9fdbf8e2f 100644
--- a/features/reshare.feature
+++ b/features/reshare.feature
@@ -9,11 +9,8 @@ Feature: public repost
And a user named "Alice Smith" with email "alice@alice.alice"
And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
- Scenario: I don't see the reshare button on other people's private posts
- Given "bob@bob.bob" has a non public post with text "don't reshare this."
- And I sign in as "alice@alice.alice"
- Then I should not see "Reshare"
-
+ # should be covered in rspec, so testing that the post is added to
+ # app.stream in jasmine should be enough coverage
Scenario: When I reshare, it shows up on my profile page
Given "bob@bob.bob" has a public post with text "reshare this!"
And I sign in as "alice@alice.alice"
@@ -27,63 +24,3 @@ Feature: public repost
Then I should see "reshare this!"
Then I should see a ".reshare"
And I should see "Bob"
-
- Scenario: When I reshare, it shows up in my stream
- Given "bob@bob.bob" has a public post with text "reshare this!"
- And I sign in as "alice@alice.alice"
- And I preemptively confirm the alert
- And I follow "Reshare"
- And I wait for the ajax to finish
-
- # NOTE(why do we need this to make this work?)
- And I wait for 2 seconds
- And I go to the home page
-
- And I wait for the ajax to finish
- Then I should see a ".reshare"
- And I should see "reshare this!"
- And I should see "Bob"
-
- Scenario: I can delete a post that has been reshared
- Given "bob@bob.bob" has a public post with text "reshare this!"
- And I sign in as "alice@alice.alice"
- And I preemptively confirm the alert
- And I follow "Reshare"
- And I wait for the ajax to finish
-
- # NOTE(why do we need this to make this work?)
- And I wait for 2 seconds
- And I go to the home page
-
- Then I should see a ".reshare"
- And I should see "reshare this!"
- And I should see "Bob"
-
- When I go to the destroy user session page
- And I sign in as "bob@bob.bob"
- And The user deletes their first post
- And I go to the destroy user session page
- And I sign in as "alice@alice.alice"
-
- When I go to the home page
- Then I should see "Original post deleted by author"
-
- Scenario: I can see the number of reshares
- Given "bob@bob.bob" has a public post with text "reshare this!"
- And I sign in as "alice@alice.alice"
- And I wait for the ajax to finish
- And I preemptively confirm the alert
- And I follow "Reshare"
-
- # NOTE(why do we need this to make this work?)
- And I wait for 2 seconds
- When I go to the home page
-
- Then I should see a ".reshare"
- And I should see "reshare this!"
- And I should see "Bob"
-
- # NOTE(why do we need this to make this work?)
- And I wait for 2 seconds
- When I go to the home page
- Then I should see "1 reshare"
diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb
index d09ea99f6..58770a555 100644
--- a/features/step_definitions/aspects_steps.rb
+++ b/features/step_definitions/aspects_steps.rb
@@ -7,6 +7,7 @@ end
When /^I select only "([^"]*)" aspect$/ do |aspect_name|
within('#aspect_nav') do
+ click_link 'Aspects'
click_link 'Select all' if has_link? 'Select all'
end
diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb
index cbb6a0154..98f208e47 100644
--- a/features/step_definitions/custom_web_steps.rb
+++ b/features/step_definitions/custom_web_steps.rb
@@ -66,7 +66,7 @@ When /^I click to delete the first post$/ do
end
When /^I click to delete the first comment$/ do
- page.execute_script('$(".comment.posted").first().find(".comment_delete").click()')
+ page.execute_script('$(".comment").first().find(".comment_delete").click()')
end
When /^I click to delete the first uploaded photo$/ do
@@ -148,12 +148,8 @@ Then /^I should get download alert$/ do
end
When /^I search for "([^\"]*)"$/ do |search_term|
- step "I fill in \"q\" with \"#{search_term}\""
- page.execute_script <<-JS
- var e = jQuery.Event("keypress");
- e.keyCode = 13;
- $("#q").trigger(e);
- JS
+ fill_in "q", :with => search_term
+ find_field("q").native.send_key(:enter)
end
Then /^the "([^"]*)" field(?: within "([^"]*)")? should be filled with "([^"]*)"$/ do |field, selector, value|
@@ -179,8 +175,6 @@ end
And /^I scroll down$/ do
evaluate_script("window.scrollBy(0,3000000)")
- sleep 1
- wait_until(30) { evaluate_script('$("#infscr-loading:visible").length') == 0 }
step "I wait for the ajax to finish"
end
diff --git a/features/tags.feature b/features/tags.feature
index 06cfc8dcc..cf438d97b 100644
--- a/features/tags.feature
+++ b/features/tags.feature
@@ -11,17 +11,3 @@ Feature: Interacting with tags
Then I should be on the tag page for "rockstar"
And I should see "Samuel Beckett"
- Scenario: Searching for a tag keeps the search term in the search field
- When I search for "#rockstar"
- Then I should be on the tag page for "rockstar"
- And the "q" field within "#global_search" should contain "#rockstar"
-
- @wip
- Scenario: adding a contact from a tag page
- When I search for "#rockstar"
- Then I should see "Add to aspect"
-
- When I add the person to my "Besties" aspect
-
- When I search for "#rockstar"
- Then I should see "generic"
diff --git a/lib/stream/base.rb b/lib/stream/base.rb
index 89b24eaba..869c0dab6 100644
--- a/lib/stream/base.rb
+++ b/lib/stream/base.rb
@@ -46,9 +46,11 @@ class Stream::Base
Post.scoped
end
- # @return [ActiveRecord::Relation]
+ # @return [Array]
def stream_posts
- self.posts.for_a_stream(max_time, order, self.user)
+ self.posts.for_a_stream(max_time, order, self.user).tap do |posts|
+ like_posts_for_stream!(posts) #some sql person could probably do this with joins.
+ end
end
# @return [ActiveRecord::Association] AR association of people within stream's given aspects
@@ -63,7 +65,7 @@ class Stream::Base
I18n.translate('aspects.selected_contacts.view_all_contacts')
end
- # @return [String]
+ # @return [String] def contacts_title 'change me in lib/base_stream.rb!'
def contacts_title
'change me in lib/base_stream.rb!'
end
@@ -84,7 +86,7 @@ class Stream::Base
true
end
- #NOTE: MBS bad bad methods the fact we need these means our views are foobared. please kill them and make them
+ #NOTE: MBS bad bad methods the fact we need these means our views are foobared. please kill them and make them
#private methods on the streams that need them
def aspects
user.aspects
@@ -96,7 +98,7 @@ class Stream::Base
end
def aspect_ids
- aspects.map{|x| x.id}
+ aspects.map{|x| x.id}
end
def max_time=(time_string)
@@ -109,7 +111,23 @@ class Stream::Base
@order ||= 'created_at'
end
- private
+ protected
+ # @return [void]
+ def like_posts_for_stream!(posts)
+ return posts unless @user
+
+ likes = Like.where(:author_id => @user.person.id, :target_id => posts.map(&:id), :target_type => "Post")
+
+ like_hash = likes.inject({}) do |hash, like|
+ hash[like.target_id] = like
+ hash
+ end
+
+ posts.each do |post|
+ post.user_like = like_hash[post.id]
+ end
+ end
+
# @return [Hash]
def publisher_opts
{}
diff --git a/public/images/header-bg.png b/public/images/header-bg.png
new file mode 100644
index 000000000..fa7d7d8aa
Binary files /dev/null and b/public/images/header-bg.png differ
diff --git a/public/images/header-logo.png b/public/images/header-logo.png
new file mode 100644
index 000000000..a1a19b83d
Binary files /dev/null and b/public/images/header-logo.png differ
diff --git a/public/images/static-loader.png b/public/images/static-loader.png
new file mode 100644
index 000000000..c0dfc4075
Binary files /dev/null and b/public/images/static-loader.png differ
diff --git a/public/javascripts/app/app.js b/public/javascripts/app/app.js
new file mode 100644
index 000000000..c8d4cc73f
--- /dev/null
+++ b/public/javascripts/app/app.js
@@ -0,0 +1,25 @@
+var app = {
+ collections: {},
+ models: {},
+ views: {},
+
+ user: function(user) {
+ if(user) { return this._user = user; }
+
+ return this._user || {current_user : false};
+ },
+
+ initialize: function() {
+ app.router = new app.Router;
+
+ if(this._user){
+ app.header = new app.views.Header;
+ $("body").prepend(app.header.el);
+ app.header.render();
+ }
+
+ Backbone.history.start({pushState: true});
+ }
+};
+
+$(function() { app.initialize(); });
diff --git a/public/javascripts/app/collections/comments.js b/public/javascripts/app/collections/comments.js
new file mode 100644
index 000000000..03fc518cb
--- /dev/null
+++ b/public/javascripts/app/collections/comments.js
@@ -0,0 +1,3 @@
+app.collections.Comments = Backbone.Collection.extend({
+ model: app.models.Comment
+});
diff --git a/public/javascripts/app/collections/likes.js b/public/javascripts/app/collections/likes.js
new file mode 100644
index 000000000..d576b8e59
--- /dev/null
+++ b/public/javascripts/app/collections/likes.js
@@ -0,0 +1,3 @@
+app.collections.Likes = Backbone.Collection.extend({
+ model: app.models.Like
+});
diff --git a/public/javascripts/app/collections/stream.js b/public/javascripts/app/collections/stream.js
new file mode 100644
index 000000000..70fe1b5da
--- /dev/null
+++ b/public/javascripts/app/collections/stream.js
@@ -0,0 +1,21 @@
+app.collections.Stream = Backbone.Collection.extend({
+ url: function() {
+ var path = document.location.pathname;
+
+ if(this.models.length) {
+ path += "?max_time=" + _.last(this.models).createdAt();
+ }
+
+ return path;
+ },
+
+ model: app.models.Post,
+
+ parse: function(resp){
+ return resp.posts;
+ },
+
+ comparator : function(post) {
+ return -post.createdAt();
+ }
+});
diff --git a/public/javascripts/app/models/block.js b/public/javascripts/app/models/block.js
new file mode 100644
index 000000000..23809dec4
--- /dev/null
+++ b/public/javascripts/app/models/block.js
@@ -0,0 +1,3 @@
+app.models.Block = Backbone.Model.extend({
+ urlRoot : "blocks"
+});
diff --git a/public/javascripts/app/models/comment.js b/public/javascripts/app/models/comment.js
new file mode 100644
index 000000000..c4c35ce71
--- /dev/null
+++ b/public/javascripts/app/models/comment.js
@@ -0,0 +1,3 @@
+app.models.Comment = Backbone.Model.extend({
+ urlRoot: "/comments"
+});
diff --git a/public/javascripts/app/models/like.js b/public/javascripts/app/models/like.js
new file mode 100644
index 000000000..d18d96685
--- /dev/null
+++ b/public/javascripts/app/models/like.js
@@ -0,0 +1,2 @@
+app.models.Like = Backbone.Model.extend({
+})
diff --git a/public/javascripts/app/models/post.js b/public/javascripts/app/models/post.js
new file mode 100644
index 000000000..8a96169f6
--- /dev/null
+++ b/public/javascripts/app/models/post.js
@@ -0,0 +1,58 @@
+app.models.Post = Backbone.Model.extend({
+ initialize : function() {
+ this.comments = new app.collections.Comments(this.get("last_three_comments"));
+ this.comments.url = this.url() + '/comments';
+
+ this.likes = new app.collections.Likes(this.get("user_like")); // load in the user like initially
+ this.likes.url = this.url() + '/likes';
+ },
+
+ url : function() {
+ if(this.id) {
+ return "/posts/" + this.id;
+ } else {
+ return "/posts"
+ }
+ },
+
+ toggleLike : function() {
+ var userLike = this.get("user_like")
+ if(userLike) {
+ this.unlike()
+ } else {
+ this.like()
+ }
+ },
+
+ createdAt : function() {
+ return +new Date(this.get("created_at")) / 1000;
+ },
+
+ baseGuid : function() {
+ if(this.get("root")){
+ return this.get("root").guid;
+ } else {
+ return this.get("guid");
+ }
+ },
+
+ baseAuthor : function() {
+ if(this.get("root")){
+ return this.get("root").author;
+ } else {
+ return this.get("author");
+ }
+ },
+
+ unlike : function() {
+ var likeModel = new app.models.Like(this.get("user_like"));
+ likeModel.url = this.likes.url + "/" + likeModel.id;
+
+ likeModel.destroy();
+ this.set({ user_like : null });
+ },
+
+ like : function() {
+ this.set({ user_like : this.likes.create() });
+ }
+});
diff --git a/public/javascripts/app/models/reshare.js b/public/javascripts/app/models/reshare.js
new file mode 100644
index 000000000..826274aba
--- /dev/null
+++ b/public/javascripts/app/models/reshare.js
@@ -0,0 +1,3 @@
+app.models.Reshare = app.models.Post.extend({
+ url : function() { return "/reshares"; }
+});
diff --git a/public/javascripts/app/models/status_message.js b/public/javascripts/app/models/status_message.js
new file mode 100644
index 000000000..fb73daad4
--- /dev/null
+++ b/public/javascripts/app/models/status_message.js
@@ -0,0 +1,3 @@
+app.models.StatusMessage = app.models.Post.extend({
+ url : function() { return "/status_messages"; }
+});
diff --git a/public/javascripts/app/router.js b/public/javascripts/app/router.js
new file mode 100644
index 000000000..dde392e68
--- /dev/null
+++ b/public/javascripts/app/router.js
@@ -0,0 +1,23 @@
+app.Router = Backbone.Router.extend({
+ routes: {
+ "stream": "stream",
+ "aspects:query": "stream",
+ "comment_stream": "stream",
+ "like_stream": "stream",
+ "mentions": "stream",
+ "people/:id": "stream",
+ "u/:name": "stream",
+ "tag_followings": "stream",
+ "tags/:name": "stream",
+ "posts/:id": "stream"
+ },
+
+ stream : function() {
+ app.stream = new app.views.Stream().render();
+ $("#main_stream").html(app.stream.el);
+
+ var streamFacesView = new app.views.StreamFaces({collection : app.stream.collection}).render();
+ $('#selected_aspect_contacts .content').html(streamFacesView.el);
+ }
+});
+
diff --git a/public/javascripts/app/views.js b/public/javascripts/app/views.js
new file mode 100644
index 000000000..e3581607f
--- /dev/null
+++ b/public/javascripts/app/views.js
@@ -0,0 +1,43 @@
+app.views.Base = Backbone.View.extend({
+ presenter : function(){
+ return this.defaultPresenter()
+ },
+
+ defaultPresenter : function(){
+ var modelJson = this.model ? this.model.toJSON() : {}
+ return _.extend(modelJson, app.user());
+ },
+
+ render : function() {
+ this.renderTemplate()
+ this.renderSubviews()
+ this.renderPluginWidgets()
+
+ return this
+ },
+
+ renderTemplate : function(){
+ this.template = _.template($(this.template_name).html());
+ var presenter = _.isFunction(this.presenter) ? this.presenter() : this.presenter
+ $(this.el).html(this.template(presenter));
+ this.postRenderTemplate();
+ },
+
+ postRenderTemplate : $.noop, //hella callbax yo
+
+ renderSubviews : function(){
+ var self = this;
+ _.each(this.subviews, function(property, selector){
+ var view = _.isFunction(self[property]) ? self[property]() : self[property]
+ if(view) {
+ self.$(selector).html(view.render().el)
+ view.delegateEvents();
+ }
+ })
+ },
+
+ renderPluginWidgets : function() {
+ this.$(this.tooltipSelector).twipsy();
+ this.$("time").timeago();
+ }
+})
diff --git a/public/javascripts/app/views/comment_view.js b/public/javascripts/app/views/comment_view.js
new file mode 100644
index 000000000..00c645ec6
--- /dev/null
+++ b/public/javascripts/app/views/comment_view.js
@@ -0,0 +1,18 @@
+app.views.Comment = app.views.StreamObject.extend({
+
+ template_name: "#comment-template",
+
+ tagName : "li",
+
+ className : "comment",
+
+ events : {
+ "click .comment_delete": "destroyModel"
+ },
+
+ initialize : function() {
+ $(this.el).attr("id", this.model.get("guid"));
+
+ return this;
+ }
+});
diff --git a/public/javascripts/app/views/commment_stream_view.js b/public/javascripts/app/views/commment_stream_view.js
new file mode 100644
index 000000000..5348ed55d
--- /dev/null
+++ b/public/javascripts/app/views/commment_stream_view.js
@@ -0,0 +1,55 @@
+app.views.CommentStream = app.views.Base.extend({
+
+ template_name: "#comment-stream-template",
+
+ className : "comment_stream",
+
+ events: {
+ "submit form": "createComment",
+ "focus .comment_box": "commentTextareaFocused",
+ "click .toggle_post_comments": "expandComments"
+ },
+
+ initialize: function(options) {
+ this.model.comments.bind('add', this.appendComment, this);
+ },
+
+ postRenderTemplate : function() {
+ this.$("label").inFieldLabels();
+ this.model.comments.each(this.appendComment, this);
+ },
+
+ createComment: function(evt) {
+ if(evt){ evt.preventDefault(); }
+
+ this.model.comments.create({
+ "text" : this.$(".comment_box").val()
+ });
+
+ this.$(".comment_box").val("");
+ return this;
+ },
+
+ appendComment: function(comment) {
+ this.$("ul.comments").append(new app.views.Comment({
+ model: comment
+ }).render().el);
+ },
+
+ commentTextareaFocused: function(evt){
+ this.$("form").removeClass('hidden').addClass("open");
+ },
+
+ expandComments: function(evt){
+ if(evt){ evt.preventDefault(); }
+
+ var self = this;
+ this.model.comments.fetch({
+ success : function(){
+ self.model.set({all_comments_loaded : true});
+ self.render();
+ }
+ });
+ }
+
+});
diff --git a/public/javascripts/app/views/feedback_view.js b/public/javascripts/app/views/feedback_view.js
new file mode 100644
index 000000000..363c5b77d
--- /dev/null
+++ b/public/javascripts/app/views/feedback_view.js
@@ -0,0 +1,28 @@
+app.views.Feedback = app.views.StreamObject.extend({
+ template_name: "#feedback-template",
+
+ className : "info",
+
+ events: {
+ "click .like_action": "toggleLike",
+ "click .reshare_action": "resharePost"
+ },
+
+ toggleLike: function(evt) {
+ if(evt) { evt.preventDefault(); }
+ this.model.toggleLike();
+ },
+
+ resharePost : function(evt){
+ if(evt) { evt.preventDefault(); }
+ if(!window.confirm("Reshare " + this.model.baseAuthor().name + "'s post?")) { return }
+
+ var reshare = new app.models.Reshare();
+ reshare.save({root_guid : this.model.baseGuid()}, {
+ success : function(){
+ app.stream.collection.add(reshare.toJSON());
+ }
+ });
+ return reshare;
+ }
+})
diff --git a/public/javascripts/app/views/header_view.js b/public/javascripts/app/views/header_view.js
new file mode 100644
index 000000000..287aea407
--- /dev/null
+++ b/public/javascripts/app/views/header_view.js
@@ -0,0 +1,35 @@
+app.views.Header = app.views.Base.extend({
+
+ template_name : "#header-template",
+
+ tagName : "header",
+
+ events : {
+ "click ul.dropdown li:first-child" : "toggleDropdown"
+ },
+
+ initialize : function(options) {
+ $(document.body).click($.proxy(this.hideDropdown, this));
+ return this;
+ },
+
+ menuElement : function() {
+ return this.$("ul.dropdown");
+ },
+
+ toggleDropdown : function(evt) {
+ if(evt){ evt.preventDefault(); }
+
+ this.menuElement().toggleClass("active");
+
+ if($.browser.msie) {
+ this.$("header").toggleClass('ie-user-menu-active');
+ }
+ },
+
+ hideDropdown : function(evt) {
+ if(this.menuElement().hasClass("active") && !$(evt.target).parents("#user_menu").length) {
+ this.menuElement().removeClass("active");
+ }
+ }
+});
diff --git a/public/javascripts/app/views/likes_info_view.js b/public/javascripts/app/views/likes_info_view.js
new file mode 100644
index 000000000..9af8ed0ad
--- /dev/null
+++ b/public/javascripts/app/views/likes_info_view.js
@@ -0,0 +1,7 @@
+app.views.LikesInfo = app.views.StreamObject.extend({
+
+ template_name : "#likes-info-template",
+
+ className : "likes_container"
+
+});
diff --git a/public/javascripts/app/views/post_content_view.js b/public/javascripts/app/views/post_content_view.js
new file mode 100644
index 000000000..358de275b
--- /dev/null
+++ b/public/javascripts/app/views/post_content_view.js
@@ -0,0 +1,60 @@
+(function(){
+ var postContentView = app.views.StreamObject.extend({
+ presenter : function(){
+ var model = this.model
+ return _.extend(this.defaultPresenter(), {
+ text : metafyText(model.get("text"))
+ })
+
+ function metafyText(text) {
+ //we want it to return at least a
\ No newline at end of file
diff --git a/public/javascripts/vendor/Mustache.js b/public/javascripts/vendor/Mustache.js
deleted file mode 100644
index 1b6b85c81..000000000
--- a/public/javascripts/vendor/Mustache.js
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- mustache.js — Logic-less templates in JavaScript
-
- See http://mustache.github.com/ for more info.
- */
-(function() {
- var Mustache = function() {
- var Renderer = function() {
- };
-
- Renderer.prototype = {
- otag: "{{",
- ctag: "}}",
- pragmas: {},
- buffer: [],
- pragmas_implemented: {
- "IMPLICIT-ITERATOR": true
- },
- context: {},
-
- render: function(template, context, partials, in_recursion) {
- // reset buffer & set context
- if (!in_recursion) {
- this.context = context;
- this.buffer = []; // TODO: make this non-lazy
- }
-
- // fail fast
- if (!this.includes("", template)) {
- if (in_recursion) {
- return template;
- } else {
- this.send(template);
- return;
- }
- }
-
- template = this.render_pragmas(template);
- var html = this.render_section(template, context, partials);
- if (in_recursion) {
- return this.render_tags(html, context, partials, in_recursion);
- }
-
- this.render_tags(html, context, partials, in_recursion);
- },
-
- /*
- Sends parsed lines
- */
- send: function(line) {
- if (line != "") {
- this.buffer.push(line);
- }
- },
-
- /*
- Looks for %PRAGMAS
- */
- render_pragmas: function(template) {
- // no pragmas
- if (!this.includes("%", template)) {
- return template;
- }
-
- var that = this;
- var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" +
- this.ctag);
- return template.replace(regex, function(match, pragma, options) {
- if (!that.pragmas_implemented[pragma]) {
- throw({message:
- "This implementation of mustache doesn't understand the '" +
- pragma + "' pragma"});
- }
- that.pragmas[pragma] = {};
- if (options) {
- var opts = options.split("=");
- that.pragmas[pragma][opts[0]] = opts[1];
- }
- return "";
- // ignore unknown pragmas silently
- });
- },
-
- /*
- Tries to find a partial in the curent scope and render it
- */
- render_partial: function(name, context, partials) {
- name = this.trim(name);
- if (!partials || partials[name] === undefined) {
- throw({message: "unknown_partial '" + name + "'"});
- }
- if (typeof(context[name]) != "object") {
- return this.render(partials[name], context, partials, true);
- }
- return this.render(partials[name], context[name], partials, true);
- },
-
- /*
- Renders inverted (^) and normal (#) sections
- */
- render_section: function(template, context, partials) {
- if (!this.includes("#", template) && !this.includes("^", template)) {
- return template;
- }
-
- var that = this;
- // CSW - Added "+?" so it finds the tighest bound, not the widest
- var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag +
- "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag +
- "\\s*", "mg");
-
- // for each {{#foo}}{{/foo}} section do...
- return template.replace(regex, function(match, type, name, content) {
- var value = that.find(name, context);
- if (type == "^") { // inverted section
- if (!value || that.is_array(value) && value.length === 0) {
- // false or empty list, render it
- return that.render(content, context, partials, true);
- } else {
- return "";
- }
- } else if (type == "#") { // normal section
- if (that.is_array(value)) { // Enumerable, Let's loop!
- return that.map(value,
- function(row) {
- return that.render(content, that.create_context(row),
- partials, true);
- }).join("");
- } else if (that.is_object(value)) { // Object, Use it as subcontext!
- return that.render(content, that.create_context(value),
- partials, true);
- } else if (typeof value === "function") {
- // higher order section
- return value.call(context, content, function(text) {
- return that.render(text, context, partials, true);
- });
- } else if (value) { // boolean section
- return that.render(content, context, partials, true);
- } else {
- return "";
- }
- }
- });
- },
-
- /*
- Replace {{foo}} and friends with values from our view
- */
- render_tags: function(template, context, partials, in_recursion) {
- // tit for tat
- var that = this;
-
- var new_regex = function() {
- return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" +
- that.ctag + "+", "g");
- };
-
- var regex = new_regex();
- var tag_replace_callback = function(match, operator, name) {
- switch (operator) {
- case "!": // ignore comments
- return "";
- case "=": // set new delimiters, rebuild the replace regexp
- that.set_delimiters(name);
- regex = new_regex();
- return "";
- case ">": // render partial
- return that.render_partial(name, context, partials);
- case "{": // the triple mustache is unescaped
- return that.find(name, context);
- default: // escape the value
- return that.escape(that.find(name, context));
- }
- };
- var lines = template.split("\n");
- for (var i = 0; i < lines.length; i++) {
- lines[i] = lines[i].replace(regex, tag_replace_callback, this);
- if (!in_recursion) {
- this.send(lines[i]);
- }
- }
-
- if (in_recursion) {
- return lines.join("\n");
- }
- },
-
- set_delimiters: function(delimiters) {
- var dels = delimiters.split(" ");
- this.otag = this.escape_regex(dels[0]);
- this.ctag = this.escape_regex(dels[1]);
- },
-
- escape_regex: function(text) {
- // thank you Simon Willison
- if (!arguments.callee.sRE) {
- var specials = [
- '/', '.', '*', '+', '?', '|',
- '(', ')', '[', ']', '{', '}', '\\'
- ];
- arguments.callee.sRE = new RegExp(
- '(\\' + specials.join('|\\') + ')', 'g'
- );
- }
- return text.replace(arguments.callee.sRE, '\\$1');
- },
-
- /*
- find `name` in current `context`. That is find me a value
- from the view object
- */
- find: function(name, context) {
- name = this.trim(name);
-
- // Checks whether a value is thruthy or false or 0
- function is_kinda_truthy(bool) {
- return bool === false || bool === 0 || bool;
- }
-
- var value;
- if (is_kinda_truthy(context[name])) {
- value = context[name];
- } else if (is_kinda_truthy(this.context[name])) {
- value = this.context[name];
- }
-
- if (typeof value === "function") {
- return value.apply(context);
- }
- if (value !== undefined) {
- return value;
- }
- // silently ignore unkown variables
- return "";
- },
-
- // Utility methods
-
- /* includes tag */
- includes: function(needle, haystack) {
- return haystack.indexOf(this.otag + needle) != -1;
- },
-
- /*
- Does away with nasty characters
- */
- escape: function(s) {
- s = String(s === null ? "" : s);
- return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) {
- switch (s) {
- case "&": return "&";
- case "\\": return "\\\\";
- case '"': return '"';
- case "'": return ''';
- case "<": return "<";
- case ">": return ">";
- default: return s;
- }
- });
- },
-
- // by @langalex, support for arrays of strings
- create_context: function(_context) {
- if (this.is_object(_context)) {
- return _context;
- } else {
- var iterator = ".";
- if (this.pragmas["IMPLICIT-ITERATOR"]) {
- iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator;
- }
- var ctx = {};
- ctx[iterator] = _context;
- return ctx;
- }
- },
-
- is_object: function(a) {
- return a && typeof a == "object";
- },
-
- is_array: function(a) {
- return Object.prototype.toString.call(a) === '[object Array]';
- },
-
- /*
- Gets rid of leading and trailing whitespace
- */
- trim: function(s) {
- return s.replace(/^\s*|\s*$/g, "");
- },
-
- /*
- Why, why, why? Because IE. Cry, cry cry.
- */
- map: function(array, fn) {
- if (typeof array.map == "function") {
- return array.map(fn);
- } else {
- var r = [];
- var l = array.length;
- for (var i = 0; i < l; i++) {
- r.push(fn(array[i]));
- }
- return r;
- }
- }
- };
-
- return({
- name: "mustache.js",
- version: "0.3.1-dev",
-
- /*
- Turns a template and view into HTML
- */
- to_html: function(template, view, partials, send_fun) {
- var renderer = new Renderer();
- if (send_fun) {
- renderer.send = send_fun;
- }
- renderer.render(template, view, partials);
- if (!send_fun) {
- return renderer.buffer.join("\n");
- }
- }
- });
- }();
-
- $.mustache = function(template, view, partials, send_fun) {
- return Mustache.to_html(template, view, partials, send_fun);
- };
-})();
\ No newline at end of file
diff --git a/public/javascripts/vendor/WebSocketMain.swf b/public/javascripts/vendor/WebSocketMain.swf
deleted file mode 100644
index 5eab4521a..000000000
Binary files a/public/javascripts/vendor/WebSocketMain.swf and /dev/null differ
diff --git a/public/javascripts/vendor/backbone.js b/public/javascripts/vendor/backbone.js
new file mode 100644
index 000000000..b2e49322b
--- /dev/null
+++ b/public/javascripts/vendor/backbone.js
@@ -0,0 +1,1158 @@
+// Backbone.js 0.5.3
+// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://documentcloud.github.com/backbone
+
+(function(){
+
+ // Initial Setup
+ // -------------
+
+ // Save a reference to the global object.
+ var root = this;
+
+ // Save the previous value of the `Backbone` variable.
+ var previousBackbone = root.Backbone;
+
+ // The top-level namespace. All public Backbone classes and modules will
+ // be attached to this. Exported for both CommonJS and the browser.
+ var Backbone;
+ if (typeof exports !== 'undefined') {
+ Backbone = exports;
+ } else {
+ Backbone = root.Backbone = {};
+ }
+
+ // Current version of the library. Keep in sync with `package.json`.
+ Backbone.VERSION = '0.5.3';
+
+ // Require Underscore, if we're on the server, and it's not already present.
+ var _ = root._;
+ if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._;
+
+ // For Backbone's purposes, jQuery or Zepto owns the `$` variable.
+ var $ = root.jQuery || root.Zepto;
+
+ // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable
+ // to its previous owner. Returns a reference to this Backbone object.
+ Backbone.noConflict = function() {
+ root.Backbone = previousBackbone;
+ return this;
+ };
+
+ // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option will
+ // fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a
+ // `X-Http-Method-Override` header.
+ Backbone.emulateHTTP = false;
+
+ // Turn on `emulateJSON` to support legacy servers that can't deal with direct
+ // `application/json` requests ... will encode the body as
+ // `application/x-www-form-urlencoded` instead and will send the model in a
+ // form param named `model`.
+ Backbone.emulateJSON = false;
+
+ // Backbone.Events
+ // -----------------
+
+ // A module that can be mixed in to *any object* in order to provide it with
+ // custom events. You may `bind` or `unbind` a callback function to an event;
+ // `trigger`-ing an event fires all callbacks in succession.
+ //
+ // var object = {};
+ // _.extend(object, Backbone.Events);
+ // object.bind('expand', function(){ alert('expanded'); });
+ // object.trigger('expand');
+ //
+ Backbone.Events = {
+
+ // Bind an event, specified by a string name, `ev`, to a `callback` function.
+ // Passing `"all"` will bind the callback to all events fired.
+ bind : function(ev, callback, context) {
+ var calls = this._callbacks || (this._callbacks = {});
+ var list = calls[ev] || (calls[ev] = []);
+ list.push([callback, context]);
+ return this;
+ },
+
+ // Remove one or many callbacks. If `callback` is null, removes all
+ // callbacks for the event. If `ev` is null, removes all bound callbacks
+ // for all events.
+ unbind : function(ev, callback) {
+ var calls;
+ if (!ev) {
+ this._callbacks = {};
+ } else if (calls = this._callbacks) {
+ if (!callback) {
+ calls[ev] = [];
+ } else {
+ var list = calls[ev];
+ if (!list) return this;
+ for (var i = 0, l = list.length; i < l; i++) {
+ if (list[i] && callback === list[i][0]) {
+ list[i] = null;
+ break;
+ }
+ }
+ }
+ }
+ return this;
+ },
+
+ // Trigger an event, firing all bound callbacks. Callbacks are passed the
+ // same arguments as `trigger` is, apart from the event name.
+ // Listening for `"all"` passes the true event name as the first argument.
+ trigger : function(eventName) {
+ var list, calls, ev, callback, args;
+ var both = 2;
+ if (!(calls = this._callbacks)) return this;
+ while (both--) {
+ ev = both ? eventName : 'all';
+ if (list = calls[ev]) {
+ for (var i = 0, l = list.length; i < l; i++) {
+ if (!(callback = list[i])) {
+ list.splice(i, 1); i--; l--;
+ } else {
+ args = both ? Array.prototype.slice.call(arguments, 1) : arguments;
+ callback[0].apply(callback[1] || this, args);
+ }
+ }
+ }
+ }
+ return this;
+ }
+
+ };
+
+ // Backbone.Model
+ // --------------
+
+ // Create a new model, with defined attributes. A client id (`cid`)
+ // is automatically generated and assigned for you.
+ Backbone.Model = function(attributes, options) {
+ var defaults;
+ attributes || (attributes = {});
+ if (defaults = this.defaults) {
+ if (_.isFunction(defaults)) defaults = defaults.call(this);
+ attributes = _.extend({}, defaults, attributes);
+ }
+ this.attributes = {};
+ this._escapedAttributes = {};
+ this.cid = _.uniqueId('c');
+ this.set(attributes, {silent : true});
+ this._changed = false;
+ this._previousAttributes = _.clone(this.attributes);
+ if (options && options.collection) this.collection = options.collection;
+ this.initialize(attributes, options);
+ };
+
+ // Attach all inheritable methods to the Model prototype.
+ _.extend(Backbone.Model.prototype, Backbone.Events, {
+
+ // A snapshot of the model's previous attributes, taken immediately
+ // after the last `"change"` event was fired.
+ _previousAttributes : null,
+
+ // Has the item been changed since the last `"change"` event?
+ _changed : false,
+
+ // The default name for the JSON `id` attribute is `"id"`. MongoDB and
+ // CouchDB users may want to set this to `"_id"`.
+ idAttribute : 'id',
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize : function(){},
+
+ // Return a copy of the model's `attributes` object.
+ toJSON : function() {
+ return _.clone(this.attributes);
+ },
+
+ // Get the value of an attribute.
+ get : function(attr) {
+ return this.attributes[attr];
+ },
+
+ // Get the HTML-escaped value of an attribute.
+ escape : function(attr) {
+ var html;
+ if (html = this._escapedAttributes[attr]) return html;
+ var val = this.attributes[attr];
+ return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val);
+ },
+
+ // Returns `true` if the attribute contains a value that is not null
+ // or undefined.
+ has : function(attr) {
+ return this.attributes[attr] != null;
+ },
+
+ // Set a hash of model attributes on the object, firing `"change"` unless you
+ // choose to silence it.
+ set : function(attrs, options) {
+
+ // Extract attributes and options.
+ options || (options = {});
+ if (!attrs) return this;
+ if (attrs.attributes) attrs = attrs.attributes;
+ var now = this.attributes, escaped = this._escapedAttributes;
+
+ // Run validation.
+ if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;
+
+ // Check for changes of `id`.
+ if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
+
+ // We're about to start triggering change events.
+ var alreadyChanging = this._changing;
+ this._changing = true;
+
+ // Update attributes.
+ for (var attr in attrs) {
+ var val = attrs[attr];
+ if (!_.isEqual(now[attr], val)) {
+ now[attr] = val;
+ delete escaped[attr];
+ this._changed = true;
+ if (!options.silent) this.trigger('change:' + attr, this, val, options);
+ }
+ }
+
+ // Fire the `"change"` event, if the model has been changed.
+ if (!alreadyChanging && !options.silent && this._changed) this.change(options);
+ this._changing = false;
+ return this;
+ },
+
+ // Remove an attribute from the model, firing `"change"` unless you choose
+ // to silence it. `unset` is a noop if the attribute doesn't exist.
+ unset : function(attr, options) {
+ if (!(attr in this.attributes)) return this;
+ options || (options = {});
+ var value = this.attributes[attr];
+
+ // Run validation.
+ var validObj = {};
+ validObj[attr] = void 0;
+ if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;
+
+ // Remove the attribute.
+ delete this.attributes[attr];
+ delete this._escapedAttributes[attr];
+ if (attr == this.idAttribute) delete this.id;
+ this._changed = true;
+ if (!options.silent) {
+ this.trigger('change:' + attr, this, void 0, options);
+ this.change(options);
+ }
+ return this;
+ },
+
+ // Clear all attributes on the model, firing `"change"` unless you choose
+ // to silence it.
+ clear : function(options) {
+ options || (options = {});
+ var attr;
+ var old = this.attributes;
+
+ // Run validation.
+ var validObj = {};
+ for (attr in old) validObj[attr] = void 0;
+ if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;
+
+ this.attributes = {};
+ this._escapedAttributes = {};
+ this._changed = true;
+ if (!options.silent) {
+ for (attr in old) {
+ this.trigger('change:' + attr, this, void 0, options);
+ }
+ this.change(options);
+ }
+ return this;
+ },
+
+ // Fetch the model from the server. If the server's representation of the
+ // model differs from its current attributes, they will be overriden,
+ // triggering a `"change"` event.
+ fetch : function(options) {
+ options || (options = {});
+ var model = this;
+ var success = options.success;
+ options.success = function(resp, status, xhr) {
+ if (!model.set(model.parse(resp, xhr), options)) return false;
+ if (success) success(model, resp);
+ };
+ options.error = wrapError(options.error, model, options);
+ return (this.sync || Backbone.sync).call(this, 'read', this, options);
+ },
+
+ // Set a hash of model attributes, and sync the model to the server.
+ // If the server returns an attributes hash that differs, the model's
+ // state will be `set` again.
+ save : function(attrs, options) {
+ options || (options = {});
+ if (attrs && !this.set(attrs, options)) return false;
+ var model = this;
+ var success = options.success;
+ options.success = function(resp, status, xhr) {
+ if (!model.set(model.parse(resp, xhr), options)) return false;
+ if (success) success(model, resp, xhr);
+ };
+ options.error = wrapError(options.error, model, options);
+ var method = this.isNew() ? 'create' : 'update';
+ return (this.sync || Backbone.sync).call(this, method, this, options);
+ },
+
+ // Destroy this model on the server if it was already persisted. Upon success, the model is removed
+ // from its collection, if it has one.
+ destroy : function(options) {
+ options || (options = {});
+ if (this.isNew()) return this.trigger('destroy', this, this.collection, options);
+ var model = this;
+ var success = options.success;
+ options.success = function(resp) {
+ model.trigger('destroy', model, model.collection, options);
+ if (success) success(model, resp);
+ };
+ options.error = wrapError(options.error, model, options);
+ return (this.sync || Backbone.sync).call(this, 'delete', this, options);
+ },
+
+ // Default URL for the model's representation on the server -- if you're
+ // using Backbone's restful methods, override this to change the endpoint
+ // that will be called.
+ url : function() {
+ var base = getUrl(this.collection) || this.urlRoot || urlError();
+ if (this.isNew()) return base;
+ return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);
+ },
+
+ // **parse** converts a response into the hash of attributes to be `set` on
+ // the model. The default implementation is just to pass the response along.
+ parse : function(resp, xhr) {
+ return resp;
+ },
+
+ // Create a new model with identical attributes to this one.
+ clone : function() {
+ return new this.constructor(this);
+ },
+
+ // A model is new if it has never been saved to the server, and lacks an id.
+ isNew : function() {
+ return this.id == null;
+ },
+
+ // Call this method to manually fire a `change` event for this model.
+ // Calling this will cause all objects observing the model to update.
+ change : function(options) {
+ this.trigger('change', this, options);
+ this._previousAttributes = _.clone(this.attributes);
+ this._changed = false;
+ },
+
+ // Determine if the model has changed since the last `"change"` event.
+ // If you specify an attribute name, determine if that attribute has changed.
+ hasChanged : function(attr) {
+ if (attr) return this._previousAttributes[attr] != this.attributes[attr];
+ return this._changed;
+ },
+
+ // Return an object containing all the attributes that have changed, or false
+ // if there are no changed attributes. Useful for determining what parts of a
+ // view need to be updated and/or what attributes need to be persisted to
+ // the server.
+ changedAttributes : function(now) {
+ now || (now = this.attributes);
+ var old = this._previousAttributes;
+ var changed = false;
+ for (var attr in now) {
+ if (!_.isEqual(old[attr], now[attr])) {
+ changed = changed || {};
+ changed[attr] = now[attr];
+ }
+ }
+ return changed;
+ },
+
+ // Get the previous value of an attribute, recorded at the time the last
+ // `"change"` event was fired.
+ previous : function(attr) {
+ if (!attr || !this._previousAttributes) return null;
+ return this._previousAttributes[attr];
+ },
+
+ // Get all of the attributes of the model at the time of the previous
+ // `"change"` event.
+ previousAttributes : function() {
+ return _.clone(this._previousAttributes);
+ },
+
+ // Run validation against a set of incoming attributes, returning `true`
+ // if all is well. If a specific `error` callback has been passed,
+ // call that instead of firing the general `"error"` event.
+ _performValidation : function(attrs, options) {
+ var error = this.validate(attrs);
+ if (error) {
+ if (options.error) {
+ options.error(this, error, options);
+ } else {
+ this.trigger('error', this, error, options);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ });
+
+ // Backbone.Collection
+ // -------------------
+
+ // Provides a standard collection class for our sets of models, ordered
+ // or unordered. If a `comparator` is specified, the Collection will maintain
+ // its models in sort order, as they're added and removed.
+ Backbone.Collection = function(models, options) {
+ options || (options = {});
+ if (options.comparator) this.comparator = options.comparator;
+ _.bindAll(this, '_onModelEvent', '_removeReference');
+ this._reset();
+ if (models) this.reset(models, {silent: true});
+ this.initialize.apply(this, arguments);
+ };
+
+ // Define the Collection's inheritable methods.
+ _.extend(Backbone.Collection.prototype, Backbone.Events, {
+
+ // The default model for a collection is just a **Backbone.Model**.
+ // This should be overridden in most cases.
+ model : Backbone.Model,
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize : function(){},
+
+ // The JSON representation of a Collection is an array of the
+ // models' attributes.
+ toJSON : function() {
+ return this.map(function(model){ return model.toJSON(); });
+ },
+
+ // Add a model, or list of models to the set. Pass **silent** to avoid
+ // firing the `added` event for every new model.
+ add : function(models, options) {
+ if (_.isArray(models)) {
+ for (var i = 0, l = models.length; i < l; i++) {
+ this._add(models[i], options);
+ }
+ } else {
+ this._add(models, options);
+ }
+ return this;
+ },
+
+ // Remove a model, or a list of models from the set. Pass silent to avoid
+ // firing the `removed` event for every model removed.
+ remove : function(models, options) {
+ if (_.isArray(models)) {
+ for (var i = 0, l = models.length; i < l; i++) {
+ this._remove(models[i], options);
+ }
+ } else {
+ this._remove(models, options);
+ }
+ return this;
+ },
+
+ // Get a model from the set by id.
+ get : function(id) {
+ if (id == null) return null;
+ return this._byId[id.id != null ? id.id : id];
+ },
+
+ // Get a model from the set by client id.
+ getByCid : function(cid) {
+ return cid && this._byCid[cid.cid || cid];
+ },
+
+ // Get the model at the given index.
+ at: function(index) {
+ return this.models[index];
+ },
+
+ // Force the collection to re-sort itself. You don't need to call this under normal
+ // circumstances, as the set will maintain sort order as each item is added.
+ sort : function(options) {
+ options || (options = {});
+ if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
+ this.models = this.sortBy(this.comparator);
+ if (!options.silent) this.trigger('reset', this, options);
+ return this;
+ },
+
+ // Pluck an attribute from each model in the collection.
+ pluck : function(attr) {
+ return _.map(this.models, function(model){ return model.get(attr); });
+ },
+
+ // When you have more items than you want to add or remove individually,
+ // you can reset the entire set with a new list of models, without firing
+ // any `added` or `removed` events. Fires `reset` when finished.
+ reset : function(models, options) {
+ models || (models = []);
+ options || (options = {});
+ this.each(this._removeReference);
+ this._reset();
+ this.add(models, {silent: true});
+ if (!options.silent) this.trigger('reset', this, options);
+ return this;
+ },
+
+ // Fetch the default set of models for this collection, resetting the
+ // collection when they arrive. If `add: true` is passed, appends the
+ // models to the collection instead of resetting.
+ fetch : function(options) {
+ options || (options = {});
+ var collection = this;
+ var success = options.success;
+ options.success = function(resp, status, xhr) {
+ collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
+ if (success) success(collection, resp);
+ };
+ options.error = wrapError(options.error, collection, options);
+ return (this.sync || Backbone.sync).call(this, 'read', this, options);
+ },
+
+ // Create a new instance of a model in this collection. After the model
+ // has been created on the server, it will be added to the collection.
+ // Returns the model, or 'false' if validation on a new model fails.
+ create : function(model, options) {
+ var coll = this;
+ options || (options = {});
+ model = this._prepareModel(model, options);
+ if (!model) return false;
+ var success = options.success;
+ options.success = function(nextModel, resp, xhr) {
+ coll.add(nextModel, options);
+ if (success) success(nextModel, resp, xhr);
+ };
+ model.save(null, options);
+ return model;
+ },
+
+ // **parse** converts a response into a list of models to be added to the
+ // collection. The default implementation is just to pass it through.
+ parse : function(resp, xhr) {
+ return resp;
+ },
+
+ // Proxy to _'s chain. Can't be proxied the same way the rest of the
+ // underscore methods are proxied because it relies on the underscore
+ // constructor.
+ chain: function () {
+ return _(this.models).chain();
+ },
+
+ // Reset all internal state. Called when the collection is reset.
+ _reset : function(options) {
+ this.length = 0;
+ this.models = [];
+ this._byId = {};
+ this._byCid = {};
+ },
+
+ // Prepare a model to be added to this collection
+ _prepareModel: function(model, options) {
+ if (!(model instanceof Backbone.Model)) {
+ var attrs = model;
+ model = new this.model(attrs, {collection: this});
+ if (model.validate && !model._performValidation(attrs, options)) model = false;
+ } else if (!model.collection) {
+ model.collection = this;
+ }
+ return model;
+ },
+
+ // Internal implementation of adding a single model to the set, updating
+ // hash indexes for `id` and `cid` lookups.
+ // Returns the model, or 'false' if validation on a new model fails.
+ _add : function(model, options) {
+ options || (options = {});
+ model = this._prepareModel(model, options);
+ if (!model) return false;
+ var already = this.getByCid(model);
+ if (already) throw new Error(["Can't add the same model to a set twice", already.id]);
+ this._byId[model.id] = model;
+ this._byCid[model.cid] = model;
+ var index = options.at != null ? options.at :
+ this.comparator ? this.sortedIndex(model, this.comparator) :
+ this.length;
+ this.models.splice(index, 0, model);
+ model.bind('all', this._onModelEvent);
+ this.length++;
+ if (!options.silent) model.trigger('add', model, this, options);
+ return model;
+ },
+
+ // Internal implementation of removing a single model from the set, updating
+ // hash indexes for `id` and `cid` lookups.
+ _remove : function(model, options) {
+ options || (options = {});
+ model = this.getByCid(model) || this.get(model);
+ if (!model) return null;
+ delete this._byId[model.id];
+ delete this._byCid[model.cid];
+ this.models.splice(this.indexOf(model), 1);
+ this.length--;
+ if (!options.silent) model.trigger('remove', model, this, options);
+ this._removeReference(model);
+ return model;
+ },
+
+ // Internal method to remove a model's ties to a collection.
+ _removeReference : function(model) {
+ if (this == model.collection) {
+ delete model.collection;
+ }
+ model.unbind('all', this._onModelEvent);
+ },
+
+ // Internal method called every time a model in the set fires an event.
+ // Sets need to update their indexes when models change ids. All other
+ // events simply proxy through. "add" and "remove" events that originate
+ // in other collections are ignored.
+ _onModelEvent : function(ev, model, collection, options) {
+ if ((ev == 'add' || ev == 'remove') && collection != this) return;
+ if (ev == 'destroy') {
+ this._remove(model, options);
+ }
+ if (model && ev === 'change:' + model.idAttribute) {
+ delete this._byId[model.previous(model.idAttribute)];
+ this._byId[model.id] = model;
+ }
+ this.trigger.apply(this, arguments);
+ }
+
+ });
+
+ // Underscore methods that we want to implement on the Collection.
+ var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',
+ 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',
+ 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',
+ 'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty', 'groupBy'];
+
+ // Mix in each Underscore method as a proxy to `Collection#models`.
+ _.each(methods, function(method) {
+ Backbone.Collection.prototype[method] = function() {
+ return _[method].apply(_, [this.models].concat(_.toArray(arguments)));
+ };
+ });
+
+ // Backbone.Router
+ // -------------------
+
+ // Routers map faux-URLs to actions, and fire events when routes are
+ // matched. Creating a new one sets its `routes` hash, if not set statically.
+ Backbone.Router = function(options) {
+ options || (options = {});
+ if (options.routes) this.routes = options.routes;
+ this._bindRoutes();
+ this.initialize.apply(this, arguments);
+ };
+
+ // Cached regular expressions for matching named param parts and splatted
+ // parts of route strings.
+ var namedParam = /:([\w\d]+)/g;
+ var splatParam = /\*([\w\d]+)/g;
+ var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g;
+
+ // Set up all inheritable **Backbone.Router** properties and methods.
+ _.extend(Backbone.Router.prototype, Backbone.Events, {
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize : function(){},
+
+ // Manually bind a single named route to a callback. For example:
+ //
+ // this.route('search/:query/p:num', 'search', function(query, num) {
+ // ...
+ // });
+ //
+ route : function(route, name, callback) {
+ Backbone.history || (Backbone.history = new Backbone.History);
+ if (!_.isRegExp(route)) route = this._routeToRegExp(route);
+ Backbone.history.route(route, _.bind(function(fragment) {
+ var args = this._extractParameters(route, fragment);
+ callback.apply(this, args);
+ this.trigger.apply(this, ['route:' + name].concat(args));
+ }, this));
+ },
+
+ // Simple proxy to `Backbone.history` to save a fragment into the history.
+ navigate : function(fragment, triggerRoute) {
+ Backbone.history.navigate(fragment, triggerRoute);
+ },
+
+ // Bind all defined routes to `Backbone.history`. We have to reverse the
+ // order of the routes here to support behavior where the most general
+ // routes can be defined at the bottom of the route map.
+ _bindRoutes : function() {
+ if (!this.routes) return;
+ var routes = [];
+ for (var route in this.routes) {
+ routes.unshift([route, this.routes[route]]);
+ }
+ for (var i = 0, l = routes.length; i < l; i++) {
+ this.route(routes[i][0], routes[i][1], this[routes[i][1]]);
+ }
+ },
+
+ // Convert a route string into a regular expression, suitable for matching
+ // against the current location hash.
+ _routeToRegExp : function(route) {
+ route = route.replace(escapeRegExp, "\\$&")
+ .replace(namedParam, "([^\/]*)")
+ .replace(splatParam, "(.*?)");
+ return new RegExp('^' + route + '$');
+ },
+
+ // Given a route, and a URL fragment that it matches, return the array of
+ // extracted parameters.
+ _extractParameters : function(route, fragment) {
+ return route.exec(fragment).slice(1);
+ }
+
+ });
+
+ // Backbone.History
+ // ----------------
+
+ // Handles cross-browser history management, based on URL fragments. If the
+ // browser does not support `onhashchange`, falls back to polling.
+ Backbone.History = function() {
+ this.handlers = [];
+ _.bindAll(this, 'checkUrl');
+ };
+
+ // Cached regex for cleaning hashes.
+ var hashStrip = /^#*/;
+
+ // Cached regex for detecting MSIE.
+ var isExplorer = /msie [\w.]+/;
+
+ // Has the history handling already been started?
+ var historyStarted = false;
+
+ // Set up all inheritable **Backbone.History** properties and methods.
+ _.extend(Backbone.History.prototype, {
+
+ // The default interval to poll for hash changes, if necessary, is
+ // twenty times a second.
+ interval: 50,
+
+ // Get the cross-browser normalized URL fragment, either from the URL,
+ // the hash, or the override.
+ getFragment : function(fragment, forcePushState) {
+ if (fragment == null) {
+ if (this._hasPushState || forcePushState) {
+ fragment = window.location.pathname;
+ var search = window.location.search;
+ if (search) fragment += search;
+ if (fragment.indexOf(this.options.root) == 0) fragment = fragment.substr(this.options.root.length);
+ } else {
+ fragment = window.location.hash;
+ }
+ }
+ return decodeURIComponent(fragment.replace(hashStrip, ''));
+ },
+
+ // Start the hash change handling, returning `true` if the current URL matches
+ // an existing route, and `false` otherwise.
+ start : function(options) {
+
+ // Figure out the initial configuration. Do we need an iframe?
+ // Is pushState desired ... is it available?
+ if (historyStarted) throw new Error("Backbone.history has already been started");
+ this.options = _.extend({}, {root: '/'}, this.options, options);
+ this._wantsPushState = !!this.options.pushState;
+ this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState);
+ var fragment = this.getFragment();
+ var docMode = document.documentMode;
+ var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
+ if (oldIE) {
+ this.iframe = $('').hide().appendTo('body')[0].contentWindow;
+ this.navigate(fragment);
+ }
+
+ // Depending on whether we're using pushState or hashes, and whether
+ // 'onhashchange' is supported, determine how we check the URL state.
+ if (this._hasPushState) {
+ $(window).bind('popstate', this.checkUrl);
+ } else if ('onhashchange' in window && !oldIE) {
+ $(window).bind('hashchange', this.checkUrl);
+ } else {
+ setInterval(this.checkUrl, this.interval);
+ }
+
+ // Determine if we need to change the base url, for a pushState link
+ // opened by a non-pushState browser.
+ this.fragment = fragment;
+ historyStarted = true;
+ var loc = window.location;
+ var atRoot = loc.pathname == this.options.root;
+ if (this._wantsPushState && !this._hasPushState && !atRoot) {
+ this.fragment = this.getFragment(null, true);
+ window.location.replace(this.options.root + '#' + this.fragment);
+ // Return immediately as browser will do redirect to new url
+ return true;
+ } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {
+ this.fragment = loc.hash.replace(hashStrip, '');
+ window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment);
+ }
+
+ if (!this.options.silent) {
+ return this.loadUrl();
+ }
+ },
+
+ // Add a route to be tested when the fragment changes. Routes added later may
+ // override previous routes.
+ route : function(route, callback) {
+ this.handlers.unshift({route : route, callback : callback});
+ },
+
+ // Checks the current URL to see if it has changed, and if it has,
+ // calls `loadUrl`, normalizing across the hidden iframe.
+ checkUrl : function(e) {
+ var current = this.getFragment();
+ if (current == this.fragment && this.iframe) current = this.getFragment(this.iframe.location.hash);
+ if (current == this.fragment || current == decodeURIComponent(this.fragment)) return false;
+ if (this.iframe) this.navigate(current);
+ this.loadUrl() || this.loadUrl(window.location.hash);
+ },
+
+ // Attempt to load the current URL fragment. If a route succeeds with a
+ // match, returns `true`. If no defined routes matches the fragment,
+ // returns `false`.
+ loadUrl : function(fragmentOverride) {
+ var fragment = this.fragment = this.getFragment(fragmentOverride);
+ var matched = _.any(this.handlers, function(handler) {
+ if (handler.route.test(fragment)) {
+ handler.callback(fragment);
+ return true;
+ }
+ });
+ return matched;
+ },
+
+ // Save a fragment into the hash history. You are responsible for properly
+ // URL-encoding the fragment in advance. This does not trigger
+ // a `hashchange` event.
+ navigate : function(fragment, triggerRoute) {
+ var frag = (fragment || '').replace(hashStrip, '');
+ if (this.fragment == frag || this.fragment == decodeURIComponent(frag)) return;
+ if (this._hasPushState) {
+ var loc = window.location;
+ if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag;
+ this.fragment = frag;
+ window.history.pushState({}, document.title, loc.protocol + '//' + loc.host + frag);
+ } else {
+ window.location.hash = this.fragment = frag;
+ if (this.iframe && (frag != this.getFragment(this.iframe.location.hash))) {
+ this.iframe.document.open().close();
+ this.iframe.location.hash = frag;
+ }
+ }
+ if (triggerRoute) this.loadUrl(fragment);
+ }
+
+ });
+
+ // Backbone.View
+ // -------------
+
+ // Creating a Backbone.View creates its initial element outside of the DOM,
+ // if an existing element is not provided...
+ Backbone.View = function(options) {
+ this.cid = _.uniqueId('view');
+ this._configure(options || {});
+ this._ensureElement();
+ this.delegateEvents();
+ this.initialize.apply(this, arguments);
+ };
+
+ // Element lookup, scoped to DOM elements within the current view.
+ // This should be prefered to global lookups, if you're dealing with
+ // a specific view.
+ var selectorDelegate = function(selector) {
+ return $(selector, this.el);
+ };
+
+ // Cached regex to split keys for `delegate`.
+ var eventSplitter = /^(\S+)\s*(.*)$/;
+
+ // List of view options to be merged as properties.
+ var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName'];
+
+ // Set up all inheritable **Backbone.View** properties and methods.
+ _.extend(Backbone.View.prototype, Backbone.Events, {
+
+ // The default `tagName` of a View's element is `"div"`.
+ tagName : 'div',
+
+ // Attach the `selectorDelegate` function as the `$` property.
+ $ : selectorDelegate,
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize : function(){},
+
+ // **render** is the core function that your view should override, in order
+ // to populate its element (`this.el`), with the appropriate HTML. The
+ // convention is for **render** to always return `this`.
+ render : function() {
+ return this;
+ },
+
+ // Remove this view from the DOM. Note that the view isn't present in the
+ // DOM by default, so calling this method may be a no-op.
+ remove : function() {
+ $(this.el).remove();
+ return this;
+ },
+
+ // For small amounts of DOM Elements, where a full-blown template isn't
+ // needed, use **make** to manufacture elements, one at a time.
+ //
+ // var el = this.make('li', {'class': 'row'}, this.model.escape('title'));
+ //
+ make : function(tagName, attributes, content) {
+ var el = document.createElement(tagName);
+ if (attributes) $(el).attr(attributes);
+ if (content) $(el).html(content);
+ return el;
+ },
+
+ // Set callbacks, where `this.callbacks` is a hash of
+ //
+ // *{"event selector": "callback"}*
+ //
+ // {
+ // 'mousedown .title': 'edit',
+ // 'click .button': 'save'
+ // }
+ //
+ // pairs. Callbacks will be bound to the view, with `this` set properly.
+ // Uses event delegation for efficiency.
+ // Omitting the selector binds the event to `this.el`.
+ // This only works for delegate-able events: not `focus`, `blur`, and
+ // not `change`, `submit`, and `reset` in Internet Explorer.
+ delegateEvents : function(events) {
+ if (!(events || (events = this.events))) return;
+ if (_.isFunction(events)) events = events.call(this);
+ $(this.el).unbind('.delegateEvents' + this.cid);
+ for (var key in events) {
+ var method = this[events[key]];
+ if (!method) throw new Error('Event "' + events[key] + '" does not exist');
+ var match = key.match(eventSplitter);
+ var eventName = match[1], selector = match[2];
+ method = _.bind(method, this);
+ eventName += '.delegateEvents' + this.cid;
+ if (selector === '') {
+ $(this.el).bind(eventName, method);
+ } else {
+ $(this.el).delegate(selector, eventName, method);
+ }
+ }
+ },
+
+ // Performs the initial configuration of a View with a set of options.
+ // Keys with special meaning *(model, collection, id, className)*, are
+ // attached directly to the view.
+ _configure : function(options) {
+ if (this.options) options = _.extend({}, this.options, options);
+ for (var i = 0, l = viewOptions.length; i < l; i++) {
+ var attr = viewOptions[i];
+ if (options[attr]) this[attr] = options[attr];
+ }
+ this.options = options;
+ },
+
+ // Ensure that the View has a DOM element to render into.
+ // If `this.el` is a string, pass it through `$()`, take the first
+ // matching element, and re-assign it to `el`. Otherwise, create
+ // an element from the `id`, `className` and `tagName` proeprties.
+ _ensureElement : function() {
+ if (!this.el) {
+ var attrs = this.attributes || {};
+ if (this.id) attrs.id = this.id;
+ if (this.className) attrs['class'] = this.className;
+ this.el = this.make(this.tagName, attrs);
+ } else if (_.isString(this.el)) {
+ this.el = $(this.el).get(0);
+ }
+ }
+
+ });
+
+ // The self-propagating extend function that Backbone classes use.
+ var extend = function (protoProps, classProps) {
+ var child = inherits(this, protoProps, classProps);
+ child.extend = this.extend;
+ return child;
+ };
+
+ // Set up inheritance for the model, collection, and view.
+ Backbone.Model.extend = Backbone.Collection.extend =
+ Backbone.Router.extend = Backbone.View.extend = extend;
+
+ // Map from CRUD to HTTP for our default `Backbone.sync` implementation.
+ var methodMap = {
+ 'create': 'POST',
+ 'update': 'PUT',
+ 'delete': 'DELETE',
+ 'read' : 'GET'
+ };
+
+ // Backbone.sync
+ // -------------
+
+ // Override this function to change the manner in which Backbone persists
+ // models to the server. You will be passed the type of request, and the
+ // model in question. By default, uses makes a RESTful Ajax request
+ // to the model's `url()`. Some possible customizations could be:
+ //
+ // * Use `setTimeout` to batch rapid-fire updates into a single request.
+ // * Send up the models as XML instead of JSON.
+ // * Persist models via WebSockets instead of Ajax.
+ //
+ // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests
+ // as `POST`, with a `_method` parameter containing the true HTTP method,
+ // as well as all requests with the body as `application/x-www-form-urlencoded` instead of
+ // `application/json` with the model in a param named `model`.
+ // Useful when interfacing with server-side languages like **PHP** that make
+ // it difficult to read the body of `PUT` requests.
+ Backbone.sync = function(method, model, options) {
+ var type = methodMap[method];
+
+ // Default JSON-request options.
+ var params = _.extend({
+ type: type,
+ dataType: 'json'
+ }, options);
+
+ // Ensure that we have a URL.
+ if (!params.url) {
+ params.url = getUrl(model) || urlError();
+ }
+
+ // Ensure that we have the appropriate request data.
+ if (!params.data && model && (method == 'create' || method == 'update')) {
+ params.contentType = 'application/json';
+ params.data = JSON.stringify(model.toJSON());
+ }
+
+ // For older servers, emulate JSON by encoding the request into an HTML-form.
+ if (Backbone.emulateJSON) {
+ params.contentType = 'application/x-www-form-urlencoded';
+ params.data = params.data ? {model : params.data} : {};
+ }
+
+ // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
+ // And an `X-HTTP-Method-Override` header.
+ if (Backbone.emulateHTTP) {
+ if (type === 'PUT' || type === 'DELETE') {
+ if (Backbone.emulateJSON) params.data._method = type;
+ params.type = 'POST';
+ params.beforeSend = function(xhr) {
+ xhr.setRequestHeader('X-HTTP-Method-Override', type);
+ };
+ }
+ }
+
+ // Don't process data on a non-GET request.
+ if (params.type !== 'GET' && !Backbone.emulateJSON) {
+ params.processData = false;
+ }
+
+ // Make the request.
+ return $.ajax(params);
+ };
+
+ // Helpers
+ // -------
+
+ // Shared empty constructor function to aid in prototype-chain creation.
+ var ctor = function(){};
+
+ // Helper function to correctly set up the prototype chain, for subclasses.
+ // Similar to `goog.inherits`, but uses a hash of prototype properties and
+ // class properties to be extended.
+ var inherits = function(parent, protoProps, staticProps) {
+ var child;
+
+ // The constructor function for the new subclass is either defined by you
+ // (the "constructor" property in your `extend` definition), or defaulted
+ // by us to simply call `super()`.
+ if (protoProps && protoProps.hasOwnProperty('constructor')) {
+ child = protoProps.constructor;
+ } else {
+ child = function(){ return parent.apply(this, arguments); };
+ }
+
+ // Inherit class (static) properties from parent.
+ _.extend(child, parent);
+
+ // Set the prototype chain to inherit from `parent`, without calling
+ // `parent`'s constructor function.
+ ctor.prototype = parent.prototype;
+ child.prototype = new ctor();
+
+ // Add prototype properties (instance properties) to the subclass,
+ // if supplied.
+ if (protoProps) _.extend(child.prototype, protoProps);
+
+ // Add static properties to the constructor function, if supplied.
+ if (staticProps) _.extend(child, staticProps);
+
+ // Correctly set child's `prototype.constructor`.
+ child.prototype.constructor = child;
+
+ // Set a convenience property in case the parent's prototype is needed later.
+ child.__super__ = parent.prototype;
+
+ return child;
+ };
+
+ // Helper function to get a URL from a Model or Collection as a property
+ // or as a function.
+ var getUrl = function(object) {
+ if (!(object && object.url)) return null;
+ return _.isFunction(object.url) ? object.url() : object.url;
+ };
+
+ // Throw an error when a URL is needed, and none is supplied.
+ var urlError = function() {
+ throw new Error('A "url" property or function must be specified');
+ };
+
+ // Wrap an optional error callback with a fallback error event.
+ var wrapError = function(onError, model, options) {
+ return function(resp) {
+ if (onError) {
+ onError(model, resp, options);
+ } else {
+ model.trigger('error', model, resp, options);
+ }
+ };
+ };
+
+ // Helper function to escape a string for HTML rendering.
+ var escapeHTML = function(string) {
+ return string.replace(/&(?!\w+;|#\d+;|#x[\da-f]+;)/gi, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/');
+ };
+
+}).call(this);
diff --git a/public/javascripts/vendor/jquery-1.7.1.min.js b/public/javascripts/vendor/jquery-1.7.1.min.js
new file mode 100644
index 000000000..198b3ff07
--- /dev/null
+++ b/public/javascripts/vendor/jquery-1.7.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
I'm troubled to announce that Diaspora has become a dating service too. Yeah, don't laugh. Some time ago I started to follow somebody's posts (I won't disclose any name), then they started to follow mine as well, and we slowly got to know and appreciate each other's ideas and interests. Since Diaspora doesn't have a chat (yet), we began to chat via Jabber/GTalk and progressively became closer and like each other more. We finally met in real life recently... and are now in a relationship. I didn't think that using Diaspora could lead to that. Same thing happened to you? Please tell about it, without forgetting the #Diaspora♥#hashtag!
-
-
-
-
Me da cosa admitirlo, pero debo anunciar que Diaspora tiene ahora función de servicio de encuentros también. No se rian. Hace tiempo empecé a seguir las publicaciones de alguien (no voy a dar ningún nombre), luego esa persona hizo lo mismo y poquito a poco nos fuimos conociendo y agradando. Diaspora no cuenta (todavía) con un sistema de chat, así que a través de Jabber/Gtalk empezamos a conversar y a acercarnos más. Por fin nos conocimos en la vida real hace poco, fue algo muy bonito... y pues ahora tenemos una relación. :) Sinceramente no pensaba que este tipo de encuentro podía suceder en Diaspora... Me encantaría saber si te pasó algo parecido! Por favor cuéntanos, no olvides poner la #etiqueta#Diaspora♥.
-
-
-
-
C'est un peu troublant, mais je me dois d'annoncer que Diaspora fait également office de site de rencontres. On ne rigole pas. Il y a quelque temps, j'ai commencé à suivre les posts de quelqu'un dont je tairai le nom, et cette personne en a fait autant. On a commencé à se connaître, à s'apprécier... se plaire quand les discussions ont continué sur Jabber/Gtalk puisque Diaspora ne fournit pas encore de système de chat. On a fini par se rencontrer dans la vie réelle il y a peu, et maintenant on sort ensemble! C'est un peu inattendu, je ne pensais pas qu'utiliser Diaspora pourrait avoir ce genre de conséquences. Est-ce qu'il vous est arrivé le même genre d'histoire ? Racontez... sans oublier le #tag#Diaspora♥ bien sûr !
just finished up some epic user testing of diaspora with messageTH in San Francisco and Ilya Zhitomirskiy. look forward to a redesigned on-boarding process, browsable hashtags, publishing vs. consuming clarity, and redesigned/fuller profile pages
god. you guys are young enough to be my sons. Amazes me how I pull out hair trying to figure out how to do simple code, yet there's peeps like the D Team changing the SN world, LOL! You guys rock!
ooooh, great press, great idea! Some of the writers over at ReadWriteWeb are really on the ball. :) I've found very few reasons to be cynical about them -- and that's saying a lot in my book.
-
-
-
-
-
diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb
index 6f65ee9a5..b75b48d88 100644
--- a/spec/controllers/aspects_controller_spec.rb
+++ b/spec/controllers/aspects_controller_spec.rb
@@ -36,96 +36,6 @@ describe AspectsController do
end
describe "#index" do
- context 'jasmine fixtures' do
- before do
- Stream::Aspect.any_instance.stub(:ajax_stream?).and_return(false)
- end
-
- it "generates a jasmine fixture", :fixture => true do
- get :index
- save_fixture(html_for("body"), "aspects_index")
- end
-
- it "generates a jasmine fixture with a prefill", :fixture => true do
- get :index, :prefill => "reshare things"
- save_fixture(html_for("body"), "aspects_index_prefill")
- end
-
- it 'generates a jasmine fixture with services', :fixture => true do
- alice.services << Services::Facebook.create(:user_id => alice.id)
- alice.services << Services::Twitter.create(:user_id => alice.id)
- get :index, :prefill => "reshare things"
- save_fixture(html_for("body"), "aspects_index_services")
- end
-
- it 'generates a jasmine fixture with posts', :fixture => true do
- bob.post(:status_message, :text => "Is anyone out there?", :to => @bob.aspects.where(:name => "generic").first.id)
- message = alice.post(:status_message, :text => "hello "*800, :to => @alices_aspect_2.id)
- 5.times { bob.comment("what", :post => message) }
- get :index
- save_fixture(html_for("body"), "aspects_index_with_posts")
- end
-
- it 'generates a jasmine fixture with only posts', :fixture => true do
- 2.times { bob.post(:status_message, :text => "Is anyone out there?", :to => @bob.aspects.where(:name => "generic").first.id) }
-
- get :index, :only_posts => true
-
- save_fixture(response.body, "aspects_index_only_posts")
- end
-
- it "generates a jasmine fixture with a post with comments", :fixture => true do
- message = bob.post(:status_message, :text => "HALO WHIRLED", :to => @bob.aspects.where(:name => "generic").first.id)
- 5.times { bob.comment("what", :post => message) }
- get :index
- save_fixture(html_for("body"), "aspects_index_post_with_comments")
- end
-
- it 'generates a jasmine fixture with a followed tag', :fixture => true do
- @tag = ActsAsTaggableOn::Tag.create!(:name => "partytimeexcellent")
- TagFollowing.create!(:tag => @tag, :user => alice)
- get :index
- save_fixture(html_for("body"), "aspects_index_with_one_followed_tag")
- end
-
- it "generates a jasmine fixture with a post containing a video", :fixture => true do
- stub_request(
- :get,
- "http://gdata.youtube.com/feeds/api/videos/UYrkQL1bX4A?v=2"
- ).with(
- :headers => {'Accept'=>'*/*'}
- ).to_return(
- :status => 200,
- :body => "LazyTown song - Cooking By The Book",
- :headers => {}
- )
-
- stub_request(
- :get,
- "http://www.youtube.com/oembed?format=json&frame=1&iframe=1&maxheight=420&maxwidth=420&url=http://www.youtube.com/watch?v=UYrkQL1bX4A"
- ).with(
- :headers => {'Accept'=>'*/*'}
- ).to_return(
- :status => 200,
- :body => '{ "title": "LazyTown song - Cooking By The Boo" }',
- :headers => {}
- )
-
- alice.post(:status_message, :text => "http://www.youtube.com/watch?v=UYrkQL1bX4A", :to => @alices_aspect_2.id)
- get :index
- save_fixture(html_for("body"), "aspects_index_with_video_post")
- end
-
- it "generates a jasmine fixture with a post that has been liked", :fixture => true do
- message = alice.post(:status_message, :text => "hello "*800, :to => @alices_aspect_2.id)
- alice.build_like(:positive => true, :target => message).save
- bob.build_like(:positive => true, :target => message).save
-
- get :index
- save_fixture(html_for("body"), "aspects_index_with_a_post_with_likes")
- end
- end
-
it 'renders just the stream with the infinite scroll param set' do
get :index, :only_posts => true
response.should render_template('shared/_stream')
diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb
index 6207440f7..e2560fd77 100644
--- a/spec/controllers/comments_controller_spec.rb
+++ b/spec/controllers/comments_controller_spec.rb
@@ -22,8 +22,8 @@ describe CommentsController do
@post = alice.post :status_message, :text => 'GIANTS', :to => aspect_to_post
end
- it 'responds to format js' do
- post :create, comment_hash.merge(:format => 'js')
+ it 'responds to format json' do
+ post :create, comment_hash.merge(:format => 'json')
response.code.should == '201'
response.body.should match comment_hash[:text]
end
@@ -130,13 +130,6 @@ describe CommentsController do
@message = bob.post(:status_message, :text => "hey", :to => aspect_to_post.id)
end
- it 'generates a jasmine fixture', :fixture => true do
- 2.times { alice.comment("hey", :post => @message) }
- get :index, :post_id => @message.id
-
- save_fixture(response.body, "ajax_comments_on_post")
- end
-
it 'works for mobile' do
get :index, :post_id => @message.id, :format => 'mobile'
response.should be_success
diff --git a/spec/controllers/contacts_controller_spec.rb b/spec/controllers/contacts_controller_spec.rb
index 28ae29caf..fc094dfc5 100644
--- a/spec/controllers/contacts_controller_spec.rb
+++ b/spec/controllers/contacts_controller_spec.rb
@@ -63,10 +63,6 @@ describe ContactsController do
response.should be_success
end
- it "generates a jasmine fixture", :fixture => true do
- get :index
- save_fixture(html_for("body"), "aspects_manage")
- end
it 'does not select duplicate contacts' do
aspect = bob.aspects.create(:name => 'hilarious people')
diff --git a/spec/controllers/jasmine_fixtures/aspects_spec.rb b/spec/controllers/jasmine_fixtures/aspects_spec.rb
new file mode 100644
index 000000000..0092b431e
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/aspects_spec.rb
@@ -0,0 +1,106 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+require 'spec_helper'
+
+describe AspectsController do
+ describe '#index' do
+ before do
+ sign_in :user, alice
+ @alices_aspect_2 = alice.aspects.create(:name => "another aspect")
+
+ request.env["HTTP_REFERER"] = 'http://' + request.host
+ end
+
+ context 'jasmine fixtures' do
+ before do
+ Stream::Aspect.any_instance.stub(:ajax_stream?).and_return(false)
+ end
+
+ it "generates a jasmine fixture", :fixture => true do
+ get :index
+ save_fixture(html_for("body"), "aspects_index")
+ end
+
+ it "generates a jasmine fixture with a prefill", :fixture => true do
+ get :index, :prefill => "reshare things"
+ save_fixture(html_for("body"), "aspects_index_prefill")
+ end
+
+ it 'generates a jasmine fixture with services', :fixture => true do
+ alice.services << Services::Facebook.create(:user_id => alice.id)
+ alice.services << Services::Twitter.create(:user_id => alice.id)
+ get :index, :prefill => "reshare things"
+ save_fixture(html_for("body"), "aspects_index_services")
+ end
+
+ it 'generates a jasmine fixture with posts', :fixture => true do
+ bob.post(:status_message, :text => "Is anyone out there?", :to => @bob.aspects.where(:name => "generic").first.id)
+ message = alice.post(:status_message, :text => "hello "*800, :to => @alices_aspect_2.id)
+ 5.times { bob.comment("what", :post => message) }
+ get :index
+ save_fixture(html_for("body"), "aspects_index_with_posts")
+ end
+
+ it 'generates a jasmine fixture with only posts', :fixture => true do
+ 2.times { bob.post(:status_message, :text => "Is anyone out there?", :to => @bob.aspects.where(:name => "generic").first.id) }
+
+ get :index, :only_posts => true
+
+ save_fixture(response.body, "aspects_index_only_posts")
+ end
+
+ it "generates a jasmine fixture with a post with comments", :fixture => true do
+ message = bob.post(:status_message, :text => "HALO WHIRLED", :to => @bob.aspects.where(:name => "generic").first.id)
+ 5.times { bob.comment("what", :post => message) }
+ get :index
+ save_fixture(html_for("body"), "aspects_index_post_with_comments")
+ end
+
+ it 'generates a jasmine fixture with a followed tag', :fixture => true do
+ @tag = ActsAsTaggableOn::Tag.create!(:name => "partytimeexcellent")
+ TagFollowing.create!(:tag => @tag, :user => alice)
+ get :index
+ save_fixture(html_for("body"), "aspects_index_with_one_followed_tag")
+ end
+
+ it "generates a jasmine fixture with a post containing a video", :fixture => true do
+ stub_request(
+ :get,
+ "http://gdata.youtube.com/feeds/api/videos/UYrkQL1bX4A?v=2"
+ ).with(
+ :headers => {'Accept'=>'*/*'}
+ ).to_return(
+ :status => 200,
+ :body => "LazyTown song - Cooking By The Book",
+ :headers => {}
+ )
+
+ stub_request(
+ :get,
+ "http://www.youtube.com/oembed?format=json&frame=1&iframe=1&maxheight=420&maxwidth=420&url=http://www.youtube.com/watch?v=UYrkQL1bX4A"
+ ).with(
+ :headers => {'Accept'=>'*/*'}
+ ).to_return(
+ :status => 200,
+ :body => '{ "title": "LazyTown song - Cooking By The Boo" }',
+ :headers => {}
+ )
+
+ alice.post(:status_message, :text => "http://www.youtube.com/watch?v=UYrkQL1bX4A", :to => @alices_aspect_2.id)
+ get :index
+ save_fixture(html_for("body"), "aspects_index_with_video_post")
+ end
+
+ it "generates a jasmine fixture with a post that has been liked", :fixture => true do
+ message = alice.post(:status_message, :text => "hello "*800, :to => @alices_aspect_2.id)
+ alice.build_like(:positive => true, :target => message).save
+ bob.build_like(:positive => true, :target => message).save
+
+ get :index
+ save_fixture(html_for("body"), "aspects_index_with_a_post_with_likes")
+ end
+ end
+ end
+end
diff --git a/spec/controllers/jasmine_fixtures/comments_spec.rb b/spec/controllers/jasmine_fixtures/comments_spec.rb
new file mode 100644
index 000000000..7c8b3201a
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/comments_spec.rb
@@ -0,0 +1,26 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+require 'spec_helper'
+
+describe CommentsController do
+ describe '#index' do
+ before do
+ sign_in :user, alice
+ end
+
+ it 'generates a jasmine fixture', :fixture => true do
+ aspect_to_post = bob.aspects.where(:name => "generic").first
+ message = bob.post(:status_message, :text => "hey", :to => aspect_to_post.id)
+
+ 2.times do
+ alice.comment("hey", :post => message)
+ end
+
+ get :index, :post_id => message.id
+ save_fixture(response.body, "ajax_comments_on_post")
+ end
+ end
+
+end
diff --git a/spec/controllers/jasmine_fixtures/contacts_spec.rb b/spec/controllers/jasmine_fixtures/contacts_spec.rb
new file mode 100644
index 000000000..d2a5321de
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/contacts_spec.rb
@@ -0,0 +1,18 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+require 'spec_helper'
+
+describe ContactsController do
+ describe '#index' do
+ before do
+ sign_in :user, bob
+ end
+
+ it "generates a jasmine fixture", :fixture => true do
+ get :index
+ save_fixture(html_for("body"), "aspects_manage")
+ end
+ end
+end
diff --git a/spec/controllers/jasmine_fixtures/stream_spec.rb b/spec/controllers/jasmine_fixtures/stream_spec.rb
new file mode 100644
index 000000000..27f71b9c6
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/stream_spec.rb
@@ -0,0 +1,37 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+require 'spec_helper'
+
+describe MultisController do
+ describe '#index' do
+ before do
+ sign_in :user, alice
+ end
+
+ it 'generates the multi_stream_json fixture', :fixture => true do
+ posts = []
+
+ time = Time.now
+ 10.times do
+ Timecop.travel time += 1.day do
+ Timecop.travel time += 1.minute
+ posts << alice.post(:status_message, :text => "hella infos yo!", :to => alice.aspects.first.id)
+ Timecop.travel time += 1.minute
+ posts << alice.post(:reshare, :root_guid => Factory(:status_message, :public => true).guid, :to => 'all')
+ Timecop.travel time += 1.minute
+ posts << alice.post(:status_message, :text => "you're gonna love this.'", :to => alice.aspects.first.id)
+ Timecop.travel time += 1.minute
+ alice.like(1, :target => posts.last)
+ end
+ end
+
+ get :index, :format => :json
+ response.should be_success
+ save_fixture(response.body, "multi_stream_json")
+
+ Timecop.return
+ end
+ end
+end
diff --git a/spec/controllers/jasmine_fixtures/template_spec.rb b/spec/controllers/jasmine_fixtures/template_spec.rb
new file mode 100644
index 000000000..fd38163a2
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/template_spec.rb
@@ -0,0 +1,9 @@
+require "spec_helper"
+
+describe "template generation" do
+ it "generates templates", :fixture => true do
+ extend JasmineFixtureGeneration
+ templates = Haml::Engine.new(Rails.root.join("app", "views", "templates", "_templates.haml").read).render
+ save_fixture(templates, "underscore_templates")
+ end
+end
diff --git a/spec/controllers/likes_controller_spec.rb b/spec/controllers/likes_controller_spec.rb
index f85e009bb..1169cb4f3 100644
--- a/spec/controllers/likes_controller_spec.rb
+++ b/spec/controllers/likes_controller_spec.rb
@@ -29,14 +29,10 @@ describe LikesController do
}
context "on my own post" do
- before do
+ it 'succeeds' do
@target = alice.post :status_message, :text => "AWESOME", :to => @alices_aspect.id
-
@target = alice.comment "hey", :post => @target if class_const == Comment
- end
-
- it 'responds to format js' do
- post :create, like_hash.merge(:format => 'js')
+ post :create, like_hash.merge(:format => :json)
response.code.should == '201'
end
end
@@ -119,9 +115,9 @@ describe LikesController do
it 'lets a user destroy their like' do
expect {
- delete :destroy, :format => "js", id_field => @like.target_id, :id => @like.id
+ delete :destroy, :format => :json, id_field => @like.target_id, :id => @like.id
}.should change(Like, :count).by(-1)
- response.status.should == 200
+ response.status.should == 202
end
it 'does not let a user destroy other likes' do
@@ -129,7 +125,7 @@ describe LikesController do
like2.save
expect {
- delete :destroy, :format => "js", id_field => like2.target_id, :id => like2.id
+ delete :destroy, :format => :json, id_field => like2.target_id, :id => like2.id
}.should_not change(Like, :count)
response.status.should == 403
diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb
index bdf3389ec..db3c4f0c0 100644
--- a/spec/controllers/people_controller_spec.rb
+++ b/spec/controllers/people_controller_spec.rb
@@ -211,12 +211,6 @@ describe PeopleController do
get :show, :id => @user.person.id
response.should be_success
end
-
- it 'passes through the includes option for json requests' do
- json = @user.person.as_json
- Person.any_instance.should_receive(:as_json).with(:includes => "horses").and_return(json)
- get :show, :format => :json, :id => @user.person.id, :includes => "horses"
- end
end
context "with no user signed in" do
diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb
index c7060bbe2..5141ee383 100644
--- a/spec/controllers/posts_controller_spec.rb
+++ b/spec/controllers/posts_controller_spec.rb
@@ -23,8 +23,6 @@ describe PostsController do
it 'succeeds' do
get :show, "id" => @message.id
response.should be_success
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
end
it 'succeeds on mobile' do
@@ -38,9 +36,8 @@ describe PostsController do
end
it 'marks a corresponding notification as read' do
- alice.comment("comment after me", :post => @message)
- bob.comment("here you go", :post => @message)
- note = Notification.where(:recipient_id => alice.id, :target_id => @message.id).first
+ note = Notification.create(:recipient => alice, :target => @message, :unread => true)
+
lambda{
get :show, :id => @message.id
note.reload
@@ -55,7 +52,6 @@ describe PostsController do
end
context 'user not signed in' do
-
context 'given a public post' do
before :each do
@status = alice.post(:status_message, :text => "hello", :public => true, :to => 'all')
@@ -76,27 +72,6 @@ describe PostsController do
get :show, :id => @status.guid, :format => :xml
response.body.should == @status.to_diaspora_xml
end
-
- context 'with more than 3 comments' do
- before do
- (1..5).each do |i|
- alice.comment "comment #{i}", :post => @status
- end
- end
-
- it 'shows all comments of a public post' do
- get :show, :id => @status.id
-
- response.body.should =~ /comment 3/
- response.body.should_not =~ /comment 2/
-
- get :show, :id => @status.id, 'all_comments' => '1'
-
- response.body.should =~ /comment 3/
- response.body.should =~ /comment 2/
- end
- end
-
end
it 'does not show a private post' do
@@ -116,127 +91,13 @@ describe PostsController do
it 'assumes guids less than 8 chars are ids and not guids' do
Post.should_receive(:where).with(hash_including(:id => @status.id)).and_return(Post)
get :show, :id => @status.id
- response.status= 200
+ response.should be_success
end
it 'assumes guids more than (or equal to) 8 chars are actually guids' do
Post.should_receive(:where).with(hash_including(:guid => @status.guid)).and_return(Post)
get :show, :id => @status.guid
- response.status= 200
- end
- end
- end
-
- context 'when a post is public' do
- before do
- @post = alice.post( :status_message, :public => true, :to => alice.aspects, :text => 'abc 123' )
- end
-
- context 'and visitor is not signed in' do
- it 'does not show social links' do
- get :show, 'id' => @post.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_false
- doc.has_link?('Comment').should be_false
- doc.has_link?('Reshare').should be_false
- end
- end
-
- context 'and signed in as poster' do
- before do
- sign_in alice
- end
-
- it 'does not show a reshare link' do
- get :show, 'id' => @post.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
- doc.has_link?('Reshare').should be_false
- end
-
- context 'a reshare of the post' do
- before do
- @reshare = bob.post( :reshare, :public => true, :root_guid => @post.guid, :to => bob.aspects )
- end
-
- it 'does not show a reshare link' do
- get :show, 'id' => @reshare.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
- doc.has_link?('Reshare').should be_false
- doc.has_link?('Reshare original').should be_false
- doc.has_link?('1 reshare').should be_false
- end
- end
- end
-
- context 'and signed in as someone other than the poster' do
- before do
- sign_in bob
- end
-
- it 'shows reshare link' do
- get :show, 'id' => @post.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
- doc.has_link?('Reshare').should be_true
- end
- end
-
- context 'and signed in as the resharer of the post' do
- context 'a reshare of the post' do
- before do
- @reshare = bob.post( :reshare, :public => true, :root_guid => @post.guid, :to => bob.aspects )
- # Don't know why this is needed, but this spec fails without it
- sign_in bob
- end
-
- it 'does not show any reshare link' do
- get :show, 'id' => @reshare.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
- doc.has_link?('1 reshare').should be_false
- doc.has_link?('Reshare').should be_false
- end
- end
- end
-
- context 'and signed in as neither the poster nor the resharer of the post' do
- before do
- sign_in eve
- end
-
- it 'shows reshare link' do
- get :show, 'id' => @post.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
- doc.has_link?('Reshare').should be_true
- end
-
- context 'a reshare of the post' do
- before do
- @reshare = bob.post( :reshare, :public => true, :root_guid => @post.guid, :to => bob.aspects )
- end
-
- it 'shows a reshare link' do
- get :show, 'id' => @reshare.id
-
- doc.has_content?('abc 123').should be_true
- doc.has_link?('Like').should be_true
- doc.has_link?('Comment').should be_true
- doc.has_link?('Reshare original').should be_true
- end
+ response.should be_success
end
end
end
diff --git a/spec/controllers/reshares_controller_spec.rb b/spec/controllers/reshares_controller_spec.rb
index daea3162b..9b400fa82 100644
--- a/spec/controllers/reshares_controller_spec.rb
+++ b/spec/controllers/reshares_controller_spec.rb
@@ -1,38 +1,45 @@
require 'spec_helper'
-describe ResharesController do
+describe ResharesController do
describe '#create' do
+ let(:post_request!) {
+ post :create, :format => :json, :root_guid => @post_guid
+ }
+
+ before do
+ @post_guid = Factory(:status_message, :public => true).guid
+ end
+
it 'requires authentication' do
- post :create, :format => :js
+ post_request!
response.should_not be_success
end
context 'with an authenticated user' do
before do
sign_in :user, bob
- @post_guid = Factory(:status_message, :public => true).guid
@controller.stub(:current_user).and_return(bob)
end
it 'succeeds' do
- post :create, :format => :js, :root_guid => @post_guid
response.should be_success
+ post_request!
end
it 'creates a reshare' do
expect{
- post :create, :format => :js, :root_guid => @post_guid
+ post_request!
}.should change(Reshare, :count).by(1)
end
it 'after save, calls add to streams' do
bob.should_receive(:add_to_streams)
- post :create, :format => :js, :root_guid => @post_guid
+ post_request!
end
it 'calls dispatch' do
bob.should_receive(:dispatch_post).with(anything, hash_including(:additional_subscribers))
- post :create, :format => :js, :root_guid => @post_guid
+ post_request!
end
end
end
diff --git a/spec/controllers/status_messages_controller_spec.rb b/spec/controllers/status_messages_controller_spec.rb
index 8f426cdc5..c851d9acd 100644
--- a/spec/controllers/status_messages_controller_spec.rb
+++ b/spec/controllers/status_messages_controller_spec.rb
@@ -47,39 +47,12 @@ describe StatusMessagesController do
},
:aspect_ids => [@aspect1.id.to_s] }
}
-
+
it 'removes getting started from new users' do
@controller.should_receive(:remove_getting_started)
post :create, status_message_hash
end
- context 'js requests' do
- it 'responds' do
- post :create, status_message_hash.merge(:format => 'js')
- response.status.should == 201
- end
-
- it 'responds with json' do
- post :create, status_message_hash.merge(:format => 'js')
- json = JSON.parse(response.body)
- json['post_id'].should_not be_nil
- json['html'].should_not be_nil
- end
-
- it 'saves the html as a fixture', :fixture => true do
- post :create, status_message_hash.merge(:format => 'js')
- json = JSON.parse(response.body)
- save_fixture(json['html'], "created_status_message")
- end
-
- it 'escapes XSS' do
- xss = ""
- post :create, status_message_hash.merge(:format => 'js', :text => xss)
- json = JSON.parse(response.body)
- json['html'].should_not =~ /