Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/diaspora/diaspora.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Schubert <mail@dennis-schubert.de>2015-09-07 05:22:23 +0300
committerDennis Schubert <mail@dennis-schubert.de>2015-09-07 05:22:47 +0300
commit782c1ef6eebef1bb70f7643c95bc2eb051f7e16f (patch)
tree3508175f09c396fa528033afa6cb801516387576
parenta33eb01c03d74c09ae1008624602b249ef862284 (diff)
parentf855fb971854b67a46800a87a2e155e240e1833e (diff)
Merge branch 'release/0.5.3.0'v0.5.3.0
-rw-r--r--.rubocop.yml6
-rw-r--r--CODE_OF_CONDUCT.md22
-rw-r--r--Changelog.md33
-rw-r--r--Gemfile48
-rw-r--r--Gemfile.lock269
-rw-r--r--README.md6
-rw-r--r--app/assets/javascripts/app/app.js1
-rw-r--r--app/assets/javascripts/app/models/post.js7
-rw-r--r--app/assets/javascripts/app/models/stream.js4
-rw-r--r--app/assets/javascripts/app/pages/contacts.js4
-rw-r--r--app/assets/javascripts/app/router.js2
-rw-r--r--app/assets/javascripts/app/views/back_to_top_view.js26
-rw-r--r--app/assets/javascripts/app/views/conversations_form_view.js10
-rw-r--r--app/assets/javascripts/app/views/hovercard_view.js4
-rw-r--r--app/assets/javascripts/app/views/stream_faces_view.js1
-rw-r--r--app/assets/javascripts/app/views/stream_post_views.js1
-rw-r--r--app/assets/javascripts/app/views/tags_view.js5
-rw-r--r--app/assets/javascripts/diaspora.js6
-rw-r--r--app/assets/javascripts/jsxc.js4
-rw-r--r--app/assets/javascripts/mobile/mobile.js2
-rw-r--r--app/assets/javascripts/view.js40
-rw-r--r--app/assets/javascripts/widgets/back-to-top.js36
-rw-r--r--app/assets/javascripts/widgets/stream.js36
-rw-r--r--app/assets/stylesheets/application.scss3
-rw-r--r--app/assets/stylesheets/conversations.scss5
-rw-r--r--app/assets/stylesheets/error_pages.scss4
-rw-r--r--app/assets/stylesheets/mobile/mobile.scss33
-rw-r--r--app/assets/stylesheets/single-post-view.scss2
-rw-r--r--app/assets/stylesheets/statistics.scss (renamed from app/assets/stylesheets/new_styles/_statistics.scss)2
-rw-r--r--app/assets/stylesheets/stream_element.scss3
-rw-r--r--app/assets/templates/hovercard_tpl.jst.hbs4
-rw-r--r--app/assets/templates/status-message_tpl.jst.hbs28
-rw-r--r--app/assets/templates/stream-element_tpl.jst.hbs42
-rw-r--r--app/controllers/admins_controller.rb4
-rw-r--r--app/controllers/application_controller.rb6
-rw-r--r--app/controllers/comments_controller.rb76
-rw-r--r--app/controllers/home_controller.rb14
-rw-r--r--app/controllers/node_info_controller.rb24
-rw-r--r--app/controllers/people_controller.rb4
-rw-r--r--app/controllers/photos_controller.rb1
-rw-r--r--app/controllers/posts_controller.rb82
-rw-r--r--app/controllers/statistics_controller.rb15
-rw-r--r--app/controllers/status_messages_controller.rb118
-rw-r--r--app/helpers/people_helper.rb1
-rw-r--r--app/models/comment.rb2
-rw-r--r--app/models/conversation.rb4
-rw-r--r--app/models/message.rb2
-rw-r--r--app/models/person.rb44
-rw-r--r--app/models/poll_participation.rb4
-rw-r--r--app/models/post.rb27
-rw-r--r--app/models/user.rb2
-rw-r--r--app/presenters/node_info_presenter.rb104
-rw-r--r--app/presenters/post_interaction_presenter.rb4
-rw-r--r--app/presenters/post_presenter.rb123
-rw-r--r--app/presenters/statistics_presenter.rb100
-rw-r--r--app/services/comment_service.rb43
-rw-r--r--app/services/post_service.rb65
-rw-r--r--app/services/status_message_creation_service.rb89
-rw-r--r--app/views/admins/_admin_bar.haml1
-rw-r--r--app/views/admins/correlations.haml12
-rw-r--r--app/views/contacts/_aspect_listings.haml2
-rw-r--r--app/views/home/default.haml16
-rw-r--r--app/views/node_info/_statistic.haml (renamed from app/views/statistics/_statistic.haml)0
-rw-r--r--app/views/node_info/_statistics.haml22
-rw-r--r--app/views/node_info/statistics.html.haml1
-rw-r--r--app/views/node_info/statistics.mobile.haml1
-rw-r--r--app/views/notifications/index.mobile.haml7
-rw-r--r--app/views/people/show.mobile.haml26
-rw-r--r--app/views/photos/_index.mobile.haml (renamed from app/views/photos/_index.html.haml)0
-rw-r--r--app/views/shared/_right_sections.html.haml2
-rw-r--r--app/views/statistics/_statistics.haml23
-rw-r--r--app/views/statistics/statistics.html.haml1
-rw-r--r--app/views/statistics/statistics.mobile.haml1
-rw-r--r--app/views/streams/main_stream.html.haml16
-rw-r--r--app/workers/fetch_webfinger.rb2
-rw-r--r--config/defaults.yml4
-rw-r--r--config/diaspora.yml.example25
-rw-r--r--config/initializers/diaspora_federation.rb30
-rw-r--r--config/initializers/handlebars_assets.rb1
-rw-r--r--config/initializers/load_libraries.rb4
-rw-r--r--config/load_config.rb2
-rw-r--r--config/locales/devise/devise.az.yml12
-rw-r--r--config/locales/devise/devise.hy.yml4
-rw-r--r--config/locales/devise/devise.nb.yml2
-rw-r--r--config/locales/diaspora/az.yml34
-rw-r--r--config/locales/diaspora/bs.yml3
-rw-r--r--config/locales/diaspora/cs.yml3
-rw-r--r--config/locales/diaspora/da.yml7
-rw-r--r--config/locales/diaspora/de.yml3
-rw-r--r--config/locales/diaspora/de_formal.yml3
-rw-r--r--config/locales/diaspora/el.yml220
-rw-r--r--config/locales/diaspora/en.yml3
-rw-r--r--config/locales/diaspora/en_valspeak.yml3
-rw-r--r--config/locales/diaspora/eo.yml3
-rw-r--r--config/locales/diaspora/es-AR.yml59
-rw-r--r--config/locales/diaspora/es-CL.yml3
-rw-r--r--config/locales/diaspora/es-MX.yml3
-rw-r--r--config/locales/diaspora/es-VE.yml28
-rw-r--r--config/locales/diaspora/es.yml4
-rw-r--r--config/locales/diaspora/eu.yml3
-rw-r--r--config/locales/diaspora/fi.yml6
-rw-r--r--config/locales/diaspora/fr.yml3
-rw-r--r--config/locales/diaspora/he.yml3
-rw-r--r--config/locales/diaspora/hu.yml3
-rw-r--r--config/locales/diaspora/hy.yml302
-rw-r--r--config/locales/diaspora/ia.yml3
-rw-r--r--config/locales/diaspora/it.yml3
-rw-r--r--config/locales/diaspora/ko.yml3
-rw-r--r--config/locales/diaspora/ml.yml3
-rw-r--r--config/locales/diaspora/nb.yml352
-rw-r--r--config/locales/diaspora/nds.yml11
-rw-r--r--config/locales/diaspora/nl.yml3
-rw-r--r--config/locales/diaspora/nn.yml3
-rw-r--r--config/locales/diaspora/pl.yml3
-rw-r--r--config/locales/diaspora/pt-BR.yml17
-rw-r--r--config/locales/diaspora/pt-PT.yml3
-rw-r--r--config/locales/diaspora/ru.yml3
-rw-r--r--config/locales/diaspora/sc.yml41
-rw-r--r--config/locales/diaspora/sk.yml3
-rw-r--r--config/locales/diaspora/sl.yml3
-rw-r--r--config/locales/diaspora/sv.yml89
-rw-r--r--config/locales/diaspora/te.yml3
-rw-r--r--config/locales/diaspora/tr.yml3
-rw-r--r--config/locales/diaspora/uk.yml3
-rw-r--r--config/locales/diaspora/vi.yml3
-rw-r--r--config/locales/diaspora/zh-CN.yml3
-rw-r--r--config/locales/diaspora/zh-TW.yml3
-rw-r--r--config/locales/javascript/javascript.cs.yml2
-rw-r--r--config/locales/javascript/javascript.da.yml2
-rw-r--r--config/locales/javascript/javascript.de.yml2
-rw-r--r--config/locales/javascript/javascript.de_formal.yml2
-rw-r--r--config/locales/javascript/javascript.el.yml4
-rw-r--r--config/locales/javascript/javascript.en.yml2
-rw-r--r--config/locales/javascript/javascript.es-AR.yml7
-rw-r--r--config/locales/javascript/javascript.es-VE.yml35
-rw-r--r--config/locales/javascript/javascript.es.yml2
-rw-r--r--config/locales/javascript/javascript.fr.yml2
-rw-r--r--config/locales/javascript/javascript.hy.yml18
-rw-r--r--config/locales/javascript/javascript.nb.yml69
-rw-r--r--config/locales/javascript/javascript.nl.yml2
-rw-r--r--config/locales/javascript/javascript.pl.yml2
-rw-r--r--config/locales/javascript/javascript.sv.yml30
-rw-r--r--config/locales/javascript/javascript.uk.yml12
-rw-r--r--config/routes.rb19
-rw-r--r--db/migrate/20150724152052_remove_favorites_from_posts.rb9
-rw-r--r--db/schema.rb3
-rw-r--r--features/desktop/conversations.feature13
-rw-r--r--features/desktop/manages_aspects.feature2
-rw-r--r--features/desktop/posts_from_main_page.feature10
-rw-r--r--features/desktop/posts_from_profile_page.feature6
-rw-r--r--features/mobile/home.feature7
-rw-r--r--features/step_definitions/.rubocop.yml5
-rw-r--r--features/step_definitions/aspects_steps.rb33
-rw-r--r--features/step_definitions/custom_web_steps.rb13
-rw-r--r--features/step_definitions/posts_steps.rb4
-rw-r--r--features/support/env.rb3
-rw-r--r--features/support/paths.rb2
-rw-r--r--features/support/user_cuke_helpers.rb4
-rw-r--r--features/support/webmock.rb11
-rw-r--r--lib/diaspora/fetcher/single.rb2
-rw-r--r--lib/federated/relayable.rb2
-rw-r--r--lib/h_card.rb21
-rw-r--r--lib/node_info.rb160
-rw-r--r--lib/postzord/receiver/private.rb4
-rw-r--r--lib/postzord/receiver/public.rb2
-rw-r--r--lib/rake_helpers.rb40
-rw-r--r--lib/statistics.rb203
-rw-r--r--lib/webfinger.rb123
-rw-r--r--lib/webfinger_profile.rb53
-rw-r--r--spec/controllers/comments_controller_spec.rb2
-rw-r--r--spec/controllers/diaspora_federation_controller_spec.rb36
-rw-r--r--spec/controllers/node_info_controller_spec.rb77
-rw-r--r--spec/controllers/notifications_controller_spec.rb18
-rw-r--r--spec/controllers/photos_controller_spec.rb10
-rw-r--r--spec/controllers/posts_controller_spec.rb183
-rw-r--r--spec/controllers/registrations_controller_spec.rb2
-rw-r--r--spec/controllers/statistics_controller_spec.rb30
-rw-r--r--spec/factories.rb29
-rw-r--r--spec/federation_callbacks_spec.rb108
-rw-r--r--spec/fixtures/evan_hcard72
-rw-r--r--spec/fixtures/finger_xrd11
-rw-r--r--spec/fixtures/hcard_response64
-rw-r--r--spec/fixtures/host_xrd7
-rw-r--r--spec/fixtures/nonseed_finger_xrd15
-rw-r--r--spec/helper_methods.rb40
-rw-r--r--spec/helpers/people_helper_spec.rb3
-rw-r--r--spec/integration/receiving_spec.rb5
-rw-r--r--spec/javascripts/app/views/back_to_top_view_spec.js38
-rw-r--r--spec/javascripts/app/views/feedback_view_spec.js12
-rw-r--r--spec/javascripts/app/views/stream_faces_view_spec.js6
-rw-r--r--spec/javascripts/app/views/stream_post_spec.js2
-rw-r--r--spec/javascripts/support/jasmine.yml3
-rw-r--r--spec/javascripts/widgets/back-to-top-spec.js53
-rw-r--r--spec/lib/h_card_spec.rb43
-rw-r--r--spec/lib/postzord/receiver/private_spec.rb6
-rw-r--r--spec/lib/rake_helper_spec.rb26
-rw-r--r--spec/lib/statistics_spec.rb177
-rw-r--r--spec/lib/webfinger_profile_spec.rb42
-rw-r--r--spec/lib/webfinger_spec.rb221
-rw-r--r--spec/models/post_spec.rb50
-rw-r--r--spec/models/reshare_spec.rb9
-rw-r--r--spec/models/user_spec.rb8
-rw-r--r--spec/presenters/node_info_presenter_spec.rb134
-rw-r--r--spec/presenters/post_presenter_spec.rb62
-rw-r--r--spec/presenters/statistics_presenter_spec.rb10
-rw-r--r--spec/services/post_service_spec.rb127
-rw-r--r--spec/workers/fetch_webfinger_spec.rb4
-rw-r--r--vendor/assets/javascripts/mbp-modernizr-custom.js15
-rw-r--r--vendor/assets/javascripts/mbp-respond.min.js7
-rw-r--r--vendor/nodeinfo/schemas/1.0.json206
210 files changed, 3038 insertions, 3016 deletions
diff --git a/.rubocop.yml b/.rubocop.yml
index 7cbf4af9d..66fe0faac 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,5 +1,7 @@
AllCops:
RunRailsCops: true
+ Exclude:
+ - 'db/schema.rb'
# Commonly used screens these days easily fit more than 80 characters.
Metrics/LineLength:
@@ -13,6 +15,10 @@ Metrics/MethodLength:
# The guiding principle of classes is SRP, SRP can't be accurately measured by LoC
Metrics/ClassLength:
Max: 1500
+
+# Raise AbcSize from 15 to 20
+Metrics/AbcSize:
+ Max: 20
# No space makes the method definition shorter and differentiates
# from a regular assignment.
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..ae7ee6c77
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,22 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic addresses, without explicit permission
+* Other unethical or unprofessional conduct.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
+
+This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior should be reported by sending an email to [team@diasporafoundation.org](mailto:team@diasporafoundation.org).
+
+This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
diff --git a/Changelog.md b/Changelog.md
index 1565b4abb..675f428c2 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,36 @@
+# 0.5.3.0
+
+## Refactor
+* Drop broken correlations from the admin pages [#6223](https://github.com/diaspora/diaspora/pull/6223)
+* Extract PostService from PostsController [#6208](https://github.com/diaspora/diaspora/pull/6208)
+* Drop outdated/unused mbp-respond.min.js and mbp-modernizr-custom.js [#6257](https://github.com/diaspora/diaspora/pull/6257)
+* Refactor ApplicationController#after\_sign\_out\_path\_for [#6258](https://github.com/diaspora/diaspora/pull/6258)
+* Extract StatusMessageService from StatusMessagesController [#6280](https://github.com/diaspora/diaspora/pull/6280)
+* Refactor HomeController#toggle\_mobile [#6260](https://github.com/diaspora/diaspora/pull/6260)
+* Extract CommentService from CommentsController [#6307](https://github.com/diaspora/diaspora/pull/6307)
+* Extract user/profile discovery into the diaspora\_federation-rails gem [#6310](https://github.com/diaspora/diaspora/pull/6310)
+* Refactor PostPresenter [#6315](https://github.com/diaspora/diaspora/pull/6315)
+* Convert BackToTop to a backbone view [#6279](https://github.com/diaspora/diaspora/pull/6279) and [#6360](https://github.com/diaspora/diaspora/pull/6360)
+* Automatically follow the new HQ-Account [#6369](https://github.com/diaspora/diaspora/pull/6369)
+
+## Bug fixes
+* Fix indentation and a link title on the default home page [#6212](https://github.com/diaspora/diaspora/pull/6212)
+* Bring peeping Tom on the 404 page back [#6226](https://github.com/diaspora/diaspora/pull/6226)
+* Fix mobile photos index page [#6243](https://github.com/diaspora/diaspora/pull/6243)
+* Fix conversations view with no contacts [#6266](https://github.com/diaspora/diaspora/pull/6266)
+* Links in the left sidebar are now clickable on full width [#6267](https://github.com/diaspora/diaspora/pull/6267)
+* Guard against passing nil into person\_image\_tag [#6286](https://github.com/diaspora/diaspora/pull/6286)
+* Prevent Handlebars from messing up indentation of pre tags [#6339](https://github.com/diaspora/diaspora/pull/6339)
+* Fix pagination design on notifications page [#6364](https://github.com/diaspora/diaspora/pull/6364)
+
+## Features
+
+* Implement NodeInfo [#6239](https://github.com/diaspora/diaspora/pull/6239)
+* Display original author on reshares of NSFW posts [#6270](https://github.com/diaspora/diaspora/pull/6270)
+* Use avatars in hovercards as links to the profile [#6297](https://github.com/diaspora/diaspora/pull/6297)
+* Remove avatars of ignored users from stream faces [#6320](https://github.com/diaspora/diaspora/pull/6320)
+* New /m route to force the mobile view [#6354](https://github.com/diaspora/diaspora/pull/6354)
+
# 0.5.2.0
## Refactor
diff --git a/Gemfile b/Gemfile
index 03acee597..0f3c7ea8d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,6 @@
source "https://rubygems.org"
-gem "rails", "4.2.3"
+gem "rails", "4.2.4"
# Legacy Rails features, remove me!
# responders (class level)
@@ -12,17 +12,18 @@ gem "unicorn", "4.9.0", require: false
# Federation
-gem "diaspora_federation-rails", "0.0.3"
+gem "diaspora_federation-rails", "0.0.6"
# API and JSON
gem "acts_as_api", "0.4.2"
gem "json", "1.8.3"
+gem "json-schema", "2.5.1"
# Authentication
gem "devise", "3.5.1"
-gem "devise_lastseenable", "0.0.4"
+gem "devise_lastseenable", "0.0.6"
gem "devise-token_authenticatable", "~> 0.4.0"
# Captcha
@@ -31,7 +32,7 @@ gem "simple_captcha2", "0.3.4", require: "simple_captcha"
# Background processing
-gem "sidekiq", "3.4.1"
+gem "sidekiq", "3.4.2"
gem "sinatra", "1.4.6"
# Scheduled processing
@@ -40,7 +41,7 @@ gem "sidetiq", "0.6.3"
# Compression
-gem "uglifier", "2.7.1"
+gem "uglifier", "2.7.2"
# Configuration
@@ -55,7 +56,7 @@ gem "rack-cors", "0.4.0", require: "rack/cors"
gem "bootstrap-sass", "2.3.2.2"
gem "compass-rails", "2.0.4"
gem "sass-rails", "5.0.1"
-gem "autoprefixer-rails", "5.2.1"
+gem "autoprefixer-rails", "5.2.1.1"
# Database
@@ -64,12 +65,12 @@ ENV["DB"] ||= "mysql"
gem "mysql2", "0.3.18" if ENV["DB"] == "all" || ENV["DB"] == "mysql"
gem "pg", "0.18.2" if ENV["DB"] == "all" || ENV["DB"] == "postgres"
-gem "activerecord-import", "0.8.0"
+gem "activerecord-import", "0.10.0"
# File uploading
gem "carrierwave", "0.10.0"
-gem "fog", "1.31.0"
+gem "fog", "1.32.0"
gem "mini_magick", "4.2.7"
gem "remotipart", "1.2.1"
@@ -82,7 +83,7 @@ gem "entypo-rails", "2.2.3"
# JavaScript
-gem "backbone-on-rails", "1.1.2.1"
+gem "backbone-on-rails", "1.2.0.0"
gem "handlebars_assets", "0.20.2"
gem "jquery-rails", "4.0.4"
gem "jquery-ui-rails", "5.0.5"
@@ -106,7 +107,7 @@ source "https://rails-assets.org" do
gem "rails-assets-jeresig--jquery.hotkeys", "0.2.0"
gem "rails-assets-jquery-placeholder", "2.1.2"
gem "rails-assets-jquery-textchange", "0.2.3"
- gem "rails-assets-perfect-scrollbar", "0.6.3"
+ gem "rails-assets-perfect-scrollbar", "0.6.4"
gem "rails-assets-jakobmattsson--jquery-elastic", "1.6.11"
end
@@ -146,8 +147,8 @@ gem "omniauth-wordpress", "0.2.2"
gem "active_model_serializers", "0.9.3"
# XMPP chat dependencies
-gem "diaspora-vines", "~> 0.1.27"
-gem "rails-assets-diaspora_jsxc", "~> 0.1.1", source: "https://rails-assets.org"
+gem "diaspora-vines", "~> 0.2.0.develop"
+gem "rails-assets-diaspora_jsxc", "~> 0.1.4.alpha", "< 0.1.4.develop", source: "https://rails-assets.org"
# Tags
@@ -157,13 +158,13 @@ gem "acts-as-taggable-on", "3.5.0"
gem "addressable", "2.3.8", require: "addressable/uri"
gem "faraday", "0.9.1"
-gem "faraday_middleware", "0.9.1"
+gem "faraday_middleware", "0.10.0"
gem "faraday-cookie_jar", "0.0.6"
gem "typhoeus", "0.7.2"
# Views
-gem "gon", "5.2.3"
+gem "gon", "6.0.1"
gem "haml", "4.0.6"
gem "mobile-fu", "1.3.1"
gem "will_paginate", "3.0.7"
@@ -194,7 +195,7 @@ gem "minitest"
group :production do # we don"t install these on travis to speed up test runs
# Administration
- gem "rails_admin", "0.6.8"
+ gem "rails_admin", "0.7.0"
# Analytics
@@ -223,15 +224,15 @@ group :development do
# Automatic test runs
gem "guard-cucumber", "1.5.4"
gem "guard-jshintrb", "1.1.1"
- gem "guard-rspec", "4.5.2"
+ gem "guard-rspec", "4.6.3"
gem "guard-rubocop", "1.2.0"
- gem "guard", "2.12.5", require: false
+ gem "guard", "2.13.0", require: false
gem "rb-fsevent", "0.9.5", require: false
gem "rb-inotify", "0.9.5", require: false
# Linters
gem "jshintrb", "0.3.0"
- gem "rubocop", "0.32.0"
+ gem "rubocop", "0.32.1"
# Preloading environment
@@ -260,24 +261,19 @@ group :test do
gem "capybara", "2.4.4"
gem "database_cleaner" , "1.4.1"
- gem "selenium-webdriver", "2.45.0"
-
- source "https://rails-assets.org" do
- gem "rails-assets-jquery-simulate", "1.0.1"
- gem "rails-assets-jquery-simulate-ext", "1.3.0"
- end
+ gem "selenium-webdriver", "2.47.1"
# General helpers
gem "factory_girl_rails", "4.5.0"
- gem "timecop", "0.7.4"
+ gem "timecop", "0.8.0"
gem "webmock", "1.21.0", require: false
gem "shoulda-matchers", "2.8.0", require: false
end
group :development, :test do
# RSpec (unit tests, some integration tests)
- gem "rspec-rails", "3.3.2"
+ gem "rspec-rails", "3.3.3"
# Cucumber (integration tests)
gem "cucumber-rails", "1.4.2", require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 0e6384508..3e47fd563 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -3,40 +3,40 @@ GEM
remote: https://rails-assets.org/
specs:
CFPropertyList (2.3.1)
- actionmailer (4.2.3)
- actionpack (= 4.2.3)
- actionview (= 4.2.3)
- activejob (= 4.2.3)
+ actionmailer (4.2.4)
+ actionpack (= 4.2.4)
+ actionview (= 4.2.4)
+ activejob (= 4.2.4)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
- actionpack (4.2.3)
- actionview (= 4.2.3)
- activesupport (= 4.2.3)
+ actionpack (4.2.4)
+ actionview (= 4.2.4)
+ activesupport (= 4.2.4)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionview (4.2.3)
- activesupport (= 4.2.3)
+ actionview (4.2.4)
+ activesupport (= 4.2.4)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
active_model_serializers (0.9.3)
activemodel (>= 3.2)
- activejob (4.2.3)
- activesupport (= 4.2.3)
+ activejob (4.2.4)
+ activesupport (= 4.2.4)
globalid (>= 0.3.0)
- activemodel (4.2.3)
- activesupport (= 4.2.3)
+ activemodel (4.2.4)
+ activesupport (= 4.2.4)
builder (~> 3.1)
- activerecord (4.2.3)
- activemodel (= 4.2.3)
- activesupport (= 4.2.3)
+ activerecord (4.2.4)
+ activemodel (= 4.2.4)
+ activesupport (= 4.2.4)
arel (~> 6.0)
- activerecord-import (0.8.0)
+ activerecord-import (0.10.0)
activerecord (>= 3.0)
- activesupport (4.2.3)
+ activesupport (4.2.4)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
@@ -49,18 +49,18 @@ GEM
activesupport (>= 3.0.0)
rack (>= 1.1.0)
addressable (2.3.8)
- arel (6.0.0)
+ arel (6.0.3)
asset_sync (1.1.0)
activemodel
fog (>= 1.8.0)
unf
ast (2.0.0)
- astrolabe (1.3.0)
- parser (>= 2.2.0.pre.3, < 3.0)
- autoprefixer-rails (5.2.1)
+ astrolabe (1.3.1)
+ parser (~> 2.2)
+ autoprefixer-rails (5.2.1.1)
execjs
json
- backbone-on-rails (1.1.2.1)
+ backbone-on-rails (1.2.0.0)
eco
ejs
jquery-rails
@@ -142,21 +142,24 @@ GEM
warden (~> 1.2.3)
devise-token_authenticatable (0.4.0)
devise (~> 3.5.0)
- devise_lastseenable (0.0.4)
+ devise_lastseenable (0.0.6)
devise
rails (>= 3.0.4)
- warden
- diaspora-vines (0.1.27)
+ diaspora-vines (0.2.0.develop.1)
activerecord (~> 4.1)
bcrypt (~> 3.1)
em-hiredis (~> 0.3.0)
eventmachine (>= 1.0.5, < 1.1)
http_parser.rb (~> 0.6)
nokogiri (~> 1.6)
- diaspora_federation (0.0.3)
+ diaspora_federation (0.0.6)
+ faraday (~> 0.9.0)
+ faraday_middleware (~> 0.10.0)
nokogiri (~> 1.6, >= 1.6.6)
- diaspora_federation-rails (0.0.3)
- diaspora_federation (= 0.0.3)
+ typhoeus (~> 0.7.0)
+ valid (~> 1.0.0)
+ diaspora_federation-rails (0.0.6)
+ diaspora_federation (= 0.0.6)
rails (~> 4.2)
diff-lcs (1.2.5)
docile (1.1.5)
@@ -177,9 +180,9 @@ GEM
erubis (2.7.0)
ethon (0.7.4)
ffi (>= 1.3.0)
- eventmachine (1.0.7)
- excon (0.45.3)
- execjs (2.5.2)
+ eventmachine (1.0.8)
+ excon (0.45.4)
+ execjs (2.6.0)
eye (0.7.pre)
celluloid (~> 0.16.0)
celluloid-io (~> 0.16.0)
@@ -199,20 +202,20 @@ GEM
faraday-cookie_jar (0.0.6)
faraday (>= 0.7.4)
http-cookie (~> 1.0.0)
- faraday_middleware (0.9.1)
+ faraday_middleware (0.10.0)
faraday (>= 0.7.4, < 0.10)
- ffi (1.9.8)
+ ffi (1.9.10)
fission (0.5.0)
CFPropertyList (~> 2.2)
fixture_builder (0.4.1)
activerecord (>= 2)
activesupport (>= 2)
- fog (1.31.0)
+ fog (1.32.0)
fog-atmos
- fog-aws (~> 0.0)
+ fog-aws (>= 0.6.0)
fog-brightbox (~> 0.4)
- fog-core (~> 1.30)
- fog-ecloud
+ fog-core (~> 1.32)
+ fog-ecloud (= 0.1.1)
fog-google (>= 0.0.2)
fog-json
fog-local
@@ -233,26 +236,26 @@ GEM
fog-atmos (0.1.0)
fog-core
fog-xml
- fog-aws (0.5.0)
+ fog-aws (0.7.3)
fog-core (~> 1.27)
fog-json (~> 1.0)
fog-xml (~> 0.1)
ipaddress (~> 0.8)
- fog-brightbox (0.7.1)
+ fog-brightbox (0.8.0)
fog-core (~> 1.22)
fog-json
inflecto (~> 0.0.2)
- fog-core (1.31.1)
+ fog-core (1.32.0)
builder
excon (~> 0.45)
formatador (~> 0.2)
mime-types
net-scp (~> 1.1)
net-ssh (>= 2.1.3)
- fog-ecloud (0.1.3)
+ fog-ecloud (0.1.1)
fog-core
fog-xml
- fog-google (0.0.5)
+ fog-google (0.0.7)
fog-core
fog-json
fog-xml
@@ -265,7 +268,7 @@ GEM
fog-core (~> 1.27)
fog-json (~> 1.0)
fog-xml (~> 0.1)
- fog-profitbricks (0.0.3)
+ fog-profitbricks (0.0.5)
fog-core
fog-xml
nokogiri
@@ -283,7 +286,7 @@ GEM
fog-serverlove (0.1.2)
fog-core
fog-json
- fog-softlayer (0.4.6)
+ fog-softlayer (0.4.7)
fog-core
fog-json
fog-storm_on_demand (0.1.1)
@@ -301,7 +304,7 @@ GEM
fog-xml (0.1.2)
fog-core
nokogiri (~> 1.5, >= 1.5.11)
- font-awesome-rails (4.3.0.0)
+ font-awesome-rails (4.4.0.0)
railties (>= 3.2, < 5.0)
formatador (0.2.5)
fuubar (2.0.0)
@@ -309,16 +312,16 @@ GEM
ruby-progressbar (~> 1.4)
gherkin (2.12.2)
multi_json (~> 1.3)
- globalid (0.3.5)
+ globalid (0.3.6)
activesupport (>= 4.1.0)
- gon (5.2.3)
- actionpack (>= 2.3.0)
+ gon (6.0.1)
+ actionpack (>= 3.0)
json
multi_json
- request_store (>= 1.0.5)
- guard (2.12.5)
+ request_store (>= 1.0)
+ guard (2.13.0)
formatador (>= 0.2.4)
- listen (~> 2.7)
+ listen (>= 2.7, <= 4.0)
lumberjack (~> 1.0)
nenv (~> 0.1)
notiffany (~> 0.0)
@@ -333,7 +336,7 @@ GEM
guard-jshintrb (1.1.1)
guard (~> 2.0)
jshintrb
- guard-rspec (4.5.2)
+ guard-rspec (4.6.3)
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
@@ -390,13 +393,14 @@ GEM
multi_json (>= 1.3)
rake
json (1.8.3)
- jwt (1.5.0)
+ json-schema (2.5.1)
+ addressable (~> 2.3.7)
+ jwt (1.5.1)
kaminari (0.16.3)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.9.3)
- listen (2.10.1)
- celluloid (~> 0.16.0)
+ listen (3.0.3)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
little-plugger (1.1.3)
@@ -405,7 +409,7 @@ GEM
multi_json (~> 1.10)
logging-rails (0.5.0)
logging (>= 1.8)
- loofah (2.0.2)
+ loofah (2.0.3)
nokogiri (>= 1.5.9)
lumberjack (1.0.9)
macaddr (1.7.1)
@@ -421,11 +425,11 @@ GEM
mime-types (2.6.1)
mini_magick (4.2.7)
mini_portile (0.6.2)
- minitest (5.7.0)
+ minitest (5.8.0)
mobile-fu (1.3.1)
rack-mobile-detect
rails
- multi_json (1.11.1)
+ multi_json (1.11.2)
multi_test (0.1.2)
multi_xml (0.5.5)
multipart-post (2.0.0)
@@ -436,10 +440,10 @@ GEM
net-scp (1.2.1)
net-ssh (>= 2.6.5)
net-ssh (2.9.2)
- nio4r (1.1.0)
+ nio4r (1.1.1)
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
- notiffany (0.0.6)
+ notiffany (0.0.7)
nenv (~> 0.1)
shellany (~> 0.0)
oauth (0.4.7)
@@ -457,7 +461,7 @@ GEM
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
- omniauth-oauth2 (1.3.0)
+ omniauth-oauth2 (1.3.1)
oauth2 (~> 1.0)
omniauth (~> 1.2)
omniauth-tumblr (1.1)
@@ -471,7 +475,7 @@ GEM
faraday (~> 0.9.0)
nokogiri (~> 1.6)
orm_adapter (0.5.0)
- parser (2.2.2.5)
+ parser (2.2.2.6)
ast (>= 1.1, < 3.0)
phantomjs (1.9.8.0)
powerpack (0.1.1)
@@ -504,23 +508,27 @@ GEM
rack
rack-test (0.6.3)
rack (>= 1.0)
- rails (4.2.3)
- actionmailer (= 4.2.3)
- actionpack (= 4.2.3)
- actionview (= 4.2.3)
- activejob (= 4.2.3)
- activemodel (= 4.2.3)
- activerecord (= 4.2.3)
- activesupport (= 4.2.3)
+ rails (4.2.4)
+ actionmailer (= 4.2.4)
+ actionpack (= 4.2.4)
+ actionview (= 4.2.4)
+ activejob (= 4.2.4)
+ activemodel (= 4.2.4)
+ activerecord (= 4.2.4)
+ activesupport (= 4.2.4)
bundler (>= 1.3.0, < 2.0)
- railties (= 4.2.3)
+ railties (= 4.2.4)
sprockets-rails
- rails-assets-diaspora_jsxc (0.1.1)
- rails-assets-jquery (~> 1.11.1)
- rails-assets-jquery-colorbox (~> 1.5.14)
- rails-assets-jquery-fullscreen (~> 1.1.4)
- rails-assets-jquery-ui (~> 1.10.4)
- rails-assets-jquery.slimscroll (~> 1.3.3)
+ rails-assets-colorbox (1.6.3)
+ rails-assets-jquery (>= 1.3.2)
+ rails-assets-diaspora_jsxc (0.1.4.alpha.1)
+ rails-assets-colorbox (= 1.6.3)
+ rails-assets-favico.js (= 0.3.9)
+ rails-assets-jquery (= 1.11.2)
+ rails-assets-jquery-fullscreen-plugin (= 0.5.0)
+ rails-assets-jquery.slimscroll (= 1.3.6)
+ rails-assets-jquery.ui (= 1.11.4)
+ rails-assets-favico.js (0.3.9)
rails-assets-highlightjs (8.6.0)
rails-assets-jakobmattsson--jquery-elastic (1.6.11)
rails-assets-jquery (>= 1.2.6)
@@ -530,20 +538,15 @@ GEM
rails-assets-jeresig--jquery.hotkeys (0.2.0)
rails-assets-jquery (>= 1.4.2)
rails-assets-jquery (1.11.2)
- rails-assets-jquery-colorbox (1.5.15)
- rails-assets-jquery (>= 1.3.2)
- rails-assets-jquery-fullscreen (1.1.4)
+ rails-assets-jquery-fullscreen-plugin (0.5.0)
rails-assets-jquery-placeholder (2.1.2)
rails-assets-jquery (>= 1.6)
- rails-assets-jquery-simulate (1.0.1)
- rails-assets-jquery-simulate-ext (1.3.0)
- rails-assets-jquery (>= 1.7.0)
rails-assets-jquery-textchange (0.2.3)
rails-assets-jquery
- rails-assets-jquery-ui (1.10.4)
- rails-assets-jquery (>= 1.6)
rails-assets-jquery.slimscroll (1.3.6)
rails-assets-jquery (>= 1.7)
+ rails-assets-jquery.ui (1.11.4)
+ rails-assets-jquery (>= 1.6)
rails-assets-markdown-it--markdown-it-for-inline (0.1.1)
rails-assets-markdown-it (4.4.0)
rails-assets-markdown-it-diaspora-mention (0.3.0)
@@ -551,10 +554,10 @@ GEM
rails-assets-markdown-it-sanitizer (0.3.1)
rails-assets-markdown-it-sub (1.0.0)
rails-assets-markdown-it-sup (1.0.0)
- rails-assets-perfect-scrollbar (0.6.3)
+ rails-assets-perfect-scrollbar (0.6.4)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
- rails-dom-testing (1.0.6)
+ rails-dom-testing (1.0.7)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1)
@@ -566,7 +569,7 @@ GEM
rails-timeago (2.11.0)
actionpack (>= 3.1)
activesupport (>= 3.1)
- rails_admin (0.6.8)
+ rails_admin (0.7.0)
builder (~> 3.1)
coffee-rails (~> 4.0)
font-awesome-rails (>= 3.0, < 5)
@@ -580,13 +583,13 @@ GEM
remotipart (~> 1.0)
safe_yaml (~> 1.0)
sass-rails (>= 4.0, < 6)
- railties (4.2.3)
- actionpack (= 4.2.3)
- activesupport (= 4.2.3)
+ railties (4.2.4)
+ actionpack (= 4.2.4)
+ activesupport (= 4.2.4)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.0.0)
- raindrops (0.13.0)
+ raindrops (0.15.0)
rake (10.4.2)
rb-fsevent (0.9.5)
rb-inotify (0.9.5)
@@ -596,7 +599,7 @@ GEM
redis-namespace (1.5.2)
redis (~> 3.0, >= 3.0.4)
remotipart (1.2.1)
- request_store (1.1.0)
+ request_store (1.2.0)
responders (2.1.0)
railties (>= 4.2.0, < 5)
roxml (3.1.6)
@@ -606,17 +609,17 @@ GEM
rspec-core (~> 3.3.0)
rspec-expectations (~> 3.3.0)
rspec-mocks (~> 3.3.0)
- rspec-core (3.3.1)
+ rspec-core (3.3.2)
rspec-support (~> 3.3.0)
- rspec-expectations (3.3.0)
+ rspec-expectations (3.3.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.3.0)
rspec-instafail (0.2.6)
rspec
- rspec-mocks (3.3.1)
+ rspec-mocks (3.3.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.3.0)
- rspec-rails (3.3.2)
+ rspec-rails (3.3.3)
actionpack (>= 3.0, < 4.3)
activesupport (>= 3.0, < 4.3)
railties (>= 3.0, < 4.3)
@@ -625,7 +628,7 @@ GEM
rspec-mocks (~> 3.3.0)
rspec-support (~> 3.3.0)
rspec-support (3.3.0)
- rubocop (0.32.0)
+ rubocop (0.32.1)
astrolabe (~> 1.3)
parser (>= 2.2.2.5, < 3.0)
powerpack (~> 0.1)
@@ -635,14 +638,14 @@ GEM
ruby-progressbar (1.7.5)
rubyzip (1.1.7)
safe_yaml (1.0.4)
- sass (3.4.13)
+ sass (3.4.16)
sass-rails (5.0.1)
railties (>= 4.0.0, < 5.0)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (~> 1.1)
- selenium-webdriver (2.45.0)
+ selenium-webdriver (2.47.1)
childprocess (~> 0.5)
multi_json (~> 1.0)
rubyzip (~> 1.0)
@@ -650,12 +653,12 @@ GEM
shellany (0.0.1)
shoulda-matchers (2.8.0)
activesupport (>= 3.0.0)
- sidekiq (3.4.1)
+ sidekiq (3.4.2)
celluloid (~> 0.16.0)
- connection_pool (>= 2.1.1)
- json
- redis (>= 3.0.6)
- redis-namespace (>= 1.3.1)
+ connection_pool (~> 2.2, >= 2.2.0)
+ json (~> 1.0)
+ redis (~> 3.2, >= 3.2.1)
+ redis-namespace (~> 1.5, >= 1.5.2)
sidetiq (0.6.3)
celluloid (>= 0.14.1)
ice_cube (= 0.11.1)
@@ -681,7 +684,7 @@ GEM
spring (>= 0.9.1)
spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
- sprockets (2.12.3)
+ sprockets (2.12.4)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
@@ -697,7 +700,7 @@ GEM
thor (0.19.1)
thread_safe (0.3.5)
tilt (1.4.1)
- timecop (0.7.4)
+ timecop (0.8.0)
timers (4.0.1)
hitimes
twitter (5.14.0)
@@ -717,7 +720,7 @@ GEM
ethon (>= 0.7.4)
tzinfo (1.2.2)
thread_safe (~> 0.1)
- uglifier (2.7.1)
+ uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
unf (0.1.4)
@@ -729,6 +732,7 @@ GEM
raindrops (~> 0.7)
uuid (2.3.8)
macaddr (~> 1.0)
+ valid (1.0.0)
warden (1.2.3)
rack (>= 1.0)
webmock (1.21.0)
@@ -744,13 +748,13 @@ PLATFORMS
DEPENDENCIES
active_model_serializers (= 0.9.3)
- activerecord-import (= 0.8.0)
+ activerecord-import (= 0.10.0)
acts-as-taggable-on (= 3.5.0)
acts_as_api (= 0.4.2)
addressable (= 2.3.8)
asset_sync (= 1.1.0)
- autoprefixer-rails (= 5.2.1)
- backbone-on-rails (= 1.1.2.1)
+ autoprefixer-rails (= 5.2.1.1)
+ backbone-on-rails (= 1.2.0.0)
bootstrap-sass (= 2.3.2.2)
capybara (= 2.4.4)
carrierwave (= 0.10.0)
@@ -760,24 +764,24 @@ DEPENDENCIES
database_cleaner (= 1.4.1)
devise (= 3.5.1)
devise-token_authenticatable (~> 0.4.0)
- devise_lastseenable (= 0.0.4)
- diaspora-vines (~> 0.1.27)
- diaspora_federation-rails (= 0.0.3)
+ devise_lastseenable (= 0.0.6)
+ diaspora-vines (~> 0.2.0.develop)
+ diaspora_federation-rails (= 0.0.6)
entypo-rails (= 2.2.3)
eye (= 0.7.pre)
facebox-rails (= 0.2.0)
factory_girl_rails (= 4.5.0)
faraday (= 0.9.1)
faraday-cookie_jar (= 0.0.6)
- faraday_middleware (= 0.9.1)
+ faraday_middleware (= 0.10.0)
fixture_builder (= 0.4.1)
- fog (= 1.31.0)
+ fog (= 1.32.0)
fuubar (= 2.0.0)
- gon (= 5.2.3)
- guard (= 2.12.5)
+ gon (= 6.0.1)
+ guard (= 2.13.0)
guard-cucumber (= 1.5.4)
guard-jshintrb (= 1.1.1)
- guard-rspec (= 4.5.2)
+ guard-rspec (= 4.6.3)
guard-rubocop (= 1.2.0)
haml (= 4.0.6)
handlebars_assets (= 0.20.2)
@@ -791,6 +795,7 @@ DEPENDENCIES
js_image_paths (= 0.0.2)
jshintrb (= 0.3.0)
json (= 1.8.3)
+ json-schema (= 2.5.1)
logging-rails (= 0.5.0)
markerb (= 1.0.2)
messagebus_ruby_api (= 1.0.3)
@@ -815,16 +820,14 @@ DEPENDENCIES
rack-protection (= 1.5.3)
rack-rewrite (= 1.5.1)
rack-ssl (= 1.4.1)
- rails (= 4.2.3)
- rails-assets-diaspora_jsxc (~> 0.1.1)!
+ rails (= 4.2.4)
+ rails-assets-diaspora_jsxc (~> 0.1.4.alpha, < 0.1.4.develop)!
rails-assets-highlightjs (= 8.6.0)!
rails-assets-jakobmattsson--jquery-elastic (= 1.6.11)!
rails-assets-jasmine-ajax (= 3.2.0)!
rails-assets-jeresig--jquery.hotkeys (= 0.2.0)!
rails-assets-jquery (= 1.11.2)!
rails-assets-jquery-placeholder (= 2.1.2)!
- rails-assets-jquery-simulate (= 1.0.1)!
- rails-assets-jquery-simulate-ext (= 1.3.0)!
rails-assets-jquery-textchange (= 0.2.3)!
rails-assets-markdown-it (= 4.4.0)!
rails-assets-markdown-it--markdown-it-for-inline (= 0.1.1)!
@@ -833,10 +836,10 @@ DEPENDENCIES
rails-assets-markdown-it-sanitizer (= 0.3.1)!
rails-assets-markdown-it-sub (= 1.0.0)!
rails-assets-markdown-it-sup (= 1.0.0)!
- rails-assets-perfect-scrollbar (= 0.6.3)!
+ rails-assets-perfect-scrollbar (= 0.6.4)!
rails-i18n (= 4.0.4)
rails-timeago (= 2.11.0)
- rails_admin (= 0.6.8)
+ rails_admin (= 0.7.0)
rb-fsevent (= 0.9.5)
rb-inotify (= 0.9.5)
redcarpet (= 3.3.2)
@@ -844,14 +847,14 @@ DEPENDENCIES
responders (= 2.1.0)
roxml (= 3.1.6)
rspec-instafail (= 0.2.6)
- rspec-rails (= 3.3.2)
- rubocop (= 0.32.0)
+ rspec-rails (= 3.3.3)
+ rubocop (= 0.32.1)
ruby-oembed (= 0.8.14)
rubyzip (= 1.1.7)
sass-rails (= 5.0.1)
- selenium-webdriver (= 2.45.0)
+ selenium-webdriver (= 2.47.1)
shoulda-matchers (= 2.8.0)
- sidekiq (= 3.4.1)
+ sidekiq (= 3.4.2)
sidetiq (= 0.6.3)
simple_captcha2 (= 0.3.4)
simplecov (= 0.10.0)
@@ -861,15 +864,15 @@ DEPENDENCIES
spring-commands-cucumber (= 1.0.1)
spring-commands-rspec (= 1.0.4)
test_after_commit (= 0.4.1)
- timecop (= 0.7.4)
+ timecop (= 0.8.0)
twitter (= 5.14.0)
twitter-text (= 1.12.0)
typhoeus (= 0.7.2)
- uglifier (= 2.7.1)
+ uglifier (= 2.7.2)
unicorn (= 4.9.0)
uuid (= 2.3.8)
webmock (= 1.21.0)
will_paginate (= 3.0.7)
BUNDLED WITH
- 1.10.5
+ 1.10.6
diff --git a/README.md b/README.md
index 201aeea94..bdacd7bb7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-# diaspora*
-### a privacy-aware, distributed, open source social network
+# diaspora*
+### A privacy-aware, distributed, open source social network
**master:** [![Build Status master](https://secure.travis-ci.org/diaspora/diaspora.png?branch=master)](http://travis-ci.org/diaspora/diaspora)
**stable:** [![Build Status stable](https://secure.travis-ci.org/diaspora/diaspora.png?branch=stable)](http://travis-ci.org/diaspora/diaspora) |
@@ -32,6 +32,8 @@ Still haven't found an answer? Talk to us! Read [how we communicate](https://wik
To keep diaspora* growing and improving we need all help we can get. Whether you can contribute [code](https://wiki.diasporafoundation.org/Getting_started_with_contributing), [ideas](https://wiki.diasporafoundation.org/How_we_communicate#Loomio), [translations](https://wiki.diasporafoundation.org/Contribute_translations), [bug reports](https://wiki.diasporafoundation.org/How_to_report_a_bug) or simply extend the community as a [helpful user](https://wiki.diasporafoundation.org/Welcoming_committee) or [pod administrator](https://wiki.diasporafoundation.org/Installation), your help is welcome!
+Everyone interacting in diaspora’s codebases, issue trackers, chat rooms, mailing lists, the wiki, and the Loomio group is expected to follow the diaspora\* [code of conduct](/CODE_OF_CONDUCT.md).
+
## Security
Found a security issue? Please disclose it responsibly. We have a team of developers listening to [security@diasporafoundation.org](mailto:security@diasporafoundation.org). The PGP fingerprint is [AB0D AB02 0FC5 D398 03AB 3CE1 6F70 243F 27AD 886A](http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x6F70243F27AD886A)
diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js
index 11f5dd367..4ff89cf3e 100644
--- a/app/assets/javascripts/app/app.js
+++ b/app/assets/javascripts/app/app.js
@@ -115,6 +115,7 @@ var app = {
new app.views.AspectMembership({el: this});
});
app.sidebar = new app.views.Sidebar();
+ app.backToTop = new app.views.BackToTop({el: $(document)});
},
/* mixpanel wrapper function */
diff --git a/app/assets/javascripts/app/models/post.js b/app/assets/javascripts/app/models/post.js
index 8335f5a0d..c351ee787 100644
--- a/app/assets/javascripts/app/models/post.js
+++ b/app/assets/javascripts/app/models/post.js
@@ -38,13 +38,6 @@ app.models.Post = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin,
.done(function(){ app.events.trigger('person:block:'+personId); });
},
- toggleFavorite : function(options){
- this.set({favorite : !this.get("favorite")});
-
- /* guard against attempting to save a model that a user doesn't own */
- if(options.save){ this.save() }
- },
-
headline : function() {
var headline = this.get("text").trim()
, newlineIdx = headline.indexOf("\n");
diff --git a/app/assets/javascripts/app/models/stream.js b/app/assets/javascripts/app/models/stream.js
index 8201e997d..f1978eb76 100644
--- a/app/assets/javascripts/app/models/stream.js
+++ b/app/assets/javascripts/app/models/stream.js
@@ -83,6 +83,10 @@ app.models.Stream = Backbone.Collection.extend({
this.trigger("fetched");
},
+ remove : function(models) {
+ this.items.remove(models);
+ },
+
preloadOrFetch : function(){ //hai, plz test me THNX
return $.when(app.hasPreload("stream") ? this.preload() : this.fetch());
},
diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js
index 782120b22..0cce5ef15 100644
--- a/app/assets/javascripts/app/pages/contacts.js
+++ b/app/assets/javascripts/app/pages/contacts.js
@@ -81,11 +81,11 @@ app.pages.Contacts = Backbone.View.extend({
$("#aspect_nav .nav").sortable({
items: "li.aspect[data-aspect-id]",
update: function() {
- $("#aspect_nav .ui-sortable").removeClass("synced");
+ $("#aspect_nav .ui-sortable").addClass("syncing");
var data = JSON.stringify({ ordered_aspect_ids: $(this).sortable("toArray", { attribute: "data-aspect-id" }) });
$.ajax(Routes.orderAspects(),
{ type: "put", dataType: "text", contentType: "application/json", data: data })
- .done(function() { $("#aspect_nav .ui-sortable").addClass("synced"); });
+ .done(function() { $("#aspect_nav .ui-sortable").removeClass("syncing"); });
},
revert: true,
helper: "clone"
diff --git a/app/assets/javascripts/app/router.js b/app/assets/javascripts/app/router.js
index 8cefd3f1a..e95e520e4 100644
--- a/app/assets/javascripts/app/router.js
+++ b/app/assets/javascripts/app/router.js
@@ -126,7 +126,7 @@ app.Router = Backbone.Router.extend({
{tagText: decodeURIComponent(name).toLowerCase()}
);
$("#author_info").prepend(followedTagsAction.render().el);
- app.tags = new app.views.Tags({tagName: name});
+ app.tags = new app.views.Tags({hashtagName: name});
}
this._hideInactiveStreamLists();
},
diff --git a/app/assets/javascripts/app/views/back_to_top_view.js b/app/assets/javascripts/app/views/back_to_top_view.js
new file mode 100644
index 000000000..66c516475
--- /dev/null
+++ b/app/assets/javascripts/app/views/back_to_top_view.js
@@ -0,0 +1,26 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.BackToTop = Backbone.View.extend({
+ events: {
+ "click #back-to-top": "backToTop"
+ },
+
+ initialize: function() {
+ var throttledScroll = _.throttle(this.toggleVisibility, 250);
+ $(window).scroll(throttledScroll);
+ },
+
+ backToTop: function(evt) {
+ evt.preventDefault();
+ $("html, body").animate({scrollTop: 0});
+ },
+
+ toggleVisibility: function() {
+ if($("html, body").scrollTop() > 1000) {
+ $("#back-to-top").addClass("visible");
+ } else {
+ $("#back-to-top").removeClass("visible");
+ }
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/conversations_form_view.js b/app/assets/javascripts/app/views/conversations_form_view.js
index d1d2a3e32..5289241dc 100644
--- a/app/assets/javascripts/app/views/conversations_form_view.js
+++ b/app/assets/javascripts/app/views/conversations_form_view.js
@@ -8,6 +8,10 @@ app.views.ConversationsForm = Backbone.View.extend({
initialize: function(opts) {
this.contacts = _.has(opts, "contacts") ? opts.contacts : null;
+ if(!this.contacts || this.contacts.length === 0) {
+ this.displayNoContactsMessage();
+ return;
+ }
this.prefill = [];
if (_.has(opts, "prefillName") && _.has(opts, "prefillValue")) {
this.prefill = [{name : opts.prefillName,
@@ -31,6 +35,12 @@ app.views.ConversationsForm = Backbone.View.extend({
}).focus();
},
+ displayNoContactsMessage: function() {
+ $("form#new_conversation").replaceWith(
+ "<div class=\"well text-center\">" + Diaspora.I18n.t("conversation.new.no_contacts") + "</div>"
+ );
+ },
+
keyDown : function(evt) {
if( evt.keyCode === 13 && evt.ctrlKey ) {
$(evt.target).parents("form").submit();
diff --git a/app/assets/javascripts/app/views/hovercard_view.js b/app/assets/javascripts/app/views/hovercard_view.js
index cfcf49762..1d070096e 100644
--- a/app/assets/javascripts/app/views/hovercard_view.js
+++ b/app/assets/javascripts/app/views/hovercard_view.js
@@ -20,7 +20,7 @@ app.views.Hovercard = app.views.Base.extend({
// cache some element references
this.avatar = this.$('.avatar');
- this.dropdown = this.$('.dropdown_list');
+ this.avatarLink = this.$("a.person_avatar");
this.dropdown_container = this.$('#hovercard_dropdown_container');
this.hashtags = this.$('.hashtags');
this.person_link = this.$('a.person');
@@ -115,10 +115,10 @@ app.views.Hovercard = app.views.Base.extend({
var self = this;
this.avatar.attr('src', person.avatar);
+ this.avatarLink.attr("href", person.url);
this.person_link.attr('href', person.url);
this.person_link.text(person.name);
this.person_handle.text(person.handle);
- this.dropdown.attr('data-person-id', person.id);
// set hashtags
this.hashtags.empty();
diff --git a/app/assets/javascripts/app/views/stream_faces_view.js b/app/assets/javascripts/app/views/stream_faces_view.js
index 0586f6df5..6ad00d057 100644
--- a/app/assets/javascripts/app/views/stream_faces_view.js
+++ b/app/assets/javascripts/app/views/stream_faces_view.js
@@ -11,6 +11,7 @@ app.views.StreamFaces = app.views.Base.extend({
initialize : function(){
this.updatePeople();
app.stream.items.bind("add", this.updatePeople, this);
+ app.stream.items.bind("remove", this.updatePeople, this);
},
presenter : function() {
diff --git a/app/assets/javascripts/app/views/stream_post_views.js b/app/assets/javascripts/app/views/stream_post_views.js
index 60a965136..cd4012050 100644
--- a/app/assets/javascripts/app/views/stream_post_views.js
+++ b/app/assets/javascripts/app/views/stream_post_views.js
@@ -91,6 +91,7 @@ app.views.StreamPost = app.views.Post.extend({
remove : function() {
$(this.el).slideUp(400, _.bind(function(){this.$el.remove()}, this));
+ app.stream.remove(this.model);
return this;
},
diff --git a/app/assets/javascripts/app/views/tags_view.js b/app/assets/javascripts/app/views/tags_view.js
index cf13dbb49..e420281fb 100644
--- a/app/assets/javascripts/app/views/tags_view.js
+++ b/app/assets/javascripts/app/views/tags_view.js
@@ -1,9 +1,8 @@
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
app.views.Tags = Backbone.View.extend({
-
- initialize: function() {
- app.publisher.setText("#"+ this.tagName + " ");
+ initialize: function(opts) {
+ app.publisher.setText("#"+ opts.hashtagName + " ");
}
});
// @license-end
diff --git a/app/assets/javascripts/diaspora.js b/app/assets/javascripts/diaspora.js
index 054905786..157a6ab5e 100644
--- a/app/assets/javascripts/diaspora.js
+++ b/app/assets/javascripts/diaspora.js
@@ -68,7 +68,6 @@
Diaspora.BasePage = function(body) {
$.extend(this, Diaspora.BaseWidget);
$.extend(this, {
- backToTop: this.instantiate("BackToTop", body.find("#back-to-top")),
directionDetector: this.instantiate("DirectionDetector"),
events: function() { return Diaspora.page.eventsContainer.data("events"); },
flashMessages: this.instantiate("FlashMessages"),
@@ -92,11 +91,6 @@
Diaspora.page.publish("page/ready", [$(document.body)]);
};
- // temp hack to check if backbone is enabled for the page
- Diaspora.backboneEnabled = function(){
- return window.app && window.app.stream !== undefined;
- };
-
window.Diaspora = Diaspora;
})();
diff --git a/app/assets/javascripts/jsxc.js b/app/assets/javascripts/jsxc.js
index 40c8abedb..f744c97b8 100644
--- a/app/assets/javascripts/jsxc.js
+++ b/app/assets/javascripts/jsxc.js
@@ -1,3 +1,7 @@
+//= require jquery.slimscroll
+//= require colorbox
+//= require favico.js
+//= require jquery-fullscreen-plugin
//= require diaspora_jsxc
// initialize jsxc xmpp client
diff --git a/app/assets/javascripts/mobile/mobile.js b/app/assets/javascripts/mobile/mobile.js
index 0915480ad..5a97bd54f 100644
--- a/app/assets/javascripts/mobile/mobile.js
+++ b/app/assets/javascripts/mobile/mobile.js
@@ -6,8 +6,6 @@
*/
//= require jquery.charcount
//= require js-routes
-//= require mbp-modernizr-custom
-//= require mbp-respond.min
//= require mbp-helper
//= require jquery.autoSuggest.custom
//= require fileuploader-custom
diff --git a/app/assets/javascripts/view.js b/app/assets/javascripts/view.js
index 508da666d..8d73197bc 100644
--- a/app/assets/javascripts/view.js
+++ b/app/assets/javascripts/view.js
@@ -1,9 +1,6 @@
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
var View = {
initialize: function() {
- /* Buttons */
- $("input:submit").addClass("button");
-
/* label placeholders */
$("input, textarea").placeholder();
@@ -15,11 +12,6 @@ var View = {
/* Submit the form when the user hits enter */
.keypress(this.search.keyPress);
- /* Dropdowns */
- $(document)
- .on('click', this.dropdowns.selector, this.dropdowns.click)
- .on('keypress', this.dropdowns.selector, this.dropdowns.click);
-
$(document).on('ajax:success', 'form[data-remote]', function () {
$(this).clearForm();
$(this).focusout();
@@ -30,30 +22,13 @@ var View = {
$(this).siblings("#tag_following_submit").removeClass('hidden');
});
- $(document.body).click(this.dropdowns.removeFocus);
-
$('a[rel*=facebox]').facebox();
$(document).bind('reveal.facebox', function() {
Diaspora.page.directionDetector.updateBinds();
});
- $("a.new_aspect").click(function(){
- $("input#aspect_name").focus();
- });
-
/* facebox 'done' buttons */
$(document).on('click', "*[rel*=close]", function(){ $.facebox.close(); });
-
- /* notification routing */
- $("#notification").delegate('.hard_object_link', 'click', function(evt){
- var post = $("#"+ $(this).attr('data-ref')),
- lastComment = post.find('.comment.posted').last();
-
- if(post.length > 0){
- evt.preventDefault();
- $('html, body').animate({scrollTop: parseInt(lastComment.offset().top)-80 }, 'fast');
- }
- });
},
search: {
@@ -65,21 +40,6 @@ var View = {
},
selector: "#q"
},
-
- dropdowns: {
- click: function(evt) {
- $(this).parent('.dropdown').toggleClass("active");
- evt.preventDefault();
- },
- removeFocus: function(evt) {
- var $target = $(evt.target);
- if(!$target.is('.dropdown_list *') && !$target.is('.dropdown.active > .toggle')) {
- $(View.dropdowns.selector).parent().removeClass("active");
- }
- },
- selector: ".dropdown > .toggle",
- parentSelector: ".dropdown > .wrapper"
- }
};
$(function() {
diff --git a/app/assets/javascripts/widgets/back-to-top.js b/app/assets/javascripts/widgets/back-to-top.js
deleted file mode 100644
index bde326774..000000000
--- a/app/assets/javascripts/widgets/back-to-top.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
-
-(function() {
- var BackToTop = function() {
- var self = this;
-
- this.subscribe("widget/ready", function(evt, button) {
- $.extend(self, {
- button: button,
- body: $("html, body"),
- window: $(window)
- });
-
- self.button.click(self.backToTop);
-
- var throttledScroll = _.throttle($.proxy(self.toggleVisibility, self), 250);
- self.window.scroll(throttledScroll);
- });
-
- this.backToTop = function(evt) {
- evt.preventDefault();
- self.body.animate({scrollTop: 0});
- };
-
- this.toggleVisibility = function() {
- self.button[
- (self.body.scrollTop() > 1000) ?
- 'addClass' :
- 'removeClass'
- ]('visible');
- };
- };
-
- Diaspora.Widgets.BackToTop = BackToTop;
-})();
-// @license-end
diff --git a/app/assets/javascripts/widgets/stream.js b/app/assets/javascripts/widgets/stream.js
deleted file mode 100644
index a126af0e1..000000000
--- a/app/assets/javascripts/widgets/stream.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
-
-(function() {
- var Stream = function() {
- var self = this;
-
- this.subscribe("widget/ready", function(evt, stream) {
- if( Diaspora.backboneEnabled() ){ return }
-
- $.extend(self, {
- stream: $(stream),
- mainStream: $(stream).find('#main_stream'),
- headerTitle: $(stream).find('#aspect_stream_header > h3')
- });
- });
-
- this.globalSubscribe("stream/reloaded stream/scrolled", function() {
- self.publish("widget/ready", self.stream);
- });
-
- this.empty = function() {
- self.mainStream.empty();
- self.headerTitle.text(Diaspora.I18n.t('stream.no_aspects'));
- };
-
- this.setHeaderTitle = function(newTitle) {
- self.headerTitle.text(newTitle);
- };
- };
-
- if(!Diaspora.backboneEnabled()) {
- Diaspora.Widgets.Stream = Stream;
- }
-})();
-// @license-end
-
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 3638522c2..0117c9135 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -77,6 +77,7 @@
@import 'stream';
@import 'stream_element';
@import 'comments';
+@import 'colorbox';
@import 'diaspora_jsxc';
@import 'chat';
@import 'markdown-content';
@@ -95,4 +96,4 @@
@import 'highlightjs/github';
/* statistics */
-@import 'new_styles/statistics';
+@import 'statistics';
diff --git a/app/assets/stylesheets/conversations.scss b/app/assets/stylesheets/conversations.scss
index f37a0d3c1..fba151f6e 100644
--- a/app/assets/stylesheets/conversations.scss
+++ b/app/assets/stylesheets/conversations.scss
@@ -202,6 +202,11 @@
#conversation_new {
label { font-weight: bold; }
+
+ .well {
+ font-weight: bold;
+ margin-top: 25px;
+ }
}
#no_conversations,
diff --git a/app/assets/stylesheets/error_pages.scss b/app/assets/stylesheets/error_pages.scss
index 452352e65..59ac55d58 100644
--- a/app/assets/stylesheets/error_pages.scss
+++ b/app/assets/stylesheets/error_pages.scss
@@ -1,6 +1,8 @@
@import 'colors';
@import 'mixins';
+html { min-height: 100%; }
+
#big-number {
font-family: Roboto-BoldCondensed, Helvetica, Arial, sans-serif;
font-size: 250px;
@@ -27,7 +29,6 @@
#error_404 {
width: 100%;
height: 100%;
- position: fixed;
bottom:0px;
margin: 0px;
font-family: Roboto, Helvetica, Arial, sans-serif;
@@ -35,6 +36,7 @@
text-shadow: 0 1px 0 #fff;
color: #666;
background: image-url("peeping-tom.png") no-repeat bottom;
+ background-attachment: fixed;
#big-number {
font-family: Roboto-BoldCondensed, Helvetica, Arial, sans-serif;
diff --git a/app/assets/stylesheets/mobile/mobile.scss b/app/assets/stylesheets/mobile/mobile.scss
index d6d056beb..107dab276 100644
--- a/app/assets/stylesheets/mobile/mobile.scss
+++ b/app/assets/stylesheets/mobile/mobile.scss
@@ -849,7 +849,7 @@ form#new_user.new_user input.btn {
text-shadow: 1px 1px 20px rgb(126, 240, 77);
}
-#conversation_inbox {
+#conversation_inbox, .notifications {
.pagination {
margin-left: auto;
margin-right: auto;
@@ -943,37 +943,6 @@ form p.checkbox_select {
padding-left: 120px;
}
-#file-upload.button {
- @include button-gradient($light-grey);
- border-radius: 3px;
- box-shadow: 0 1px 1px #cfcfcf;
- @include transition(border);
-
- display: inline-block;
-
- font {
- style: normal;
- size: 12px;
- }
- color: #505050;
-
- padding: 4px 9px;
-
- min-height: 10px;
-
- border: 1px solid;
-
- cursor: pointer;
- white-space: normal;
-
- &:hover {
- @include button-gradient-hover-no-saturation($light-grey);
- color: #505050;
- text-decoration: none;
- border: 1px solid;
- }
-}
-
#settings_nav {
font-size: 1em;
diff --git a/app/assets/stylesheets/single-post-view.scss b/app/assets/stylesheets/single-post-view.scss
index 7ddcb9576..d39f20d42 100644
--- a/app/assets/stylesheets/single-post-view.scss
+++ b/app/assets/stylesheets/single-post-view.scss
@@ -103,6 +103,8 @@
padding-left: 10px;
}
+ .nsfw-off { display: none; }
+ .nsfw-shield { display: none; }
.oembed { width: 95%; }
.photo_attachments {
img.big_stream_photo { max-width: 90%; }
diff --git a/app/assets/stylesheets/new_styles/_statistics.scss b/app/assets/stylesheets/statistics.scss
index 30a9a871b..983fbd1b7 100644
--- a/app/assets/stylesheets/new_styles/_statistics.scss
+++ b/app/assets/stylesheets/statistics.scss
@@ -1,4 +1,4 @@
-.page-statistics {
+.page-node_info.action-statistics {
h1{ text-align: center; }
h3{
diff --git a/app/assets/stylesheets/stream_element.scss b/app/assets/stylesheets/stream_element.scss
index 0041de0da..3c3a946f8 100644
--- a/app/assets/stylesheets/stream_element.scss
+++ b/app/assets/stylesheets/stream_element.scss
@@ -45,6 +45,9 @@
border-bottom: 1px solid $border-grey;
padding: 10px;
& > .media {
+ &.shield-active .nsfw-hidden { display: none; }
+ &:not(.shield-active) .nsfw-shield { display: none; }
+ &:not(.shield-off) .nsfw-off { display: none; }
& > .img > .avatar {
margin-top: 5px;
&.small {
diff --git a/app/assets/templates/hovercard_tpl.jst.hbs b/app/assets/templates/hovercard_tpl.jst.hbs
index 7070a36f4..32908a080 100644
--- a/app/assets/templates/hovercard_tpl.jst.hbs
+++ b/app/assets/templates/hovercard_tpl.jst.hbs
@@ -1,5 +1,7 @@
<div id="hovercard">
- <img class="avatar">
+ <a class='person_avatar'>
+ <img class="avatar">
+ </a>
<h4>
<a class="person"></a>
</h4>
diff --git a/app/assets/templates/status-message_tpl.jst.hbs b/app/assets/templates/status-message_tpl.jst.hbs
index cf576b853..31a098277 100644
--- a/app/assets/templates/status-message_tpl.jst.hbs
+++ b/app/assets/templates/status-message_tpl.jst.hbs
@@ -1,5 +1,29 @@
+<div class="nsfw-shield">
+ <strong>
+ #NSFW
+ </strong>
+ |
+ <a href="#" class="show_nsfw_post">
+ {{t "stream.show_nsfw_post"}}
+ </a>
+ |
+ <a href="#" class="toggle_nsfw_state">
+ {{t "stream.show_nsfw_posts"}}
+ </a>
+</div>
+
+<div class="nsfw-off">
+ <strong>
+ #NSFW
+ </strong>
+ |
+ <a href="#" class="toggle_nsfw_state">
+ {{t "stream.hide_nsfw_posts"}}
+ </a>
+</div>
+
{{#if largePhoto}}
- <div class="photo_attachments">
+ <div class="photo_attachments nsfw-hidden">
<a href="#" class="stream-photo-link">
{{#with largePhoto}}
<img src="{{sizes.large}}" class="stream-photo big_stream_photo" data-small-photo="{{sizes.small}}" data-full-photo="{{sizes.large}}" rel="lightbox">
@@ -14,7 +38,7 @@
</div>
{{/if}}
-<div class="collapsible">
+<div class="collapsible nsfw-hidden">
<div class="markdown-content">
{{#if text}}
{{{text}}}
diff --git a/app/assets/templates/stream-element_tpl.jst.hbs b/app/assets/templates/stream-element_tpl.jst.hbs
index 6029e056b..3cd2e02c7 100644
--- a/app/assets/templates/stream-element_tpl.jst.hbs
+++ b/app/assets/templates/stream-element_tpl.jst.hbs
@@ -1,5 +1,4 @@
-<div class="media">
-
+<div class="media {{#if showPost}} {{#if nsfw}} shield-off {{/if}} {{else}} shield-active {{/if}}">
{{#with author}}
<a href="/people/{{guid}}" class="img {{{hovercardable this}}}">
{{{personImage this}}}
@@ -54,38 +53,11 @@
</span>
</div>
- {{#if showPost}}
- {{#if nsfw}}
- <div class="nsfw_off">
- <strong>
- #NSFW
- </strong>
- |
- <a href="#" class="toggle_nsfw_state">
- {{t "stream.hide_nsfw_posts"}}
- </a>
- </div>
- {{/if}}
- <div class="post-content"> </div>
- <div class="status-message-location"> </div>
-
- <div class="feedback"> </div>
- <div class="likes"> </div>
- <div class="comments"> </div>
- {{else}}
- <div class="nsfw-shield">
- <strong>
- #NSFW
- </strong>
- |
- <a href="#" class="show_nsfw_post">
- {{t "stream.show_nsfw_post"}}
- </a>
- |
- <a href="#" class="toggle_nsfw_state">
- {{t "stream.show_nsfw_posts"}}
- </a>
- </div>
- {{/if}}
+ <div class="post-content"> </div>
+ <div class="status-message-location nsfw-hidden"> </div>
+ <div class="feedback nsfw-hidden"> </div>
+ <div class="likes nsfw-hidden"> </div>
+ <div class="comments nsfw-hidden"> </div>
</div>
+</div>
diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb
index cf85c0184..f4b345ec7 100644
--- a/app/controllers/admins_controller.rb
+++ b/app/controllers/admins_controller.rb
@@ -75,10 +75,6 @@ class AdminsController < Admin::AdminController
end
- def correlations
- @correlations_hash = Statistics.new.generate_correlations
- end
-
private
def percent_change(today, yesterday)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index faa0b49ba..b8e7b67ff 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -39,11 +39,7 @@ class ApplicationController < ActionController::Base
# Overwriting the sign_out redirect path method
def after_sign_out_path_for(resource_or_scope)
- if is_mobile_device?
- root_path
- else
- new_user_session_path
- end
+ is_mobile_device? ? root_path : new_user_session_path
end
def all_aspects
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index 46927dc96..b8bdb3a4c 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -3,73 +3,71 @@
# the COPYRIGHT file.
class CommentsController < ApplicationController
- include ApplicationHelper
- before_action :authenticate_user!, :except => [:index]
+ before_action :authenticate_user!, except: :index
- respond_to :html,
- :mobile,
- :json
+ respond_to :html, :mobile, :json
rescue_from ActiveRecord::RecordNotFound do
- render :nothing => true, :status => 404
+ render nothing: true, status: 404
end
def create
- post = current_user.find_visible_shareable_by_id(Post, params[:post_id])
- @comment = current_user.comment!(post, params[:text]) if post
-
+ @comment = CommentService.new(post_id: params[:post_id], text: params[:text], user: current_user).create_comment
if @comment
- respond_to do |format|
- format.json{ render :json => CommentPresenter.new(@comment), :status => 201 }
- format.html{ render :nothing => true, :status => 201 }
- format.mobile{ render :partial => 'comment', :locals => {:post => @comment.post, :comment => @comment} }
- end
+ respond_create_success
else
- render :nothing => true, :status => 422
+ render nothing: true, status: 404
end
end
def destroy
- @comment = Comment.find(params[:id])
- if current_user.owns?(@comment) || current_user.owns?(@comment.parent)
- current_user.retract(@comment)
- respond_to do |format|
- format.js { render :nothing => true, :status => 204 }
- format.json { render :nothing => true, :status => 204 }
- format.mobile{ redirect_to :back }
- end
+ service = CommentService.new(comment_id: params[:id], user: current_user)
+ if service.destroy_comment
+ respond_destroy_success
else
- respond_to do |format|
- format.mobile { redirect_to :back }
- format.any(:js, :json) {render :nothing => true, :status => 403}
- end
+ respond_destroy_error
end
end
def new
respond_to do |format|
- format.mobile { render :layout => false }
+ format.mobile { render layout: false }
end
end
def index
- find_post
- raise(ActiveRecord::RecordNotFound.new) unless @post
-
- @comments = @post.comments.for_a_stream
+ service = CommentService.new(post_id: params[:post_id], user: current_user)
+ @post = service.post
+ @comments = service.comments
respond_with do |format|
- format.json { render :json => CommentPresenter.as_collection(@comments), :status => 200 }
- format.mobile{render :layout => false}
+ format.json { render json: CommentPresenter.as_collection(@comments), status: 200 }
+ format.mobile { render layout: false }
end
end
private
- def find_post
- if user_signed_in?
- @post = current_user.find_visible_shareable_by_id(Post, params[:post_id])
- else
- @post = Post.find_by_id_and_public(params[:post_id], true)
+ def respond_create_success
+ respond_to do |format|
+ format.json { render json: CommentPresenter.new(@comment), status: 201 }
+ format.html { render nothing: true, status: 201 }
+ format.mobile { render partial: "comment", locals: {post: @comment.post, comment: @comment} }
+ end
+ end
+
+ def respond_destroy_success
+ respond_to do |format|
+ format.mobile { redirect_to :back }
+ format.js { render nothing: true, status: 204 }
+ format.json { render nothing: true, status: 204 }
+ end
+ end
+
+ def respond_destroy_error
+ respond_to do |format|
+ format.mobile { redirect_to :back }
+ format.js { render nothing: true, status: 403 }
+ format.json { render nothing: true, status: 403 }
end
end
end
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index a1803c231..ee0b7102e 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -26,14 +26,14 @@ class HomeController < ApplicationController
end
def toggle_mobile
- if session[:mobile_view].nil?
- # we're most probably not on mobile, but user wants it anyway
- session[:mobile_view] = true
- else
- # switch from mobile to normal html
- session[:mobile_view] = !session[:mobile_view]
- end
+ session[:mobile_view] = session[:mobile_view].nil? ? true : !session[:mobile_view]
redirect_to :back
end
+
+ def force_mobile
+ session[:mobile_view] = true
+
+ redirect_to stream_path
+ end
end
diff --git a/app/controllers/node_info_controller.rb b/app/controllers/node_info_controller.rb
new file mode 100644
index 000000000..bb0aaa14f
--- /dev/null
+++ b/app/controllers/node_info_controller.rb
@@ -0,0 +1,24 @@
+class NodeInfoController < ApplicationController
+ respond_to :json
+ respond_to :html, only: :statistics
+
+ def jrd
+ render json: NodeInfo.jrd(CGI.unescape(node_info_url("123.123").sub("123.123", "%{version}")))
+ end
+
+ def document
+ if NodeInfo.supported_version?(params[:version])
+ document = NodeInfoPresenter.new(params[:version])
+ render json: document, content_type: document.content_type
+ else
+ head :not_found
+ end
+ end
+
+ def statistics
+ respond_to do |format|
+ format.json { render json: StatisticsPresenter.new }
+ format.all { @statistics = NodeInfoPresenter.new("1.0") }
+ end
+ end
+end
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index a4693a90a..190b3b006 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -41,7 +41,7 @@ class PeopleController < ApplicationController
if diaspora_id?(search_query)
@people = Person.where(:diaspora_handle => search_query.downcase)
if @people.empty?
- Webfinger.in_background(search_query)
+ Workers::FetchWebfinger.perform_async(search_query)
@background_query = search_query.downcase
end
end
@@ -127,7 +127,7 @@ class PeopleController < ApplicationController
def retrieve_remote
if params[:diaspora_handle]
- Webfinger.in_background(params[:diaspora_handle], :single_aspect_form => true)
+ Workers::FetchWebfinger.perform_async(params[:diaspora_handle])
render :nothing => true
else
render :nothing => true, :status => 422
diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb
index 7c543c140..8512ab752 100644
--- a/app/controllers/photos_controller.rb
+++ b/app/controllers/photos_controller.rb
@@ -34,6 +34,7 @@ class PhotosController < ApplicationController
}
render "people/show", layout: "with_header"
end
+ format.mobile { render "people/show" }
format.json{ render_for_api :backbone, :json => @posts, :root => :photos }
end
else
diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index ec31639b3..1d1abb931 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -5,94 +5,58 @@
class PostsController < ApplicationController
include PostsHelper
- before_action :authenticate_user!, :except => [:show, :iframe, :oembed, :interactions]
- before_action :set_format_if_malformed_from_status_net, :only => :show
- before_action :find_post, :only => [:show, :interactions]
+ before_action :authenticate_user!, only: :destroy
+ before_action :set_format_if_malformed_from_status_net, only: :show
- respond_to :html,
- :mobile,
- :json,
- :xml
+ respond_to :html, :mobile, :json, :xml
- rescue_from Diaspora::NonPublic do |exception|
+ rescue_from Diaspora::NonPublic do
respond_to do |format|
- format.all { render :template=>'errors/not_public', :status=>404, :layout => "application"}
+ format.all { render template: "errors/not_public", status: 404, layout: "application" }
end
end
def show
- mark_corresponding_notifications_read if user_signed_in?
-
+ post_service = PostService.new(id: params[:id], user: current_user)
+ post_service.mark_user_notifications
+ @post = post_service.post
respond_to do |format|
- format.html {
- gon.post = PostPresenter.new(@post, current_user)
- render "posts/show"
- }
+ format.html { gon.post = post_service.present_json }
format.xml { render xml: @post.to_diaspora_xml }
- format.mobile { render "posts/show" }
- format.json { render json: PostPresenter.new(@post, current_user) }
+ format.json { render json: post_service.present_json }
end
end
def iframe
- render :text => post_iframe_url(params[:id]), :layout => false
+ render text: post_iframe_url(params[:id]), layout: false
end
def oembed
post_id = OEmbedPresenter.id_from_url(params.delete(:url))
- post = Post.find_by_guid_or_id_with_user(post_id, current_user)
- if post.present?
- oembed = OEmbedPresenter.new(post, params.slice(:format, :maxheight, :minheight))
- render :json => oembed
- else
- render :nothing => true, :status => 404
- end
+ post_service = PostService.new(id: post_id, user: current_user,
+ oembed: params.slice(:format, :maxheight, :minheight))
+ render json: post_service.present_oembed
end
def interactions
- respond_with(PostInteractionPresenter.new(@post, current_user))
+ post_service = PostService.new(id: params[:id], user: current_user)
+ respond_with post_service.present_interactions_json
end
def destroy
- find_current_user_post(params[:id])
- current_user.retract(@post)
-
+ post_service = PostService.new(id: params[:id], user: current_user)
+ post_service.retract_post
+ @post = post_service.post
respond_to do |format|
- format.js { render 'destroy',:layout => false, :format => :js }
- format.json { render :nothing => true, :status => 204 }
+ format.js { render "destroy", layout: false, format: :js }
+ format.json { render nothing: true, status: 204 }
format.any { redirect_to stream_path }
end
end
- def update
- find_current_user_post(params[:id])
- @post.favorite = !@post.favorite
- @post.save
- render :nothing => true, :status => 202
- end
-
- protected
-
- def find_post #checks whether current user can see it
- @post = Post.find_by_guid_or_id_with_user(params[:id], current_user)
- end
-
- def find_current_user_post(id) #makes sure current_user can modify
- @post = current_user.posts.find(id)
- end
+ private
def set_format_if_malformed_from_status_net
- request.format = :html if request.format == 'application/html+xml'
- end
-
- def mark_corresponding_notifications_read
- # For comments, reshares, likes
- Notification.where(recipient_id: current_user.id, target_type: "Post", target_id: @post.id, unread: true).each do |n|
- n.set_read_state( true )
- end
-
- # For mentions
- mention = @post.mentions.where(person_id: current_user.person_id).first
- Notification.where(recipient_id: current_user.id, target_type: "Mention", target_id: mention.id, unread: true).first.try(:set_read_state, true) if mention
+ request.format = :html if request.format == "application/html+xml"
end
end
diff --git a/app/controllers/statistics_controller.rb b/app/controllers/statistics_controller.rb
deleted file mode 100644
index 567a81745..000000000
--- a/app/controllers/statistics_controller.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
-class StatisticsController < ApplicationController
- respond_to :html, :json
-
- def statistics
- @statistics = StatisticsPresenter.new
- respond_to do |format|
- format.json { render json: @statistics }
- format.all
- end
- end
-end
diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb
index e65b0a7c7..2109d3b71 100644
--- a/app/controllers/status_messages_controller.rb
+++ b/app/controllers/status_messages_controller.rb
@@ -1,36 +1,33 @@
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-
class StatusMessagesController < ApplicationController
before_action :authenticate_user!
- before_action :remove_getting_started, :only => [:create]
+ before_action :remove_getting_started, only: :create
- respond_to :html,
- :mobile,
- :json
+ respond_to :html, :mobile, :json
- layout 'application', only: :bookmarklet
+ layout "application", only: :bookmarklet
# Called when a user clicks "Mention" on a profile page
# @param person_id [Integer] The id of the person to be mentioned
def new
- if params[:person_id] && @person = Person.where(:id => params[:person_id]).first
+ if params[:person_id] && fetch_person(params[:person_id])
@aspect = :profile
@contact = current_user.contact_for(@person)
- @aspects_with_person = []
if @contact
- @aspects_with_person = @contact.aspects
- @aspect_ids = @aspects_with_person.map{|x| x.id}
+ @aspects_with_person = @contact.aspects.load
+ @aspect_ids = @aspects_with_person.map(&:id)
gon.aspect_ids = @aspect_ids
- @contacts_of_contact = @contact.contacts
- render :layout => nil
+ render layout: nil
+ else
+ @aspects_with_person = []
end
- elsif(request.format == :mobile)
+ elsif request.format == :mobile
@aspect = :all
- @aspects = current_user.aspects
- @aspect_ids = @aspects.map{ |a| a.id }
+ @aspects = current_user.aspects.load
+ @aspect_ids = @aspects.map(&:id)
gon.aspect_ids = @aspect_ids
else
redirect_to stream_path
@@ -39,90 +36,61 @@ class StatusMessagesController < ApplicationController
def bookmarklet
@aspects = current_user.aspects
- @aspect_ids = @aspects.map{|x| x.id}
+ @aspect_ids = current_user.aspect_ids
gon.preloads[:bookmarklet] = {
content: params[:content],
- title: params[:title],
- url: params[:url],
- notes: params[:notes]
+ title: params[:title],
+ url: params[:url],
+ notes: params[:notes]
}
end
def create
- params[:status_message][:aspect_ids] = [*params[:aspect_ids]]
- normalize_public_flag!
- services = [*params[:services]].compact
-
- @status_message = current_user.build_post(:status_message, params[:status_message])
- @status_message.build_location(:address => params[:location_address], :coordinates => params[:location_coords]) if params[:location_address].present?
- if params[:poll_question].present?
- @status_message.build_poll(:question => params[:poll_question])
- [*params[:poll_answers]].each do |poll_answer|
- @status_message.poll.poll_answers.build(:answer => poll_answer)
- end
+ @status_message = StatusMessageCreationService.new(params, current_user).status_message
+ handle_mention_feedback
+ respond_to do |format|
+ format.html { redirect_to :back }
+ format.mobile { redirect_to stream_path }
+ format.json { render json: PostPresenter.new(@status_message, current_user), status: 201 }
end
+ rescue StandardError => error
+ handle_create_error(error)
+ end
+ private
- @status_message.attach_photos_by_ids(params[:photos])
-
- if @status_message.save
- aspects = current_user.aspects_from_ids(destination_aspect_ids)
- current_user.add_to_streams(@status_message, aspects)
- receiving_services = Service.titles(services)
-
- current_user.dispatch_post(@status_message, :url => short_post_url(@status_message.guid), :service_types => receiving_services)
-
- current_user.participate!(@status_message)
-
- if coming_from_profile_page? && !own_profile_page? # if this is a post coming from a profile page
- flash[:notice] = successful_mention_message
- end
+ def fetch_person(person_id)
+ @person = Person.where(id: person_id).first
+ end
- respond_to do |format|
- format.html { redirect_to :back }
- format.mobile { redirect_to stream_path }
- format.json { render :json => PostPresenter.new(@status_message, current_user), :status => 201 }
- end
- else
- respond_to do |format|
- format.html { redirect_to :back }
- format.mobile { redirect_to stream_path }
- #there are some errors, so we report the first one to the user
- format.json { render :text => @status_message.errors.messages.values.first.to_sentence, :status => 403 }
- end
+ def handle_create_error(error)
+ respond_to do |format|
+ format.html { redirect_to :back }
+ format.mobile { redirect_to stream_path }
+ format.json { render text: error.message, status: 403 }
end
end
- private
-
- def destination_aspect_ids
- if params[:status_message][:public] || params[:status_message][:aspect_ids].first == "all_aspects"
- current_user.aspect_ids
- else
- params[:aspect_ids]
- end
+ def handle_mention_feedback
+ return unless comes_from_others_profile_page?
+ flash[:notice] = successful_mention_message
end
- def successful_mention_message
- t('status_messages.create.success', :names => @status_message.mentioned_people_names)
+ def comes_from_others_profile_page?
+ coming_from_profile_page? && !own_profile_page?
end
def coming_from_profile_page?
- request.env['HTTP_REFERER'].include?("people")
+ request.env["HTTP_REFERER"].include?("people")
end
def own_profile_page?
- request.env['HTTP_REFERER'].include?("/people/" + params[:status_message][:author][:guid].to_s)
+ request.env["HTTP_REFERER"].include?("/people/" + params[:status_message][:author][:guid].to_s)
end
- def normalize_public_flag!
- # mobile || desktop conditions
- sm = params[:status_message]
- public_flag = (sm[:aspect_ids] && sm[:aspect_ids].first == 'public') || sm[:public]
- public_flag.to_s.match(/(true)|(on)/) ? public_flag = true : public_flag = false
- params[:status_message][:public] = public_flag
- public_flag
+ def successful_mention_message
+ t("status_messages.create.success", names: @status_message.mentioned_people_names)
end
def remove_getting_started
diff --git a/app/helpers/people_helper.rb b/app/helpers/people_helper.rb
index e52612bf9..78b58f8fd 100644
--- a/app/helpers/people_helper.rb
+++ b/app/helpers/people_helper.rb
@@ -32,6 +32,7 @@ module PeopleHelper
end
def person_image_tag(person, size = :thumb_small)
+ return "" if person.nil? || person.profile.nil?
image_tag(person.profile.image_url(size), :alt => person.name, :class => 'avatar', :title => person.name, 'data-person_id' => person.id)
end
diff --git a/app/models/comment.rb b/app/models/comment.rb
index aa86daedb..9968177a2 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -54,7 +54,7 @@ class Comment < ActiveRecord::Base
end
def diaspora_handle= nh
- self.author = Webfinger.new(nh).fetch
+ self.author = Person.find_or_fetch_by_identifier(nh)
end
def notification_type(user, person)
diff --git a/app/models/conversation.rb b/app/models/conversation.rb
index 45777b82a..afd4d798c 100644
--- a/app/models/conversation.rb
+++ b/app/models/conversation.rb
@@ -43,7 +43,7 @@ class Conversation < ActiveRecord::Base
end
def diaspora_handle= nh
- self.author = Webfinger.new(nh).fetch
+ self.author = Person.find_or_fetch_by_identifier(nh)
end
def first_unread_message(user)
@@ -68,7 +68,7 @@ class Conversation < ActiveRecord::Base
end
def participant_handles= handles
handles.split(';').each do |handle|
- self.participants << Webfinger.new(handle).fetch
+ participants << Person.find_or_fetch_by_identifier(handle)
end
end
diff --git a/app/models/message.rb b/app/models/message.rb
index f73fc87b9..91ef04057 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -35,7 +35,7 @@ class Message < ActiveRecord::Base
end
def diaspora_handle= nh
- self.author = Webfinger.new(nh).fetch
+ self.author = Person.find_or_fetch_by_identifier(nh)
end
def conversation_guid
diff --git a/app/models/person.rb b/app/models/person.rb
index e419cce30..a242af670 100644
--- a/app/models/person.rb
+++ b/app/models/person.rb
@@ -238,6 +238,19 @@ class Person < ActiveRecord::Base
serialized_public_key = new_key
end
+ # discovery (webfinger)
+ def self.find_or_fetch_by_identifier(account)
+ # exiting person?
+ person = by_account_identifier(account)
+ return person if person.present? && person.profile.present?
+
+ # create or update person from webfinger
+ logger.info "webfingering #{account}, it is not known or needs updating"
+ DiasporaFederation::Discovery::Discovery.new(account).fetch_and_save
+
+ by_account_identifier(account)
+ end
+
# database calls
def self.by_account_identifier(identifier)
identifier = identifier.strip.downcase.sub("acct:", "")
@@ -252,32 +265,6 @@ class Person < ActiveRecord::Base
where(guid: guid, closed_account: false).where.not(owner: nil).take
end
- def self.create_from_webfinger(profile, hcard)
- return nil if profile.nil? || !profile.valid_diaspora_profile?
- new_person = Person.new
- new_person.serialized_public_key = profile.public_key
- new_person.guid = profile.guid
- new_person.diaspora_handle = profile.account
- new_person.url = profile.seed_location
-
- #hcard_profile = HCard.find profile.hcard.first[:href]
- ::Logging::Logger[self].info "event=webfinger_marshal valid=#{new_person.valid?} " \
- "target=#{new_person.diaspora_handle}"
- new_person.assign_new_profile_from_hcard(hcard)
- new_person.save!
- new_person.profile.save!
- new_person
- end
-
- def assign_new_profile_from_hcard(hcard)
- self.profile = Profile.new(:first_name => hcard[:given_name],
- :last_name => hcard[:family_name],
- :image_url => hcard[:photo],
- :image_url_medium => hcard[:photo_medium],
- :image_url_small => hcard[:photo_small],
- :searchable => hcard[:searchable])
- end
-
def remote?
owner_id.nil?
end
@@ -359,7 +346,8 @@ class Person < ActiveRecord::Base
end
def fix_profile
- Webfinger.new(self.diaspora_handle).fetch
- self.reload
+ logger.info "fix profile for account: #{diaspora_handle}"
+ DiasporaFederation::Discovery::Discovery.new(diaspora_handle).fetch_and_save
+ reload
end
end
diff --git a/app/models/poll_participation.rb b/app/models/poll_participation.rb
index 23bd6dd78..64dd32ac5 100644
--- a/app/models/poll_participation.rb
+++ b/app/models/poll_participation.rb
@@ -1,7 +1,7 @@
class PollParticipation < ActiveRecord::Base
include Diaspora::Federated::Base
-
+
include Diaspora::Guid
include Diaspora::Relayable
belongs_to :poll
@@ -37,7 +37,7 @@ class PollParticipation < ActiveRecord::Base
end
def diaspora_handle= nh
- self.author = Webfinger.new(nh).fetch
+ self.author = Person.find_or_fetch_by_identifier(nh)
end
def not_already_participated
diff --git a/app/models/post.rb b/app/models/post.rb
index 79d06078c..e59576085 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -148,17 +148,20 @@ class Post < ActiveRecord::Base
self.author.profile.nsfw?
end
- def self.find_by_guid_or_id_with_user(id, user=nil)
- key = id.to_s.length <= 8 ? :id : :guid
- post = if user
- user.find_visible_shareable_by_id(Post, id, :key => key)
- else
- Post.where(key => id).includes(:author, :comments => :author).first
- end
-
- # is that a private post?
- raise(Diaspora::NonPublic) unless user || post.try(:public?)
-
- post || raise(ActiveRecord::RecordNotFound.new("could not find a post with id #{id}"))
+ def self.find_public(id)
+ where(post_key(id) => id).includes(:author, comments: :author).first.tap do |post|
+ raise ActiveRecord::RecordNotFound.new("could not find a post with id #{id}") unless post
+ raise Diaspora::NonPublic unless post.public?
+ end
+ end
+
+ def self.find_non_public_by_guid_or_id_with_user(id, user)
+ user.find_visible_shareable_by_id(Post, id, key: post_key(id)).tap do |post|
+ raise ActiveRecord::RecordNotFound.new("could not find a post with id #{id}") unless post
+ end
+ end
+
+ def self.post_key(id)
+ id.to_s.length <= 8 ? :id : :guid
end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index a60d67e9c..cf9890d74 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -454,7 +454,7 @@ class User < ActiveRecord::Base
aq = self.aspects.create(:name => I18n.t('aspects.seed.acquaintances'))
if AppConfig.settings.autofollow_on_join?
- default_account = Webfinger.new(AppConfig.settings.autofollow_on_join_user).fetch
+ default_account = Person.find_or_fetch_by_identifier(AppConfig.settings.autofollow_on_join_user)
self.share_with(default_account, aq) if default_account
end
aq
diff --git a/app/presenters/node_info_presenter.rb b/app/presenters/node_info_presenter.rb
new file mode 100644
index 000000000..a52668b7f
--- /dev/null
+++ b/app/presenters/node_info_presenter.rb
@@ -0,0 +1,104 @@
+class NodeInfoPresenter
+ delegate :as_json, :content_type, to: :document
+
+ def initialize(version)
+ @version = version
+ end
+
+ def document
+ @document ||= NodeInfo.build do |doc|
+ doc.version = @version
+
+ add_static_data doc
+ add_configuration doc
+ add_user_counts doc.usage.users
+ add_usage doc.usage
+ end
+ end
+
+ def add_configuration(doc)
+ doc.software.version = version
+ doc.services.outbound = available_services
+ doc.open_registrations = open_registrations?
+ doc.metadata["nodeName"] = name
+ doc.metadata["xmppChat"] = chat_enabled?
+ end
+
+ def add_static_data(doc)
+ doc.software.name = "diaspora"
+ doc.protocols.inbound << "diaspora"
+ doc.protocols.outbound << "diaspora"
+ end
+
+ def add_user_counts(doc)
+ return unless expose_user_counts?
+
+ doc.total = total_users
+ doc.active_halfyear = halfyear_users
+ doc.active_month = monthly_users
+ end
+
+ def add_usage(doc)
+ doc.local_posts = local_posts if expose_posts_counts?
+ doc.local_comments = local_comments if expose_comment_counts?
+ end
+
+ def expose_user_counts?
+ AppConfig.privacy.statistics.user_counts?
+ end
+
+ def expose_posts_counts?
+ AppConfig.privacy.statistics.post_counts?
+ end
+
+ def expose_comment_counts?
+ AppConfig.privacy.statistics.comment_counts?
+ end
+
+ def name
+ AppConfig.settings.pod_name
+ end
+
+ def version
+ AppConfig.version_string
+ end
+
+ def open_registrations?
+ AppConfig.settings.enable_registrations?
+ end
+
+ def chat_enabled?
+ AppConfig.chat.enabled?
+ end
+
+ def available_services
+ Configuration::KNOWN_SERVICES.select {|service|
+ AppConfig.show_service?(service, nil)
+ }.map(&:to_s)
+ end
+
+ def total_users
+ @total_users ||= User.active.count
+ end
+
+ def monthly_users
+ @monthly_users ||= User.monthly_actives.count
+ end
+
+ def halfyear_users
+ @halfyear_users ||= User.halfyear_actives.count
+ end
+
+ def local_posts
+ @local_posts ||= Post.where(type: "StatusMessage")
+ .joins(:author)
+ .where("owner_id IS NOT null")
+ .count
+ end
+
+ def local_comments
+ @local_comments ||= Comment.joins(:author)
+ .where("owner_id IS NOT null")
+ .count
+ end
+end
diff --git a/app/presenters/post_interaction_presenter.rb b/app/presenters/post_interaction_presenter.rb
index c67b7528a..12c999feb 100644
--- a/app/presenters/post_interaction_presenter.rb
+++ b/app/presenters/post_interaction_presenter.rb
@@ -7,7 +7,7 @@ class PostInteractionPresenter
def as_json(_options={})
{
likes: as_api(@post.likes),
- reshares: PostPresenter.collection_json(@post.reshares, @current_user),
+ reshares: PostPresenter.as_collection(@post.reshares, :as_json, @current_user),
comments: CommentPresenter.as_collection(@post.comments.order("created_at ASC")),
participations: as_api(participations),
comments_count: @post.comments_count,
@@ -16,6 +16,8 @@ class PostInteractionPresenter
}
end
+ private
+
def participations
return @post.participations.none unless @current_user
@post.participations.where(author: @current_user.person)
diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb
index 5a763dcee..b1df1a917 100644
--- a/app/presenters/post_presenter.rb
+++ b/app/presenters/post_presenter.rb
@@ -1,85 +1,91 @@
-class PostPresenter
+class PostPresenter < BasePresenter
include PostsHelper
- attr_accessor :post, :current_user
+ attr_accessor :post
- def initialize(post, current_user = nil)
+ def initialize(post, current_user=nil)
@post = post
@current_user = current_user
end
- def self.collection_json(collection, current_user)
- collection.map {|post| PostPresenter.new(post, current_user)}
+ def as_json(_options={})
+ @post.include_root_in_json = false
+ @post.as_json(only: directly_retrieved_attributes).merge(non_directly_retrieved_attributes)
end
- def as_json(options={})
- text = if @post.message
+ private
+
+ def directly_retrieved_attributes
+ %i(id guid public created_at interacted_at provider_display_name image_url object_url)
+ end
+
+ def non_directly_retrieved_attributes
+ {
+ text: build_text,
+ post_type: @post.post_type,
+ nsfw: @post.nsfw,
+ author: @post.author.as_api_response(:backbone),
+ o_embed_cache: @post.o_embed_cache.try(:as_api_response, :backbone),
+ open_graph_cache: build_open_graph_cache,
+ mentioned_people: build_mentioned_people_json,
+ photos: build_photos_json,
+ root: root,
+ title: title,
+ address: @post.address,
+ poll: @post.poll,
+ already_participated_in_poll: already_participated_in_poll,
+ participation: participate?,
+ interactions: build_interactions_json
+ }
+ end
+
+ def build_text
+ if @post.message
@post.message.plain_text_for_json
else
@post.raw_message
end
- {
- :id => @post.id,
- :guid => @post.guid,
- :text => text,
- :public => @post.public,
- :created_at => @post.created_at,
- :interacted_at => @post.interacted_at,
- :provider_display_name => @post.provider_display_name,
- :post_type => @post.post_type,
- :image_url => @post.image_url,
- :object_url => @post.object_url,
- :favorite => @post.favorite,
- :nsfw => @post.nsfw,
- :author => @post.author.as_api_response(:backbone),
- :o_embed_cache => @post.o_embed_cache.try(:as_api_response, :backbone),
- :open_graph_cache => @post.open_graph_cache.try(:as_api_response, :backbone),
- :mentioned_people => @post.mentioned_people.as_api_response(:backbone),
- :photos => @post.photos.map {|p| p.as_api_response(:backbone)},
- :root => root,
- :title => title,
- :address => @post.address,
- :poll => @post.poll(),
- :already_participated_in_poll => already_participated_in_poll,
- :participation => participate?,
-
- :interactions => {
- :likes => [user_like].compact,
- :reshares => [user_reshare].compact,
- :comments_count => @post.comments_count,
- :likes_count => @post.likes_count,
- :reshares_count => @post.reshares_count
- }
- }
end
- def title
- @post.message.present? ? @post.message.title : I18n.t('posts.presenter.title', name: @post.author_name)
+ def build_open_graph_cache
+ @post.open_graph_cache.try(:as_api_response, :backbone)
end
- def root
- PostPresenter.new(@post.absolute_root, current_user).as_json if @post.respond_to?(:absolute_root) && @post.absolute_root.present?
+ def build_mentioned_people_json
+ @post.mentioned_people.as_api_response(:backbone)
end
- def user_like
- @post.like_for(@current_user).try(:as_api_response, :backbone)
+ def build_photos_json
+ @post.photos.map {|p| p.as_api_response(:backbone) }
end
- def user_reshare
- @post.reshare_for(@current_user)
+ def title
+ @post.message.present? ? @post.message.title : I18n.t("posts.presenter.title", name: @post.author_name)
end
- protected
+ def root
+ if @post.respond_to?(:absolute_root) && @post.absolute_root.present?
+ PostPresenter.new(@post.absolute_root, current_user).as_json
+ end
+ end
- def person
- @current_user.person
+ def build_interactions_json
+ {
+ likes: [user_like].compact,
+ reshares: [user_reshare].compact,
+ comments_count: @post.comments_count,
+ likes_count: @post.likes_count,
+ reshares_count: @post.reshares_count
+ }
end
- def user_signed_in?
- @current_user.present?
+ def user_like
+ @post.like_for(current_user).try(:as_api_response, :backbone)
end
- private
+ def user_reshare
+ @post.reshare_for(current_user)
+ end
def already_participated_in_poll
if @post.poll && user_signed_in?
@@ -88,7 +94,14 @@ class PostPresenter
end
def participate?
- user_signed_in? && @current_user.participations.where(:target_id => @post).exists?
+ user_signed_in? && current_user.participations.where(target_id: @post).exists?
end
+ def user_signed_in?
+ current_user.present?
+ end
+
+ def person
+ current_user.person
+ end
end
diff --git a/app/presenters/statistics_presenter.rb b/app/presenters/statistics_presenter.rb
index af88e6871..be74f3b2e 100644
--- a/app/presenters/statistics_presenter.rb
+++ b/app/presenters/statistics_presenter.rb
@@ -2,115 +2,50 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-class StatisticsPresenter
+# TODO: Drop after 0.6
+class StatisticsPresenter < NodeInfoPresenter
+ def initialize
+ super("1.0")
+ end
- def as_json options={}
+ def as_json(_options={})
base_data.merge(user_counts)
.merge(post_counts)
.merge(comment_counts)
- .merge(all_services)
- .merge(legacy_services) # Remove in 0.6
+ .merge(legacy_services)
end
def base_data
{
- 'name' => name,
- 'network' => 'Diaspora',
- 'version' => version,
- 'registrations_open' => open_registrations?,
- 'services' => available_services
+ "name" => name,
+ "network" => "Diaspora",
+ "version" => version,
+ "registrations_open" => open_registrations?,
+ "services" => available_services
}
end
- def name
- AppConfig.settings.pod_name
- end
-
- def version
- AppConfig.version_string
- end
-
- def open_registrations?
- AppConfig.settings.enable_registrations?
- end
-
def user_counts
return {} unless expose_user_counts?
{
- 'total_users' => total_users,
- 'active_users_monthly' => monthly_users,
- 'active_users_halfyear' => halfyear_users
+ "total_users" => total_users,
+ "active_users_monthly" => monthly_users,
+ "active_users_halfyear" => halfyear_users
}
end
- def expose_user_counts?
- AppConfig.privacy.statistics.user_counts?
- end
-
- def total_users
- @total_users ||= User.active.count
- end
-
- def monthly_users
- @monthly_users ||= User.monthly_actives.count
- end
-
- def halfyear_users
- @halfyear_users ||= User.halfyear_actives.count
- end
-
def post_counts
return {} unless expose_posts_counts?
{
- 'local_posts' => local_posts
+ "local_posts" => local_posts
}
end
- def local_posts
- @local_posts ||= Post.where(type: "StatusMessage")
- .joins(:author)
- .where("owner_id IS NOT null")
- .count
- end
-
- def expose_posts_counts?
- AppConfig.privacy.statistics.post_counts?
- end
-
def comment_counts
return {} unless expose_comment_counts?
{
- 'local_comments' => local_comments
- }
- end
-
- def expose_comment_counts?
- AppConfig.privacy.statistics.comment_counts?
- end
-
-
- def local_comments
- @local_comments ||= Comment.joins(:author)
- .where("owner_id IS NOT null")
- .count
- end
-
- def all_services_helper
- result = {}
- Configuration::KNOWN_SERVICES.each {|service, options|
- result[service.to_s] = AppConfig.show_service?(service, nil)
+ "local_comments" => local_comments
}
- result
- end
-
- def all_services
- @all_services ||= all_services_helper
- end
-
- def available_services
- Configuration::KNOWN_SERVICES.select {|service|
- AppConfig.show_service?(service, nil)
- }.map(&:to_s)
end
def legacy_services
@@ -118,5 +53,4 @@ class StatisticsPresenter
result[service.to_s] = AppConfig.show_service?(service, nil)
}
end
-
end
diff --git a/app/services/comment_service.rb b/app/services/comment_service.rb
new file mode 100644
index 000000000..a571db375
--- /dev/null
+++ b/app/services/comment_service.rb
@@ -0,0 +1,43 @@
+class CommentService
+ attr_reader :post, :comments
+
+ def initialize(params)
+ @user = params[:user]
+ @post_id = params[:post_id]
+ @comment_id = params[:comment_id]
+ @text = params[:text]
+
+ @post = find_post! if @post_id
+ @comments = @post.comments.for_a_stream if @post
+ end
+
+ def create_comment
+ @user.comment!(post, @text) if @post
+ end
+
+ def destroy_comment
+ @comment = Comment.find(@comment_id)
+ if @user.owns?(@comment) || @user.owns?(@comment.parent)
+ @user.retract(@comment)
+ true
+ else
+ false
+ end
+ end
+
+ private
+
+ def find_post!
+ find_post.tap do |post|
+ raise(ActiveRecord::RecordNotFound) unless post
+ end
+ end
+
+ def find_post
+ if @user
+ @user.find_visible_shareable_by_id(Post, @post_id)
+ else
+ Post.find_by_id_and_public(@post_id, true)
+ end
+ end
+end
diff --git a/app/services/post_service.rb b/app/services/post_service.rb
new file mode 100644
index 000000000..1408d0642
--- /dev/null
+++ b/app/services/post_service.rb
@@ -0,0 +1,65 @@
+class PostService
+ attr_reader :post
+
+ def initialize(params)
+ @id = params[:id]
+ @user = params[:user]
+ @oembed = params[:oembed] || {}
+ assign_post
+ end
+
+ def assign_post
+ if user
+ @post = Post.find_non_public_by_guid_or_id_with_user(id, user)
+ else
+ @post = Post.find_public(id)
+ end
+ end
+
+ def present_json
+ PostPresenter.new(post, user)
+ end
+
+ def present_interactions_json
+ PostInteractionPresenter.new(post, user)
+ end
+
+ def present_oembed
+ OEmbedPresenter.new(post, oembed)
+ end
+
+ def mark_user_notifications
+ mark_corresponding_notifications_read if user
+ end
+
+ def retract_post
+ raise Diaspora::NotMine unless user_owns_post?
+ user.retract(@post)
+ end
+
+ private
+
+ attr_reader :user, :id, :oembed
+
+ def user_owns_post?
+ post.author == user.person
+ end
+
+ def mark_corresponding_notifications_read
+ mark_comment_reshare_like_notifications_read
+ mark_mention_notifications_read
+ end
+
+ def mark_comment_reshare_like_notifications_read
+ notification = Notification.where(recipient_id: user.id, target_type: "Post", target_id: post.id, unread: true)
+ notification.each do |notification|
+ notification.set_read_state(true)
+ end
+ end
+
+ def mark_mention_notifications_read
+ mention = post.mentions.where(person_id: user.person_id).first
+ Notification.where(recipient_id: user.id, target_type: "Mention", target_id: mention.id, unread: true)
+ .first.try(:set_read_state, true) if mention
+ end
+end
diff --git a/app/services/status_message_creation_service.rb b/app/services/status_message_creation_service.rb
new file mode 100644
index 000000000..3f0093bca
--- /dev/null
+++ b/app/services/status_message_creation_service.rb
@@ -0,0 +1,89 @@
+class StatusMessageCreationService
+ include Rails.application.routes.url_helpers
+
+ attr_reader :status_message
+
+ def initialize(params, user)
+ normalize_params(params, user)
+ status_message_initial = user.build_post(:status_message, params[:status_message])
+ @status_message = add_attachments(params, status_message_initial)
+ @status_message.save
+ process_status_message(user)
+ end
+
+ private
+
+ attr_reader :services, :destination_aspect_ids
+
+ def normalize_params(params, user)
+ normalize_aspect_ids(params)
+ normalize_public_flag!(params)
+ @services = [*params[:services]].compact
+ @destination_aspect_ids = destination_aspect_ids(params, user)
+ end
+
+ def normalize_aspect_ids(params)
+ params[:status_message][:aspect_ids] = [*params[:aspect_ids]]
+ end
+
+ def normalize_public_flag!(params)
+ sm = params[:status_message]
+ public_flag_string = (sm[:aspect_ids] && sm[:aspect_ids].first == "public") || sm[:public]
+ public_flag = public_flag_string.to_s.match(/(true)|(on)/) ? true : false
+ params[:status_message][:public] = public_flag
+ end
+
+ def destination_aspect_ids(params, user)
+ if params[:status_message][:public] || params[:status_message][:aspect_ids].first == "all_aspects"
+ user.aspect_ids
+ else
+ params[:aspect_ids]
+ end
+ end
+
+ def add_attachments(params, status_message_initial)
+ status_message_with_location = add_location(params, status_message_initial)
+ status_message_with_poll = add_poll(params, status_message_with_location)
+ add_photos(params, status_message_with_poll)
+ end
+
+ def add_location(params, status_message)
+ address = params[:location_address]
+ coordinates = params[:location_coords]
+ status_message.build_location(address: address, coordinates: coordinates) if address.present?
+ status_message
+ end
+
+ def add_poll(params, status_message)
+ if params[:poll_question].present?
+ status_message.build_poll(question: params[:poll_question])
+ [*params[:poll_answers]].each do |poll_answer|
+ status_message.poll.poll_answers.build(answer: poll_answer)
+ end
+ end
+ status_message
+ end
+
+ def add_photos(params, status_message)
+ status_message.attach_photos_by_ids(params[:photos])
+ status_message
+ end
+
+ def process_status_message(user)
+ add_status_message_to_streams(user)
+ dispatch_status_message(user)
+ user.participate!(@status_message)
+ end
+
+ def add_status_message_to_streams(user)
+ aspects = user.aspects_from_ids(@destination_aspect_ids)
+ user.add_to_streams(@status_message, aspects)
+ end
+
+ def dispatch_status_message(user)
+ receiving_services = Service.titles(@services)
+ user.dispatch_post(@status_message,
+ url: short_post_url(@status_message.guid, host: AppConfig.environment.url),
+ service_types: receiving_services)
+ end
+end
diff --git a/app/views/admins/_admin_bar.haml b/app/views/admins/_admin_bar.haml
index 75145d1be..a00e0c542 100644
--- a/app/views/admins/_admin_bar.haml
+++ b/app/views/admins/_admin_bar.haml
@@ -10,6 +10,5 @@
%li= link_to t('.weekly_user_stats'), weekly_user_stats_path
%li= link_to t('.pod_stats'), pod_stats_path
%li= link_to t('.report'), report_index_path
- %li= link_to t('.correlations'), correlations_path
%li= link_to t('.sidekiq_monitor'), sidekiq_path
diff --git a/app/views/admins/correlations.haml b/app/views/admins/correlations.haml
deleted file mode 100644
index 703f96af7..000000000
--- a/app/views/admins/correlations.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-.container
- %div
- = render :partial => 'admins/admin_bar'
-
- %div.row
- %div.span12
- %h1
- = t('.correlations_count')
- %ul
- - @correlations_hash.keys.each do |k|
- %li
- = "#{k.to_s}, #{@correlations_hash[k]}"
diff --git a/app/views/contacts/_aspect_listings.haml b/app/views/contacts/_aspect_listings.haml
index 664b412c6..450b433d2 100644
--- a/app/views/contacts/_aspect_listings.haml
+++ b/app/views/contacts/_aspect_listings.haml
@@ -1,5 +1,5 @@
#aspect_nav
- %ul.nav.nav-tabs.nav-stacked.synced
+ %ul.nav.nav-tabs.nav-stacked.ui-sortable
%li.all_contacts{:class => ("active" if params["set"] == "all")}
%a{:href => contacts_path(:set => "all")}
= t('contacts.index.all_contacts')
diff --git a/app/views/home/default.haml b/app/views/home/default.haml
index 919a81185..c08fa9f65 100644
--- a/app/views/home/default.haml
+++ b/app/views/home/default.haml
@@ -18,13 +18,13 @@
= image_tag "landing/cog.png"
%p
- Look at
- %code.helpful{title: "General pod configuration (location to upload photos, SSL certs, etc.)"}
- config/diaspora.yml.example
- and
- %code.helpful{title: "MySQL username/password"}
- config/database.yml.example
- for help.
+ Look at
+ %code.helpful{title: "General pod configuration (location to upload photos, SSL certs, etc.)"}
+ config/diaspora.yml.example
+ and
+ %code.helpful{title: "MySQL username/password"}
+ config/database.yml.example
+ for help.
.span4
%h2 Try it out
@@ -48,7 +48,7 @@
%ul#links
%ul.section
%li= link_to "Codebase", "http://github.com/diaspora/diaspora", title: "Git repository"
- %li= link_to "Documentation", "http://wiki.diasporafoundation.org", title: "Wiki on github"
+ %li= link_to "Documentation", "http://wiki.diasporafoundation.org", title: "Project wiki"
%ul.section
%li= link_to "IRC - General", "http://webchat.freenode.net/?channels=diaspora", title: "#diaspora"
%li= link_to "IRC - Development", "http://webchat.freenode.net/?channels=diaspora-dev", title: "#diaspora-dev"
diff --git a/app/views/statistics/_statistic.haml b/app/views/node_info/_statistic.haml
index 130dc6c1a..130dc6c1a 100644
--- a/app/views/statistics/_statistic.haml
+++ b/app/views/node_info/_statistic.haml
diff --git a/app/views/node_info/_statistics.haml b/app/views/node_info/_statistics.haml
new file mode 100644
index 000000000..6e5b44c08
--- /dev/null
+++ b/app/views/node_info/_statistics.haml
@@ -0,0 +1,22 @@
+-# Copyright (c) 2010-2011, Diaspora Inc. This file is
+-# licensed under the Affero General Public License version 3 or later. See
+-# the COPYRIGHT file.
+
+.container-fluid
+ .row-fluid
+ %h1= t("_statistics")
+ = render "statistic", name: t("statistics.name"), value: @statistics.name, activated: "serv-enabled"
+ = render "statistic", name: t("statistics.version"), value: @statistics.version, activated: "serv-enabled"
+ = render "statistic", name: t("statistics.registrations"), value: registrations_status(@statistics), activated: registrations_status_class(@statistics)
+ - if @statistics.expose_user_counts?
+ = render "statistic", name: t("statistics.total_users"), value: @statistics.total_users, activated: "serv-enabled"
+ = render "statistic", name: t("statistics.active_users_halfyear"), value: @statistics.halfyear_users, activated: "serv-enabled"
+ = render "statistic", name: t("statistics.active_users_monthly"), value: @statistics.monthly_users, activated: "serv-enabled"
+ - if @statistics.expose_posts_counts?
+ = render "statistic", name: t("statistics.local_posts"), value: @statistics.local_posts, activated: "serv-enabled"
+ - if @statistics.expose_comment_counts?
+ = render "statistic", name: t("statistics.local_comments"), value: @statistics.local_comments, activated: "serv-enabled"
+ .row-fluid
+ %h1= t("statistics.services")
+ - Configuration::KNOWN_SERVICES.each do |service|
+ = render "statistic", name: "#{service.capitalize}", value: service_status(service, @statistics.available_services), activated: service_class(service, @statistics.available_services)
diff --git a/app/views/node_info/statistics.html.haml b/app/views/node_info/statistics.html.haml
new file mode 100644
index 000000000..246fec5d9
--- /dev/null
+++ b/app/views/node_info/statistics.html.haml
@@ -0,0 +1 @@
+= render "statistics"
diff --git a/app/views/node_info/statistics.mobile.haml b/app/views/node_info/statistics.mobile.haml
new file mode 100644
index 000000000..246fec5d9
--- /dev/null
+++ b/app/views/node_info/statistics.mobile.haml
@@ -0,0 +1 @@
+= render "statistics"
diff --git a/app/views/notifications/index.mobile.haml b/app/views/notifications/index.mobile.haml
index 7258fc418..67e542618 100644
--- a/app/views/notifications/index.mobile.haml
+++ b/app/views/notifications/index.mobile.haml
@@ -21,4 +21,9 @@
.time_notif
= timeago(note.created_at)
- = will_paginate @notifications, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
+ = will_paginate @notifications,
+ previous_label: "&laquo;",
+ next_label: "&raquo;",
+ inner_window: 1,
+ outer_window: 0,
+ renderer: WillPaginate::ActionView::BootstrapLinkRenderer
diff --git a/app/views/people/show.mobile.haml b/app/views/people/show.mobile.haml
index db85990ae..426fe0886 100644
--- a/app/views/people/show.mobile.haml
+++ b/app/views/people/show.mobile.haml
@@ -18,17 +18,17 @@
= Diaspora::Taggable.format_tags(@person.tag_string)
.span12.profile_stream
- - if @stream.stream_posts.length > 0
- - if @post_type == :photos
- = render 'photos/index', :photos => @stream.stream_posts
- - else
- #main_stream.stream
- = render 'shared/stream', :posts => @stream.stream_posts
- = render 'shared/stream_more_button'
+ - if @post_type == :photos
+ = render "photos/index", photos: @posts
- else
- #main_stream
- .dull
- - if @block.present?
- = t('.ignoring', :name => @person.first_name)
- - elsif user_signed_in? && (current_user.person != @person)
- = t('.has_not_shared_with_you_yet', :name => @person.first_name)
+ - if @stream.stream_posts.length > 0
+ #main_stream.stream
+ = render "shared/stream", posts: @stream.stream_posts
+ = render "shared/stream_more_button"
+ - else
+ #main_stream
+ .dull
+ - if @block.present?
+ = t(".ignoring", name: @person.first_name)
+ - elsif user_signed_in? && (current_user.person != @person)
+ = t(".has_not_shared_with_you_yet", name: @person.first_name)
diff --git a/app/views/photos/_index.html.haml b/app/views/photos/_index.mobile.haml
index c28e76c7d..c28e76c7d 100644
--- a/app/views/photos/_index.html.haml
+++ b/app/views/photos/_index.mobile.haml
diff --git a/app/views/shared/_right_sections.html.haml b/app/views/shared/_right_sections.html.haml
index feb135beb..13f0e7d10 100644
--- a/app/views/shared/_right_sections.html.haml
+++ b/app/views/shared/_right_sections.html.haml
@@ -90,7 +90,7 @@
%p
= t('aspects.index.help.contact_podmin')
%p
- = link_to t('aspects.index.help.mail_podmin'), "mailto:#{AppConfig.admins.podmin_email}", :class => "button"
+ = link_to t("aspects.index.help.mail_podmin"), "mailto:#{AppConfig.admins.podmin_email}"
.section
.title
diff --git a/app/views/statistics/_statistics.haml b/app/views/statistics/_statistics.haml
deleted file mode 100644
index 28626eed3..000000000
--- a/app/views/statistics/_statistics.haml
+++ /dev/null
@@ -1,23 +0,0 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-.row-fluid
- %h1
- = t('_statistics')
- = render 'statistics/statistic', name: t('statistics.name'), value: @statistics.name, activated: "serv-enabled"
- = render 'statistics/statistic', name: t('statistics.version'), value: @statistics.version, activated: "serv-enabled"
- = render 'statistics/statistic', name: t('statistics.registrations'), value: registrations_status(@statistics), activated: registrations_status_class(@statistics)
- - if @statistics.expose_user_counts?
- = render 'statistics/statistic', name: t('statistics.total_users'), value: @statistics.total_users, activated: "serv-enabled"
- = render 'statistics/statistic', name: t('statistics.active_users_halfyear'), value: @statistics.halfyear_users, activated: "serv-enabled"
- = render 'statistics/statistic', name: t('statistics.active_users_monthly'), value: @statistics.monthly_users, activated: "serv-enabled"
- - if @statistics.expose_posts_counts?
- = render 'statistics/statistic', name: t('statistics.local_posts'), value: @statistics.local_posts, activated: "serv-enabled"
- - if @statistics.expose_comment_counts?
- = render 'statistics/statistic', name: t('statistics.local_comments'), value: @statistics.local_comments, activated: "serv-enabled"
-.row-fluid
- %h1
- = t('statistics.services')
- - Configuration::KNOWN_SERVICES.each do |service|
- = render 'statistics/statistic', name: "#{service.capitalize}", value: service_status(service, @statistics.available_services), activated: service_class(service, @statistics.available_services) \ No newline at end of file
diff --git a/app/views/statistics/statistics.html.haml b/app/views/statistics/statistics.html.haml
deleted file mode 100644
index a55da7893..000000000
--- a/app/views/statistics/statistics.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-= render('statistics/statistics') \ No newline at end of file
diff --git a/app/views/statistics/statistics.mobile.haml b/app/views/statistics/statistics.mobile.haml
deleted file mode 100644
index a55da7893..000000000
--- a/app/views/statistics/statistics.mobile.haml
+++ /dev/null
@@ -1 +0,0 @@
-= render('statistics/statistics') \ No newline at end of file
diff --git a/app/views/streams/main_stream.html.haml b/app/views/streams/main_stream.html.haml
index ba2e90e5f..a3c7fccb6 100644
--- a/app/views/streams/main_stream.html.haml
+++ b/app/views/streams/main_stream.html.haml
@@ -29,16 +29,16 @@
= link_to current_user.first_name, local_or_remote_person_path(current_user.person)
%ul#stream_selection
- %li.hoverable{:data => {:stream => 'stream'}}
- = link_to t("streams.multi.title"), stream_path, :rel => 'backbone'
- %li.hoverable{:data => {:stream => 'activity'}}
- = link_to t("streams.activity.title"), activity_stream_path, :rel => 'backbone'
- %li.hoverable{:data => {:stream => 'mentions'}}
- = link_to t('streams.mentions.title'), mentioned_stream_path, :rel => 'backbone'
+ %li{data: {stream: "stream"}}
+ = link_to t("streams.multi.title"), stream_path, rel: "backbone", class: "hoverable"
+ %li{data: {stream: "activity"}}
+ = link_to t("streams.activity.title"), activity_stream_path, rel: "backbone", class: "hoverable"
+ %li{data: {stream: "mentions"}}
+ = link_to t("streams.mentions.title"), mentioned_stream_path, rel: "backbone", class: "hoverable"
%li.all_aspects
- = render 'aspects/aspect_listings', :stream => @stream
+ = render "aspects/aspect_listings", stream: @stream
%li
- = render 'tags/followed_tags_listings'
+ = render "tags/followed_tags_listings"
.span6
#aspect_stream_container.stream_container
diff --git a/app/workers/fetch_webfinger.rb b/app/workers/fetch_webfinger.rb
index 5dda819ef..3b277824d 100644
--- a/app/workers/fetch_webfinger.rb
+++ b/app/workers/fetch_webfinger.rb
@@ -7,7 +7,7 @@ module Workers
sidekiq_options queue: :socket_webfinger
def perform(account)
- person = Webfinger.new(account).fetch
+ person = Person.find_or_fetch_by_identifier(account)
# also, schedule to fetch a few public posts from that person
Diaspora::Fetcher::Public.queue_for(person) unless person.nil?
diff --git a/config/defaults.yml b/config/defaults.yml
index 7643c5c42..36790cb62 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -4,7 +4,7 @@
defaults:
version:
- number: "0.5.2.0" # Do not touch unless doing a release, do not backport the version number that's in master
+ number: "0.5.3.0" # Do not touch unless doing a release, do not backport the version number that's in master
heroku: false
environment:
url: "http://localhost:3000/"
@@ -99,7 +99,7 @@ defaults:
pod_name: 'diaspora*'
enable_registrations: true
autofollow_on_join: true
- autofollow_on_join_user: 'diasporahq@joindiaspora.com'
+ autofollow_on_join_user: 'hq@pod.diaspora.software'
welcome_message:
enabled: false
subject: 'Welcome Message'
diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example
index 269834c9a..fadd51328 100644
--- a/config/diaspora.yml.example
+++ b/config/diaspora.yml.example
@@ -206,13 +206,13 @@ configuration: ## Section
## The internal XMPP server does not support https
## and even if we implement it, we would ran into certificate issues.
## The problem with mixed-content is described here:
- ## https://github.com/Zauberstuhl/diaspora/issues/6
+ ## https://wiki.diasporafoundation.org/Vines#Browser_blocks_mixed-content
##
## The easiest way of avoiding certificate and mixed-content issues
## is to use a proxy, e.g.:
##
- ## Apache: https://gist.github.com/Zauberstuhl/2d09330961614b12b642
- ## Nginx: https://gist.github.com/Zauberstuhl/ee95e1eacefa6ddbec6e
+ ## Apache: https://wiki.diasporafoundation.org/Vines#Apache2
+ ## Nginx: https://wiki.diasporafoundation.org/Vines#Nginx
##
## If you configured your proxy correctly, you should adjust
## the configuration in the BOSH section.
@@ -228,8 +228,11 @@ configuration: ## Section
## In case you want to run your own server, you should disable it.
#enabled: false
- ## Set the directory in which to look for virtual hosts'
- ## TLS certificates.
+ ## Set the directory in which to look for virtual hosts TLS certificates.
+ ## Check documentation on how to generate or configure your existing
+ ## certficates correctly:
+ ##
+ ## https://wiki.diasporafoundation.org/Vines#Certificates
#certs: 'config/vines'
## The server accepts by default only valid certificates.
@@ -254,6 +257,10 @@ configuration: ## Section
#address: '0.0.0.0'
## Configure the client-to-server port.
+ ## If your server is behind a router or firewall
+ ## check documentation on how to forward ports:
+ ##
+ ## https://wiki.diasporafoundation.org/Vines#Firewall_Ports
#port: 5222
## The maximum we'd like to allow for stanza size.
@@ -270,6 +277,10 @@ configuration: ## Section
#address: '0.0.0.0'
## Configure the server-to-server port.
+ ## If your server is behind a router or firewall
+ ## check documentation on how to forward ports:
+ ##
+ ## https://wiki.diasporafoundation.org/Vines#Firewall_Ports
#port: 5269
## The max_stanza_size attribute should be
@@ -408,11 +419,11 @@ configuration: ## Section
## follow an account upon creation.
#autofollow_on_join: true
- ## Auto-follow account (default='diasporahq@joindiaspora.com')
+ ## Auto-follow account (default='hq@pod.diaspora.software')
## The diaspora* HQ account keeps users up to date with news about Diaspora.
## If you set another auto-follow account (for example your podmin account),
## please consider resharing diaspora* HQ's posts for your pod's users!
- #autofollow_on_join_user: 'diasporahq@joindiaspora.com'
+ #autofollow_on_join_user: 'hq@pod.diaspora.software'
## Welcome Message settings
welcome_message: ##Section
diff --git a/config/initializers/diaspora_federation.rb b/config/initializers/diaspora_federation.rb
index cedbf2e00..f15dcf5cf 100644
--- a/config/initializers/diaspora_federation.rb
+++ b/config/initializers/diaspora_federation.rb
@@ -3,11 +3,13 @@ DiasporaFederation.configure do |config|
# the pod url
config.server_uri = AppConfig.pod_uri
+ config.certificate_authorities = AppConfig.environment.certificate_authorities.get
+
config.define_callbacks do
- on :person_webfinger_fetch do |handle|
+ on :fetch_person_for_webfinger do |handle|
person = Person.find_local_by_diaspora_handle(handle)
if person
- DiasporaFederation::WebFinger::WebFinger.new(
+ DiasporaFederation::Discovery::WebFinger.new(
acct_uri: "acct:#{person.diaspora_handle}",
alias_url: AppConfig.url_to("/people/#{person.guid}"),
hcard_url: AppConfig.url_to(DiasporaFederation::Engine.routes.url_helpers.hcard_path(person.guid)),
@@ -21,10 +23,10 @@ DiasporaFederation.configure do |config|
end
end
- on :person_hcard_fetch do |guid|
+ on :fetch_person_for_hcard do |guid|
person = Person.find_local_by_guid(guid)
if person
- DiasporaFederation::WebFinger::HCard.new(
+ DiasporaFederation::Discovery::HCard.new(
guid: person.guid,
nickname: person.username,
full_name: "#{person.profile.first_name} #{person.profile.last_name}".strip,
@@ -39,5 +41,25 @@ DiasporaFederation.configure do |config|
)
end
end
+
+ on :save_person_after_webfinger do |person|
+ # find existing person or create a new one
+ person_entity = Person.find_by(diaspora_handle: person.diaspora_id) ||
+ Person.new(diaspora_handle: person.diaspora_id, guid: person.guid,
+ serialized_public_key: person.exported_key, url: person.url)
+
+ profile = person.profile
+ profile_entity = person_entity.profile ||= Profile.new
+
+ # fill or update profile
+ profile_entity.first_name = profile.first_name
+ profile_entity.last_name = profile.last_name
+ profile_entity.image_url = profile.image_url
+ profile_entity.image_url_medium = profile.image_url_medium
+ profile_entity.image_url_small = profile.image_url_small
+ profile_entity.searchable = profile.searchable
+
+ person_entity.save!
+ end
end
end
diff --git a/config/initializers/handlebars_assets.rb b/config/initializers/handlebars_assets.rb
new file mode 100644
index 000000000..94bf58554
--- /dev/null
+++ b/config/initializers/handlebars_assets.rb
@@ -0,0 +1 @@
+HandlebarsAssets::Config.options = {preventIndent: true}
diff --git a/config/initializers/load_libraries.rb b/config/initializers/load_libraries.rb
index ff4f78492..86d701d33 100644
--- a/config/initializers/load_libraries.rb
+++ b/config/initializers/load_libraries.rb
@@ -14,14 +14,10 @@ require 'diaspora'
require 'direction_detector'
require 'email_inviter'
require 'evil_query'
-require 'h_card'
require 'hydra_wrapper'
require 'postzord'
require 'publisher'
require 'pubsubhubbub'
require 'salmon'
-require 'statistics'
require 'stream'
-require 'webfinger'
-require 'webfinger_profile'
require 'account_deleter'
diff --git a/config/load_config.rb b/config/load_config.rb
index 5e9985200..e02deb90d 100644
--- a/config/load_config.rb
+++ b/config/load_config.rb
@@ -26,7 +26,7 @@ AppConfig ||= Configurate::Settings.create do
add_provider Configurate::Provider::YAML,
File.join(config_dir, "diaspora.yml"),
- namespace: rails_env, required: false unless rails_env == "test"
+ namespace: rails_env, required: false
add_provider Configurate::Provider::YAML,
File.join(config_dir, "diaspora.yml"),
namespace: "configuration", required: false
diff --git a/config/locales/devise/devise.az.yml b/config/locales/devise/devise.az.yml
new file mode 100644
index 000000000..a9c910eee
--- /dev/null
+++ b/config/locales/devise/devise.az.yml
@@ -0,0 +1,12 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+az:
+ devise:
+ sessions:
+ new:
+ login: "daxil olmaq"
+ sign_in: "Giriş" \ No newline at end of file
diff --git a/config/locales/devise/devise.hy.yml b/config/locales/devise/devise.hy.yml
index 3ff71453a..83b11bd59 100644
--- a/config/locales/devise/devise.hy.yml
+++ b/config/locales/devise/devise.hy.yml
@@ -16,7 +16,7 @@ hy:
invalid: "Սխալ օգտանուն կամ գաղտնաբառ։"
invalid_token: "Նույնականացման սխալ։"
locked: "Քո հաշիվն արգելափակված է։"
- not_found_in_database: "Անվավեր էլ․փոստ կամ գաղտնաբառ։"
+ not_found_in_database: "Անվավեր էլ․հասցե կամ գաղտնաբառ։"
timeout: "Աշխատաշրջանիդ ժամկետն անցել է, խնդրում ենք կրկին մուտք գործիր, որ շարունակես։"
unauthenticated: "Շարունակելուց առաջ պետք է մուտք գործես կամ գրանցվես։"
unconfirmed: "Շարունակելուց առաջ պետք է հաստատես հաշիվդ։"
@@ -54,7 +54,7 @@ hy:
new:
email: "Էլ․հասցե"
forgot_password: "Մոռացե՞լ ես գաղտնաբառդ"
- no_account: "Այս էլ. հասցեով հաշիվ չկա։"
+ no_account: "Այս էլ.հասցեով հաշիվ չկա։"
reset_password: "Վերականգնել գաղտնաբառը"
send_password_instructions: "Ուղարկեք ինձ գաղտնաբառը փոխելու ցուցումները"
send_instructions: "Րոպեների ընթացքում նամակ կստանաս՝ գաղտնաբառդ վերականգնելու ցուցումներով։"
diff --git a/config/locales/devise/devise.nb.yml b/config/locales/devise/devise.nb.yml
index 657b2b2a2..27e523b48 100644
--- a/config/locales/devise/devise.nb.yml
+++ b/config/locales/devise/devise.nb.yml
@@ -71,7 +71,7 @@ nb:
remember_me: "Husk meg"
sign_in: "Logg inn"
username: "Brukernavn"
- signed_in: "Innlogginga var vellykka."
+ signed_in: "Innloggingen var vellykket."
signed_out: "Utlogginga var vellykka."
shared:
links:
diff --git a/config/locales/diaspora/az.yml b/config/locales/diaspora/az.yml
index 2ad5aa54b..8edd13a87 100644
--- a/config/locales/diaspora/az.yml
+++ b/config/locales/diaspora/az.yml
@@ -9,7 +9,7 @@ az:
_comments: ""
_contacts: ""
_home: ""
- _photos: "Şəkil"
+ _photos: "Şəkillər"
_services: "Servis"
account: "Akkaunt"
activerecord:
@@ -33,7 +33,17 @@ az:
invalid: ""
taken: ""
ago: "%{time}%{time}"
+ all_aspects: "Bütün tərəflər"
+ application:
+ helper:
+ unknown_person: "bilinməyən səxs"
+ video_title:
+ unknown: "bilinmeyen video basligi"
are_you_sure: ""
+ are_you_sure_delete_account: "İstifadəçiliyini bağlamaq isteyində əminsən? bu tamamlanmayıb"
+ aspect_memberships:
+ destroy:
+ no_membership: "bu yöndə isare etdiyiniz heç bir şəxs tapılmadı"
aspects:
add_to_aspect:
failure: ""
@@ -44,6 +54,7 @@ az:
edit_aspect: ""
select_all: ""
aspect_stream:
+ stay_updated: "Səyfədə qal"
stay_updated_explanation: ""
contacts_not_visible: ""
contacts_visible: ""
@@ -57,6 +68,9 @@ az:
aspect_list_is_visible: ""
confirm_remove_aspect: ""
remove_aspect: ""
+ rename: "yenidən adlandırmaq"
+ update: "yeniləmək"
+ updating: "yenilənir"
index:
diaspora_id:
content_1: ""
@@ -70,6 +84,7 @@ az:
find_a_bug: ""
have_a_question: ""
here_to_help: ""
+ need_help: "köməyə ehtiyac var?"
tag_bug: ""
tag_feature: ""
tag_question: ""
@@ -77,17 +92,23 @@ az:
new_here:
follow: ""
learn_more: ""
+ title: "Xoş gəlmisiniz,yeni istifadəçilərmiz"
no_contacts: ""
no_tags: ""
people_sharing_with_you: ""
+ post_a_message: "Divarda mesaj yerləşdir!"
services:
content: ""
+ heading: "Vericiyə Bağlan"
unfollow_tag: ""
welcome_to_diaspora: ""
new:
create: ""
name: ""
no_contacts_message:
+ community_spotlight: |-
+ Bank icma xidməti.
+ Bank icmaya xidmət etmir.
or_spotlight: ""
try_adding_some_more_contacts: ""
you_should_add_some_more_contacts: ""
@@ -103,6 +124,7 @@ az:
update:
failure: ""
success: ""
+ zero: "hec bir aspekt yoxdu"
back: ""
bookmarklet:
explanation: ""
@@ -116,15 +138,18 @@ az:
commenting: ""
one: ""
other: ""
+ zero: "Heç şərh yoxdu"
contacts:
create:
failure: ""
index:
+ add_to_aspect: "şəxs əlavə edin %{name}"
start_a_conversation: ""
one: ""
other: ""
sharing:
people_sharing: ""
+ zero: "Əlaqələr tapılmadı"
delete: "Poz"
email: ""
error_messages:
@@ -132,14 +157,19 @@ az:
correct_the_following_errors_and_try_again: ""
fill_me_out: ""
find_people: ""
- hide: "Öldür"
+ hide: "Mətni gizlət."
limited: ""
more: ""
+ next: "sonraki"
+ no_results: "Heç bir nəticə tapılmadı"
nsfw: ""
ok: "OK"
or: "və"
password: ""
password_confirmation: ""
+ people:
+ zero: "Verilmiş parametrlərə uyğun nəfər tapılmadı. <br/> Xahiş olunur axtarış parametirlərini dəyişdirəsiniz."
+ previous: "əvvəlki"
privacy: "Gaga"
privacy_policy: "gAG"
profile: "Profil"
diff --git a/config/locales/diaspora/bs.yml b/config/locales/diaspora/bs.yml
index 95c3eced0..799e6d0c1 100644
--- a/config/locales/diaspora/bs.yml
+++ b/config/locales/diaspora/bs.yml
@@ -43,14 +43,11 @@ bs:
taken: "je već uzeto."
admins:
admin_bar:
- correlations: "Korelacije"
pages: "Stranica"
pod_stats: "Pod Statistike"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Pretraga Korisnika"
weekly_user_stats: "Sedmična Statistika Korisnika"
- correlations:
- correlations_count: "Korelacije sa Brojanjem Prijava:"
stats:
2weeks: "2 Sedmice"
50_most: "50 Najpopularnijih Oznaka"
diff --git a/config/locales/diaspora/cs.yml b/config/locales/diaspora/cs.yml
index a0d41dc16..1cecfdc56 100644
--- a/config/locales/diaspora/cs.yml
+++ b/config/locales/diaspora/cs.yml
@@ -53,15 +53,12 @@ cs:
taken: "je již obsazeno."
admins:
admin_bar:
- correlations: "Korelace"
pages: "Stránky"
pod_stats: "Statistiky podu"
report: "Nahlášení"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Hledat uživatele"
weekly_user_stats: "Týdenní uživatelské statistiky"
- correlations:
- correlations_count: "Korelace s počtem přihlášených:"
stats:
2weeks: "Dvoutýdenní"
50_most: "50 nejoblíbenějších štítků"
diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml
index 5fdb6d94d..ce3b47b1d 100644
--- a/config/locales/diaspora/da.yml
+++ b/config/locales/diaspora/da.yml
@@ -53,15 +53,12 @@ da:
taken: "er allerede taget."
admins:
admin_bar:
- correlations: "Korrelationer"
pages: "Sider"
pod_stats: "Statistik for Pod"
report: "Rapporter"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Søg efter brugere"
weekly_user_stats: "Ugentlig bruger-statistik"
- correlations:
- correlations_count: "Correlationer med indmeld i antallet."
stats:
2weeks: "2 uger"
50_most: "50 mest populære tags"
@@ -316,6 +313,7 @@ da:
send: "Send"
sending: "Sender..."
subject: "Emne"
+ subject_default: "Intet emne"
to: "Til"
new_conversation:
fail: "Ugyldig meddelelse"
@@ -602,6 +600,7 @@ da:
powered_by: "Kører på Diaspora"
public_feed: "Offentligt Diaspora-nyhedsfeed for %{name}"
source_package: "Download kildekoden"
+ statistics_link: "Pod statistik"
toggle: "Slå mobil side til/fra"
whats_new: "Hvad er nyt?"
your_aspects: "Dine aspekter"
@@ -1026,7 +1025,7 @@ da:
new:
create_my_account: "Opret min konto!"
email: "E-mail"
- enter_email: "Indtast e-mail"
+ enter_email: "Indtast din e-mailadresse"
enter_password: "Indtast en adgangskode (mindst seks tegn)"
enter_password_again: "Indtast den samme adgangskode som før"
enter_username: "Vælg et brugernavn (kun bogstaver, tal og understreg)"
diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml
index 33c1a6bba..f28c8eecf 100644
--- a/config/locales/diaspora/de.yml
+++ b/config/locales/diaspora/de.yml
@@ -53,15 +53,12 @@ de:
taken: "ist schon vergeben."
admins:
admin_bar:
- correlations: "Korrelationen"
pages: "Seiten"
pod_stats: "Pod Statistik"
report: "Meldungen"
sidekiq_monitor: "Sidekiq-Monitor"
user_search: "Benutzersuche"
weekly_user_stats: "Wöchentliche Benutzerstatistik"
- correlations:
- correlations_count: "Korrelationen mit Anzahl der Anmeldungen:"
stats:
2weeks: "2 Wochen"
50_most: "Die 50 populärsten Tags"
diff --git a/config/locales/diaspora/de_formal.yml b/config/locales/diaspora/de_formal.yml
index 50eb430f7..e4df3f3e3 100644
--- a/config/locales/diaspora/de_formal.yml
+++ b/config/locales/diaspora/de_formal.yml
@@ -53,15 +53,12 @@ de_formal:
taken: "wird schon benutzt."
admins:
admin_bar:
- correlations: "Korrelationen"
pages: "Seiten"
pod_stats: "Pod-Statistiken"
report: "Meldungen"
sidekiq_monitor: "Sidekiq-Monitor"
user_search: "Benutzersuche"
weekly_user_stats: "Wöchentliche Benutzerstatistik"
- correlations:
- correlations_count: "Korrelationen mit der Anzahl der Anmeldungen:"
stats:
2weeks: "2 Wochen"
50_most: "Die 50 populärsten Tags"
diff --git a/config/locales/diaspora/el.yml b/config/locales/diaspora/el.yml
index 8ab6c0f91..cf2b2741b 100644
--- a/config/locales/diaspora/el.yml
+++ b/config/locales/diaspora/el.yml
@@ -43,14 +43,11 @@ el:
taken: "είναι ήδη σε χρήση."
admins:
admin_bar:
- correlations: "Συσχετίσεις"
pages: "Σελίδες"
pod_stats: "Στατιστικά του Pod"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Αναζήτηση χρηστών"
weekly_user_stats: "Εβδομαδιαία στατιστικά χρηστών"
- correlations:
- correlations_count: "Συσχετίσεις με αριθμό συνδέσεων:"
stats:
2weeks: "2 εβδομάδων"
50_most: "Οι 50 πιο Δημοφιλείς Ετικέτες"
@@ -106,7 +103,7 @@ el:
all_aspects: "Όλες οι πτυχές"
application:
helper:
- unknown_person: "άγνωστο άτομο"
+ unknown_person: "Άγνωστο άτομο"
video_title:
unknown: "Άγνωστος τίτλος video"
are_you_sure: "Είσαι σίγουρος;"
@@ -135,21 +132,21 @@ el:
failure: "Η δημιουργία της πτυχής απέτυχε."
success: "Η νέα σου πτυχή %{name} δημιουργήθηκε"
destroy:
- failure: "Το %{name} δεν είναι άδειο και δεν μπορεί να αφαιρεθεί."
+ failure: "Το %{name} δεν μπορεί να αφαιρεθεί."
success: "Ο/Η %{name} αφαιρέθηκε επιτυχώς."
edit:
aspect_chat_is_enabled: "Οι επαφές σε αυτήν την πτυχή μπορούν να συνομιλήσουν μαζί σου."
aspect_chat_is_not_enabled: "Οι επαφές σε αυτήν την πτυχή δεν μπορούν να συνομιλήσουν μαζί σου."
aspect_list_is_not_visible: "η λίστα σου είναι κρυφή στους άλλους στην πτυχή"
- aspect_list_is_visible: "η λίστα σου είναι ορατή στους άλλους στην πτυχή"
+ aspect_list_is_visible: "Οι επαφές αυτής της πτυχής είναι ορατές μεταξύ τους."
confirm_remove_aspect: "Θέλεις σίγουρα να διαγράψεις αυτή την πτυχή;"
grant_contacts_chat_privilege: "Θες να δώσεις δικαίωμα συνομιλίας στις επαφές αυτής της πτυχής;"
- make_aspect_list_visible: "θέλεις οι επαφές αυτής της πτυχής να είναι ορατές μεταξύ τους;"
+ make_aspect_list_visible: "Θέλεις οι επαφές αυτής της πτυχής να είναι ορατές μεταξύ τους;"
remove_aspect: "Διαγραφή αυτής της πτυχής"
- rename: "μετονομασία"
+ rename: "Μετονομασία"
set_visibility: "Ορισμός ορατότητας"
- update: "ενημέρωση"
- updating: "ενημέρωση"
+ update: "Ενημέρωση"
+ updating: "Ενημέρωση"
index:
diaspora_id:
content_1: "Το diaspora* αναγνωριστικό σου (ID) είναι:"
@@ -173,7 +170,7 @@ el:
tag_feature: "feature"
tag_question: "question"
tutorial_link_text: "Οδηγοί"
- tutorials_and_wiki: "%{faq}, %{tutorial} και %{wiki} : Βοήθεια για τα πρώτα σας βήματα."
+ tutorials_and_wiki: "%{faq}, %{tutorial} και %{wiki} : Βοήθεια για τα πρώτα σου βήματα."
introduce_yourself: "Αυτή είναι η Ροή σου. Μπες και συστήσου."
keep_diaspora_running: "Κράτησε την ανάπτυξη του diaspora* σε γρήγορους ρυθμούς με μια μηνιαία δωρεά!"
keep_pod_running: "Βοήθησε στην ομαλή λειτουργία του %{pod}, προσφέροντας ένα κέρασμα στους διαχειριστές των servers μας!"
@@ -184,7 +181,7 @@ el:
no_contacts: "Καμία επαφή"
no_tags: "+ Βρες μια ετικέτα να ακολουθήσεις"
people_sharing_with_you: "Άτομα που μοιράζονται μαζί σου"
- post_a_message: "ανάρτησε ένα μήνυμα >>"
+ post_a_message: "Δημοσίευσε ένα μήνυμα >>"
services:
content: "Μπορείς να συνδέσεις τις παρακάτω υπηρεσίες στο diaspora*:"
heading: "Σύνδεσε Υπηρεσίες"
@@ -194,7 +191,7 @@ el:
create: "Δημιουργία"
name: "Όνομα (εμφανίζετε μόνο σε σένα)"
no_contacts_message:
- community_spotlight: "δημοσιεύσεις κοινότητας"
+ community_spotlight: "Μέλη της κοινότητας"
or_spotlight: "Ή μπορείς να το μοιραστείς με %{link}"
try_adding_some_more_contacts: "Μπορείς να ψάξεις ή να προσκαλέσεις περισσότερες επαφές."
you_should_add_some_more_contacts: "Πρέπει να προσθέσεις περισσότερες επαφές!"
@@ -210,12 +207,12 @@ el:
update:
failure: "Η πτυχή σου, %{name}, έχει πολύ μεγάλο όνομα για να αποθηκευτεί."
success: "Έγινε επιτυχώς η επεξεργασία της πτυχής σου, %{name}."
- zero: "καμία πτυχή"
+ zero: "Kαμία πτυχή"
back: "Πίσω"
blocks:
create:
failure: "Δεν μπόρεσα να αγνοήσω αυτόν τον χρήστη. #evasion"
- success: "Εντάξει, δεν θα ξαναδείς αυτό το χρήστη στη ροή σας. #σίγαση!"
+ success: "Εντάξει, δεν θα ξαναδείς αυτό το χρήστη στη ροή σου. #σίγαση!"
destroy:
failure: "Δεν μπόρεσα να σταματήσω να αγνοώ αυτό το χρήστη. #evasion"
success: "Για να δούμε τι έχουν να πουν! #sayhello"
@@ -231,30 +228,30 @@ el:
commenting: "Σχολιάζει..."
one: "1 σχόλιο"
other: "%{count} σχόλια"
- zero: "κανένα σχόλιο"
+ zero: "Κανένα σχόλιο"
contacts:
create:
failure: "Αποτυχία δημιουργίας επαφής"
index:
add_a_new_aspect: "Πρόσθεσε μια νέα πτυχή"
add_to_aspect: "Πρόσθεσε επαφές στο %{name}"
- all_contacts: "Όλες οι Επαφές"
- community_spotlight: "Αναρτήσεις κοινότητας"
- my_contacts: "Οι Επαφές μου"
+ all_contacts: "Όλες οι επαφές"
+ community_spotlight: "Δημοσιεύσεις κοινότητας"
+ my_contacts: "Οι επαφές μου"
no_contacts: "Φαίνεται πως χρειάζεται να προσθέσεις μερικές επαφές!"
no_contacts_message: "Δες και %{community_spotlight}"
only_sharing_with_me: "Μοιράζονται μόνο με εμένα"
start_a_conversation: "Ξεκίνα μια συζήτηση"
title: "Επαφές"
- your_contacts: "Οι Επαφές σου"
+ your_contacts: "Οι επαφές σου"
one: "1 επαφή"
other: "%{count} επαφές"
sharing:
people_sharing: "Άτομα που μοιράζονται μαζί σου:"
spotlight:
- community_spotlight: "Δημοσιεύσεις Κοινότητας"
+ community_spotlight: "Δημοσιεύσεις κοινότητας"
suggest_member: "Πρότεινε ένα μέλος"
- zero: "επαφές"
+ zero: "Καμία επαφή"
conversations:
conversation:
participants: "Συμμετέχοντες"
@@ -272,17 +269,17 @@ el:
zero: "Κανένα νέο μήνυμα"
index:
inbox: "Εισερχόμενα"
- no_conversation_selected: "δεν επιλέχτηκε συζήτηση"
- no_messages: "κανένα μήνυμα"
+ no_conversation_selected: "Δεν επιλέχτηκε συζήτηση"
+ no_messages: "Κανένα μήνυμα"
new:
abandon_changes: "Απόρριψη αλλαγών;"
send: "Αποστολή"
sending: "Αποστολή..."
- subject: "θέμα"
- to: "στον"
+ subject: "Θέμα"
+ to: "Προς"
show:
- delete: "διαγραφή και φραγή συζήτησης"
- reply: "απάντηση"
+ delete: "Διαγραφή συζήτησης"
+ reply: "Απάντηση"
replying: "Απάντηση..."
date:
formats:
@@ -294,7 +291,7 @@ el:
error_messages:
helper:
correct_the_following_errors_and_try_again: "Διόρθωσε τα ακόλουθα σφάλματα και προσπάθησε ξανά."
- invalid_fields: "Άκυρα Πεδία"
+ invalid_fields: "Άκυρα πεδία"
login_try_again: "Παρακαλώ <a href='%{login_link}'>συνδέσου</a> και ξαναπροσπάθησε."
post_not_public: "Η ανάρτηση που προσπαθείς να δεις δεν είναι δημόσια!"
fill_me_out: "Ενημέρωσε με"
@@ -316,7 +313,7 @@ el:
person_multiple_aspects_q: "Μπορώ να προσθέσω ένα άτομο σε πολλαπλές πτυχές;"
post_multiple_aspects_q: "Μπορώ να αναρτήσω περιεχόμενο σε πολλαπλές πτυχές ταυτόχρονα;"
remove_notification_a: "Όχι."
- rename_aspect_q: "Μπορώ να μετονομάσω μια πτυχή;"
+ rename_aspect_q: "Πώς μπορώ να μετονομάσω μια πτυχή;"
title: "Πτυχές"
what_is_an_aspect_q: "Τι είναι πτυχή;"
getting_help:
@@ -389,16 +386,16 @@ el:
layouts:
application:
back_to_top: "Πίσω στην αρχή"
- powered_by: "POWERED BY diaspora*"
+ powered_by: "Powered by diaspora*"
public_feed: "Δημόσια ανατροφοδότηση (feed) του diaspora* για τον χρήστη %{name}"
source_package: "κατέβασε τον πηγαίο κώδικα"
- toggle: "εναλλαγή σε κινητό"
- whats_new: "τι νέα;"
- your_aspects: "οι πτυχές σου"
+ toggle: "Αλλαγή σε κινητό"
+ whats_new: "Τι νέα;"
+ your_aspects: "Οι πτυχές σου"
header:
- admin: "διαχειριστής"
+ admin: "Διαχειριστής"
blog: "Iστολόγιo"
- code: "κώδικας"
+ code: "Κώδικας"
help: "Βοήθεια"
login: "Είσοδος"
logout: "Αποσύνδεση"
@@ -409,19 +406,13 @@ el:
likes:
likes:
people_dislike_this:
- few: "Δεν αρέσει σε %{count} άτομα"
- many: "Δεν αρέσει σε %{count} άτομα"
one: "Δεν αρέσει σε 1 άτομο"
other: "Δεν αρέσει σε %{count} άτομα"
- two: "δεν αρέσει σε %{count}"
- zero: "κανένας δεν ανέφερε ότι δεν του αρέσει"
+ zero: "Κανένας δεν ανέφερε ότι δεν του αρέσει"
people_like_this:
- few: "Αρέσει σε %{count} άτομα"
- many: "Αρέσει σε %{count} άτομα"
one: "Αρέσει σε 1 άτομο"
other: "Αρέσει σε %{count} άτομα"
- two: "αρέσει σε %{count}"
- zero: "δεν αρέσει σε κανέναν"
+ zero: "Δεν αρέσει σε κανέναν"
people_like_this_comment:
few: "Αρέσει σε %{count} χρήστες"
many: "Αρέσει σε %{count} χρήστες"
@@ -431,7 +422,7 @@ el:
zero: "Δεν αρέσει σε κανέναν "
limited: "Περιορισμένο"
more: "Περισσότερα"
- next: "επόμενο"
+ next: "Επόμενο"
no_results: "Δεν βρέθηκαν αποτελέσματα"
notifications:
also_commented:
@@ -491,9 +482,9 @@ el:
other: "Οι %{actors} σου έστειλαν ένα μήνυμα."
zero: "Ο/Η χρήστης %{actors} σου έστειλε ένα μήνυμα."
reshared:
- one: "Ο/Η %{actors} μοιράστηκε τη %{post_link}."
- other: "Οι %{actors} μοιράστηκαν τη %{post_link}."
- zero: "Οι %{actors} μοιράστηκαν τη %{post_link}."
+ one: "Ο/Η %{actors} αναδημοσίευσε τη %{post_link}."
+ other: "Οι %{actors} αναδημοσίευσαν τη %{post_link}."
+ zero: "Οι %{actors} αναδημοσίευσαν τη %{post_link}."
reshared_post_deleted:
one: "Ο/Η %{actors} κοινοποίησε τη διαγραμμένη ανάρτησή σου."
other: "Οι %{actors} κοινοποίησαν διαγραμμένη ανάρτησή σου."
@@ -505,7 +496,7 @@ el:
notifier:
a_post_you_shared: "μια δημοσίευση."
accept_invite: "Αποδέξου την πρόσκληση στο diaspora*!"
- click_here: "πάτησε εδώ"
+ click_here: "Κάνε κλικ εδώ"
comment_on_post:
reply: "Απάντησε ή δες την ανάρτηση του χρήστη %{name} >"
confirm_email:
@@ -559,9 +550,9 @@ el:
add_contact:
invited_by: "προσκλήθηκες από"
add_contact_small:
- add_contact_from_tag: "προσθήκη επαφής από ετικέτα"
+ add_contact_from_tag: "Προσθήκη επαφής από ετικέτα"
aspect_list:
- edit_membership: "επεξεργασία ιδιοτήτων πτυχής"
+ edit_membership: "Επεξεργασία ιδιοτήτων πτυχής"
helper:
is_not_sharing: "Ο/Η %{name} δεν διαμοιράζεται μαζί σου"
is_sharing: "Ο/Η %{name} διαμοιράζεται μαζί σου"
@@ -570,12 +561,12 @@ el:
looking_for: "Ψάχνεις για αναρτήσεις με την ετικέτα %{tag_link};"
no_one_found: "...κανένας δεν βρέθηκε."
no_results: "Επ! Χρειάζεται να ψάξεις για κάτι."
- results_for: "αποτελέσματα αναζήτησης για"
+ results_for: "Χρήστες που ταιριάζουν με %{search_term}"
searching: "αναζήτηση, παρακαλώ περίμενε..."
one: "1 άτομο"
other: "%{count} άτομα"
person:
- add_contact: "προσθήκη επαφής"
+ add_contact: "Προσθήκη επαφής"
already_connected: "Είναι ήδη συνδεδεμένο"
pending_request: "Αίτημα σε αναμονή"
thats_you: "Εσύ είσαι αυτός!"
@@ -584,10 +575,10 @@ el:
born: "Γενέθλια"
edit_my_profile: "Επεξεργασία του προφίλ μου"
gender: "Φύλο"
- in_aspects: "στις πτυχές"
+ in_aspects: "Στις πτυχές"
location: "Τοποθεσία"
photos: "Φωτογραφίες"
- remove_contact: "διαγραφή επαφής"
+ remove_contact: "Διαγραφή επαφής"
remove_from: "Αφαίρεση του χρήστη %{name} από τη πτυχή %{aspect};"
show:
closed_account: "Αυτός ο λογαριασμός έχει κλείσει."
@@ -598,19 +589,19 @@ el:
mention: "Αναφορά"
message: "Μήνυμα"
not_connected: "Δεν είσαι συνδεδεμένος με αυτόν τον χρήστη"
- recent_posts: "Πρόσφατες Αναρτήσεις"
- recent_public_posts: "Πρόσφατες Δημόσιες Αναρτήσεις"
+ recent_posts: "Πρόσφατες δημοσιεύσεις"
+ recent_public_posts: "Πρόσφατες δημόσιες δημοσιεύσεις"
return_to_aspects: "Επιστροφή στη σελίδα με τις πτυχές σου"
see_all: "Εμφάνιση όλων"
- start_sharing: "ξεκίνα να μοιράζεις"
+ start_sharing: "Ξεκίνα να μοιράζεις"
to_accept_or_ignore: "να το αποδεχθεί ή να το αγνοήσει."
sub_header:
- add_some: "πρόσθεσε κάποιες"
- edit: "επεξεργασία"
- you_have_no_tags: "δεν έχετε ετικέτες!"
+ add_some: "Πρόσθεσε κάποιες"
+ edit: "Επεξεργασία"
+ you_have_no_tags: "Δεν έχεις καμία ετικέτα!"
webfinger:
fail: "Λυπούμαστε, δεν ήταν δυνατή η εύρεση του %{handle}."
- zero: "κανένα άτομο"
+ zero: "Κανένα άτομο"
photos:
comment_email_subject: "φωτογραφία του χρήστη %{name}"
create:
@@ -622,9 +613,9 @@ el:
edit:
editing: "Επεξεργασία"
new:
- back_to_list: "Επιστροφή στη Λίστα"
+ back_to_list: "Επιστροφή στη λίστα"
new_photo: "Νέα φωτογραφία"
- post_it: "ανάρτησέ το!"
+ post_it: "Δημοσίευσε το!"
new_photo:
empty: "{file} είναι κενό, επιλέξτε και πάλι τα αρχεία χωρίς αυτό."
invalid_ext: "{file} δεν έχει έγκυρη τύπο αρχείου. Μόνο τύποι αρχείου {extensions} επιτρέπονται."
@@ -633,15 +624,15 @@ el:
or_select_one_existing: "ή επέλεξε μια από τις ήδη υπάρχουσες %{photos}"
upload: "Ανέβασε μια νέα φωτογραφία προφίλ!"
photo:
- view_all: "προβολή όλων των φωτογραφιών του χρήστη %{name}"
+ view_all: "Προβολή όλων των φωτογραφιών του χρήστη %{name}"
show:
- collection_permalink: "permalink συλλογής"
- delete_photo: "Διαγραφή Φωτογραφίας"
+ collection_permalink: "Σύνδεσμος συλλογής"
+ delete_photo: "Διαγραφή φωτογραφίας"
edit: "Επεξεργασία"
edit_delete_photo: "Επεξεργασία περιγραφής φωτογραφίας / διαγραφή φωτογραφίας"
- make_profile_photo: "ορισμός ως φωτογραφίας προφίλ"
+ make_profile_photo: "Ορισμός ως φωτογραφίας προφίλ"
show_original_post: "Προβολή αρχικής ανάρτησης"
- update_photo: "Ενημέρωση Φωτογραφίας"
+ update_photo: "Ενημέρωση φωτογραφίας"
update:
error: "Αποτυχία επεξεργασίας φωτογραφίας."
notice: "Η φωτογραφία ενημερώθηκε επιτυχώς."
@@ -651,13 +642,13 @@ el:
show:
destroy: "Διαγραφή"
not_found: "Λυπούμαστε, δεν καταφέραμε να βρούμε αυτή την ανάρτηση."
- permalink: "Μόνιμος σύνδεσμος:"
+ permalink: "Μόνιμος σύνδεσμος"
photos_by:
one: "Μια φωτογραφεία του/της %{author}"
other: "%{count} φωτογραφίες του/της %{author}"
zero: "Δεν υπάρχουν φωτογραφίες για τον/την %{author}"
reshare_by: "Κοινοποίηση από %{author}"
- previous: "προηγούμενο"
+ previous: "Προηγούμενο"
privacy: "Απόρρητο"
privacy_policy: "Πολιτική χρήσης δεδομένων"
profile: "Προφίλ"
@@ -712,7 +703,7 @@ el:
password: "ΚΩΔΙΚΟΣ"
password_confirmation: "ΕΠΑΛΗΘΕΥΣΗ ΚΩΔΙΚΟΥ"
sign_up: "ΕΓΓΡΑΦΗ"
- sign_up_message: "Κοινωνική Δικτύωση με ♥"
+ sign_up_message: "Κοινωνική δικτύωση με ♥"
submitting: "Υποβολή..."
username: "ΟΝΟΜΑ ΧΡΗΣΤΗ"
requests:
@@ -725,19 +716,16 @@ el:
success: "Τώρα πλέον μοιράζεσαι."
helper:
new_requests:
- few: "%{count} νέα αιτήματα!"
- many: "%{count} νέα αιτήματα!"
- one: "νέο αίτημα!"
+ one: "Νέο αίτημα!"
other: "%{count} νέα αιτήματα!"
- two: "%{count} νέα αιτήματα!"
- zero: "κανένα νέο αίτημα"
+ zero: "Κανένα νέο αίτημα"
manage_aspect_contacts:
existing: "Υφιστάμενες επαφές"
manage_within: "Διαχείριση των επαφών της πτυχής"
new_request_to_person:
- sent: "εστάλη!"
+ sent: "Εστάλη!"
reshares:
- comment_email_subject: "κοινοποίηση της δημοσίευσης του %{author} από τον %{resharer}"
+ comment_email_subject: "Αναδημοσίευση της ανάρτησης του χρήστη %{author} από %{resharer}"
create:
failure: "Υπήρξε κάποιο σφάλμα κατά την κοινοποίηση αυτής της δημοσίευσης."
reshare:
@@ -749,9 +737,9 @@ el:
other: "%{count} κοινοποιήσεις"
two: "%{count} κοινοποιήσεις"
zero: "Κοινοποίηση"
- reshare_confirmation: "Κοινοποίηση της δημοσίευσης του χρήστη %{author};"
+ reshare_confirmation: "Αναδημοσίευση της ανάρτησης του χρήστη %{author};"
reshare_original: "Κοινοποίηση αρχικής"
- reshared_via: "κοινοποιήθηκε μέσω"
+ reshared_via: "Αναδημοσιεύτηκε μέσω"
show_original: "Προεπισκόπηση αρχικού"
search: "Αναζήτηση"
services:
@@ -763,24 +751,24 @@ el:
destroy:
success: "Επιτυχής καταστροφή ταυτότητας."
failure:
- error: "εμφανίστηκε ένα σφάλμα κατά τη σύνδεση με αυτή την υπηρεσία"
+ error: "Εμφανίστηκε ένα σφάλμα κατά τη σύνδεση με αυτή την υπηρεσία"
finder:
fetching_contacts: "Το diaspora* ανακτά τους %{service} φίλους σου, έλεγξε ξανά σε μερικά λεπτά."
no_friends: "Δεν βρέθηκαν φίλοι στο Facebook. "
- service_friends: "%{service} Φίλοι"
+ service_friends: "%{service} φίλοι"
index:
- disconnect: "αποσύνδεση"
+ disconnect: "Αποσύνδεση"
edit_services: "Επεξεργασία υπηρεσιών"
- logged_in_as: "συνδεδεμένος ως"
- really_disconnect: "αποσύνδεση %{service};"
+ logged_in_as: "Σύνδεση ως %{nickname}"
+ really_disconnect: "Αποσύνδεση %{service};"
services_explanation: "Η σύνδεση των υπηρεσιών σας δίνει τη δυνατότητα να κοινοποιούνται οι δημοσιεύσεις σας σε κάθε υπηρεσία, καθώς τις γράφεται στο Diaspora."
inviter:
click_link_to_accept_invitation: "Κάνε κλικ σ' αυτό το σύνδεσμο για να αποδεχθείς την πρόσκλησή"
join_me_on_diaspora: "Συνδέσου μαζί μου στο diaspora*"
remote_friend:
- invite: "πρόσκληση"
+ invite: "Πρόσκληση"
not_on_diaspora: "Δεν είναι ακόμα στο diaspora*"
- resend: "αποστολή ξανά"
+ resend: "Αποστολή ξανά"
settings: "Ρυθμίσεις"
share_visibilites:
update:
@@ -806,8 +794,8 @@ el:
contact_list:
all_contacts: "Όλες οι επαφές"
footer:
- logged_in_as: "συνδεμένοι ως %{name}"
- your_aspects: "οι πτυχές σου"
+ logged_in_as: "Σύνδεση ως %{name}"
+ your_aspects: "Οι πτυχές σου"
invitations:
by_email: "Μέσω email"
dont_have_now: "Δεν έχεις κάποια τώρα, αλλά περισσότερες προσκλήσεις έρχονται σύντομα!"
@@ -822,8 +810,8 @@ el:
new: "Νέο %{type} από τον χρήστη %{from}"
public_explain:
atom_feed: ""
- control_your_audience: "Έλεγξε το Κοινό σου"
- logged_in: "συνδεμένοι στο %{service}"
+ control_your_audience: "Έλεγξε το κοινό σου"
+ logged_in: "Σύνδεση στο %{service}"
manage: "Διαχείριση συνδεμένων υπηρεσιών"
new_user_welcome_message: "Χρησιμοποίησε τις #ετικέτες για να ταξινομήσεις τις δημοσιεύσεις σου και να βρείς άτομα με κοινά ενδιαφέροντα με σένα. Μνημόνευσε αξιόλογα άτομα με @αναφορές"
outside: "Τα δημόσια μηνύματα θα είναι διαθέσιμα και σε χρήστες εκτός του δικτύου diaspora*"
@@ -831,11 +819,11 @@ el:
title: "Ρύθμιση συνδεδεμένων υπηρεσιών"
visibility_dropdown: "Χρησιμοποίησε αυτό το αναδυόμενο μενού για να αλλάξεις την ορατότητα της ανάρτησης σου. (Προτείνουμε την πρώτη σου να την κάνεις δημόσια.)"
publisher:
- all: "όλα"
- all_contacts: "όλες οι επαφές"
+ all: "Όλα"
+ all_contacts: "Όλες οι επαφές"
discard_post: "Απόρριψη ανάρτησης"
get_location: "Λήψη τοποθεσίας μου"
- make_public: "κάνε το δημόσιο"
+ make_public: "Κάντο δημόσιο"
new_user_prefill:
hello: "Γεια σε όλους, είμαι #%{new_user_tag}. "
i_like: "Με ενδιαφέρουν οι ετικέτες %{tags}."
@@ -844,16 +832,16 @@ el:
post_a_message_to: "Ανάρτησε ένα μήνυμα στην πτυχή %{aspect}"
posting: "Ανάρτηση..."
preview: "Προεπισκόπηση"
- publishing_to: "δημοσίευση στο: "
+ publishing_to: "Δημοσίευση στο: "
share: "Κοινοποίηση"
- share_with: "μοιράσου με"
+ share_with: "Μοιράσου με"
upload_photos: "Μεταφόρτωση εικόνων"
whats_on_your_mind: "Τι σκέφτεσαι;"
reshare:
reshare: "Κοινοποίησε"
stream_element:
connect_to_comment: "Συνδέσου με αυτόν τον χρήστη για να σχολιάσεις στην ανάρτησή του"
- currently_unavailable: "ο σχολιασμός αυτή τη στιγμή δεν είναι διαθέσιμος"
+ currently_unavailable: "Ο σχολιασμός αυτή τη στιγμή δεν είναι διαθέσιμος"
dislike: "Δεν μ' αρέσει"
hide_and_mute: "Απόκρυψη και σίγαση δημοσίευσης"
ignore_user: "Αγνόησε τον/την %{name}"
@@ -861,9 +849,9 @@ el:
like: "Μου αρέσει"
nsfw: "Αυτή η δημοσίευση έχει σημανθεί ως μη ασφαλής για δουλειά από τον δημιουργό της. %{link}"
shared_with: "Διαμοιρασμένο με: %{aspect_names}"
- show: "εμφάνισε"
+ show: "Εμφάνισε"
unlike: "Δεν μου αρέσει"
- via: "μέσω %{link}"
+ via: "Μέσω %{link}"
via_mobile: "από κινητό"
viewable_to_anyone: "Αυτή η δημοσίευση είναι εμφανής σε όλους στο διαδίκτυο"
status_messages:
@@ -891,12 +879,12 @@ el:
activity:
title: "Η δραστηριότητα μου"
aspects:
- title: "Οι Πτυχές σου"
+ title: "Οι πτυχές μου"
aspects_stream: "Πτυχές"
comment_stream:
contacts_title: "Χρήστες των οποίων έχεις σχολιάσει αναρτήσεις"
- title: "Σχολιασμένες Αναρτήσεις"
- community_spotlight_stream: "Αναρτήσεις Κοινότητας"
+ title: "Σχολιασμένες αναρτήσεις"
+ community_spotlight_stream: "Δημοσιεύσεις κοινότητας"
followed_tag:
add_a_tag: "Προσθήκη μιας ετικέτας"
contacts_title: "Άτομα που έψαξαν αυτές τις ετικέτες"
@@ -911,11 +899,11 @@ el:
contacts_title: "Άτομα που σε έχουν αναφέρει"
title: "@Αναφορές"
multi:
- contacts_title: "Άτομα στη Ροή σου"
+ contacts_title: "Άτομα στη ροή σου"
title: "Ροή"
public:
- contacts_title: "Πρόσφατες Δημοσιεύσεις"
- title: "Δημόσια Δραστηριότητα"
+ contacts_title: "Πρόσφατες δημοσιεύσεις"
+ title: "Δημόσια δραστηριότητα"
tags:
contacts_title: "Άτομα που τους αρέσει αυτή η ετικέτα"
title: "Ανάρτησες με ετικέτες: %{tags}"
@@ -946,7 +934,7 @@ el:
wrong_password: "Ο κωδικός που εισήγαγες δεν ταιριάζει με τον τωρινό κωδικό σου."
edit:
also_commented: "κάποιος σχολίασε σε δημοσίευση που έχεις σχολιάσει κι εσύ"
- auto_follow_aspect: "Πτυχή για αυτόματη Παρακολούθησης"
+ auto_follow_aspect: "Πτυχή για επαφές που θα παρακολουθείς αυτόματα:"
auto_follow_back: "Αυτόματη ακολούθηση αν κάποιος σας ακουλουθήσει"
change: "Αλλαγή"
change_email: "Αλλαγή διεύθυνσης email"
@@ -966,21 +954,21 @@ el:
comment_on_post: "κάποιος σχολίασε την ανάρτησή σου"
current_password: "Τρέχον κωδικός πρόσβασης"
current_password_expl: "αυτόν που συνδέθηκες..."
- download_photos: "κατέβασμα των φωτογραφιών μου"
+ download_photos: "Κατέβασμα των φωτογραφιών μου"
edit_account: "Επεξεργασία λογαριασμού"
email_awaiting_confirmation: "Σου στείλαμε έναν σύνδεσμο ενεργοποίησης στο %{unconfirmed_email}. Μέχρι να ακολουθήσεις αυτόν τον σύνδεσμο και να ενεργοποιήσεις τη νέα διεύθυνση, θα συνεχίσουμε να χρησιμοποιούμε την αρχική %{email}."
export_data: "Εξαγωγή δεδομένων"
- following: "Ρυθμίσεις Παρακολούθησης"
+ following: "Ρυθμίσεις διαμοιρασμού"
getting_started: "Προτιμήσεις νέου χρήστη"
- liked: "...σε κάποιον αρέσει η δημοσίευση σας;"
- mentioned: "...επισημανθήκατε σε μία φωτογραφία;"
+ liked: "σε κάποιον αρέσει η δημοσίευση σου"
+ mentioned: "επισημάνθηκες σε μία φωτογραφία"
new_password: "Νέος κωδικός πρόσβασης"
- private_message: "...μόλις λάβατε μία προσωπική ειδοποίηση;"
+ private_message: "έλαβες ένα προσωπικό μήνυμα"
receive_email_notifications: "Να λαμβάνω ειδοποιήσεις στο email μου όταν:"
- reshared: "...κάποιος κοινοποίησε τη δημοσίευση σας;"
- show_community_spotlight: "Εμφάνιση Δημοσιεύσεων Κοινότητας στη ροή σου;"
- show_getting_started: "Επανενεργοποιήση Getting Started"
- started_sharing: "...κάποιος άρχισε να διαμοιράζεται μαζί σας;"
+ reshared: "κάποιος αναδημοσίευσε την ανάρτηση σου"
+ show_community_spotlight: "Εμφάνιση \"δημοσιεύσεων κοινότητας\" στη ροή σου"
+ show_getting_started: "Επανενεργοποιήση του οδηγού \"Getting Started\""
+ started_sharing: "κάποιος άρχισε να μοιράζεται μαζί σου"
stream_preferences: "Προτιμήσεις ροής"
your_email: "Το email σου"
your_handle: "Το αναγνωριστικό σου στο diaspora*"
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index 7f9d9da6c..aaa452d7f 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -102,10 +102,7 @@ en:
weekly_user_stats: "Weekly user stats"
pod_stats: "Pod stats"
report: "Reports"
- correlations: "Correlations"
sidekiq_monitor: "Sidekiq monitor"
- correlations:
- correlations_count: "Correlations with sign-in count:"
user_search:
you_currently:
zero: "You currently have no invites left %{link}"
diff --git a/config/locales/diaspora/en_valspeak.yml b/config/locales/diaspora/en_valspeak.yml
index 43e521d00..43f6283ef 100644
--- a/config/locales/diaspora/en_valspeak.yml
+++ b/config/locales/diaspora/en_valspeak.yml
@@ -52,15 +52,12 @@ en_valspeak:
taken: "some1 like, already bought those shoez. sry bout that :\\"
admins:
admin_bar:
- correlations: "Correlationz"
pages: "Pagies!"
pod_stats: "Pod statsss <3"
report: "Reportz"
sidekiq_monitor: "Technical thingy called Sidekiq monitor... wasnt that like... a phone once? OMG! IT WAS! :DD"
user_search: "Ppl search"
weekly_user_stats: "Weekly ppl stats"
- correlations:
- correlations_count: "Correlationz wit sign in count:"
stats:
2weeks: "2 weekz"
50_most: "ZOMG THE 50 MOST POPULAR TAGZ!!!"
diff --git a/config/locales/diaspora/eo.yml b/config/locales/diaspora/eo.yml
index 95f640097..c6930d277 100644
--- a/config/locales/diaspora/eo.yml
+++ b/config/locales/diaspora/eo.yml
@@ -43,13 +43,10 @@ eo:
taken: "estas jam prenita."
admins:
admin_bar:
- correlations: "Korelacio"
pages: "Paĝoj"
pod_stats: "Statistiko de 'pod' (Diaspora-servilo)"
user_search: "Serĉo de uzanto"
weekly_user_stats: "Semajna statistiko de uzanto"
- correlations:
- correlations_count: "Korelacio kun la nombrado de ensalutoj:"
stats:
2weeks: "2 semajnoj"
50_most: "50 plej popularaj etikedoj"
diff --git a/config/locales/diaspora/es-AR.yml b/config/locales/diaspora/es-AR.yml
index e179ea6db..2d2380851 100644
--- a/config/locales/diaspora/es-AR.yml
+++ b/config/locales/diaspora/es-AR.yml
@@ -53,15 +53,12 @@ es-AR:
taken: "ya está ocupado."
admins:
admin_bar:
- correlations: "Similitudes"
pages: "Páginas"
pod_stats: "Estadísticas del Pod (servidor)"
report: "Reportes"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Búsqueda de usuarios"
weekly_user_stats: "Estadísticas semanales de usuario"
- correlations:
- correlations_count: "Correlaciones con el conteo de inicio de sesión:"
stats:
2weeks: "2 semanas"
50_most: "Las 50 etiquetas más populares"
@@ -163,6 +160,7 @@ es-AR:
destroy:
failure: "%{name} no está vacío y no puede ser eliminado."
success: "%{name} se eliminó con éxito."
+ success_auto_follow_back: "Se borró correctamente %{name}. Este aspecto se usaba para seguir automáticamente a los usuarios, revisa tu configuración para seleccionar un nuevo aspecto de autoseguimiento."
edit:
aspect_chat_is_enabled: "Los contactos de este aspecto pueden chatear con vos."
aspect_chat_is_not_enabled: "Los contactos de este aspecto no pueden chatear con vos."
@@ -315,6 +313,7 @@ es-AR:
send: "Enviar"
sending: "Enviando..."
subject: "Asunto"
+ subject_default: "Sin asunto"
to: "Para"
new_conversation:
fail: "Mensaje inválido"
@@ -341,13 +340,13 @@ es-AR:
find_people: "Encontrá gente o #etiquetas"
help:
account_and_data_management:
- close_account_a: "Ve a la parte inferior de la página de Configuración y haz clic en el botón \"Cerrar Cuenta\"."
+ close_account_a: "Ve a la parte inferior de la página de Configuración y haz clic en el botón \"Cerrar Cuenta\". Se te pedirá tu contraseña para completar el proceso. Recuerda que, si cierras tu cuenta, nunca podrás registrarte nuevamente en ese pod con el mismo nombre de usuario."
close_account_q: "¿Cómo puedo borrar mi semilla (cuenta)?"
- data_other_podmins_a: "Cuando estás compartiendo con alguien que tiene cuenta en otro servidor, de cualquier publicación que compartas con esa persona se guardará una copia (cache) en su servidor, y ésta será accesible al administrador de la base de datos de ese servidor. Cuando borras una publicación o un dato de perfil, esta información es borrada de tu servidor y de cualquier otro servidor en el que previamente hubiera estado alojada."
+ data_other_podmins_a: "Cuando estás compartiendo con alguien que tiene cuenta en otro servidor, de cualquier publicación que compartas con esa persona se guardará una copia (cache) en su servidor, y ésta será accesible al administrador de la base de datos de ese servidor. Cuando borras una publicación o un dato de perfil, esta información es borrada de tu servidor y de cualquier otro servidor en el que previamente hubiera estado alojada. Tus fotos nunca son almacenadas en otros pods, sólo en el tuyo."
data_other_podmins_q: "¿Pueden los administradores de otros pods ver mi información?"
- data_visible_to_podmin_a: "La comunicación *entre* pods siempre está encriptada (usando tanto SSL como el propio cifrado de diaspora*), pero el almacenamiento de los datos en los servidores no está encriptado. Si quisiera, el administrador de la base de datos de tu servidor (usualmente la persona que gerencia el servidor) puede acceder a todos los datos de tu perfil y a todo lo que has publicado (este es el caso para la mayoría de los sitios web que almacenan datos del usuario). Instalar tu propio pod te provee más privacidad al poder controlar el acceso a la base de datos."
+ data_visible_to_podmin_a: "La comunicación entre pods siempre está encriptada (usando tanto SSL como el propio cifrado de diaspora*), pero el almacenamiento de los datos en los servidores no está encriptado. Si quisiera, el administrador de la base de datos de tu servidor (usualmente la persona que gerencia el servidor) puede acceder a todos los datos de tu perfil y a todo lo que has publicado (este es el caso para la mayoría de los sitios web que almacenan datos del usuario). Instalar tu propio pod te permite tener más privacidad al poder controlar el acceso a la base de datos."
data_visible_to_podmin_q: "¿Qué cantidad de mi información puede ver el administrador de mi pod?"
- download_data_a: "Sí. En la parte inferior de la página de Configuración de Cuenta hay dos botones para la descarga de los datos."
+ download_data_a: "Sí. En la parte inferior de la página de Configuración de Cuenta hay dos botones, uno para la descarga de los datos de tu perfil y otro para la descarga de tus fotos."
download_data_q: "¿Puedo descargar una copia de todos los datos contenidos en mi cuenta?"
move_pods_a: "En el futuro serás capaz de exportar tu cuenta de una vaina e importarla a otra, pero actualmente esto no es posible. Igualmente siempre podrás abrir una nueva cuenta y agregar a tus contactos a ella, y pedirles a ellos que agreguen tu nueva cuenta a las suyas."
move_pods_q: "¿Cómo puedo mover mi cuenta de un pod a otro?"
@@ -357,24 +356,24 @@ es-AR:
change_aspect_of_post_q: "Una vez que publiqué algo, ¿puedo cambiar el o los aspectos que pueden verlo?"
contacts_know_aspect_a: "No. Tus contactos no pueden ver el nombre del aspecto bajo ninguna circunstancia."
contacts_know_aspect_q: "¿Mis contactos pueden saber a cuáles aspectos los he agregado?"
- contacts_visible_a: "Si marcas esta opción entonces los contactos de este aspecto serán capaces de ver quiénes más están en él, bajo tu foto en tu página de perfil. Es mejor seleccionar esta opción solo si los contactos en este aspecto se conocen unos a otros. Ellos igualmente no serán capaces de ver cómo se llama este aspecto."
+ contacts_visible_a: "Si marcas esta opción entonces los contactos de este aspecto serán capaces de ver quiénes más están en él, bajo tu foto en la página de perfil. Es mejor seleccionar esta opción solo si los contactos en este aspecto se conocen unos a otros. Ellos igualmente no serán capaces de ver cómo se llama el aspecto."
contacts_visible_q: "¿Qué significa \"hacer visibles entre ellos a los contactos de este aspecto\"?"
- delete_aspect_a: "En tu lista de aspectos en el lado izquierdo de la página principal, pasá el puntero sobre el aspecto que deseas borrar. Haz clic en el pequeño lápiz de \"Editar\" que aparece en la derecha. Haz clic en el botón\"Borrar\" en la caja de texto que aparece."
+ delete_aspect_a: "En tu lista de aspectos en el lado izquierdo de la página principal, pasa el puntero del ratón sobre el aspecto que deseas borrar. Haz clic en el pequeño lápiz de \"Editar\" que aparece en la derecha y luego elige el botón \"Borrar\" en la caja de texto que aparece. O bien ve a la página de Contactos y selecciona el aspecto, luego haz clic en el icono de borrar en la parte superior derecha de la página."
delete_aspect_q: "¿Cómo hago para borrar un aspecto?"
- person_multiple_aspects_a: "Sí. Ve a la lista de contactos y haz clic en \"Mis contactos\". Para cada contacto puedes usar el menú en la derecha para agregarlos (o borrarlos) a la cantidad de aspectos que desees. O puedes agregarlos a un nuevo aspecto (o borrarlos de un aspecto) haciendo clic en el botón selector de aspectos en su página de perfil. O siempre puedes solo mover el puntero sobre su nombre cuando lo veas en la Entrada, y una \"tarjeta suspendida\" aparecerá. Puedes cambiar los aspectos que están allí."
+ person_multiple_aspects_a: "Sí. Ve a la lista de contactos y haz clic en \"Mis contactos\". Para cada contacto puedes usar el menú en la derecha para agregarlos (o borrarlos) a la cantidad de aspectos que desees. O puedes agregarlos a un nuevo aspecto (o borrarlos de un aspecto) haciendo clic en el botón selector de aspectos en su página de perfil. O siempre puedes mover el puntero del ratón sobre su nombre cuando lo veas en la Entrada y una \"tarjeta suspendida\" aparecerá. Puedes cambiar los aspectos desde allí."
person_multiple_aspects_q: "¿Puedo agregar a una persona a varios aspectos?"
- post_multiple_aspects_a: "Sí. Cuando estas realizando una publicación, usa el botón de seleccionar aspectos para incluir o excluir aspectos. Tú publicación será visible a todos los que pertenecen a los aspectos que has seleccionado. También puedes seleccionar los aspectos a los que deseas enviarles la publicación en la barra lateral. Cuando publicas, el/los aspecto/s que has seleccionado en la lista de la izquierda automáticamente serán seleccionado en el selector de aspectos cuando comiences a realizar una nueva publicación."
+ post_multiple_aspects_a: "Sí. Cuando estas realizando una publicación, usa el botón de seleccionar aspectos para incluir o excluir aspectos. Tu publicación será visible para todos los aspectos que has seleccionado. También puedes seleccionar los aspectos a los que deseas enviarles la publicación en la barra lateral. Cuando publicas, el o los aspectos que has seleccionado en la lista de la izquierda, automáticamente serán seleccionados en el selector de aspectos cuando comiences a realizar una nueva publicación."
post_multiple_aspects_q: "¿Puedo publicar contenido en varios aspectos a la vez?"
- remove_notification_a: "No."
+ remove_notification_a: "No. Incluso no serán notificados si los agregas a otros aspectos cuando ya has comenzado a compartir con ellos."
remove_notification_q: "Si elimino a alguien de un aspecto, o de todos mis aspectos, ¿le llegará una notificación de eso?"
- rename_aspect_a: "Sí. En tu lista de aspectos en el costado izquierdo del menú, apunta tu ratón al aspecto para renombrarlo. Haz clic en el pequeño lápiz de \"editar\" que se muestra a la derecha. Haz clic en \"renombrar\" e ingresa el nombre en la caja de texto que aparece desplegada."
+ rename_aspect_a: "Sí. Haz clic en \"Mis aspectos\" en el costado izquierdo de tu Entrada y luego apunta tu ratón al icono del lápiz en el aspecto que quieras renombrar, o bien ve a la páginas de Contactos y selecciona el aspecto que desees. Haz clic en el icono de \"editar\" que se muestra a la derecha del nombre del aspecto, ingresa el nombre en la caja de texto que aparece desplegada y presiona \"Actualizar\"."
rename_aspect_q: "¿Puedo renombrar un aspecto?"
restrict_posts_i_see_a: "Sí. Haz clic en \"Mis aspectos\" en la barra lateral y entonces marca o desmarca a cada uno de los aspectos de la lista para incluirlos o no. Solo las publicaciones de las personas en los aspectos seleccionados aparecerán en tu Entrada."
restrict_posts_i_see_q: "¿Puedo restringir las publicaciones que veo sólo a ciertos aspectos?"
title: "Aspectos"
what_is_an_aspect_a: "Los aspectos son la forma de mostrar tus grupos de contactos en diaspora*. Un aspecto es una de las caras que le muestras al mundo. Esta puede mostrar como eres en el trabajo, como eres en tu familia, o como eres con tus amigos en el club al que perteneces."
what_is_an_aspect_q: "¿Qué es un aspecto?"
- who_sees_post_a: "Si haces una publicación restringida (limitada), ésta solo será visible para las personas que hayas incluido en ese aspecto (o esos aspectos, si la hiciste para varios aspectos). Los contactos que no pertenecen al aspecto no tendrán forma de ver la publicación, a menos que la hagas publica. Solo las publicaciones públicas serán visibles para cualquiera que no hayas incluido en uno de tus aspectos."
+ who_sees_post_a: "Si haces una publicación restringida (limitada, privada), ésta solo será visible para las personas que hayas incluido en ese aspecto (o esos aspectos, si la hiciste para varios aspectos). Los contactos que no pertenecen a ese o esos aspectos no tendrán forma de ver la publicación, a menos que la hagas pública. Solo las publicaciones públicas serán visibles para cualquiera que no hayas incluido en uno o varios de tus aspectos."
who_sees_post_q: "Cuando publico en un aspecto, ¿quienes pueden verlo?"
chat:
add_contact_roster_a: "Primero, necesitas activar el chat para uno de los aspectos en donde está el usuario. Para hacer eso, ve a la %{contacts_page}, selecciona el aspecto que quieras y haz clic en el icono de chat para activar el chat en ese aspecto. %{toggle_privilege} Si lo prefieres, puedes crear un aspecto especial llamado 'Chat' y agregar allí a los usuarios con los que quieres chatear. Una vez que hayas hecho esto, abre la interface de chat y selecciona al usuario con quien quieres chatear."
@@ -395,7 +394,7 @@ es-AR:
getting_started_q: "¡Ayuda! ¡Necesito conocer lo básico para empezar!"
title: "Obtener ayuda"
getting_started_tutorial: "Serie de tutoriales \"Primeros pasos\""
- here: "Aquí"
+ here: "aquí"
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "En la \"Entrada\" puedes utilizar los siguientes atajos de teclado:"
@@ -411,7 +410,7 @@ es-AR:
title: "Atajos de teclado"
markdown: "Markdown"
mentions:
- how_to_mention_a: "Tipeé el signo \"@\" y comience a escribir el nombre. Un menú desplegable con opciones aparecerá para seleccionarlo más fácilmente. Sólo es posible mencionar a las personas que tienes agregadas en el aspecto."
+ how_to_mention_a: "Escribe el signo \"@\" y comience a escribir el nombre. Un menú desplegable con opciones aparecerá para seleccionarlo más fácilmente. Sólo es posible mencionar a las personas que tienes agregadas a uno o varios aspectos."
how_to_mention_q: "¿Cómo puedo mencionar a alguien cuando hago una publicación?"
mention_in_comment_a: "No, no por el momento."
mention_in_comment_q: "¿Puedo mencionar a alguien en un comentario?"
@@ -456,6 +455,14 @@ es-AR:
insert_images_comments_a2: "puede ser utilizada para insertar imágenes desde la web en los comentarios y también en las publicaciones."
insert_images_comments_q: "¿Puedo insertar imágenes en los comentarios?"
insert_images_q: "¿Cómo puedo insertar imágenes en las publicaciones?"
+ post_location_a: "Pulsa el icono de localización al lado de la cámara en el publicador (el cuadro de publicación). Ello insertará tu localización desde OpenStreetMap. Puedes editar tu localización y escoger publicar sólo el nombre de la ciudad en la que estás en lugar de tu dirección exacta."
+ post_location_q: "¿Cómo agrego mi localización a una publicación?"
+ post_notification_a: "Encontrarás una campana al lado de la \"X\" en la esquina superior derecha de cada publicación. Pulsando sobre ella activarás o desactivarás las notificaciones de esa publicación."
+ post_notification_q: "¿Cómo activo o desactivo las notificaciones de una publicación?"
+ post_poll_a: "Pulsa el icono de la gráfica para crear una encuesta. Escribe una pregunta y al menos dos respuestas. No olvides hacer pública la publicación si quieres que todo el mundo pueda participar en ella."
+ post_poll_q: "¿Cómo agrego una encuesta a mi publicación?"
+ post_report_a: "Pulsa en el icono de alerta en la esquina superior derecha de la publicación para denunciarla al administrador. Escribe una razón para denunciar la publicación en el cuadro de texto."
+ post_report_q: "¿Cómo denuncio una publicación ofensiva?"
size_of_images_a: "No. El tamaño de las imágenes automáticamente se ajusta a la Entrada. Markdown no tiene un código para especificar el tamaño de una imagen."
size_of_images_q: "¿Puedo modificar el tamaño de las imágenes en las publicaciones o comentarios?"
stream_full_of_posts_a1: "Tu Entrada está compuesta por tres tipos de publicaciones:"
@@ -520,6 +527,7 @@ es-AR:
add_to_aspect_li5: "Pero si Ben va a la página de perfil de Amy, entonces él podrá ver las publicaciones privadas que ella ha enviado a sus aspectos en los cuales él está incluido (así como sus publicaciones públicas que cualquiera puede ver allí)."
add_to_aspect_li6: "Ben podrá ver el perfil privado de Amy (biografía, ubicación, género y fecha de nacimiento)."
add_to_aspect_li7: "Amy aparecerá como \"Compartiendo solo conmigo\" en la página de contactos de Ben."
+ add_to_aspect_li8: "Amy también será capaz de @mencionar a Ben en una publicación."
add_to_aspect_q: "¿Qué sucede cuando agrego a alguien a uno de mis aspectos?, ¿o cuando alguien me agrega a uno de sus aspectos?"
list_not_sharing_a: "No, pero puedes ver si alguien esta compartiendo contigo visitando su página de perfil. Si es así, la barra bajo su foto de perfil aparecerá de color verde; si no, será gris. Deberías recibir una notificación cada vez que alguien comienza a compartir contigo."
list_not_sharing_q: "¿Hay una lista de las personas a las que he agregado a uno de mis aspectos, pero ellos a mí no?"
@@ -527,6 +535,8 @@ es-AR:
only_sharing_q: "¿Quienes son las personas que figuran en mi lista de contactos como \"Compartiendo solo conmigo\"?"
see_old_posts_a: "No. Ellos no podrán ver nuevas publicaciones de ese aspecto. Ellos (y cualquier otra persona) podrán ver tus publicaciones públicas viejas en tú página de perfil, y también podrán verlas en sus entradas."
see_old_posts_q: "Cuando agrego a alguien a un aspecto, ¿puede ver lo que he publicado anteriormente en ese aspecto?"
+ sharing_notification_a: "Deberías recibir una notificación cada vez que alguien empieza a compartir contigo."
+ sharing_notification_q: "¿Cómo sé que alguien ha empezado a compartir conmigo?"
title: "Compartir"
tags:
filter_tags_a: "Esta opción aún no está disponible directamente mediante diaspora*, pero algunos colaboradores %{third_party_tools} han escrito algo que permite hacerlo."
@@ -590,6 +600,7 @@ es-AR:
powered_by: "Impulsado por diaspora*"
public_feed: "Canal público para %{name}"
source_package: "Descargar el paquete con el código fuente"
+ statistics_link: "Estadísticas del pod"
toggle: "Cambiar a celular"
whats_new: "¿Qué hay de nuevo?"
your_aspects: "Tus aspectos"
@@ -720,8 +731,11 @@ es-AR:
a_post_you_shared: "una publicación."
a_private_message: "Hay un nuevo mensaje privado para vos en diaspora*"
accept_invite: "¡Aceptá tu invitación a diaspora*!"
+ also_commented:
+ limited_subject: "Hay un nuevo comentario en una publicación que comentaste"
click_here: "Haz clic aquí"
comment_on_post:
+ limited_subject: "Hay un nuevo comentario en una de tus publicaciones"
reply: "Responder o ver la publicación de %{name} >"
confirm_email:
click_link: "Para activar tu nueva dirección de correo %{unconfirmed_email}, por favor seguí este enlace::"
@@ -785,12 +799,17 @@ es-AR:
¡El generador de correo automático de diaspora*!
+ P.D.: Por si acaso no sabes qué es diaspora*, en el enlace [2] está la respuesta!
+
[1]: %{invite_url}
+ [2]: %{diasporafoundation_url}
invited_you: "¡%{name} te ha invitado a diaspora*!"
liked:
liked: "A %{name} le gustó tu publicación"
+ limited_post: "A %{name} le gustó tu publicación privada"
view_post: "Ver publicación >"
mentioned:
+ limited_post: "Se te mencionó en una publicación privada."
mentioned: "te mencionó en una publicación:"
subject: "%{name} te mencionó en diaspora*"
private_message:
@@ -1004,7 +1023,7 @@ es-AR:
new:
create_my_account: "¡Crear mi cuenta!"
email: "Correo electrónico"
- enter_email: "Ingresá un correo electrónico"
+ enter_email: "Ingresá tu correo electrónico"
enter_password: "Ingresa una contraseña (seis caracteres mínimo)"
enter_password_again: "Repetí la misma contraseña"
enter_username: "Elegí un nombre de usuario (sólo letras, números y guión bajo)"
@@ -1086,7 +1105,9 @@ es-AR:
connect: "Conectar"
disconnect: "Desconectar"
edit_services: "Editar servicios"
- logged_in_as: "Conectado como"
+ logged_in_as: "Conectado como %{nickname}"
+ no_services_available: "No hay servicios disponibles en este pod."
+ not_logged_in: "Actualmente no conectado."
really_disconnect: "¿Querés desconectarte de %{service}?"
services_explanation: "Conectar con otros servicios te ofrece la posibilidad de publicar tus publicaciones a medida que las escribes en diaspora*."
inviter:
@@ -1277,6 +1298,7 @@ es-AR:
failure: "No has podido dejar de seguir a: #%{name}. Tal vez ya lo hiciste..."
success: "¡Epa! Dejaste de seguir a #%{name}."
manage:
+ no_tags: "No estás siguiendo ninguna etiqueta."
title: "Administrar las etiquetas que sigues"
tags:
name_too_long: "Por favor haz que el nombre de la etiqueta tenga menos de %{count} caracteres. En este momento el máximo permitido es de %{current_length} caracteres."
@@ -1349,6 +1371,7 @@ es-AR:
started_sharing: "...alguien comienza a compartir con vos?"
stream_preferences: "Preferencias de la Entrada"
your_email: "Tu correo electrónico"
+ your_email_private: "Tu e-mail nunca será visible para otros usuarios"
your_handle: "Tu ID de diaspora*"
getting_started:
awesome_take_me_to_diaspora: "¡Increíble! Llévame a diaspora*"
diff --git a/config/locales/diaspora/es-CL.yml b/config/locales/diaspora/es-CL.yml
index 2d52f867c..cdd305c49 100644
--- a/config/locales/diaspora/es-CL.yml
+++ b/config/locales/diaspora/es-CL.yml
@@ -43,14 +43,11 @@ es-CL:
taken: "Ya está siendo ocupado."
admins:
admin_bar:
- correlations: "Similitudes"
pages: "Páginas"
pod_stats: "Estadísticas del servidor"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Buscar usuario"
weekly_user_stats: "Estadísticas semanales de usuarios"
- correlations:
- correlations_count: "Correlaciones con el conteo de inicio de sesión:"
stats:
2weeks: "2 Semanas"
50_most: "50 etiquetas más populares"
diff --git a/config/locales/diaspora/es-MX.yml b/config/locales/diaspora/es-MX.yml
index 9512b18a5..5c3b3d30f 100644
--- a/config/locales/diaspora/es-MX.yml
+++ b/config/locales/diaspora/es-MX.yml
@@ -43,14 +43,11 @@ es-MX:
taken: "ya está ocupado."
admins:
admin_bar:
- correlations: "Correlaciones"
pages: "Páginas"
pod_stats: "Estadísticas del servidor"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Búsqueda de usuario"
weekly_user_stats: "Estadísticas semanales de usuario"
- correlations:
- correlations_count: "Correlaciones con el conteo de inicio de sesión:"
stats:
2weeks: "Bisemanal"
50_most: "Las 50 etiquetas más populares"
diff --git a/config/locales/diaspora/es-VE.yml b/config/locales/diaspora/es-VE.yml
index 31be0cdbc..6b0ab955d 100644
--- a/config/locales/diaspora/es-VE.yml
+++ b/config/locales/diaspora/es-VE.yml
@@ -44,6 +44,7 @@ es-VE:
admins:
admin_bar:
correlations: "Similitudes"
+ dashboard: "Tablero"
pages: "Páginas"
pod_stats: "Estadísticas del Servidor"
resque_overview: "Información de Resque"
@@ -80,11 +81,16 @@ es-VE:
week: "Semana"
user_search:
add_invites: "Añadir invitaciones"
+ are_you_sure: "Estás seguro de que deseas cerrar esta cuenta?"
+ close_account: "Cerrar cuenta"
email_to: "Enviar invitación por correo electrónico a"
+ lock_account: "Bloquear cuenta"
+ unlock_account: "Desbloquear cuenta"
users:
one: "se ha encontrado %{count} usuario"
other: "se han encontrado %{count} usuarios"
zero: "se han encontrado %{count} usuarios"
+ view_profile: "Ver perfil"
you_currently: "Tienes actualmente %{user_invitation} invitaciones %{link}"
weekly_user_stats:
amount_of:
@@ -605,6 +611,11 @@ es-VE:
update:
error: "Error al editar la foto."
notice: "Foto actualizada correctamente."
+ polls:
+ votes:
+ one: "%{count} votos por ahora"
+ other: "%{count} votos por ahora"
+ zero: "%{count} votos por ahora"
posts:
presenter:
title: "Una publicación de %{name}"
@@ -624,9 +635,20 @@ es-VE:
profiles:
edit:
allow_search: "Permitir que la gente te busque dentro de Diaspora*"
+ basic: "Mi perfil básico"
+ basic_hint: "Cada item en su perfil es opcional. Su perfil básico siempre estará visible al público."
edit_profile: "Editar perfil"
+ extended: "Mi perfil ampliado"
+ extended_hint: "Haga clic en el interruptor para configurar la visibilidad de los datos del perfil ampliado. Público significa que es visible para el internet, limitado significa que solo las personas con las que comparte veran esta información."
+ extended_visibility_text: "Visibilidad de su perfil ampliado:"
first_name: "Nombre"
last_name: "Apellidos"
+ limited: "Limitado"
+ nsfw_check: "Marcar todo lo que comparto como NSFW ('no es seguro para el trabajo)."
+ nsfw_explanation: "\"No es seguro para el trabajo\" (NSFW-'no es seguro para el trabajo') es un estándar de la comunidad de diaspora autónomo para el contenido que puede no ser adecuado para ver mientras estas trabajando. Si planeas compartir este material con frecuencia, por favor marca esta opción para que todo lo que compartas esté escondido para las personas comunes a menos que ellos elijan verlas."
+ nsfw_explanation2: "Si eliges no marcar esta opción, por favor agrega la etiqueta #nsfw cada vez que compartas un material de este tipo."
+ public: "Publico"
+ settings: "Configuración del perfil"
update_profile: "Actualizar perfil"
you_are_nsfw: "Has marcado tu perfil como no apto para todos los públicos, tu contenido no se mostrará a las personas que hayan descartado ver ese tipo de publicaciones."
you_are_safe_for_work: "Has marcado tu perfil como apto para todos públicos, esto significa que aceptas que el contenido que publiques respetará las normas de toda la comunidad."
@@ -793,6 +815,12 @@ es-VE:
i_like: "Tengo interés en %{tags}. "
invited_by: "Gracias por la invitación, "
newhere: "Hola"
+ poll:
+ add_a_poll: "Añadir una encuesta"
+ add_poll_answer: "Añadir opcion"
+ option: "Opcion 1"
+ question: "Pregunta"
+ remove_poll_answer: "Quitar opcion"
post_a_message_to: "Publicar un mensaje en %{aspect}"
posting: "Publicando..."
publishing_to: "publicar en:"
diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml
index c2f70abf7..13177d889 100644
--- a/config/locales/diaspora/es.yml
+++ b/config/locales/diaspora/es.yml
@@ -52,15 +52,12 @@ es:
taken: "está en uso."
admins:
admin_bar:
- correlations: "Similitudes"
pages: "Páginas"
pod_stats: "Estadísticas del servidor"
report: "Informes"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Buscar usuario"
weekly_user_stats: "Estadísticas Semanales del Usuario"
- correlations:
- correlations_count: "Cuentas similares:"
stats:
2weeks: "2 semanas"
50_most: "Las 50 etiquetas más leídas."
@@ -312,6 +309,7 @@ es:
send: "Enviar"
sending: "Enviando..."
subject: "Asunto"
+ subject_default: "Sin asunto"
to: "Para"
new_conversation:
fail: "Mensaje no válido"
diff --git a/config/locales/diaspora/eu.yml b/config/locales/diaspora/eu.yml
index 03021d7b7..bbbc1b917 100644
--- a/config/locales/diaspora/eu.yml
+++ b/config/locales/diaspora/eu.yml
@@ -42,13 +42,10 @@ eu:
taken: "erabilpenean dago jada."
admins:
admin_bar:
- correlations: "Korrelazioak"
pages: "Orrialdeak"
pod_stats: "Hornitzailearen Estatistikak"
user_search: "Erabiltzaile Bilaketa"
weekly_user_stats: "Asteko Erabiltzaile Estatistikak"
- correlations:
- correlations_count: "Korrelazioak Sarpen Zenbakiekin:"
stats:
2weeks: "2 aste"
50_most: "50 Etiketa Erabilienak"
diff --git a/config/locales/diaspora/fi.yml b/config/locales/diaspora/fi.yml
index 8b0340b87..ae9d9e949 100644
--- a/config/locales/diaspora/fi.yml
+++ b/config/locales/diaspora/fi.yml
@@ -53,15 +53,12 @@ fi:
taken: "on jo varattu."
admins:
admin_bar:
- correlations: "Vastaavuudet"
pages: "Sivut"
pod_stats: "Podin tilastot"
report: "Raportit"
sidekiq_monitor: "Sidekiq tarkkailija"
user_search: "Käyttäjähaku"
weekly_user_stats: "Viikottaiset käyttäjätilastot"
- correlations:
- correlations_count: "Korrelaatio sisäänkirjautumismäärän kanssa"
stats:
2weeks: "2 viikkoa"
50_most: "50 suosituinta tagia"
@@ -957,7 +954,7 @@ fi:
new:
create_my_account: "Luo käyttäjätili!"
email: "Sähköposti"
- enter_email: "Syötä sähköpostiosoite"
+ enter_email: "Syötä sähköpostiosoitteesi"
enter_password: "Syötä salasana (vähintään kuusi merkkiä)"
enter_password_again: "Syötä sama salasana kuin edellä"
enter_username: "Valitse käyttäjänimi (vain kirjaimet, numerot ja alaviivat sallittuja)"
@@ -1033,6 +1030,7 @@ fi:
no_friends: "Facebook-kavereita ei löytynyt."
service_friends: "%{service}-kaverit"
index:
+ connect: "Yhdistä"
disconnect: "Katkaise yhteys"
edit_services: "Muokkaa palveluita"
logged_in_as: "Kirjauduttu käyttäjänä %{nickname}."
diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml
index 23d31c6c2..993e59044 100644
--- a/config/locales/diaspora/fr.yml
+++ b/config/locales/diaspora/fr.yml
@@ -53,15 +53,12 @@ fr:
taken: "est déjà pris."
admins:
admin_bar:
- correlations: "Corrélations"
pages: "Pages"
pod_stats: "Statistiques du pod"
report: "Signalements"
sidekiq_monitor: "Moniteur Sidekiq"
user_search: "Chercher un utilisateur"
weekly_user_stats: "Statistiques utilisateur hebdomadaires"
- correlations:
- correlations_count: "Corrélations avec le nombre d'inscrits :"
stats:
2weeks: "Deux semaines"
50_most: "50 tags les plus populaires"
diff --git a/config/locales/diaspora/he.yml b/config/locales/diaspora/he.yml
index b38e2aa7c..b8bd3e0e7 100644
--- a/config/locales/diaspora/he.yml
+++ b/config/locales/diaspora/he.yml
@@ -51,14 +51,11 @@ he:
taken: "כבר תפוס."
admins:
admin_bar:
- correlations: "התאמות"
pages: "עמודים"
pod_stats: "סטטיסטיקה של הפוד"
sidekiq_monitor: "מעקב Sidekiq"
user_search: "חיפוש משתמש"
weekly_user_stats: "סטטיסטיקת חברים שבועית"
- correlations:
- correlations_count: "התאמות עם ספירת ההתחברויות:"
stats:
2weeks: "שבועיים"
50_most: "50 התגים הפופולאריים ביותר"
diff --git a/config/locales/diaspora/hu.yml b/config/locales/diaspora/hu.yml
index 9c86d8767..4cd812b19 100644
--- a/config/locales/diaspora/hu.yml
+++ b/config/locales/diaspora/hu.yml
@@ -51,15 +51,12 @@ hu:
taken: "már foglalt."
admins:
admin_bar:
- correlations: "Korrelációk"
pages: "Oldalak"
pod_stats: "Kiszolgáló statisztika"
report: "Jelentések"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Felhasználó keresés"
weekly_user_stats: "Heti statisztika"
- correlations:
- correlations_count: "Belépések számával való korrelációk:"
stats:
2weeks: "2 hét"
50_most: "50 legnépszerűbb címke"
diff --git a/config/locales/diaspora/hy.yml b/config/locales/diaspora/hy.yml
index 6c98522fe..261109de1 100644
--- a/config/locales/diaspora/hy.yml
+++ b/config/locales/diaspora/hy.yml
@@ -21,7 +21,7 @@ hy:
contact:
attributes:
person_id:
- taken: "Պետք է միակը լինի այս օգտատիրոջ կոնտակներում։"
+ taken: "պետք է միակը լինի այս օգտատիրոջ կապերում։"
person:
attributes:
diaspora_handle:
@@ -53,15 +53,12 @@ hy:
taken: "արդեն օգտագործվում է։"
admins:
admin_bar:
- correlations: "Կախվածություններ"
pages: "Էջեր"
pod_stats: "Փոդի վիճակագրություն"
report: "Զեկույցներ"
sidekiq_monitor: "Sidekiq մոնիտոր"
user_search: "Օգտատիրոջ որոնում"
weekly_user_stats: "Օգտատերերի շաբաթական վիճակագրություն"
- correlations:
- correlations_count: "Correlations with Sign In Count:"
stats:
2weeks: "2 շաբաթ"
50_most: "Ամենատարածված 50 պիտակները"
@@ -79,9 +76,9 @@ hy:
other: "%{count} գրառում"
zero: "%{count} գրառում"
shares:
- one: "%{count} տարածում"
- other: "%{count} տարածում"
- zero: "%{count} տարածում"
+ one: "կիսվել է %{count} անգամ"
+ other: "կիսվել է %{count} անգամ"
+ zero: "կիսվել է %{count} անգամ"
tag_name: "Պիտակը՝ <b>%{name_tag}</b> Օգտագործվել է` <b>%{count_tag}</b> անգամ"
usage_statistic: "Օգտագործման վիճակագրություն"
users:
@@ -92,7 +89,7 @@ hy:
user_entry:
account_closed: "Հաշիվը փակվել է"
diaspora_handle: "դիասպորա*յի ԱյԴի"
- email: "Էլ․փոստ"
+ email: "Էլ․հասցե"
guid: "ՋիՅուԱյԴի (General Unique IDentifier)"
id: "ԱյԴի"
last_seen: "Վեջին անգամ երևացել է"
@@ -109,7 +106,7 @@ hy:
add_invites: "Հրավերներ ավելացնել"
are_you_sure: "Համոզվա՞ծ ես, որ ուզում ես փակել այս հաշիվը։"
are_you_sure_lock_account: "Համոզվա՞ծ ես, որ ուզում ես արգելափակել այս հաշիվը։"
- are_you_sure_unlock_account: "Համոզվա՞ծ ես, որ ուզում ես ապարգելափակել այս հաշիվը։"
+ are_you_sure_unlock_account: "Համոզվա՞ծ ես, որ ուզում ես ապաարգելափակել այս հաշիվը։"
close_account: "Փակել հաշիվը"
email_to: "Էլ.փոստ` հրավեր ուղարկելու համար"
under_13: "Ցուցադրել 13-ից փոքր օգտատերերին (COPPA)"
@@ -135,12 +132,12 @@ hy:
unknown_person: "Անհայտ անձ"
video_title:
unknown: "Տեսանյութի անհայտ վերնագիր"
- are_you_sure: "Համոզվա՞ծ ես։"
+ are_you_sure: "Համոզվա՞ծ ես"
are_you_sure_delete_account: "Համոզվա՞ծ ես, որ ուզում ես փակել հաշիվդ։ Էլ վերականգնել չի լինի։"
aspect_memberships:
destroy:
failure: "Այս մարդուն չստացվեց հեռացնել խմբից։"
- no_membership: "Չստացվեց գտնել ընտրված կոնտակտին այդ խմբում"
+ no_membership: "Նշածդ մարդը այդ խմբում չգտնվեց։"
success: "Այս մարդը հաջողությամբ հեռացվեց խմբից։"
aspects:
add_to_aspect:
@@ -153,8 +150,8 @@ hy:
select_all: "Նշել ամբողջը"
aspect_stream:
make_something: "Ստեղծիր"
- stay_updated: "Եղիր տեղեկացված"
- stay_updated_explanation: "Քո լրահոսում ցուցադրվում են ընկերներիդ գործողությունները, այն պիտակներով գրառումները, որոնց հետևում ես, և համայնքի «ընտրված» անդամների գրառումները։"
+ stay_updated: "Եղի՛ր տեղեկացված"
+ stay_updated_explanation: "Լրահոսումդ լինելու են ընկերներիդ գործողությունները, այն պիտակներով գրառումները, որոնց հետևում ես, և համայնքի որոշ «ընտրված» անդամների գրառումները։"
contacts_not_visible: "Այս խմբի մարդիկ չեն կարողանա տեսնել միմյանց։"
contacts_visible: "Այս խմբի մարդիկ կկարողանան տեսնել միմյանց։"
create:
@@ -165,8 +162,8 @@ hy:
success: "%{name} խումբդ բարեհաջող ջնջվեց։"
success_auto_follow_back: "%{name} խումբը հաջողությամբ ջնջվեց։ Այդ խումբն օգտագործվում էր քեզ ավելացրած մարդկանց ինքնաբերաբար ավելացնելու համար։ Աչքի անցկացրու կարգավորումներդ և ընտրիր նոր խումբ, ուր կավելանան ինքնաբերաբար ավելացված մարդիկ։"
edit:
- aspect_chat_is_enabled: "Այս խմբի ընկերներդ կարող են չաթվել քո հետ։"
- aspect_chat_is_not_enabled: "Այս խմբի ընկերներդ չենք կարող չաթվել քո հետ։"
+ aspect_chat_is_enabled: "Այս խմբի մարդիկ կարող են չաթվել քո հետ։"
+ aspect_chat_is_not_enabled: "Այս խմբի մարդիկ չեն կարող չաթվել քո հետ։"
aspect_list_is_not_visible: "Այս խմբի մարդիկ չեն կարող տեսնել միմյանց։"
aspect_list_is_visible: "Այս խմբի մարդիկ կարող են տեսնել միմյանց։"
confirm_remove_aspect: "Վստա՞հ ես, որ ուզում ես ջնջել այս խումբը։"
@@ -188,22 +185,22 @@ hy:
any_problem: "Խնդի՞ր ունես"
contact_podmin: "Կապվիր քո փոդի ադմինի հետ։"
do_you: "Արդյո՞ք."
- email_feedback: "Կարող ես նաև %{link}-ին ուղարկել քո կարծիքը։"
- email_link: "Էլ․փոստ"
+ email_feedback: "Նաև կարող ես ուղարկել կարծիքդ %{link}ով։"
+ email_link: "էլ․փոստ"
feature_suggestion: "… %{link} ունես։"
find_a_bug: "… %{link} ես գտել։"
have_a_question: "… %{link} ունես։"
here_to_help: "դիասպորա*յի համայնքն այստե՜ղ է։"
- mail_podmin: "Փոդմինի էլ․փոստը"
+ mail_podmin: "Փոդմինի էլ․հասցեն"
need_help: "Օգնությու՞ն"
tag_bug: "բագ"
tag_feature: "առաջարկություն"
tag_question: "հարց"
- tutorial_link_text: "Ուսուցանող նյութեր"
- tutorials_and_wiki: "%{faq}, %{tutorial} և %{wiki}՝ օգնություն առաջին քայլերիդ համար։"
+ tutorial_link_text: "ուսուցանող նյութեր"
+ tutorials_and_wiki: "%{faq}, %{tutorial} և %{wiki}՝ առաջին քայլերիդ համար։"
introduce_yourself: "Սա քո լրահոսն է։  Ընկղմվիր ու ներկայացրու ինքդ քեզ։"
keep_diaspora_running: "Նպաստի՛ր դիասպորա*յի արագ զարգացմանը ամսական նվիրատվությամբ։"
- keep_pod_running: "Փող քցվենք %{pod}-ի առողջության համար:"
+ keep_pod_running: "Փող քցվենք %{pod}-ի առողջության համար։"
new_here:
follow: "Հետևիր %{link} պիտակը և ողջունիր դիասպորա*յի նոր օգտատերերին։"
learn_more: "Իմանալ ավելին"
@@ -211,7 +208,7 @@ hy:
no_contacts: "Ոչ ոք չկա"
no_tags: "+ Հետևելու պիտակ գտնել"
people_sharing_with_you: "Քեզ հետ կիսվող մարդիկ"
- post_a_message: "հաղորդագրություն գրել >>"
+ post_a_message: "գրառել >>"
services:
content: "Կարող ես միացնել հետևյալ ծառայությունները դիասպորա*յին՝"
heading: "Միացնել ծառայությունները"
@@ -221,12 +218,12 @@ hy:
create: "Ստեղծել"
name: "Անունը (միայն քեզ է տեսանելի)"
no_contacts_message:
- community_spotlight: "համայնքի նորությունները"
- or_spotlight: "Կամ կարող ես տարածել %{link} -ը։"
+ community_spotlight: "համայնքի ակնառու օգտատերերի"
+ or_spotlight: "Կամ կարող ես կիսվել %{link} հետ։"
try_adding_some_more_contacts: "Կարող ես էլի մարդկանց փնտրել կամ հրավիրել։"
you_should_add_some_more_contacts: "Լավ կլինի՝ մի քանի մարդ ավելացնես։"
no_posts_message:
- start_talking: "Բոլորը դավադրաբար լռում են դեռ։"
+ start_talking: "Բոլորը դեռ դավադրաբար լռում են"
one: "1 խումբ"
other: "%{count} խումբ"
seed:
@@ -266,24 +263,24 @@ hy:
add_a_new_aspect: "Նոր խումբ ավելացնել"
add_contact: "Ավելացնել"
add_to_aspect: "Ավելացնել %{name} խումբ"
- all_contacts: "Բոլոր մարդիկ"
- community_spotlight: "Համայնքի նորությունները"
+ all_contacts: "Բոլորը"
+ community_spotlight: "Համայնքի ակնառու օգտատերեր"
my_contacts: "Իմ կապերը"
no_contacts: "Երևում է՝ նոր ընկերների կարիք ունես։"
no_contacts_in_aspect: "Այս խմբում դեռ ոչ մեկին չես ավելացրել։ Ներքևում այս պահի քո բոլոր ընկերների ցուցակն է, ում կարող ես ավելացնել այս խմբին։"
- no_contacts_message: "Ստուգել %{community_spotlight}"
- only_sharing_with_me: "Միայն ինձ հետ կիսվողները"
+ no_contacts_message: "Անցի՛ր %{community_spotlight} ցուցակով։"
+ only_sharing_with_me: "Ինձ հետ միակողմանի կիսվողները"
remove_contact: "Հեռացնել"
start_a_conversation: "Խոսակցություն սկսել"
title: "Մարդիկ"
- user_search: "Օգտատերերի որոնում"
- your_contacts: "Քո կոնտակտները"
+ user_search: "Որոնում կապերիդ մեջ"
+ your_contacts: "Քո կապերը"
one: "1 հոգի"
other: "%{count} հոգի"
sharing:
people_sharing: "Քեզ հետ կիսվող մարդիկ"
spotlight:
- community_spotlight: "Համայնքի նորությունները"
+ community_spotlight: "Համայնքի ակնառու օգտատերեր"
suggest_member: "Անդամ առաջարկել"
zero: "Ոչ ոք չկա"
conversations:
@@ -291,7 +288,7 @@ hy:
participants: "Մասնակիցները"
create:
fail: "Անվավեր հաղորդագրություն"
- no_contact: "Հեյ, նախ պետք է մեկին ավելացնես։"
+ no_contact: "Հեյ, բա հասցեատե՞րը։"
sent: "Հաղորդագրությունն ուղարկված է"
destroy:
delete_success: "Զրույցը հաջողությամբ ջնջվեց"
@@ -306,13 +303,14 @@ hy:
create_a_new_conversation: "Նոր զրույց սկսել"
inbox: "Մուտքային"
new_conversation: "Նոր զրույց"
- no_conversation_selected: "Որևէ զրույց չի ընտրվել"
- no_messages: "հաղորդագրություն չկա, դեռ ;Ճ"
+ no_conversation_selected: "Որևէ զրույց ընտրված չէ"
+ no_messages: "Հաղորդագրություններ չկան, դեռ ;Ճ"
new:
abandon_changes: "Չեղարկե՞լ փոփոխությունները։"
send: "Ուղարկել"
sending: "Ուղարկվում է․․․"
subject: "Թեմա"
+ subject_default: "Առանց թեմայի"
to: "Ո՞ւմ"
new_conversation:
fail: "Անվավեր հաղորդագրություն"
@@ -327,37 +325,37 @@ hy:
birthday_with_year: "%d %B %Y"
fullmonth_day: "%d %B"
delete: "Ջնջել"
- email: "Էլ.փոստ"
+ email: "Էլ.հասցե"
error_messages:
helper:
correct_the_following_errors_and_try_again: "Ուղղիր նշված վրիպակները և կրկին փորձիր։"
invalid_fields: "Անվավեր դաշտեր"
login_try_again: "<a href='%{login_link}'>մուտք գործիր</a> և փորձիր նորից:"
post_not_public: "Գրառումը, որ փորձում ես դիտել, հրապարակային չէ։"
- post_not_public_or_not_exist: "Գրառումը, որ փորձում ես դիտել, հանրային չէ կամ գոյություն չունի։"
+ post_not_public_or_not_exist: "Գրառումը, որ փորձում ես դիտել, հրապարակային չէ կամ գոյություն չունի։"
fill_me_out: "Լրացրու՛ ինձ"
find_people: "Գտնել մարդկանց կամ #պիտակներ"
help:
account_and_data_management:
- close_account_a: "Բացիր Կարգավորումների Հաշիվ բաժինը և սեղմիր ամենաներքևում գտնվող «Փակել հաշիվը» կոճակը։ Գործընթացն իրականացնելու համար պետք է նաև մուտքագրես գաղտնաբառդ։ Բայց հիշի՛ր, եթե փակես հաշիվդ, այլևս <strong>երբեք</strong> չես կարողանա նույն օգտանունով վերագրանցվել այդ փոդում։"
+ close_account_a: "Բացիր կարգավորումների «Հաշիվ» բաժինը և սեղմիր ամենաներքևում գտնվող «Փակել հաշիվը» կոճակը։ Գործընթացն իրականացնելու համար պետք է նաև մուտքագրես գաղտնաբառդ։ Բայց հիշի՛ր, հաշիվդ փակելու դեպքում այլևս <strong>երբեք</strong> չես կարողանա նույն օգտանունով վերագրանցվել այդ փոդում։"
close_account_q: "Ինչպե՞ս ջնջեմ իմ հաշիվը։"
- data_other_podmins_a: "Հենց սկսես կիսվել այլ փոդից որևիցե մեկի հետ իրեն տեսանելի քո բոլոր գրառումները և քո էջի կրկնօրինակը պահվում (քեշավորվում) են իր փոդում և հասանելի են այդ փոդի տվյալների բազայի ադմինին։ Երբ որևէ գրառում կամ էջիդ տվյալ ես ջնջնում, այն ջնջվում է քո փոդից և ջնջելու հայտ է ուղարկվում բոլոր այն փոդերին, որտեղ մինչ այդ այն պահվել էր։ Իսկ նկարներդ բացի քո փոդից ուրիշ ոչ մի փոդում չեն պահվում. միայն դրանց հղումներն են փոխանցվում այլ փոդերին։"
+ data_other_podmins_a: "Հենց դու սկսում ես կիսվել այլ փոդից որևիցե մեկի հետ, իրեն տեսանելի քո բոլոր գրառումները և քո էջի կրկնօրինակը պահվում (քեշավորվում) են իր փոդում և հասանելի են դառնում այդ փոդի տվյալների բազայի ադմինին։ Երբ որևէ գրառում կամ էջիդ տվյալ ես ջնջնում, այն ջնջվում է քո փոդից և ջնջելու հայտ է ուղարկվում բոլոր այն փոդերին, որտեղ մինչ այդ այն պահվել էր։ Իսկ նկարներդ բացի քո փոդից ուրիշ ոչ մի փոդում չեն պահվում. միայն դրանց հղումներն են փոխանցվում այլ փոդերին։"
data_other_podmins_q: "Կարող ե՞ն այլ փոդերի ադմինները տեսնել իմ տվյալները։"
- data_visible_to_podmin_a: "Եթե կարճ` ամբողջը։ Հաղորդակցությունը փոդերի միջև միշտ կոդավորված է (ՍՍԼ-ով ու դիասպորա*յի սեփական տեղափոխման կոդավորմամբ), սակայն տվյալների պահպանումը փոդերում կոդավորված չէ։ Ցանկության դեպքում քո փոդի տվյալների բազայի ադմինիստրատորին (սովորաբար հենց ինքը` փոդը աշխատեցնողը) հասանելի են և՛ քո էջը, և՛ մնացած ամենը, որ գրառում ես (ճիշտ նույնպես ինչպես մյուս կայքերում, որ պահպանում են օգտատիրոջ տվյալները)։ Եթե աշխատեցնես քո փոդը, կունենաս ավելի շատ գաղտնիություն, քանզի այդ դեպքում դու ես կառավարում տվյալների բազայի մուտքը։"
+ data_visible_to_podmin_a: "Եթե կարճ` ամբողջը։ Հաղորդակցությունը փոդերի միջև միշտ կոդավորված է (ՍՍԼ-ով ու դիասպորա*յի սեփական տեղափոխման կոդավորմամբ), սակայն տվյալների պահպանումը փոդերում կոդավորված չէ։ Ցանկության դեպքում քո փոդի տվյալների բազայի ադմինիստրատորին (սովորաբար հենց ինքը` փոդը աշխատեցնողը) հասանելի են և՛ քո էջը, և՛ մնացած ամենը, որ գրառում ես (ճիշտ նույն կերպ, ինչպես մյուս կայքերում, որ պահպանում են օգտատիրոջ տվյալները)։ Եթե աշխատեցնես քո փոդը, կունենաս ավելի շատ գաղտնիություն, քանզի այդ դեպքում դու ես կառավարում տվյալների բազայի մուտքը։"
data_visible_to_podmin_q: "Իմ հաշվում եղած տվյալների ո՞ր մասը կարող է տեսնել իմ փոդի ադմինը։"
- download_data_a: "Այո։ Կարգավորումների Հաշիվ բաժնի ամենաներքևում կարող ես երկու կոճակ տեսնել. մեկը տվյալներդ ներբեռնելու համար, մյուսը` նկարներդ։"
+ download_data_a: "Այո։ Կարգավորումների «Հաշիվ» բաժնի ամենաներքևում կարող ես երկու կոճակ տեսնել՝ մեկը տվյալներդ ներբեռնելու համար, մյուսը` նկարներդ։"
download_data_q: "Կարող ե՞մ ներբեռնել իմ հաշվում եղած բոլոր տվյալների պատճեն։"
- move_pods_a: "Հետագայում կկարողանաս դուրս հանել մի փոդից քո հաշվի հոսքը և լցնել այն մեկ այլի մեջ, սակայն առայժմ դա հնարավոր չէ։ Բայց դու միշտ կարող ես բացել նոր հաշիվ ու ավելացնել քո ընկեներին այնտեղի խմբեր և խնդրել նրանց, որ ավելացնեն քո նոր հաշիվը իրենց մոտ։"
+ move_pods_a: "Ցավոք դեռ միայն սպասվում է հնարավորությունը՝ տեղափոխելու հաշվիդ հոսքը մի փոդից մեկ այլը։ Բայց դու միշտ կարող ես բացել նոր հաշիվ այլ փոդում ու ավելացնել ներկայիս ընկեներիդ՝ խնդրելով նրանց ևս կիսվել քո հետ։"
move_pods_q: "Ինչպե՞ս կարող եմ տեղափոխել իմ հաշիվը մի փոդից մյուսը։"
title: "Հաշվի և տվյալների կառավարում"
aspects:
- change_aspect_of_post_a: "Ոչ, բայց դու միշտ էլ կարող ես անել նոր գրառում նույն բովանդակությամբ ու տեսանելի դարձնել այլ խմբերի։"
+ change_aspect_of_post_a: "Ոչ, բայց դու միշտ էլ կարող ես անել նոր գրառում նույն բովանդակությամբ ու տեսանելի դարձնել մյուս խմբերին։"
change_aspect_of_post_q: "Երբ արդեն կատարել եմ գրառումը, կարո՞ղ եմ փոխել խմբերն, ում այն տեսանելի է։"
contacts_know_aspect_a: "Չէ, նրանք ոչ մի դեպքում չեն կարող տեսնել, թե քո որ խմբում են։ Միայն եթե դու իրենց ասես կամ ցույց տաս։"
contacts_know_aspect_q: "Իմ ընկերները գիտե՞ն՝ որ խումբ եմ իրենց ավելացրել։"
- contacts_visible_a: "Եթե ընտրես այդ կետը, ապա այդ խմբի մարդիկ կկարողանան տեսնել` խմբում ուրիշ ով կա քո էջի Contacts բաժնում։ Դա արժի ընտրել այն դեպքում, եթե այդ խմբում բոլորը իրար ճանաչում են։ Ամեն դեպքում նրանք չեն կարող տեսնել՝ ինչպես է խումբը կոչվում։"
+ contacts_visible_a: "Այս կետը ընտրելու դեպքում այդ խմբի մարդիկ կկարողանան տեսնել խմբի մյուս անդամներին քո էջի «Կապեր» բաժնում։ Դա արժի ընտրել այն դեպքում, եթե այդ խմբում բոլորը իրար ճանաչում են։ Ամեն դեպքում նրանք չեն կարող տեսնել՝ ինչպես է խումբը կոչվում։"
contacts_visible_q: "Ի՞նչ է անում «Դարձնե՞լ այս խմբի մարդկանց տեսանելի միմյանց համար» կետը։"
- delete_aspect_a: "Քո կոնտակտների էջում ձախ կողմի ցանցում սեղմիր խմբի վրա, որ ուզում ես ջնջել։ Ապա, երբ խմբի անունը մեծ կհայտնվի վերևում , սեղմիր նկարված փոքրիկ աղբարկղը [ «Ջնջել» ]։"
+ delete_aspect_a: "Կապերիդ էջում որևիցե խումբ ընտրելիս` էջի աջ կողմում աղբարկղի նշան կտեսնես։ Հենց դա էլ սեղմելով կարող ես ջնջել խումբը։"
delete_aspect_q: "Ինչպե՞ս ջնջեմ խումբը։"
person_multiple_aspects_a: "Այո։ Գնա քո կոնտակտների էջ և սեղմիր «Իմ ընկերները»։ Յուրաքանչյուր մարդու համար կարող ես օգտագործել աջ կողմի ցանկը նրան քանի խմբում ուզես ավելացնելու կամ հանելու համար։ Կամ կարող ես ավելացնել կամ հանել մարդկանց նոր խմբից սեղմելով խումբ ընտրող կոճակը իրենց էջի վրա։ Կամ էլ կարող ես պարզապես կուրսորդ նրանց վրա պահել ցանկացած այլ տեղ, ասենք լրահոսումդ, և կհայտնվի նրանց մասին ընդհանուր տեղեկատվությամբ պատուհանը։ Հենց այդտեղի աջ մասում էլ կարող ես փոփոխություններ անել։"
person_multiple_aspects_q: "Կարո՞ղ եմ մարդուն մի քանի խումբ ավելացնել։"
@@ -365,19 +363,19 @@ hy:
post_multiple_aspects_q: "Կարո՞ղ եմ միանգամից մի քանի խմբերի համար գրառել։"
remove_notification_a: "Ոչ։ Իր հետ արդեն կիսվելու պարագայում նա նաև չի ծանուցվի, երբ իրեն այլ խմբեր էլ ավելացնես։"
remove_notification_q: "Եթե ես ջնջում եմ ինչ-որ մեկին իմ խմբ(եր)ից, նա տեղեկացվո՞ւմ է դրա մասին։"
- rename_aspect_a: "Ահա, քո խմբերի ցուցակում՝ կոնտակտների էջի ձախ կողմում , տար կուրսորդ այն խմբի վրա, որ ուզում ես վերանվանել։ Սեղմիր դրա վրա ու երբ կհայտնվի խմբի անունը մեծ, սեղմիր անվան կողքի մատիտի վրա՝ «վերանվանել»։"
+ rename_aspect_a: "Կապերիդ էջում ընտրելով որևիցե խումբ՝ դրա անվանման կողքին մատիտի նշան կտեսնես։ Սեղմելով դրան կարող ես մուտքագրել խմբի նոր անունը ու սեղմել «Թարմացնել»։"
rename_aspect_q: "Ինչպե՞ս կարող եմ վերանվանել խումբը։"
- restrict_posts_i_see_a: "Ահա։ Սեղմիր «Իմ խմբերը» ձախ կողմում, ապա սեղմիր կոնկրետ խմբերին, որ նշես կամ ապանշես դրանք։ Միայն նշված խմբերի մարդկանց գրառումները կհայտնվեն քո լրահոսում։"
+ restrict_posts_i_see_a: "Ահա։ Սեղմիր «Իմ խմբերը» ձախ կողմում, ապա սեղմիր կոնկրետ խմբերին, որ նշես կամ ապանշես դրանք։ Միայն ընտրված խմբերի մարդկանց գրառումները կհայտնվեն լրահոսումդ։"
restrict_posts_i_see_q: "Կարո՞ղ եմ այնպես անել, որ տեսնեմ միայն կոնկրետ խմբի մարդկանց գրառումները։"
title: "Խմբերի մասին"
what_is_an_aspect_a: "Խմբերը քո դիասպորա*յի ընկերներին խմբավորելու ձևն են։ Դրանց միջոցով կարող ես կարգավորել, թե ով ես դու տարբեր խմբերում, օրինակ՝ աշխատավայրում ոնցն ես ու ինչ ես կիսվում իրենց հետ, ընկերների կամ ինչ-որ սպեցիֆիկ խմբավորման հետ ինչպիսին ես ու ինչ ես կրկին կիսվում իրենց հետ։"
what_is_an_aspect_q: "Ի՞նչ է խումբը։"
- who_sees_post_a: "Եթե փակ գրառում ես անում, դա միայն տեսանելի կլինի ընտրածդ խմբի (կամ խմբերի, եթե մի քանիսն ես ընտրել կիսվելու համար) մարդկանց համար։ Մյուսները, ովքեր այդ խմբում չեն, չունեն տարբերակ դա տեսնելու։ Միայն հրապարակային գրառումներն են, որ տեսանելի են մարդկանց, ովքեր չկան քո խմբ(եր)ում։"
+ who_sees_post_a: "Եթե փակ գրառում ես անում, դա միայն տեսանելի կլինի ընտրածդ խմբի (կամ խմբերի, եթե մի քանիսն ես ընտրել) մարդկանց համար։ Մյուսները, ովքեր այդ խմբ(եր)ում չեն, չունեն տարբերակ դա տեսնելու։ Միայն հրապարակային գրառումներն են, որ տեսանելի են մարդկանց, որոնց հետ առհասարակ չես կիսվում։"
who_sees_post_q: "Երբ ես գրառում եմ որևէ խմբի համար, ո՞վ է դա տեսնում։"
chat:
- add_contact_roster_a: "Առաջին հերթին, պետք է չաթը ակտիվացնես խմբերից մեկի համար, ուր այդ մարդը կա։ Սա անելու համար գնա %{contacts_page}, ընտրիր ուզածդ խումբը և սեղմիր չաթի պատկերի վրա, որ ակտիվացնես չաթը։ %{toggle_privilege} Դու կարող ես ստեղծել հատուկ խումբ «Չաթ» անվամբ ու ավելացնել էնտեղ այն մարդկանց, ում հետ հավես ունես չաթվելու։ Երբ սա անես, բացիր չաթվելու ինտերֆեյսը, ընտրիր ում հետ ես ուզում չաթվել։"
- add_contact_roster_q: "Ինչպե՞ս չաթվել diaspora*-ում։"
- contacts_page: "ընկերների էջ"
+ add_contact_roster_a: "Այո, դրա համար նախ պետք է ակտիվացնես չաթը այն խմբերից մեկի համար, որում քեզ անհրաժեշտ մարդը կա։ Դա անելու համար գնա %{contacts_page}, ընտրիր համապատասխան խումբը և սեղմիր չաթի նշանի վրա, որ ակտիվացնես այն։ %{toggle_privilege} Գործդ հեշտացնելու համար կարող ես ստեղծել հատուկ խումբ «Չաթ» անվամբ ու ավելացնել էնտեղ այն մարդկանց, ում հետ հավես ունես չաթվելու։ Քեզ կմնա միայն բացել չաթվելու ինտերֆեյսը ու ընտրել նրան, ում հետ ուզում ես չաթվել։"
+ add_contact_roster_q: "Հնարավո՞ր է չաթվել մարդկանց հետ դիասպորա*յում։"
+ contacts_page: "«Կապեր» էջը"
title: "Չաթ"
faq: "ՀՏՀ"
foundation_website: "դիասպորա* հիմնադրամի կայքը"
@@ -421,12 +419,12 @@ hy:
miscellaneous:
back_to_top_a: "Այո։ Զննիչիդ պատուհանի աջ֊ներքևի անկյունում գտնվող մոխրագույն սլաքը հենց դրա համար է նախատեսված։"
back_to_top_q: "Կա որդյո՞ք որևէ կարճ տարբերակ բարձրանալու էջի սկիզբ, երբ բավականին իջել եմ ներքև։"
- diaspora_app_a: "Մի քանի փորձ եղել է Անդրոիդի համար հավելված ստեղծելու, սակայն դրանք մեծ մասամբ վաղուց թողնված նախագծեր են ու դիասպորայի ներկայիս վարկածի հետ լավ չեն աշխատում։ Չարժի շատ բան սպասել դրանցից։ iOS֊ի համար հավելված այս պահին չկա։ Դիասպորան դյուրակիր (մոբայլ) սարքից դիտելու լավագույն տարբերակը զննիչով է, որովհետև կա կայքի դյուրակիր տարբերակը, որը պիտի, որ լավ աշխատի նաև քո սարքի համար, բայց ամբողջ ֆունկցիոնալությունը չէ, որ ապահովված է։"
- diaspora_app_q: "Դիասպորայի հավելված կա Android֊ի կամ iOS֊ի համար։"
+ diaspora_app_a: "Մի քանի փորձ եղել է Անդրոիդի համար հավելված ստեղծելու, սակայն դրանք մեծ մասամբ վաղուց թողնված նախագծեր են ու դիասպորա*յի ներկայիս վարկածի հետ լավ չեն աշխատում. չարժի շատ բան սպասել դրանցից։ ԱյՕՍ-ի համար հավելված այս պահին չկա։ Դիասպորա*ն դյուրակիր (մոբայլ) սարքից դիտելու լավագույն տարբերակը զննիչով է, որովհետև կա կայքի դյուրակիր տարբերակ, որը պետք է որ լավ աշխատի բոլոր սարքերի համար, սակայն ամբողջ ֆունկցիոնալությունը չէ, որ ապահովված է։"
+ diaspora_app_q: "Կա՞ արդյոք դիասպորա*յի հավելված Անդրոիդի կամ ԱյՕՍ-ի համար։"
photo_albums_a: "Ոչ, դեռ։ Ինչևէ, կարող ես դիտել տվյալ մարդու բոլոր վերբեռնած նկարները իր էջի «Նկարներ» բաժնում։"
photo_albums_q: "Կա՞ն տեսանյութերի կամ նկարների ալբոմներ։"
subscribe_feed_a: "Ահա, բայց սա դեռ շատ լավ մշակված ֆունկցիա չէ և արդյունքների ձևավորումը շատ կոպիտ է։ Եթե ուզում ես միևնույն է փորձել (իսկ դա արժի փորձել ;Ճ), գնա ինչ֊որ մեկի էջ, պատճենիր նրա օգտանունը և փոդի անունը։ Տեղադրիր դրանք այս հղման համապատասխան մասերում․ https://<b>podname․am</b>/public/<b>username</b>.atom և բաժանորդագրվիր քո սիրելի ընթերցիչով։ Դիասպորան օգտագորոծում է «Atom» ( ոչ թե «RSS»)։"
- subscribe_feed_q: "Կարո՞ղ եմ բաժանորդագրվել ինչ֊որ մեկի հրապարակային գրառումներին ընթերցիչով։"
+ subscribe_feed_q: "Կարո՞ղ եմ բաժանորդագրվել ինչ-որ մեկի հրապարակային գրառումներին ընթերցիչով։"
title: "Խառը"
pods:
find_people_a: "Եթե ցանկանում ես հրավիրել ընկերներիդ diaspora*, օգտագործիր հիմնական էջի աջ կողմի հղումը։ Հետևիր #պիտակներին, որպեսզի բացահայտես ուրիշների, ովքեր կիսում են քո հետաքրքրությունները, ավելացրու քեզ հետաքրքրող գրառումներով մարդկանց քո խմբեր։ Հայտնիր քո մասին #ԵսՆորեկԵմ հրապարակային գրառմամբ, ու մարդիկ կկարողանան գտնել քեզ։"
@@ -438,36 +436,36 @@ hy:
what_is_a_pod_q: "Ի՞նչ է փոդը։"
posts_and_posting:
char_limit_services_a: "Այդ դեպքում գրառումդ սահմանափակված է ավելի քիչ քանակ նիշերով (140 Թուիթերի դեպքում, 1000` Թամբլրի), և եթե այդ ծառայության կոճակը սեղմված է, քեզ ցուցադրվում է դեռևս մնացող նիշերի քանակը։ Ամեն դեպքում դու կարող ես իրենց սահմանափակումից երկար գրառումներ կատարել այդ ծառայություններում, բայց տեքստդ իրենց մոտ այլ տեսք կունենա` կրճատված ու դիասպորա*յում այդ գրառման հղումով։"
- char_limit_services_q: "Իսկ ի՞նչ, եթե ես տարածում եմ գրառումս միացված ծառայության հետ, որն ավելի փոքր նիշերի քանակի հնարավորություն ունի։"
+ char_limit_services_q: "Իսկ ի՞նչ, եթե ես տարածում եմ գրառումս միացված ծառայության հետ, որը նիշերի ավելի քիչ քանակի հնարավորություն ունի։"
character_limit_a: "65,535 նիշ. 65,395-ով ավելի շատ, քան Թուիթերում։ ;Ճ"
character_limit_q: "Գրառումը առավելագույնը քանի՞ նիշից կարող է բաղկացած լինել։"
- embed_multimedia_a: "Սովորաբար կարող ես ուղղակի դնել հղումը (օրինակ՝ http://www․youtube․com/watch?v=nananananana) քո գրառման մեջ և տեսանյութը կամ ձայնագրությունը ինքնաբերաբար կներառվեն։ Այս պահին սպասարկվում են՝ YouTube, Vimeo, SoundCloud, Flickr և մի քանի այլ։ diaspora*-ն օգտագործում է oEmbed այս ֆունկցիոնալը ապահովելու համար։ Մենք աշխատում ենք ավելի շատ մեդիա աղբյուրներ սպասարկել։ Փորձիր հնարավորինս պարզ անել գրառումը․ ամբողջական հղում /առանց կարճացնելու/, չդնել օպերատորներ հիմնական հղումից հետո և մի քիչ սպասիր մինչ էջը թարմացնելը։"
+ embed_multimedia_a: "Սովորաբար կարող ես ուղղակի դնել հղումը (օրինակ՝ http://www․youtube․com/watch?v=nanananana) քո գրառման մեջ, և տեսանյութը կամ ձայնագրությունը ինքնաբերաբար կներառվեն։ Այս պահին սպասարկվում են՝ ՅուԹուբը, Վիմիոն, ՍաունդՔլաուդը, Ֆլիքըրը և ևս մի քանիսը։ դիասպորա*ն օգտագործում է oEmbed այս ֆունկցիոնալը ապահովելու համար։ Մենք աշխատում ենք ավելի շատ մեդիա աղբյուրներ սպասարկել։ Փորձիր հնարավորինս պարզ անել գրառումը․ ամբողջական հղում /առանց կարճացնելու/, չդնել օպերատորներ հիմնական հղումից հետո և մի քիչ սպասիր մինչ էջը թարմացնելը։"
embed_multimedia_q: "Ինչպե՞ս ներառեմ տեսանյութ, ձայնագրություններ կամ այլ մուլտիմեդիա իմ գրառումների մեջ։"
format_text_a: "Օգտագործելով հեշտացված համակարգը՝ %{markdown}։ Կարող ես գտնել նշաձևի ամբողջ սինտաքսը %{here}։ Նախադիտելու կոճակը շատ օգտակար է էդպիսի դեպքերում, որովհետև կարող ես տեսնել՝ ինչ տեսք կունենա քո գրառումը այն անելուց հետո։"
format_text_q: "Ինչպե՞ս կարող եմ ձևավորել տեքստը իմ գրառումների մեջ (մուգ (bold), թեք (italic) և այլն)։"
- hide_posts_a: "Եթե մկնիկդ պահես գրառման վերևում, X է հայտնվում աջ կողմում։ Սեղմիր դրա վրա գրառումը թաքցնելու և դրա ծանուցումները անջատելու համար։ Այնուամենայնիվ այդ գրառումը կմնա ու քեզ տեսանելի կլինի գրառումը կատարած մարդու էջում։"
+ hide_posts_a: "Եթե մկնիկդ պահես գրառման վրա, վերևի աջ կողմում կնկատես x նշանը։ Սեղմիր այն՝ գրառումը թաքցնելու և դրա ծանուցումները անջատելու համար։ Այնուամենայնիվ այդ գրառումը մնալու ու քեզ տեսանելի է լինելու այն կատարած մարդու էջում։"
hide_posts_q: "Ինչպե՞ս թաքցնեմ գրառումը։"
image_text: "նկարի տեքստը"
- image_url: "նկարի url֊ը"
- insert_images_a: "Սեղմիր տեսախցիկի պատկերիկը գրառման մեջ նկար ավելացնելու համար։ Կրկին սեղմիր հաջորդ նկարը ավելացնելու համար կամ կարող ես միանգամից մի քանի նկար ընտրել։"
+ image_url: "նկարի հասցեն"
+ insert_images_a: "Սեղմիր տեսախցիկի նշանը գրառման մեջ նկար ավելացնելու համար։ Կրկին սեղմիր հաջորդ նկարը ավելացնելու համար կամ կարող ես միանգամից մի քանի նկար ընտրել։"
insert_images_comments_a1: "Մեկնաբանություններում նկարներ վերբեռնելու հնարավորոթյուն չունես, սակայն նշաձևի (Markdown) հետևյալ կոդը`"
insert_images_comments_a2: "թույլ կտա մեկնաբանություններում, ինչպես նաև գրառումներում նկարներ ներառել համացանցից։"
insert_images_comments_q: "Կարո՞ղ եմ նկար ավելացնել մեկնաբանության մեջ։"
insert_images_q: "Ինչպե՞ս նկար ներառեմ գրառումների մեջ։"
post_location_a: "Սեղմիր գնդասեղի պատկերիկի վրա, որ գրառում անելու դաշտում տեսախցիկի կողքն է։ Կարող ես փոխել քո տեղակայությունը, հնարավոր է ուզենաս միայն քաղաքը ներառել ամբողջական հասցեի փոխարեն։"
- post_location_q: "Ինչպե՞ս գրառմանը տեղակայություն ավելացնեմ։"
- post_notification_a: "Աջ վերևի անկյունում՝ X-ի կողքը կտեսնես զանգի պատկերիկ։ Սեղմիր այդ գրառման մասին ծանուցումներ ստանալ֊չստանալու համար։"
- post_notification_q: "Ինչպե՞ս սկսել կամ դադարել ծանուցումներ ստանալ գրառման մասին։"
+ post_location_q: "Ինչպե՞ս ավելացնեմ իմ տեղակայությունը գրառման մեջ։"
+ post_notification_a: "Գրառման աջ վերևի անկյունում՝ x-ի կողքը կտեսնես զանգի նշան։ Սեղմիր այն գրառման մասին ծանուցումներ ստանալ֊չստանալու համար։"
+ post_notification_q: "Ինչպե՞ս սկսել կամ դադարել ծանուցումներ ստանալ կոնկրետ գրառումից։"
post_poll_a: "Սեղմիր դիագրամի պատկերիկի վրա։ Մուտքագրիր հարցը և առնվազն երկու պատասխան։ Չմոռանաս գրառումը հրապարակային անել, եթե ուզում ես՝ բոլորը կարողանան մասնակցել հարցմանը։"
post_poll_q: "Ինչպե՞ս հարցում ավելացնեմ գրառմանը։"
- post_report_a: "Սեղմիր տագնապային եռանկյունիկը, որ տեղեկացնես այդ գրառման մասին պոդմինիդ։ Մուտքագրիր դրա մասին զեկուցելու պատճառը։"
+ post_report_a: "Սեղմիր գրառման աջ վերևի անկյունում տագնապային եռանկյունու նշանը, որ տեղեկացնես այդ գրառման մասին պոդմինիդ։ Լրացրու նաև բողոքիդ պատճառը։"
post_report_q: "Ինչպե՞ս տեղեկացնել վիրավորական գրառման մասին։"
size_of_images_a: "Ոչ, նկարների չափը մեխանիկորեն փոխվում է հոսքին կամ առանձին գրառման չափին համապատասխան։ Նշաձևը (Markdown) չունի կոդ նկարի չափը սահմանելու համար։"
size_of_images_q: "Կարո՞ղ եմ հարմարեցնել նկարների չափերը գրառման կամ մեկնաբանությունների մեջ։"
stream_full_of_posts_a1: "Քո լրահոսը բաղկացած է երեք տեսակի գրառումներից․"
stream_full_of_posts_li1: "Գրառումներ այն մարդկանցից, ում հետ դու կիսվում ես, որ կրկին երկու տեսակի են լինում՝ հրապարակային ու փակ գրառումներ, որ գրառողը կիսվել է որևէ խմբի հետ․ որի մաս ես դու։ Որպեսզի չտեսնես այդ տիպի գրառումները, պարզապես դադարեցրու կիսվել այդ մարդկանց հետ։"
stream_full_of_posts_li2: "Հրապարակային գրառումներ, որ նշված են այն պիտակ(ներ)ով, որին դու հետևում ես։ Այս տիպի գրառումներից ազատվելու համար դադարեցրու հետևելը այդ պիտակներին։"
- stream_full_of_posts_li3: "Հրապարակային գրառումներ այն մարդկանցից, ովքեր նշված են համայնքի նորությունների ակնարկում։ Սրանք կարող են հեռացվել քո հաշվի կարգավորումներից հանելով չռթիկը «Ցուցադրե՞լ համայնքի նորութությունները լրահոսումդ» կետից առաջ։"
+ stream_full_of_posts_li3: "Հրապարակային գրառումներ համայնքի ակնառու օգտատերերից։ Սրանցից կարող ես ազատվել՝ կարգավորումների էջում հանելով «Ցուցադրել համայնքի ակնառու օգտատերերի գրառումները լրահոսում» կետի թռչնանիշը։"
stream_full_of_posts_q: "Ինչո՞ւ է իմ լրահոսը լի այնպիսի մարդկանց գրառումներով, ում ես չեմ ճանաչում ու ում հետ չեմ կիսվում։"
title: "Գրառելու և գրառումների մասին"
private_posts:
@@ -491,24 +489,26 @@ hy:
who_sees_updates_a: "Քո խմբերում եղած ցանկացած ոք տեսնում է քո անձնական էջի փոփոխությունները։ "
who_sees_updates_q: "Ո՞վ է տեսնում իմ անձնական էջի թարմացումները։"
public_posts:
- can_comment_reshare_like_a: "Ցանկացած մուտք գործած Դիսապրոյաի անդամ կարող է մեկնաբանել, տարածել կամ հավանել քո հրապարակային գրառումը։"
+ can_comment_reshare_like_a: "Ցանկացած մուտք գործած դիասպորա*յի օգտատեր կարող է մեկնաբանել, տարածել կամ հավանել քո հրապարակային գրառումը։"
can_comment_reshare_like_q: "Ո՞վ կարող է մեկնաբանել, հավանել կամ տարածել իմ հրապարակային գրառումները։"
- deselect_aspect_posting_a: "Խմբեր ապանշելը ոչ մի ազդեցություն չի թողնում հրապարակային գրառումների վրա․ դրանք միևնույն է հրապարակային են և կհայտնվեն բոլոր ընկերներիդ հոսքերում։ Եթե ուզում ես միայն որոշ խմբերի համար գրառում անել, պետք է նշես այդ խմբերը գրառելու դաշտի ներքևում և գրառես միայն իրենց համար։"
- deselect_aspect_posting_q: "Ի՞նչ է տեղի ունենում, երբ ապանշում եմ որոշ խմբեր հրապարակային գրառում կատարելիս։"
- find_public_post_a: "Հրապարակային գրառումները հայտնվում են քեզ հետևող բոլոր մարդկանց հոսքերում։ Եթե ներառել ես #պիտակներ, այդ պիտակներին հետևող մարդիկ ևս կտեսնեն գրառումդ իրենց հոսքում։ Հրապարակային գրառումն ունի նաև ցանկացած մարդու տեսանելի հղում, անգամ եթե նա դիասպորա մուտք գործած չէ․ այսպիսով հրապարակային գրառումները կարող են հղվել Թուիթերից, բլոգերից և այլ տեղերից։ Հրապարակային գրառումները նաև կարող են ինդեքսավորվել որոնողական համակարգերի կողմից։"
- find_public_post_q: "Ինչպե՞ս կարող են մարդիկ գտնել իմ հրապարակային գրառումը։"
- see_comment_reshare_like_a: "Հրապարակային գրառումների մեկնաբանությունները, հավանումները կամ տարածումները ևս հրապարակային են։ Դիասպորա մուտք գործած ցանկացած մարդ, ինչպես նաև համացանցում շրջող ցանկացած մեկը կարող է տեսնել հրապարակային գրառման հետ քո «շփումը»։"
+ deselect_aspect_posting_a: "Խմբեր ապանշելը ոչ մի ազդեցություն չի թողնում հրապարակային գրառումների վրա․ դրանք միևնույն է կլինեն բաց և կհայտնվեն բոլոր կապերիդ հոսքերում։ Եթե ուզում ես կոնկրետ խմբ(եր)ի համար գրառում անել, պետք է նշես համապատասխան խմբերը գրառման տեսանելիությունը ընտրելու տեղում։"
+ deselect_aspect_posting_q: "Ի՞նչ է տեղի ունենում, երբ ապանշում եմ մեկ կամ ավելի խումբ հրապարակային գրառում կատարելիս։"
+ find_public_post_a: "Հրապարակային գրառումները հայտնվում են քեզ հետևող բոլոր մարդկանց հոսքերում։ Եթե #պիտակներ էլ ես ներառել, այդ պիտակներին հետևող մարդիկ ևս կտեսնեն գրառումդ իրենց հոսքում։ Հրապարակային գրառումն ունի նաև հատուկ հղում` տեսանելի բոլոր մարդկանց համար, անգամ եթե նրանք դիասպորա* մուտք գործած չեն․ այսպիսով, հրապարակային գրառումները կարող են հղվել Թուիթերից, բլոգերից և այլ տեղերից։ Հրապարակային գրառումները նաև կարող են ինդեքսավորվել որոնողական համակարգերի կողմից։"
+ find_public_post_q: "Ինչպե՞ս կարող են մարդիկ գտնել իմ հրապարակային գրառումները։"
+ see_comment_reshare_like_a: "Հրապարակային գրառումների մեկնաբանությունները, հավանումները կամ տարածումները ևս հրապարակային են։ դիասպորա* մուտք գործած ցանկացած օգտատեր, ինչպես նաև համացանցում շրջող ցանկացած մեկը կարող է տեսնել հրապարակային գրառման հետ քո գործողությունները։"
see_comment_reshare_like_q: "Երբ ես մեկնաբանում, տարածում կամ հավանում եմ հրապարակային գրառումը, ո՞վ կարող է դա տեսնել։"
title: "Հրապարակային գրառումների մասին"
who_sees_post_a: "Համացանցից օգտվող ցանկացած մարդ պոտենցիալ կարող է տեսնել հրապարակային գրառումը, այնպես որ զգոն եղիր հրապարակային գրառում անելուց։ ;Ճ"
- who_sees_post_q: "Երբ գրառում եմ հրապարակայնորեն, ո՞վ կարող է տեսնել։"
+ who_sees_post_q: "Երբ գրառում եմ հրապարակայնորեն, ո՞վ կարող է տեսնել դա։"
public_profiles:
- title: "Հպարակայաին էջիս մասին"
- what_do_tags_do_a: "Հիմնականում արևի տակ տաքանում են։ ։Ճ Իսկ եթե լուրջ, դրանք օգնում են մարդկանց ճանաչել քեզ, ինչպես նաև քո նկարը կհայտնվի այդ պիտակի էջում մյուս բոլոր մարդկանց հետ, ովքեր դրել են իրենց մոտ այդ պիտակը։"
- what_do_tags_do_q: "Ի՞նչ են անում իմ հրապարակային էջի պիտակները։"
- whats_in_profile_a: "Քո հրապարակային էջը քո անունն է, օգտանունը, հինգ պիտակները, որ նշել ես քեզ նկարագրելու համար և նկարդ, եթե էս դաշտերը լրացրել ես։ Դու ազատ ես ներառելու և չներառելու այս ինֆորմացիան (ինչպես նաև գրելու այստեղ ինչ ուզես֊չուզես ;Ճ). դաշտերը պարատադիր չեն։ Քո հրապարակային էջը ներառում է նաև քո հրապարակային գրառումները։"
- whats_in_profile_q: "Ի՞նչն է իմ հրապարակային էջը։"
- who_sees_profile_a: "Ցանկացած դիասպորա մուտք գործած մարդ, ինչպես նաև մնացյալ համացանցը տեսնում է դա։ Ցանկացած էջ ունի ուղիղ հղում դեպի իրեն և այդպիսով կարող է անմիջականորեն հղվել արտաքին կայքերից։ Ինչպես նաև որոնողական համակարգերը ինդեքսավորում են դա։"
+ title: "Հրապարակային էջերի մասին"
+ what_do_tags_do_a: |-
+ Հիմնականում արևի տակ տաքանում են ։Ճ
+ Իսկ եթե լուրջ, դրանք օգնում են մարդկանց ճանաչել քեզ։ Ինչպես նաև քո նկարը կհայտնվի այդ պիտակի էջում մյուս բոլոր մարդկանց հետ, ովքեր նշել են իրենց այդ պիտակով։
+ what_do_tags_do_q: "Ի՞նչ գործառույթ են կատարում իմ հրապարակային էջի պիտակները։"
+ whats_in_profile_a: "Քո հրապարակային էջը քո անունն է, օգտանունը, հինգ պիտակները, որ նշել ես քեզ նկարագրելու համար և նկարդ, եթե իհարկե լրացրել ես սրանք։ Բոլոր այս դաշտերը պարտադիր չեն․ դու ազատ ես ընտրելու՝ տրամադրել այդ տեղեկությունը, թե ոչ։ Բացի դրանից հրապարակային էջդ ներառում է նաև քո հրապարակային գրառումները։"
+ whats_in_profile_q: "Ո՞ր ինֆորմացիան է կազմում իմ հրապարակային էջը։"
+ who_sees_profile_a: "Ցանկացած դիասպորա* մուտք գործած օգտատեր, ինչպես նաև մնացյալ համացանցը կարող է տեսնել այն։ Ցանկացած էջ ունի ուղիղ հղում դեպի իրեն և այդպիսով կարող է անմիջականորեն հղվել արտաքին կայքերից։ Այն նաև կարող է ինդեքսավորվել որոնողական համակարգերի կողմից։"
who_sees_profile_q: "Ո՞վ է տեսնում իմ հրապարակային էջը։"
who_sees_updates_a: "Ցանկացած ոք կարող է տեսնել փոփոխությունները, եթե այցելի քո էջ։"
who_sees_updates_q: "Ո՞վ է տեսնում իմ հրապարակային էջի թարմացումները։"
@@ -519,39 +519,39 @@ hy:
reshare_public_post_aspects_q: "Կարո՞ղ եմ տարածել հրապարակային գրառումը ընտրված խմբերի համար։"
title: "Գրառումները տարածելու մասին"
sharing:
- add_to_aspect_a1: "Հմ, արի օրինակ նայենք հետևյալ դեպքը․ Շամիրամը ավելացրել է Արային իր խմբերում, բայց Արան (դեռ) չի ավելացրել Շամիրամին։"
+ add_to_aspect_a1: "Հմ, արի դիտարկենք նման մի դեպք՝ Շամիրամը ավելացրել է Արային իր խմբերում, բայց Արան (դեռ) չի ավելացրել Շամիրամին։"
add_to_aspect_a2: "Կիսվելու այս ձևն անհամաչափ է։ Երբ ու եթե Արան ևս ավելացնի Շամիրամին իր խմբերից մեկում, կիսվելը կդառնա փոխադարձ, ինչը ոչ միայն հաճելի է, այլ նաև օգտակար․ Արայի ու Շամիրամի հրապարակային և համապատասխան փակ գրառումները կհայտնվեն մեկը մյուսի հոսքում, Շամիրամը կտեսնի Արայի անձնական էջն ու արդեն կկարողանան իրար հաղորդագրություններ ուղարկել։"
- add_to_aspect_li1: "Արան կստանա ծանուցում, այն մասին, որ Շամիրամը «սկսեց կիսվել» իր հետ։"
+ add_to_aspect_li1: "Արան կստանա ծանուցում այն մասին, որ Շամիրամը «սկսեց կիսվել» իր հետ։"
add_to_aspect_li2: "Շամիրամը կսկսի տեսնել Արայի հրապարակային գրառումները իր հոսքում։"
add_to_aspect_li3: "Շամիրամը չի տեսնի Արայի որևէ փակ գրառում։"
add_to_aspect_li4: "Արան չի տեսնի Շամիրամի փակ կամ հրապարակային գրառումները իր հոսքում։"
add_to_aspect_li5: "Բայց եթե Արան գնա Շամիրամի էջ, ապա կտեսնի Շամիրամի այն խմբի համար կատարած գրառումները, ուր տեղակայված է Արան (ինչպես նաև Շամիրամի հրապարակային գրառումները, որ տեսանելի են բոլորին)։"
add_to_aspect_li6: "Արան կկարողանա տեսնել Շամիրամի հրապարակային էջը (պրոֆիլը՝ նրա մասին, տեղակայությունը, սեռը, ծննդյան ամսաթիվը)։"
- add_to_aspect_li7: "Շամիրամը կհայտնվի Արայի կոնտակտների էջի «Միայն ինձ հետ կիսվողները» բաժնում։"
+ add_to_aspect_li7: "Շամիրամը կհայտնվի Արայի կապերի «Ինձ հետ միակողմանի կիսվողները» բաժնում։"
add_to_aspect_li8: "Շամիրամը կկարողանա նշել Արային գրառման մեջ։"
add_to_aspect_q: "Ի՞նչ է տեղի ունենում, երբ ինչ֊որ մեկին ավելացնում եմ իմ խմբերի մեջ, կամ երբ ինչ֊որ մեկն ինձ է ավելացնում իր խմբերի մեջ։"
- list_not_sharing_a: "Ոչ, սակայն ստուգել արդյոք որևէ մեկը կիսվում է քեզ հետ, թե ոչ կարող ես այցելելով իր էջ։ Եթե նա կիսվում է,ապա կոճակը, որը ցույց է տալիս իր համար ընտրած խումբդ կլինի կանաչ, եթե ոչ, ապա՝ մոխրագույն։"
+ list_not_sharing_a: "Ոչ, սակայն ստուգել արդյոք որևէ մեկը կիսվում է քեզ հետ, թե ոչ կարող ես այցելելով իր էջ։ Եթե նա կիսվում է, ապա իր անվան կողքին կանաչ թռչնանիշ կտեսնես, իսկ եթե ոչ՝ մոխրագույն շրջանագիծ։"
list_not_sharing_q: "Կա արդյո՞ք այն մարդկանց ցուցակ, որոնց ես ավելացրել եմ իմ խմբերից որևէ մեկին, իսկ նրանք ինձ՝ ոչ։"
- only_sharing_a: "Սրանք այն մարդիկ են, ով ավելացրել է քեզ իր խմբերում, իսկ դու (դեռ) չես ավելացրել նրանց քո խմբերից որևէ մեկին։ Այլ կերպ ասած՝ նրան կիսվում են քո հետ, իսկ դու իրենց հետ չես կիսվում․ կարող ես մտածել, որ նրանք «հետևում են» քեզ(ոչ պարանոյալ իմաստով ։Դ)։ Եթե ավելացնես նրանց որևէ խմբում, կհայտնվեն էդ խմբի տակ և ոչ թե «Միայն ինձ հետ կիսվողները» բաժնում։ Տես վերևում։"
- only_sharing_q: "Ովքե՞ր են «Միայն իմ հետ կիսվողները» իմ կոնտակտների էջում։"
- see_old_posts_a: "Ոչ։ Նա միայն կկարողանա տեսնել քո հետագա գրառումները այդ խմբի համար։ Նա (և մնացած այլոք) կարող է տեսնել քո հին հրապարակային գրառումները (ինչպես քո էջում, այնպես էլ իրենց լրահոսում)։"
+ only_sharing_a: "Սրանք այն մարդիկ են, ովքեր ավելացրել են քեզ իրենց խմբերում, իսկ դու նրանց (դեռ) ոչ։ Այլ կերպ ասած՝ նրանք կիսվում են քո հետ, իսկ դու՝ ոչ․ կարելի է համարել, որ նրանք «հետևում են» քեզ (ոչ պարանոյալ իմաստով ։Դ)։ Եթե ավելացնես նրանց որևէ խումբ, կհայտնվեն այդ խմբի ցուցակում և ոչ թե «Ինձ հետ միակողմանի կիսվողները» բաժնում։ Տես վերևում։"
+ only_sharing_q: "Ովքե՞ր են «Ինձ հետ միակողմանի կիսվողները» իմ կապերի մեջ։"
+ see_old_posts_a: "Ոչ։ Նա միայն կկարողանա տեսնել քո հետագա գրառումները այդ խմբի համար։ Բայց նրան (և մնացած բոլորին) հասանելի կլինեն քո հին հրապարակային գրառումները (ինչպես քո էջում, այնպես էլ իր լրահոսում)։"
see_old_posts_q: "Երբ նոր մեկին ավելացնում եմ որևէ խումբ, կարո՞ղ է նա տեսնել իմ հին գրառումները նախատեսված այդ խմբի համար։"
- sharing_notification_a: "Դու ամենայն հավանականությամբ ծանուցում կստանաս, երբ որևէ մեկը սկսի կիսվել քո հետ։"
+ sharing_notification_a: "Դու ծանուցում ես ստանում, երբ որևէ մեկը սկսում է կիսվել քո հետ։"
sharing_notification_q: "Ինչպե՞ս իմանամ, որ ինչ֊որ մեկը սկսեց կիսվել իմ հետ։"
title: "Կիսվելու մասին"
tags:
- filter_tags_a: "Սա դեռ հասանելի չի հենց դիասպորայի միջոցով, բայց %{third_party_tools} կարող է օգնել քեզ։"
+ filter_tags_a: "Սա դեռ հասանելի չի հենց դիասպորա*յի միջոցով, բայց %{third_party_tools} կարող է օգնեն քեզ։"
filter_tags_q: "Ինչպե՞ս կարող եմ բացառել որոշ պիտակներ իմ լրահոսից։"
followed_tags_a: "Որևէ պիտակ փնտրելուց սեղմելով պիտակի էջի վերևի մասում գտնվող կոճակին՝ կարող ես հետևել դրան։ Դրանից հետո այն կհայտնվի քո հետևվող պիտակների ցուցակում։ Սեղմելով որևէ պիտակի վրա՝ կհայտնվես այդ պիտակի էջում և կտեսնես վերջին գրառումները նշված այդ պիտակով։ Սեղմիր #Հետևվող պիտակներ-ի վրա և կտեսնես բոլոր քո պիտակներով նշված գրառումների հոսք։"
- followed_tags_q: "Ի՞նչ է #Հետևվող պիտակներ-ը և ինչպե՞ս կարող եմ հետևել որևէ պիտակի։"
+ followed_tags_q: "Ի՞նչ է «#Հետևվող_պիտակներ»-ը, և ինչպե՞ս կարող եմ որևէ պիտակ հետևել։"
people_tag_page_a: "Դրանք այն մարդիկ են, ովքեր նկարագրել են իրենց այդ պիտակով։"
people_tag_page_q: "Ովքե՞ր են պիտակի էջի ձախ կողմում ցուցադրվող մարդիկ։"
- tags_in_comments_a: "Մեկնաբանության մեջ ավելացված պիտակը կլինի հղում դեպի այդ պիտակի էջ, սակայն այդ մեկնաբանությունը չի հայտնվի պիտակի էջում։ Պիտակի էջում հայտնվում են այդ պիտակով գրառումները միայն։"
+ tags_in_comments_a: "Մեկնաբանության մեջ ավելացված պիտակը կլինի հղում դեպի այդ պիտակի էջ, սակայն այդ գրառումը (կամ մեկնաբանությունը) չի հայտնվի պիտակի էջում։ Պիտակի էջում հայտնվում են միայն այդ պիտակով գրառումները։"
tags_in_comments_q: "Կարո՞ղ եմ պիտակներ ավելացնել նաև մեկնաբանությունների մեջ, թե՞ միայն գրառումներում։"
title: "Պիտակների մասին"
what_are_tags_for_a: "Պիտակները գրառումը կատեգորիաներով դասակարգելու համար են․ հիմնականում ըստ թեմայի։ Փնտրելով պիտակը՝ դու կտեսնես բոլոր քեզ հասանելի այն հրապարակային և փակ գրառումները, որոնք նշված են այդ պիտակով։ Սա հնարավորություն է տալիս մարդկանց, ովքեր հետաքրքրված են որևէ թեմայով, գտնել հրապարակային գրառումներ դրա վերաբերյալ։"
what_are_tags_for_q: "Ինչի՞ համար են պիտակները։"
- third_party_tools: "երրորդ կողմի գործիքներ"
+ third_party_tools: "երրորդ կողմի գործիքները"
title_header: "Օգնություն"
tutorial: "ուսուցանող նյութ"
tutorials: "ուսուցանող նյութերը"
@@ -571,7 +571,7 @@ hy:
no_more: "Այլևս հրավեր ուղարկելու իրավունք չունես։"
note_already_sent: "Հրավերները արդեն ուղարկվել են հետևյալ հասցեներին՝ %{emails}"
own_address: "Դու չես կարող հրավեր ուղարկել քո սեփական հասցեին։"
- rejected: "Հետևյալ էլ. հասցեների հետ կապված խնդիրներ կան՝ "
+ rejected: "Հետևյալ էլ.հասցեների հետ կապված խնդիրներ կան՝ "
sent: "Հրավերները ուղարկվեցին հետևյալ հասցեներով՝ %{emails}"
edit:
accept_your_invitation: "Ընդունի՛ր հրավերդ"
@@ -588,7 +588,7 @@ hy:
if_they_accept_info: "եթե նրանք ընդունեն, ապա կավելացվեն այն խումբ, որտեղ նրանց հրավիրել ես։"
invite_someone_to_join: "Հրավիրի՛ր որևիցե մեկին՝ միանալու դիասպորա*յին։"
language: "Լեզու"
- paste_link: "Կիսվիր այս հղումով ընկերներիդ հետ, որպեսզի հրավիրես նրանց դիասպորա*, կամ ուղարկիր այն անմիջապես նրանց էլ. հասցեներին։"
+ paste_link: "Կիսվիր այս հղումով ընկերներիդ հետ, որպեսզի հրավիրես նրանց դիասպորա*, կամ ուղարկիր այն անմիջապես նրանց էլ.հասցեներին։"
personal_message: "Անձնական հաղորդագրություն"
resend: "Կրկին ուղարկել"
send_an_invitation: "Հրավեր ուղարկել"
@@ -602,7 +602,7 @@ hy:
public_feed: "%{name}-ի` դիասպորա*յի հրապարակային հոսքը"
source_package: "Ներբեռնել սկզբնական կոդի փաթեթը"
statistics_link: "Հանգույցի վիճակագրություն"
- toggle: "Մոբայլ տարբերակը"
+ toggle: "Դյուրակիր տարբերակը"
whats_new: "Ի՞նչ կա"
your_aspects: "Քո խմբերը"
header:
@@ -633,7 +633,7 @@ hy:
limited: "Փակ"
more: "Ավելին"
next: "Հաջորդ"
- no_results: "Ոչինչ չգտնվեց ։("
+ no_results: "Ոչինչ չգտնվեց"
notifications:
also_commented:
one: "%{actors} նույնպես մեկնաբանել է %{post_author}-ի %{post_link} գրառումը։"
@@ -718,8 +718,8 @@ hy:
limited_subject: "Գրառումներիցդ մեկը նոր մեկնաբանություն ունի"
reply: "Պատասխանիր կամ տես %{name}-ի գրառումը >"
confirm_email:
- click_link: "Որպեսզի ակտիվացնես քո նոր %{unconfirmed_email} էլ. հասցեն, անցիր այս հղումով՝"
- subject: "Ակտիվացրու քո նոր %{unconfirmed_email} էլ. հասցեն"
+ click_link: "Որպեսզի ակտիվացնես քո նոր %{unconfirmed_email} էլ.հասցեն, անցիր այս հղումով՝"
+ subject: "Ակտիվացրու քո նոր %{unconfirmed_email} էլ.հասցեն"
email_sent_by_diaspora: "Այս նամակը ուղարկվել է %{pod_name}-ի կողմից։ Եթե այլևս չես ուզում ստանալ նմանատիպ նամակներ,"
export_email:
body: |-
@@ -746,7 +746,7 @@ hy:
Քո նկարները արդեն մշակվեցին ու պատրաստ են ներբեռնվելու համար ահա [այս հղմամբ](%{url})․
- Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտից։
+ Սիրով, դիասպորա*յի էլ․փոստային ժրաջան ռոբոտ։
subject: "Նկարներդ պատրաստ են ներբեռնվելու համար, %{name}"
export_photos_failure_email:
body: |-
@@ -756,7 +756,7 @@ hy:
Խնդրում եմ․ նորից փորձիր։
կներես,
- դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+ դիասպորայի էլ․փոստային ժրաջան ռոբոտ։
subject: "%{name}, նկարներիդ հետ ինչ֊որ խնդիր առաջացավ։"
hello: "Ողջու՜յն, %{name}։"
invite:
@@ -778,7 +778,7 @@ hy:
 
[1]:%{invite_url} 
[2]:%{diasporafoundation_url}
- invited_you: "%{name}-ն է հրավիրել քեզ դիասպորա*"
+ invited_you: "%{name} հրավիրել է քեզ դիասպորա*"
liked:
liked: "%{name} հավանել է քո գրառումը"
limited_post: "%{name} հավանեց փակ գրառումդ։"
@@ -816,7 +816,7 @@ hy:
Խնդրում եմ աչքի անցկացրո՛ւ հնարավորինս շուտ։
- Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+ Սիրով, դիասպորա*յի էլ․փոստային ժրաջան ռոբոտ։
[1]․ %{url}
subject: "Եվս մի %{type} նշվել է որպես վիրավորական"
@@ -852,14 +852,14 @@ hy:
is_sharing: "%{name} սկսեց կիսվել քո հետ"
results_for: " արդյունքներ %{params}-ի համար"
index:
- couldnt_find_them: "Չկարողացա՞ր նրանց գտնել։"
- looking_for: "%{tag_link} պիտակով գրառումնե՞ր ես փնտրում։"
+ couldnt_find_them: "Չգտա՞ր նրանց։"
+ looking_for: "Քեզ %{tag_link} պիտակով գրառումնե՞ր են պետք։"
no_one_found: "...և ոչ ոք չգտնվեց։"
no_results: "Հե՛յ, պետք է կոնկրետ մի բան փնտրես։"
results_for: "%{search_term} որոնմանը համապատասխանող մարդիկ"
search_handle: "Օգտագործիր նրանց դիասպորա*յի ԱյԴի-ն (username@pod.am), որ հաստատ գտնես ընկերներիդ։"
searching: "Փնտրվում է, խնդրում ենք լինել համբերատար..."
- send_invite: "Դեռ ոչի՞նչ։ Հրավեր ուղարկի՛ր։"
+ send_invite: "Ոչ մի արդյո՞ւնք։ Հրավե՛ր ուղարկիր։"
one: "1 հոգի"
other: "%{count} հոգի"
person:
@@ -919,7 +919,7 @@ hy:
size_error: "{file}-ը չափից դուրս մեծ է, առավելագույն չափն է՝ {sizeLimit}։"
new_profile_photo:
or_select_one_existing: "կամ ընտրիր արդեն գոյություն ունեցող նկարներիցդ մեկը՝ %{photos}"
- upload: "Նոր նկար վերբեռնե՜լ"
+ upload: "Նո՜րը վերբեռնել"
photo:
view_all: "Դիտել %{name}-ի բոլոր նկարները"
show:
@@ -993,8 +993,8 @@ hy:
invalid_invite: "Հրավերի հղումը, որ տվել ես, այլևս վավեր չէ։"
new:
create_my_account: "Ստեղծե՜լ իմ հաշիվը"
- email: "Էլ․փոստ"
- enter_email: "Մուտքագրիր էլ. հասցե"
+ email: "Էլ․հասցե"
+ enter_email: "Մուտքագրիր էլ.հասցեդ"
enter_password: "Մուտքագրիր գաղտնաբառ (առնվազն վեց նիշ)"
enter_password_again: "Մուտքագրիր նույն գաղտնաբառը"
enter_username: "Ընտրիր օգտանուն (միայն տառեր, թվեր և _)"
@@ -1036,7 +1036,7 @@ hy:
other: "%{count} նոր հայտ"
zero: "Ոչ մի նոր հայտ"
manage_aspect_contacts:
- existing: "Գոյություն ունեցող ընկերները"
+ existing: "Ներկա կապեր"
manage_within: "Կարգավորել կապերդ"
new_request_to_person:
sent: "Ուղարկվեց"
@@ -1075,7 +1075,7 @@ hy:
edit_services: "Փոփոխել ծառայությունները"
logged_in_as: "Համակարգում ես որպես %{nickname}։"
no_services_available: "Այս փոդի վրա ոչ մի ծառայություն հասանելի չէ կապելու համար։"
- not_logged_in: "Հիմա մուտք գործած չեք։"
+ not_logged_in: "Դեռևս չես միացրել։"
really_disconnect: "Անջատե՞լ %{service}ը։"
services_explanation: "Ծառայությունները միացնելու դեպքում դիասպորա*յի գրառումներդ այնտեղ ևս անմիջապես կհրապարակվեն։"
inviter:
@@ -1117,7 +1117,7 @@ hy:
logged_in_as: "Համակարգում ես որպես %{name}"
your_aspects: "Քո խմբերը"
invitations:
- by_email: "Էլ. հասցեով"
+ by_email: "Էլ.հասցեով"
dont_have_now: "Այլևս հրավիրելու իրավունք չունես, բայց շուտով կգան նոր հնարավորություններ։"
from_facebook: "Ֆեյսբուքից"
invitations_left: "մնաց %{count} հատ"
@@ -1125,7 +1125,7 @@ hy:
invite_your_friends: "Կանչի՛ր ընկերներիդ"
invites: "Հրավերներ"
invites_closed: "Ներկա պահին հրավերները հասանելի չեն դիասպորա*յի այս փոդում։"
- share_this: "Տարածիր այս հղումը էլ.փոստի, բլոգի կամ այլ սոցիալական ցանցերի միջոցով։"
+ share_this: "Ուղարկիր այս հղումը էլ.փոստի, բլոգի կամ այլ սոցիալական ցանցերի միջոցով։"
notification:
new: "Նոր %{type} %{from}-ից"
public_explain:
@@ -1133,20 +1133,20 @@ hy:
control_your_audience: "Վերահսկի՛ր լսարանդ"
logged_in: "Մուտք է գործված %{service}"
manage: "Կարգավորել միացված ծառայությունները"
- new_user_welcome_message: "Օգտագործիր #պիտակներ գրառումներդ դասակարգելու և հետաքրքրություններդ կիսող մարդկանց գտնելու համար։  Ներառիր մարդկանց գրառումներիդ մեջ` @Նշելով նրանց։"
+ new_user_welcome_message: "Օգտագործիր #պիտակներ գրառումներդ դասակարգելու և հետաքրքրություններդ կիսող մարդկանց գտնելու համար։  Ներառիր մարդկանց գրառումներիդ մեջ` @նշելով նրանց։"
outside: "Հրապարակային գրառումները տեսանելի կլինեն դիասպորա*յից դուրս։"
share: "Կիսվի՛ր"
title: "Կարգավորել միացված ծառայությունները"
- visibility_dropdown: "Այստեղ կարող ես քո գրառման տեսանելիությունը ընտրել։ (խորհուրդ կտանք՝ այս առաջինը հրապարակային նշես)"
+ visibility_dropdown: "Այստեղ կարող ես ընտրել քո գրառման տեսանելիությունը (խորհուրդ կտանք՝ այս առաջինը հրապարակային նշես)։"
publisher:
all: "Բոլորը"
- all_contacts: "բոլոր մարդիկ"
+ all_contacts: "Բոլոր կապերին"
discard_post: "Չեղարկել գրառումը"
formatWithMarkdown: "Կարող ես օգտագործել %{markdown_link}` գրառումդ ձևավորելու համար"
get_location: "Պարզել քո տեղակայությունը"
make_public: "Դարձնել հրապարակային"
new_user_prefill:
- hello: "Ողջու՛յն, ժողովուրդ, #%{new_user_tag}։ "
+ hello: "Ողջո՜ւյն, ժողովուրդ, #%{new_user_tag}։ "
i_like: "Իմ հետաքրքրություններն են՝ %{tags}։ "
invited_by: "Շնորհակալություն հրավերի համար, "
newhere: "ԵսՆորեկԵմ"
@@ -1168,8 +1168,8 @@ hy:
reshare:
reshare: "Տարածել"
stream_element:
- connect_to_comment: "Ընկերացիր այս օգտատիրոջ հետ, որ մեկնաբանես նրա գրառումները"
- currently_unavailable: "մեկնաբանումը այս պահին հասանելի չի"
+ connect_to_comment: "Սկսիր կիսվել այս օգտատիրոջ հետ, որ մեկնաբանես նրա գրառումները"
+ currently_unavailable: "Մեկնաբանումը այս պահին հասանելի չէ"
dislike: "Չհավանել"
hide_and_mute: "Թաքցնել և անջատել գրառումը"
ignore_user: "Արհամարհել %{name}-ին"
@@ -1179,16 +1179,16 @@ hy:
shared_with: "Կիսվել է %{aspect_names} խմբերի հետ"
show: "Ցուցադրել"
unlike: "Ապահավանել"
- via: "ըստ %{link}"
+ via: "Էստեղից` %{link}"
via_mobile: "Հեռախոսից"
viewable_to_anyone: "Այս գրառումը տեսանելի է համացանցում ամենքին"
simple_captcha:
- label: "Մուտքագրիր ծածկագիրը հատուկ դաշտում."
+ label: "Մուտքագրիր ծածկագիրը."
message:
- default: "Գաղտնի կոդը չի համապատասխանում նկարին"
- failed: "Կարող ա՞ մարդ չես։ Մարդ լինելու ստուգումը տապալվեց։ Մի հատ կստուգվես։ ;)"
- user: "Գաղտնի կոդը և նկարը տարբեր են"
- placeholder: "Ներմուծիր նկարի արժեքը"
+ default: "Ծածկագիրը չի համապատասխանում նկարին"
+ failed: "Մարդ լինելդ չհաստատվեց"
+ user: "Ծածկագիրը և նկարը տարբեր են"
+ placeholder: "Մուտքագրիր նկարի արժեքը"
statistics:
active_users_halfyear: "Կես տարում ակտիվ օգտատերեր"
active_users_monthly: "Ամսական ակտիվ օգտատերեր"
@@ -1216,8 +1216,8 @@ hy:
too_long: "Գրառումդ չպետք է գերազանցի %{count} նիշը։ Այն այժմ %{current_length} նիշից է բաղկացած։"
stream_helper:
hide_comments: "Թաքցնել բոլոր մեկնաբանությունները"
- no_more_posts: "Հասել ես լրահուսի վերջին։ Կանգ ա՛ռ մի պահ։"
- no_posts_yet: "Գրառումներ դեռ չկան"
+ no_more_posts: "Հասար լրահոսի վերջին։"
+ no_posts_yet: "Գրառումներ դեռ չկան։"
show_comments:
one: "Ցուցադրել ևս մեկ մեկնաբանություն"
other: "Ցուցադրել ևս %{count} մեկնաբանություն"
@@ -1231,7 +1231,7 @@ hy:
comment_stream:
contacts_title: "Մարդիկ, ում գրառումները դու մեկնաբանել ես"
title: "Մեկնաբանած գրառումներ"
- community_spotlight_stream: "Համայնքի նորություններ"
+ community_spotlight_stream: "Համայնքի ակնառու օգտատերեր"
followed_tag:
add_a_tag: "Պիտակ ավելացնել"
contacts_title: "Մարդիկ, ում հետաքրքիր են այս պիտակները"
@@ -1277,12 +1277,12 @@ hy:
other: "%{count} հոգի %{tag} պիտակով"
zero: "Ոչ ոք չկա %{tag} պիտակով"
terms_and_conditions: "Պայմաններ ու դրույթներ"
- undo: "Չեղարկե՞լ։"
+ undo: "Չեղարկե՞լ"
username: "Օգտանուն"
users:
confirm_email:
- email_confirmed: "%{email} էլ․ հասցեն ակտիվացված է"
- email_not_confirmed: "Էլ․ հասցեն հնարավոր չէ ակտիվացվել։ Միգուցե հղումը սխա՞լ է։"
+ email_confirmed: "%{email} էլ․հասցեն ակտիվացված է"
+ email_not_confirmed: "Էլ․հասցեն հնարավոր չէ ակտիվացվել։ Միգուցե հղումը սխա՞լ է։"
destroy:
no_password: "Հաշիվդ փակելու համար մուտքագրիր ներկայիս գաղտնաբառդ։"
success: "Քո հաշիվն արգելափակվեց։ Մոտ 20 րոպե կտևի, մինչ մենք վերջնականորեն կփակենք այն։ Շնորհակալ ենք դիասպորա*ն փորձելու համար։"
@@ -1292,7 +1292,7 @@ hy:
auto_follow_aspect: "Խումբը, որտեղ կավելացվեն վերջիններս`"
auto_follow_back: "Անմիջապես կիսվել նրանց հետ, ով սկսեց կիսվել քո հետ"
change: "Փոխել"
- change_email: "Փոխել էլ. հասցեն"
+ change_email: "Փոխել էլ.հասցեն"
change_language: "Փոխել լեզուն"
change_password: "Փոխել գաղտնաբառը"
character_minimum_expl: "առնվազն վեց նիշ"
@@ -1300,65 +1300,65 @@ hy:
dont_go: "Հեե՜յ, մի հեռացիր, այստեղ լավ է։"
if_you_want_this: "Եթե իրոք վստահ ես, ապա ստորև մուտքագրիր գաղտնաբառդ և սեղմիր «Փակել հաշիվը»"
lock_username: "Ներկայիս օգտանունդ արգելափակվելու է։ Հետագայում չես կարողանա այս փոդում նոր հաշիվ ստեղծել այդ նույն ԱյԴի-ով։"
- locked_out: "Դուք դուրս կգաք Ձեր հաշվից և այլևս երբեք չեք կարողանա մտնել։"
+ locked_out: "Մինչ մենք կջնջենք հաշիվդ այն այլևս քեզ հասանելի չի լինի։"
make_diaspora_better: "Կուզենայինք, որ մնայիր ու օգնեիր մեզ դարձնել դիասպորա*ն ավելի լավը։ Բայց եթե որոշել ես գնալ, ապա ծանոթացիր, թե ինչ կլինի դրա արդյունքում՝"
mr_wiggles: "Պրն. Փիսոն կտխրի, եթե դու գնաս"
no_turning_back: "Հետդարձի ճանապարհ չկա։ Եթե վերջնական ես որոշել, մուտքագրիր գաղտնաբառդ ներքևում։"
- what_we_delete: "Մենք հնարավորինս շուտ կջնջենք քո բոլոր գրառումներն ու անձնական տվյալները։ Ուրիշների գրառումներին թողած մեկնաբանություններդ դեռ շրջանառության մեջ կլինեն դիասպորա*յի ԱյԴի-իդ անունից։"
+ what_we_delete: "Մենք հնարավորինս շուտ կջնջենք քո բոլոր գրառումներն ու անձնական տվյալները։ Ուրիշների գրառումներին թողած մեկնաբանություններդ կմնան շրջանառության մեջ դիասպորա*յի ԱյԴի-իդ անունից։"
close_account_text: "Փակել հաշիվը"
comment_on_post: "որևէ մեկը մեկնաբանում է քո գրառո՞ւմը։"
- current_password: "Ներկայիս գաղտնաբառ"
+ current_password: "Ներկայիս գաղտնաբառդ"
current_password_expl: "որով մուտք ես գործել..."
download_export: "Ներբեռնել իմ էջը"
download_export_photos: "Ներբեռնել իմ նկարները"
download_photos: "Ներբեռնել իմ նկարները"
edit_account: "Խմբագրել հաշիվը"
- email_awaiting_confirmation: "Մենք ակտիվացման հղում ուղարկեցինք %{unconfirmed_email} էլ. հասցեին։ Բայց մինչ դու կանցնես այդ հղմամբ ու կակտիվացնես այն, մենք կշարունակենք օգտագործել քո սկզբնական՝ %{email} էլ. հասցեն։"
+ email_awaiting_confirmation: "Մենք ակտիվացման հղում ուղարկեցինք %{unconfirmed_email} էլ.հասցեին։ Բայց մինչ դու կանցնես այդ հղմամբ ու կակտիվացնես այն, մենք կշարունակենք օգտագործել քո սկզբնական՝ %{email} էլ.հասցեն։"
export_data: "Տվյալների դուրս բերում"
export_in_progress: "Էս պահին վերամշակում ենք քո տվյալները։ Մի քանի րոպեից հետ արի։"
export_photos_in_progress: "Հիմա քո նկարները մշակում ենք։ Մի քանի րոպեից հետ արի։"
following: "Կիսվելու կարգավորումներ"
- getting_started: "Նոր օգտատերի արտոնությունները"
+ getting_started: "Նորեկ օգտատերի նախընտրություններ"
last_exported_at: "(Վերջին անգամ թարմացվել է %{timestamp}֊ին)"
liked: "որևէ մեկը հավանել է քո գրառո՞ւմը։"
mentioned: "քեզ նշել են գրառման մե՞ջ։"
new_password: "Նոր գաղտնաբառ"
private_message: "նամա՞կ ես ստանում։"
- receive_email_notifications: "Ստանալ ծանուցումներ էլ. հասցեին, երբ..."
+ receive_email_notifications: "Ստանալ ծանուցումներ էլ.հասցեին, երբ..."
request_export: "Ստանալ իմ էջի տվյալները"
request_export_photos: "Ստանալ իմ նկարները"
request_export_photos_update: "Թարմացնել իմ նկարների պահեստը"
request_export_update: "Թարմացնել էջիս տվյալները"
reshared: "որևէ մեկը տարածում է քո գրառո՞ւմը։"
- show_community_spotlight: "Ցուցադրել համայնքի նորութությունները լրահոսում"
- show_getting_started: "Ցուցադրել սկզբանական օգնող հուշումները"
+ show_community_spotlight: "Ցուցադրել համայնքի ակնառու օգտատերերի գրառումները լրահոսում"
+ show_getting_started: "Ցուցադրել սկզբի օգնող հուշումները"
someone_reported: "ինչ֊որ մեկը զեկուցում է։"
started_sharing: "որևէ մեկը սկսում է կիսվե՞լ քեզ հետ։"
- stream_preferences: "Հոսքի նախընտրությունները"
- your_email: "Էլ. հասցեդ"
- your_email_private: "Էլ.փոստդ երբևէ տեսանելի չի լինի մյուսների համար"
+ stream_preferences: "Լրահոսի նախընտրությունները"
+ your_email: "Էլ.հասցեդ"
+ your_email_private: "Էլ.հասցեդ երբևէ տեսանելի չի լինի մյուսների համար"
your_handle: "Քո դիասպորա*յի ԱյԴի-ն"
getting_started:
- awesome_take_me_to_diaspora: "Զի՛լ է։ Տար ինձ դիասպորա*"
- community_welcome: "դիասպորա*յի համայնքը ուրախ է տեսնել քեզ այստեղ։"
- connect_to_facebook: "Կարող ենք ամենը մի քիչ արագացնել՝ %{link} դիասպորա*յին։ Դա կներմուծի քո անունը, նկարը և հնարավոր կդարձնի գրառելը երկու տեղում միաժամանակ (cross-posting)։"
+ awesome_take_me_to_diaspora: "Զի՛լ է, տար ինձ դիասպորա*"
+ community_welcome: "դիասպորա*յի համայնքը ուրախ է տեսնել քեզ այստեղ"
+ connect_to_facebook: "Կարելի է ամենը մի քիչ արագացնել՝ %{link} դիասպորա*յին։ Դա կներմուծի քո անունը, նկարը և հնարավոր կդարձնի գրառել երկու տեղում միաժամանակ (cross-posting)։"
connect_to_facebook_link: "միացնելով Ֆեյսբուքյան հաշիվդ"
- hashtag_explanation: "Պիտակները թույլ են տալիս խոսել քո հետաքրքրությունների մասին և հետևել դրանց։  Ինչպես նաև շատ հարմար ու հավես ձև է դիասպորա*յում նոր մարդկանց գտնելու համար։"
- hashtag_suggestions: "Փորձիր հետևել պիտակներ, ինչպիսիք են #արվեստ #կինո #gif և այլն։"
+ hashtag_explanation: "Պիտակները թույլ են տալիս խոսել քո հետաքրքրությունների մասին ու հետևել դրանց։  Ինչպես նաև շատ հարմար ու հավես միջոց են դիասպորա*յում նոր մարդկանց գտնելու համար։"
+ hashtag_suggestions: "Կարեղ ես ընտրել պիտակներ, ինչպիսիք են, օրինակ, #արվեստ #կինո #gif և այլն։"
saved: "Պահված է"
- well_hello_there: "Դե ինչ, ողջու՜յն։"
- what_are_you_in_to: "Ինչո՞վ ես հետաքրքրված։"
- who_are_you: "Ո՞վ ես դու։"
+ well_hello_there: "Դե ինչ, ողջո՜ւյն"
+ what_are_you_in_to: "Ինչո՞վ ես հետաքրքրված"
+ who_are_you: "Ո՞վ ես դու"
privacy_settings:
ignored_users: "Արհամարհված օգտատերեր"
- no_user_ignored_message: "Հիմա էլ ոչ մեկին չես արհամարհում"
+ no_user_ignored_message: "Դեռևս ոչ մեկի չես արհամարհում։"
stop_ignoring: "դադարել արհամարհել"
strip_exif: "Հեռացնել վերբեռնված նկարներից մետադատան, ինչպես օրինակ՝ տեղակայությունը, հեղինակին, տեսախցիկի մոդելը (խորհուրդ է տրվում)"
title: "Գաղտնիության կարգավորումներ"
public:
does_not_exist: "%{username} օգտատերը գոյություն չունի։"
update:
- email_notifications_changed: "Էլ․ հասցեի ծանուցումները փոխված են"
+ email_notifications_changed: "Էլ․հասցեին ծանուցումները փոխված են"
follow_settings_changed: "Հետևելու կարգավորումները փոխված են"
follow_settings_not_changed: "Հետևելու կարգավորումների փոփոխումը ձախողվեց"
language_changed: "Լեզուն փոխված է"
@@ -1367,8 +1367,8 @@ hy:
password_not_changed: "Գաղտնաբառի փոփոխումը ձախողվեց"
settings_not_updated: "Կարգավորումների թարմացումը ձախոխվեց"
settings_updated: "Կարգավորումները թարմացվեցին"
- unconfirmed_email_changed: "Էլ. հասցեն փոխված է և ակտիվացնելու կարիք ունի"
- unconfirmed_email_not_changed: "Էլ. հասցեի փոփոխումը ձախողվեց"
+ unconfirmed_email_changed: "Էլ.հասցեն փոխված է և ակտիվացնելու կարիք ունի"
+ unconfirmed_email_not_changed: "Էլ.հասցեի փոփոխումը ձախողվեց"
webfinger:
fetch_failed: "չստացվեց ստանալ(fetch) webfinger profile֊ը %{profile_url}ի համար։"
hcard_fetch_failed: "%{account} հաշվի hcard֊ը միացնելիս(fetching) խնդիրներ առաջացան"
diff --git a/config/locales/diaspora/ia.yml b/config/locales/diaspora/ia.yml
index c7ec19b64..f4eeaa507 100644
--- a/config/locales/diaspora/ia.yml
+++ b/config/locales/diaspora/ia.yml
@@ -53,15 +53,12 @@ ia:
taken: "es jam in uso."
admins:
admin_bar:
- correlations: "Correlationes"
pages: "Paginas"
pod_stats: "Statisticas de pod"
report: "Reportos"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Recerca de usatores"
weekly_user_stats: "Statisticas septimanal de usatores"
- correlations:
- correlations_count: "Correlationes con le numero de aperturas de session:"
stats:
2weeks: "2 Septimana"
50_most: "Le 50 etiquettas le plus popular"
diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml
index 122d9708a..c9b1202d7 100644
--- a/config/locales/diaspora/it.yml
+++ b/config/locales/diaspora/it.yml
@@ -43,14 +43,11 @@ it:
taken: "è già stato preso."
admins:
admin_bar:
- correlations: "Correlazioni"
pages: "Pagine"
pod_stats: "Statistiche pod"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Cerca utente"
weekly_user_stats: "Statistiche settimanali utenti"
- correlations:
- correlations_count: "Correlazioni con il numero di login"
stats:
2weeks: "2 settimane"
50_most: "I 50 tag più popolari"
diff --git a/config/locales/diaspora/ko.yml b/config/locales/diaspora/ko.yml
index 31bb30403..5877399de 100644
--- a/config/locales/diaspora/ko.yml
+++ b/config/locales/diaspora/ko.yml
@@ -43,15 +43,12 @@ ko:
taken: ": 이미 쓰이고 있습니다."
admins:
admin_bar:
- correlations: "상관 관계"
pages: "페이지"
pod_stats: "팟 통계"
report: "보고서"
sidekiq_monitor: "사이드킥 모니터"
user_search: "사용자 찾기"
weekly_user_stats: "주간 사용자 통계"
- correlations:
- correlations_count: "로그인 횟수와의 상관 관계"
stats:
2weeks: "두 주"
50_most: "가장 인기있는 태그 50개"
diff --git a/config/locales/diaspora/ml.yml b/config/locales/diaspora/ml.yml
index 1cf9576a9..4109bc27f 100644
--- a/config/locales/diaspora/ml.yml
+++ b/config/locales/diaspora/ml.yml
@@ -43,14 +43,11 @@ ml:
taken: "മുൻപേ ഉപയോഗത്തിലുണ്ട്."
admins:
admin_bar:
- correlations: "പരസ്പരബന്ധം"
pages: "താളുകൾ"
pod_stats: "പോഡിന്റെ അവസ്ഥ"
sidekiq_monitor: "സൈഡ്കിക്ക് നിരീക്ഷകൻ"
user_search: "ഉപയോക്താക്കളെ തിരയുക"
weekly_user_stats: "ആഴ്ചതോറുമുള്ള അവസ്ഥ"
- correlations:
- correlations_count: "സൈൻ ഇൻ എണ്ണവുമായുള്ള പരസ്പരബന്ധം"
stats:
2weeks: "2 ആഴ്ച"
50_most: "ഏറ്റവും പ്രശസ്തമായ 50 ടാഗുകൾ"
diff --git a/config/locales/diaspora/nb.yml b/config/locales/diaspora/nb.yml
index 6f8aed0de..82897bd0e 100644
--- a/config/locales/diaspora/nb.yml
+++ b/config/locales/diaspora/nb.yml
@@ -10,8 +10,9 @@ nb:
_contacts: "Kontakter"
_help: "Hjelp"
_home: "Hjem"
- _photos: "bilder"
+ _photos: "Bilder"
_services: "Tjenester"
+ _statistics: "Statistikk"
_terms: "bruksvilkår"
account: "Konto"
activerecord:
@@ -40,7 +41,7 @@ nb:
reshare:
attributes:
root_guid:
- taken: "You've already reshared that post!"
+ taken: "Så sykt bra, altså? Du har allerede delt dette innlegget!"
user:
attributes:
email:
@@ -52,23 +53,20 @@ nb:
taken: "er allerede tatt."
admins:
admin_bar:
- correlations: "Korrellert med"
pages: "Sider"
- pod_stats: "Pod statistikk"
+ pod_stats: "Serverstatistikk"
report: "Rapporter"
sidekiq_monitor: "Sidekiq overvåke"
user_search: "Brukersøk"
weekly_user_stats: "Ukentlig brukerstatistikk"
- correlations:
- correlations_count: "Korrellasjoner med pålogget antall"
stats:
2weeks: "To uker"
- 50_most: "50 mest populære tag'er"
+ 50_most: "50 mest populære tagger"
comments:
one: "%{count} kommentarer"
other: "%{count} kommentarer"
zero: "%{count} kommentarer"
- current_segment: "Dette segmentet er et snitt av <b>%{post_yest}</b> posteringer per bruker, fra og med <b>%{post_day}</b>"
+ current_segment: "Dette segmentet er et snitt av <b>%{post_yest}</b> innlegg per bruker, fra og med <b>%{post_day}</b>"
daily: "Daglig"
display_results: "Viser resultatene fra det <b>%{segment}</b> segmentet"
go: "fortsett"
@@ -103,8 +101,12 @@ nb:
: ja
user_search:
account_closing_scheduled: "Kontoen %{name} blir avsluttet. Dette vil bli gjennomført innen noen strakser...."
+ account_locking_scheduled: "%{name} sin konto er satt til å bli låst. Den vil bli behandlet om et par øyeblikk ..."
+ account_unlocking_scheduled: "%{name} sin konto er satt til å bli låst opp. Den vil bli behandlet om et par øyeblikk ..."
add_invites: "legg til invitasjoner"
are_you_sure: "Er du sikker på at du vil avslutte denne kontoen?"
+ are_you_sure_lock_account: "Er du sikker på at du vil låse denne kontoen?"
+ are_you_sure_unlock_account: "Er du sikker på at du vil låse opp denne kontoen?"
close_account: "Avslutt konto"
email_to: "E-post for invitasjon"
under_13: "Vis deltakere under 13 (COPPA)"
@@ -124,14 +126,14 @@ nb:
zero: "Antall nye brukere denne uken: ingen"
current_server: "Dagens server-dato er %{date}"
ago: "%{time} siden"
- all_aspects: "Alle Aspekter"
+ all_aspects: "Alle aspekter"
application:
helper:
unknown_person: "ukjent person"
video_title:
unknown: "Ukjent Videotittel"
are_you_sure: "Er du sikker?"
- are_you_sure_delete_account: "Er du sikker på at du vil avslutte eller lukke din konto? Dette kan ikke angres!"
+ are_you_sure_delete_account: "Er du sikker på at du vil stenge kontoen din? Dette kan ikke gjøres om på!"
aspect_memberships:
destroy:
failure: "Kunne ikke fjerne person fra aspekt"
@@ -149,7 +151,7 @@ nb:
aspect_stream:
make_something: "Lag noe"
stay_updated: "Hold deg oppdatert"
- stay_updated_explanation: "Din hoved-stream viser alle kontaktene dine, tags du følger, og innlegg fra noen kreative medlemmer i felleskapet."
+ stay_updated_explanation: "Din hovedstrøm viser alle kontaktene dine, tagger som du følger og innlegg fra noen kreative medlemmer i felleskapet."
contacts_not_visible: "Kontakter i dette aspektet vil ikke kunne se hverandre."
contacts_visible: "Kontakter i dette aspektet vil kunne se hverandre."
create:
@@ -158,10 +160,14 @@ nb:
destroy:
failure: "%{Name} er ikke tom, og kunne ikke fjernes."
success: "%{name} har blitt fjerna."
+ success_auto_follow_back: "%{name} er fjernet. Du brukte dette aspektet for å automatisk følge folk som begynte å følge deg. Sjekk brukerinnstillingene dine for å velge et nytt aspekt til å automatisk følge folk som begynner å følge deg."
edit:
+ aspect_chat_is_enabled: "Kontakter i dette aspektet har mulighet til å chatte med deg."
+ aspect_chat_is_not_enabled: "Kontakter i dette aspektet har ikke mulighet til å chatte med deg."
aspect_list_is_not_visible: "Kontakter i dette aspektet kan ikke se hverandre."
aspect_list_is_visible: "Kontakter i dette aspektet er i stand til å se hverandre."
confirm_remove_aspect: "Er du sikker på at du vil slette dette aspektet?"
+ grant_contacts_chat_privilege: "Gi kontakter i dette aspektet chatprivilegier"
make_aspect_list_visible: "gjør aspektlisten synlig?"
remove_aspect: "Slett dette aspektet"
rename: "endre navn"
@@ -170,11 +176,11 @@ nb:
updating: "oppdaterer"
index:
diaspora_id:
- content_1: "diaspora* ID'en din er:"
+ content_1: "diaspora*-ID-en din er:"
content_2: "Gi det til noen, og de vil kunne finne deg på diaspora*."
- heading: "diaspora* ID"
+ heading: "diaspora*-ID"
donate: "Doner"
- handle_explanation: "Dette er din diaspora* ID. Det fungerer som en e-post adresse, du kan gi denne ID'en til venner som vil kontakte deg."
+ handle_explanation: "Dette er din diaspora*-ID. Som e-postadresser, kan du gi denne til folk for at de skal nå deg."
help:
any_problem: "Noen problemer?"
contact_podmin: "Kontakt administratoren til din \"pod\"!"
@@ -192,29 +198,29 @@ nb:
tag_question: "#question"
tutorial_link_text: "Veiledninger"
tutorials_and_wiki: "%{faq}, %{tutorial} og %{wiki}: Hjelp for dine første skritt"
- introduce_yourself: "Dette er stream-en din. Hopp inn og presenter deg selv."
+ introduce_yourself: "Dette er strømmen din. Hopp inn og presenter deg selv."
keep_diaspora_running: "Bidra til kontinuerlig utvikling av diaspora* ved å gi en månedlig donasjon!"
keep_pod_running: "Sørg for at %{pod} går kjapt ved å kjøpe kaffe-fiks til dem med en månedlig donasjon!"
new_here:
- follow: "Følg denne %{link} og ønsk nye brukere velkommen til diaspora*!"
+ follow: "Følg %{link} og ønsk nye brukere velkommen til diaspora*!"
learn_more: "Lær mer"
title: "Ønsk nye brukere velkommen"
no_contacts: "Ingen kontakter"
no_tags: "No tags"
people_sharing_with_you: "Folk som deler med deg"
- post_a_message: "legg ut en melding >>"
+ post_a_message: "Publiser en melding >>"
services:
content: "Du kan koble følgende tjenester til diaspora*:"
heading: "Koble til tjenester"
unfollow_tag: "Slutt å følge #%{tag}"
- welcome_to_diaspora: "Velkommen til Diaspora, %{name}!"
+ welcome_to_diaspora: "Velkommen til diaspora*, %{name}!"
new:
create: "Opprett"
name: "Navn (bare synlig for deg)"
no_contacts_message:
community_spotlight: "kreative medlemmer"
or_spotlight: "Eller du kan dele med denne %{link}"
- try_adding_some_more_contacts: "Du kan søke (øverst) eller invitere (høyre) flere kontakter."
+ try_adding_some_more_contacts: "Du kan søke etter eller invitere flere kontakter."
you_should_add_some_more_contacts: "Du bør legge til flere kontakter."
no_posts_message:
start_talking: "Ingen har sagt noe enda!"
@@ -233,14 +239,14 @@ nb:
blocks:
create:
failure: "Jeg klarte ikke å ignorere den brukeren. #evasion"
- success: "Javel, du kommer ikke til å se denne brukeren i din innholds-stream i fremtiden. #silencio!"
+ success: "Den er god, da vil du ikke se denne brukeren i strømmen din lenger. #silencio!"
destroy:
failure: "Jeg klarte ikke å slutte å ignorere den brukeren. #evasion"
success: "La oss se hva de har å si! #sihallo"
bookmarklet:
- explanation: "Post til diaspora* fra hvor som helst ved å bokmerke denne linken => %{link}"
+ explanation: "Publiser til diaspora* fra hvor som helst ved å bokmerke denne lenken => %{link}"
heading: "Diaspora Bookmarklet"
- post_something: "Post noe på diaspora*"
+ post_something: "Publiser noe på diaspora*"
post_success: "Postet! Lukker!"
cancel: "Avbryt"
comments:
@@ -255,15 +261,19 @@ nb:
failure: "Kunne ikke opprette kontakt"
index:
add_a_new_aspect: "Legg til nytt aspekt"
+ add_contact: "Legg til kontakt"
add_to_aspect: "Legg kontakter til %{name}"
all_contacts: "Alle Kontakter"
community_spotlight: "Fremhevet av Fellesskapet"
- my_contacts: "Mine Kontakter"
+ my_contacts: "Mine kontakter"
no_contacts: "Ingen kontakter."
+ no_contacts_in_aspect: "Du har ikke noen kontakter i dette aspektet ennå. Under er en liste over eksisterende kontakter som du kan legge til i dette aspektet."
no_contacts_message: "Sjekk ut %{community_spotlight}"
only_sharing_with_me: "Deler bare med meg "
- start_a_conversation: "Start en samtale"
+ remove_contact: "Fjern kontakt"
+ start_a_conversation: "Start en samtale "
title: "Kontakter"
+ user_search: "Søk etter kontakt"
your_contacts: "Dine kontakter"
one: "1 kontakt"
other: "%{count} kontakter"
@@ -280,6 +290,9 @@ nb:
fail: "Ugyldig melding"
no_contact: "Heisann, du må legge til kontakten først."
sent: "Melding sendt"
+ destroy:
+ delete_success: "Samtalen ble slettet suksessfullt"
+ hide_success: "Samtalen ble gjemt suksessfullt"
helper:
new_messages:
few: "%{count} nye meldinger"
@@ -300,11 +313,13 @@ nb:
send: "Send"
sending: "Sender ..."
subject: "emne"
+ subject_default: "Intet emne"
to: "til"
new_conversation:
fail: "Ugyldig melding"
show:
delete: "slett og blokkér samtalen"
+ hide: "Gjem og demp samtale"
reply: "svar"
replying: "Svarer ..."
date:
@@ -322,7 +337,7 @@ nb:
post_not_public: "Innholdet som du forsøker å titte på er ikke alment tilgjengelig!"
post_not_public_or_not_exist: "Innlegget du prøver å vise er ikke offentlig, eller eksisterer ikke!"
fill_me_out: "Fortell meg"
- find_people: "Finn folk eller #knagger"
+ find_people: "Finn folk eller #tagger"
help:
account_and_data_management:
close_account_a: "Gå til bunnen av instillings-siden din og klikk Slett bruker-knappen."
@@ -345,7 +360,7 @@ nb:
contacts_visible_q: "Hva betyr «knytter kontakter i dette aspektet synlig for hverandre»?"
delete_aspect_a: "I listen din over aspekter til venstre i hovedsiden, hold musepekeren på aspektet du ønsker å slette. Klikk den lille «rediger»-blyanten som vises til høyre. Klikk sletteknappen i boksen som kommer frem."
delete_aspect_q: "Hvordan sletter jeg et aspekt?"
- person_multiple_aspects_a: "Ja. Gå til din side for kontakter og klikk på Mine kontakter. For hver av kontaktene kan du bruke menyen til høyre for å legge dem til (eller fjerne dem fra) så mange aspekter du ønsker. Eller du kan legge dem til et nytt aspekt (eller fjerne dem fra et aspekt) ved å klikke på knappen for aspektvalg på deres profilside. Eller du kan også bare bevege musepekeren over navnet deres der du ser det i stream-en, og et «hover-card» vil da vise seg. Der kan du endre aspektene de er i."
+ person_multiple_aspects_a: "Ja. Gå til kontaktsiden din og klikk på «Mine kontakter». For hver av kontaktene kan du bruke menyen til høyre for å legge dem til (eller fjerne dem fra) så mange aspekter du ønsker. Eller du kan legge dem til et nytt aspekt (eller fjerne dem fra et aspekt) ved å klikke på knappen for aspektvalg på deres profilside. Eller du kan bare bevege musepekeren over navnet deres der du ser det i strømmen, og et «hovercard» vil vise seg. Der kan du endre aspektene de er i."
person_multiple_aspects_q: "Kan jeg legge til en person til flere aspekter?"
post_multiple_aspects_a: "Ja. Når du lager en post, bruk knappen for aspektvalg for å velge eller fjerne aspekter. Din post vil være synlig for alle aspektene du velger. Du kunne også velge aspektene du ønsker å poste til i sidebar-en. Når du poster vil aspektet/aspektene du har valgt i listen til venstre automatisk bli valgt i aspektvelgeren når du begynner å lage en ny post."
post_multiple_aspects_q: "Kan jeg legge inn innhold til flere aspekter på en gang?"
@@ -353,15 +368,22 @@ nb:
remove_notification_q: "Hvis jeg fjerner noen fra et aspekt, eller alle mine aspekter, får de beskjed om dette?"
rename_aspect_a: "Ja. I listen din over aspekter til venstre i hovedsiden, hold musepekeren på det aspektet du ønsker å omdøpe. Klikk den lille «rediger»-blyanten som vises til høyre. Klikk «endre navn» i boksen som kommer frem."
rename_aspect_q: "Kan jeg gi nytt navn til et aspekt?"
- restrict_posts_i_see_a: "Ja. Klikk på Mine Aspekter i sidelinjen, og så klikk individuelle innlegg i listen for å velge dem. Du vil bare se innlegg fra personer i de valgte aspektene i stream-en din."
+ restrict_posts_i_see_a: "Ja, klikk på «Mine aspekter» i sidefeltet og deretter på individuelle innlegg i listen for å velge dem. Da vil du kun se innlegg fra personer i de valgte aspektene i strømmen din."
restrict_posts_i_see_q: "Kan jeg begrense postene jeg ser til bare dem fra noen aspekter?"
title: "Aspektene"
what_is_an_aspect_a: "Aspekter er måten du grupperer kontaktene dine på diaspora*. Et aspekt er en av ansiktene du viser til verden. Det kan være hvem du er på jobben, hvem du er for familien din, eller hvem du er for vennene dine i en klubb du er medlem av."
what_is_an_aspect_q: "Hva er en aspekt?"
who_sees_post_a: "Hvis du lager et begrenset innlegg vil det bare være synlig for de du har lagt inn i aspektet (eller disse aspektene, hvis det gjøres synlig for flere aspekter). Kontakter du har som ikke er i aspektet har ingen mulighet for å se innlegget med mindre du publiserte det som offentlig. Personene du ikke har plassert i et aspekt vil bare kunne se dine offentlige innlegg."
who_sees_post_q: "Hvem ser hva jeg publiserer til et aspekt?"
+ chat:
+ add_contact_roster_a: "Først må du slå på chat for noen av aspektene som den personen er med i. For å gjøre det, må du gå til %{contacts_page}, velge det aspektet og klikke på chatikonet for å slå på chat for dette aspektet. %{toggle_privilege} Du kan, hvis du foretrekker, lage et eget aspekt med navn \"Chat\" og legge til de du ønsker å chatte med i dette aspektet. Når du har gjort dette, åpner du chatgrensesnittet og velger personen du ønsker å chatte med."
+ add_contact_roster_q: "Hvordan chatter jeg med noen i diaspora*?"
+ contacts_page: "kontaktside"
+ title: "Chat"
+ faq: "FAQ"
foundation_website: "diaspora-stiftelsens nettside"
getting_help:
+ get_support_a_faq: "Les vår %{faq} på wiki"
get_support_a_hashtag: "spør i en offentlig post på diaspora* med %{question}-hashtaggen"
get_support_a_irc: "bli med oss på %{irc} (live-chat)"
get_support_a_tutorials: "sjekk våre %{tutorials}"
@@ -379,7 +401,11 @@ nb:
keyboard_shortcuts_li1: "j - gå til neste post"
keyboard_shortcuts_li2: "k - gå til forrige post"
keyboard_shortcuts_li3: "c - kommentar på gjeldene post"
- keyboard_shortcuts_li4: "l - 'lik' gjeldene post"
+ keyboard_shortcuts_li4: "l - 'Lik' det gjeldene innlegget"
+ keyboard_shortcuts_li5: "r - Repeter det aktuelle innlegget"
+ keyboard_shortcuts_li6: "m - Utvid det aktuelle innlegget"
+ keyboard_shortcuts_li7: "o - Åpne den første lenken i det aktuelle innlegget"
+ keyboard_shortcuts_li8: "Ctrl+Enter - Send meldingen du skriver"
keyboard_shortcuts_q: "Hvilke tastatursnarveier er mulig?"
title: "Tastatursnarveier"
markdown: "Markdown"
@@ -398,8 +424,8 @@ nb:
back_to_top_q: "Fins der en rask måte å gå tilbake til toppen av siden etter at jeg har bladd meg nedover?"
diaspora_app_a: "Der er mange Android-apper i sine veldig tidlige utviklingsforløp. Mange er prosjekter som har vært forlatt for lenge siden, og som derfor ikke fungerer godt med dagens versjon av diaspora*. Ikke forvent mye av disse appene for øyeblikket. Den beste måten å få tilgang til diaspora* via et mobilt apparat er for tiden ved å gå via en nettleser, for vi har designet en mobilversjon av nettstedet, som skulle fungere godt på alle apparater. Der fins for tiden ingen app for iOS. Igjen, diaspora* skulle fungere godt via din nettleser."
diaspora_app_q: "Finnes en diaspora* app for Android eller iOS?"
- photo_albums_a: "Nei, ikke for tiden. Imidlertid kan du se en stream av deres opplastete bilder fra Photos-seksjonen i sidebar-en på profilsiden deres."
- photo_albums_q: "Finnes det foto eller video albumene?"
+ photo_albums_a: "Nei, ikke for tiden. Derimot kan du se en persons opplastete bilder under Bilder-seksjonen på profilsiden deres."
+ photo_albums_q: "Finnes det foto- eller videoalbumer?"
subscribe_feed_a: "Ja, men dette er fremdeles ikke en helt finpusset funksjon, og formateringen av resultatet er fremdeles temmelig røff. Hvis du likevel ønsker å prøve den, gå til noen profilside og klikk på feed-knappen i din nettleser, eller du kan kopiere profilens URL (dvs. https://joindiaspora.com/people/somenumber), og lime inn i en feed-leser. Den resulterende feed-adressen ser sånn ut: https://joindiaspora.com/public/username.atom diaspora* bruker Atom fremfor RSS."
subscribe_feed_q: "Kan jeg abonnere på noens offentlige innlegg med en feed-leser?"
title: "Diverse"
@@ -410,7 +436,7 @@ nb:
use_search_box_a: "Hvis du kjenner deres fulle diaspora* ID (f.eks. brukernavn@podnavn.org), kan du finne dem ved å søke etter den. Hvis du er på samme pod kan du søke etter bare brukernavnet deres. Et alternativ er å søke etter dem på deres profilnavn (navnet du ser på skjermen). Hvis et søk ikke virker første gangen, prøv det igjen."
use_search_box_q: "Hvordan bruker jeg søkeboksen for å finne bestemte personer?"
what_is_a_pod_a: "En pod er en server som kjører diaspora*-programvaren og som er tilknyttet diaspora*-nettverket. «Pod» er et metafor som på engelsk refererer til en del av planter, som inneholder frø, på den måten at en server inneholder et antall brukerkontoer. Der er mange forskjellige pod-er. Du kan legge til venner fra andre pod-er, og kommunisere med dem. (Du kan tenke på en diaspora*-pod som noe lignende en eposttilbyder: der fins offentlige pod-er, private pod-er, og med litt anstrengelse kan du til og med drive din egen)."
- what_is_a_pod_q: "Hva er en pod?"
+ what_is_a_pod_q: "Hva er en podd?"
posts_and_posting:
char_limit_services_a: "I det tilfellet er posten din begrenset til det laveste antallet tegn (140 når det gjelder Twitter, 1000 når det gjelder Tumblr), og antallet tegn du har igjen å bruke vises når den aktuelle tjenestens ikon markeres. Du kan fremdeles poste til disse tjenestene selv om posten din er lenger enn deres grense, men teksten blir avkortet på de tjenestene."
char_limit_services_q: "Hva er tegngrensen for poster delt gjennom en tilkoblet tjeneste med et lavere tegnantall?"
@@ -429,13 +455,21 @@ nb:
insert_images_comments_a2: "kan brukes til å sette inn bilder fra nettet inn kommentarer og innlegg."
insert_images_comments_q: "Kan jeg sett inn bilder i kommentarer?"
insert_images_q: "Hvordan setter jeg inn bilder til innlegg?"
- size_of_images_a: "Nei. Bildedimensjonene justeres automatisk for å passe i stream-en. Markdown har ikke en kode for å spesifisere dimensjonene til et bilde."
+ post_location_a: "Klikk på knappenålsikonet ved siden av kameraet der du legger til bilder. Dette vil legge til plassering fra OpenStreetMap. Du kan selv endre plasseringen - det kan være at du kun ønsker å inkludere byen du er i heller enn den eksakte adressen."
+ post_location_q: "Hvordan legger jeg lokasjonen min til i et innlegg?"
+ post_notification_a: "Det finnes et bjelleikon ved siden av X-en i innleggets øvre, høyre hjørne. Klikk på dette for å slå av og på varslinger for innlegget."
+ post_notification_q: "Hvordan slår jeg på, eller av, varslinger for et innlegg?"
+ post_poll_a: "Klikk på graf-ikonet for å lage en spørreundersøkelse. Skriv inn spørsmålet og minst to svar. Ikke glem å gjøre innlegget offentlig hvis du vil at ale skal kunne delta i spørreundersøkelsen din."
+ post_poll_q: "Hvordan legger jeg en spørreundersøkelse til innlegget mitt?"
+ post_report_a: "Klikk på varselstrekanten i det øvre, høyre hjørnet til innlegget som du ønsker å rapportere til din podmin. Oppgi en grunn til at du rapporterer dette innlegget i dialogboksen."
+ post_report_q: "Hvordan rapporterer jeg et støtende innlegg?"
+ size_of_images_a: "Nei. Bildedimensjonene justeres automatisk for å passe i strømmen. Markdown har ikke en kode for å spesifisere dimensjonene til et bilde."
size_of_images_q: "Kan jeg tilpasse størrelsen på bilder i innlegg eller kommentarer?"
- stream_full_of_posts_a1: "Din stream består av tre typer innlegg:"
+ stream_full_of_posts_a1: "Din strøm består av tre typer innlegg:"
stream_full_of_posts_li1: "Poster av folk du deler med, som kommer i to varianter: offentlige poster og begrensete poster delte med et aspekt som du er med i. For å fjerne disse postene, helt enkelt avslutt å dele med personen."
stream_full_of_posts_li2: "Offentlige poster som inneholder en av tag-ene du følger. For å fjerne disse, slutt å følge tag-en."
- stream_full_of_posts_li3: "Offentlige poster av folk oppført i sosiale rampelys. Disse kan fjernes ved å fjerne avhukingen for «Vis sosiale rampelys i strømmen?»-alternativet i Konto-arkfanen i dine Innstillinger."
- stream_full_of_posts_q: "Hvorfor er stream-en min full av poster fra folk jeg ikke kjenner og ikke deler med?"
+ stream_full_of_posts_li3: "Offentlige poster av folk oppført i sosiale rampelys. Disse kan fjernes ved å fjerne avhukingen for «Vis sosiale rampelys i strømmen?»-alternativet i Konto-arkfanen i dine innstillinger."
+ stream_full_of_posts_q: "Hvorfor er strømmen min full av innlegg fra folk jeg ikke kjenner og ikke deler med?"
title: "Innlegg og lagring"
private_posts:
can_comment_a: "Kun innloggete diaspora*-brukere du har plassert i det aspektet kan kommentere på eller like dine private poster."
@@ -458,9 +492,9 @@ nb:
public_posts:
can_comment_reshare_like_a: "Enhver innloggede diaspora* bruker kan kommentere, videredele, eller liker din offentlige innlegg."
can_comment_reshare_like_q: "Hvem kan kommentere, videredele, eller liker min offentlige innlegg?"
- deselect_aspect_posting_a: "Å fjerne valg av aspekter påvirker ikke en offentlig post. Den vil fremdeles vises i stream-en til alle dine kontakter. For å gjøre en post synlig kun for spesifikke aspekter, må du velge de aspektene fra knappen under publisereren."
+ deselect_aspect_posting_a: "Å fjerne aspekter fra et offentlig innlegg har ingen effekt. Det vil fremdeles dukke opp i strømmene til alle kontaktene dine. Hvis et innlegg kun skal være synlig for noen aspekter, må du velge disse aspektene fra knappen i publiseringsfeltet."
deselect_aspect_posting_q: "Hva skjer når jeg fjerner markeringen ett eller flere aspekter når jeg gjør en offentlig innlegg?"
- find_public_post_a: "Dine offentlige poster vil vises i stream-ene til hvem som helst som følger deg. Hvis du inkluderer #tag-er i din offentlige post vil hvem som helst som følger de tag-ene finne din post i sine stream-er. Hver offentlige post har også en spesifikk URL som hvem som helst kan se, til og med om de ikke er logget inn – dermed kan offentlige poster linkes til direkte fra Twitter, blogger, osv. Offentlige poster kan også indekseres av søkemotorer."
+ find_public_post_a: "Dine offentlige innlegg vil dukke opp i strømmene til de som følger deg. Hvis du inkluderer #tagger i offentlige innlegg, vil alle som følger disse taggene se innleggene dine i strømmene sine. Hvert offentlige innlegg har også en spesifikk URL som hvem som helst kan se, til og med om de ikke er logget inn. Dermed kan offentlige innlegg lenkes til direkte fra Twitter, blogger og så videre. Offentlige innlegg kan også indekseres av søkemotorer."
find_public_post_q: "Hvordan kan andre mennesker finne offentlige innlegg min?"
see_comment_reshare_like_a: "En hvilken som helst innlogget diaspora*-bruker og hvem som helst på internett. Kommentarer, likere, og videredelinger av offentlige poster er også offentlige."
see_comment_reshare_like_q: "Når jeg kommentere, videredele, eller liker en offentlig innlegg, som kan se det?"
@@ -485,26 +519,29 @@ nb:
title: "Videredeler innlegg"
sharing:
add_to_aspect_a1: "Jørgen"
- add_to_aspect_a2: "Dette er kjent som asymmetrisk deling. Hvis og når Jørgen også legger Anne til et aspekt ville det bli gjensidig deling, med både Anne og Jørgen sine offentlige poster og relevante private poster vist i hverandres stream-er, osv. "
+ add_to_aspect_a2: "Dette er kjent som asymmetrisk deling. Hvis og når Jørgen også legger Anne til et aspekt, ville det bli gjensidig deling. Da ville både Annes og Jørgens offentlige innlegg og relevante private innlegg bli vist i hverandres strømmer. Anne ville kunne se Jørgens private profil, og de ville kunne sende private meldinger til hverandre."
add_to_aspect_li1: "Jørgen vil motta en varsling om at Amy har «startet deling» med Jørgen."
- add_to_aspect_li2: "Anne vil begynne å se Jørgen offentlige innlegg i strømmen sin."
+ add_to_aspect_li2: "Anne vil begynne å se Jørgens offentlige innlegg i strømmen sin."
add_to_aspect_li3: "Anne skal ikke se noen av Jørgens private innlegg."
- add_to_aspect_li4: "Jørgen vil ikke se Amy offentlige eller private innlegg i stream-en sin."
+ add_to_aspect_li4: "Jørgen vil ikke se Amys offentlige eller private innlegg i strømmen sin."
add_to_aspect_li5: "Jørgen"
add_to_aspect_li6: "Jørgen"
add_to_aspect_li7: "Anne vil vises under «Deler bare med meg» på Jørgens kontaktsiden."
+ add_to_aspect_li8: "Amy kan også @nevne Ben i et innlegg."
add_to_aspect_q: "Hva skjer når jeg legger noen til i et av mine aspekter? Eller når noen legger meg til i et av sine aspekter?"
list_not_sharing_a: "Nei, men se hvorvidt noen deler med deg ved å besøke deres profilside. Hvis de gjør, vil linjen under profilbildet deres være grønn; hvis ikke, vil den være grå. Du skulle få beskjed hver gang noen begynner å dele med deg."
- list_not_sharing_q: "Fins der en liste over personer jeg har lagt til i et av mine aspekter, men som ikke har lagt meg til i et av sine?"
+ list_not_sharing_q: "Finnes det en liste over personer som jeg har lagt til i et av mine aspekter, men som ikke har lagt meg til noen av sine egne?"
only_sharing_a: "Der er folk som har lagt deg til et av sine aspekter, men som ikke (foreløpig) er i noen av dine aspekter. Med andre ord, de deler med deg, men du deler ikke med dem (asymmterisk deling). Hvis du legger dem til et aspekt, vil de da vises under det aspektet og ikke under «deler kun med deg». Se over."
only_sharing_q: "Hvem er de menneskene som er oppført i «Deler bare med meg» på min kontakter side?"
- see_old_posts_a: "Nei. De vil bare kunne de nye postingene til det aspektet. De (og alle andre) kan se dine eldre offentlige poster på din profilside, og de kan også se disse i stream-en sin."
+ see_old_posts_a: "Nei. De vil bare kunne de nye innlegg til det aspektet. De (og alle andre) kan se dine eldre offentlige poster på din profilside, og de kan også se disse i strømmen sin."
see_old_posts_q: "Når jeg legger noen til et aspekt, kan de se eldre poster som jeg allerede har postet til det aspektet?"
+ sharing_notification_a: "Du vil få en varsling hver gang noen begynner å dele med deg."
+ sharing_notification_q: "Hvordan vet jeg når noen har begynt å dele med meg"
title: "Deler"
tags:
filter_tags_a: "Dette er så langt ikke ikke tilgjengelig gjennom diaspora* direkte, men noen %{third_party_tools} har blitt skrevet som kunne levere dette."
- filter_tags_q: "Hvordan kan jeg filtrere/ekskludere noen tag-er fra min stream?"
- followed_tags_a: "Etter å ha søkt opp en tag kan du klikke på knappen øverst i den tag-ens side for å «følge» den tag-en. Den vil da vises i din liste over fulgte tag-er til venstre. Å klikke på en av dine fulgte tag-er tar deg til den tag-ens side så du kan se nylige poster som inneholder den tag-en. Klikk på #Followed Tags for å se en stream med poster som inkluderer noen som helst av dine fulgte tag-er. "
+ filter_tags_q: "Hvordan kan jeg filtrere/ekskludere noen tagger fra strømmen min?"
+ followed_tags_a: "Etter å ha søkt opp en tagg, kan du klikke på knappen øverst i taggens side for å «følge» taggen. Da vil den vises i listen din over fulgte tagger til venstre. Klikker du på en av dine fulgte tagger, kommer du til taggens side slik at du kan se nylige innlegg som inneholder taggen. Klikker du på #Fulgte tagger, får du en strøm av innlegg som inkluderer noen av dine taggene du følger."
followed_tags_q: "Hva er «#Følges Tags» og hvordan kan jeg følge en kode?"
people_tag_page_a: "De er folk som har oppført at tag-en til å beskrive seg selv i sin offentlige profil."
people_tag_page_q: "Hvem er de menneskene som er oppført på venstre av en tag side?"
@@ -539,14 +576,14 @@ nb:
accept_your_invitation: "Godta invitasjonen din"
your_account_awaits: "Kontoen din er klar!"
new:
- already_invited: "Allerede innvitert"
+ already_invited: "Disse personene har ikke takket ja til invitasjonen din:"
aspect: "Aspekt"
check_out_diaspora: "Sjekk ut diaspora*!"
codes_left:
one: "En invitasjon er igjen med denne koden"
other: "%{count} invitasjoner er igjen med denne koden"
zero: "Ingen flere invitasjoner kan gjøres med denne koden"
- comma_separated_plz: "Du kan skrive inn flere e-post adresser adskilt med komma."
+ comma_separated_plz: "Du kan skrive inn flere e-postadresser adskilt med komma."
if_they_accept_info: "Hvis de aksepterer, vil de bli lagt til i aspektet du valgte."
invite_someone_to_join: "Inviter noen til diaspora*!"
language: "Språk"
@@ -561,8 +598,9 @@ nb:
application:
back_to_top: "Til toppen"
powered_by: "DREVET AV DIASPORA*"
- public_feed: "Offentlig diaspora* feed for %{name}"
+ public_feed: "Offentlig diaspora*-feed for %{name}"
source_package: "Last ned kildekodepakken"
+ statistics_link: "Statistikk for poden"
toggle: "vis mobilsiden"
whats_new: "hva er nytt?"
your_aspects: "dine aspekter"
@@ -602,7 +640,7 @@ nb:
zero: "ingen liker"
limited: "Begrenset"
more: "Mer"
- next: "neste"
+ next: "Neste"
no_results: "Ingen resultater ble funnet"
notifications:
also_commented:
@@ -649,6 +687,7 @@ nb:
mark_read: "Marker som lest"
mark_unread: "Merk som ulest"
mentioned: "Nevnte"
+ no_notifications: "Du har ingen varslinger ennå."
notifications: "Varsler"
reshared: "Delt"
show_all: "vis alle"
@@ -700,15 +739,64 @@ nb:
other: "%{actors} har begynt å dele med deg."
zero: "%{actors} har begynt å dele med deg."
notifier:
+ a_limited_post_comment: "Det finnes en ny kommentar på et begrenset innlegg i diaspora* som du kan ta en kikk på."
a_post_you_shared: "en post"
+ a_private_message: "Det er en ny privat samtale i diaspora* du kan ta en kikk på."
accept_invite: "Godta Diaspora*-invitasjonen din!"
+ also_commented:
+ limited_subject: "Det finnes en ny kommentar på et innlegg du kommenterte på"
click_here: "klikk her"
comment_on_post:
- reply: "Svar eller se %{name}'s innlegg >"
+ limited_subject: "Det finnes en ny kommentar på et av dine innlegg"
+ reply: "Svar eller se %{name} sine innlegg >"
confirm_email:
click_link: "To activate your new e-mail address %{unconfirmed_email}, please click this link:"
subject: "Please activate your new e-mail address %{unconfirmed_email}"
email_sent_by_diaspora: "Denne e-posten er sendt av Diaspora. Hvis du ikke vil motta flere e-poster som denne, "
+ export_email:
+ body: |-
+ Hei, %{name}
+
+ Dine data er klare og er kan lastes ned ved å klikke på [denne lenken](%{url}).
+
+ Hilsen,
+
+ diaspora*-epostroboten
+ subject: "Din personlige data er klar for nedlasting, %{name}"
+ export_failure_email:
+ body: |-
+ Hei, %{name}
+
+ Vi støtte på et problem mens vi gjorde dataene dine klar til nedlasting.
+
+ Vennligst forsøk ikke senere.
+
+ Beklager,
+
+ Diaspora*-epostroboten
+ subject: "Beklager, men det var et problem med dine data, %{name}"
+ export_photos_email:
+ body: |-
+ Hei, %{name}
+
+ Dine bilder er ferdig behandlet og kan lastes ned ved å følge [denne lenken](%{url}).
+
+ Med vennlig hilsen,
+
+ Diaspora*-epostroboten
+ subject: "Dine bilder er klare for nedlasting, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Hei, %{name}
+
+ Vi har støtt på et problem da vi klargjorde bildene dine for nedlasting.
+
+ Vennligst forsøk igjen.
+
+ Beklager,
+
+ Diaspora*-epostroboten
+ subject: "Det var et problem med bildene dine, %{name}"
hello: "Hei %{name}!"
invite:
message: |-
@@ -729,12 +817,31 @@ nb:
invited_you: "%{name} har invitert deg til diaspora*"
liked:
liked: "%{name} has just liked your post: "
+ limited_post: "%{name} likte ditt begrensede innlegg"
view_post: "Se innlegg >"
mentioned:
+ limited_post: "Du ble nevnt i et begrenset innlegg."
mentioned: "nevnte deg i et innlegg:"
subject: "%{name} har nevnt deg på diaspora*"
private_message:
reply_to_or_view: "Svar eller se på denne samtalen >"
+ remove_old_user:
+ body: |-
+ Hei!
+
+ Siden du ikke har brukt diaspora*-kontoen din på %{pod_url} på %{after_days} dager, kan det se ut som om du ikke ønsker å ha den lenger. For å sikre at våre aktive brukere får best mulig ytelse fra denne diaspora*-poden, vil vi helst fjerne uønskede kontoer fra databasen vår.
+
+ Vi ville satt veldig pris på om du ikke forlot diaspora*-felleskapet vårt, og du må gjerne beholde kontoen hvis du ønsker det.
+
+ Ønsker du å beholde kontoen, behøver du kun å logge deg inn på kontoen før %{remove_after}. Bruk gjerne muligheten til å kikke deg omkring på diaspora* når du logger deg inn. Det har endret seg ganske mye siden du var logget på sist, og vi tror du vil like forbedringen vi har gjort. Følg noen #tagger for å finne interessant innhold.
+
+ Logg inn her: %{login_url}. Hvis du har glemt brukernavnet eller passordet, kan du be om en påminnelse på den siden.
+
+ Håper vi ser deg igjen!
+
+ Med vennlig hilsen,
+ Diasporas epostrobot
+ subject: "Din diaspora*-konto er satt til å bli slettet på grunn av inaktivitet"
report_email:
body: |-
Hei,
@@ -763,7 +870,7 @@ nb:
started_sharing:
sharing: "har begynt å dele med deg!"
subject: "%{name} har startet å dele med deg på diaspora*"
- view_profile: "Se %{name}'s profil"
+ view_profile: "Se profilen til %{name}"
thanks: "Takk,"
to_change_your_notification_settings: "for å endre innstilliger for varsler"
nsfw: "NSFW"
@@ -787,7 +894,7 @@ nb:
looking_for: "Ser du etter innlegg tagget %{tag_link}?"
no_one_found: "... og ingen ble funnet."
no_results: "Hei! Du må søke etter noe."
- results_for: "søkeresultater for"
+ results_for: "Brukere tagget med %{search_term}"
search_handle: "Benytt diaspora* ID (brukernavn@pod.tid) for å finne dine venner."
searching: "Søker. Vennligst vent ..."
send_invite: "Finner fremdeles ikke de du søker? Send en invitasjon!"
@@ -816,7 +923,7 @@ nb:
incoming_request: "You have an incoming request from this person."
mention: "Omtale"
message: "Melding"
- not_connected: "Du videredeler ikke til denne personen"
+ not_connected: "Du deler ikke til denne personen"
recent_posts: "Nylige Innlegg"
recent_public_posts: "Nylige Offentlige Innlegg"
return_to_aspects: "Tilbake til aspektene"
@@ -878,7 +985,7 @@ nb:
reshare_by: "Delt videre av %{author}"
previous: "forrige"
privacy: "Personvern"
- privacy_policy: "Personvernspolise"
+ privacy_policy: "Personvernerklæring"
profile: "Profil"
profiles:
edit:
@@ -887,9 +994,9 @@ nb:
first_name: "Fornavn"
last_name: "Etternavn"
nsfw_check: "Marker alt jeg deler som NSFW"
- nsfw_explanation: "NSFW ('not safe for work') er diaspora*'s felleskaps standard for innhold som muligens ikke er passende å vise når man er f.eks på jobb. Hvis du ønsker å dele slikt materiale jevnlig, vennligsk velg denne opsjonen, slik at alt du deler ikke vises for personer som ikke ønsker å se det."
+ nsfw_explanation: "NSFW («not safe for work») er diaspora* sin selvregulerende felleskapsstandard for innhold som muligens ikke er passende å se på når man er for eksempel er på jobb. Hvis du tenker å dele slikt materiale jevnlig, vennligst huk av for dette alternativet, slik at alt du deler vil være skjult fra folks strømmer med mindre de velger å se det."
nsfw_explanation2: "Hvis du ikke velger denne opsjonen, vennligst legg til #nsfw tag for hver gang du deler slikt materiale"
- update_profile: "Oppdater Profil"
+ update_profile: "Oppdater profil"
your_bio: "Om meg"
your_birthday: "Din fødselsdato"
your_gender: "Ditt kjønn"
@@ -912,7 +1019,7 @@ nb:
two: "%{count} reaksjoner"
zero: "0 reaksjoner"
registrations:
- closed: "Registreringer er stengt på denne diaspora* poden."
+ closed: "Registreringer er stengt på denne diaspora*-serveren."
create:
success: "Du er nå med i diaspora*!"
edit:
@@ -922,7 +1029,7 @@ nb:
password_to_confirm: "(vi trenger ditt nåværende passord for å bekrefte endringene)"
unhappy: "Ulykkelig?"
update: "Oppdater"
- invalid_invite: "Invitasjonslenken som du anga er ikke gyldig lenger!"
+ invalid_invite: "Invitasjonslenken som du brukte er ikke gyldig lenger!"
new:
create_my_account: "Opprett min konto!"
email: "E-POST"
@@ -961,7 +1068,7 @@ nb:
destroy:
error: "Velg et aspekt først!"
ignore: "Ignorerte venneforespørsel"
- success: "Du deler nå."
+ success: "Nå deler du."
helper:
new_requests:
few: "%{count} nye forespørsler!"
@@ -1005,14 +1112,22 @@ nb:
no_friends: "Ingen Facebook-venner ble funnet."
service_friends: "%{service}-venner"
index:
+ connect: "Koble til"
disconnect: "koble fra"
edit_services: "Rediger tjenester"
logged_in_as: "logget inn som"
+ no_services_available: "Det finnes ingen tjenester tilgjengelig på denne poden."
+ not_logged_in: "Ikke logget inn for øyeblikket."
really_disconnect: "koble fra %{service}?"
services_explanation: "Ved å koble til andre sosiale tjenester, får du muligheten å publisere til disse tjenestene idet du poster til diaspora*."
inviter:
click_link_to_accept_invitation: "Klikk denne linken for å akseptere invitasjonen din"
join_me_on_diaspora: "Bli med meg på diaspora*"
+ provider:
+ facebook: "Facebook"
+ tumblr: "Tumblr"
+ twitter: "Twitter"
+ wordpress: "WordPress"
remote_friend:
invite: "inviter"
not_on_diaspora: "Finnes ikke på diaspora* ennå."
@@ -1020,18 +1135,20 @@ nb:
settings: "Innstillinger"
share_visibilites:
update:
- post_hidden_and_muted: "%{name}'s innlegg har blitt gjemt, og varsler har blitt skrudd av."
- see_it_on_their_profile: "Hvis du vil se oppdateringer til dette innlegget, besøk %{name}'s profilside."
+ post_hidden_and_muted: "Innlegget til %{name} har blitt gjemt, og varslinger har blitt skrudd av."
+ see_it_on_their_profile: "Hvis du vil se oppdateringer til dette innlegget, besøk %{name} sin profilside."
shared:
add_contact:
add_new_contact: "Legg til en ny kontakt"
- create_request: "Finn etter diaspora* brukernavn"
+ create_request: "Finn etter diaspora*-brukernavn"
diaspora_handle: "Diaspora handle"
- enter_a_diaspora_username: "Skriv inn et Diaspora brukernavn:"
+ enter_a_diaspora_username: "Skriv inn et diaspora*-brukernavn:"
know_email: "Kan du epostadressen deres? Inviter dem!"
- your_diaspora_username_is: "Ditt diaspora* brukernavn er: %{diaspora_handle}"
+ your_diaspora_username_is: "Ditt diaspora*-brukernavn er: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Add to aspect"
+ mobile_row_checked: "%{name} (fjern)"
+ mobile_row_unchecked: "%{name} (legg til)"
toggle:
one: "I %{count} aspekt"
other: "I %{count} aspekter"
@@ -1047,9 +1164,9 @@ nb:
from_facebook: "Fra Facebook"
invitations_left: "%{count} igjen"
invite_someone: "Inviter noen"
- invite_your_friends: "Innviter vennene dine"
+ invite_your_friends: "Inviter vennene dine"
invites: "Invitasjoner "
- invites_closed: "Invitasjoner er foreløpig stengt på denne diaspora* poden"
+ invites_closed: "Invitasjoner er foreløpig stengt på denne diaspora*-serveren"
share_this: "Del denne lenken via e-post, blogg eller ditt foretrukne sosiale nettverk!"
notification:
new: "Ny %{type} fra %{from}"
@@ -1082,7 +1199,7 @@ nb:
question: "Spørsmål"
remove_poll_answer: "Fjern valg"
post_a_message_to: "Post et innlegg til %{aspect}"
- posting: "Poster ..."
+ posting: "Publiserer ..."
preview: "Forhåndsvisning"
publishing_to: "publiserer til:"
remove_location: "Fjern lokasjon"
@@ -1114,6 +1231,21 @@ nb:
failed: "Verifisering mislyktes"
user: "Koden i bildet samsvarer ikke med koden du oppga"
placeholder: "Oppgi verdien vist i bildet"
+ statistics:
+ active_users_halfyear: "Aktive brukere halvår"
+ active_users_monthly: "Aktive brukere månedlig"
+ closed: "Lukket"
+ disabled: "Utilgjengelig"
+ enabled: "Tilgjengelig"
+ local_comments: "Lokale kommentarer"
+ local_posts: "Lokale innlegg"
+ name: "Navn"
+ network: "Nettverk"
+ open: "Åpen"
+ registrations: "Registrering"
+ services: "Tjenester"
+ total_users: "Totalt antall brukere"
+ version: "Versjon"
status_messages:
create:
success: "Nevnte :%{navn}"
@@ -1126,15 +1258,17 @@ nb:
too_long: "{\"few\"=>\"du bør begrense statusmeldingene dine til %{count} tegn\", \"many\"=>\"Du bør begrense statusmeldingene dine til %{count} characters\", \"one\"=>\"du bør begrense statusmeldingene dine til %{count} tegn\", \"other\"=>\"du må gjøre statusmeldingene dine kortere enn %{count} tegn\", \"two\"=>\"vær så snill og skriv statusoppdateringer som er under %{count} tegn\", \"zero\"=>\"Statusmeldinger må være lengre enn ingenting.\"}"
stream_helper:
hide_comments: "Skjul kommentarer"
+ no_more_posts: "Du er kommet til slutten av strømmen."
+ no_posts_yet: "Det finnes ingen innlegg ennå."
show_comments:
one: "Vis en kommentar til"
other: "Vis %{count} flere kommentarer"
zero: "Ingen kommentarer"
streams:
activity:
- title: "Min Aktivitet"
+ title: "Min aktivitet"
aspects:
- title: "Mine Aspekter"
+ title: "Mine aspekter"
aspects_stream: "Aspekter"
comment_stream:
contacts_title: "Personer hvis poster du har kommentert"
@@ -1142,20 +1276,20 @@ nb:
community_spotlight_stream: "Fremhevet av Fellesskapet"
followed_tag:
add_a_tag: "Legg til en tag"
- contacts_title: "Personer som liker disse tag-ene"
+ contacts_title: "Personer som liker disse taggene"
follow: "Følg"
- title: "#Fulgte tag'er"
- followed_tags_stream: "Fulgte tag'er"
+ title: "#Fulgte tagger"
+ followed_tags_stream: "#Fulgte tagger"
like_stream:
contacts_title: "Personer hvis poster du liker"
- title: "Liker Stream"
- mentioned_stream: "@Omtale"
+ title: "Liker-strøm"
+ mentioned_stream: "@Omtaler"
mentions:
contacts_title: "Folk som har nevnt deg"
- title: "@Omtale"
+ title: "@Omtaler"
multi:
- contacts_title: "Folk i din Stream"
- title: "Stream"
+ contacts_title: "Folk i din strøm"
+ title: "Strøm"
public:
contacts_title: "Folk som har lagt ut noe nytt"
title: "Offentlig aktivitet"
@@ -1165,18 +1299,26 @@ nb:
tag_followings:
create:
failure: "Failed to follow: #%{name}"
- none: "Du kan ikke følge en blank tag"
+ none: "Du kan ikke følge en blank tagg"
success: "Hurra! Du følger nå:: #%{name}"
destroy:
failure: "Failed to stop following: #%{name}"
success: "Successfully stopped following: #%{name}"
+ manage:
+ no_tags: "Du følger ikke noen tagger"
+ title: "Administrer fulgte tagger"
tags:
+ name_too_long: "Navnet på taggen må være kortere enn %{count} tegn. Akkurat nå er det på %{current_length} tegn."
show:
follow: "Følg #%{tag}"
following: "Følger #%{tag}"
- none: "Den tomme tag'en eksisterer ikke."
+ none: "Den tomme taggen eksisterer ikke."
stop_following: "Slutt å følge #%{tag}"
- terms_and_conditions: "Vilkår og begrensninger"
+ tagged_people:
+ one: "Én person er tagget med %{tag}"
+ other: "%{count} personer er tagget med %{tag}"
+ zero: "Ingen er tagget med %{tag}"
+ terms_and_conditions: "Vilkår og betingelser"
undo: "Angre?"
username: "Brukernavn"
users:
@@ -1190,44 +1332,54 @@ nb:
edit:
also_commented: "noen andre har kommentert et innlegg du kommenterte på"
auto_follow_aspect: "Aspekt for automatisk fulgte brukere:"
- auto_follow_back: "Del automatisk med brukere som starter å dele med deg"
+ auto_follow_back: "Del automatisk med brukere som begynner å dele med deg"
change: "Endre"
- change_email: "Endre e-post"
+ change_email: "Endre e-postadresse"
change_language: "Endre språk"
change_password: "Endre passord"
character_minimum_expl: "må være minst seks tegn"
close_account:
dont_go: "Vennligst ikke forsvinn nå!"
- if_you_want_this: "Om du virkelig ønsker dette så skriv inn passordet ditt under og klikk på 'Avslutt Konto'"
+ if_you_want_this: "Hvis du virkelig ønsker dette, skriver du inn passordet ditt under og klikker på «Avslutt konto»"
lock_username: "Dette vil reservere brukernavnet ditt hvis du bestemmer deg for å registrere deg igjen."
locked_out: "Du kommer til å bli avlogget og låst ute fra din konto"
make_diaspora_better: "Vi ønsker at du hjelper oss å gjøre Diaspora bedre, så det hadde vært fint om du hjalp oss i stedet for å forlate oss. Hvis du allikevel ønsker å forsvinne så vil vi gjerne at du skal få vite hva som skjer videre."
mr_wiggles: "Mr Wiggles blir lei seg om du forlater oss nå"
no_turning_back: "På dette tidspunktet er det ingen vei tilbake."
what_we_delete: "Vi kommer til å slette dine tidligere innlegg og profildata så snart som mulig. Dine kommentarer vil fortsatt stå, men vil bli assosiert med din diaspora* ID istedet for ditt navn."
- close_account_text: "Avslutt Konto"
- comment_on_post: "noen kommenterer på ditt innlegg"
+ close_account_text: "Avslutt konto"
+ comment_on_post: "noen kommenterer på innlegget ditt"
current_password: "Nåverende passord"
- current_password_expl: "den som du logger på med ..."
- download_photos: "last ned mine bilder"
+ current_password_expl: "det som du logger på med ..."
+ download_export: "Last ned min profil"
+ download_export_photos: "Last ned mine bilder"
+ download_photos: "Last ned mine bilder"
edit_account: "Endre konto"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
- export_data: "Eksporter Data"
- following: "Deler innstillinger"
+ export_data: "Eksporter data"
+ export_in_progress: "Vi behandler dine data nå. Vennligst prøv igjen om et lite øyeblikk."
+ export_photos_in_progress: "Vi klargjør bildene dine. Vennligst kom tilbake om et par øyeblikk."
+ following: "Innstillinger for deling"
getting_started: "Ny bruker innstillinger"
+ last_exported_at: "(Sist oppdatert %{timestamp})"
liked: "noen liker innlegget ditt"
- mentioned: "du er omtalt i et innlegg"
+ mentioned: "du blir omtalt i et innlegg"
new_password: "Nytt Passord"
private_message: "du har mottatt en privat melding"
receive_email_notifications: "Motta varsler på e-post når:"
- reshared: "noen delte ditt innlegg"
+ request_export: "Be om min profildata"
+ request_export_photos: "Be om mine bilder"
+ request_export_photos_update: "Last mine bilder på ny"
+ request_export_update: "Last profildata på ny"
+ reshared: "noen deler innlegget ditt"
show_community_spotlight: "Vis felleskaps meldinger i strømmen"
show_getting_started: "Skru på oppstart veiledning"
someone_reported: "en bruker sendte en rapport"
- started_sharing: "noen startet å dele med deg"
- stream_preferences: "Innstillinger for stream"
+ started_sharing: "noen begynner å dele med deg"
+ stream_preferences: "Innstillinger for strømmen"
your_email: "Din epost"
- your_handle: "Ditt diaspora* brukernavn"
+ your_email_private: "Din e-postadresse vil aldri bli sett av andre brukere"
+ your_handle: "Ditt diaspora*-brukernavn"
getting_started:
awesome_take_me_to_diaspora: "Supert! Ta meg til Diaspora*"
community_welcome: "diaspora* felleskapet er glad for å ha deg med på laget!"
@@ -1236,32 +1388,34 @@ nb:
hashtag_explanation: "Hastags lar deg beskrive og følge dine interesser. De er også en fin måte å finne nye folk i diaspora*."
hashtag_suggestions: "Prøv å følge tags som #art, #movies, #gif, osv."
saved: "Lagret!"
- well_hello_there: "Vel, hallo !"
+ well_hello_there: "Vel, hallo der!"
what_are_you_in_to: "Hva er dine interesser?"
who_are_you: "Hvem er du?"
privacy_settings:
ignored_users: "Ignorerte brukere"
+ no_user_ignored_message: "Du ignorerer ikke noen andre brukere for tiden"
stop_ignoring: "Slutt å ignorere"
+ strip_exif: "Fjern metadata som lokasjon, forfatter og kameramodell fra opplastede bilder (anbefalt)."
title: "Personverninnstillinger"
public:
does_not_exist: "Bruker %{username} finnes ikke!"
update:
email_notifications_changed: "Language Change Failed"
- follow_settings_changed: "Følgende innstillinger ble endret"
- follow_settings_not_changed: "Følgende innstilinger feilet"
- language_changed: "Språk endret"
+ follow_settings_changed: "Innstillinger for følging ble endret"
+ follow_settings_not_changed: "Kunne ikke endre innstillinger for følging"
+ language_changed: "Språket er endret"
language_not_changed: "Endring av språk mislyktes"
password_changed: "Passord Endret"
password_not_changed: "Endring av Passord mislyktes"
settings_not_updated: "Oppdatering av instillinger feilet."
settings_updated: "Innstillinger oppdatert"
- unconfirmed_email_changed: "E-post endret. Trenger aktivisering."
+ unconfirmed_email_changed: "E-post endret. Behøver aktivering."
unconfirmed_email_not_changed: "E-Mail Change Failed"
webfinger:
fetch_failed: "klarte ikke å hente webfinger profil for % {profile_url}"
hcard_fetch_failed: "there was a problem fetching the hcard for #{@account}"
no_person_constructed: "Ingen personer kunne konstrueres fra dette hCard."
- not_enabled: "det virker ikke som webfinger er aktivert for % {account}'s vert"
+ not_enabled: "Det virker som om webfinger ikke er aktivert for verten til %{account}"
xrd_fetch_failed: "kunne ikke få xrd fra kontoen %{account}"
welcome: "Velkommen!"
will_paginate:
diff --git a/config/locales/diaspora/nds.yml b/config/locales/diaspora/nds.yml
index a66080ac2..20baffb55 100644
--- a/config/locales/diaspora/nds.yml
+++ b/config/locales/diaspora/nds.yml
@@ -43,13 +43,10 @@ nds:
taken: "is schon vergeven."
admins:
admin_bar:
- correlations: "Korrelationen"
pages: "Sieten"
pod_stats: "Podstatistiken"
user_search: "Brukersök"
weekly_user_stats: "Weekentliche Brukerstatistiken"
- correlations:
- correlations_count: "Korrelationen mit Amelldungstohl:"
stats:
2weeks: "Twee Weken"
50_most: "De 50 an meisten benutzten Tags"
@@ -136,7 +133,7 @@ nds:
failure: "Kunn Aspekt nich anleggen."
success: "Dien nee’en Aspekt %{name} is anleggt worrn."
destroy:
- failure: "%{name} is nich leer un kunn nich wegmakt warrn."
+ failure: "%{name} kunn nich wegmakt warrn."
success: "%{name} is erfolgriek wegmakt worrn."
edit:
aspect_list_is_not_visible: "Kontakte in dissen Aspekt künnt sick nich gegensiedich seihn."
@@ -497,9 +494,9 @@ nds:
notifier:
a_post_you_shared: "een Bidrag."
accept_invite: "Nimm diene diaspora*-Inladung an!"
- click_here: "klick hier"
+ click_here: "Klick hier"
comment_on_post:
- reply: "%{name}s Bidrag antwoorden or ankieken >"
+ reply: "Op %{name}s Bidrag antwoorden oder em ankieken >"
confirm_email:
click_link: "Bidde folg dissen Link, üm diene nee’e E-Mail-Adress %{unconfirmed_email} in gang to setten:"
subject: "Bidde set diene nee’e E-Mail-Adress %{unconfirmed_email} in gang"
@@ -602,7 +599,7 @@ nds:
you_have_no_tags: "du hest keene Tags!"
webfinger:
fail: "Deit mi leed, wi kunnen %{handle} nich finnen."
- zero: "keene Lüü"
+ zero: "Keene Lüü"
photos:
comment_email_subject: "%{name}s Bild"
create:
diff --git a/config/locales/diaspora/nl.yml b/config/locales/diaspora/nl.yml
index 15fc19ae8..2e4686634 100644
--- a/config/locales/diaspora/nl.yml
+++ b/config/locales/diaspora/nl.yml
@@ -53,15 +53,12 @@ nl:
taken: "is al in gebruik."
admins:
admin_bar:
- correlations: "Correlaties"
pages: "Pagina's"
pod_stats: "Pod Statistieken"
report: "Meldingen"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Gebruiker Zoeken"
weekly_user_stats: "Wekelijkse Gebruikersstatistieken"
- correlations:
- correlations_count: "Correlaties met inlogtelling:"
stats:
2weeks: "2 weken"
50_most: "50 meest populaire tags"
diff --git a/config/locales/diaspora/nn.yml b/config/locales/diaspora/nn.yml
index 9b50ddd65..bb600bbad 100644
--- a/config/locales/diaspora/nn.yml
+++ b/config/locales/diaspora/nn.yml
@@ -43,14 +43,11 @@ nn:
taken: "er allereie i bruk."
admins:
admin_bar:
- correlations: "Korrelasjonar"
pages: "Sidar"
pod_stats: "Pod-statistikk"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Brukarsøk"
weekly_user_stats: "Brukarstatistikk per veke"
- correlations:
- correlations_count: "Correlations with Sign In Count:"
stats:
2weeks: "2 veker"
50_most: "50 mest populære tags"
diff --git a/config/locales/diaspora/pl.yml b/config/locales/diaspora/pl.yml
index 40386447a..d3c5ca9e7 100644
--- a/config/locales/diaspora/pl.yml
+++ b/config/locales/diaspora/pl.yml
@@ -53,15 +53,12 @@ pl:
taken: "jest już zajęta."
admins:
admin_bar:
- correlations: "Korelacje"
pages: "Strony"
pod_stats: "Statystyki Poda"
report: "Zgłoszenia"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Wyszukiwanie użytkowników"
weekly_user_stats: "Tygodniowe statystyki użytkowników"
- correlations:
- correlations_count: "Korelacje z liczbą logowań:"
stats:
2weeks: "2 tygodnie"
50_most: "50 najpopularniejszych znaczników"
diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml
index 5bfee5642..4cff133e6 100644
--- a/config/locales/diaspora/pt-BR.yml
+++ b/config/locales/diaspora/pt-BR.yml
@@ -53,15 +53,12 @@ pt-BR:
taken: "já foi escolhido."
admins:
admin_bar:
- correlations: "Correlações"
pages: "Páginas"
pod_stats: "Status do Servidor"
report: "Relatos"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Busca de Usuários"
weekly_user_stats: "Estatísticas Semanais"
- correlations:
- correlations_count: "Contas similares:"
stats:
2weeks: "2 Semanas"
50_most: "50 Tags Mais Populares"
@@ -768,6 +765,20 @@ pt-BR:
private_message:
reply_to_or_view: "Responder ou visualizar esta conversa >"
remove_old_user:
+ body: |-
+ Olá,
+
+ Parece que você não quer mais sua conta em %{pod_url} , pois você não têm ultilizado por %{after_days} dias. Para garantir que nossos usuários ativos obtenham o melhor desempenho nesse servidor diáspora*, nós gostaríamos de remover contas indesejadas de nosso banco de dados.
+
+ Gostaríamos muito que fique e continue a fazer parte da comunidade Diaspora*, voce está convidado a manter a sua conta ativa, se desejar.
+
+ Se quiser manter sua conta ativa, tudo que precisa fazer é entrar em sua conta antes de %{remove_after}. Quando você entrar, reserve um momento para dar uma olhada em diáspora *. Ele mudou muito desde a última vez que eu o vi, e acho que você vai gostar das melhorias que fizemos. Siga algumas #tags para encontrar o conteúdo que você gosta.
+
+ Entre por aqui: %{login_url} . Se você esqueceu seus dados de login, você pode recupera-los nesta página.
+
+ Esperamos vê-lo em breve,
+
+ E-mail robô de Diaspora*!
subject: "A sua conta no diaspora* foi marcada para a remoção devido a inatividade"
report_email:
body: |-
diff --git a/config/locales/diaspora/pt-PT.yml b/config/locales/diaspora/pt-PT.yml
index f1fbd2149..6cf8d586c 100644
--- a/config/locales/diaspora/pt-PT.yml
+++ b/config/locales/diaspora/pt-PT.yml
@@ -43,14 +43,11 @@ pt-PT:
taken: "já foi escolhido."
admins:
admin_bar:
- correlations: "Correlações"
pages: "Páginas"
pod_stats: "Estatísticas do Pod"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Procurar Utilizador"
weekly_user_stats: "Estatísticas Semanais de Utilizador"
- correlations:
- correlations_count: "Correlações com Contagem do Iniciar Sessão"
stats:
2weeks: "2 Semanas"
50_most: "50 Etiquetas Mais Populares"
diff --git a/config/locales/diaspora/ru.yml b/config/locales/diaspora/ru.yml
index ac76acc88..6929c57c9 100644
--- a/config/locales/diaspora/ru.yml
+++ b/config/locales/diaspora/ru.yml
@@ -53,15 +53,12 @@ ru:
taken: "уже занято."
admins:
admin_bar:
- correlations: "Корреляции"
pages: "Страницы"
pod_stats: "Статистика пода"
report: "Доносы"
sidekiq_monitor: "Монитор Sidekiq"
user_search: "Поиск пользователей"
weekly_user_stats: "Еженедельная пользовательская статистика"
- correlations:
- correlations_count: "Связь с числом входов:"
stats:
2weeks: "2 недели"
50_most: "50 самых популярных меток"
diff --git a/config/locales/diaspora/sc.yml b/config/locales/diaspora/sc.yml
index 896beb979..69bf65f66 100644
--- a/config/locales/diaspora/sc.yml
+++ b/config/locales/diaspora/sc.yml
@@ -41,7 +41,7 @@ sc:
invalid: "no est bàlidu. Est possìbile impreare petzi lìteras, nùmeros, e underscores."
taken: "est giai istadu pigadu."
ago: "%{time} fàghet"
- all_aspects: "Totu sos aspetos"
+ all_aspects: "Totu sas caras"
application:
helper:
unknown_person: "Pessone disconnota"
@@ -50,8 +50,22 @@ sc:
are_you_sure: "Seguru ses?"
are_you_sure_delete_account: "Seguru ses de bòlere serrare su contu tuo? Custu non podet èssere annuddadu!"
aspects:
+ add_to_aspect:
+ failure: "Annanghidura de su cuntatu a sa cara faddida."
+ success: "Annanghidura de su cuntatu a sa cara resissida."
+ aspect_listings:
+ add_an_aspect: "+ Annanghe una cara"
+ deselect_all: "Disischerta totu"
+ edit_aspect: "Modìfica %{name}"
+ select_all: "Ischerta totu"
contacts_not_visible: "Sos cuntatos de custa cara non s'ant a pòdere bìdere intre issos."
contacts_visible: "Sos cuntatos de custa cara s'ant a pòdere bìdere intre issos."
+ create:
+ failure: "Creatzione de sa cara non resissida."
+ success: "Sa cara tua noa %{name} est istada creada"
+ destroy:
+ failure: "No est istadu possìbile bogare %{name}."
+ success: "%{name} est istada bogada."
edit:
aspect_list_is_not_visible: "Sos cuntatos de custa cara non si podent bìdere intre issos."
aspect_list_is_visible: "Sos cuntatos de custa cara si podent bìdere intre issos."
@@ -61,8 +75,31 @@ sc:
rename: "Càmbia nùmene"
update: "Agiorna"
updating: "Agiornande"
+ index:
+ donate: "Dona"
+ handle_explanation: "Custu est s'ID diaspora* tuo. Comente un'indiritzu de posta eletrònica, lu podes dare a sa gente pro ti fàghere agatare."
+ no_tags: "+ Agata un'eticheta de sighire"
+ unfollow_tag: "Non sighire prus %{tag}"
+ new:
+ create: "Crea"
+ name: "Nùmene (lu podes bìere petzi tue)"
+ no_contacts_message:
+ community_spotlight: "Prus de importu in sa comunidade"
+ or_spotlight: "O podes cumpartzire cun %{link}"
+ try_adding_some_more_contacts: "Podes chircare o invitare àteros cuntatos."
+ you_should_add_some_more_contacts: "Dias dèpere annànghere carchi cuntatu in prus!"
+ no_posts_message:
+ start_talking: "Perunu at galu naradu nudda!"
one: "1 cara"
other: "%{count} caras"
+ seed:
+ acquaintances: "Connoschentes"
+ family: "Famìlia"
+ friends: "Amigos"
+ work: "Traballu"
+ update:
+ failure: "Sa cara tua, %{name}, tenet unu nùmene tropu longu pro èssere sarbada."
+ success: "Sa cara tua, %{name}, est istada modificada."
zero: "Peruna cara"
back: "In dae segus"
cancel: "Annudda"
@@ -96,7 +133,7 @@ sc:
previous: "Antepostu"
privacy: "Privadesa"
privacy_policy: "Normativa pro sa privadesa"
- profile: "Perfilu"
+ profile: "Profilu"
public: "Pùblicu"
search: "Chirca"
settings: "Impostaduras"
diff --git a/config/locales/diaspora/sk.yml b/config/locales/diaspora/sk.yml
index 8079738c8..bae7e7e20 100644
--- a/config/locales/diaspora/sk.yml
+++ b/config/locales/diaspora/sk.yml
@@ -43,14 +43,11 @@ sk:
taken: "sa už používa."
admins:
admin_bar:
- correlations: "Závislosti"
pages: "Stránky"
pod_stats: "Štatistiky servera"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Používateľské vyhľadávanie"
weekly_user_stats: "Štatistiky používateľa za týždeň"
- correlations:
- correlations_count: "Závislosti s počtom prihlásených:"
stats:
2weeks: "2. týždeň"
50_most: "50 najpopulárnejších značiek"
diff --git a/config/locales/diaspora/sl.yml b/config/locales/diaspora/sl.yml
index ed0e8cdd5..fafef1c1d 100644
--- a/config/locales/diaspora/sl.yml
+++ b/config/locales/diaspora/sl.yml
@@ -43,14 +43,11 @@ sl:
taken: "je že zaseden."
admins:
admin_bar:
- correlations: "Korelacije"
pages: "Strani"
pod_stats: "Statistika Poda"
sidekiq_monitor: "Sidekiq zaslon"
user_search: "Iskanje uporabnikov"
weekly_user_stats: "Tedenska statistika uporabnikov"
- correlations:
- correlations_count: "Korelacija s prijavami:"
stats:
2weeks: "2 tedna"
50_most: "50 najbolj priljubljenih oznak"
diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml
index 376167af6..0daec563e 100644
--- a/config/locales/diaspora/sv.yml
+++ b/config/locales/diaspora/sv.yml
@@ -13,7 +13,7 @@ sv:
_photos: "Bilder"
_services: "Tjänster"
_statistics: "Statistik"
- _terms: "användningsvillkor"
+ _terms: "Användningsvillkor"
account: "Konto"
activerecord:
errors:
@@ -53,15 +53,12 @@ sv:
taken: "används redan."
admins:
admin_bar:
- correlations: "Korrelationer"
pages: "Sidor"
pod_stats: "Podstatistik"
report: "Anmälningar"
sidekiq_monitor: "Sidekiq-övervakare"
user_search: "Användarsökning"
weekly_user_stats: "Veckovis användarstatistik"
- correlations:
- correlations_count: "Korrelationer med antalet inloggningar:"
stats:
2weeks: "Två veckor"
50_most: "De 50 populäraste taggarna"
@@ -90,18 +87,18 @@ sv:
zero: "Ingen användare"
week: "Vecka"
user_entry:
- account_closed: "konto borttaget"
- diaspora_handle: "Diasporahandtag"
+ account_closed: "Konto borttaget"
+ diaspora_handle: "Diaspora*-id"
email: "E-post"
guid: "Globalt identifieringsnummer (GUID)"
id: "id"
- last_seen: "sedd senast"
+ last_seen: "Sedd senast"
? "no"
- : nej
+ : Nej
nsfw: "#nsfw"
- unknown: "okänd"
+ unknown: "Okänd"
? "yes"
- : ja
+ : Ja
user_search:
account_closing_scheduled: "Kontot för %{name} är låst och kommer att raderas om en stund."
account_locking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas. Det kommer ske om en liten stund..."
@@ -110,14 +107,14 @@ sv:
are_you_sure: "Är du säker på att du vill ta bort ditt konto?"
are_you_sure_lock_account: "Är du säker på att du vill låsa detta konto?"
are_you_sure_unlock_account: "Är du säker på att du vill låsa upp detta konta?"
- close_account: "ta bort konto"
+ close_account: "Ta bort konto"
email_to: "Skicka ett e-brev för att bjuda in"
under_13: "Visa användare som är yngre än 13 år"
users:
one: "En användare hittades"
other: "%{count} användare hittades"
zero: "Inga användare hittades"
- view_profile: "visa profil"
+ view_profile: "Visa profil"
you_currently:
one: "Du har bara en invit kvar %{link}"
other: "Du har nu bara %{count} inviter kvar %{link}"
@@ -170,7 +167,7 @@ sv:
aspect_list_is_not_visible: "Aspektens kontakter kan inte se vilka som hör till aspekten."
aspect_list_is_visible: "Kontakter i denna aspekt är synliga för varandra."
confirm_remove_aspect: "Är du säker på att du vill ta bort aspekten?"
- grant_contacts_chat_privilege: "vill du ge kontakter i aspekten chatprivilegier?"
+ grant_contacts_chat_privilege: "Vill du ge kontakter i aspekten chatprivilegier?"
make_aspect_list_visible: "Ska kontakterna i denna aspekt vara synliga för varandra?"
remove_aspect: "Ta bort den här aspekten"
rename: "Byt namn"
@@ -209,7 +206,7 @@ sv:
learn_more: "Läs mer"
title: "Välkomna nya användare"
no_contacts: "Inga kontakter"
- no_tags: "+ Hitta en tag att följa"
+ no_tags: "+ Hitta en tagg att följa"
people_sharing_with_you: "Personer som delar med dig"
post_a_message: "Skriv ett inlägg >>"
services:
@@ -303,7 +300,7 @@ sv:
zero: "Inga nya meddelanden"
index:
conversations_inbox: "Konversationer – Inkorg"
- create_a_new_conversation: "påbörja en ny konversation"
+ create_a_new_conversation: "Påbörja en ny konversation"
inbox: "Inkorg"
new_conversation: "Ny konversation"
no_conversation_selected: "Ingen konversation vald"
@@ -319,7 +316,7 @@ sv:
fail: "Ogiltigt meddelande"
show:
delete: "Ta bort konversationen"
- hide: "dölj och tysta konversation"
+ hide: "Dölj och tysta konversation"
reply: "Besvara"
replying: "Svarar..."
date:
@@ -376,7 +373,7 @@ sv:
who_sees_post_a: "Om du skulle göra ett inlägg med begränsad spridning, kommer det bara vara synligt för dem du har i just den aspekten (eller de aspekterna, om det skickas till flertalet aspekter). Kontakter som inte finns i aspekten kommer inte att kunna se inlägget. Bara offentliga inlägg kommer att bli synliga för dina kontakter som inte ligger i någon aspekt."
who_sees_post_q: "Vem ser det inlägg jag gjort i en aspekt?"
chat:
- add_contact_roster_a: "Först av allt måste du tillåta chatt i aspekter med dem du vill chatta med. Du gör genom att gå till %{contacts_page} och väljer aspekterna du vill tillåta chatt i. %{toggle_privilege} Om du hellre vill, kan du skapa en egen aspekt speciellt för dem du vill chatta med. När du har aspekt med chattar tillåtna, är det bara att öppna chatten och välj den du vill chatta med."
+ add_contact_roster_a: "Först av allt måste du tillåta chatt i aspekter med dem du vill chatta med. Du gör genom att gå till %{contacts_page} och väljer aspekten du vill tillåta chatt i. %{toggle_privilege} Om du hellre vill, kan du skapa en egen aspekt speciellt för dem du vill chatta med. När du har aspekt med chattar tillåtna, är det bara att öppna chatten och välj den du vill chatta med."
add_contact_roster_q: "Hur chattar jag med någon på Diaspora?"
contacts_page: "kontaktsida"
title: "Chatt"
@@ -398,14 +395,14 @@ sv:
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "I din ström kan du använda dig av dessa tangantbordsgenvägar:"
- keyboard_shortcuts_li1: "j - hoppa till nästa inlägg"
- keyboard_shortcuts_li2: "k - hoppa till föregående inlägg"
- keyboard_shortcuts_li3: "c - kommentera inlägget"
- keyboard_shortcuts_li4: "l - gilla inlägget"
- keyboard_shortcuts_li5: "r - Dela vidare inlägget"
- keyboard_shortcuts_li6: "m - Fäll ut inlägget"
- keyboard_shortcuts_li7: "o - Öppna den först förekommande länken i inlägget"
- keyboard_shortcuts_li8: "ctr + enter - Skicka meddelande"
+ keyboard_shortcuts_li1: "j – Skutta till nästa inlägg"
+ keyboard_shortcuts_li2: "k – Skutta till föregående inlägg"
+ keyboard_shortcuts_li3: "c – Kommentera inlägget"
+ keyboard_shortcuts_li4: "l – Gilla inlägget"
+ keyboard_shortcuts_li5: "r – Dela vidare inlägget"
+ keyboard_shortcuts_li6: "m – Fäll ut inlägget"
+ keyboard_shortcuts_li7: "o – Öppna den först förekommande länken i inlägget"
+ keyboard_shortcuts_li8: "Ctrl+Retur – Skicka meddelande"
keyboard_shortcuts_q: "Vilka tangentbordsgenvägar finns att tillgå?"
title: "Tangentbordsgenvägar"
markdown: "Markdown"
@@ -426,7 +423,7 @@ sv:
diaspora_app_q: "Finns det någon Diaspora*-applikation till Android och Ios?"
photo_albums_a: "Nej, inte än. Du kan däremot titta på ett flöde med någons upplagda bilder från bildsektionen, på höger sida på profilsidan."
photo_albums_q: "Finns det foto- och videoalbum?"
- subscribe_feed_a: "Ja. Det är möjligt men funktionen är inte färdigpolerad. Du kan gärna pröva funktionen ändå genom att besöka personens profilsida och trycka på flödesikonen i din webbläsare. Du kan också komma åt flödet genom att skriva in profilens adress direkt i din flödesläsare. Den resulterande adressen kommer att se ut som https://joindiaspora.com/public/användare.atom. (Diaspora* använder Atom snarare än RSS.)"
+ subscribe_feed_a: "Ja. Det är möjligt men funktionen är inte färdigpolerad. Du kan gärna pröva funktionen ändå genom att besöka personens profilsida och trycka på flödesikonen i din webbläsare. Du kan också komma åt flödet genom att skriva in profilens adress direkt i din flödesläsare. Den resulterande adressen kommer att se ut som https://podnamn.com/public/användarnamn.atom – Diaspora* använder Atom snarare än RSS."
subscribe_feed_q: "Är det möjligt att prenumerera på en persons offentliga inlägg med min flödesläsare?"
title: "Diverse"
pods:
@@ -496,7 +493,7 @@ sv:
deselect_aspect_posting_q: "Vad händer när jag tar väljer bort aspekter när jag ska göra ett offentligt inlägg?"
find_public_post_a: "Dina publika inlägg kommer att dyka upp i de strömmar som följer dig. Om du har #-taggar i dina publika inlägg kommer alla som följer taggen att se inlägget i strömmen. Varje publikt inlägg ges en specifik webbadress så att vem som helst kan komma åt det, även om de inte är inloggade. Publika inlägg kan alltså länkas till direkt från till exempel Twitter och bloggar. De publika inläggen kan då också bli indexerade av sökmotorer."
find_public_post_q: "Hur hittar man mina publika inlägg?"
- see_comment_reshare_like_a: "Alla inloggade på Diaspora* och vem som helst på Internet skulle kunna göra det. Deras kommentarer, gillanden och vidaredelningar av de publika inläggen kommer också att vara publika."
+ see_comment_reshare_like_a: "Kommentarer, gillanden och vidaredelningar av publika inlägg kommer att vara publika. Alla inloggade på Diaspora* och vem som helst på Internet skulle dina interaktioner med ett publikt inlägg."
see_comment_reshare_like_q: "Vilka ser när jag kommenterar, delar eller gillar ett publikt inlägg?"
title: "Publika inlägg"
who_sees_post_a: "Vem som helst med Internetuppkoppling kan potentiellt se dina publika inlägg. Var därför noga med att du verkligen vill att dina publika inlägg skall vara publika. Det är bra sätt komma i kontakt med resten av världen."
@@ -512,14 +509,14 @@ sv:
who_sees_updates_a: "Alla kan se ändringarna du gör, givet att de besöker din sida."
who_sees_updates_q: "Vilka ser uppdateringar av min offentliga profilsida?"
resharing_posts:
- reshare_private_post_aspects_a: "Nej. Det är inte möjligt att dela vidare privata inlägg. Med respekt för upphovspersonen kan inlägget bara ses av dem personen själv vill."
+ reshare_private_post_aspects_a: "Nej, det är inte möjligt att dela vidare privata inlägg. Med hänsyn för upphovspersonen, kan inlägget bara ses av dem personen själv vill."
reshare_private_post_aspects_q: "Kan jag dela vidare privata inlägg till specifika aspekter?"
reshare_public_post_aspects_a: "Nej. När du delar med dig av publika inlägg kommer de automatiskt att bli ett av dina inlägg. För att bara dela med dig till särskilda aspekter kan du kopiera inläggets innehåll och göra ett eget nytt inlägg."
reshare_public_post_aspects_q: "Kan jag dela vidare ett publikt inlägg till specifika aspekter?"
title: "Vidaredelning av inlägg"
sharing:
add_to_aspect_a1: "Låt oss säga att Anna lägger till Bengt till en aspekt, men Bengt har ännu inte lagt till Anna till en aspekt:"
- add_to_aspect_a2: "Detta kallas för asymmetrisk delning. Om Bengt skulle lägga till Anna i en av hans aspekter, skulle det vara ömsesidigt delning. Då ser de båda varandras alla publika och berörda privata inlägg i sina flöden. "
+ add_to_aspect_a2: "Detta kallas för asymmetrisk delning. Om Bengt skulle lägga till Anna i en av hans aspekter, skulle det vara ömsesidigt delning. Då ser de båda varandras alla publika och berörda privata inlägg i sina flöden. De får även sända varandra privata meddelanden."
add_to_aspect_li1: "Bengt kommer att få en notifiering om att Anna har börjat dela inlägg till honom."
add_to_aspect_li2: "Anna kommer att se Bengts publika inlägg i hennes flöde."
add_to_aspect_li3: "Anna kommer inte att få se några av Bengts privata inlägg."
@@ -529,10 +526,10 @@ sv:
add_to_aspect_li7: "Anna kommer synas under \"Delar enbart med mig\" på Bengts kontaktsida."
add_to_aspect_li8: "Amalia kommer också kunna @-nämna Benjamin i ett inlägg."
add_to_aspect_q: "Vad händer när jag lägger till en person i en aspekt och när någon lägger till mig till en av deras aspekter?"
- list_not_sharing_a: "Nej. Du kan däremot besöka personers profilsidor för att se om de delar med sig till dig. Om de gör det, kommer listen under deras profilbild att vara grön; annars vore den grå. Du borde få en notifiering varje gång börjar dela med sig till dig."
+ list_not_sharing_a: "Nej. Du kan däremot besöka personers profilsidor för att se om de delar med sig till dig. Om de gör det, kommer listen under deras profilbild att vara grön; annars vore den grå."
list_not_sharing_q: "Finns det någon lista med personer vilka jag har lagt till aspekter, men som inte har mig i någon av deras?"
only_sharing_a: "Det är personer som har lagt till dig i deras aspekter men som du inte än har lagt till i någon av dina aspekter. Med andra ord, delar de med sig till dig med du inte med dem (asymmetrisk delning). Skulle du lägga till någon i en aspekt, skulle den personen synas i sin aspekt och inte i \"Delar enbart med mig\". Se ovan."
- only_sharing_q: "Vilka personer syns i \"Delar enbart med mig\" på min kontaktsida?"
+ only_sharing_q: "Vilka personer syns under \"Delar enbart med mig\" på min kontaktsida?"
see_old_posts_a: "Nej. De kommer bara att kunna se de nya inläggen du gör. De kan givetvis se dina gamla offentliga inlägg, precis som alla andra."
see_old_posts_q: "Kan personer jag lägg till i mina aspekter se de äldre inläggen jag gjort till aspekten?"
sharing_notification_a: "Du borde få en notifikation varje gång någon delar med sig åt dig."
@@ -541,14 +538,14 @@ sv:
tags:
filter_tags_a: "Det är inte ännu inte möjligt att utföra i Diaspora*. Men något %{third_party_tools} kan finnas som stödjer denna funktion."
filter_tags_q: "Hur filtrerar jag bort några av taggarna från mitt flöde?"
- followed_tags_a: "När du sökt en tag kan du trycka på knappen överst på taggens sida för att följa taggen. Då kommer då synas till vänster med andra taggar du följer. Trycker du på någon tag i listan hamnar du på taggens sida och kommer att se de senaste inläggen med taggen. Tryck \"#Följda taggar\" för att se ett flöde med alla taggar du följer. "
- followed_tags_q: "Vad är \"#Följda taggar\" och hur följer man en tag?"
+ followed_tags_a: "När du sökt en tagg kan du trycka på knappen överst på taggens sida för att följa taggen. Då kommer då synas till vänster med andra taggar du följer. Trycker du på någon tagg i listan hamnar du på taggens sida och kommer att se de senaste inläggen med taggen. Tryck \"#Följda taggar\" för att se ett flöde med alla taggar du följer."
+ followed_tags_q: "Vad är \"#Följda taggar\" och hur följer man en tagg?"
people_tag_page_a: "Det är personer som lagt till taggen i sin beskrivning på sin publika profilsida."
people_tag_page_q: "Vilka är personerna till vänster på taggens sida?"
- tags_in_comments_a: "En tag på en kommentar kommer att synas som en länk till taggens sida, men det får varken kommentaren eller inlägget i sig att synas på taggens sida. Bara inläggstaggar syns på taggarnas sidor."
+ tags_in_comments_a: "En fyrkantstagg på en kommentar kommer att synas som en länk till taggens sida, men det får varken kommentaren eller inlägget i sig att synas på taggens sida. Bara taggar i inlägg syns på taggens sida."
tags_in_comments_q: "Kan jag sätta taggar på kommentarer eller går det bara i inlägg?"
title: "Taggar"
- what_are_tags_for_a: "Taggarna är ett sätt att kategorisera inlägg efter ämne. Genom att söka på en särskild tag kommer alla inlägg med den taggen att visas, både de publika och de privata till dig. På så vis kan man hitta inlägg som intresserar en."
+ what_are_tags_for_a: "Taggarna är ett sätt att kategorisera inlägg efter ämne. Genom att söka på en särskild tagg kommer alla inlägg med den taggen att visas, både de publika och de privata till dig. På så vis kan man hitta inlägg som intresserar en."
what_are_tags_for_q: "Vad är taggarna till för?"
third_party_tools: "Tredjepartsverktyg"
title_header: "Hjälp"
@@ -675,8 +672,8 @@ sv:
no_notifications: "Du har inga notifikationer ännu."
notifications: "Notiser"
reshared: "Återdelad"
- show_all: "visa alla"
- show_unread: "visa olästa"
+ show_all: "Visa alla"
+ show_unread: "Visa olästa"
started_sharing: "Började dela"
liked:
one: "%{actors} gillar din %{post_link}."
@@ -712,7 +709,7 @@ sv:
other: "%{actors} har börjat att dela med dig."
zero: "ingen delar ännu något med dig."
notifier:
- a_limited_post_comment: "Du har en ny kommentar till ett begränsat inlägg på Diaspora* att spana in."
+ a_limited_post_comment: "Du har en ny kommentar till ett begränsat inlägg på Diaspora*."
a_post_you_shared: "ett inlägg."
a_private_message: "Du har fått ett nytt privat meddelande på Diaspora*."
accept_invite: "Acceptera din Diaspora*-inbjudan!"
@@ -741,11 +738,11 @@ sv:
Hej %{name}
Vi har stött på ett problem medan vi behandlade din personliga data för nedladdning.
- Var god försök igen!
+ Var god försök igen.
Tack och hej,
- Diasporas e-postbot!    
+ Diasporas mejlrobot!
subject: "Förlåt oss, det dök upp ett problem med din data, %{name}"
export_photos_email:
body: |-
@@ -801,11 +798,11 @@ sv:
reply_to_or_view: "Svara på eller läs denna konversation >"
remove_old_user:
body: |-
- Hej,
+ Hej.
- På grund av inaktivitet i ditt Diaspora*-konto på %{pod_url} vill vi meddela att ditt konto automatiskt har blivit märkt för borttagning. Detta sker automatiskt när ett konto har varit inaktivt i %{after_days} dagar.
+ På grund av inaktivitet på ditt Diaspora*-konto på podden %{pod_url} vill vi meddela att ditt konto automatiskt har blivit märkts för borttagning. Detta sker automatiskt när ett konto har varit inaktivt i %{after_days} dagar.
- Vi ser gärna att du förblir en del av Diaspora*-gemenskapen och behåller ditt konto.
+ Vi ser gärna att du förblir en del av Diaspora*-gemenskapen och behåller ditt konto vid liv.
Du kan undvika dataförluster genom att logga in på kontot innan det automatiskt tas bort %{remove_after}. Ta gärna en ordentlig titt på Diaspora* nu, för mycket har ändrats sedan du senast loggade in. Vi hoppas att du kommer att gilla de ändringar vi har gjort. Följ några #taggar för att intressant material.
@@ -813,7 +810,7 @@ sv:
Hoppas att vi kan ses igen,
- Diaspora*'s mejlrobot!
+ Diasporas mejlrobot!
subject: "Ditt Diaspora*-konto har blivit märkt för att tas bort på grund av passivitet."
report_email:
body: |-
@@ -971,7 +968,7 @@ sv:
first_name: "Förnamn"
last_name: "Efternamn"
nsfw_check: "Markera allting som jag delar som olämpligt för arbetsplatser (NSFW)"
- nsfw_explanation: "NSFW (\"not safe for work\", inte arbetsplatslämpat) är Diasporas självständiga samfund för innehåll som kanske inte passar sig på arbetsplatser. Om du har planer på att ofta dela med dig av material som är av denna natur, var god och använd inställningen så att dina inlägg döljs i personers strömmar, tills de själva väljer att se inläggen."
+ nsfw_explanation: "NSFW (\"not safe for work\", inte arbetsplatslämpligt) är Diasporas självständiga samfund för innehåll som kanske inte passar sig på arbetsplatser. Om du har planer på att ofta dela med dig av material som är av denna natur, var god och använd inställningen så att dina inlägg döljs i personers strömmar, tills de själva väljer att se inläggen."
nsfw_explanation2: "Om du inte använder inställningen, var god och använd taggen #nsfw när du delar sådant material."
update_profile: "Uppdatera profil"
your_bio: "Din biografi"
@@ -1176,7 +1173,7 @@ sv:
posting: "Skickar..."
preview: "Förhandsgranska"
publishing_to: "Publiceras på: "
- remove_location: "Borttag plats"
+ remove_location: "Ta bort platsen"
share: "Dela"
share_with: "Dela med"
upload_photos: "Ladda upp foton"
diff --git a/config/locales/diaspora/te.yml b/config/locales/diaspora/te.yml
index b0b592e00..8f5d13a46 100644
--- a/config/locales/diaspora/te.yml
+++ b/config/locales/diaspora/te.yml
@@ -43,14 +43,11 @@ te:
taken: "ఇప్పటికే తిసుకోబడినది"
admins:
admin_bar:
- correlations: "సహసంబంధాలు"
pages: "పుటలు"
pod_stats: "పాడ్ గణాంకాలు"
report: "నివేదికలు"
user_search: "వాడుకరి శోధన"
weekly_user_stats: "వారపు వాడుకరి గణాంకాలు"
- correlations:
- correlations_count: "ప్రవేశ సంఖ్యతో సహసంబంధాలు"
stats:
2weeks: "2 వారాలు"
50_most: "50 ప్రజాదరణ పొందిన కొసలు"
diff --git a/config/locales/diaspora/tr.yml b/config/locales/diaspora/tr.yml
index f5183c101..3b9d7025a 100644
--- a/config/locales/diaspora/tr.yml
+++ b/config/locales/diaspora/tr.yml
@@ -44,14 +44,11 @@ tr:
taken: "önceden alınmış."
admins:
admin_bar:
- correlations: "Bağıntılar"
pages: "Sayfalar"
pod_stats: "Pod İstatistikleri"
sidekiq_monitor: "Sidekiq göstergesi"
user_search: "Kullanıcı Arama"
weekly_user_stats: "Haftalık Kullanıcı İstatistikleri"
- correlations:
- correlations_count: "Giriş Sayısı ile Bağıntılar:"
stats:
2weeks: "2 Hafta"
50_most: "En popüler 50 etiket"
diff --git a/config/locales/diaspora/uk.yml b/config/locales/diaspora/uk.yml
index 6946e2a5c..62df37b2c 100644
--- a/config/locales/diaspora/uk.yml
+++ b/config/locales/diaspora/uk.yml
@@ -53,15 +53,12 @@ uk:
taken: "вже зайнято."
admins:
admin_bar:
- correlations: "Кореляція"
pages: "Сторінки"
pod_stats: "Статистика сервера"
report: "Доноси"
sidekiq_monitor: "Монітор Sidekiq"
user_search: "Пошук користувачів"
weekly_user_stats: "Щотижнева статистика користувачів"
- correlations:
- correlations_count: "Зв'язок з числом входів:"
stats:
2weeks: "2 тижні"
50_most: "50 найпопулярніших міток"
diff --git a/config/locales/diaspora/vi.yml b/config/locales/diaspora/vi.yml
index fbb4a4a3a..3e262e4c7 100644
--- a/config/locales/diaspora/vi.yml
+++ b/config/locales/diaspora/vi.yml
@@ -43,12 +43,9 @@ vi:
taken: "đã được thực hiện."
admins:
admin_bar:
- correlations: "Tương quan"
pages: "Trang"
user_search: "Tìm người dùng"
weekly_user_stats: "Thống kê người dùng hàng tuần"
- correlations:
- correlations_count: "Tương quan với số lần đăng nhập"
stats:
2weeks: "2 tuần"
50_most: "50 thẻ phổ biến nhất"
diff --git a/config/locales/diaspora/zh-CN.yml b/config/locales/diaspora/zh-CN.yml
index d356b645a..f75c74613 100644
--- a/config/locales/diaspora/zh-CN.yml
+++ b/config/locales/diaspora/zh-CN.yml
@@ -42,13 +42,10 @@ zh-CN:
taken: "已被注册。"
admins:
admin_bar:
- correlations: "关联"
pages: "分页"
pod_stats: "Pod 统计资料"
user_search: "搜索用户"
weekly_user_stats: "用户统计周报"
- correlations:
- correlations_count: "与登入次数的关系"
stats:
2weeks: "两周"
50_most: "50个最流行的标签"
diff --git a/config/locales/diaspora/zh-TW.yml b/config/locales/diaspora/zh-TW.yml
index e157ccffa..ef46063fa 100644
--- a/config/locales/diaspora/zh-TW.yml
+++ b/config/locales/diaspora/zh-TW.yml
@@ -53,15 +53,12 @@ zh-TW:
taken: "已經有人使用。"
admins:
admin_bar:
- correlations: "關聯性"
pages: "分頁"
pod_stats: "豆莢統計資料"
report: "回報"
sidekiq_monitor: "Sidekiq 監視器"
user_search: "使用者搜尋"
weekly_user_stats: "使用者統計週報"
- correlations:
- correlations_count: "與登入次數間的關聯"
stats:
2weeks: "兩個禮拜"
50_most: "最夯的50個標籤"
diff --git a/config/locales/javascript/javascript.cs.yml b/config/locales/javascript/javascript.cs.yml
index 87d053427..5f96e9926 100644
--- a/config/locales/javascript/javascript.cs.yml
+++ b/config/locales/javascript/javascript.cs.yml
@@ -56,6 +56,8 @@ cs:
remove_contact: "Odstraň kontakt"
search_no_results: "Nenalezeny žádné kontakty"
conversation:
+ new:
+ no_contacts: "Musíte si přidat nějaké kontakty, než budete moci začít konveraci."
participants: "Účastníci"
create: "Vytvořit"
delete: "Odstranit"
diff --git a/config/locales/javascript/javascript.da.yml b/config/locales/javascript/javascript.da.yml
index 78fd5e88d..68620c6e4 100644
--- a/config/locales/javascript/javascript.da.yml
+++ b/config/locales/javascript/javascript.da.yml
@@ -58,6 +58,8 @@ da:
remove_contact: "Fjern kontakt"
search_no_results: "Ingen kontakter fundet"
conversation:
+ new:
+ no_contacts: "Du skal tilføje en eller flere kontakter før du kan starte en samtale."
participants: "Deltagere"
create: "Opret"
delete: "Slet"
diff --git a/config/locales/javascript/javascript.de.yml b/config/locales/javascript/javascript.de.yml
index e0e8eab4b..88b3fedc0 100644
--- a/config/locales/javascript/javascript.de.yml
+++ b/config/locales/javascript/javascript.de.yml
@@ -58,6 +58,8 @@ de:
remove_contact: "Kontakt entfernen"
search_no_results: "Keine Kontakte gefunden"
conversation:
+ new:
+ no_contacts: "Du musst einige Kontakte hinzufügen, bevor du eine Konversation anfangen kannst."
participants: "Teilnehmer"
create: "Erstellen"
delete: "Löschen"
diff --git a/config/locales/javascript/javascript.de_formal.yml b/config/locales/javascript/javascript.de_formal.yml
index 7f2c9a942..ca9223a84 100644
--- a/config/locales/javascript/javascript.de_formal.yml
+++ b/config/locales/javascript/javascript.de_formal.yml
@@ -55,6 +55,8 @@ de_formal:
remove_contact: "Kontakt entfernen"
search_no_results: "Keine Kontakte gefunden"
conversation:
+ new:
+ no_contacts: "Sie müssen einige Kontakte hinzufügen, bevor Sie eine Konversation anfangen können."
participants: "Teilnehmer"
create: "Erstellen"
delete: "Löschen"
diff --git a/config/locales/javascript/javascript.el.yml b/config/locales/javascript/javascript.el.yml
index 82af79bb1..4833dcfd3 100644
--- a/config/locales/javascript/javascript.el.yml
+++ b/config/locales/javascript/javascript.el.yml
@@ -10,7 +10,7 @@ el:
aspect_dropdown:
add_to_aspect: "Προσθήκη επαφής"
all_aspects: "Όλες οι πτυχές"
- error: "Δεν μπορεί να ξεκινήσει ο διαμοιρασμός με το χρήστη <%= name %>. Μήπως τον αγνοείτε;"
+ error: "Δεν μπορεί να ξεκινήσει ο διαμοιρασμός με το χρήστη <%= name %>. Μήπως τον αγνοείς;"
error_remove: "Αδύνατη η αφαίρεση του <%= name %> από την πτυχή :("
select_aspects: "Επιλογή πτυχών"
started_sharing_with: "Ξεκινήσατε να διαμοιράζεστε με τον χρήστη <%= name %>!"
@@ -64,7 +64,7 @@ el:
infinite_scroll:
no_more: "Δεν υπάρχουν άλλες δημοσιεύσεις."
my_activity: "Η δραστηριότητα μου"
- my_aspects: "Οι Πτυχές μου"
+ my_aspects: "Οι πτυχές μου"
my_stream: "Ροή"
no_results: "Δεν βρέθηκαν αποτελέσματα"
people:
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index d856b716f..c7f01c680 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -158,6 +158,8 @@ en:
conversation:
participants: "Participants"
+ new:
+ no_contacts: "You need to add some contacts before you can start a conversation."
notifications:
mark_read: "Mark read"
diff --git a/config/locales/javascript/javascript.es-AR.yml b/config/locales/javascript/javascript.es-AR.yml
index b60ec7f33..939bc210a 100644
--- a/config/locales/javascript/javascript.es-AR.yml
+++ b/config/locales/javascript/javascript.es-AR.yml
@@ -31,6 +31,8 @@ es-AR:
create:
add_a_new_aspect: "Agregar un nuevo aspecto"
failure: "Error al crear el aspecto."
+ success: "Tu nuevo aspecto <%= name %> fue creado"
+ make_aspect_list_visible: "¿Hacer visible los contactos de este aspecto entre ellos?"
name: "Nombre"
bookmarklet:
post_something: "Publicar en diaspora*"
@@ -53,6 +55,8 @@ es-AR:
remove_contact: "Eliminar contacto"
search_no_results: "No se han encontrado contactos con ese nombre."
conversation:
+ new:
+ no_contacts: "Necesitas agregar algunos contactos antes de iniciar una conversación."
participants: "Participantes"
create: "Crear"
delete: "Borrar"
@@ -189,8 +193,11 @@ es-AR:
show_nsfw_posts: "Mostrar todo"
tags:
follow: "Seguir #<%= tag %>"
+ follow_error: "No se pudo seguir la etiqueta #<%= tag %> :("
following: "Siguiendo #<%= tag %>"
stop_following: "Dejar de seguir #<%= tag %>"
+ stop_following_confirm: "¿Dejar de seguir la etiqueta #<%= tag %>?"
+ stop_following_error: "No se pudo dejar de seguir la etiqueta #<%= tag %> :("
unfollow: "Dejar de seguir"
unlike: "No me gusta"
via: "via <%= provider %>"
diff --git a/config/locales/javascript/javascript.es-VE.yml b/config/locales/javascript/javascript.es-VE.yml
index 12661b0c3..393678fd6 100644
--- a/config/locales/javascript/javascript.es-VE.yml
+++ b/config/locales/javascript/javascript.es-VE.yml
@@ -6,6 +6,7 @@
es-VE:
javascripts:
+ and: "y"
aspect_dropdown:
add_to_aspect: "Añadir contacto"
all_aspects: "Todos los aspectos"
@@ -21,6 +22,7 @@ es-VE:
two: "En <%= count %> aspectos"
zero: "Seleccionar aspectos"
aspect_navigation:
+ add_an_aspect: "+ Añade un aspecto"
deselect_all: "Desmarcar todos"
no_aspects: "No hay aspectos seleccionados"
select_all: "Marcar todos"
@@ -57,13 +59,39 @@ es-VE:
my_activity: "Mi Actividad"
my_stream: "Entrada"
people:
+ edit_my_profile: "Editar mi perfil"
not_found: "...no se encontró a nadie."
photo_uploader:
looking_good: "¡Genial, estás increíble!"
+ poll:
+ close_result: "Ocultar resultado"
+ count:
+ one: "<%=count%> por ahora"
+ other: "<%=count%> votos por ahora"
+ go_to_original_post: "Puedes participar en esta encuesta en <%= original_post_link %>."
+ original_post: "Publicación original"
+ result: "Resultado"
+ show_result: "Mostrar resultado"
+ vote: "Votar"
+ profile:
+ add_some: "Añade algo"
+ bio: "Biografía"
+ born: "Cumpleaños"
+ contacts: "Contactos"
+ edit: "Editar"
+ gender: "Sexo"
+ ignoring: "Estás ignorando todas las publicaciones de <%= name %>."
+ location: "Ubicación"
+ photos: "Fotos"
+ posts: "Mensajes"
+ you_have_no_tags: "¡no tienes etiquetas!"
publisher:
+ add_option: "Añade una respuesta"
at_least_one_aspect: "Debes publicarlo al menos en un aspecto"
limited: "Limitado - tu publicación solo es visible para gente con quien compartes"
+ option: "Respuesta"
public: "Público - tu publicación es visible para todos, los buscadores podrán encontrarla."
+ question: "Pregunta"
reshares:
duplicate: "Que bueno, ¿eh? ¡Ya has compartido esa publicación!"
post: "¿Compartir la publicación de <%= name %>?"
@@ -94,6 +122,13 @@ es-VE:
zero: "Compartido <%= count %> veces"
show_nsfw_post: "Mostrar publicación"
show_nsfw_posts: "Mostrar todo"
+ tags:
+ follow: "Seguir #<%= tag %>"
+ follow_error: "No se pudo seguir #<%= tag %> :("
+ following: "Siguiendo #<%= tag %>"
+ stop_following: "Dejar de seguir #<%= tag %>"
+ stop_following_confirm: "Dejar de seguir #<%= tag %>?"
+ stop_following_error: "No se pudo dejar de seguir #<%= tag %> :("
unfollow: "Dejar de seguir"
unlike: "No me gusta"
tags:
diff --git a/config/locales/javascript/javascript.es.yml b/config/locales/javascript/javascript.es.yml
index ff0cab4ca..8099e7e78 100644
--- a/config/locales/javascript/javascript.es.yml
+++ b/config/locales/javascript/javascript.es.yml
@@ -55,6 +55,8 @@ es:
remove_contact: "Eliminar contacto"
search_no_results: "No se encontraron contactos"
conversation:
+ new:
+ no_contacts: "Necesitas añadir algún contacto antes de empezar una conversación."
participants: "Participantes"
create: "Crear"
delete: "Eliminar"
diff --git a/config/locales/javascript/javascript.fr.yml b/config/locales/javascript/javascript.fr.yml
index 6cba00e5a..53e310445 100644
--- a/config/locales/javascript/javascript.fr.yml
+++ b/config/locales/javascript/javascript.fr.yml
@@ -55,6 +55,8 @@ fr:
remove_contact: "Retirer ce contact"
search_no_results: "Aucun contact trouvé"
conversation:
+ new:
+ no_contacts: "Vous devez ajouter des contacts avant de pouvoir démarrer une conversation."
participants: "Participants"
create: "Créer"
delete: "Effacer"
diff --git a/config/locales/javascript/javascript.hy.yml b/config/locales/javascript/javascript.hy.yml
index 20c3399bf..90d030dda 100644
--- a/config/locales/javascript/javascript.hy.yml
+++ b/config/locales/javascript/javascript.hy.yml
@@ -19,7 +19,7 @@ hy:
stopped_sharing_with: "Դու այլևս չես կիսվում <%= name %>-ի հետ։"
toggle:
one: "<%= count %> խմբում"
- other: "<%= count %> խմբերում"
+ other: "<%= count %> խմբում"
zero: "Ընտրել խմբերը"
updating: "թարմացվում է․․․"
aspect_navigation:
@@ -53,8 +53,10 @@ hy:
error_add: "Չստացվեց <%= name %>ին ավելացնել խմբում։ Ափսո՜ս։"
error_remove: "Չստացվեց հեռացնել <%= name %>ին խմբից։ Ստիպված ես էլի դիմանալ։ ։Չ"
remove_contact: "Հեռացնել"
- search_no_results: "Ոչ մեկ չգտնվեց"
+ search_no_results: "Ոչ ոք չգտնվեց"
conversation:
+ new:
+ no_contacts: "Նախքան զրույց սկսելը պետք է գոնե մեկին ավելացնես։"
participants: "Մասնակիցներ"
create: "Ստեղծել"
delete: "Ջնջել"
@@ -64,14 +66,14 @@ hy:
failed_to_remove: "Չստացվեց ջնջել մուտքագրածը։"
failed_to_reshare: "Չստացվեց տարածել"
getting_started:
- alright_ill_wait: "Լավ, ես կսպասեմ։"
+ alright_ill_wait: "Դե լավ, ես կսպասեմ։"
hey: "Հե՜յ, <%= name %>։"
- no_tags: "Հե՜յ, հետևելու ոչ մի պիտակ չնշեցիր։  Շարունակե՞լ։"
+ no_tags: "Հե՜յ, ոչ մի պիտակ չնշեցիր։  Շարունակե՞նք ամեն դեպքում։"
preparing_your_stream: "Նախապատրաստում ենք քո անհատական լրահոսը..."
header:
admin: "Ադմին"
close: "Փակել"
- contacts: "Կոնտակտներ"
+ contacts: "Կապեր"
conversations: "Զրույցներ"
help: "Օգնություն"
home: "Գլխավոր էջ"
@@ -82,7 +84,7 @@ hy:
recent_notifications: "Վերջին ծանուցումները"
search: "Որոնում"
settings: "Կարգավորումներ"
- view_all: "Ցույցադրել ամբողջը"
+ view_all: "Ցուցադրել ամբողջը"
hide_post: "Թաքցնե՞լ այս գրառումը։"
hide_post_failed: "Չստացվեց թաքցնել այս գրառումը"
ignore: "Արհամարհել"
@@ -90,7 +92,7 @@ hy:
ignore_user: "Արհամարհե՞լ այս օգտատիրոջը։"
infinite_scroll:
no_more: "Գրառումներ էլ չկան։"
- no_more_contacts: "Էլ ընկերներ չկան։"
+ no_more_contacts: "Էլ մարդ չկա։"
my_activity: "Իմ գործունեությունը"
my_aspects: "Իմ խմբերը"
my_stream: "Լրահոս"
@@ -128,7 +130,7 @@ hy:
add_some: "Ավելացնե՞լ"
bio: "Մասին"
born: "Ծննդյան ամսաթիվ"
- contacts: "Ընկերներ"
+ contacts: "Կապեր"
edit: "Փոփոխել"
gender: "Սեռ"
ignoring: "Դու արհամարհում ես <%= name %>-ի բոլոր գրառումները։"
diff --git a/config/locales/javascript/javascript.nb.yml b/config/locales/javascript/javascript.nb.yml
index 0c8954cd2..a4af5189a 100644
--- a/config/locales/javascript/javascript.nb.yml
+++ b/config/locales/javascript/javascript.nb.yml
@@ -12,6 +12,8 @@ nb:
all_aspects: "Alle kategorier"
error: "Kunne ikke begynne å dele med <%= name %>. Ignorerer du dem?"
error_remove: "Kunne ikke flytte <%= name %> fra aspektet :("
+ mobile_row_checked: "<%= name %> (fjern)"
+ mobile_row_unchecked: "<%= name %> (legg til)"
select_aspects: "Velg kategori"
started_sharing_with: "Du har begynt å dele med <%= name %>!"
stopped_sharing_with: "Du har sluttet å dele med <%= name %>."
@@ -19,33 +21,55 @@ nb:
one: "I <%= count %> kategori"
other: "I <%= count %> kategorier"
zero: "Legg til kategori"
+ updating: "oppdaterer ..."
aspect_navigation:
add_an_aspect: "+ Legg til et aspekt"
deselect_all: "Avmerk alle"
no_aspects: "Ingen kategorier valgt"
select_all: "Merk alle"
+ aspects:
+ create:
+ add_a_new_aspect: "Legg til et nytt aspekt"
+ failure: "Kunne ikke opprette aspektet."
+ success: "Ditt nye aspekt <%= name %> ble opprettet"
+ make_aspect_list_visible: "Gjør kontakter i dette aspektet synlig for hverandre"
+ name: "Navn"
bookmarklet:
post_something: "Post noe på Diaspora"
post_submit: "Sender innlegg..."
post_success: "Lukker popup vinduet..."
+ cancel: "Avbryt"
comma: ","
comments:
hide: "skjul kommentarer"
no_comments: "Det finnes ingen kommentarer ennå."
show: "vis alle kommentarer"
confirm_dialog: "Er du sikker?"
+ confirm_unload: "Bekreft at du ønsker å forlate denne siden. Data du har lagt inn vil ikke bli lagret."
+ contacts:
+ add_contact: "Legg til kontakt"
+ aspect_list_is_not_visible: "Kontakter i dette aspektet har ikke mulighet til å se hverandre"
+ aspect_list_is_visible: "Kontakter i dette aspektet har mulighet til å se hverandre"
+ error_add: "Kunne ikke legge til <%= name %> til aspektet :("
+ error_remove: "Kunne ikke fjerne <%= name %> fra aspektet :("
+ remove_contact: "Fjern kontakt"
+ search_no_results: "Ingen kontakter funnet"
conversation:
+ new:
+ no_contacts: "Du må legge til noen kontakter før du kan starte en samtale."
participants: "Deltakere"
+ create: "Lag"
delete: "Slett"
edit: "Rediger"
failed_to_like: "Klarte ikke å like!"
failed_to_post_message: "Klarte ikke å publisere post!"
failed_to_remove: "Noe gikk galt i forsøket på å fjerne innlegget!"
+ failed_to_reshare: "Kunne ikke videredele"
getting_started:
alright_ill_wait: "Greit, jeg venter."
hey: "Hei, <%= name %>!"
no_tags: "Hei, du har ikke fulgt noen tagger! Fortsett likevel?"
- preparing_your_stream: "Forbereder din personlige stream ..."
+ preparing_your_stream: "Forbereder din personlige strøm ..."
header:
admin: "Admin"
close: "lukk"
@@ -61,20 +85,30 @@ nb:
search: "Søk"
settings: "Innstillinger"
view_all: "Vis alle"
+ hide_post: "Gjem dette innlegget?"
+ hide_post_failed: "Kunne ikke gjemme dette innlegget"
ignore: "Ignorer"
ignore_failed: "Ikke mulig å ignorere brukeren"
ignore_user: "Overse denne brukeren?"
infinite_scroll:
no_more: "Ingen flere innlegg."
no_more_contacts: "Ingen flere kontakter."
- my_activity: "Min Aktivitet"
- my_aspects: "Mine Aspekter"
- my_stream: "Stream"
+ my_activity: "Min aktivitet"
+ my_aspects: "Mine aspekter"
+ my_stream: "Strøm"
+ no_results: "Ingen resultater funnet"
notifications:
mark_read: "Merk som lest"
mark_unread: "Merk som ulest"
people:
+ edit_my_profile: "Endre profilen min"
+ helper:
+ is_not_sharing: "<%= name %> deler ikke med deg"
+ is_sharing: "<%= name %> deler med deg"
+ mention: "Omtale"
+ message: "Melding"
not_found: "og ingen ble funnet ..."
+ stop_ignoring: "Slutt å ignorere"
photo_uploader:
completed: "<%= file %> ferdig"
empty: "{file} er tom, vennligst velg filer igjen uten å bruke den."
@@ -88,9 +122,23 @@ nb:
one: "1 stemme til nå"
other: "<%=count%> stemmer til nå"
zero: "ingen stemmer til nå"
+ go_to_original_post: "Du kan delta i denne spørreundersøkelsen på <%= original_post_link %>."
+ original_post: "opprinnelig innlegg"
result: "Resultat"
show_result: "Vis resultat"
vote: "Stem"
+ profile:
+ add_some: "Legg til noen"
+ bio: "Biografi"
+ born: "Fødselsdag"
+ contacts: "Kontakter"
+ edit: "Endre"
+ gender: "Kjønn"
+ ignoring: "Du vil ignorere alle innlegg fra <%= name %>."
+ location: "Lokasjon"
+ photos: "Bilder"
+ posts: "Innlegg"
+ you_have_no_tags: "Du har ingen tagger!"
publisher:
add_option: "Legg til valg"
at_least_one_aspect: "Du må poste til minst ett aspekt"
@@ -99,6 +147,7 @@ nb:
option: "Valg <%= nr %>"
public: "Offentlig - posten din vil være synlig for alle og kan bli funnet av søkemotorer"
question: "Spørsmål"
+ remove_post: "Fjern dette innlegget?"
report:
name: "Rapport"
prompt: "Angi en årsak:"
@@ -114,12 +163,14 @@ nb:
show_more: "vis mer"
stream:
comment: "Kommenter"
+ disable_post_notifications: "Slå av varslinger for dette innlegget"
+ enable_post_notifications: "Slå på varslinger for dette innlegget"
follow: "Følg"
followed_tag:
add_a_tag: "Legg til en tag"
- contacts_title: "Folk som liker disse tag'ene"
+ contacts_title: "Folk som liker disse taggene"
follow: "Følg"
- title: "#Fulgte tag'er"
+ title: "#Fulgte tagger"
hide: "Skjul"
hide_nsfw_posts: "Gjem #nsfw-posts"
like: "Liker"
@@ -143,8 +194,11 @@ nb:
show_nsfw_posts: "Vis alle"
tags:
follow: "Følg #<%= tag %>"
+ follow_error: "Kunne ikke følge #<%= tag %>"
following: "Følger #<%= tag %>"
stop_following: "Stopp å følge #<%= tag %>"
+ stop_following_confirm: "Slutt å følge #<%= tag %>"
+ stop_following_error: "Kunne ikke slutte å følge #<%= tag %>"
unfollow: "Ikke følg"
unlike: "Liker ikke"
via: "via <%= provider %>"
@@ -164,9 +218,10 @@ nb:
seconds: "under ett minutt"
suffixAgo: "siden"
suffixFromNow: "fra nå"
- wordSeparator: " javascripts.timeago.wordSeparator "
+ wordSeparator: " "
year: "ca. et år"
years: "%d år"
+ unblock_failed: "Feilet i å stoppe blokkering"
videos:
unknown: "Ukjent videotype"
watch: "Se denne videoen på <%= provider %>"
diff --git a/config/locales/javascript/javascript.nl.yml b/config/locales/javascript/javascript.nl.yml
index 7a9ebd09f..ee35b76e0 100644
--- a/config/locales/javascript/javascript.nl.yml
+++ b/config/locales/javascript/javascript.nl.yml
@@ -58,6 +58,8 @@ nl:
remove_contact: "Verwijder contact"
search_no_results: "geen contactpersonen gevonden"
conversation:
+ new:
+ no_contacts: "Je moet een paar contactpersonen opgeven om een conversatie te kunnen starten."
participants: "Deelnemers"
create: "Creëren"
delete: "Verwijder"
diff --git a/config/locales/javascript/javascript.pl.yml b/config/locales/javascript/javascript.pl.yml
index cc261e1df..42ad59fd8 100644
--- a/config/locales/javascript/javascript.pl.yml
+++ b/config/locales/javascript/javascript.pl.yml
@@ -58,6 +58,8 @@ pl:
remove_contact: "Usuń kontakt"
search_no_results: "Nie znaleziono użytkowników"
conversation:
+ new:
+ no_contacts: "Przed rozpoczęciem rozmowy musisz dodać kontakty"
participants: "Uczestnicy"
create: "Utwórz"
delete: "Usuń"
diff --git a/config/locales/javascript/javascript.sv.yml b/config/locales/javascript/javascript.sv.yml
index b54a7c7f9..04f42007f 100644
--- a/config/locales/javascript/javascript.sv.yml
+++ b/config/locales/javascript/javascript.sv.yml
@@ -11,7 +11,7 @@ sv:
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_remove: "Kunde ej ta bort <%= name %> från aspekten :("
+ error_remove: "Kunde ej ta bort <%= name %> från aspekten :-("
mobile_row_checked: "<%= name %> (ta bort)"
mobile_row_unchecked: "<%= name %> (lägg till)"
select_aspects: "Välj aspekter"
@@ -44,9 +44,9 @@ sv:
cancel: "Avbryt"
comma: ","
comments:
- hide: "dölj kommentarer"
+ hide: "Dölj kommentarer"
no_comments: "Inga kommentarer finns ännu."
- show: "visa alla kommentarer"
+ show: "Visa alla kommentarer"
confirm_dialog: "Är du säker?"
confirm_unload: "Bekräfta att du vill gå från sidan. Du har osparad information här."
contacts:
@@ -58,6 +58,8 @@ sv:
remove_contact: "Ta bort kontakt"
search_no_results: "Inga kontakter hittade"
conversation:
+ new:
+ no_contacts: "Du behöver några kontakter innan du kan påbörja konversationer."
participants: "Deltagare"
create: "Skapa"
delete: "Radera"
@@ -73,7 +75,7 @@ sv:
preparing_your_stream: "Förbereder din personliga ström..."
header:
admin: "Administratör"
- close: "stäng"
+ close: "Stäng"
contacts: "Kontakter"
conversations: "Konversationer"
help: "Hjälp"
@@ -108,7 +110,7 @@ sv:
is_sharing: "<%= name %> delar med sig till dig"
mention: "Nämn"
message: "Meddelande"
- not_found: "och ingen hittades..."
+ not_found: "... och ingen hittades..."
stop_ignoring: "Sluta ignorera"
photo_uploader:
completed: "<%= file %> klar"
@@ -128,39 +130,39 @@ sv:
show_result: "Visa resultat"
vote: "Rösta"
profile:
- add_some: "lägg till"
+ add_some: "Lägg till"
bio: "Biografi"
born: "Födelsedag"
contacts: "Kontakter"
- edit: "ändra"
+ edit: "Ändra"
gender: "Kön"
ignoring: "Du ignorerar alla inlägg från <%= name %>."
location: "Plats"
photos: "Foton"
posts: "Inlägg"
- you_have_no_tags: "du har inga taggar!"
+ you_have_no_tags: "Du har inga taggar!"
publisher:
add_option: "Lägg till alternativ"
at_least_one_aspect: "Du måste publicera till minst en aspekt."
- limited: "Begränsad - ditt inlägg visas endast för personer som du delar med"
+ limited: "Begränsat: ditt inlägg visas endast för personer som du delar med"
near_from: "Sänt från: <%= location %>"
option: "Alternativ"
- public: "Publikt - ditt inlägg visas för alla och i söktjänster"
+ public: "Publikt: ditt inlägg visas för alla och i söktjänster"
question: "Fråga"
remove_post: "Vill du ta bort detta inlägg?"
report:
name: "Anmälan"
prompt: "Var god ange orsak:"
- prompt_default: "kränkande innehåll"
+ prompt_default: "till exempel kränkande innehåll"
status:
created: "Anmälan skapad"
exists: "Anmälan finns redan"
reshares:
duplicate: "Du gillar detta va? Du har nämligen redan delat vidare detta inlägg!"
- post: "Vill du dela vidare <%= name %>s inlägg?"
+ post: "Vill du dela vidare inlägget av <%= name %>?"
successful: "Lyckades med att dela vidare inlägget."
search_for: "Sök efter <%= name %>"
- show_more: "visa mer"
+ show_more: "Visa mer"
stream:
comment: "Kommentera"
disable_post_notifications: "Inaktivera notifikationer för detta inlägg"
@@ -228,7 +230,7 @@ sv:
viewer:
comment: "Kommentera"
follow_post: "Följ inlägg"
- home: "HEM"
+ home: "Hem"
like: "Gilla"
reshare: "Dela vidare"
reshared: "Återdelad"
diff --git a/config/locales/javascript/javascript.uk.yml b/config/locales/javascript/javascript.uk.yml
index b73a92541..9367b7d6d 100644
--- a/config/locales/javascript/javascript.uk.yml
+++ b/config/locales/javascript/javascript.uk.yml
@@ -49,6 +49,8 @@ uk:
remove_contact: "Видалити контакт"
search_no_results: "Контакти не знайдено"
conversation:
+ new:
+ no_contacts: "Перш ніж розпочати розмову, треба мати хоча б один контакт."
participants: "Учасники"
delete: "Вилучити"
edit: "Змінити"
@@ -199,18 +201,18 @@ uk:
timeago:
day: "день"
days: "%d днів[-я]"
- hour: "біля години"
- hours: "біля %d годин"
- minute: "біля хвилини"
+ hour: "близько години"
+ hours: "близько %d годин"
+ minute: "близько хвилини"
minutes: "%d хвилин[-и]"
- month: "біля місяця"
+ month: "близько місяця"
months: "%d місяця[-ів]"
prefixAgo: ""
prefixFromNow: "через"
seconds: "декілька секунд"
suffixAgo: "тому"
suffixFromNow: "з цієї миті"
- year: "біля року"
+ year: "близько року"
years: "%d років"
unblock_failed: "Не вдалось розблокувати цього користувача"
videos:
diff --git a/config/routes.rb b/config/routes.rb
index c0fd79d2b..775cf0092 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -30,16 +30,13 @@ Diaspora::Application.routes.draw do
resources :posts do
member do
- get :next
- get :previous
get :interactions
end
- resources :poll_participations, :only => [:create]
-
- resources :likes, :only => [:create, :destroy, :index ]
- resource :participation, :only => [:create, :destroy]
- resources :comments, :only => [:new, :create, :destroy, :index]
+ resource :participation, only: %i(create destroy)
+ resources :poll_participations, only: :create
+ resources :likes, only: %i(create destroy index)
+ resources :comments, only: %i(new create destroy index)
end
@@ -145,7 +142,6 @@ Diaspora::Application.routes.draw do
match :user_search, via: [:get, :post]
get :admin_inviter
get :weekly_user_stats
- get :correlations
get :stats, :as => 'pod_stats'
get "add_invites/:invite_code_id" => 'admins#add_invites', :as => 'add_invites'
end
@@ -228,6 +224,7 @@ Diaspora::Application.routes.draw do
# Mobile site
get 'mobile/toggle', :to => 'home#toggle_mobile', :as => 'toggle_mobile'
+ get "/m", to: "home#force_mobile", as: "force_mobile"
# Help
get 'help' => 'help#faq', :as => 'help'
@@ -236,8 +233,10 @@ Diaspora::Application.routes.draw do
#Protocol Url
get 'protocol' => redirect("http://wiki.diasporafoundation.org/Federation_Protocol_Overview")
- #Statistics
- get :statistics, controller: :statistics
+ # NodeInfo
+ get ".well-known/nodeinfo", to: "node_info#jrd"
+ get "nodeinfo/:version", to: "node_info#document", as: "node_info", constraints: {version: /\d+\.\d+/}
+ get "statistics", to: "node_info#statistics"
# Terms
if AppConfig.settings.terms.enable?
diff --git a/db/migrate/20150724152052_remove_favorites_from_posts.rb b/db/migrate/20150724152052_remove_favorites_from_posts.rb
new file mode 100644
index 000000000..8d4bd873f
--- /dev/null
+++ b/db/migrate/20150724152052_remove_favorites_from_posts.rb
@@ -0,0 +1,9 @@
+class RemoveFavoritesFromPosts < ActiveRecord::Migration
+ def self.up
+ remove_column :posts, :favorite
+ end
+
+ def self.down
+ add_column :posts, :favorite, :boolean, default: false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 959c12c99..55e9e9547 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20150607143809) do
+ActiveRecord::Schema.define(version: 20150724152052) do
create_table "account_deletions", force: :cascade do |t|
t.string "diaspora_handle", limit: 255
@@ -374,7 +374,6 @@ ActiveRecord::Schema.define(version: 20150607143809) do
t.integer "reshares_count", limit: 4, default: 0
t.datetime "interacted_at"
t.string "frame_name", limit: 255
- t.boolean "favorite", default: false
t.string "facebook_id", limit: 255
t.string "tweet_id", limit: 255
t.integer "open_graph_cache_id", limit: 4
diff --git a/features/desktop/conversations.feature b/features/desktop/conversations.feature
index b9fc82d28..d1186ae6b 100644
--- a/features/desktop/conversations.feature
+++ b/features/desktop/conversations.feature
@@ -8,10 +8,16 @@ Feature: private conversations
Given a user named "Robert Grimm" with email "bob@bob.bob"
And a user named "Alice Awesome" with email "alice@alice.alice"
And a user with username "robert_grimm" is connected with "alice_awesome"
- When I sign in as "bob@bob.bob"
+
+ Scenario: open the conversations page without any contacts
+ Given a user with email "eve@eve.eve"
+ When I sign in as "eve@eve.eve"
+ And I am on the conversations page
+ Then I should see "You need to add some contacts before you can start a conversation"
Scenario: send a message
- Given I send a message with subject "Greetings" and text "hello, alice!" to "Alice Awesome"
+ When I sign in as "bob@bob.bob"
+ And I send a message with subject "Greetings" and text "hello, alice!" to "Alice Awesome"
Then I should see "Greetings" within "#conversation_inbox"
And I should see "Greetings" within "#conversation_show"
And I should see "less than a minute ago" within "#conversation_inbox"
@@ -26,7 +32,8 @@ Feature: private conversations
Then I should see "hey, how you doing?" within ".stream_container"
Scenario: send a message using keyboard shortcuts
- Given I send a message with subject "Greetings" and text "hello, alice!" to "Alice Awesome" using keyboard shortcuts
+ When I sign in as "bob@bob.bob"
+ And I send a message with subject "Greetings" and text "hello, alice!" to "Alice Awesome" using keyboard shortcuts
Then I should see "Greetings" within "#conversation_inbox"
And I should see "Greetings" within "#conversation_show"
And "Alice Awesome" should be part of active conversation
diff --git a/features/desktop/manages_aspects.feature b/features/desktop/manages_aspects.feature
index 5f6865eaf..784e05254 100644
--- a/features/desktop/manages_aspects.feature
+++ b/features/desktop/manages_aspects.feature
@@ -81,7 +81,7 @@ Feature: User manages contacts
And I have an aspect called "People"
And I have an aspect called "Cat People"
When I am on the contacts page
- And I drag "Cat People" up 40 pixels
+ And I drag "Cat People" up
And I go to the contacts page
Then I should see "Cat People" as 2. aspect
And I should see "People" as 3. aspect
diff --git a/features/desktop/posts_from_main_page.feature b/features/desktop/posts_from_main_page.feature
index ce425b22d..6375a4b19 100644
--- a/features/desktop/posts_from_main_page.feature
+++ b/features/desktop/posts_from_main_page.feature
@@ -52,7 +52,7 @@ Feature: posting from the main page
Scenario: posting a message appends it to the top of the stream
When I click the publisher and post "sup dog"
And I click the publisher and post "hello there"
- Then I should see "hello there" as the first post in my stream
+ Then "hello there" should be post 1
Scenario: post a text-only message to just one aspect
When I select only "PostingTo" aspect
@@ -64,7 +64,7 @@ Feature: posting from the main page
When I am on the aspects page
And I select all aspects
And I select only "PostingTo" aspect
- Then I should see "I am eating a yogurt"
+ Then "I am eating a yogurt" should be post 1
When I am on the aspects page
And I select all aspects
@@ -126,7 +126,6 @@ Feature: posting from the main page
And the publisher should be expanded
And I close the publisher
- @wip
Scenario: hide a contact's post
Given I expand the publisher
When I write the status message "Here is a post for you to hide"
@@ -137,8 +136,7 @@ Feature: posting from the main page
And I am on "bob@bob.bob"'s page
And I hover over the ".stream_element"
- And I click to delete the first post
- And I confirm the alert
+ And I click to hide the first post
And I go to "bob@bob.bob"'s page
Then I should not see "Here is a post for you to hide"
When I am on the aspects page
@@ -163,7 +161,7 @@ Feature: posting from the main page
And I am on the aspects page
And I select only "PostingTo" aspect
- Then I should see "I am eating a yogurt"
+ Then "I am eating a yogurt" should be post 1
When I am on the aspects page
And I select all aspects
And I select only "NotPostingThingsHere" aspect
diff --git a/features/desktop/posts_from_profile_page.feature b/features/desktop/posts_from_profile_page.feature
index 1f26e5fc1..3ea86e32c 100644
--- a/features/desktop/posts_from_profile_page.feature
+++ b/features/desktop/posts_from_profile_page.feature
@@ -19,14 +19,14 @@ Feature: posting from own profile page
And I press "Share"
- Then I should see "I want to understand people"
+ Then "I want to understand people" should be post 1
When I go to the home page
- Then I should see "I want to understand people"
+ Then "I want to understand people" should be post 1
When I am on the aspects page
And I select only "Family" aspect
- Then I should see "I want to understand people"
+ Then "I want to understand people" should be post 1
When I select all aspects
And I select only "Work" aspect
diff --git a/features/mobile/home.feature b/features/mobile/home.feature
index 43e9c16bc..2b678a193 100644
--- a/features/mobile/home.feature
+++ b/features/mobile/home.feature
@@ -10,3 +10,10 @@ Feature: Visit the landing page of the pod
When I toggle the mobile view
And I go to the root page
Then I should see "Welcome, friend"
+
+ When I am on the root page
+ Then I should see "Welcome, friend"
+ When I go to the mobile path
+ Then I should see "LOG IN"
+ When I go to the mobile path
+ Then I should see "LOG IN"
diff --git a/features/step_definitions/.rubocop.yml b/features/step_definitions/.rubocop.yml
new file mode 100644
index 000000000..76e348cf2
--- /dev/null
+++ b/features/step_definitions/.rubocop.yml
@@ -0,0 +1,5 @@
+inherit_from:
+ - ../../.rubocop.yml
+
+Lint/AmbiguousRegexpLiteral:
+ Enabled: false
diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb
index 5d7115066..53290bed1 100644
--- a/features/step_definitions/aspects_steps.rb
+++ b/features/step_definitions/aspects_steps.rb
@@ -88,24 +88,21 @@ When /^(.*) in the aspect creation modal$/ do |action|
end
end
-When /^I drag "([^"]*)" (up|down) (\d+) pixels?$/ do |aspect_name, direction, distance|
- distance = distance.to_i * -1 if direction == "up"
- page.execute_script %{
- function drag() {
- $("li.aspect:contains('#{aspect_name}')")
- .simulate("drag-n-drop", { dy: #{distance}, interpolation: { stepWidth: 10, stepDelay: 5 } });
- }
- function loadScripts() {
- $.getScript("/assets/jquery-simulate/jquery.simulate.js", function(){
- $.getScript("/assets/jquery-simulate-ext/src/jquery.simulate.ext.js", function(){
- $.getScript("/assets/jquery-simulate-ext/src/jquery.simulate.drag-n-drop.js", drag);
- });
- });
- }
- if (!$.simulate) { loadScripts(); } else { drag(); }
- }
- expect(find("#aspect_nav")).to have_css ".synced"
-end
+When /^I drag "([^"]*)" (up|down)$/ do |aspect_name, direction|
+ aspect_id = @me.aspects.where(name: aspect_name).first.id
+ aspect = find(:xpath, "//div[@id='aspect_nav']/ul/li[@data-aspect-id='#{aspect_id}']")
+ target = direction == "up" ? aspect.all(:xpath, "./preceding-sibling::li").last :
+ aspect.all(:xpath, "./following-sibling::li").first
+ browser = aspect.base.driver.browser
+ mouse = browser.mouse
+ native_aspect = aspect.base.native
+ native_target = target.base.native
+ mouse.down native_aspect
+ mouse.move_to native_target, native_target.size.width / 2, 0
+ sleep 1
+ mouse.up
+ expect(page).to have_no_css "#aspect_nav .ui-sortable.syncing"
+ end
And /^I toggle the aspect "([^"]*)"$/ do |name|
toggle_aspect(name)
diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb
index 19c284888..0c7a8f149 100644
--- a/features/step_definitions/custom_web_steps.rb
+++ b/features/step_definitions/custom_web_steps.rb
@@ -95,11 +95,24 @@ When /^I prepare the deletion of the first post$/ do
end
end
+When /^I prepare hiding the first post$/ do
+ within(find(".stream .stream_element", match: :first)) do
+ ctrl = find(".control-icons")
+ ctrl.hover
+ ctrl.find(".hide_post").click
+ end
+end
+
When /^I click to delete the first post$/ do
step "I prepare the deletion of the first post"
step "I confirm the alert"
end
+When /^I click to hide the first post$/ do
+ step "I prepare hiding the first post"
+ step "I confirm the alert"
+end
+
When /^I click to delete the first comment$/ do
within("div.comment", match: :first) do
find(".control-icons").hover
diff --git a/features/step_definitions/posts_steps.rb b/features/step_definitions/posts_steps.rb
index 10c04b8ab..bb353b9e0 100644
--- a/features/step_definitions/posts_steps.rb
+++ b/features/step_definitions/posts_steps.rb
@@ -62,10 +62,6 @@ When /^I expand the post$/ do
expand_first_post
end
-Then /^I should see "([^"]*)" as the first post in my stream$/ do |text|
- first_post_text.should include(text)
-end
-
When /^I click the publisher and post "([^"]*)"$/ do |text|
click_and_post(text)
end
diff --git a/features/support/env.rb b/features/support/env.rb
index cad3ec70f..0d2e93843 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -68,9 +68,6 @@ require Rails.root.join('spec', 'support', 'inlined_jobs')
require Rails.root.join('spec', 'support', 'user_methods')
include HelperMethods
-# require 'webmock/cucumber'
-# WebMock.disable_net_connect!(:allow_localhost => true)
-
Before do
Devise.mailer.deliveries = []
end
diff --git a/features/support/paths.rb b/features/support/paths.rb
index d1b923091..90743f5e1 100644
--- a/features/support/paths.rb
+++ b/features/support/paths.rb
@@ -5,6 +5,8 @@ module NavigationHelpers
person_photos_path(@me.person)
when /^the home(?: )?page$/
stream_path
+ when /^the mobile path$/
+ force_mobile_path
when /^step (\d)$/
if $1.to_i == 1
getting_started_path
diff --git a/features/support/user_cuke_helpers.rb b/features/support/user_cuke_helpers.rb
index 20603dde8..fb8b339f8 100644
--- a/features/support/user_cuke_helpers.rb
+++ b/features/support/user_cuke_helpers.rb
@@ -90,7 +90,7 @@ module UserCukeHelpers
# submit forgot password form to get reset password link
def submit_forgot_password_form
- find("#new_user input.button").click
+ find("#new_user input.btn").click
end
# fill the reset password form
@@ -101,7 +101,7 @@ module UserCukeHelpers
# submit reset password form
def submit_reset_password_form
- find(".button").click
+ find(".btn").click
end
def confirm_not_signed_up
diff --git a/features/support/webmock.rb b/features/support/webmock.rb
new file mode 100644
index 000000000..017336779
--- /dev/null
+++ b/features/support/webmock.rb
@@ -0,0 +1,11 @@
+require "webmock/cucumber"
+WebMock.disable_net_connect!(allow_localhost: true)
+
+Before do
+ stub_request(:head, /.+/).with(
+ headers: {
+ "Accept" => "text/html",
+ "User-Agent" => "OpenGraphReader/0.6.1 (+https://github.com/jhass/open_graph_reader)"
+ }
+ ).to_return(status: 200, body: "", headers: {"Content-Type" => "text/plain"})
+end
diff --git a/lib/diaspora/fetcher/single.rb b/lib/diaspora/fetcher/single.rb
index 4e8340132..797fc3ccc 100644
--- a/lib/diaspora/fetcher/single.rb
+++ b/lib/diaspora/fetcher/single.rb
@@ -14,7 +14,7 @@ module Diaspora
post = Post.where(guid: guid).first
return post if post
- post_author = Webfinger.new(author_id).fetch
+ post_author = Person.find_or_fetch_by_identifier(author_id)
post_author.save! unless post_author.persisted?
if fetched_post = fetch_post(post_author, guid)
diff --git a/lib/federated/relayable.rb b/lib/federated/relayable.rb
index a6cf6bf83..7a1b13d6c 100644
--- a/lib/federated/relayable.rb
+++ b/lib/federated/relayable.rb
@@ -24,7 +24,7 @@ module Federated
end
def diaspora_handle=(nh)
- self.author = Webfinger.new(nh).fetch
+ self.author = Person.find_or_fetch_by_identifier(nh)
end
def parent_class
diff --git a/lib/h_card.rb b/lib/h_card.rb
deleted file mode 100644
index 2fda6aa2e..000000000
--- a/lib/h_card.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
-module HCard
- def self.parse(doc)
- {
- given_name: doc.css(".given_name").text,
- family_name: doc.css(".family_name").text,
- url: doc.css("#pod_location").text,
- photo: doc.css(".entity_photo .photo[src]").attribute("src").text,
- photo_small: doc.css(".entity_photo_small .photo[src]").attribute("src").text,
- photo_medium: doc.css(".entity_photo_medium .photo[src]").attribute("src").text,
- searchable: doc.css(".searchable").text == "true"
- }
- end
-
- def self.build(raw_hcard)
- parse Nokogiri::HTML(raw_hcard)
- end
-end
diff --git a/lib/node_info.rb b/lib/node_info.rb
new file mode 100644
index 000000000..0b4657d3a
--- /dev/null
+++ b/lib/node_info.rb
@@ -0,0 +1,160 @@
+require "pathname"
+require "json-schema"
+
+module NodeInfo
+ VERSIONS = %w(1.0)
+ SCHEMAS = {}
+ private_constant :VERSIONS, :SCHEMAS
+
+ Document = Struct.new(:version, :software, :protocols, :services, :open_registrations, :usage, :metadata) do
+ Software = Struct.new(:name, :version) do
+ def initialize(name=nil, version=nil)
+ super(name, version)
+ end
+
+ def version_10_hash
+ {
+ "name" => name,
+ "version" => version
+ }
+ end
+ end
+
+ Protocols = Struct.new(:inbound, :outbound) do
+ def initialize(inbound=[], outbound=[])
+ super(inbound, outbound)
+ end
+
+ def version_10_hash
+ {
+ "inbound" => inbound,
+ "outbound" => outbound
+ }
+ end
+ end
+
+ Services = Struct.new(:inbound, :outbound) do
+ def initialize(inbound=[], outbound=[])
+ super(inbound, outbound)
+ end
+
+ def version_10_hash
+ {
+ "inbound" => inbound,
+ "outbound" => outbound
+ }
+ end
+ end
+
+ Usage = Struct.new(:users, :local_posts, :local_comments) do
+ Users = Struct.new(:total, :active_halfyear, :active_month) do
+ def initialize(total=nil, active_halfyear=nil, active_month=nil)
+ super(total, active_halfyear, active_month)
+ end
+
+ def version_10_hash
+ {
+ "total" => total,
+ "activeHalfyear" => active_halfyear,
+ "activeMonth" => active_month
+ }
+ end
+ end
+
+ def initialize(local_posts=nil, local_comments=nil)
+ super(Users.new, local_posts, local_comments)
+ end
+
+ def version_10_hash
+ {
+ "users" => users.version_10_hash,
+ "localPosts" => local_posts,
+ "localComments" => local_comments
+ }
+ end
+ end
+
+ def self.build
+ new.tap do |doc|
+ yield doc
+ doc.validate
+ end
+ end
+
+ def initialize(version=nil, open_registrations=nil, metadata={})
+ super(version, Software.new, Protocols.new, Services.new, open_registrations, Usage.new, metadata)
+ end
+
+ def as_json(_options={})
+ case version
+ when "1.0"
+ version_10_hash
+ end
+ end
+
+ def content_type
+ "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/#{version}#"
+ end
+
+ def schema
+ NodeInfo.schema version
+ end
+
+ def validate
+ assert NodeInfo.supported_version?(version), "Unknown version #{version}"
+ JSON::Validator.validate!(schema, as_json)
+ end
+
+ private
+
+ def assert(condition, message)
+ raise ArgumentError, message unless condition
+ end
+
+ def version_10_hash
+ deep_compact(
+ "version" => "1.0",
+ "software" => software.version_10_hash,
+ "protocols" => protocols.version_10_hash,
+ "services" => services.version_10_hash,
+ "openRegistrations" => open_registrations,
+ "usage" => usage.version_10_hash,
+ "metadata" => metadata
+ )
+ end
+
+ def deep_compact(hash)
+ hash.tap do |hash|
+ hash.reject! {|_, value|
+ deep_compact value if value.is_a? Hash
+ value.nil?
+ }
+ end
+ end
+ end
+
+ def self.schema(version)
+ SCHEMAS[version] ||= JSON.parse(
+ Pathname.new(__dir__).join("..", "vendor", "nodeinfo", "schemas", "#{version}.json").expand_path.read
+ )
+ end
+
+ def self.build(&block)
+ Document.build(&block)
+ end
+
+ def self.jrd(endpoint)
+ {
+ "links" => VERSIONS.map {|version|
+ {
+ "rel" => "http://nodeinfo.diaspora.software/ns/schema/#{version}",
+ "href" => endpoint % {version: version}
+ }
+ }
+ }
+ end
+
+ def self.supported_version?(version)
+ VERSIONS.include? version
+ end
+end
diff --git a/lib/postzord/receiver/private.rb b/lib/postzord/receiver/private.rb
index b29898df5..5e545b995 100644
--- a/lib/postzord/receiver/private.rb
+++ b/lib/postzord/receiver/private.rb
@@ -9,7 +9,7 @@ class Postzord::Receiver::Private < Postzord::Receiver
@user_person = @user.person
@salmon_xml = opts[:salmon_xml]
- @author = opts[:person] || Webfinger.new(salmon.author_id).fetch
+ @author = opts[:person] || Person.find_or_fetch_by_identifier(salmon.author_id)
@object = opts[:object]
end
@@ -56,7 +56,7 @@ class Postzord::Receiver::Private < Postzord::Receiver
if @object.respond_to?(:relayable?)
#if A and B are friends, and A sends B a comment from C, we delegate the validation to the owner of the post being commented on
xml_author = @user.owns?(@object.parent) ? @object.diaspora_handle : @object.parent_author.diaspora_handle
- @author = Webfinger.new(@object.diaspora_handle).fetch if @object.author
+ @author = Person.find_or_fetch_by_identifier(@object.diaspora_handle) if @object.author
else
xml_author = @object.diaspora_handle
end
diff --git a/lib/postzord/receiver/public.rb b/lib/postzord/receiver/public.rb
index c96f0d340..fc870ba42 100644
--- a/lib/postzord/receiver/public.rb
+++ b/lib/postzord/receiver/public.rb
@@ -8,7 +8,7 @@ class Postzord::Receiver::Public < Postzord::Receiver
def initialize(xml)
@salmon = Salmon::Slap.from_xml(xml)
- @author = Webfinger.new(@salmon.author_id).fetch
+ @author = Person.find_or_fetch_by_identifier(@salmon.author_id)
end
# @return [Boolean]
diff --git a/lib/rake_helpers.rb b/lib/rake_helpers.rb
deleted file mode 100644
index 20284cb40..000000000
--- a/lib/rake_helpers.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-module RakeHelpers
-
- def process_emails(csv, num_to_process, offset, test=true)
- require 'csv'
- backers = CSV.read(csv)
- puts "DRY RUN" if test
- churn_through = 0
- num_to_process.times do |n|
- if backers[n+offset] == nil
- break
- end
- churn_through = n
- backer_name = backers[n+offset][1].to_s.strip
- backer_email = backers[n+offset][0].to_s.strip.downcase
-
- possible_user = User.find_by_email(backer_email)
- possible_invite = Invitation.find_by_identifier(backer_email)
- possible_user ||= possible_invite.recipient if possible_invite.present?
-
- admin_account = User.find_by_username(AppConfig.admins.account.get)
- raise "no admin account in diaspora.yml" unless admin_account.present?
- admin_account.invitation_code.count += num_to_process
- admin_account.invitation_code.save
-
- unless possible_user
- puts "#{n}: sending email to: #{backer_name} #{backer_email}" unless Rails.env == 'test'
- unless test
- i = EmailInviter.new(backer_email)
- i.send!
- end
- else
- puts "user with the email exists: #{backer_email} , #{backer_name} " unless Rails.env == 'test'
- end
- end
- churn_through
- end
-end
diff --git a/lib/statistics.rb b/lib/statistics.rb
deleted file mode 100644
index bc62695e9..000000000
--- a/lib/statistics.rb
+++ /dev/null
@@ -1,203 +0,0 @@
-class Statistics
-
- attr_reader :start_time,
- :range
-
- def initialize
- #@start_time = start_time
- #@range = range
- end
-
- def posts_count_sql
- <<SQL
- SELECT users.id AS id, count(posts.id) AS count
- FROM users
- JOIN people ON people.owner_id = users.id
- LEFT OUTER JOIN posts ON people.id = posts.author_id
- #{self.where_clause_sql}
- GROUP BY users.id
-SQL
- end
-
- def comments_count_sql
- <<SQL
- SELECT users.id AS id, count(comments.id) AS count
- FROM users
- JOIN people ON people.owner_id = users.id
- LEFT OUTER JOIN comments ON people.id = comments.author_id
- #{self.where_clause_sql}
- GROUP BY users.id
-SQL
- end
-
- def invites_sent_count_sql
- <<SQL
- SELECT users.id AS id, count(invitations.id) AS count
- FROM users
- LEFT OUTER JOIN invitations ON users.id = invitations.sender_id
- #{self.where_clause_sql}
- GROUP BY users.id
-SQL
- end
-
- def tags_followed_count_sql
- <<SQL
- SELECT users.id AS id, count(tag_followings.id) AS count
- FROM users
- LEFT OUTER JOIN tag_followings on users.id = tag_followings.user_id
- #{self.where_clause_sql}
- GROUP BY users.id
-SQL
- end
-
- def mentions_count_sql
- <<SQL
- SELECT users.id AS id, count(mentions.id) AS count
- FROM users
- JOIN people on users.id = people.owner_id
- LEFT OUTER JOIN mentions on people.id = mentions.person_id
- #{self.where_clause_sql}
- GROUP BY users.id
-SQL
- end
-
- def contacts_sharing_with_count_sql
- <<SQL
- SELECT users.id AS id, count(contacts.id) AS count
- FROM users
- JOIN contacts on contacts.user_id = users.id
- JOIN aspect_memberships on aspect_memberships.contact_id = contacts.id
- #{self.where_clause_sql}
- GROUP BY users.id
-SQL
- end
-
- def fb_connected_distribution_sql
- <<SQL
- SELECT users.id AS id, users.sign_in_count AS count, count(services.id) AS connected
- FROM users
- LEFT OUTER JOIN services on services.user_id = users.id
- AND services.type = 'Services::Facebook'
- #{self.where_clause_sql}
- GROUP BY users.id, users.sign_in_count
-SQL
- end
-
- def fb_connected_distribution
- User.connection.select_all(fb_connected_distribution_sql).map { |row|
- Hash[
- row.map { |k,v|
- [k, v.to_i]
- }
- ]
- }
- end
-
- def sign_in_count_sql
- <<SQL
- SELECT users.id AS id, users.sign_in_count AS count
- FROM users
- #{self.where_clause_sql}
-SQL
- end
-
- def correlate(first_metric, second_metric)
-
- # [{"id" => 1 , "count" => 123}]
-
- x_array = []
- y_array = []
-
- self.result_hash(first_metric).keys.each do |k|
- if val = self.result_hash(second_metric)[k]
- x_array << self.result_hash(first_metric)[k]
- y_array << val
- end
- end
-
- correlation(x_array, y_array)
- end
-
- def generate_correlations
- result = {}
- [:posts_count, :comments_count, :invites_sent_count, #:tags_followed_count,
- :mentions_count, :contacts_sharing_with_count].each do |metric|
- result[metric] = self.correlate(metric,:sign_in_count)
- end
- result
- end
-
- def correlation(x_array, y_array)
- sum = 0.0
- x_array.each_index do |i|
- sum = sum + x_array[i].to_f * y_array[i].to_f
- end
- x_y_mean = sum/x_array.length.to_f
- x_mean = mean(x_array)
- y_mean = mean(y_array)
-
- st_dev_x = standard_deviation(x_array)
- st_dev_y = standard_deviation(y_array)
-
- (x_y_mean - (x_mean*y_mean))/(st_dev_x * st_dev_y)
- end
-
- def mean(array)
- sum = array.inject(0.0) do |sum, val|
- sum += val.to_f
- end
- sum / array.length
- end
-
- def standard_deviation(array)
- variance = lambda do
- m = mean(array)
- sum = 0.0
- array.each{ |v| sum += (v.to_f-m)**2 }
- sum/array.length.to_f
- end.call
-
- Math.sqrt(variance)
- end
-
- ### % of cohort came back last week
- def retention(n)
- users_by_week(n).count.to_f/week_created(n).count
- end
-
- def top_active_users(n)
- ten_percent_lim = (users_by_week(n).count.to_f * 0.3).ceil
- users_by_week(n).joins(:person => :profile).where('users.sign_in_count > 4').order("users.sign_in_count DESC").limit(ten_percent_lim).select('users.email, users.username, profiles.first_name, users.sign_in_count')
- end
-
- def users_by_week(n)
- week_created(n).where("current_sign_in_at > ?", Time.now - 1.week)
- end
-
- protected
- def where_clause_sql
- if AppConfig.postgres?
- "WHERE users.created_at > NOW() - '1 month'::INTERVAL"
- else
- "where users.created_at > FROM_UNIXTIME(#{(Time.now - 1.month).to_i})"
- end
- end
-
- def week_created(n)
- User.where("username IS NOT NULL").where("users.created_at > ? and users.created_at < ?", Time.now - (n+1).weeks, Time.now - n.weeks)
- end
-
- #@param [Symbol] input type
- #@returns [Hash] of resulting query
- def result_hash(type)
- instance_hash = self.instance_variable_get("@#{type.to_s}_hash".to_sym)
- unless instance_hash
- post_count_array = User.connection.select_all(self.send("#{type.to_s}_sql".to_sym))
-
- instance_hash = {}
- post_count_array.each{ |h| instance_hash[h['id']] = h["count"]}
- self.instance_variable_set("@#{type.to_s}_hash".to_sym, instance_hash)
- end
- instance_hash
- end
-end
diff --git a/lib/webfinger.rb b/lib/webfinger.rb
deleted file mode 100644
index 5c28a4e90..000000000
--- a/lib/webfinger.rb
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright (c) 2010-2012, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
-class Webfinger
- include Diaspora::Logging
-
- attr_accessor :host_meta_xrd, :webfinger_profile_xrd,
- :webfinger_profile, :hcard, :hcard_xrd, :person,
- :account, :ssl
-
- def initialize(account)
- self.account = account
- self.ssl = true
- end
-
-
- def fetch
- return person if existing_person_with_profile?
- create_or_update_person_from_webfinger_profile!
- end
-
- def self.in_background(account, opts={})
- Workers::FetchWebfinger.perform_async(account)
- end
-
- #everything below should be private I guess
- def account=(str)
- @account = str.strip.gsub('acct:','').to_s.downcase
- end
-
- def get(url)
- logger.info "Getting: #{url} for #{account}"
- begin
- res = Faraday.get(url)
- unless res.success?
- raise "Failed to fetch #{url}: #{res.status}"
- end
- res.body
- rescue OpenSSL::SSL::SSLError => e
- logger.error "Failed to fetch #{url}: SSL setup invalid"
- raise e
- rescue => e
- logger.error "Failed to fetch: #{url} for #{account}; #{e.message}"
- raise e
- end
- end
-
- def existing_person_with_profile?
- cached_person.present? && cached_person.profile.present?
- end
-
- def cached_person
- self.person ||= Person.by_account_identifier(account)
- end
-
- def create_or_update_person_from_webfinger_profile!
- logger.info "webfingering #{account}, it is not known or needs updating"
- if person #update my profile please
- person.assign_new_profile_from_hcard(self.hcard)
- else
- person = make_person_from_webfinger
- end
- logger.info "successfully webfingered #{@account}" if person
- person
- end
-
- #this tries the xrl url with https first, then falls back to http
- def host_meta_xrd
- begin
- get(host_meta_url)
- rescue => e
- if self.ssl
- self.ssl = false
- retry
- else
- raise "there was an error getting the xrd from account #{@account}: #{e.message}"
- end
- end
- end
-
-
- def hcard
- @hcard ||= HCard.build(hcard_xrd)
- end
-
- def webfinger_profile
- @webfinger_profile ||= WebfingerProfile.new(account, webfinger_profile_xrd)
- end
-
- def hcard_url
- self.webfinger_profile.hcard
- end
-
- def webfinger_profile_url
- doc = Nokogiri::XML(self.host_meta_xrd)
- return nil if doc.namespaces["xmlns"] != "http://docs.oasis-open.org/ns/xri/xrd-1.0"
- swizzle doc.search('Link').find{|x| x['rel']=='lrdd'}['template']
- end
-
- def webfinger_profile_xrd
- @webfinger_profile_xrd ||= get(webfinger_profile_url)
- logger.warn "#{@account} doesn't exists anymore" if @webfinger_profile_xrd == false
- @webfinger_profile_xrd
- end
-
- def hcard_xrd
- @hcard_xrd ||= get(hcard_url)
- end
-
- def make_person_from_webfinger
- Person.create_from_webfinger(webfinger_profile, hcard) unless webfinger_profile_xrd == false
- end
-
- def host_meta_url
- domain = account.split('@')[1]
- "http#{'s' if self.ssl}://#{domain}/.well-known/host-meta"
- end
-
- def swizzle(template)
- template.gsub('{uri}', account)
- end
-end
diff --git a/lib/webfinger_profile.rb b/lib/webfinger_profile.rb
deleted file mode 100644
index 44259e200..000000000
--- a/lib/webfinger_profile.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-class WebfingerProfile
- include Diaspora::Logging
-
- attr_accessor :webfinger_profile, :account, :links, :hcard, :guid, :public_key, :seed_location
-
- def initialize(account, webfinger_profile)
- @account = account
- @webfinger_profile = webfinger_profile
- @links = {}
- set_fields
- end
-
- def valid_diaspora_profile?
- !(@webfinger_profile.nil? || @account.nil? || @links.nil? || @hcard.nil? ||
- @guid.nil? || @public_key.nil? || @seed_location.nil? )
- end
-
- private
-
- def set_fields
- doc = Nokogiri::XML.parse(webfinger_profile)
- doc.remove_namespaces!
-
- account_string = doc.css('Subject').text.gsub('acct:', '').strip
-
- raise "account in profile(#{account_string}) and account requested (#{@account}) do not match" if account_string != @account
-
- doc.css('Link').each do |l|
- rel = text_of_attribute(l, 'rel')
- href = text_of_attribute(l, 'href')
- @links[rel] = href
- case rel
- when "http://microformats.org/profile/hcard"
- @hcard = href
- when "http://joindiaspora.com/guid"
- @guid = href
- when "http://joindiaspora.com/seed_location"
- @seed_location = href
- end
- end
-
- begin
- pubkey = text_of_attribute( doc.at('Link[rel=diaspora-public-key]'), 'href')
- @public_key = Base64.decode64 pubkey
- rescue => e
- logger.warn "event=invalid_profile identifier=#{@account}"
- end
- end
-
- def text_of_attribute(doc, attr)
- doc.attribute(attr) ? doc.attribute(attr).text : nil
- end
-end
diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb
index f3e2bf185..adb2ec1ec 100644
--- a/spec/controllers/comments_controller_spec.rb
+++ b/spec/controllers/comments_controller_spec.rb
@@ -66,7 +66,7 @@ describe CommentsController, :type => :controller do
expect(alice).not_to receive(:comment)
post :create, comment_hash
- expect(response.code).to eq('422')
+ expect(response.code).to eq("404")
end
end
diff --git a/spec/controllers/diaspora_federation_controller_spec.rb b/spec/controllers/diaspora_federation_controller_spec.rb
deleted file mode 100644
index 8799220ee..000000000
--- a/spec/controllers/diaspora_federation_controller_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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"
-
-# this is temporarily needed for fixture generation
-# TODO: remove this after the parsing is also in the diaspora_federation gem
-describe DiasporaFederation do
- routes { DiasporaFederation::Engine.routes }
-
- let(:fixture_path) { Rails.root.join("spec", "fixtures") }
-
- describe DiasporaFederation::WebfingerController, type: :controller do
- it "generates the host_meta fixture", fixture: true do
- get :host_meta
- expect(response).to be_success
- expect(response.body).to match(/webfinger/)
- save_fixture(response.body, "host-meta", fixture_path)
- end
-
- it "generates the webfinger fixture", fixture: true do
- post :legacy_webfinger, "q" => alice.person.diaspora_handle
- expect(response).to be_success
- save_fixture(response.body, "webfinger", fixture_path)
- end
- end
-
- describe DiasporaFederation::HCardController, type: :controller do
- it "generates the hCard fixture", fixture: true do
- post :hcard, "guid" => alice.person.guid.to_s
- expect(response).to be_success
- save_fixture(response.body, "hcard", fixture_path)
- end
- end
-end
diff --git a/spec/controllers/node_info_controller_spec.rb b/spec/controllers/node_info_controller_spec.rb
new file mode 100644
index 000000000..106a5a1c8
--- /dev/null
+++ b/spec/controllers/node_info_controller_spec.rb
@@ -0,0 +1,77 @@
+require "spec_helper"
+
+describe NodeInfoController do
+ describe "#jrd" do
+ it "responds to JSON" do
+ get :jrd, format: :json
+
+ expect(response).to be_success
+ end
+
+ it "returns a JRD" do
+ expect(NodeInfo).to receive(:jrd).with(include("%{version}")).and_call_original
+
+ get :jrd, format: :json
+
+ jrd = JSON.parse(response.body)
+ expect(jrd).to include "links" => [{
+ "rel" => "http://nodeinfo.diaspora.software/ns/schema/1.0",
+ "href" => node_info_url("1.0")
+ }]
+ end
+ end
+
+ describe "#document" do
+ context "invalid version" do
+ it "responds with not found" do
+ get :document, version: "0.0", format: :json
+
+ expect(response.code).to eq "404"
+ end
+ end
+
+ context "version 1.0" do
+ it "responds to JSON" do
+ get :document, version: "1.0", format: :json
+
+ expect(response).to be_success
+ end
+
+ it "calls NodeInfoPresenter" do
+ expect(NodeInfoPresenter).to receive(:new).with("1.0")
+ .and_return(double(as_json: {}, content_type: "application/json"))
+
+ get :document, version: "1.0", format: :json
+ end
+
+ it "notes the schema in the content type" do
+ get :document, version: "1.0", format: :json
+
+ expect(response.content_type).to eq "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/1.0#"
+ end
+ end
+ end
+
+ describe "#statistics" do
+ it "responds to format json" do
+ get :statistics, format: "json"
+ expect(response.code).to eq("200")
+ end
+
+ it "contains json" do
+ get :statistics, format: "json"
+ json = JSON.parse(response.body)
+ expect(json["name"]).to be_present
+ end
+
+ it "responds to html" do
+ get :statistics, format: "html"
+ expect(response.code).to eq("200")
+ end
+
+ it "responds to mobile" do
+ get :statistics, format: "mobile"
+ expect(response.code).to eq("200")
+ end
+ end
+end
diff --git a/spec/controllers/notifications_controller_spec.rb b/spec/controllers/notifications_controller_spec.rb
index 2302320b0..7568f8e12 100644
--- a/spec/controllers/notifications_controller_spec.rb
+++ b/spec/controllers/notifications_controller_spec.rb
@@ -117,6 +117,24 @@ describe NotificationsController, :type => :controller do
expect(assigns[:notifications].count).to eq(1)
end
end
+
+ context "after deleting a person" do
+ before do
+ user = FactoryGirl.create(:user_with_aspect)
+ user.share_with(alice.person, user.aspects.first)
+ user.person.delete
+ end
+
+ it "succeeds" do
+ get :index
+ expect(response).to be_success
+ end
+
+ it "succeeds on mobile" do
+ get :index, format: :mobile
+ expect(response).to be_success
+ end
+ end
end
describe "#read_all" do
diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb
index 8efdfe769..c0e2efcab 100644
--- a/spec/controllers/photos_controller_spec.rb
+++ b/spec/controllers/photos_controller_spec.rb
@@ -82,6 +82,16 @@ describe PhotosController, :type => :controller do
expect(response).to be_success
end
+ it "succeeds on mobile devices without any available pictures" do
+ get :index, format: :mobile, person_id: FactoryGirl.create(:person).guid.to_s
+ expect(response).to be_success
+ end
+
+ it "succeeds on mobile devices with available pictures" do
+ get :index, format: :mobile, person_id: bob.person.guid.to_s
+ expect(response).to be_success
+ end
+
it "displays the logged in user's pictures" do
get :index, :person_id => alice.person.guid.to_s
expect(assigns[:person]).to eq(alice.person)
diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb
index 246238484..c6ed28fbb 100644
--- a/spec/controllers/posts_controller_spec.rb
+++ b/spec/controllers/posts_controller_spec.rb
@@ -2,191 +2,112 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
+require "spec_helper"
+
+describe PostsController, type: :controller do
+ let!(:post_service_double) { double("post_service") }
-describe PostsController, :type => :controller do
before do
aspect = alice.aspects.first
- @message = alice.build_post :status_message, :text => "ohai", :to => aspect.id
+ @message = alice.build_post :status_message, text: "ohai", to: aspect.id
@message.save!
alice.add_to_streams(@message, [aspect])
- alice.dispatch_post @message, :to => aspect.id
+ alice.dispatch_post @message, to: aspect.id
+
+ allow(PostService).to receive(:new).and_return(post_service_double)
end
- describe '#show' do
- context 'user signed in' do
+ describe "#show" do
+ before do
+ expect(post_service_double).to receive(:mark_user_notifications)
+ allow(post_service_double).to receive(:present_json)
+ end
+
+ context "user signed in" do
before do
sign_in :user, alice
+ expect(post_service_double).to receive(:post).and_return(@message)
end
- it 'succeeds' do
- get :show, "id" => @message.id
- expect(response).to be_success
- end
-
- it 'succeeds on mobile' do
- get :show, "id" => @message.id
+ it "succeeds" do
+ get :show, id: @message.id
expect(response).to be_success
end
it 'succeeds after removing a mention when closing the mentioned user\'s account' do
- user = FactoryGirl.create(:user, :username => "user")
+ user = FactoryGirl.create(:user, username: "user")
alice.share_with(user.person, alice.aspects.first)
- msg = alice.build_post :status_message, text: "Mention @{User ; #{user.diaspora_handle}}", :public => true, :to => 'all'
+ msg = alice.build_post :status_message,
+ text: "Mention @{User ; #{user.diaspora_handle}}", public: true, to: "all"
msg.save!
expect(msg.mentioned_people.count).to eq(1)
user.destroy
- get :show, "id" => msg.id
+ get :show, id: msg.id
expect(response).to be_success
end
- it 'renders the application layout on mobile' do
- get :show, :id => @message.id, :format => :mobile
- expect(response).to render_template('layouts/application')
+ it "renders the application layout on mobile" do
+ get :show, id: @message.id, format: :mobile
+ expect(response).to render_template("layouts/application")
end
- it 'succeeds on mobile with a reshare' do
- get :show, "id" => FactoryGirl.create(:reshare, :author => alice.person).id, :format => :mobile
+ it "succeeds on mobile with a reshare" do
+ get :show, id: FactoryGirl.create(:reshare, author: alice.person).id, format: :mobile
expect(response).to be_success
end
-
- it 'marks a corresponding notifications as read' do
- FactoryGirl.create(:notification, :recipient => alice, :target => @message, :unread => true)
- note = FactoryGirl.create(:notification, :recipient => alice, :target => @message, :unread => true)
-
- expect {
- get :show, :id => @message.id
- note.reload
- }.to change(Notification.where(:unread => true), :count).by(-2)
- end
-
- it 'marks a corresponding mention notification as read' do
- status_msg = bob.post(:status_message, {text: "this is a text mentioning @{Mention User ; #{alice.diaspora_handle}} ... have fun testing!", :public => true, :to => 'all'})
- mention = status_msg.mentions.where(person_id: alice.person.id).first
- note = FactoryGirl.create(:notification, :recipient => alice, :target_type => "Mention", :target_id => mention.id, :unread => true)
-
- expect {
- get :show, :id => status_msg.id
- note.reload
- }.to change(Notification.where(:unread => true), :count).by(-1)
- end
-
- it '404 if the post is missing' do
- expect {
- get :show, :id => 1234567
- }.to raise_error(ActiveRecord::RecordNotFound)
- end
end
- context 'user not signed in' do
- context 'given a public post' do
+ 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')
+ @status = alice.post(:status_message, text: "hello", public: true, to: "all")
+ expect(post_service_double).to receive(:post).and_return(@status)
end
- it 'shows a public post' do
- get :show, :id => @status.id
- expect(response.status).to eq(200)
+ it "shows a public post" do
+ get :show, id: @status.id
+ expect(response.body).to match "hello"
end
- it 'succeeds for statusnet' do
+ it "succeeds for statusnet" do
@request.env["HTTP_ACCEPT"] = "application/html+xml,text/html"
- get :show, :id => @status.id
- expect(response).to be_success
+ get :show, id: @status.id
+ expect(response.body).to match "hello"
end
- it 'responds with diaspora xml if format is xml' do
- get :show, :id => @status.guid, :format => :xml
+ it "responds with diaspora xml if format is xml" do
+ get :show, id: @status.guid, format: :xml
expect(response.body).to eq(@status.to_diaspora_xml)
end
end
-
- it 'does not show a private post' do
- status = alice.post(:status_message, :text => "hello", :public => false, :to => 'all')
- get :show, :id => status.id
- expect(response.status).to eq(404)
- end
-
- # We want to be using guids from now on for this post route, but do not want to break
- # pre-exisiting permalinks. We can assume a guid is 8 characters long as we have
- # guids set to hex(8) since we started using them.
- context 'id/guid switch' do
- before do
- @status = alice.post(:status_message, :text => "hello", :public => true, :to => 'all')
- end
-
- it 'assumes guids less than 8 chars are ids and not guids' do
- p = Post.where(:id => @status.id.to_s)
- expect(Post).to receive(:where)
- .with(hash_including(:id => @status.id.to_s))
- .and_return(p)
- get :show, :id => @status.id
- expect(response).to be_success
- end
-
- it 'assumes guids more than (or equal to) 8 chars are actually guids' do
- p = Post.where(:guid => @status.guid)
- expect(Post).to receive(:where)
- .with(hash_including(:guid => @status.guid))
- .and_return(p)
- get :show, :id => @status.guid
- expect(response).to be_success
- end
- end
end
end
- describe 'iframe' do
- it 'contains an iframe' do
- get :iframe, :id => @message.id
+ describe "iframe" do
+ it "contains an iframe" do
+ get :iframe, id: @message.id
expect(response.body).to match /iframe/
end
end
- describe 'oembed' do
- it 'works when you can see it' do
- sign_in alice
- get :oembed, :url => "/posts/#{@message.id}"
- expect(response.body).to match /iframe/
- end
-
- it 'returns a 404 response when the post is not found' do
- get :oembed, :url => "/posts/#{@message.id}"
- expect(response.status).to eq(404)
+ describe "oembed" do
+ it "receives a present oembed" do
+ expect(post_service_double).to receive(:present_oembed)
+ get :oembed, url: "/posts/#{@message.id}"
end
end
- describe '#destroy' do
+ describe "#destroy" do
before do
sign_in alice
end
- it 'let a user delete his message' do
- message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
- delete :destroy, :format => :js, :id => message.id
- expect(response).to be_success
- expect(StatusMessage.find_by_id(message.id)).to be_nil
- end
-
- it 'sends a retraction on delete' do
- allow(controller).to receive(:current_user).and_return alice
- message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
- expect(alice).to receive(:retract).with(message)
- delete :destroy, :format => :js, :id => message.id
- expect(response).to be_success
- end
-
- it 'will not let you destroy posts visible to you' do
- message = bob.post(:status_message, :text => "hey", :to => bob.aspects.first.id)
- expect { delete :destroy, :format => :js, :id => message.id }.to raise_error(ActiveRecord::RecordNotFound)
- expect(StatusMessage.exists?(message.id)).to be true
- end
-
- it 'will not let you destory posts you do not own' do
- message = eve.post(:status_message, :text => "hey", :to => eve.aspects.first.id)
- expect { delete :destroy, :format => :js, :id => message.id }.to raise_error(ActiveRecord::RecordNotFound)
- expect(StatusMessage.exists?(message.id)).to be true
+ it "will receive a retract post" do
+ expect(post_service_double).to receive(:retract_post)
+ expect(post_service_double).to receive(:post).and_return(@message)
+ message = alice.post(:status_message, text: "hey", to: alice.aspects.first.id)
+ delete :destroy, format: :js, id: message.id
end
end
end
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 32ee54b4f..6866b712e 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -16,7 +16,7 @@ describe RegistrationsController, :type => :controller do
:password_confirmation => "password"
}
}
- allow(Webfinger).to receive_message_chain(:new, :fetch).and_return(FactoryGirl.create(:person))
+ allow(Person).to receive(:find_or_fetch_by_identifier).and_return(FactoryGirl.create(:person))
end
describe '#check_registrations_open!' do
diff --git a/spec/controllers/statistics_controller_spec.rb b/spec/controllers/statistics_controller_spec.rb
deleted file mode 100644
index 07abf7370..000000000
--- a/spec/controllers/statistics_controller_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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 StatisticsController, type: :controller do
- describe "#statistics" do
- it "responds to format json" do
- get :statistics, format: "json"
- expect(response.code).to eq("200")
- end
-
- it "contains json" do
- get :statistics, format: "json"
- json = JSON.parse(response.body)
- expect(json["name"]).to be_present
- end
-
- it "responds to html" do
- get :statistics, format: "html"
- expect(response.code).to eq("200")
- end
-
- it "responds to mobile" do
- get :statistics, format: "mobile"
- expect(response.code).to eq("200")
- end
- end
-end
diff --git a/spec/factories.rb b/spec/factories.rb
index 42c39caca..87110bcf0 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -294,4 +294,33 @@ FactoryGirl.define do
end
factory(:status, :parent => :status_message)
+
+ # Factories for the DiasporaFederation-gem
+
+ factory(:federation_person_from_webfinger, class: DiasporaFederation::Entities::Person) do
+ sequence(:guid) { UUID.generate :compact }
+ sequence(:diaspora_id) {|n| "bob-person-#{n}#{r_str}@example.net" }
+ url AppConfig.pod_uri.to_s
+ exported_key OpenSSL::PKey::RSA.generate(1024).public_key.export
+ profile {
+ DiasporaFederation::Entities::Profile.new(
+ FactoryGirl.attributes_for(:federation_profile_from_hcard, diaspora_id: diaspora_id))
+ }
+ end
+
+ factory(:federation_profile_from_hcard, class: DiasporaFederation::Entities::Profile) do
+ sequence(:diaspora_id) {|n| "bob-person-#{n}#{r_str}@example.net" }
+ sequence(:first_name) {|n| "My Name#{n}#{r_str}" }
+ last_name nil
+ image_url "/assets/user/default.png"
+ image_url_medium "/assets/user/default.png"
+ image_url_small "/assets/user/default.png"
+ searchable true
+ end
+
+ factory :federation_profile_from_hcard_with_image_url, parent: :federation_profile_from_hcard do
+ image_url "http://example.com/image.jpg"
+ image_url_medium "http://example.com/image_mid.jpg"
+ image_url_small "http://example.com/image_small.jpg"
+ end
end
diff --git a/spec/federation_callbacks_spec.rb b/spec/federation_callbacks_spec.rb
index b0502198f..a2f3432b5 100644
--- a/spec/federation_callbacks_spec.rb
+++ b/spec/federation_callbacks_spec.rb
@@ -1,10 +1,10 @@
require "spec_helper"
describe "diaspora federation callbacks" do
- describe ":person_webfinger_fetch" do
+ describe ":fetch_person_for_webfinger" do
it "returns a WebFinger instance with the data from the person" do
person = alice.person
- wf = DiasporaFederation.callbacks.trigger(:person_webfinger_fetch, alice.diaspora_handle)
+ wf = DiasporaFederation.callbacks.trigger(:fetch_person_for_webfinger, alice.diaspora_handle)
expect(wf.acct_uri).to eq("acct:#{person.diaspora_handle}")
expect(wf.alias_url).to eq(AppConfig.url_to("/people/#{person.guid}"))
expect(wf.hcard_url).to eq(AppConfig.url_to("/hcard/users/#{person.guid}"))
@@ -17,15 +17,15 @@ describe "diaspora federation callbacks" do
end
it "returns nil if the person was not found" do
- wf = DiasporaFederation.callbacks.trigger(:person_webfinger_fetch, "unknown@example.com")
+ wf = DiasporaFederation.callbacks.trigger(:fetch_person_for_webfinger, "unknown@example.com")
expect(wf).to be_nil
end
end
- describe ":person_hcard_fetch" do
+ describe ":fetch_person_for_hcard" do
it "returns a HCard instance with the data from the person" do
person = alice.person
- hcard = DiasporaFederation.callbacks.trigger(:person_hcard_fetch, alice.guid)
+ hcard = DiasporaFederation.callbacks.trigger(:fetch_person_for_hcard, alice.guid)
expect(hcard.guid).to eq(person.guid)
expect(hcard.nickname).to eq(person.username)
expect(hcard.full_name).to eq("#{person.profile.first_name} #{person.profile.last_name}")
@@ -44,13 +44,107 @@ describe "diaspora federation callbacks" do
user.person.profile.last_name = nil
user.person.profile.save
- hcard = DiasporaFederation.callbacks.trigger(:person_hcard_fetch, user.guid)
+ hcard = DiasporaFederation.callbacks.trigger(:fetch_person_for_hcard, user.guid)
expect(hcard.full_name).to eq(user.person.profile.first_name)
end
it "returns nil if the person was not found" do
- hcard = DiasporaFederation.callbacks.trigger(:person_hcard_fetch, "1234567890abcdef")
+ hcard = DiasporaFederation.callbacks.trigger(:fetch_person_for_hcard, "1234567890abcdef")
expect(hcard).to be_nil
end
end
+
+ describe ":save_person_after_webfinger" do
+ context "new person" do
+ it "creates a new person" do
+ person = DiasporaFederation::Entities::Person.new(FactoryGirl.attributes_for(:federation_person_from_webfinger))
+
+ DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person)
+
+ person_entity = Person.find_by(diaspora_handle: person.diaspora_id)
+ expect(person_entity.guid).to eq(person.guid)
+ expect(person_entity.serialized_public_key).to eq(person.exported_key)
+ expect(person_entity.url).to eq(person.url)
+
+ profile = person.profile
+ profile_entity = person_entity.profile
+ expect(profile_entity.first_name).to eq(profile.first_name)
+ expect(profile_entity.last_name).to eq(profile.last_name)
+ expect(profile_entity[:image_url]).to be_nil
+ expect(profile_entity[:image_url_medium]).to be_nil
+ expect(profile_entity[:image_url_small]).to be_nil
+ expect(profile_entity.searchable).to eq(profile.searchable)
+ end
+
+ it "creates a new person with images" do
+ person = DiasporaFederation::Entities::Person.new(
+ FactoryGirl.attributes_for(
+ :federation_person_from_webfinger,
+ profile: DiasporaFederation::Entities::Profile.new(
+ FactoryGirl.attributes_for(:federation_profile_from_hcard_with_image_url))
+ )
+ )
+
+ DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person)
+
+ person_entity = Person.find_by(diaspora_handle: person.diaspora_id)
+ expect(person_entity.guid).to eq(person.guid)
+ expect(person_entity.serialized_public_key).to eq(person.exported_key)
+ expect(person_entity.url).to eq(person.url)
+
+ profile = person.profile
+ profile_entity = person_entity.profile
+ expect(profile_entity.first_name).to eq(profile.first_name)
+ expect(profile_entity.last_name).to eq(profile.last_name)
+ expect(profile_entity.image_url).to eq(profile.image_url)
+ expect(profile_entity.image_url_medium).to eq(profile.image_url_medium)
+ expect(profile_entity.image_url_small).to eq(profile.image_url_small)
+ expect(profile_entity.searchable).to eq(profile.searchable)
+ end
+ end
+
+ context "update profile" do
+ let(:existing_person_entity) { FactoryGirl.create(:person) }
+ let(:person) {
+ DiasporaFederation::Entities::Person.new(
+ FactoryGirl.attributes_for(:federation_person_from_webfinger,
+ diaspora_id: existing_person_entity.diaspora_handle)
+ )
+ }
+
+ it "updates an existing profile" do
+ DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person)
+
+ person_entity = Person.find_by(diaspora_handle: existing_person_entity.diaspora_handle)
+
+ profile = person.profile
+ profile_entity = person_entity.profile
+ expect(profile_entity.first_name).to eq(profile.first_name)
+ expect(profile_entity.last_name).to eq(profile.last_name)
+ end
+
+ it "should not change the existing person" do
+ DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person)
+
+ person_entity = Person.find_by(diaspora_handle: existing_person_entity.diaspora_handle)
+ expect(person_entity.guid).to eq(existing_person_entity.guid)
+ expect(person_entity.serialized_public_key).to eq(existing_person_entity.serialized_public_key)
+ expect(person_entity.url).to eq(existing_person_entity.url)
+ end
+
+ it "creates profile for existing person if no profile present" do
+ existing_person_entity.profile = nil
+ existing_person_entity.save
+
+ DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person)
+
+ person_entity = Person.find_by(diaspora_handle: existing_person_entity.diaspora_handle)
+
+ profile = person.profile
+ profile_entity = person_entity.profile
+ expect(profile_entity.first_name).to eq(profile.first_name)
+ expect(profile_entity.last_name).to eq(profile.last_name)
+ end
+ end
+ end
end
diff --git a/spec/fixtures/evan_hcard b/spec/fixtures/evan_hcard
deleted file mode 100644
index 8944ef1e3..000000000
--- a/spec/fixtures/evan_hcard
+++ /dev/null
@@ -1,72 +0,0 @@
- <body id="hcard">
-
- <div id="wrap">
- <div id="core">
- <dl id="site_nav_local_views">
- <dt>Local views</dt>
- <dd></dd>
-</dl>
- <div id="content">
- <h1>Evan Prodromou</h1>
-
- <div id="content_inner">
- <div id="i" class="entity_profile vcard author">
- <h2>User profile</h2>
- <dl class="entity_depiction">
- <dt>Photo</dt>
- <dd>
- <img src="http://avatar.status.net/evan/1-96-20100726204409.jpeg" class="photo avatar" width="96" height="96" alt="evan"/>
-</dd>
-
-</dl>
- <dl class="entity_nickname">
- <dt>Nickname</dt>
- <dd>
- <a href="http://evan.status.net/" rel="me" class="nickname url uid">evan</a>
-</dd>
-</dl>
- <dl class="entity_fn">
- <dt>Full name</dt>
-
- <dd>
- <span class="fn">Evan Prodromou</span>
-</dd>
-</dl>
- <dl class="entity_location">
- <dt>Location</dt>
- <dd class="label">Montreal, QC, Canada</dd>
-</dl>
- <dl class="entity_url">
-
- <dt>URL</dt>
- <dd>
- <a href="http://evan.prodromou.name/" rel="me" class="url">http://evan.prodromou.name/</a>
-</dd>
-</dl>
- <dl class="entity_note">
- <dt>Note</dt>
- <dd class="note">Montreal hacker and entrepreneur. Founder of identi.ca, lead developer of StatusNet, CEO of StatusNet Inc.</dd>
-
-</dl>
-</div>
-</div>
-</div>
-</div>
- <div id="footer">
- <dl id="licenses">
- <dt id="site_statusnet_license">StatusNet software license</dt>
- <dd><p><strong>Evan Prodromou</strong> is a microblogging service brought to you by <a href="http://status.net/">Status.net</a>. It runs the <a href="http://status.net/">StatusNet</a> microblogging software, version 0.9.5, available under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">GNU Affero General Public License</a>.</p>
-
-</dd>
- <dt id="site_content_license">Site content license</dt>
- <dd id="site_content_license_cc">
- <p>
- <img id="license_cc" src="http://i.creativecommons.org/l/by/3.0/80x15.png" alt="Creative Commons Attribution 3.0" width="80" height="15"/>:w
-
- All Evan Prodromou content and data are available under the <a class="license" rel="external license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.</p>
-</dd>
-
-</dl>
-</div>
-</div>
-</body>
diff --git a/spec/fixtures/finger_xrd b/spec/fixtures/finger_xrd
deleted file mode 100644
index 5ede32d74..000000000
--- a/spec/fixtures/finger_xrd
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
- <Subject>acct:tom@tom.joindiaspora.com</Subject>
- <Alias>"http://tom.joindiaspora.com/"</Alias>
- <Link rel="http://microformats.org/profile/hcard" type="text/html" href="http://tom.joindiaspora.com/hcard/users/4c8eccce34b7da59ff000002"/>
- <Link rel="http://joindiaspora.com/seed_location" type="text/html" href="http://tom.joindiaspora.com/"/>
- <Link rel="http://joindiaspora.com/guid" type="text/html" href="4c8eccce34b7da59ff000002"/>
- <Link rel='http://webfinger.net/rel/profile-page' type='text/html' href="http://tom.joindiaspora.com/u/tom"/>
- <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="http://tom.joindiaspora.com/u/tom.atom"/>
- <Link rel="diaspora-public-key" type="RSA" href="LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUNDZ0tDQWdFQXlt dHpUdWQ3SytXQklPVVYwMmxZN2Z1NjdnNWQrbTBra1ZIQlgzTk1uYXB5bnZL a0VSemoKbkxma2JrTVpEVGdPNG1UaThmWFI3Q1ZSK3Q1SFN4b2Vub0JWazVX eUFabkEzWmpTRjBPcC9RakhlYzhvK0dVSApDOFluNFJ5N01hQ0R1cUNpNnJv c2RlbUlLTm1Fa2dsVVY1VzZ4WFd4Vmtrb21oL2VCQ2FmaVdMTXFRMG82NGox Ckw3aXNjQjVOM3ZkbnBrUmU3SkFxLzNDUTI3dWhDS0ZIWG1JYm1iVmhJQTNC R0J6YStPV3NjK1Z5cjV0Mm1wSlIKU1RXMk9UL20rS0NPK21kdnpmenQ0TzEr UHc1M1pJMjRpMlc2cW1XdThFZ1Z6QVcyMStuRGJManZiNHpzVHlrNQppN1JM cG8rUFl2VUJlLy8wM1lkQUJoRlJhVXpTL0RtcWRubEVvb0VvK0VmYzRkQ1NF bWVkMUgrek01c2xqQm1rCks5amsvOHNQZDB0SVZmMWZXdW9BcWZTSmErSXdr OHNybkdZbEVlaFV1dVhIY0x2b2JlUXJKYWdiRGc1Qll5TnIKeTAzcHpKTHlS ZU9UcC9RK1p0TXpMOFJMZWJsUzlWYXdNQzNDVzc5K0RGditTWGZ0eTl3NC8w d2NpUHpKejg2bgp2VzJ5K3crTThOWG52enBWNU81dGI4azZxZ2N0WjBmRzFu eXQ0RklsSHNVaUVoNnZLZmNLSmFPeWFRSGNGcWVxCjkwUkpoMm9TMDJBdFJx TFRSWDJJQjFnYXZnWEFXN1NYanJNbUNlVzlCdVBKYU5nZkp3WFFaelVoa0tC V1k0VnMKZTRFVWRob3R5RWkvUmE0RXVZU01ZcnZEeUFRUHJsY0wveDliaU1p bHVPcU9OMEpJZ1VodEZQRUNBd0VBQVE9PQotLS0tLUVORCBSU0EgUFVCTElD IEtFWS0tLS0tCg== "/>
-</XRD>
diff --git a/spec/fixtures/hcard_response b/spec/fixtures/hcard_response
deleted file mode 100644
index 302c02430..000000000
--- a/spec/fixtures/hcard_response
+++ /dev/null
@@ -1,64 +0,0 @@
-
-<div id='content'>
- <h1>Alexander Hamiltom</h1>
- <div id='content_inner'>
- <div class='entity_profile vcard author' id='i'>
- <h2>User profile</h2>
- <dl class='entity_nickname'>
- <dt>Nickname</dt>
- <dd>
- <a class='nickname url uid' href='http://localhost:3000/' rel='me'>Alexander Hamiltom</a>
- </dd>
- </dl>
- <dl class='entity_given_name'>
- <dt>First name</dt>
- <dd>
- <span class='given_name'>Alexander</span>
- </dd>
- </dl>
- <dl class='entity_family_name'>
- <dt>Family name</dt>
- <dd>
- <span class='family_name'>Hamiltom</span>
- </dd>
- </dl>
- <dl class='entity_fn'>
- <dt>Full name</dt>
- <dd>
- <span class='fn'>Alexander Hamiltom</span>
- </dd>
- </dl>
- <dl class='entity_url'>
- <dt>URL</dt>
- <dd>
- <a class='url' href='http://localhost:3000/' id='pod_location' rel='me'>http://localhost:3000/</a>
- </dd>
- </dl>
- <dl class='entity_photo'>
- <dt>Photo</dt>
- <dd>
- <img class='photo avatar' height='300px' src='http://localhost:3000/uploads/images/thumb_large_8rxQAwC4Vx4cf5667d37db5b0fef000003.jpg' width='300px'>
- </dd>
- </dl>
- <dl class='entity_photo_medium'>
- <dt>Photo</dt>
- <dd>
- <img class='photo avatar' height='100px' src='http://localhost:3000/uploads/images/thumb_medium_8rxQAwC4Vx4cf5667d37db5b0fef000003.jpg' width='100px'>
- </dd>
- </dl>
- <dl class='entity_photo_small'>
- <dt>Photo</dt>
- <dd>
- <img class='photo avatar' height='50px' src='http://localhost:3000/uploads/images/thumb_small_8rxQAwC4Vx4cf5667d37db5b0fef000003.jpg' width='50px'>
- </dd>
- </dl>
- <dl class='entity_searchable'>
- <dt>Searchable</dt>
- <dd>
- <span class='searchable'>false</span>
- </dd>
- </dl>
- </div>
- </div>
-</div>
-
diff --git a/spec/fixtures/host_xrd b/spec/fixtures/host_xrd
deleted file mode 100644
index ca2d3b5fc..000000000
--- a/spec/fixtures/host_xrd
+++ /dev/null
@@ -1,7 +0,0 @@
- <?xml version='1.0' encoding='UTF-8'?>
- <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
- <Link rel='lrdd'
- template='http://tom.joindiaspora.com/webfinger/?q={uri}'>
- <Title>Resource Descriptor</Title>
- </Link>
- </XRD>
diff --git a/spec/fixtures/nonseed_finger_xrd b/spec/fixtures/nonseed_finger_xrd
deleted file mode 100644
index b26e7d15d..000000000
--- a/spec/fixtures/nonseed_finger_xrd
+++ /dev/null
@@ -1,15 +0,0 @@
- <XRD>
- <Subject>acct:evan@status.net</Subject>
- <Alias>acct:evan@evan.status.net</Alias>
- <Alias>http://evan.status.net/user/1</Alias>
- <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="http://evan.status.net/user/1"/>
- <Link rel="http://schemas.google.com/g/2010#updates-from" href="http://evan.status.net/api/statuses/user_timeline/1.atom" type="application/atom+xml"/>
- <Link rel="http://microformats.org/profile/hcard" type="text/html" href="http://evan.status.net/hcard"/>
- <Link rel="http://gmpg.org/xfn/11" type="text/html" href="http://evan.status.net/user/1"/>
- <Link rel="describedby" type="application/rdf+xml" href="http://evan.status.net/foaf"/>
- <Link rel="salmon" href="http://evan.status.net/main/salmon/user/1"/>
- <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="http://evan.status.net/main/salmon/user/1"/>
- <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="http://evan.status.net/main/salmon/user/1"/>
- <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.vyohOlwX03oJUg6R8BQP4V-6QQUfPg9gzOwk3ENQjqeGorHN8RNI4rhCQp7tACe9DEdEKtzZHbSvQC2zRICQ9JG_SIcpiU9jcT2imN5cPLZZQuPFZWwG4xPu_8LKRHuXeLGkzQMjvg6jFBl7qdo_iPnlbtIBb-mEuAnfRMcdUPE=.AQAB"/>
- <Link rel="http://ostatus.org/schema/1.0/subscribe" template="http://evan.status.net/main/ostatussub?profile={uri}"/>
- </XRD>
diff --git a/spec/helper_methods.rb b/spec/helper_methods.rb
index e0df90faa..ad4371a34 100644
--- a/spec/helper_methods.rb
+++ b/spec/helper_methods.rb
@@ -19,46 +19,6 @@ module HelperMethods
:receiving => true)
end
- def stub_success(address = 'abc@example.com', opts = {})
- host = address.split('@')[1]
- stub_request(:get, "https://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd)
- stub_request(:get, "http://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd)
- if opts[:diaspora] || host.include?("diaspora")
- stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 200, :body => finger_xrd)
- stub_request(:get, "http://#{host}/hcard/users/4c8eccce34b7da59ff000002").to_return(:status => 200, :body => hcard_response)
- else
- stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 200, :body => nonseed_finger_xrd)
- stub_request(:get, 'http://evan.status.net/hcard').to_return(:status => 200, :body => evan_hcard)
- end
- end
-
- def stub_failure(address = 'abc@example.com')
- host = address.split('@')[1]
- stub_request(:get, "https://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd)
- stub_request(:get, "http://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd)
- stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 500)
- end
-
- def host_xrd
- File.open(File.dirname(__FILE__) + '/fixtures/host_xrd').read
- end
-
- def finger_xrd
- File.open(File.dirname(__FILE__) + '/fixtures/finger_xrd').read
- end
-
- def hcard_response
- File.open(File.dirname(__FILE__) + '/fixtures/hcard_response').read
- end
-
- def nonseed_finger_xrd
- File.open(File.dirname(__FILE__) + '/fixtures/nonseed_finger_xrd').read
- end
-
- def evan_hcard
- File.open(File.dirname(__FILE__) + '/fixtures/evan_hcard').read
- end
-
def uploaded_photo
fixture_filename = 'button.png'
fixture_name = File.join(File.dirname(__FILE__), 'fixtures', fixture_filename)
diff --git a/spec/helpers/people_helper_spec.rb b/spec/helpers/people_helper_spec.rb
index d127ff244..2c5f13927 100644
--- a/spec/helpers/people_helper_spec.rb
+++ b/spec/helpers/people_helper_spec.rb
@@ -23,6 +23,9 @@ describe PeopleHelper, :type => :helper do
end
describe "#person_image_tag" do
+ it "returns an empty string if person is nil" do
+ expect(person_image_tag(nil)).to eq("")
+ end
it "should not allow basic XSS/HTML" do
@person.profile.first_name = "I'm <h1>Evil"
@person.profile.last_name = "I'm <h1>Evil"
diff --git a/spec/integration/receiving_spec.rb b/spec/integration/receiving_spec.rb
index 1d31116e9..c62241cf7 100644
--- a/spec/integration/receiving_spec.rb
+++ b/spec/integration/receiving_spec.rb
@@ -225,11 +225,10 @@ describe 'a user receives a post', :type => :request do
Profile.where(:person_id => remote_person.id).delete_all
remote_person.attributes.delete(:id) # leaving a nil id causes it to try to save with id set to NULL in postgres
- m = double()
- expect(Webfinger).to receive(:new).twice.with(eve.person.diaspora_handle).and_return(m)
remote_person.save(:validate => false)
remote_person.profile = FactoryGirl.create(:profile, :person => remote_person)
- expect(m).to receive(:fetch).twice.and_return(remote_person)
+ expect(Person).to receive(:find_or_fetch_by_identifier).twice.with(eve.person.diaspora_handle)
+ .and_return(remote_person)
expect(bob.reload.visible_shareables(Post).size).to eq(1)
post_in_db = StatusMessage.find(@post.id)
diff --git a/spec/javascripts/app/views/back_to_top_view_spec.js b/spec/javascripts/app/views/back_to_top_view_spec.js
new file mode 100644
index 000000000..726c1ae1b
--- /dev/null
+++ b/spec/javascripts/app/views/back_to_top_view_spec.js
@@ -0,0 +1,38 @@
+describe("app.views.BackToTop", function() {
+ beforeEach(function() {
+ spec.loadFixture("aspects_index");
+ this.view = new app.views.BackToTop({el: $(document)});
+ });
+
+ describe("events hash", function() {
+ it("calls backToTop when clicking the back-to-top button", function() {
+ spyOn(this.view, "backToTop");
+ this.view.delegateEvents();
+ this.view.$("#back-to-top").click();
+ expect(this.view.backToTop).toHaveBeenCalled();
+ });
+ });
+
+ describe("backToTop", function() {
+ it("scrolls to the top of the page", function() {
+ var spy = spyOn($.fn, "animate");
+ this.view.backToTop($.Event());
+ expect(spy).toHaveBeenCalledWith({scrollTop: 0});
+ });
+ });
+
+ describe("toggleVisibility", function() {
+ it("toggles the button visibility depending on the scroll position", function() {
+ expect($("#back-to-top")).not.toHaveClass("visible");
+ var spy = spyOn($.fn, "scrollTop").and.returnValue(1000);
+ this.view.toggleVisibility();
+ expect($("#back-to-top")).not.toHaveClass("visible");
+ spy.and.returnValue(1001);
+ this.view.toggleVisibility();
+ expect($("#back-to-top")).toHaveClass("visible");
+ spy.and.returnValue(1000);
+ this.view.toggleVisibility();
+ expect($("#back-to-top")).not.toHaveClass("visible");
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/feedback_view_spec.js b/spec/javascripts/app/views/feedback_view_spec.js
index cc6b5da35..18f093fe6 100644
--- a/spec/javascripts/app/views/feedback_view_spec.js
+++ b/spec/javascripts/app/views/feedback_view_spec.js
@@ -60,13 +60,19 @@ describe("app.views.Feedback", function(){
});
it("allows for unliking a just-liked post", function(){
- var responseText = JSON.stringify({"author": this.userAttrs});
- var ajax_success = { status: 201, responseText: responseText };
expect(this.link().text()).toContain(Diaspora.I18n.t("stream.like"));
this.link().click();
- jasmine.Ajax.requests.mostRecent().respondWith(ajax_success);
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 201,
+ responseText: JSON.stringify({
+ id: 42,
+ guid: 42,
+ author: this.userAttrs
+ })
+ });
expect(this.link().text()).toContain(Diaspora.I18n.t("stream.unlike"));
this.link().click();
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 204});
expect(this.link().text()).toContain(Diaspora.I18n.t("stream.like"));
});
});
diff --git a/spec/javascripts/app/views/stream_faces_view_spec.js b/spec/javascripts/app/views/stream_faces_view_spec.js
index 98d24897a..af42b3c6d 100644
--- a/spec/javascripts/app/views/stream_faces_view_spec.js
+++ b/spec/javascripts/app/views/stream_faces_view_spec.js
@@ -21,11 +21,15 @@ describe("app.views.StreamFaces", function(){
expect(this.view.people.length).toBe(5);
});
- it("findsPeople when the collection changes", function(){
+ it("Finds people that were added to the collection", function() {
this.posts.add(factory.post({author : factory.author({name : "Harriet Tubman"})}));
expect(this.view.people.length).toBe(6);
});
+ it("Finds people that were removed from the collection", function() {
+ this.posts.remove([this.post2, this.post3]);
+ expect(this.view.people.length).toBe(3);
+ });
describe(".render", function(){
beforeEach(function(){
diff --git a/spec/javascripts/app/views/stream_post_spec.js b/spec/javascripts/app/views/stream_post_spec.js
index e660db727..47084bd6e 100644
--- a/spec/javascripts/app/views/stream_post_spec.js
+++ b/spec/javascripts/app/views/stream_post_spec.js
@@ -144,7 +144,7 @@ describe("app.views.StreamPost", function(){
this.view = new this.PostViewClass({model : this.statusMessage}).render();
this.hiddenPosts = function(){
- return this.view.$(".nsfw-shield");
+ return this.view.$(".media.shield-active .nsfw-shield");
};
});
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
index 50f11c159..f6279d7c3 100644
--- a/spec/javascripts/support/jasmine.yml
+++ b/spec/javascripts/support/jasmine.yml
@@ -77,3 +77,6 @@ src_dir:
# spec_dir: spec/javascripts
#
spec_dir: spec/javascripts
+
+rack_options:
+ Host: '0.0.0.0'
diff --git a/spec/javascripts/widgets/back-to-top-spec.js b/spec/javascripts/widgets/back-to-top-spec.js
deleted file mode 100644
index 35543969a..000000000
--- a/spec/javascripts/widgets/back-to-top-spec.js
+++ /dev/null
@@ -1,53 +0,0 @@
-describe("Diaspora.Widgets.BackToTop", function() {
- var backToTop;
- beforeEach(function() {
- spec.loadFixture("aspects_index");
- backToTop = Diaspora.BaseWidget.instantiate("BackToTop", $("#back-to-top"));
- $.fx.off = true;
- });
-
- describe("integration", function() {
- beforeEach(function() {
- backToTop = new Diaspora.Widgets.BackToTop();
-
- spyOn(backToTop, "backToTop");
- spyOn(backToTop, "toggleVisibility");
-
- backToTop.publish("widget/ready", [$("#back-to-top")]);
- });
-
- it("calls backToTop when the button is clicked", function() {
- backToTop.button.click();
-
- expect(backToTop.backToTop).toHaveBeenCalled();
- });
- });
-
- describe("backToTop", function() {
- it("animates scrollTop to 0", function() {
- backToTop.backToTop($.Event());
-
- expect($("body").scrollTop()).toEqual(0);
- });
- });
-
- describe("toggleVisibility", function() {
- it("adds a visibility class to the button", function() {
- var spy = spyOn(backToTop.body, "scrollTop").and.returnValue(999);
-
- backToTop.toggleVisibility();
-
- expect(backToTop.button.hasClass("visible")).toBe(false);
-
- spy.and.returnValue(1001);
-
- backToTop.toggleVisibility();
-
- expect(backToTop.button.hasClass("visible")).toBe(true);
- });
- });
-
- afterEach(function() {
- $.fx.off = false;
- });
-});
diff --git a/spec/lib/h_card_spec.rb b/spec/lib/h_card_spec.rb
deleted file mode 100644
index d4197c0b4..000000000
--- a/spec/lib/h_card_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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 HCard do
- it "should parse an hcard" do
- raw_hcard = hcard_response
- hcard = HCard.build raw_hcard
- expect(hcard[:family_name].include?("Hamiltom")).to be true
- expect(hcard[:given_name].include?("Alex")).to be true
- expect(hcard[:photo].include?("thumb_large")).to be true
- expect(hcard[:photo_medium].include?("thumb_medium")).to be true
- expect(hcard[:photo_small].include?("thumb_small")).to be true
- expect(hcard[:url]).to eq("http://localhost:3000/")
- expect(hcard[:searchable]).to eq(false)
- end
-
- it "should parse an hcard with searchable true" do
- raw_hcard = hcard_response.sub("<span class='searchable'>false</span>", "<span class='searchable'>true</span>")
- hcard = HCard.build raw_hcard
- expect(hcard[:family_name].include?("Hamiltom")).to be true
- expect(hcard[:given_name].include?("Alex")).to be true
- expect(hcard[:photo].include?("thumb_large")).to be true
- expect(hcard[:photo_medium].include?("thumb_medium")).to be true
- expect(hcard[:photo_small].include?("thumb_small")).to be true
- expect(hcard[:url]).to eq("http://localhost:3000/")
- expect(hcard[:searchable]).to eq(true)
- end
-
- it "should parse an hcard with empty searchable" do
- raw_hcard = hcard_response.sub("<span class='searchable'>false</span>", "<span class='searchable'></span>")
- hcard = HCard.build raw_hcard
- expect(hcard[:family_name].include?("Hamiltom")).to be true
- expect(hcard[:given_name].include?("Alex")).to be true
- expect(hcard[:photo].include?("thumb_large")).to be true
- expect(hcard[:photo_medium].include?("thumb_medium")).to be true
- expect(hcard[:photo_small].include?("thumb_small")).to be true
- expect(hcard[:url]).to eq("http://localhost:3000/")
- expect(hcard[:searchable]).to eq(false)
- end
-end
diff --git a/spec/lib/postzord/receiver/private_spec.rb b/spec/lib/postzord/receiver/private_spec.rb
index 717dbe8c1..088df5ecf 100644
--- a/spec/lib/postzord/receiver/private_spec.rb
+++ b/spec/lib/postzord/receiver/private_spec.rb
@@ -13,7 +13,7 @@ describe Postzord::Receiver::Private do
describe '.initialize' do
it 'valid for local' do
- expect(Webfinger).not_to receive(:new)
+ expect(Person).not_to receive(:find_or_fetch_by_identifier)
expect(Salmon::EncryptedSlap).not_to receive(:from_xml)
zord = Postzord::Receiver::Private.new(bob, :person => alice.person, :object => @alices_post)
@@ -24,11 +24,9 @@ describe Postzord::Receiver::Private do
it 'valid for remote' do
salmon_double = double()
- web_double = double()
- expect(web_double).to receive(:fetch).and_return true
expect(salmon_double).to receive(:author_id).and_return(true)
expect(Salmon::EncryptedSlap).to receive(:from_xml).with(@salmon_xml, bob).and_return(salmon_double)
- expect(Webfinger).to receive(:new).and_return(web_double)
+ expect(Person).to receive(:find_or_fetch_by_identifier).and_return(true)
zord = Postzord::Receiver::Private.new(bob, :salmon_xml => @salmon_xml)
expect(zord.instance_variable_get(:@user)).not_to be_nil
diff --git a/spec/lib/rake_helper_spec.rb b/spec/lib/rake_helper_spec.rb
deleted file mode 100644
index c0db62701..000000000
--- a/spec/lib/rake_helper_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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'
-require 'rake_helpers'
-
-include RakeHelpers
-describe RakeHelpers do
- before do
- @csv = Rails.root.join('spec', 'fixtures', 'test.csv')
- end
-
- describe '#process_emails' do
- before do
- Devise.mailer.deliveries = []
- AppConfig.admins.account = FactoryGirl.create(:user).username
- end
-
- it 'should send emails to each email' do
- expect(EmailInviter).to receive(:new).exactly(3).times.and_return(double.as_null_object)
- process_emails(@csv, 100, 1, false)
- end
- end
-end
-
diff --git a/spec/lib/statistics_spec.rb b/spec/lib/statistics_spec.rb
deleted file mode 100644
index 87597f062..000000000
--- a/spec/lib/statistics_spec.rb
+++ /dev/null
@@ -1,177 +0,0 @@
-require 'spec_helper'
-
-describe Statistics do
-
- def result_should_equal( actual )
- expect(actual.count).to eq(@result.count)
- @result.each do |expected_hash|
- expect(actual.find { |actual_hash|
- actual_hash['id'].to_i == expected_hash['id'].to_i &&
- actual_hash['count'].to_i == expected_hash['count'].to_i
- }).not_to be_nil
- end
- end
-
- before do
- @time = Time.now
- @stats = Statistics.new#(@time, @time - 1.week)
- @result = [{"id" => alice.id , "count" => 0 },
- {"id" => bob.id , "count" => 1 },
- {"id" => eve.id , "count" => 0 },
- {"id" => local_luke.id , "count" => 0 },
- {"id" => local_leia.id , "count" => 0 },
- {"id" => peter.id , "count" => 0 }]
- end
-
- describe '#posts_count_sql' do
- it "pulls back an array of post counts and ids" do
- FactoryGirl.create(:status_message, :author => bob.person)
- result_should_equal User.connection.select_all(@stats.posts_count_sql)
- end
- end
-
- describe '#comments_count_sql' do
- it "pulls back an array of post counts and ids" do
- status_message = FactoryGirl.create(:status_message, :author => alice.person)
- bob.comment!(status_message, "sup")
- result_should_equal User.connection.select_all(@stats.comments_count_sql)
- end
- end
-
-
- describe '#invites_sent_count_sql' do
- it "pulls back an array of invite counts and ids" do
- Invitation.batch_invite(["a@a.com"], :sender => bob, :aspect => bob.aspects.first, :service => 'email')
- result_should_equal User.connection.select_all(@stats.invites_sent_count_sql)
- end
- end
-
- describe '#tags_followed_count_sql' do
- it "pulls back an array of tag following counts and ids" do
- TagFollowing.create!(:user => bob, :tag_id => 1)
- result_should_equal User.connection.select_all(@stats.tags_followed_count_sql)
- end
- end
-
- describe '#mentions_count_sql' do
- it "pulls back an array of mentions following counts and ids" do
- post = FactoryGirl.create(:status_message, :author => bob.person)
- Mention.create(:post => post, :person => bob.person)
- result_should_equal User.connection.select_all(@stats.mentions_count_sql)
- end
- end
-
- describe '#contacts_sharing_with_count_sql' do
- it "pulls back an array of mentions following counts and ids" do
- # bob is sharing with alice and eve in the spec setup
- alice.share_with(eve.person, alice.aspects.first)
- @result = [{"id" => alice.id , "count" => 2 },
- {"id" => bob.id , "count" => 2 },
- {"id" => eve.id , "count" => 1 },
- {"id" => local_luke.id , "count" => 2 },
- {"id" => local_leia.id , "count" => 2 },
- {"id" => peter.id , "count" => 1 }]
-
- result_should_equal User.connection.select_all(@stats.contacts_sharing_with_count_sql)
- end
- end
-
- describe '#sign_in_count_sql' do
- it "pulls back an array of sign_in_counts and ids" do
- bob.sign_in_count = 1
- bob.save!
- result_should_equal User.connection.select_all(@stats.sign_in_count_sql)
- end
- end
-
- describe "#fb_connected_distribution_sql" do
- it "pulls back an array of sign_in_counts, connected, uids" do
- bob.sign_in_count = 1
- bob.services << FactoryGirl.create(:service, :type => "Services::Facebook", :user => bob)
- bob.save!
-
- eve.services << FactoryGirl.create(:service, :type => "Services::Facebook", :user => eve)
- eve.save!
-
-
- @result = [{"id" => alice.id , "count" => 0, "connected" => 0 },
- {"id" => bob.id , "count" => 1, "connected" => 1 },
- {"id" => eve.id , "count" => 0, "connected" => 1 },
- {"id" => local_luke.id , "count" => 0, "connected" => 0 },
- {"id" => local_leia.id , "count" => 0, "connected" => 0 },
- {"id" => peter.id , "count" => 0, "connected" => 0 }]
-
- expect(@stats.fb_connected_distribution).to match_array(@result)
- end
- end
-
- ["posts_count", "comments_count", "invites_sent_count", "tags_followed_count",
- "mentions_count", "sign_in_count", "contacts_sharing_with_count" ].each do |method|
-
- it "#{method}_sql calls where_sql" do
- expect(@stats).to receive(:where_clause_sql)
-
- @stats.send("#{method}_sql".to_sym)
- end
-
- if !["sign_in_count", "tags_followed_count"].include?(method)
- it "#generate_correlations calls correlate with #{method} and sign_in_count" do
- allow(@stats).to receive(:correlate).and_return(0.5)
- expect(@stats).to receive(:correlate).with(method.to_sym,:sign_in_count).and_return(0.75)
- @stats.generate_correlations
- end
- end
- end
-
-
- describe "#correlation" do
- it 'returns the correlation coefficient' do
- expect(@stats.correlation([1,2],[1,2]).to_s).to eq(1.0.to_s)
- expect(@stats.correlation([1,2,1,2],[1,1,2,2]).to_s).to eq(0.0.to_s)
- end
- end
- describe "#generate_correlations" do
- it 'returns the post count (and sign_in_count) correlation' do
- bob.sign_in_count = 1
- bob.post(:status_message, :text => "here is a message")
- bob.save!
-
- c = expect(@stats.generate_correlations[:posts_count].round(1)).to eq(1.0)
- end
- end
-
- describe "#correlate" do
- it 'calls correlation with post' do
- expect(User.connection).to receive(:select_all).and_return([{"id"=> 1, "count" => 7},
- {"id" => 2, "count" => 8},
- {"id" => 3, "count" => 9}],
- [{"id"=> 1, "count" => 17},
- {"id" => 3, "count" => 19}]
- )
-
- expect(@stats).to receive(:correlation).with([7,9],[17,19]).and_return(0.5)
- expect(@stats.correlate(:posts_count,:sign_in_count)).to eq(0.5)
- end
- end
-
-
-
-
- context 'todos' do
- before do
- skip
- end
-
- # requires a threshold
-
- describe '#disabled_email_count_sql' do
- end
-
- # binary things
- describe '#completed_getting_started_count_sql' do
- end
-
- describe '.sign_up_method_sql' do
- end
- end
-end
diff --git a/spec/lib/webfinger_profile_spec.rb b/spec/lib/webfinger_profile_spec.rb
deleted file mode 100644
index 51991f084..000000000
--- a/spec/lib/webfinger_profile_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-require 'spec_helper'
-
-describe WebfingerProfile do
- let(:webfinger_profile){File.open(Rails.root.join("spec", "fixtures", "finger_xrd")).read.strip}
- let(:not_diaspora_webfinger){File.open(Rails.root.join("spec", "fixtures", "nonseed_finger_xrd")).read.strip}
-
- let(:account){"tom@tom.joindiaspora.com"}
- let(:profile){ WebfingerProfile.new(account, webfinger_profile) }
-
- context "parsing a diaspora profile" do
-
- describe '#valid_diaspora_profile?' do
- it 'should check all of the required fields' do
- expect(manual_nil_check(profile)).to eq(profile.valid_diaspora_profile?)
- end
- end
-
- describe '#set_fields' do
- it 'should check to make sure it has a the right webfinger profile' do
- expect{ WebfingerProfile.new("nottom@tom.joindiaspora.com", webfinger_profile)}.to raise_error
- end
-
- it 'should handle a non-diaspora profile without blowing up' do
- expect{ WebfingerProfile.new("evan@status.net", not_diaspora_webfinger)}.not_to raise_error
- end
-
- [:links, :hcard, :guid, :seed_location, :public_key].each do |field|
- it 'should sets the #{field} field' do
- expect(profile.send(field)).to be_present
- end
- end
- end
- end
-
- def manual_nil_check(profile)
- profile.instance_variables.each do |var|
- var = var.to_s.gsub('@', '')
- return false if profile.send(var).nil? == true
- end
- true
- end
-end
diff --git a/spec/lib/webfinger_spec.rb b/spec/lib/webfinger_spec.rb
deleted file mode 100644
index c3515bebe..000000000
--- a/spec/lib/webfinger_spec.rb
+++ /dev/null
@@ -1,221 +0,0 @@
-# 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 Webfinger do
- let(:host_meta_xrd) { File.open(Rails.root.join('spec', 'fixtures', 'host-meta.fixture.html')).read }
- let(:webfinger_xrd) { File.open(Rails.root.join('spec', 'fixtures', 'webfinger.fixture.html')).read }
- let(:hcard_xml) { File.open(Rails.root.join('spec', 'fixtures', 'hcard.fixture.html')).read }
- let(:account){'foo@bar.com'}
- let(:account_in_fixtures){"alice@localhost:9887"}
- let(:finger){Webfinger.new(account)}
- let(:host_meta_url){"http://#{AppConfig.pod_uri.authority}/webfinger?q="}
-
- describe '#intialize' do
- it 'sets account ' do
- n = Webfinger.new("mbs348@gmail.com")
- expect(n.account).not_to be nil
- end
-
- it "downcases account and strips whitespace, and gsub 'acct:'" do
- n = Webfinger.new("acct:BIGBOY@Example.Org ")
- expect(n.account).to eq('bigboy@example.org')
- end
-
- it 'should set ssl as the default' do
- foo = Webfinger.new(account)
- expect(foo.ssl).to be true
- end
- end
-
- describe '.in_background' do
- it 'enqueues a Workers::FetchWebfinger job' do
- expect(Workers::FetchWebfinger).to receive(:perform_async).with(account)
- Webfinger.in_background(account)
- end
- end
-
- describe '#fetch' do
- it 'works' do
- finger = Webfinger.new(account_in_fixtures)
- allow(finger).to receive(:host_meta_xrd).and_return(host_meta_xrd)
- allow(finger).to receive(:hcard_xrd).and_return(hcard_xml)
- allow(finger).to receive(:webfinger_profile_xrd).and_return(webfinger_xrd)
- person = finger.fetch
- expect(person).to be_valid
- expect(person).to be_a Person
- end
-
- end
-
- describe '#get' do
- it 'makes a request and grabs the body' do
- url ="https://bar.com/.well-known/host-meta"
- stub_request(:get, url).
- to_return(:status => 200, :body => host_meta_xrd)
-
- expect(finger.get(url)).to eq(host_meta_xrd)
- end
-
- it 'follows redirects' do
- redirect_url = "http://whereami.whatisthis/host-meta"
-
- stub_request(:get, "https://bar.com/.well-known/host-meta").
- to_return(:status => 302, :headers => { 'Location' => redirect_url })
-
- stub_request(:get, redirect_url).
- to_return(:status => 200, :body => host_meta_xrd)
-
- finger.host_meta_xrd
-
- expect(a_request(:get, redirect_url)).to have_been_made
- end
-
- it 'raises on 404' do
- url ="https://bar.com/.well-known/host-meta"
- stub_request(:get, url).
- to_return(:status => 404, :body => nil)
-
- expect {
- expect(finger.get(url)).to eq(false)
- }.to raise_error
- end
- end
-
- describe 'existing_person_with_profile?' do
- it 'returns true if cached_person is present and has a profile' do
- expect(finger).to receive(:cached_person).twice.and_return(FactoryGirl.create(:person))
- expect(finger.existing_person_with_profile?).to be true
- end
-
- it 'returns false if it has no person' do
- allow(finger).to receive(:cached_person).and_return false
- expect(finger.existing_person_with_profile?).to be false
- end
-
- it 'returns false if the person has no profile' do
- p = FactoryGirl.create(:person)
- p.profile = nil
- allow(finger).to receive(:cached_person).and_return(p)
- expect(finger.existing_person_with_profile?).to be false
- end
- end
-
- describe 'cached_person' do
- it 'sets the person by looking up the account from Person.by_account_identifier' do
- person = double
- expect(Person).to receive(:by_account_identifier).with(account).and_return(person)
- expect(finger.cached_person).to eq(person)
- expect(finger.person).to eq(person)
- end
- end
-
-
- describe 'create_or_update_person_from_webfinger_profile!' do
- context 'with a cached_person' do
- it 'calls Person#assign_new_profile_from_hcard with the fetched hcard' do
- finger.hcard_xrd = hcard_xml
- allow(finger).to receive(:person).and_return(bob.person)
- expect(bob.person).to receive(:assign_new_profile_from_hcard).with(finger.hcard)
- finger.create_or_update_person_from_webfinger_profile!
- end
- end
-
- context 'with no cached person' do
- it 'sets person based on make_person_from_webfinger' do
- allow(finger).to receive(:person).and_return(nil)
- expect(finger).to receive(:make_person_from_webfinger)
- finger.create_or_update_person_from_webfinger_profile!
- end
- end
- end
-
- describe '#host_meta_xrd' do
- it 'calls #get with host_meta_url' do
- allow(finger).to receive(:host_meta_url).and_return('meta')
- expect(finger).to receive(:get).with('meta')
- finger.host_meta_xrd
- end
-
- it 'should retry with ssl off a second time' do
- expect(finger).to receive(:get).and_raise(StandardError)
- expect(finger).to receive(:get)
- finger.host_meta_xrd
- expect(finger.ssl).to be false
- end
- end
-
- describe '#hcard' do
- it 'calls HCard.build' do
- allow(finger).to receive(:hcard_xrd).and_return(hcard_xml)
- expect(HCard).to receive(:build).with(hcard_xml).and_return true
- expect(finger.hcard).not_to be_nil
- end
- end
-
- describe '#webfinger_profile' do
- it 'constructs a new WebfingerProfile object' do
- allow(finger).to receive(:webfinger_profile_xrd).and_return(webfinger_xrd)
- expect(WebfingerProfile).to receive(:new).with(account, webfinger_xrd)
- finger.webfinger_profile
- end
- end
-
- describe '#webfinger_profile_url' do
- it 'returns the llrd link for a valid host meta' do
- allow(finger).to receive(:host_meta_xrd).and_return(host_meta_xrd)
- expect(finger.webfinger_profile_url).not_to be_nil
- end
-
- it 'returns nil if no link is found' do
- allow(finger).to receive(:host_meta_xrd).and_return(nil)
- expect(finger.webfinger_profile_url).to be_nil
- end
- end
-
- describe '#webfinger_profile_xrd' do
- it 'calls #get with the hcard_url' do
- allow(finger).to receive(:hcard_url).and_return("url")
- expect(finger).to receive(:get).with("url")
- finger.hcard_xrd
- end
- end
-
- describe '#make_person_from_webfinger' do
- it 'with an hcard and a webfinger_profile, it calls Person.create_from_webfinger' do
- allow(finger).to receive(:hcard).and_return("hcard")
- allow(finger).to receive(:webfinger_profile_xrd).and_return("webfinger_profile_xrd")
- allow(finger).to receive(:webfinger_profile).and_return("webfinger_profile")
- expect(Person).to receive(:create_from_webfinger).with("webfinger_profile", "hcard")
- finger.make_person_from_webfinger
- end
-
- it 'with an false xrd it does not call Person.create_from_webfinger' do
- allow(finger).to receive(:webfinger_profile_xrd).and_return(false)
- expect(Person).not_to receive(:create_from_webfinger)
- finger.make_person_from_webfinger
- end
- end
-
-
-
- describe '#host_meta_url' do
- it 'should return canonical host-meta url for http' do
- finger.ssl = false
- expect(finger.host_meta_url).to eq("http://bar.com/.well-known/host-meta")
- end
-
- it 'can return the https version' do
- expect(finger.host_meta_url).to eq("https://bar.com/.well-known/host-meta")
- end
- end
-
- describe 'swizzle' do
- it 'gsubs out {uri} for the account' do
- string = "{uri} is the coolest"
- expect(finger.swizzle(string)).to eq("#{finger.account} is the coolest")
- end
- end
-end
diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb
index 00fbe98e2..d35d4d19f 100644
--- a/spec/models/post_spec.rb
+++ b/spec/models/post_spec.rb
@@ -400,43 +400,55 @@ describe Post, :type => :model do
end
end
- describe "#find_by_guid_or_id_with_user" do
+ describe "#find_public" do
it "succeeds with an id" do
post = FactoryGirl.create :status_message, public: true
- expect(Post.find_by_guid_or_id_with_user(post.id)).to eq(post)
+ expect(Post.find_public post.id).to eq(post)
end
it "succeeds with an guid" do
post = FactoryGirl.create :status_message, public: true
- expect(Post.find_by_guid_or_id_with_user(post.guid)).to eq(post)
+ expect(Post.find_public post.guid).to eq(post)
end
- it "looks up on the passed user object if it's non-nil" do
- post = FactoryGirl.create :status_message
- user = double
- expect(user).to receive(:find_visible_shareable_by_id).with(Post, post.id, key: :id).and_return(post)
- Post.find_by_guid_or_id_with_user post.id, user
- end
-
- it "raises ActiveRecord::RecordNotFound with a non-existing id and a user" do
- user = double(find_visible_shareable_by_id: nil)
+ it "raises ActiveRecord::RecordNotFound for a non-existing id without a user" do
+ allow(Post).to receive_messages where: double(includes: double(first: nil))
expect {
- Post.find_by_guid_or_id_with_user 123, user
+ Post.find_public 123
}.to raise_error ActiveRecord::RecordNotFound
end
- it "raises Diaspora::NonPublic for a non-existing id without a user" do
- allow(Post).to receive_messages where: double(includes: double(first: nil))
+ it "raises Diaspora::NonPublic for a private post without a user" do
+ post = FactoryGirl.create :status_message
expect {
- Post.find_by_guid_or_id_with_user 123
+ Post.find_public post.id
}.to raise_error Diaspora::NonPublic
end
+ end
- it "raises Diaspora::NonPublic for a private post without a user" do
+ describe "#find_non_public_by_guid_or_id_with_user" do
+ it "succeeds with an id" do
+ post = FactoryGirl.create :status_message_in_aspect
+ expect(Post.find_non_public_by_guid_or_id_with_user(post.id, post.author.owner)).to eq(post)
+ end
+
+ it "succeeds with an guid" do
+ post = FactoryGirl.create :status_message_in_aspect
+ expect(Post.find_non_public_by_guid_or_id_with_user(post.guid, post.author.owner)).to eq(post)
+ end
+
+ it "looks up on the passed user object if it's non-nil" do
post = FactoryGirl.create :status_message
+ user = double
+ expect(user).to receive(:find_visible_shareable_by_id).with(Post, post.id, key: :id).and_return(post)
+ Post.find_non_public_by_guid_or_id_with_user(post.id, user)
+ end
+
+ it "raises ActiveRecord::RecordNotFound with a non-existing id and a user" do
+ user = double(find_visible_shareable_by_id: nil)
expect {
- Post.find_by_guid_or_id_with_user post.id
- }.to raise_error Diaspora::NonPublic
+ Post.find_non_public_by_guid_or_id_with_user(123, user)
+ }.to raise_error ActiveRecord::RecordNotFound
end
end
end
diff --git a/spec/models/reshare_spec.rb b/spec/models/reshare_spec.rb
index ff1781b9a..e235c4066 100644
--- a/spec/models/reshare_spec.rb
+++ b/spec/models/reshare_spec.rb
@@ -212,9 +212,7 @@ describe Reshare, :type => :model do
@original_author.profile = @original_profile
- wf_prof_double = double
- expect(wf_prof_double).to receive(:fetch).and_return(@original_author)
- expect(Webfinger).to receive(:new).and_return(wf_prof_double)
+ expect(Person).to receive(:find_or_fetch_by_identifier).and_return(@original_author)
allow(@response).to receive(:body).and_return(@root_object.to_diaspora_xml)
@@ -287,10 +285,7 @@ describe Reshare, :type => :model do
@xml = @reshare.to_xml.to_s
different_person = FactoryGirl.build(:person)
-
- wf_prof_double = double
- expect(wf_prof_double).to receive(:fetch).and_return(different_person)
- expect(Webfinger).to receive(:new).and_return(wf_prof_double)
+ expect(Person).to receive(:find_or_fetch_by_identifier).and_return(different_person)
allow(different_person).to receive(:url).and_return(@original_author.url)
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 5c001abe1..489c1ac45 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -905,11 +905,9 @@ describe User, :type => :model do
context "with autofollow sharing enabled" do
it "should start sharing with autofollow account" do
AppConfig.settings.autofollow_on_join = true
- AppConfig.settings.autofollow_on_join_user = 'one'
+ AppConfig.settings.autofollow_on_join_user = "one"
- wf_double = double
- expect(wf_double).to receive(:fetch)
- expect(Webfinger).to receive(:new).with('one').and_return(wf_double)
+ expect(Person).to receive(:find_or_fetch_by_identifier).with("one")
user.seed_aspects
end
@@ -919,7 +917,7 @@ describe User, :type => :model do
it "should not start sharing with the diasporahq account" do
AppConfig.settings.autofollow_on_join = false
- expect(Webfinger).not_to receive(:new)
+ expect(Person).not_to receive(:find_or_fetch_by_identifier)
user.seed_aspects
end
diff --git a/spec/presenters/node_info_presenter_spec.rb b/spec/presenters/node_info_presenter_spec.rb
new file mode 100644
index 000000000..028cfc5c7
--- /dev/null
+++ b/spec/presenters/node_info_presenter_spec.rb
@@ -0,0 +1,134 @@
+require "spec_helper"
+
+describe NodeInfoPresenter do
+ let(:presenter) { NodeInfoPresenter.new("1.0") }
+ let(:hash) { presenter.as_json.as_json }
+
+ describe "#as_json" do
+ it "works" do
+ expect(hash).to be_present
+ expect(presenter.to_json).to be_a String
+ end
+ end
+
+ describe "node info contents" do
+ before do
+ AppConfig.privacy.statistics.user_counts = false
+ AppConfig.privacy.statistics.post_counts = false
+ AppConfig.privacy.statistics.comment_counts = false
+ end
+
+ it "provides generic pod data in json" do
+ expect(hash).to eq(
+ "version" => "1.0",
+ "software" => {
+ "name" => "diaspora",
+ "version" => AppConfig.version_string
+ },
+ "protocols" => {
+ "inbound" => ["diaspora"],
+ "outbound" => ["diaspora"]
+ },
+ "services" => {
+ "inbound" => [],
+ "outbound" => ["facebook"]
+ },
+ "openRegistrations" => AppConfig.settings.enable_registrations?,
+ "usage" => {
+ "users" => {}
+ },
+ "metadata" => {
+ "nodeName" => AppConfig.settings.pod_name,
+ "xmppChat" => AppConfig.chat.enabled?
+ }
+ )
+ end
+
+ context "when services are enabled" do
+ before do
+ AppConfig.services = {
+ "facebook" => {
+ "enable" => true,
+ "authorized" => true
+ },
+ "twitter" => {"enable" => true},
+ "wordpress" => {"enable" => false},
+ "tumblr" => {
+ "enable" => true,
+ "authorized" => false
+ }
+ }
+ end
+
+ it "provides services" do
+ expect(hash).to include "services" => include("outbound" => %w(twitter facebook))
+ end
+ end
+
+ context "when some services are set to username authorized" do
+ before do
+ AppConfig.services = {
+ "facebook" => {
+ "enable" => true,
+ "authorized" => "bob"
+ },
+ "twitter" => {"enable" => true},
+ "wordpress" => {
+ "enable" => true,
+ "authorized" => "alice"
+ },
+ "tumblr" => {
+ "enable" => true,
+ "authorized" => false
+ }
+ }
+ end
+
+ it "it doesn't list those" do
+ expect(hash).to include "services" => include("outbound" => ["twitter"])
+ end
+ end
+
+ context "when counts are enabled" do
+ before do
+ AppConfig.privacy.statistics.user_counts = true
+ AppConfig.privacy.statistics.post_counts = true
+ AppConfig.privacy.statistics.comment_counts = true
+ end
+
+ it "provides generic pod data and counts in json" do
+ expect(hash).to include(
+ "usage" => {
+ "users" => {
+ "total" => User.active.count,
+ "activeHalfyear" => User.halfyear_actives.count,
+ "activeMonth" => User.monthly_actives.count
+ },
+ "localPosts" => presenter.local_posts,
+ "localComments" => presenter.local_comments
+ }
+ )
+ end
+ end
+
+ context "when registrations are closed" do
+ before do
+ AppConfig.settings.enable_registrations = false
+ end
+
+ it "should mark open_registrations to be false" do
+ expect(presenter.open_registrations?).to be false
+ end
+ end
+
+ context "when chat is enabled" do
+ before do
+ AppConfig.chat.enabled = true
+ end
+
+ it "should mark the xmppChat metadata as true" do
+ expect(hash).to include "metadata" => include("xmppChat" => true)
+ end
+ end
+ end
+end
diff --git a/spec/presenters/post_presenter_spec.rb b/spec/presenters/post_presenter_spec.rb
index 293f0337c..07a4b2d84 100644
--- a/spec/presenters/post_presenter_spec.rb
+++ b/spec/presenters/post_presenter_spec.rb
@@ -1,90 +1,90 @@
-require 'spec_helper'
+require "spec_helper"
describe PostPresenter do
before do
- @sm = FactoryGirl.create(:status_message, :public => true)
+ @sm = FactoryGirl.create(:status_message, public: true)
@sm_with_poll = FactoryGirl.create(:status_message_with_poll, public: true)
@presenter = PostPresenter.new(@sm, bob)
@unauthenticated_presenter = PostPresenter.new(@sm)
end
- it 'takes a post and an optional user' do
+ it "takes a post and an optional user" do
expect(@presenter).not_to be_nil
end
- describe '#as_json' do
- it 'works with a user' do
+ describe "#as_json" do
+ it "works with a user" do
expect(@presenter.as_json).to be_a Hash
end
- it 'works without a user' do
+ it "works without a user" do
expect(@unauthenticated_presenter.as_json).to be_a Hash
end
end
- describe '#user_like' do
- it 'includes the users like' do
+ describe "#user_like" do
+ it "includes the users like" do
bob.like!(@sm)
- expect(@presenter.user_like).to be_present
+ expect(@presenter.send(:user_like)).to be_present
end
- it 'is nil if the user is not authenticated' do
- expect(@unauthenticated_presenter.user_like).to be_nil
+ it "is nil if the user is not authenticated" do
+ expect(@unauthenticated_presenter.send(:user_like)).to be_nil
end
end
- describe '#user_reshare' do
- it 'includes the users reshare' do
+ describe "#user_reshare" do
+ it "includes the users reshare" do
bob.reshare!(@sm)
- expect(@presenter.user_reshare).to be_present
+ expect(@presenter.send(:user_reshare)).to be_present
end
- it 'is nil if the user is not authenticated' do
- expect(@unauthenticated_presenter.user_reshare).to be_nil
+ it "is nil if the user is not authenticated" do
+ expect(@unauthenticated_presenter.send(:user_reshare)).to be_nil
end
end
- describe '#root' do
- it 'does not raise if the absolute_root does not exists' do
+ describe "#root" do
+ it "does not raise if the absolute_root does not exists" do
first_reshare = FactoryGirl.create :reshare
first_reshare.root = nil
- reshare = FactoryGirl.create :reshare, :root => first_reshare
+ reshare = FactoryGirl.create :reshare, root: first_reshare
expect {
- PostPresenter.new(reshare).root
+ PostPresenter.new(reshare).send(:root)
}.to_not raise_error
end
- it 'does not raise if the root does not exists' do
- reshare = FactoryGirl.create:reshare
+ it "does not raise if the root does not exists" do
+ reshare = FactoryGirl.create :reshare
reshare.root = nil
expect {
- PostPresenter.new(reshare).root
+ PostPresenter.new(reshare).send(:root)
}.to_not raise_error
end
end
- describe '#title' do
- context 'with posts with text' do
+ describe "#title" do
+ context "with posts with text" do
it "delegates to message.title" do
message = double(present?: true)
expect(message).to receive(:title)
@presenter.post = double(message: message)
- @presenter.title
+ @presenter.send(:title)
end
end
- context 'with posts without text' do
- it ' displays a messaage with the post class' do
+ context "with posts without text" do
+ it " displays a messaage with the post class" do
@sm = double(message: double(present?: false), author: bob.person, author_name: bob.person.name)
@presenter.post = @sm
- expect(@presenter.title).to eq("A post from #{@sm.author.name}")
+ expect(@presenter.send(:title)).to eq("A post from #{@sm.author.name}")
end
end
end
- describe '#poll' do
- it 'works without a user' do
+ describe "#poll" do
+ it "works without a user" do
presenter = PostPresenter.new(@sm_with_poll)
expect(presenter.as_json).to be_a(Hash)
end
diff --git a/spec/presenters/statistics_presenter_spec.rb b/spec/presenters/statistics_presenter_spec.rb
index 364525ec0..31273cdec 100644
--- a/spec/presenters/statistics_presenter_spec.rb
+++ b/spec/presenters/statistics_presenter_spec.rb
@@ -124,15 +124,5 @@ describe StatisticsPresenter do
)
end
end
-
- context "when registrations are closed" do
- before do
- AppConfig.settings.enable_registrations = false
- end
-
- it "should mark open_registrations to be false" do
- expect(@presenter.open_registrations?).to be false
- end
- end
end
end
diff --git a/spec/services/post_service_spec.rb b/spec/services/post_service_spec.rb
new file mode 100644
index 000000000..47f57d750
--- /dev/null
+++ b/spec/services/post_service_spec.rb
@@ -0,0 +1,127 @@
+require "spec_helper"
+
+describe PostService do
+ before do
+ aspect = alice.aspects.first
+ @message = alice.build_post :status_message, text: "ohai", to: aspect.id
+ @message.save!
+
+ alice.add_to_streams(@message, [aspect])
+ alice.dispatch_post @message, to: aspect.id
+ end
+
+ describe "#assign_post" do
+ context "when the post is private" do
+ it "RecordNotFound if the post cannot be found" do
+ expect { PostService.new(id: 1_234_567, user: alice) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ it "NonPublic if there is no user" do
+ expect { PostService.new(id: @message.id) }.to raise_error(Diaspora::NonPublic)
+ end
+ it "RecordNotFound if user cannot see post" do
+ expect { PostService.new(id: @message.id, user: eve) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context "when the post is public" do
+ it "RecordNotFound if the post cannot be found" do
+ expect { PostService.new(id: 1_234_567) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ # We want to be using guids from now on for this post route, but do not want to break
+ # pre-exisiting permalinks. We can assume a guid is 8 characters long as we have
+ # guids set to hex(8) since we started using them.
+ context "id/guid switch" do
+ before do
+ @status = alice.post(:status_message, text: "hello", public: true, to: "all")
+ end
+
+ it "assumes guids less than 8 chars are ids and not guids" do
+ post = Post.where(id: @status.id.to_s)
+ expect(Post).to receive(:where).with(hash_including(id: @status.id)).and_return(post).at_least(:once)
+ PostService.new(id: @status.id, user: alice)
+ end
+
+ it "assumes guids more than (or equal to) 8 chars are actually guids" do
+ post = Post.where(guid: @status.guid)
+ expect(Post).to receive(:where).with(hash_including(guid: @status.guid)).and_return(post).at_least(:once)
+ PostService.new(id: @status.guid, user: alice)
+ end
+ end
+ end
+
+ describe "#mark_user_notifications" do
+ it "marks a corresponding notifications as read" do
+ FactoryGirl.create(:notification, recipient: alice, target: @message, unread: true)
+ FactoryGirl.create(:notification, recipient: alice, target: @message, unread: true)
+ post_service = PostService.new(id: @message.id, user: alice)
+ expect { post_service.mark_user_notifications }.to change(Notification.where(unread: true), :count).by(-2)
+ end
+
+ it "marks a corresponding mention notification as read" do
+ status_text = "this is a text mentioning @{Mention User ; #{alice.diaspora_handle}} ... have fun testing!"
+ status_msg =
+ bob.post(:status_message, text: status_text, public: true, to: "all")
+ mention = status_msg.mentions.where(person_id: alice.person.id).first
+ FactoryGirl.create(:notification, recipient: alice, target_type: "Mention", target_id: mention.id, unread: true)
+ post_service = PostService.new(id: status_msg.id, user: alice)
+ expect { post_service.mark_user_notifications }.to change(Notification.where(unread: true), :count).by(-1)
+ end
+ end
+
+ describe "#present_json" do
+ it "works for a private post" do
+ post_service = PostService.new(id: @message.id, user: alice)
+ expect(post_service.present_json.to_json).to match(/\"text\"\:\"ohai\"/)
+ end
+
+ it "works for a public post " do
+ status = alice.post(:status_message, text: "hello", public: true, to: "all")
+ post_service = PostService.new(id: status.id)
+ expect(post_service.present_json.to_json).to match(/\"text\"\:\"hello\"/)
+ end
+ end
+
+ describe "#present_oembed" do
+ it "works for a private post" do
+ post_service = PostService.new(id: @message.id, user: alice)
+ expect(post_service.present_oembed.to_json).to match(/iframe/)
+ end
+
+ it "works for a public post" do
+ status = alice.post(:status_message, text: "hello", public: true, to: "all")
+ post_service = PostService.new(id: status.id)
+ expect(post_service.present_oembed.to_json).to match(/iframe/)
+ end
+ end
+
+ describe "#retract_post" do
+ it "let a user delete his message" do
+ message = alice.post(:status_message, text: "hey", to: alice.aspects.first.id)
+ post_service = PostService.new(id: message.id, user: alice)
+ post_service.retract_post
+ expect(StatusMessage.find_by_id(message.id)).to be_nil
+ end
+
+ it "sends a retraction on delete" do
+ message = alice.post(:status_message, text: "hey", to: alice.aspects.first.id)
+ post_service = PostService.new(id: message.id, user: alice)
+ expect(alice).to receive(:retract).with(message)
+ post_service.retract_post
+ end
+
+ it "will not let you destroy posts visible to you but that you do not own" do
+ message = bob.post(:status_message, text: "hey", to: bob.aspects.first.id)
+ post_service = PostService.new(id: message.id, user: alice)
+ expect { post_service.retract_post }.to raise_error(Diaspora::NotMine)
+ expect(StatusMessage.exists?(message.id)).to be true
+ end
+
+ it "will not let you destroy posts that are not visible to you" do
+ message = eve.post(:status_message, text: "hey", to: eve.aspects.first.id)
+ expect { PostService.new(id: message.id, user: alice) }.to raise_error(ActiveRecord::RecordNotFound)
+ expect(StatusMessage.exists?(message.id)).to be true
+ end
+ end
+end
diff --git a/spec/workers/fetch_webfinger_spec.rb b/spec/workers/fetch_webfinger_spec.rb
index cfa83b24a..0a9469c75 100644
--- a/spec/workers/fetch_webfinger_spec.rb
+++ b/spec/workers/fetch_webfinger_spec.rb
@@ -3,7 +3,7 @@ require "spec_helper"
describe Workers::FetchWebfinger do
it "should webfinger and queue a job to fetch public posts" do
@person = FactoryGirl.create(:person)
- allow(Webfinger).to receive(:new).and_return(double(fetch: @person))
+ allow(Person).to receive(:find_or_fetch_by_identifier).and_return(@person)
expect(Diaspora::Fetcher::Public).to receive(:queue_for).exactly(1).times
@@ -11,7 +11,7 @@ describe Workers::FetchWebfinger do
end
it "should webfinger and queue no job to fetch public posts if the person is not found" do
- allow(Webfinger).to receive(:new).and_return(double(fetch: nil))
+ allow(Person).to receive(:find_or_fetch_by_identifier).and_return(nil)
expect(Diaspora::Fetcher::Public).not_to receive(:queue_for)
diff --git a/vendor/assets/javascripts/mbp-modernizr-custom.js b/vendor/assets/javascripts/mbp-modernizr-custom.js
deleted file mode 100644
index cc5ec7ce2..000000000
--- a/vendor/assets/javascripts/mbp-modernizr-custom.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/*!
- * Modernizr v1.8pre
- * http://www.modernizr.com
- *
- * Developed by:
- * - Faruk Ates http://farukat.es/
- * - Paul Irish http://paulirish.com/
- *
- * Copyright (c) 2009-2011
- * Dual-licensed under the BSD or MIT licenses.
- * http://www.modernizr.com/license/
- */
-window.Modernizr=(function(o,v,k){var e="1.8pre",H={},x=true,F=v.documentElement,h=v.head||v.getElementsByTagName("head")[0],G="modernizr",D=v.createElement(G),B=D.style,g=v.createElement("input"),E=":)",y=Object.prototype.toString,z=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),q="Webkit Moz O ms Khtml".split(" "),I={svg:"http://www.w3.org/2000/svg"},j={},d={},w={},C=[],A,m=v.getElementsByTagName("script")[0],c=(function(L){var J={},M=v.createElement("body"),K=v.createElement("div");K.id=G+"-mqtest";M.appendChild(K);return function(O){if(J[O]==k){if(o.matchMedia){return(J[O]=matchMedia(O).matches)}var N=v.createElement("style"),P="@media "+O+" { #"+G+"-mqtest { position: absolute; } }";N.type="text/css";if(N.styleSheet){N.styleSheet.cssText=P}else{N.appendChild(v.createTextNode(P))}m.parentNode.insertBefore(M,m);m.parentNode.insertBefore(N,m);J[O]=(o.getComputedStyle?getComputedStyle(K,null):K.currentStyle)["position"]=="absolute";M.parentNode.removeChild(M);N.parentNode.removeChild(N)}return J[O]}})(),t=(function(){var K={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};function J(L,N){N=N||v.createElement(K[L]||"div");L="on"+L;var M=(L in N);if(!M){if(!N.setAttribute){N=v.createElement("div")}if(N.setAttribute&&N.removeAttribute){N.setAttribute(L,"");M=l(N[L],"function");if(!l(N[L],k)){N[L]=k}N.removeAttribute(L)}}N=null;return M}return J})();var r=({}).hasOwnProperty,p;if(!l(r,k)&&!l(r.call,k)){p=function(J,K){return r.call(J,K)}}else{p=function(J,K){return((K in J)&&l(J.constructor.prototype[K],k))}}function u(J){B.cssText=J}function b(K,J){return u(z.join(K+";")+(J||""))}function l(K,J){return typeof K===J}function n(K,J){return !!~(""+K).indexOf(J)}function f(K,L){for(var J in K){if(B[K[J]]!==k&&(!L||L(K[J],D))){return true}}}function a(M,L){var K=M.charAt(0).toUpperCase()+M.substr(1),J=(M+" "+q.join(K+" ")+K).split(" ");return !!f(J,L)}j.flexbox=function(){function K(P,R,Q,O){R+=":";P.style.cssText=(R+z.join(Q+";"+R)).slice(0,-R.length)+(O||"")}function M(P,R,Q,O){P.style.cssText=z.join(R+":"+Q+";")+(O||"")}var N=v.createElement("div"),L=v.createElement("div");K(N,"display","box","width:42px;padding:0;");M(L,"box-flex","1","width:10px;");N.appendChild(L);F.appendChild(N);var J=L.offsetWidth===42;N.removeChild(L);F.removeChild(N);return J};j.canvas=function(){var J=v.createElement("canvas");return !!(J.getContext&&J.getContext("2d"))};j.canvastext=function(){return !!(H.canvas&&l(v.createElement("canvas").getContext("2d").fillText,"function"))};j.webgl=function(){return !!o.WebGLRenderingContext};j.touch=function(){return("ontouchstart" in o)||c("("+z.join("touch-enabled),(")+"modernizr)")};j.geolocation=function(){return !!navigator.geolocation};j.postmessage=function(){return !!o.postMessage};j.websqldatabase=function(){var J=!!o.openDatabase;return J};j.indexedDB=function(){for(var K=-1,J=q.length;++K<J;){if(o[q[K].toLowerCase()+"IndexedDB"]){return true}}return !!o.indexedDB};j.hashchange=function(){return t("hashchange",o)&&(v.documentMode===k||v.documentMode>7)};j.history=function(){return !!(o.history&&history.pushState)};j.draganddrop=function(){return t("dragstart")&&t("drop")};j.websockets=function(){return("WebSocket" in o)};j.rgba=function(){u("background-color:rgba(150,255,150,.5)");return n(B.backgroundColor,"rgba")};j.hsla=function(){u("background-color:hsla(120,40%,100%,.5)");return n(B.backgroundColor,"rgba")||n(B.backgroundColor,"hsla")};j.multiplebgs=function(){u("background:url(//:),url(//:),red url(//:)");return new RegExp("(url\\s*\\(.*?){3}").test(B.background)};j.backgroundsize=function(){return a("backgroundSize")};j.borderimage=function(){return a("borderImage")};j.borderradius=function(){return a("borderRadius","",function(J){return n(J,"orderRadius")})};j.boxshadow=function(){return a("boxShadow")};j.textshadow=function(){return v.createElement("div").style.textShadow===""};j.opacity=function(){b("opacity:.55");return/^0.55$/.test(B.opacity)};j.cssanimations=function(){return a("animationName")};j.csscolumns=function(){return a("columnCount")};j.cssgradients=function(){var L="background-image:",K="gradient(linear,left top,right bottom,from(#9f9),to(white));",J="linear-gradient(left top,#9f9, white);";u((L+z.join(K+L)+z.join(J+L)).slice(0,-L.length));return n(B.backgroundImage,"gradient")};j.cssreflections=function(){return a("boxReflect")};j.csstransforms=function(){return !!f(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])};j.csstransforms3d=function(){var J=!!f(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);if(J&&"webkitPerspective" in F.style){J=c("("+z.join("transform-3d),(")+"modernizr)")}return J};j.csstransitions=function(){return a("transitionProperty")};j.fontface=function(){var N,K,M=h||F,O=v.createElement("style"),J=v.implementation||{hasFeature:function(){return false}};O.type="text/css";M.insertBefore(O,M.firstChild);N=O.sheet||O.styleSheet;var L=J.hasFeature("CSS2","")?function(R){if(!(N&&R)){return false}var P=false;try{N.insertRule(R,0);P=(/src/i).test(N.cssRules[0].cssText);N.deleteRule(N.cssRules.length-1)}catch(Q){}return P}:function(P){if(!(N&&P)){return false}N.cssText=P;return N.cssText.length!==0&&(/src/i).test(N.cssText)&&N.cssText.replace(/\r+|\n+/g,"").indexOf(P.split(" ")[0])===0};K=L('@font-face { font-family: "font"; src: url("//:"); }');M.removeChild(O);return K};j.video=function(){var L=v.createElement("video"),J=!!L.canPlayType;if(J){J=new Boolean(J);J.ogg=L.canPlayType('video/ogg; codecs="theora"');var K='video/mp4; codecs="avc1.42E01E';J.h264=L.canPlayType(K+'"')||L.canPlayType(K+', mp4a.40.2"');J.webm=L.canPlayType('video/webm; codecs="vp8, vorbis"')}return J};j.audio=function(){var K=v.createElement("audio"),J=!!K.canPlayType;if(J){J=new Boolean(J);J.ogg=K.canPlayType('audio/ogg; codecs="vorbis"');J.mp3=K.canPlayType("audio/mpeg;");J.wav=K.canPlayType('audio/wav; codecs="1"');J.m4a=K.canPlayType("audio/x-m4a;")||K.canPlayType("audio/aac;")}return J};j.localstorage=function(){try{return !!localStorage.getItem}catch(J){return false}};j.sessionstorage=function(){try{return !!sessionStorage.getItem}catch(J){return false}};j.webWorkers=function(){return !!o.Worker};j.applicationcache=function(){return !!o.applicationCache};j.svg=function(){return !!v.createElementNS&&!!v.createElementNS(I.svg,"svg").createSVGRect};j.inlinesvg=function(){var J=v.createElement("div");J.innerHTML="<svg/>";return(J.firstChild&&J.firstChild.namespaceURI)==I.svg};j.smil=function(){return !!v.createElementNS&&/SVG/.test(y.call(v.createElementNS(I.svg,"animate")))};j.svgclippaths=function(){return !!v.createElementNS&&/SVG/.test(y.call(v.createElementNS(I.svg,"clipPath")))};function s(){H.input=(function(L){for(var K=0,J=L.length;K<J;K++){w[L[K]]=!!(L[K] in g)}return w})("autocomplete autofocus list placeholder max min multiple pattern required step".split(" "));H.inputtypes=(function(M){for(var L=0,K,O,N,J=M.length;L<J;L++){g.setAttribute("type",O=M[L]);K=g.type!=="text";if(K){g.value=E;g.style.cssText="position:absolute;visibility:hidden;";if(/^range$/.test(O)&&g.style.WebkitAppearance!==k){F.appendChild(g);N=v.defaultView;K=N.getComputedStyle&&N.getComputedStyle(g,null).WebkitAppearance!=="textfield"&&(g.offsetHeight!==0);F.removeChild(g)}else{if(/^(search|tel)$/.test(O)){}else{if(/^(url|email)$/.test(O)){K=g.checkValidity&&g.checkValidity()===false}else{if(/^color$/.test(O)){F.appendChild(g);F.offsetWidth;K=g.value!=E;F.removeChild(g)}else{K=g.value!=E}}}}}d[M[L]]=!!K}return d})("search tel url email datetime date month week time datetime-local number range color".split(" "))}for(var i in j){if(p(j,i)){A=i.toLowerCase();H[A]=j[i]();C.push((H[A]?"":"no-")+A)}}if(!H.input){s()}H.crosswindowmessaging=H.postmessage;H.historymanagement=H.history;H.addTest=function(J,K){J=J.toLowerCase();if(H[J]){return}K=!!(K());F.className+=" "+(K?"":"no-")+J;H[J]=K;return H};u("");D=g=null;if(x&&o.attachEvent&&(function(){var J=v.createElement("div");J.innerHTML="<elem></elem>";return J.childNodes.length!==1})()){(function(P,aa){P.iepp=P.iepp||{};var Q=P.iepp,Z=Q.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",K=Z.split("|"),Y=K.length,X=new RegExp("(^|\\s)("+Z+")","gi"),W=new RegExp("<(/*)("+Z+")","gi"),O=/^\s*[\{\}]\s*$/,J=new RegExp("(^|[^\\n]*?\\s)("+Z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),M=aa.createDocumentFragment(),U=aa.documentElement,R=U.firstChild,S=aa.createElement("body"),N=aa.createElement("style"),V=/print|all/,T;function L(ac){var ab=-1;while(++ab<Y){ac.createElement(K[ab])}}Q.getCSS=function(af,ad){if(af+""===k){return""}var ac=-1,ab=af.length,ag,ae=[];while(++ac<ab){ag=af[ac];if(ag.disabled){continue}ad=ag.media||ad;if(V.test(ad)){ae.push(Q.getCSS(ag.imports,ad),ag.cssText)}ad="all"}return ae.join("")};Q.parseCSS=function(ac){var ab=[],ad;while((ad=J.exec(ac))!=null){ab.push(((O.exec(ad[1])?"\n":ad[1])+ad[2]+ad[3]).replace(X,"$1.iepp_$2")+ad[4])}return ab.join("\n")};Q.writeHTML=function(){var ac=-1;T=T||aa.body;while(++ac<Y){var ad=aa.getElementsByTagName(K[ac]),ae=ad.length,ab=-1;while(++ab<ae){if(ad[ab].className.indexOf("iepp_")<0){ad[ab].className+=" iepp_"+K[ac]}}}M.appendChild(T);U.appendChild(S);S.className=T.className;S.id=T.id;S.innerHTML=T.innerHTML.replace(W,"<$1font")};Q._beforePrint=function(){N.styleSheet.cssText=Q.parseCSS(Q.getCSS(aa.styleSheets,"all"));Q.writeHTML()};Q.restoreHTML=function(){S.innerHTML="";U.removeChild(S);U.appendChild(T)};Q._afterPrint=function(){Q.restoreHTML();N.styleSheet.cssText=""};L(aa);L(M);if(Q.disablePP){return}R.insertBefore(N,R.firstChild);N.media="print";N.className="iepp-printshim";P.attachEvent("onbeforeprint",Q._beforePrint);P.attachEvent("onafterprint",Q._afterPrint)})(o,v)}H._enableHTML5=x;H._version=e;H.mq=c;H.isEventSupported=t;F.className=F.className.replace(/\bno-js\b/,"")+" js "+C.join(" ");return H})(this,this.document);
-/*yepnope1.0.1|WTFPL*/(function(a,b,c){function H(){var a=z;a.loader={load:G,i:0};return a}function G(a,b,c){var e=b=="c"?r:q;i=0,b=b||"j",u(a)?F(e,a,b,this.i++,d,c):(h.splice(this.i++,0,a),h.length==1&&E());return this}function F(a,c,d,g,j,l){function q(){!o&&A(n.readyState)&&(p.r=o=1,!i&&B(),n.onload=n.onreadystatechange=null,e(function(){m.removeChild(n)},0))}var n=b.createElement(a),o=0,p={t:d,s:c,e:l};n.src=n.data=c,!k&&(n.style.display="none"),n.width=n.height="0",a!="object"&&(n.type=d),n.onload=n.onreadystatechange=q,a=="img"?n.onerror=q:a=="script"&&(n.onerror=function(){p.e=p.r=1,E()}),h.splice(g,0,p),m.insertBefore(n,k?null:f),e(function(){o||(m.removeChild(n),p.r=p.e=o=1,B())},z.errorTimeout)}function E(){var a=h.shift();i=1,a?a.t?e(function(){a.t=="c"?D(a):C(a)},0):(a(),B()):i=0}function D(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css",!a.e&&(o||j)?function g(a){e(function(){if(!d)try{a.sheet.cssRules.length?(d=1,B()):g(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,e(function(){B()},0)):g(a)}},0)}(c):(c.onload=function(){d||(d=1,e(function(){B()},0))},a.e&&c.onload()),e(function(){d||(d=1,B())},z.errorTimeout),!a.e&&f.parentNode.insertBefore(c,f)}function C(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&A(c.readyState)&&(d=1,B(),c.onload=c.onreadystatechange=null)},e(function(){d||(d=1,B())},z.errorTimeout),a.e?c.onload():f.parentNode.insertBefore(c,f)}function B(){var a=1,b=-1;while(h.length- ++b)if(h[b].s&&!(a=h[b].r))break;a&&E()}function A(a){return!a||a=="loaded"||a=="complete"}var d=b.documentElement,e=a.setTimeout,f=b.getElementsByTagName("script")[0],g=({}).toString,h=[],i=0,j="MozAppearance"in d.style,k=j&&!!b.createRange().compareNode,l=j&&!k,m=k?d:f.parentNode,n=a.opera&&g.call(a.opera)=="[object Opera]",o="webkitAppearance"in d.style,p=o&&"async"in b.createElement("script"),q=j?"object":n||p?"img":"script",r=o?"img":q,s=Array.isArray||function(a){return g.call(a)=="[object Array]"},t=function(a){return typeof a=="object"},u=function(a){return typeof a=="string"},v=function(a){return g.call(a)=="[object Function]"},w=[],x={},y,z;z=function(a){function h(a,b){function i(a){if(u(a))g(a,f,b,0,c);else if(t(a))for(h in a)a.hasOwnProperty(h)&&g(a[h],f,b,h,c)}var c=!!a.test,d=c?a.yep:a.nope,e=a.load||a.both,f=a.callback,h;i(d),i(e),a.complete&&b.load(a.complete)}function g(a,b,d,e,g){var h=f(a),i=h.autoCallback;if(!h.bypass){b&&(b=v(b)?b:b[a]||b[e]||b[a.split("/").pop().split("?")[0]]);if(h.instead)return h.instead(a,b,d,e,g);d.load(h.url,h.forceCSS||!h.forceJS&&/css$/.test(h.url)?"c":c,h.noexec),(v(b)||v(i))&&d.load(function(){H(),b&&b(h.origUrl,g,e),i&&i(h.origUrl,g,e)})}}function f(a){var b=a.split("!"),c=w.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=x[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=w[h](f);return f}var b,d,e=this.yepnope.loader;if(u(a))g(a,0,e,0);else if(s(a))for(b=0;b<a.length;b++)d=a[b],u(d)?g(d,0,e,0):s(d)?z(d):t(d)&&h(d,e);else t(a)&&h(a,e)},z.addPrefix=function(a,b){x[a]=b},z.addFilter=function(a){w.push(a)},z.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",y=function(){b.removeEventListener("DOMContentLoaded",y,0),b.readyState="complete"},0)),a.yepnope=H()})(this,this.document);
-
diff --git a/vendor/assets/javascripts/mbp-respond.min.js b/vendor/assets/javascripts/mbp-respond.min.js
deleted file mode 100644
index e37cd86d4..000000000
--- a/vendor/assets/javascripts/mbp-respond.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * respond.js - A small and fast polyfill for min/max-width CSS3 Media Queries
- * Copyright 2011, Scott Jehl, scottjehl.com
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * Usage: Check out the readme file or github.com/scottjehl/respond
-*/
-(function(e,h){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=h;if(h){return}var u=e.document,r=u.documentElement,i=[],k=[],p=[],o={},g=30,f=u.getElementsByTagName("head")[0]||r,b=f.getElementsByTagName("link"),d=[],a=function(){var B=b,w=B.length;for(var z=0;z<w;z++){var y=B[z],x=y.href,A=y.media,v=y.rel&&y.rel.toLowerCase()==="stylesheet";if(!!x&&v&&!o[x]){if(!/^([a-zA-Z]+?:(\/\/)?(www\.)?)/.test(x)||x.replace(RegExp.$1,"").split("/")[0]===e.location.host){d.push({href:x,media:A})}else{o[x]=true}}}t()},t=function(){if(d.length){var v=d.shift();n(v.href,function(w){m(w,v.href,v.media);o[v.href]=true;t()})}},m=function(G,v,x){var E=G.match(/@media ([^\{]+)\{([\S\s]+?)(?=\}[\s]*\/\*\/mediaquery\*\/)/gmi),H=E&&E.length||0,v=v.substring(0,v.lastIndexOf("/")),w=function(I){return I.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+v+"$2$3")},y=!H&&x;if(v.length){v+="/"}if(y){H=1}for(var B=0;B<H;B++){var C;if(y){C=x;k.push(w(G))}else{C=E[B].match(/@media ([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1;k.push(RegExp.$2&&w(RegExp.$2))}var z=C.split(","),F=z.length;for(var A=0;A<F;A++){var D=z[A];i.push({media:D.match(/(only\s+)?([a-zA-Z]+)(\sand)?/)&&RegExp.$2,rules:k.length-1,minw:D.match(/\(min\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1),maxw:D.match(/\(max\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1)})}}j()},l,q,j=function(E){var v="clientWidth",x=r[v],D=u.compatMode==="CSS1Compat"&&x||u.body[v]||x,z={},C=u.createDocumentFragment(),B=b[b.length-1],w=(new Date()).getTime();if(E&&l&&w-l<g){clearTimeout(q);q=setTimeout(j,g);return}else{l=w}for(var y in i){var F=i[y];if(!F.minw&&!F.maxw||(!F.minw||F.minw&&D>=F.minw)&&(!F.maxw||F.maxw&&D<=F.maxw)){if(!z[F.media]){z[F.media]=[]}z[F.media].push(k[F.rules])}}for(var y in p){if(p[y]&&p[y].parentNode===f){f.removeChild(p[y])}}for(var y in z){var G=u.createElement("style"),A=z[y].join("\n");G.type="text/css";G.media=y;if(G.styleSheet){G.styleSheet.cssText=A}else{G.appendChild(u.createTextNode(A))}C.appendChild(G);p.push(G)}f.insertBefore(C,B.nextSibling)},n=function(v,x){var w=c();if(!w){return}w.open("GET",v,true);w.onreadystatechange=function(){if(w.readyState!=4||w.status!=200&&w.status!=304){return}x(w.responseText)};if(w.readyState==4){return}w.send()},c=(function(){var v=false,w=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new XMLHttpRequest()}],y=w.length;while(y--){try{v=w[y]()}catch(x){continue}break}return function(){return v}})();a();respond.update=a;function s(){j(true)}if(e.addEventListener){e.addEventListener("resize",s,false)}else{if(e.attachEvent){e.attachEvent("onresize",s)}}})(this,(function(f){if(f.matchMedia){return true}var e,i=document,c=i.documentElement,g=c.firstElementChild||c.firstChild,h=!i.body,d=i.body||i.createElement("body"),b=i.createElement("div"),a="only all";b.id="mq-test-1";b.style.cssText="position:absolute;top:-99em";d.appendChild(b);b.innerHTML='_<style media="'+a+'"> #mq-test-1 { width: 9px; }</style>';if(h){c.insertBefore(d,g)}b.removeChild(b.firstChild);e=b.offsetWidth==9;if(h){c.removeChild(d)}else{d.removeChild(b)}return e})(this));
diff --git a/vendor/nodeinfo/schemas/1.0.json b/vendor/nodeinfo/schemas/1.0.json
new file mode 100644
index 000000000..8d177557b
--- /dev/null
+++ b/vendor/nodeinfo/schemas/1.0.json
@@ -0,0 +1,206 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "http://nodeinfo.diaspora.software/ns/schema/1.0#",
+ "description": "NodeInfo schema version 1.0.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "version",
+ "software",
+ "protocols",
+ "services",
+ "openRegistrations",
+ "usage",
+ "metadata"
+ ],
+ "properties": {
+ "version": {
+ "description": "The schema version, must be 1.0.",
+ "enum": [
+ "1.0"
+ ]
+ },
+ "software": {
+ "description": "Metadata about server software in use.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "version"
+ ],
+ "properties": {
+ "name": {
+ "description": "The canonical name of this server software.",
+ "enum": [
+ "diaspora",
+ "friendica",
+ "redmatrix"
+ ]
+ },
+ "version": {
+ "description": "The version of this server software.",
+ "type": "string"
+ }
+ }
+ },
+ "protocols": {
+ "description": "The protocols supported on this server.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "inbound",
+ "outbound"
+ ],
+ "properties": {
+ "inbound": {
+ "description": "The protocols this server can receive traffic for.",
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "enum": [
+ "buddycloud",
+ "diaspora",
+ "friendica",
+ "gnusocial",
+ "libertree",
+ "mediagoblin",
+ "pumpio",
+ "redmatrix",
+ "smtp",
+ "tent"
+ ]
+ }
+ },
+ "outbound": {
+ "description": "The protocols this server can generate traffic for.",
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "enum": [
+ "buddycloud",
+ "diaspora",
+ "friendica",
+ "gnusocial",
+ "libertree",
+ "mediagoblin",
+ "pumpio",
+ "redmatrix",
+ "smtp",
+ "tent"
+ ]
+ }
+ }
+ }
+ },
+ "services": {
+ "description": "The third party sites this server can connect to via their application API.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "inbound",
+ "outbound"
+ ],
+ "properties": {
+ "inbound": {
+ "description": "The third party sites this server can retrieve messages from for combined display with regular traffic.",
+ "type": "array",
+ "minItems": 0,
+ "items": {
+ "enum": [
+ "appnet",
+ "gnusocial",
+ "pumpio"
+ ]
+ }
+ },
+ "outbound": {
+ "description": "The third party sites this server can publish messages to on the behalf of a user.",
+ "type": "array",
+ "minItems": 0,
+ "items": {
+ "enum": [
+ "appnet",
+ "blogger",
+ "buddycloud",
+ "diaspora",
+ "dreamwidth",
+ "drupal",
+ "facebook",
+ "friendica",
+ "gnusocial",
+ "google",
+ "insanejournal",
+ "libertree",
+ "linkedin",
+ "livejournal",
+ "mediagoblin",
+ "myspace",
+ "pinterest",
+ "posterous",
+ "pumpio",
+ "redmatrix",
+ "smtp",
+ "tent",
+ "tumblr",
+ "twitter",
+ "wordpress",
+ "xmpp"
+ ]
+ }
+ }
+ }
+ },
+ "openRegistrations": {
+ "description": "Whether this server allows open self-registration.",
+ "type": "boolean"
+ },
+ "usage": {
+ "description": "Usage statistics for this server.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "users"
+ ],
+ "properties": {
+ "users": {
+ "description": "statistics about the users of this server.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "total": {
+ "description": "The total amount of on this server registered users.",
+ "type": "integer",
+ "minimum": 0
+ },
+ "activeHalfyear": {
+ "description": "The amount of users that signed in at least once in the last 180 days.",
+ "type": "integer",
+ "minimum": 0
+ },
+ "activeMonth": {
+ "description": "The amount of users that signed in at least once in the last 30 days.",
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "localPosts": {
+ "description": "The amount of posts that were made by users that are registered on this server.",
+ "type": "integer",
+ "minimum": 0
+ },
+ "localComments": {
+ "description": "The amount of comments that were made by users that are registered on this server.",
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "metadata": {
+ "description": "Free form key value pairs for software specific values. Clients should not rely on any specific key present.",
+ "type": "object",
+ "minProperties": 0,
+ "additionalProperties": true
+ }
+ }
+}