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>2016-01-14 01:09:27 +0300
committerDennis Schubert <mail@dennis-schubert.de>2016-01-14 01:09:51 +0300
commit5aef0441e827d7b61c7dfdf6a9ae53b8a20c1be7 (patch)
treea2a5f8758c61e2e078cf5d601a45b4a6b2a6e481
parent9cb4b732c6dfa1ffc14bcb84084fef15e8828c81 (diff)
parent812510b44afa644523fd486debd3874f1142a5ed (diff)
Merge branch 'release/0.5.6.0'v0.5.6.0
-rw-r--r--CODE_OF_CONDUCT.md52
-rw-r--r--Changelog.md16
-rw-r--r--Gemfile58
-rw-r--r--Gemfile.lock253
-rw-r--r--app/assets/javascripts/app/views/hovercard_view.js5
-rw-r--r--app/assets/javascripts/jsxc.js6
-rw-r--r--app/assets/stylesheets/application.scss1
-rw-r--r--app/controllers/people_controller.rb4
-rw-r--r--app/controllers/publics_controller.rb53
-rw-r--r--app/models/notification.rb2
-rw-r--r--app/views/notifications/_notification.haml2
-rwxr-xr-xbin/cucumber5
-rwxr-xr-xbin/rails9
-rwxr-xr-xbin/rake5
-rwxr-xr-xbin/rspec5
-rwxr-xr-xbin/spring19
-rw-r--r--config/defaults.yml2
-rw-r--r--config/initializers/diaspora_federation.rb66
-rw-r--r--config/locale_settings.yml2
-rw-r--r--config/locales/devise/devise.sq.yml125
-rw-r--r--config/locales/diaspora/en.yml8
-rw-r--r--config/locales/diaspora/sq.yml1392
-rw-r--r--config/locales/javascript/javascript.sq.yml215
-rw-r--r--config/oembed_providers.yml6
-rw-r--r--config/routes.rb12
-rw-r--r--features/desktop/hovercards.feature19
-rw-r--r--features/step_definitions/posts_steps.rb1
-rw-r--r--lib/assets/javascripts/jquery.mentionsInput.js19
-rw-r--r--lib/diaspora/federated/retraction.rb10
-rw-r--r--lib/diaspora/relayable.rb6
-rw-r--r--lib/postzord/receiver/public.rb13
-rw-r--r--spec/controllers/jasmine_fixtures/aspects_spec.rb2
-rw-r--r--spec/controllers/notifications_controller_spec.rb10
-rw-r--r--spec/controllers/publics_controller_spec.rb79
-rw-r--r--spec/factories.rb3
-rw-r--r--spec/federation_callbacks_spec.rb149
-rw-r--r--spec/integration/federation/federation_helper.rb68
-rw-r--r--spec/integration/federation/receive_federation_messages_spec.rb151
-rw-r--r--spec/integration/federation/shared_receive_relayable.rb59
-rw-r--r--spec/integration/federation/shared_receive_retraction.rb57
-rw-r--r--spec/integration/federation/shared_receive_stream_items.rb166
-rw-r--r--spec/javascripts/app/helpers/text_formatter_spec.js2
-rw-r--r--spec/javascripts/app/views/hovercard_view_spec.js56
-rw-r--r--spec/models/notification_spec.rb4
-rw-r--r--spec/spec_helper.rb2
-rw-r--r--spec/support/fixture_builder.rb4
46 files changed, 2237 insertions, 966 deletions
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index ae7ee6c77..96e80c425 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,8 +1,14 @@
# 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.
+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.
+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:
@@ -10,13 +16,35 @@ Examples of unacceptable behavior by participants include:
* 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/)
+* 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, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+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 may be
+reported by contacting a project maintainer at [team@diasporafoundation.org](mailto:team@diasporafoundation.org). All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. Maintainers are
+obligated to maintain confidentiality with regard to the reporter of an
+incident.
+
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 1.3.0, available at
+[http://contributor-covenant.org/version/1/3/0/][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/3/0/
diff --git a/Changelog.md b/Changelog.md
index 69d13f635..83e92340c 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,19 @@
+# 0.5.6.0
+
+## Refactor
+* Add more integration tests with the help of the new diaspora-federation gem [#6539](https://github.com/diaspora/diaspora/pull/6539)
+
+## Bug fixes
+* Fix mention autocomplete when pasting the username [#6510](https://github.com/diaspora/diaspora/pull/6510)
+* Use and update updated\_at for notifications [#6573](https://github.com/diaspora/diaspora/pull/6573)
+* Ensure the author signature is checked when receiving a relayable [#6539](https://github.com/diaspora/diaspora/pull/6539)
+* Do not try to display hovercards when logged out [#6587](https://github.com/diaspora/diaspora/pull/6587)
+
+## Features
+
+* Display hovercards without aspect dropdown when logged out [#6603](https://github.com/diaspora/diaspora/pull/6603)
+* Add media.ccc.de as a trusted oEmbed endpoint
+
# 0.5.5.1
* Fix XSS on profile pages
diff --git a/Gemfile b/Gemfile
index d7f3e031a..2351ff5da 100644
--- a/Gemfile
+++ b/Gemfile
@@ -4,25 +4,25 @@ gem "rails", "4.2.5"
# Legacy Rails features, remove me!
# responders (class level)
-gem "responders", "2.1.0"
+gem "responders", "2.1.1"
# Appserver
-gem "unicorn", "4.9.0", require: false
+gem "unicorn", "5.0.1", require: false
# Federation
-gem "diaspora_federation-rails", "0.0.8"
+gem "diaspora_federation-rails", "0.0.11"
# API and JSON
gem "acts_as_api", "0.4.2"
gem "json", "1.8.3"
-gem "json-schema", "2.5.1"
+gem "json-schema", "2.5.2"
# Authentication
-gem "devise", "3.5.2"
+gem "devise", "3.5.3"
gem "devise_lastseenable", "0.0.6"
gem "devise-token_authenticatable", "~> 0.4.0"
@@ -56,21 +56,21 @@ gem "rack-cors", "0.4.0", require: "rack/cors"
gem "bootstrap-sass", "2.3.2.2"
gem "compass-rails", "2.0.5"
gem "sass-rails", "5.0.4"
-gem "autoprefixer-rails", "6.0.3"
+gem "autoprefixer-rails", "6.2.2"
# Database
ENV["DB"] ||= "mysql"
gem "mysql2", "0.3.20" if ENV["DB"] == "all" || ENV["DB"] == "mysql"
-gem "pg", "0.18.3" if ENV["DB"] == "all" || ENV["DB"] == "postgres"
+gem "pg", "0.18.4" if ENV["DB"] == "all" || ENV["DB"] == "postgres"
gem "activerecord-import", "0.10.0"
# File uploading
gem "carrierwave", "0.10.0"
-gem "fog", "1.34.0"
+gem "fog", "1.37.0"
gem "mini_magick", "4.3.6"
gem "remotipart", "1.2.1"
@@ -84,11 +84,11 @@ gem "entypo-rails", "2.2.3"
# JavaScript
gem "backbone-on-rails", "1.2.0.0"
-gem "handlebars_assets", "0.21.0"
+gem "handlebars_assets", "0.22.0"
gem "jquery-rails", "4.0.5"
gem "jquery-ui-rails", "5.0.5"
gem "js_image_paths", "0.0.2"
-gem "js-routes", "1.1.2"
+gem "js-routes", "1.2.0"
source "https://rails-assets.org" do
gem "rails-assets-jquery", "1.11.2" # Should be kept in sync with jquery-rails
@@ -100,14 +100,14 @@ source "https://rails-assets.org" do
gem "rails-assets-markdown-it--markdown-it-for-inline", "0.1.1"
gem "rails-assets-markdown-it-sub", "1.0.0"
gem "rails-assets-markdown-it-sup", "1.0.0"
- gem "rails-assets-highlightjs", "8.9.1"
+ gem "rails-assets-highlightjs", "9.0.0"
# jQuery plugins
gem "rails-assets-jeresig--jquery.hotkeys", "0.2.0"
- gem "rails-assets-jquery-placeholder", "2.1.3"
+ gem "rails-assets-jquery-placeholder", "2.3.1"
gem "rails-assets-jquery-textchange", "0.2.3"
- gem "rails-assets-perfect-scrollbar", "0.6.7"
+ gem "rails-assets-perfect-scrollbar", "0.6.8"
gem "rails-assets-jakobmattsson--jquery-elastic", "1.6.11"
end
@@ -117,7 +117,7 @@ gem "facebox-rails", "0.2.0"
gem "http_accept_language", "2.0.5"
gem "i18n-inflector-rails", "1.0.7"
-gem "rails-i18n", "4.0.5"
+gem "rails-i18n", "4.0.8"
# Mail
@@ -127,17 +127,17 @@ gem "messagebus_ruby_api", "1.0.3"
# Parsing
gem "nokogiri", "1.6.7.1"
-gem "redcarpet", "3.3.3"
+gem "redcarpet", "3.3.4"
gem "twitter-text", "1.13.0"
gem "roxml", "3.1.6"
-gem "ruby-oembed", "0.8.14"
+gem "ruby-oembed", "0.9.0"
gem "open_graph_reader", "0.6.1"
# Services
-gem "omniauth", "1.2.2"
-gem "omniauth-facebook", "2.0.1"
-gem "omniauth-tumblr", "1.1"
+gem "omniauth", "1.3.1"
+gem "omniauth-facebook", "3.0.0"
+gem "omniauth-tumblr", "1.2"
gem "omniauth-twitter", "1.2.1"
gem "twitter", "5.15.0"
gem "omniauth-wordpress", "0.2.2"
@@ -148,7 +148,7 @@ gem "active_model_serializers", "0.9.3"
# XMPP chat dependencies
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"
+gem "rails-assets-diaspora_jsxc", "~> 0.1.4", source: "https://rails-assets.org"
# Tags
@@ -195,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.7.0"
+ gem "rails_admin", "0.8.1"
# Analytics
@@ -232,11 +232,11 @@ group :development do
# Linters
gem "jshintrb", "0.3.0"
- gem "rubocop", "0.34.2"
+ gem "rubocop", "0.35.1"
# Preloading environment
- gem "spring", "1.4.0"
+ gem "spring", "1.6.1"
gem "spring-commands-rspec", "1.0.4"
gem "spring-commands-cucumber", "1.0.1"
@@ -246,7 +246,7 @@ group :development do
gem "pry-byebug"
# test coverage
- gem "simplecov", "0.10.0", require: false
+ gem "simplecov", "0.11.1", require: false
end
group :test do
@@ -255,7 +255,7 @@ group :test do
gem "fixture_builder", "0.4.1"
gem "fuubar", "2.0.0"
gem "rspec-instafail", "0.4.0", require: false
- gem "test_after_commit", "0.4.1"
+ gem "test_after_commit", "0.4.2"
# Cucumber (integration tests)
@@ -267,8 +267,10 @@ group :test do
gem "factory_girl_rails", "4.5.0"
gem "timecop", "0.8.0"
- gem "webmock", "1.22.1", require: false
- gem "shoulda-matchers", "3.0.0"
+ gem "webmock", "1.22.3", require: false
+ gem "shoulda-matchers", "3.0.1"
+
+ gem "diaspora_federation-test", "0.0.11"
end
group :development, :test do
@@ -279,7 +281,7 @@ group :development, :test do
gem "cucumber-rails", "1.4.2", require: false
# Jasmine (client side application tests (JS))
- gem "jasmine", "2.3.1"
+ gem "jasmine", "2.4.0"
gem "jasmine-jquery-rails", "2.0.3"
gem "rails-assets-jasmine-ajax", "3.2.0", source: "https://rails-assets.org"
gem "sinon-rails", "1.15.0"
diff --git a/Gemfile.lock b/Gemfile.lock
index 30fcf3819..f55ff7696 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -54,10 +54,10 @@ GEM
activemodel
fog (>= 1.8.0)
unf
- ast (2.0.0)
+ ast (2.2.0)
astrolabe (1.3.1)
parser (~> 2.2)
- autoprefixer-rails (6.0.3)
+ autoprefixer-rails (6.2.2)
execjs
json
backbone-on-rails (1.2.0.0)
@@ -70,8 +70,7 @@ GEM
sass (~> 3.2)
buftok (0.2.0)
builder (3.2.2)
- byebug (4.0.5)
- columnize (= 0.9.0)
+ byebug (8.2.1)
capybara (2.5.0)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
@@ -88,18 +87,17 @@ GEM
celluloid-io (0.16.2)
celluloid (>= 0.16.0)
nio4r (>= 1.1.0)
- childprocess (0.5.6)
+ childprocess (0.5.8)
ffi (~> 1.0, >= 1.0.11)
- chunky_png (1.3.4)
+ chunky_png (1.3.5)
coderay (1.1.0)
- coffee-rails (4.1.0)
+ coffee-rails (4.1.1)
coffee-script (>= 2.2.0)
- railties (>= 4.0.0, < 5.0)
+ railties (>= 4.0.0, < 5.1.x)
coffee-script (2.4.1)
coffee-script-source
execjs
- coffee-script-source (1.9.1.1)
- columnize (0.9.0)
+ coffee-script-source (1.10.0)
compass (1.0.3)
chunky_png (~> 1.2)
compass-core (~> 1.0.2)
@@ -118,7 +116,7 @@ GEM
sprockets (< 2.13)
configurate (0.3.1)
connection_pool (2.2.0)
- crack (0.4.2)
+ crack (0.4.3)
safe_yaml (~> 1.0.0)
cucumber (1.3.20)
builder (>= 2.1.2)
@@ -133,7 +131,7 @@ GEM
nokogiri (~> 1.5)
rails (>= 3, < 5)
database_cleaner (1.5.1)
- devise (3.5.2)
+ devise (3.5.3)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
@@ -152,15 +150,18 @@ GEM
eventmachine (~> 1.0.8)
http_parser.rb (~> 0.6)
nokogiri (~> 1.6)
- diaspora_federation (0.0.8)
- faraday (~> 0.9.2)
+ diaspora_federation (0.0.11)
+ faraday (~> 0.9.0)
faraday_middleware (~> 0.10.0)
- nokogiri (~> 1.6, >= 1.6.6)
+ nokogiri (~> 1.6, >= 1.6.7.1)
typhoeus (~> 0.7)
valid (~> 1.0)
- diaspora_federation-rails (0.0.8)
- diaspora_federation (= 0.0.8)
+ diaspora_federation-rails (0.0.11)
+ diaspora_federation (= 0.0.11)
rails (~> 4.2)
+ diaspora_federation-test (0.0.11)
+ diaspora_federation (= 0.0.11)
+ factory_girl (~> 4.5, >= 4.5.0)
diff-lcs (1.2.5)
docile (1.1.5)
domain_name (0.5.25)
@@ -210,14 +211,15 @@ GEM
fixture_builder (0.4.1)
activerecord (>= 2)
activesupport (>= 2)
- fog (1.34.0)
+ fog (1.37.0)
+ fog-aliyun (>= 0.1.0)
fog-atmos
fog-aws (>= 0.6.0)
fog-brightbox (~> 0.4)
fog-core (~> 1.32)
fog-dynect (~> 0.0.2)
fog-ecloud (~> 0.1)
- fog-google (>= 0.0.2)
+ fog-google (<= 0.1.0)
fog-json
fog-local
fog-powerdns (>= 0.1.1)
@@ -231,9 +233,15 @@ GEM
fog-terremark
fog-vmfusion
fog-voxel
+ fog-vsphere (>= 0.4.0)
+ fog-xenserver
fog-xml (~> 0.1.1)
ipaddress (~> 0.5)
- nokogiri (~> 1.5, >= 1.5.11)
+ fog-aliyun (0.1.0)
+ fog-core (~> 1.27)
+ fog-json (~> 1.0)
+ ipaddress (~> 0.8)
+ xml-simple (~> 1.1)
fog-atmos (0.1.0)
fog-core
fog-xml
@@ -242,17 +250,14 @@ GEM
fog-json (~> 1.0)
fog-xml (~> 0.1)
ipaddress (~> 0.8)
- fog-brightbox (0.9.0)
+ fog-brightbox (0.10.1)
fog-core (~> 1.22)
fog-json
inflecto (~> 0.0.2)
- fog-core (1.32.1)
+ fog-core (1.35.0)
builder
excon (~> 0.45)
formatador (~> 0.2)
- mime-types
- net-scp (~> 1.1)
- net-ssh (>= 2.1.3)
fog-dynect (0.0.2)
fog-core
fog-json
@@ -260,7 +265,7 @@ GEM
fog-ecloud (0.3.0)
fog-core
fog-xml
- fog-google (0.1.1)
+ fog-google (0.1.0)
fog-core
fog-json
fog-xml
@@ -285,13 +290,13 @@ GEM
fog-core
fog-json
fog-xml
- fog-sakuracloud (1.3.3)
+ fog-sakuracloud (1.7.5)
fog-core
fog-json
fog-serverlove (0.1.2)
fog-core
fog-json
- fog-softlayer (1.0.0)
+ fog-softlayer (1.0.2)
fog-core
fog-json
fog-storm_on_demand (0.1.1)
@@ -306,10 +311,16 @@ GEM
fog-voxel (0.1.0)
fog-core
fog-xml
+ fog-vsphere (0.4.0)
+ fog-core
+ rbvmomi (~> 1.8)
+ fog-xenserver (0.2.2)
+ fog-core
+ fog-xml
fog-xml (0.1.2)
fog-core
nokogiri (~> 1.5, >= 1.5.11)
- font-awesome-rails (4.4.0.0)
+ font-awesome-rails (4.5.0.0)
railties (>= 3.2, < 5.0)
formatador (0.2.5)
fuubar (2.0.0)
@@ -350,13 +361,13 @@ GEM
rubocop (~> 0.20)
haml (4.0.7)
tilt
- handlebars_assets (0.21.0)
+ handlebars_assets (0.22.0)
execjs (~> 2.0)
multi_json (~> 1.0)
sprockets (>= 2.0.0, < 4.0)
tilt (~> 1.2)
- hashdiff (0.2.2)
- hashie (3.4.2)
+ hashdiff (0.2.3)
+ hashie (3.4.3)
hike (1.2.3)
hiredis (0.5.2)
hitimes (1.2.3)
@@ -380,12 +391,12 @@ GEM
ice_cube (0.11.1)
inflecto (0.0.2)
ipaddress (0.8.0)
- jasmine (2.3.1)
- jasmine-core (~> 2.3)
+ jasmine (2.4.0)
+ jasmine-core (~> 2.4)
phantomjs
rack (>= 1.2.1)
rake
- jasmine-core (2.3.4)
+ jasmine-core (2.4.1)
jasmine-jquery-rails (2.0.3)
jquery-rails (4.0.5)
rails-dom-testing (~> 1.0)
@@ -393,7 +404,7 @@ GEM
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
- js-routes (1.1.2)
+ js-routes (1.2.0)
railties (>= 3.2)
sprockets-rails
js_image_paths (0.0.2)
@@ -403,14 +414,14 @@ GEM
multi_json (>= 1.3)
rake
json (1.8.3)
- json-schema (2.5.1)
- addressable (~> 2.3.7)
- jwt (1.5.1)
+ json-schema (2.5.2)
+ addressable (~> 2.3.8)
+ jwt (1.5.2)
kaminari (0.16.3)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.10.0)
- listen (3.0.3)
+ listen (3.0.5)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
little-plugger (1.1.4)
@@ -431,10 +442,10 @@ GEM
thread_safe (~> 0.3, >= 0.3.1)
messagebus_ruby_api (1.0.3)
method_source (0.8.2)
- mime-types (2.6.2)
+ mime-types (2.99)
mini_magick (4.3.6)
mini_portile2 (2.0.0)
- minitest (5.8.2)
+ minitest (5.8.3)
mobile-fu (1.3.1)
rack-mobile-detect
rails
@@ -446,10 +457,7 @@ GEM
naught (1.1.0)
nenv (0.2.0)
nested_form (0.3.2)
- net-scp (1.2.1)
- net-ssh (>= 2.6.5)
- net-ssh (3.0.1)
- nio4r (1.1.1)
+ nio4r (1.2.0)
nokogiri (1.6.7.1)
mini_portile2 (~> 2.0.0.rc2)
notiffany (0.0.8)
@@ -462,18 +470,19 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
- omniauth (1.2.2)
+ omniauth (1.3.1)
hashie (>= 1.2, < 4)
- rack (~> 1.0)
- omniauth-facebook (2.0.1)
+ rack (>= 1.0, < 3)
+ omniauth-facebook (3.0.0)
omniauth-oauth2 (~> 1.2)
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
- omniauth-oauth2 (1.3.1)
+ omniauth-oauth2 (1.4.0)
oauth2 (~> 1.0)
omniauth (~> 1.2)
- omniauth-tumblr (1.1)
+ omniauth-tumblr (1.2)
+ multi_json
omniauth-oauth (~> 1.0)
omniauth-twitter (1.2.1)
json (~> 1.3)
@@ -484,7 +493,7 @@ GEM
faraday (~> 0.9.0)
nokogiri (~> 1.6)
orm_adapter (0.5.0)
- parser (2.2.2.6)
+ parser (2.2.3.0)
ast (>= 1.1, < 3.0)
phantomjs (1.9.8.0)
powerpack (0.1.1)
@@ -492,8 +501,8 @@ GEM
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
- pry-byebug (3.1.0)
- byebug (~> 4.0)
+ pry-byebug (3.3.0)
+ byebug (~> 8.0)
pry (~> 0.10)
pry-debundle (0.8)
pry
@@ -528,32 +537,31 @@ GEM
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.5)
sprockets-rails
- 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.9.1)
+ rails-assets-diaspora_jsxc (0.1.4)
+ rails-assets-favico.js (~> 0.3.9)
+ rails-assets-jquery (>= 1.11)
+ rails-assets-jquery-colorbox (~> 1.6.3)
+ 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.10)
+ rails-assets-highlightjs (9.0.0)
rails-assets-jakobmattsson--jquery-elastic (1.6.11)
rails-assets-jquery (>= 1.2.6)
- rails-assets-jasmine (2.3.4)
+ rails-assets-jasmine (2.4.1)
rails-assets-jasmine-ajax (3.2.0)
rails-assets-jasmine (~> 2)
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.6.3)
+ rails-assets-jquery (>= 1.3.2)
rails-assets-jquery-fullscreen-plugin (0.5.0)
- rails-assets-jquery-placeholder (2.1.3)
+ rails-assets-jquery-placeholder (2.3.1)
rails-assets-jquery (>= 1.6)
rails-assets-jquery-textchange (0.2.3)
rails-assets-jquery
- rails-assets-jquery.slimscroll (1.3.6)
- rails-assets-jquery (>= 1.7)
+ rails-assets-jquery.slimscroll (1.3.7)
rails-assets-jquery.ui (1.11.4)
rails-assets-jquery (>= 1.6)
rails-assets-markdown-it--markdown-it-for-inline (0.1.1)
@@ -563,7 +571,7 @@ GEM
rails-assets-markdown-it-sanitizer (0.4.1)
rails-assets-markdown-it-sub (1.0.0)
rails-assets-markdown-it-sup (1.0.0)
- rails-assets-perfect-scrollbar (0.6.7)
+ rails-assets-perfect-scrollbar (0.6.8)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.7)
@@ -572,13 +580,13 @@ GEM
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.2)
loofah (~> 2.0)
- rails-i18n (4.0.5)
- i18n (~> 0.6)
+ rails-i18n (4.0.8)
+ i18n (~> 0.7)
railties (~> 4.0)
rails-timeago (2.11.0)
actionpack (>= 3.1)
activesupport (>= 3.1)
- rails_admin (0.7.0)
+ rails_admin (0.8.1)
builder (~> 3.1)
coffee-rails (~> 4.0)
font-awesome-rails (>= 3.0, < 5)
@@ -603,14 +611,18 @@ GEM
rb-fsevent (0.9.6)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
- redcarpet (3.3.3)
- redis (3.2.1)
+ rbvmomi (1.8.2)
+ builder
+ nokogiri (>= 1.4.1)
+ trollop
+ redcarpet (3.3.4)
+ redis (3.2.2)
redis-namespace (1.5.2)
redis (~> 3.0, >= 3.0.4)
remotipart (1.2.1)
- request_store (1.2.0)
- responders (2.1.0)
- railties (>= 4.2.0, < 5)
+ request_store (1.2.1)
+ responders (2.1.1)
+ railties (>= 4.2.0, < 5.1)
roxml (3.1.6)
activesupport (>= 2.3.0)
nokogiri (>= 1.3.3)
@@ -637,17 +649,18 @@ GEM
rspec-mocks (~> 3.3.0)
rspec-support (~> 3.3.0)
rspec-support (3.3.0)
- rubocop (0.34.2)
+ rubocop (0.35.1)
astrolabe (~> 1.3)
- parser (>= 2.2.2.5, < 3.0)
+ parser (>= 2.2.3.0, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
- ruby-progressbar (~> 1.4)
- ruby-oembed (0.8.14)
+ ruby-progressbar (~> 1.7)
+ tins (<= 1.6.0)
+ ruby-oembed (0.9.0)
ruby-progressbar (1.7.5)
rubyzip (1.1.7)
safe_yaml (1.0.4)
- sass (3.4.19)
+ sass (3.4.20)
sass-rails (5.0.4)
railties (>= 4.0.0, < 5.0)
sass (~> 3.1)
@@ -660,7 +673,7 @@ GEM
rubyzip (~> 1.0)
websocket (~> 1.0)
shellany (0.0.1)
- shoulda-matchers (3.0.0)
+ shoulda-matchers (3.0.1)
activesupport (>= 4.0.0)
sidekiq (3.4.2)
celluloid (~> 0.16.0)
@@ -676,7 +689,7 @@ GEM
simple_captcha2 (0.3.4)
rails (>= 4.1)
simple_oauth (0.3.1)
- simplecov (0.10.0)
+ simplecov (0.11.1)
docile (~> 1.1.0)
json (~> 1.8)
simplecov-html (~> 0.10.0)
@@ -688,7 +701,7 @@ GEM
sinon-rails (1.15.0)
railties (>= 3.1)
slop (3.6.0)
- spring (1.4.0)
+ spring (1.6.1)
spring-commands-cucumber (1.0.1)
spring (>= 0.9.1)
spring-commands-rspec (1.0.4)
@@ -704,7 +717,7 @@ GEM
sprockets (>= 2.8, < 4.0)
state_machine (1.2.0)
systemu (2.6.5)
- test_after_commit (0.4.1)
+ test_after_commit (0.4.2)
activerecord (>= 3.2)
thor (0.19.1)
thread_safe (0.3.5)
@@ -712,6 +725,8 @@ GEM
timecop (0.8.0)
timers (4.0.4)
hitimes
+ tins (1.6.0)
+ trollop (2.1.2)
twitter (5.15.0)
addressable (~> 2.3)
buftok (~> 0.2.0)
@@ -735,21 +750,22 @@ GEM
unf (0.1.4)
unf_ext
unf_ext (0.0.7.1)
- unicorn (4.9.0)
+ unicorn (5.0.1)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
uuid (2.3.8)
macaddr (~> 1.0)
valid (1.1.0)
- warden (1.2.3)
+ warden (1.2.4)
rack (>= 1.0)
- webmock (1.22.1)
+ webmock (1.22.3)
addressable (>= 2.3.6)
crack (>= 0.3.2)
hashdiff
websocket (1.2.2)
will_paginate (3.0.7)
+ xml-simple (1.1.5)
xpath (2.0.0)
nokogiri (~> 1.3)
@@ -763,7 +779,7 @@ DEPENDENCIES
acts_as_api (= 0.4.2)
addressable (= 2.3.8)
asset_sync (= 1.1.0)
- autoprefixer-rails (= 6.0.3)
+ autoprefixer-rails (= 6.2.2)
backbone-on-rails (= 1.2.0.0)
bootstrap-sass (= 2.3.2.2)
capybara (= 2.5.0)
@@ -772,11 +788,12 @@ DEPENDENCIES
configurate (= 0.3.1)
cucumber-rails (= 1.4.2)
database_cleaner (= 1.5.1)
- devise (= 3.5.2)
+ devise (= 3.5.3)
devise-token_authenticatable (~> 0.4.0)
devise_lastseenable (= 0.0.6)
diaspora-vines (~> 0.2.0.develop)
- diaspora_federation-rails (= 0.0.8)
+ diaspora_federation-rails (= 0.0.11)
+ diaspora_federation-test (= 0.0.11)
entypo-rails (= 2.2.3)
eye (= 0.7)
facebox-rails (= 0.2.0)
@@ -785,7 +802,7 @@ DEPENDENCIES
faraday-cookie_jar (= 0.0.6)
faraday_middleware (= 0.10.0)
fixture_builder (= 0.4.1)
- fog (= 1.34.0)
+ fog (= 1.37.0)
fuubar (= 2.0.0)
gon (= 6.0.1)
guard (= 2.13.0)
@@ -794,18 +811,18 @@ DEPENDENCIES
guard-rspec (= 4.6.4)
guard-rubocop (= 1.2.0)
haml (= 4.0.7)
- handlebars_assets (= 0.21.0)
+ handlebars_assets (= 0.22.0)
http_accept_language (= 2.0.5)
i18n-inflector-rails (= 1.0.7)
- jasmine (= 2.3.1)
+ jasmine (= 2.4.0)
jasmine-jquery-rails (= 2.0.3)
jquery-rails (= 4.0.5)
jquery-ui-rails (= 5.0.5)
- js-routes (= 1.1.2)
+ js-routes (= 1.2.0)
js_image_paths (= 0.0.2)
jshintrb (= 0.3.0)
json (= 1.8.3)
- json-schema (= 2.5.1)
+ json-schema (= 2.5.2)
logging-rails (= 0.5.0)
markerb (= 1.1.0)
messagebus_ruby_api (= 1.0.3)
@@ -814,9 +831,9 @@ DEPENDENCIES
mobile-fu (= 1.3.1)
mysql2 (= 0.3.20)
nokogiri (= 1.6.7.1)
- omniauth (= 1.2.2)
- omniauth-facebook (= 2.0.1)
- omniauth-tumblr (= 1.1)
+ omniauth (= 1.3.1)
+ omniauth-facebook (= 3.0.0)
+ omniauth-tumblr (= 1.2)
omniauth-twitter (= 1.2.1)
omniauth-wordpress (= 0.2.2)
open_graph_reader (= 0.6.1)
@@ -831,13 +848,13 @@ DEPENDENCIES
rack-rewrite (= 1.5.1)
rack-ssl (= 1.4.1)
rails (= 4.2.5)
- rails-assets-diaspora_jsxc (~> 0.1.4.alpha, < 0.1.4.develop)!
- rails-assets-highlightjs (= 8.9.1)!
+ rails-assets-diaspora_jsxc (~> 0.1.4)!
+ rails-assets-highlightjs (= 9.0.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.3)!
+ rails-assets-jquery-placeholder (= 2.3.1)!
rails-assets-jquery-textchange (= 0.2.3)!
rails-assets-markdown-it (= 5.0.2)!
rails-assets-markdown-it--markdown-it-for-inline (= 0.1.1)!
@@ -846,43 +863,43 @@ DEPENDENCIES
rails-assets-markdown-it-sanitizer (= 0.4.1)!
rails-assets-markdown-it-sub (= 1.0.0)!
rails-assets-markdown-it-sup (= 1.0.0)!
- rails-assets-perfect-scrollbar (= 0.6.7)!
- rails-i18n (= 4.0.5)
+ rails-assets-perfect-scrollbar (= 0.6.8)!
+ rails-i18n (= 4.0.8)
rails-timeago (= 2.11.0)
- rails_admin (= 0.7.0)
+ rails_admin (= 0.8.1)
rb-fsevent (= 0.9.6)
rb-inotify (= 0.9.5)
- redcarpet (= 3.3.3)
+ redcarpet (= 3.3.4)
remotipart (= 1.2.1)
- responders (= 2.1.0)
+ responders (= 2.1.1)
roxml (= 3.1.6)
rspec-instafail (= 0.4.0)
rspec-rails (= 3.3.3)
- rubocop (= 0.34.2)
- ruby-oembed (= 0.8.14)
+ rubocop (= 0.35.1)
+ ruby-oembed (= 0.9.0)
rubyzip (= 1.1.7)
sass-rails (= 5.0.4)
selenium-webdriver (= 2.47.1)
- shoulda-matchers (= 3.0.0)
+ shoulda-matchers (= 3.0.1)
sidekiq (= 3.4.2)
sidetiq (= 0.6.3)
simple_captcha2 (= 0.3.4)
- simplecov (= 0.10.0)
+ simplecov (= 0.11.1)
sinatra (= 1.4.6)
sinon-rails (= 1.15.0)
- spring (= 1.4.0)
+ spring (= 1.6.1)
spring-commands-cucumber (= 1.0.1)
spring-commands-rspec (= 1.0.4)
- test_after_commit (= 0.4.1)
+ test_after_commit (= 0.4.2)
timecop (= 0.8.0)
twitter (= 5.15.0)
twitter-text (= 1.13.0)
typhoeus (= 0.8.0)
uglifier (= 2.7.2)
- unicorn (= 4.9.0)
+ unicorn (= 5.0.1)
uuid (= 2.3.8)
- webmock (= 1.22.1)
+ webmock (= 1.22.3)
will_paginate (= 3.0.7)
BUNDLED WITH
- 1.10.6
+ 1.11.2
diff --git a/app/assets/javascripts/app/views/hovercard_view.js b/app/assets/javascripts/app/views/hovercard_view.js
index 643fb771c..238952154 100644
--- a/app/assets/javascripts/app/views/hovercard_view.js
+++ b/app/assets/javascripts/app/views/hovercard_view.js
@@ -97,7 +97,7 @@ app.views.Hovercard = app.views.Base.extend({
href += "/hovercard.json";
var self = this;
- $.get(href, function(person){
+ $.ajax(href, {preventGlobalErrorHandling: true}).done(function(person){
if( !person || person.length === 0 ) {
throw new Error("received data is not a person object");
}
@@ -126,11 +126,12 @@ app.views.Hovercard = app.views.Base.extend({
return $('<a/>',{href: "/tags/"+tag.substring(1)}).text(tag)[0] ;
})) );
+ if(!app.currentUser.authenticated()){ return; }
// set aspect dropdown
// TODO render me client side!!!
var href = this.href();
href += "/aspect_membership_button";
- $.get(href, function(response) {
+ $.ajax(href, {preventGlobalErrorHandling: true}).done(function(response){
self.dropdown_container.html(response);
});
new app.views.AspectMembership({el: self.dropdown_container});
diff --git a/app/assets/javascripts/jsxc.js b/app/assets/javascripts/jsxc.js
index fb32058d6..cf75c913b 100644
--- a/app/assets/javascripts/jsxc.js
+++ b/app/assets/javascripts/jsxc.js
@@ -1,5 +1,5 @@
-//= require jquery.slimscroll
-//= require colorbox
+//= require jquery.slimscroll/jquery.slimscroll
+//= require jquery-colorbox
//= require favico.js
//= require jquery-fullscreen-plugin
//= require diaspora_jsxc
@@ -25,7 +25,7 @@ $(document).ready(function() {
chat: 1
},
displayRosterMinimized: function() {
- return true;
+ return false;
},
xmpp: {
url: $('script#jsxc').data('endpoint'),
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 0117c9135..427c0d549 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -77,7 +77,6 @@
@import 'stream';
@import 'stream_element';
@import 'comments';
-@import 'colorbox';
@import 'diaspora_jsxc';
@import 'chat';
@import 'markdown-content';
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index b2343d941..154f43376 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -3,8 +3,8 @@
# the COPYRIGHT file.
class PeopleController < ApplicationController
- before_action :authenticate_user!, except: [:show, :stream]
- before_action :find_person, only: [:show, :stream, :hovercard]
+ before_action :authenticate_user!, except: %i(show stream hovercard)
+ before_action :find_person, only: %i(show stream hovercard)
respond_to :html, :except => [:tag_index]
respond_to :json, :only => [:index, :show]
diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb
deleted file mode 100644
index cca482bbd..000000000
--- a/app/controllers/publics_controller.rb
+++ /dev/null
@@ -1,53 +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 PublicsController < ApplicationController
- include Diaspora::Parser
-
- skip_before_action :set_header_data
- skip_before_action :set_grammatical_gender
- before_action :check_for_xml, :only => [:receive, :receive_public]
- before_action :authenticate_user!, :only => [:index]
-
- respond_to :html
- respond_to :xml, :only => :post
-
- layout false
-
- def hub
- render :text => params['hub.challenge'], :status => 202, :layout => false
- end
-
- def receive_public
- logger.info "received a public message"
- Workers::ReceiveUnencryptedSalmon.perform_async(CGI::unescape(params[:xml]))
- render :nothing => true, :status => :ok
- end
-
- def receive
- person = Person.find_by_guid(params[:guid])
-
- if person.nil? || person.owner_id.nil?
- logger.error "Received post for nonexistent person #{params[:guid]}"
- render :nothing => true, :status => 404
- return
- end
-
- @user = person.owner
-
- logger.info "received a private message for user: #{@user.id}"
- Workers::ReceiveEncryptedSalmon.perform_async(@user.id, CGI::unescape(params[:xml]))
-
- render :nothing => true, :status => 202
- end
-
- private
-
- def check_for_xml
- if params[:xml].nil?
- render :nothing => true, :status => 422
- return
- end
- end
-end
diff --git a/app/models/notification.rb b/app/models/notification.rb
index 5fd5117f2..4cec79128 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -64,6 +64,8 @@ private
begin
n.actors = n.actors | [actor]
n.unread = true
+ # Explicitly touch the notification to update updated_at whenever new actor is inserted in notification.
+ n.touch
n.save!
rescue ActiveRecord::RecordNotUnique
nil
diff --git a/app/views/notifications/_notification.haml b/app/views/notifications/_notification.haml
index b4bf4e90f..651c2291b 100644
--- a/app/views/notifications/_notification.haml
+++ b/app/views/notifications/_notification.haml
@@ -10,4 +10,4 @@
.media-body
= notification_message_for(note)
%div
- = timeago(note.created_at)
+ = timeago(note.updated_at)
diff --git a/bin/cucumber b/bin/cucumber
index 12971cdce..f135a7564 100755
--- a/bin/cucumber
+++ b/bin/cucumber
@@ -1,7 +1,8 @@
#!/usr/bin/env ruby
begin
- load File.expand_path("../spring", __FILE__)
-rescue LoadError
+ load File.expand_path('../spring', __FILE__)
+rescue LoadError => e
+ raise unless e.message.include?('spring')
end
require 'bundler/setup'
load Gem.bin_path('cucumber', 'cucumber')
diff --git a/bin/rails b/bin/rails
index 7feb6a30e..0af1c3baf 100755
--- a/bin/rails
+++ b/bin/rails
@@ -1,8 +1,11 @@
#!/usr/bin/env ruby
begin
- load File.expand_path("../spring", __FILE__)
-rescue LoadError
+ load File.expand_path('../spring', __FILE__)
+rescue LoadError => e
+ raise unless e.message.include?('spring')
end
+# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
-require_relative '../config/boot'
+require File.expand_path('../../config/boot', __FILE__)
require 'rails/commands'
diff --git a/bin/rake b/bin/rake
index 8017a0271..d87d5f578 100755
--- a/bin/rake
+++ b/bin/rake
@@ -1,7 +1,8 @@
#!/usr/bin/env ruby
begin
- load File.expand_path("../spring", __FILE__)
-rescue LoadError
+ load File.expand_path('../spring', __FILE__)
+rescue LoadError => e
+ raise unless e.message.include?('spring')
end
require_relative '../config/boot'
require 'rake'
diff --git a/bin/rspec b/bin/rspec
index 20060ebd7..6e6709219 100755
--- a/bin/rspec
+++ b/bin/rspec
@@ -1,7 +1,8 @@
#!/usr/bin/env ruby
begin
- load File.expand_path("../spring", __FILE__)
-rescue LoadError
+ load File.expand_path('../spring', __FILE__)
+rescue LoadError => e
+ raise unless e.message.include?('spring')
end
require 'bundler/setup'
load Gem.bin_path('rspec-core', 'rspec')
diff --git a/bin/spring b/bin/spring
index de6070b2a..62ec28f8c 100755
--- a/bin/spring
+++ b/bin/spring
@@ -1,18 +1,15 @@
#!/usr/bin/env ruby
-# This file loads spring without using Bundler, in order to be fast
-# It gets overwritten when you run the `spring binstub` command
+# This file loads spring without using Bundler, in order to be fast.
+# It gets overwritten when you run the `spring binstub` command.
unless defined?(Spring)
- require "rubygems"
- require "bundler"
+ require 'rubygems'
+ require 'bundler'
- if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)
- ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
- ENV["GEM_HOME"] = nil
- Gem.paths = ENV
-
- gem "spring", match[1]
- require "spring/binstub"
+ if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m))
+ Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq }
+ gem 'spring', match[1]
+ require 'spring/binstub'
end
end
diff --git a/config/defaults.yml b/config/defaults.yml
index 8ebef3e90..fe8d32205 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -4,7 +4,7 @@
defaults:
version:
- number: "0.5.5.1" # Do not touch unless doing a release, do not backport the version number that's in master
+ number: "0.5.6.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/"
diff --git a/config/initializers/diaspora_federation.rb b/config/initializers/diaspora_federation.rb
index f15dcf5cf..4d63aebd2 100644
--- a/config/initializers/diaspora_federation.rb
+++ b/config/initializers/diaspora_federation.rb
@@ -10,15 +10,16 @@ DiasporaFederation.configure do |config|
person = Person.find_local_by_diaspora_handle(handle)
if person
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)),
- seed_url: AppConfig.pod_uri,
- profile_url: person.profile_url,
- atom_url: person.atom_url,
- salmon_url: person.receive_url,
- guid: person.guid,
- public_key: person.serialized_public_key
+ 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)),
+ seed_url: AppConfig.pod_uri,
+ profile_url: person.profile_url,
+ atom_url: person.atom_url,
+ salmon_url: person.receive_url,
+ subscribe_url: AppConfig.url_to("/people?q={uri}"),
+ guid: person.guid,
+ public_key: person.serialized_public_key
)
end
end
@@ -61,5 +62,52 @@ DiasporaFederation.configure do |config|
person_entity.save!
end
+
+ on :fetch_private_key_by_diaspora_id do |diaspora_id|
+ key = Person.where(diaspora_handle: diaspora_id).joins(:owner).pluck(:serialized_private_key).first
+ OpenSSL::PKey::RSA.new key unless key.nil?
+ end
+
+ on :fetch_author_private_key_by_entity_guid do |entity_type, guid|
+ key = entity_type.constantize.where(guid: guid).joins(author: :owner).pluck(:serialized_private_key).first
+ OpenSSL::PKey::RSA.new key unless key.nil?
+ end
+
+ on :fetch_public_key_by_diaspora_id do |diaspora_id|
+ key = Person.where(diaspora_handle: diaspora_id).pluck(:serialized_public_key).first
+ OpenSSL::PKey::RSA.new key unless key.nil?
+ end
+
+ on :fetch_author_public_key_by_entity_guid do |entity_type, guid|
+ key = entity_type.constantize.where(guid: guid).joins(:author).pluck(:serialized_public_key).first
+ OpenSSL::PKey::RSA.new key unless key.nil?
+ end
+
+ on :entity_author_is_local? do |entity_type, guid|
+ entity_type.constantize.where(guid: guid).joins(author: :owner).exists?
+ end
+
+ on :fetch_entity_author_id_by_guid do |entity_type, guid|
+ entity_type.constantize.where(guid: guid).joins(:author).pluck(:diaspora_handle).first
+ end
+
+ on :queue_public_receive do |xml|
+ Workers::ReceiveUnencryptedSalmon.perform_async(xml)
+ end
+
+ on :queue_private_receive do |guid, xml|
+ person = Person.find_by_guid(guid)
+
+ if person.nil? || person.owner_id.nil?
+ false
+ else
+ Workers::ReceiveEncryptedSalmon.perform_async(person.owner.id, xml)
+ true
+ end
+ end
+
+ on :save_entity_after_receive do
+ # TODO
+ end
end
end
diff --git a/config/locale_settings.yml b/config/locale_settings.yml
index 7b87609dd..9e027908d 100644
--- a/config/locale_settings.yml
+++ b/config/locale_settings.yml
@@ -58,7 +58,7 @@ available:
si: "සිංහල"
sk: "Slovenčina"
sl: "Slovenščina"
- sq: "gjuha shqipe"
+ sq: "Shqip"
sr: "српски језик"
sv: "Svenska"
te: "తెలుగు"
diff --git a/config/locales/devise/devise.sq.yml b/config/locales/devise/devise.sq.yml
index 6b472d125..8fedaf7b5 100644
--- a/config/locales/devise/devise.sq.yml
+++ b/config/locales/devise/devise.sq.yml
@@ -1,121 +1,88 @@
-# Copyright (c) 2010-2012, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
sq:
errors:
messages:
- not_found: "nuk u gjet"
+ not_found: "s’u gjet"
already_confirmed: "është ripohuar tashmë"
- not_locked: "nuk qe kyçur"
+ not_locked: "s’qe kyçur"
devise:
failure:
- unauthenticated: 'Duhet të bëni hyrjen ose të regjistroheni, përpara se të vazhdohet.'
- unconfirmed: 'Duhet të ripohoni llogarinë tuaj, përpara se të vazhdohet.'
- locked: 'Llogaria juaj është e kyçur.'
- invalid: 'Emër përdoruesi ose fjalëkalim i gabuar.'
- invalid_token: 'Mekanizëm ose të dhëna të pavlefshme mirëfilltësimi.'
- timeout: 'Sesionit tuaj i mbaroi koha, ju lutem, hyni sërish që të vazhdoni.'
- inactive: 'Llogaria juaj ende nuk është aktive.'
+ unauthenticated: "Duhet të bëni hyrjen ose të regjistroheni, përpara se të vazhdohet."
+ unconfirmed: "Duhet të ripohoni llogarinë tuaj, përpara se të vazhdohet."
+ locked: "Llogaria juaj është e kyçur."
+ not_found_in_database: 'Email ose fjalëkalim i pavlefshëm.'
+ invalid: 'Emër përdoruesi ose fjalëkalim i pavlefshëm.'
+ invalid_token: 'Token mirëfilltësimi i pavlefshëm.'
+ timeout: "Sesionit tuaj i mbaroi koha, ju lutemi, hyni sërish që të vazhdoni."
+ inactive: "Llogaria juaj ende s’është aktive."
sessions:
new:
- login: 'Hyni'
- username: 'Emër përdoruesi'
- password: 'Fjalëkalim'
- sign_in: 'Hyni'
+ login: "Hyni"
+ username: "Emër përdoruesi"
+ password: "Fjalëkalim"
+ sign_in: "Hyni"
remember_me: "Mbamë mend"
- alpha_software: 'Ju ndan një hap nga përdorimi i një programi në stad alfa.'
- bugs_and_feedback: 'Ta dini që tani: do të hasni të meta. Ju nxisim të përdorni butonin Përshtypje në anën e djathtë të shfletuesit tuaj që të raportoni çfarëdo bllokimi! Do të punojmë sa më shpejt që të mundemi për të zgjidhur çfarëdo çështje që na raportoni.'
- bugs_and_feedback_mobile: 'Ta dini që tani, do të hasni të meta. Ju nxisim të raportoni çfarëdo bllokimi! Do të punojmë sa më shpejt që të mundemi për të zgjidhur çfarëdo çështje që na raportoni.'
- modern_browsers: 'mbulon vetëm shfletues modernë.'
+ modern_browsers: 'mbulon vetëm shfletuesit modernë.'
signed_in: 'Hytë me sukses.'
signed_out: 'Dolët me sukses.'
passwords:
- send_instructions: "Brenda pak minutash do t'ju vijë email me udhëzime si të ricaktoni fjalëkalimin tuaj."
- updated: 'Fjalëkalimi juaj u ndryshua me sukses. Tani jeni i futur.'
+ send_instructions: "Brenda pak minutash do t’ju vijë një email me udhëzime se si të ricaktoni fjalëkalimin tuaj."
+ updated: "Fjalëkalimi juaj u ndryshua me sukses. Tani jeni i futur."
edit:
- change_password: "Ndërroje fjalëkalimin tim"
+ change_password: "Ndryshoje fjalëkalimin tim"
+ new_password: "Fjalëkalim i ri"
+ confirm_password: "Ripohoni fjalëkalimin"
new:
forgot_password: "Harruat fjalëkalimin?"
- no_account: 'Nuk ka llogari me këtë email. Nëse po prisni për një ftesë, po shpërndajmë të tilla aq shpejt sa mundemi'
- send_password_instructions: "Dërgomë udhëzime ricaktimi fjalëkalimi"
+ no_account: 'S’ka llogari me këtë email'
+ reset_password: "Ricaktoni fjalëkalimin"
+ email: "Adresë email"
+ send_password_instructions: "Dërgomëni udhëzime ricaktimi fjalëkalimi"
confirmations:
- send_instructions: "Brenda pak minutash do t'ju vijë një email me udhëzime se si të ripohoni llogarinë tuaj."
- confirmed: 'Llogaria juaj u ripohua me sukses. Tani jeni i futur.'
+ send_instructions: "Brenda pak minutash do t’ju vijë një email me udhëzime se si të ripohoni llogarinë tuaj."
+ confirmed: "Llogaria juaj u ripohua me sukses. Tani jeni i futur."
new:
resend_confirmation: "Ridërgo udhëzime ripohimi"
registrations:
- signed_up: 'U regjistruat me sukses. Po qe se mundësia përkatëse është e aktivizuar, ju është dërguar një mesazh ripohimi te e-mail-i juaj.'
- updated: 'E përditësuat me sukses llogarinë tuaj.'
- destroyed: "Shëndet! Llogaria juaj u anulua me sukses. Shpresojmë t'ju shohim prapë së shpejti."
+ signed_up: "U regjistruat me sukses. Po qe se mundësia përkatëse është e aktivizuar, ju është dërguar një mesazh ripohimi te email-i juaj."
+ updated: "E përditësuat me sukses llogarinë tuaj."
+ destroyed: "Shëndet! Llogaria juaj u anulua me sukses. Shpresojmë t’ju shohim prapë së shpejti."
unlocks:
- send_instructions: "Brenda pak minutash do t'ju vijë një email me udhëzime se si zhbllokoni llogarinë."
+ send_instructions: "Brenda pak minutash do t’ju vijë një email me udhëzime se si të zhbllokoni llogarinë."
unlocked: 'Llogaria juaj u zhbllokua me sukses. Tani jeni i futur.'
new:
- resend_unlock: "Ridërgoji udhësimet për zhbllokim"
+ resend_unlock: "Ridërgoji udhëzimet për zhbllokim"
invitations:
- send_instructions: 'Ftesa juaj u dërgua.'
- invitation_token_invalid: 'Ndjesën tonë! Ky mekanizëm ose këto të dhëna ftese nuk janë të vlefshme.'
- updated: 'Fjalëkalimi juaj u caktua me sukses. Tani jeni i futur.'
+ send_instructions: "Ftesa juaj u dërgua."
+ invitation_token_invalid: "Ndjesën tonë! Ky mekanizëm ose këto të dhëna ftese s’janë të vlefshme."
+ updated: "Fjalëkalimi juaj u caktua me sukses. Tani jeni i futur."
mailer:
welcome: "Mirë se vini %{email}!"
hello: "Tungjatjeta %{email}!"
confirmation_instructions:
- subject: 'Udhëzime ripohimi'
+ subject: "Udhëzime ripohimi"
you_can_confirm: "Llogarinë tuaj mund të ripohoni përmes lidhjes më poshtë:"
confirm: "Ripohoje llogarinë time"
reset_password_instructions:
- subject: 'Udhëzime ricaktimi fjalëkalimi'
+ subject: "Udhëzime ricaktimi fjalëkalimi"
someone_requested: "Dikush kërkoi një lidhje për ndryshimin e fjalëkalimit tuaj, dhe këtë mund ta bëni përmes lidhjes më poshtë."
- change: "Ndërroje fjalëkalimin tim"
- wont_change: "Fjalëkalimi juaj nuk do të ndryshojë pa përdorur lidhjen e mësipërme për të krijuar një të ri."
- ignore: "Nëse këtë nuk e kërkuat ju, ju lutem, shpërfilleni këtë email."
+ change: "Ndryshoje fjalëkalimin tim"
+ wont_change: "Fjalëkalimi juaj nuk do të ndryshojë pa përdorur lidhjen më sipër për të krijuar një të ri."
+ ignore: "Nëse këtë s’e kërkuat ju, ju lutemi, shpërfilleni këtë email."
unlock_instructions:
- subject: 'Udhëzime zhbllokimi'
- account_locked: "Llogari juaj është bllokuar për shkak të një sasie të tepruar përpjekjesh për të hyrë në të."
- click_to_unlock: "Që të zhbllokoni llogarinë tuaj, klikoni lidhjen e mëposhtme:"
+ subject: "Udhëzime zhbllokimi"
+ account_locked: "Llogaria juaj është bllokuar për shkak të një sasie të tepruar përpjekjesh për të hyrë në të."
+ click_to_unlock: "Që të zhbllokoni llogarinë tuaj, klikoni lidhjen më poshtë:"
unlock: "Zhbllokoje llogarinë time"
- invitation_instructions:
- displaying_correctly: "Nuk shfaqet si duhet email-i? %{link}"
- view_in: "Shiheni te shlfetuesi juaj."
- finally: "Më në fund - ja ku është"
- arrived: "Rrjeti shoqëror që keni pritur, mbërriti. I rishikuar, më i sigurt, dhe më zbavitës, %{strong_diaspora} është gati t'ju ndihmojë të ndani me të tjerët dhe të eksploroni gjithçka në web nën një rrugë të re."
- sign_up_now: "Regjistrohuni tani &rarr;"
- friends_saying: "Ç'thonë miqtë tuaj..."
- more_people: "Më tepër persona janë të ngazëllyer t'ju shohin!"
- get_connected: "Lidhuni"
- get_connected_paragraph: "Një lëvizje ndërkombëtare me një vizion të përbashkët për një web më të mirë, veçoria #1 e %{strong_diaspora}-s është bashkësia e saj. Njihuni me njerëz të rinj, lidhuni me miqtë, dhe merrni pjesë në zbavitje."
- be_yourself: "Jini Vetvetja"
- be_yourself_paragraph: "Interneti ka krijuar rrugë të reja unike që të shprehim vetveten. %{strong_diaspora} ju lejon të jeni vetvetja dhe të ndani me të tjerët çfarëdo që dëshironi, me ose pa emrin tuaj të vërtetë."
- have_fun: "Zbavituni"
- cubbies: "Cubbi.es"
- have_fun_paragraph: "%{strong_diaspora} do të thotë zbulim online lënde dhe personash të rinj mahnitës. %{link}, zbatimi i parë në botë për %{strong_diaspora} është thjesht fillimi. Mblidhni dhe ndani me të tjerët gjëra nga web-i në tërë madhështinë e tij."
- made_by_people: "%{strong_diaspora} është krijuar nga njerëz që e duan Internetin po aq sa ju. %{jointeam}, ose %{helpfund}!"
- join_team: "Bëhuni Pjesë e Ekipit Tonë"
- or: "ose"
- help_fund: "ndihmoni në financimin e Diaspora-s"
- unsubscribe: "Që të çregjistroheni, ju lutem, klikoni mbi %{link}."
- here: "këtu"
- love: "Me dashuri,"
- team_diaspora: "Ekipi i Diaspora-s"
- email_us: "Për pyetje dhe kërkesa të përgjithshme, ose për asistencë lidhur me llogarinë tuaj në Diaspora, ju lutem, na dërgoni një email te %{email}."
- email_address: "questions@joindiaspora.com"
- subject: "Jeni ftuar të merrni pjesë te Diaspora!"
- accept: "Pranojeni ftesën"
- ignore: "Nëse nuk doni ta pranoni ftesën, ju lutem, shpërfilleni këtë email."
- no_account_till: "Llogaria juaj nuk do të krijohet pa shkuar te lidhja e mësipërme që të regjistroheni."
inviter:
has_invited_you: "%{name}"
- have_invited_you: "%{names} ju ka ftuar të merrni pjesë në Diaspora"
+ have_invited_you: "%{names} ju ka ftuar të merrni pjesë në diaspora*"
accept_at: "te %{url}, mund ta pranoni përmes lidhjes më poshtë."
shared:
- mail_signup_form:
- sign_up_for_an_invite: "Regjistrohuni për një ftesë!"
links:
sign_in: 'Hyni'
sign_up: 'Regjistrohuni'
- sign_up_closed: 'Hëpërhë regjistrimet janë të mbyllura.'
+ sign_up_closed: 'Regjistrimet e lira janë të mbyllura hëpërhë.'
forgot_your_password: 'Harruat fjalëkalimin tuaj?'
- receive_confirmation: "Nuk i morët udhëzimet për ripohimin?"
- receive_unlock: "Nuk i morët udhëzimet për zhbllokimin?"
+ receive_confirmation: "S’i morët udhëzimet për ripohimin?"
+ receive_unlock: "S’i morët udhëzimet për zhbllokimin?"
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index aaa452d7f..fec09ac2a 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -173,9 +173,6 @@ en:
video_title:
unknown: "Unknown video title"
aspects:
- zero: "No aspects"
- one: "1 aspect"
- other: "%{count} aspects"
contacts_visible: "Contacts in this aspect will be able to see each other."
contacts_not_visible: "Contacts in this aspect will not be able to see each other."
edit:
@@ -299,9 +296,6 @@ en:
other: "%{count} reactions"
contacts:
- zero: "No contacts"
- one: "1 contact"
- other: "%{count} contacts"
create:
failure: "Failed to create contact"
sharing:
@@ -1355,7 +1349,7 @@ en:
mr_wiggles: "Mr Wiggles will be sad to see you go"
what_we_delete: "We will delete all of your posts and profile data as soon as possible. Your comments on other people’s posts will still appear, but they will be associated with your diaspora* ID rather than your name."
locked_out: "You will get signed out and locked out of your account until it has been deleted."
- lock_username: "Your username will be locked. You will not be able create a new account on this pod with the same ID."
+ lock_username: "Your username will be locked. You will not be able to create a new account on this pod with the same ID."
no_turning_back: "There is no turning back! If you’re really sure, enter your password below."
if_you_want_this: "If you really want this to happen, type in your password below and click “Close account”"
diff --git a/config/locales/diaspora/sq.yml b/config/locales/diaspora/sq.yml
index 6146e4bc2..9d553b2e3 100644
--- a/config/locales/diaspora/sq.yml
+++ b/config/locales/diaspora/sq.yml
@@ -1,35 +1,26 @@
-# Copyright (c) 2010-2012, Diaspora Inc. This file is
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
# Sample localization file for English. Add more files in this directory for other locales.
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
-#Shih për sqarime për
-# thats_you: "That's you!"
-#
-# people_on_pod_are_aware_of: " people on pod are aware
-#
-#
-# screenshot_explanation: "%{link1}. Kjo cubby e dhënë është e lidhur te %{link2}."
-#
-#
-# resque_overview: "Përmbledhje Resque"
-
sq:
settings: "Rregullime"
profile: "Profil"
account: "Llogari"
privacy: "Privatësi"
- privacy_policy: "Rregulla Privatësie"
- terms_and_conditions: "Terma dhe Kushte"
+ privacy_policy: "Rregulla privatësie"
+ terms_and_conditions: "Terma dhe kushte"
_services: "Shërbime"
- _applications: "Zbatime"
- _photos: "foto"
+ _applications: "Aplikacione"
+ _photos: "Foto"
+ _help: "Ndihmë"
ok: "OK"
cancel: "Anuloje"
delete: "Fshije"
hide: "Fshihe"
+ ignore: "Shpërfille"
undo: "Të zhbëhet?"
or: "ose"
ago: "%{time} më parë"
@@ -38,23 +29,25 @@ sq:
password: "Fjalëkalim"
password_confirmation: "Ripohim fjalëkalimi"
are_you_sure: "Jeni i sigurt?"
- are_you_sure_delete_account: "Jeni i sigurt se doni të mbyllet llogaria juaj? Kjo nuk mund të zhbëhet!"
- fill_me_out: "Fill me out"
+ are_you_sure_delete_account: "Jeni i sigurt se doni të mbyllet llogaria juaj? Kjo s’mund të zhbëhet!"
+ fill_me_out: "Plotësomëni"
back: "Mbrapsht"
public: "Publike"
limited: "E kufizuar"
search: "Kërkoni"
nsfw: "NSFW"
find_people: "Gjeni persona ose #tags"
- _home: "Hyrja"
+ _home: "Kreu"
more: "Më tepër"
- next: "pasuesja"
- previous: "e mëparshmja"
+ next: "Pasuesja"
+ previous: "E mëparshmja"
_comments: "Komente"
- all_aspects: "Krejt Aspektet"
- no_results: "Nuk u Gjetën Përfundime"
+ all_aspects: "Krejt aspektet"
+ no_results: "S’u gjetën përfundime"
_contacts: "Kontakte"
welcome: "Mirë se vini!"
+ _terms: "Kushte"
+ _statistics: "Statistika"
#for reference translation, the real activerecord english transations are actually
#in en-US, en-GB, and en-AU yml files
@@ -64,7 +57,7 @@ sq:
user:
attributes:
person:
- invalid: "është i pavleshëm."
+ invalid: "është i pavlefshëm."
username:
taken: "është i zënë."
invalid: "është i pavlefshëm. Lejojmë vetë shkronja, numra, dhe nënvija."
@@ -85,44 +78,82 @@ sq:
reshare:
attributes:
root_guid:
- taken: "E bukur, hë? E keni ndarë një herë me të tjerët këtë postim!"
+ taken: "E bukur, hë? E keni ndarë një herë me të tjerët këtë postim!"
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "S’janë dhënë mundësi të mjaftueshme për votimin."
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "Keni marrë pjesë një herë në këtë votim!"
error_messages:
helper:
- invalid_fields: "Fusha të Pavlefshme"
+ invalid_fields: "Fusha të pavlefshme"
correct_the_following_errors_and_try_again: "Ndreqni gabimet vijuese dhe riprovoni."
- post_not_public: "Postimi që po përpiqeni të shihni nuk është publik!"
- login_try_again: "Ju lutemi, <a href='%{login_link}'>bëni hyrjen</a> dhe riprovoni."
+ post_not_public: "Postimi që po rrekeni të shihni, s’është publik!"
+ post_not_public_or_not_exist: "Postimi që po rrekeni të shihni, s’është publik, ose s’ekziston!"
+ login_try_again: "Ju lutemi, <a href='%{login_link}'>bëni hyrjen</a> dhe riprovoni."
+
admins:
admin_bar:
pages: "Faqe"
- user_search: "Kërkime Përdoruesi"
- weekly_user_stats: "Statistika Përdoruesi të Përjavshme"
- pod_stats: "Statistika Pod"
- correlations: "Bashkëlidhje"
- resque_overview: "Përmbledhje Resque"
- correlations:
- correlations_count: "Numërim Bashkëlidhjesh me Hyrje:"
+ dashboard: "Pult"
+ user_search: "Kërkime përdoruesi"
+ weekly_user_stats: "Statistika përdoruesi të përjavshme"
+ pod_stats: "Statistika nyjeje"
+ report: "Njoftime"
+ sidekiq_monitor: "Monitor Sidekiq"
+ pod_network: "Rrjet nyjeje"
+ dashboard:
+ pod_status: "Gjendje nyjeje"
+ fetching_diaspora_version: "Po përcaktohet versioni më i ri i diaspora*-s…"
user_search:
- you_currently: "deri tani keni ende %{user_invitation} ftesa %{link}"
- add_invites: "shtoni ftesa"
- email_to: "Email për Ftim"
+ you_currently:
+ zero: "S’keni më ftesa %{link}"
+ one: "Tani keni edhe një ftesë %{link}"
+ other: "Tani keni edhe %{count} ftesa %{link}"
+ view_profile: "Shihni profilin"
+ add_invites: "Shtoni ftesa"
+ close_account: "Mbylleni llogarinë"
+ lock_account: "Bllokojeni llogarinë"
+ unlock_account: "Zhbllokojeni llogarinë"
+ are_you_sure: "Jeni i sigurt se doni të mbyllet kjo llogari?"
+ are_you_sure_lock_account: "Jeni i sigurt se doni të bllokohet kjo llogari?"
+ are_you_sure_unlock_account: "Jeni i sigurt se doni të zhbllokohet kjo llogari?"
+ account_closing_scheduled: "Llogaria e %{name} është vënë në plan të mbyllet. Veprimi do të kryhet pas pak çastesh…"
+ account_locking_scheduled: "Llogaria e %{name} është vënë në plan të bllokohet. Veprimi do të kryhet pas pak çastesh…"
+ account_unlocking_scheduled: "Llogaria e %{name} është vënë në plan të zhbllokohet. Veprimi do të kryhet pas pak çastesh…"
+ email_to: "Email për t’u ftuar"
+ under_13: "Shfaqi përdoruesit që janë nën 13 vjeç (COPPA)"
users:
- zero: "u gjet %{count} përdorues"
- one: "u gjet %{count} përdorues"
- other: "u gjetën %{count} përdoruesa"
+ zero: "U gjetën %{count} përdorues"
+ one: "U gjet %{count} përdorues"
+ other: "U gjetën %{count} përdorues"
+ user_entry:
+ id: "ID"
+ guid: "GUID"
+ email: "Email"
+ diaspora_handle: "diaspora* handle"
+ last_seen: "Parë së fundi më"
+ account_closed: "Llogari e mbyllur"
+ nsfw: "#nsfw"
+ unknown: "E panjohur"
+ 'yes': "Po"
+ 'no': "Jo"
weekly_user_stats:
- current_server: "Data e tanishme e shërbyesit %{date}"
+ current_server: "Data e tanishme e shërbyesit është %{date}"
amount_of:
- zero: "numri i përdoruesve të rinj këtë javë: asnjë"
- one: "numri i përdoruesve të rinj këtë javë: %{count}"
- other: "numri i përdoruesve të rinj këtë javë: %{count}"
+ zero: "Numër përdoruesish të rinj këtë javë: asnjë"
+ one: "Numër përdoruesish të rinj këtë javë: %{count}"
+ other: "Numër përdoruesish të rinj këtë javë: %{count}"
stats:
week: "Javë"
- 2weeks: "2 Javë"
+ 2weeks: "2 javë"
month: "Muaj"
daily: "Përditë"
- usage_statistic: "Statistika Përdorimi"
- go: "go"
+ usage_statistic: "Statistika përdorimi"
+ go: "Jepi"
display_results: "Po shfaqen përfundimet për segmentin <b>%{segment}</b>"
posts:
zero: "%{count} postime"
@@ -133,63 +164,55 @@ sq:
one: "%{count} koment"
other: "%{count} komente"
shares:
- zero: "%{count} ndarje me të tjerët"
- one: "%{count} ndarje me të tjerët"
- other: "%{count} ndarje me të tjerët"
+ zero: "%{count} ndarje"
+ one: "%{count} ndarje"
+ other: "%{count} ndarje"
users:
- zero: "%{count} përdoruesa"
+ zero: "%{count} përdorues"
one: "%{count} përdorues"
- other: "%{count} përdoruesa"
- current_segment: "Segmenti i tanishëm tregon mesatarisht <b>%{post_yest}</b> postime për përdorues, nga <b>%{post_day}</b>"
- 50_most: "50 Etiketat Më Popullore"
- tag_name: "Emër Etikete: <b>%{name_tag}</b> Numër: <b>%{count_tag}</b>"
+ other: "%{count} përdorues"
+ current_segment: "Segmenti i tanishëm flet për një mesatare <b>%{post_yest}</b> postime për përdorues, që prej <b>%{post_day}</b>"
+ 50_most: "50 etiketat më popullore"
+ tag_name: "Emër etikete: <b>%{name_tag}</b> Numër: <b>%{count_tag}</b>"
+ pods:
+ pod_network: "Rrjet nyjeje"
application:
helper:
- unknown_person: "person i panjohur"
+ unknown_person: "Person i panjohur"
video_title:
- unknown: "Titull i Panjohur Videoje"
- diaspora_alpha: "DIASPORA* ALPHA"
+ unknown: "Titull i panjohur videoje"
aspects:
- zero: "pa aspekte"
+ zero: "Pa aspekte"
one: "1 aspekt"
- two: "%{count} aspekte"
- few: "%{count} aspekte"
- many: "%{count} aspekte"
other: "%{count} aspekte"
contacts_visible: "Kontaktet te ky aspekt do të jenë në gjendje të shohin njëri-tjetrin."
- contacts_not_visible: "Kontaktet te ky aspekt nuk do të jenë në gjendje të shohin njëri-tjetrin."
+ contacts_not_visible: "Kontaktet te ky aspekt s’do të jenë në gjendje të shohin njëri-tjetrin."
edit:
- make_aspect_list_visible: "të bëhen kontaktet e këtij aspekti të dukshëm për njëri-tjetrin?"
+ grant_contacts_chat_privilege: "T’u akordohet kontakteve në këtë aspekt privilegji për fjalosje?"
+ make_aspect_list_visible: "Të bëhen kontaktet e këtij aspekti të dukshëm për njëri-tjetrin?"
remove_aspect: "Fshije këtë aspekt"
confirm_remove_aspect: "Jeni i sigurt se doni të fshihet ky aspekt?"
- add_existing: "Shtoni një kontakt ekzistues"
- done: "U bë"
- rename: "riemërtojeni"
- aspect_list_is_visible: "lista e aspekteve është e dukshme për të tjerët në aspekt"
- aspect_list_is_not_visible: "lista e aspekteve u fshihet të tjerëve në aspekt"
- update: "përditësoje"
- updating: "përditësim"
- aspect_contacts:
- done_editing: "mbarova me përpunimin"
- show:
- edit_aspect: "përpunoni aspekt"
+ set_visibility: "Caktojini dukshmërinë"
+ rename: "Riemërtojeni"
+ aspect_list_is_visible: "Kontaktet në këtë aspekt janë në gjendje të shohin njëri-tjetrin."
+ aspect_list_is_not_visible: "Kontaktet në këtë aspekt s’janë në gjendje të shohin njëri-tjetrin."
+ aspect_chat_is_enabled: "Kontaktet në këtë aspekt janë në gjendje fjalosen me ju."
+ aspect_chat_is_not_enabled: "Kontaktet në këtë aspekt s’janë në gjendje fjalosen me ju"
+ update: "Përditësoje"
+ updating: "Po përditësohet"
no_posts_message:
- start_talking: "Askush nuk ka thënë gjë ende!"
+ start_talking: "Askush s’ka thënë gjë ende!"
no_contacts_message:
you_should_add_some_more_contacts: "Do të duhej të shtoni ca kontakte!"
- try_adding_some_more_contacts: "Mund të kërkoni ose të ftoni më tepër kontakte."
- or_spotlight: "Ose mund të kërkoni përmes %{link}"
- community_spotlight: "prozhektorit mbi bashkësinë"
+ try_adding_some_more_contacts: "Mund të kërkoni ose të %{invite_link} më tepër kontakte."
+ invite_link_text: "ftoni"
+ or_spotlight: "Ose mund të kërkoni përmes %{link}"
+ community_spotlight: "projektorit mbi bashkësinë"
aspect_listings:
select_all: "Përzgjidhi të tëra"
- deselect_all: "Çpërzgjidhi të tëra"
+ deselect_all: "Shpërzgjidhi të tëra"
edit_aspect: "Përpunoni %{name}"
add_an_aspect: "+ Shtoni një aspekt"
- selected_contacts:
- view_all_community_spotlight: "Shihni krejt ç'ka nën prozhektorin e bashkësisë"
- view_all_contacts: "Shihni krejt kontaktet"
- no_contacts: "Këtu nuk keni ende ndonjë kontakt."
- manage_your_aspects: "Administroni aspektet tuaja."
new:
name: "Emër (i dukshëm vetëm për ju)"
create: "Krijoje"
@@ -198,201 +221,417 @@ sq:
failure: "Krijimi i aspektit dështoi."
destroy:
success: "%{name} u hoq me sukses."
- failure: "%{name} nuk është bosh, ndaj nuk u hoq dot."
+ success_auto_follow_back: "%{name} u hoq me sukses. Këtë aspekt e përdorët për të ndjekur përdorues vetvetiu. Shihni te rregullimet tuaja të përdoruesit se si të përzgjidhni një aspekt të ri vetëndjekjeje."
+ failure: "%{name} s’u hoq dot."
update:
success: "Aspekti juaj %{name} u përpunua me sukses."
- failure: "Aspekti juaj %{name} e kish emrin shumë të gjatë për t'ia ruajtur."
- move_contact:
- failure: "nuk funksionoi %{inspect}"
- success: "Personi u lëviz te aspekt i ri"
- error: "Gabim gjatë lëvizjes së kontaktit: %{inspect}"
+ failure: "Aspekti juaj %{name} e kish emrin shumë të gjatë për t’ia ruajtur."
add_to_aspect:
failure: "Shtimi i kontaktit te aspekti dështoi."
success: "Kontakti u shtua me sukses te aspekti."
- helper:
- remove: "hiqe"
- aspect_not_empty: "Aspekt jo i zbrazët"
- are_you_sure: "Jeni i sigurt se doni të fshihet ky aspekt?"
seed:
family: "Të familjes"
work: "Të punës"
acquaintances: "Të njohur"
- friends: "Miq"
+ friends: "Shokë"
index:
donate: "Dhuroni"
- keep_pod_running: "Mbajeni të shpejtë xhirimin e %{pod}-it dhe u blini shërbyesve kafenë e ditës përmes një dhurimi të përmuajshëm!"
- keep_diaspora_running: "Mbajeni të shpejtë zhvillimin e Diaspora-s përmes një dhurimi të përmuajshëm!"
+ keep_pod_running: "Mbajeni të shpejtë xhirimin e %{pod}-it dhe u blini shërbyesve kafenë e ditës, përmes një dhurimi të përmuajshëm!"
+ keep_diaspora_running: "Ruani shpejtësinë e zhvillimit të diaspora*-s, përmes një dhurimi të përmuajshëm!"
no_tags: "+ Gjeni një etiketë për ndjekje"
unfollow_tag: "Resht së ndjekuri #%{tag}"
- handle_explanation: "Kjo është ID-ja juaj te Diaspora. Pak a shumë si një adresë email, mund t'ua jepni njerëzve që të lidhen me ju."
+ handle_explanation: "Kjo është ID-ja juaj te diaspora*. Pak a shumë si një adresë email, mund t’ua jepni njerëzve që të lidhen me ju."
no_contacts: "Pa kontakte"
- post_a_message: "postoni një mesazh >>"
+ post_a_message: "Postoni një mesazh >>"
people_sharing_with_you: "Persona që ndajnë gjëra me ju"
- welcome_to_diaspora: "Mirë se vini te Diaspora, %{name}!"
- introduce_yourself: "Kjo është rrëkeza juaj. Fillojani duke prezantuar vetveten."
+ welcome_to_diaspora: "Mirë se vini te diaspora*, %{name}!"
+ introduce_yourself: "Kjo është rrjedha juaj. Fillojani duke prezantuar vetveten."
new_here:
- title: "Mirë se vini, Përdorues i Ri"
- follow: "Ndiqni %{link} dhe përshëndetni mirëseardhjen e përdoruesve të rinj te Diaspora*!"
+ title: "Mirë se vini, përdorues i ri"
+ follow: "Ndiqni %{link} dhe përshëndetni mirëseardhjen e përdoruesve të rinj te diaspora*!"
learn_more: "Mësoni më tepër"
help:
- need_help: "Ju Duhet Ndihmë?"
- here_to_help: "Bashkësia Diaspora këtu është!"
- do_you: ":"
- have_a_question: "... keni një %{link}?"
+ need_help: "Ju duhet ndihmë?"
+ here_to_help: "Bashkësia diaspora* këtu është!"
+ do_you: "Mos vallë:"
+ have_a_question: "… keni një %{link}?"
tag_question: "pyetje"
- find_a_bug: "... gjeni një %{link}?"
+ find_a_bug: "… gjetët një %{link}?"
tag_bug: "të metë"
- feature_suggestion: "... keni një këshillë për një %{link}?"
+ feature_suggestion: "… keni një këshillë për një %{link}?"
tag_feature: "veçori të re"
- tutorials_wiki_and_forum: "%{tutorial} & %{wiki} & %{forum}: Përkujdesore, how-to dhe lajme nga bashkësia"
- email_feedback: "Na dërgoni me %{link} përshtypjet tuaja, nëse dëshironi"
- email_link: "Email"
- cubbies:
- heading: "Lidhuni me Cubbi.es"
- explanation: "Cubbi.es është zbatimi i parë Diaspora në zhvillim e sipër."
- learn_more: "Mësoni më tepër"
+ tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: ndihmë për ju në hapat e para."
+ tutorial_link_text: "Përkujdesore"
+ email_feedback: "Na dërgoni %{link} përshtypjet tuaja, nëse doni"
+ email_link: "email"
+ any_problem: "Keni një problem?"
+ contact_podmin: "Lidhuni me përgjegjësin e nyjës tuaj!"
+ mail_podmin: "Email përgjegjësi"
diaspora_id:
- heading: "ID Diaspora"
- content_1: "ID-ja juaj në Diaspora është:"
- content_2: "Jepjani kujtdo dhe kështu do të jenë në gjendje t'ju gjejnë në Diaspora."
+ heading: "ID diaspora*"
+ content_1: "ID-ja juaj në diaspora* është:"
+ content_2: "Jepjani kujtdo dhe kështu do të jenë në gjendje t’ju gjejnë në diaspora*."
services:
- heading: "Shërbime Lidhjesh"
- content: "Te Diaspora mund të lidheni me shërbimet vijuese:"
+ heading: "Shërbime lidhjesh"
+ content: "Te diaspora* mund të lidheni me shërbimet vijuese:"
aspect_stream:
- stay_updated: "Jini Përherë i Përditësuar"
- stay_updated_explanation: "Rrëkeza juaj kryesore mbushet me krejt kontaktet tuaj, etiketat që ndiqni, dhe postime prej disa anëtarëve me krijimtari të bashkësisë."
- make_something: "Bëni diçka"
+ stay_updated: "Jini përherë i përditësuar"
+ stay_updated_explanation: "Rrjedha juaj kryesore mbushet me krejt kontaktet tuaj, etiketat që ndiqni, dhe postime prej disa anëtarëve me krijimtari të bashkësisë."
+ make_something: "Krijoni diçka"
aspect_memberships:
destroy:
- success: "Personi u hoq me sukses nga aspekti"
- failure: "Heqja e personit nga aspekti dështoi"
- no_membership: "Në atë aspekt nuk u gjet dot personi i përzgjedhur"
+ success: "Personi u hoq me sukses nga aspekti."
+ failure: "Heqja e personit nga aspekti dështoi."
+ no_membership: "Në atë aspekt s’u gjet dot personi i përzgjedhur."
bookmarklet:
- heading: "Zbatimth Faqerojtës"
+ heading: "Aplikacionth Faqerojtës"
post_success: "U postua! Po mbyllet!"
- post_something: "Postoni te Diaspora"
- explanation: "Postoni te Diaspora prej kudo qofshi, duke faqeruajtur këtë lidhje => %{link}."
+ post_something: "Postoni diçka te diaspora*"
+ explanation: "Postoni te diaspora* prej kudo qofshi, duke faqeruajtur %{link}."
comments:
- zero: "pa komente"
+ zero: "Pa komente"
one: "1 koment"
- two: "%{count} komente"
- few: "%{count} komente"
- many: "%{count} komente"
other: "%{count} komente"
new_comment:
comment: "Koment"
- commenting: "Po komentohet..."
+ commenting: "Po komentohet…"
reactions:
- zero: "0 kundërpërgjigje"
- one: "1 kundërpërgjigje"
- other: "%{count} kundërpërgjigje"
+ zero: "Pa reagime"
+ one: "1 reagim"
+ other: "%{count} reagime"
contacts:
zero: "kontakte"
one: "1 kontakt"
- two: "%{count} kontakte"
- few: "%{count} kontakte"
- many: "%{count} kontakte"
other: "%{count} kontakte"
create:
failure: "Dështoi në krijimin e kontaktit"
sharing:
people_sharing: "Persona që ndajnë gjëra me ju:"
index:
- add_to_aspect: "shtoni kontakte te %{name}"
- start_a_conversation: "Filloni një bashkëbisedim"
+ add_to_aspect: "Shtoni kontakte te %{name}"
+ start_a_conversation: "Filloni një bisedë"
add_a_new_aspect: "Shtoni një aspekt të ri"
title: "Kontakte"
- your_contacts: "Kontaktet Tuaja"
+ your_contacts: "Kontaktet tuaja"
no_contacts: "Duket se keni nevojë të shtoni ndonjë kontakt!"
no_contacts_message: "Kontrolloni te %{community_spotlight}"
- no_contacts_message_with_aspect: "Kontrolloni te %{community_spotlight} ose %{add_to_aspect_link}"
- add_to_aspect_link: "shtoni kontakte te %{name}"
- community_spotlight: "Prozhektori Mbi Bashkësinë"
- my_contacts: "Kontaktet e Mia"
- all_contacts: "Krejt Kontaktet"
- only_sharing_with_me: "Vetëm ata që ndajnë gjëra me mua"
- remove_person_from_aspect: "Hiqe %{person_name} prej \"%{aspect_name}\""
- many_people_are_you_sure: "Jeni i sigurt se doni të nisni një bashkëbisedim privatme më tepër se %{suggested_limit} kontakte? Postimi te ky aspekt mund të jetë një mënyrë më e mirë për t'u lidhur me ta."
+ community_spotlight: "Projektori mbi bashkësinë"
+ no_contacts_in_aspect: "Në këtë aspekt s’keni ende ndonjë kontakt. Më poshtë keni një listë të kontakteve ekzistuese që mund të shtoni në këtë aspekt."
+ my_contacts: "Kontaktet e mia"
+ all_contacts: "Krejt kontaktet"
+ only_sharing_with_me: "Që vetëm ndajnë me mua"
+ add_contact: "Shtoje kontaktin"
+ remove_contact: "Hiqe kontaktin"
+ user_search: "Kërkim kontaktesh"
spotlight:
- community_spotlight: "Prozhektori i Bashkësisë"
+ community_spotlight: "Projektori mbi bashkësinë"
+ suggest_member: "Sugjeroni një anëtar"
conversations:
index:
- message_inbox: "Mesazhet e Marra"
- new_message: "Mesazh i Ri"
- no_conversation_selected: "nuk u përzgjodh bashkëbisedim"
- create_a_new_message: "krijoni një mesazh të ri"
- no_messages: "pa mesazhe"
- inbox: "Të marrat"
+ conversations_inbox: "Biseda – Të marra"
+ new_conversation: "Bisedë e re"
+ no_conversation_selected: "S’u përzgjodhën biseda"
+ create_a_new_conversation: "Filloni një bisedë të re"
+ no_messages: "Pa mesazhe"
+ inbox: "Të marra"
+ conversation:
+ participants: "Pjesëmarrës"
show:
- reply: "përgjigjuni"
- replying: "Po përgjigjeni..."
- delete: "fshije dhe bllokoje bashkëbisedimin"
+ reply: "Përgjigjuni"
+ replying: "Po përgjigjeni…"
+ hide: "Fshije dhe bllokoje bisedën"
+ delete: "Fshije bisedën"
+ last_message: "Mesazhi i fundit i marrë %{timeago}"
new:
- to: "për"
- subject: "subjekt"
+ to: "Për"
+ subject: "Subjekt"
+ subject_default: "Pa subjekt"
+ message: "Mesazh"
send: "Dërgoje"
- sending: "Po dërgohet..."
+ sending: "Po dërgohet…"
abandon_changes: "Të braktisen ndryshimet?"
helper:
new_messages:
- zero: "Nuk ka mesazhe të reja"
+ zero: "S’ka mesazhe të reja"
one: "1 mesazh i ri"
other: "%{count} mesazhe të reja"
create:
sent: "Mesazhi u dërgua"
fail: "Mesazh i mangët"
- new_message:
+ no_contact: "Ej, së pari lypset ta shtoni kontaktin!"
+ new_conversation:
fail: "Mesazh i mangët"
destroy:
- success: "Bashkëbisedimi u hoq me sukses"
-
+ delete_success: "Biseda u fshi me sukses"
+ hide_success: "Biseda u fsheh me sukses"
date:
formats:
fullmonth_day: "%d %B"
birthday: "%d %B"
birthday_with_year: "%d %B %Y"
+ help:
+ title_header: "Ndihmë"
+ tutorials: "përkujdesore"
+ tutorial: "përkujdesore"
+ irc: "IRC"
+ wiki: "wiki"
+ faq: "FAQ"
+ markdown: "Markdown"
+ here: "këtu"
+ foundation_website: "sajti i diaspora* foundation"
+ third_party_tools: "Mjete palësh të treta"
+ getting_started_tutorial: "Seria e përkujdesoreve ”Si t’ia fillohet”"
+ getting_help:
+ title: "Si të merret ndihmë"
+ getting_started_q: "Ndihmë! Më duhet ca ndihmë e thjeshtë, sa për t’ia filluar!"
+ getting_started_a: "Jeni me fat. Provoni %{tutorial_series} te sajti ynë mbi projektin. Do t’ju kalojë hap pas hapi përmes procesit të regjistrimit dhe do t’ju mësojë krejt gjërat themelore që keni nevojë të dini mbi përdorimin e diaspora*."
+ get_support_q: "Po kur pyetja ime s’ka përgjigje te ky FAQ? Ku mund të marr gjetiu tjetër asistencë?"
+ get_support_a_website: "Vizitoni %{link} tonë"
+ get_support_a_tutorials: "Hidhni një sy te %{tutorials} tona"
+ get_support_a_wiki: "Kërkoni te %{link}"
+ get_support_a_irc: "Ejani te ne në %{irc} (fjalosje e atypëratyshme)"
+ get_support_a_faq: "Lexoni faqen tonë %{faq} në wiki"
+ get_support_a_hashtag: "Pyetni në një postim publik te diaspora* duke përdorur hashtagun %{question}"
+ account_and_data_management:
+ title: "Administrim llogarie dhe të dhënash"
+ move_pods_q: "Si ta kaloj llogarinë time nga një nyjë në një tjetër?"
+ move_pods_a: "Në të ardhmen do të jeni në gjendje të eksportoni llogarinë tuaj nga një nyje dhe ta importoni në një tjetër, por kjo hëpërhë s’është e mundur. Mundeni përherë të hapni një llogari të re dhe të shtoni kontaktet tuaj te aspekte në atë nyje të re, dhe t’u kërkoni atyre të shtojnë llogarinë tuaj në aspektet e tyre."
+ download_data_q: "A mund të shkarkoj një kopje të krejt të dhënave të mia që përmbahen në llogarinë time?"
+ download_data_a: "Po. Në fund të skedës Llogari te faqja e rregullimeve tuaja do të gjeni dy butona: një për shkarkimin e të dhënave tuaja, dhe një për shkarkimin e fotove tuaja."
+ close_account_q: "Si ta fshij llogarinë time?"
+ close_account_a: "Shkoni në fund të faqes së rregullimeve tuaja dhe klikoni mbi butonin “Mbylle llogarinë”. Do t’ju kërkohet të jepni fjalëkalimin tuaj që të plotësohet procesi. Mos harroni, nëse mbyllni llogarinë tuaj, nuk do të jeni <strong>kurrë</strong> më në gjendje të riregjistroni në po atë nyje emrin tuaj të përdoruesit."
+ data_visible_to_podmin_q: "Sa nga të dhënat e mia mund të shohë përgjegjësi i nyjës sime?"
+ data_visible_to_podmin_a: "Shkurt: gjithçka. Ndërlidhja mes nyjave është gjithmonë e fshehtëzuar (përmes SSL-së dhe mekanizmit të fshehtëzimit të transporteve të vetë diaspora*-s), por depoja e të dhënave në nyje s’është e fshehtëzuar. Nëse do të donte, përgjegjësi i bazës së të dhënave për nyjën tuaj (zakonisht personi që mban në punë nyjën) mund të hyjë në krejt të dhënat e profilit tuaj dhe në gjithçka që postoni (ashtu siç ndodh në shumicën e sajteve që depozitojnë të dhëna përdoruesi). Kjo është arsyeja pse ju japim mundësinë e zgjedhje se me cilën nyje të regjistroheni, që të mund të zgjidhni një nyje përgjegjësit të së cilës pranoni t’i besoni të dhënat tuaja. Xhirimi nga vetë ju i nyjës suaj ofron më tepër privatësi, ngaqë atëherë keni kontrollin e hyrjeve në bazën e të dhënave."
+ data_other_podmins_q: "A munden përgjegjësit e nyjave të tjera të shohin të dhëna të miat?"
+ data_other_podmins_a: "Nga çasti që ndani gjëra me dikë në një nyje tjetër, çfarëdo postimesh që ndani me ta dhe një kopje e të dhënave tuaja të profilit depozitohen (në fshehtinën e) te nyja e tyre, dhe janë të përdorshme nga përgjegjësi i bazës së të dhënave të nyjës. Kur fshini një postim apo kur fshihen të dhëna profili, ato fshihen te nyja juaj dhe një kërkesë fshirjeje dërgohet për secilin prej nyjave të tjera ku qenë depozituar më parë. Figurat tuaja nuk depozitohen kurrë në ndonjë nyje, hiq atë tuajën; nyjave të tjera u transmetohen vetëm lidhje për te to."
+ aspects:
+ title: "Aspekte"
+ what_is_an_aspect_q: "Ç’është një aspekt?"
+ what_is_an_aspect_a: "Aspektet janë mënyra se si i gruponi kontaktet tuaja në diaspora*. Një aspekt përfaqëson një nga fytyrat që i tregoni botës. Ky mund të jetë çka jeni në punë, ose cili jeni për familjen tuaj, ose cili jeni për shokët e një klubi në të cilin bëni pjesë."
+ who_sees_post_q: "Kur postoj diçka në një aspekt, kush e sheh?"
+ who_sees_post_a: "Nëse bëni një postim të kufizuar, do të jetë i dukshëm vetëm për persona që keni vendosur në atë aspekt (ose aspekte, nëse është bërë në disa aspekte) përpara dërgimit të postimit. Kontaktet që nuk janë pjesë e aspektit, nuk kanë asnjë mundësi ta shohin postimin. Postimet e kufizuara nuk do të jenë kurrë të dukshme për cilindo që s’e keni vendosur në aspektin përkatës."
+ contacts_know_aspect_q: "A e dinë kontaktet e mia se në cilat aspekte i kam vendosur?"
+ contacts_know_aspect_a: "Jo. Nuk munden të shohin emrin e aspektit me asnjë mënyrë."
+ person_multiple_aspects_q: "A mund ta shtoj një person në disa aspekte?"
+ person_multiple_aspects_a: "Po. Shkoni te faqja e kontakteve tuaj dhe klikoni mbi “Kontaktet e mia”. Për secilin kontakt mund të përdorni menunë djathtas për t’i shtuar te (ose për t’i hequr nga) sa aspekte të doni. Ose mund t’i shtoni te një aspekt i ri (ose t’i hiqni prej një aspekti) duke klikuar butonin e përzgjedhësit të aspekteve në faqen e tyre të profilit. Ose mund të kaloni kursorin sipër emrit të njërit, kur e shihni në rrjedhë, dhe do të shfaqet një dritare e vockël. Mund t’i ndryshoni aspektet e secilit drejt e aty."
+ contacts_visible_q: "Ç’do të thotë “bëji kontaktet në këtë aspekt të dukshëm për njëri-tjetrin”?"
+ contacts_visible_a: "Nëse i vini shenjë kësaj mundësie, kontaktet e atij aspekti do të jenë në gjendje të shohin se cili tjetër bën pjesë në të, te skeda “Kontakte” ose te faqja e profilit tuaj. Është mirë që kjo mundësi të përzgjidhet vetëm nëse kontaktet në atë aspekt e njohin të gjithë njëri-tjetrin, për shembull, nëse aspekti është për një klub ose një shoqëri në të cilën bëni pjesë. Prapëseprapë, ata s’do të jenë në gjendje të shohin se si quhet aspekti."
+ remove_notification_q: "Nëse heq dikë nga një aspekt, ose nga krejt aspektet e mia, a njoftohen rreth kësaj?"
+ remove_notification_a: "Jo. Dhe as njoftohen kur i shtoni në më tepër aspekte, nëse ndani tashmë gjëra me ta."
+ change_aspect_of_post_q: "Pasi të kem postuar diçka, a mund të ndryshoj aspektin(et) që të mund ta shohin?"
+ change_aspect_of_post_a: "Jo, por mundeni gjithmonë të krijoni një postim të ri me të njëjtën lëndë dhe ta postoni në një aspekt tjetër."
+ post_multiple_aspects_q: "A mund të postoj lëndë në disa aspekte njëherësh?"
+ post_multiple_aspects_a: "Po. Kur krijoni një postim, përdorni butonin e përzgjedhësit të aspekteve që të përzgjidhni ose shpërzgjidhni aspekte. Rregullimi parazgjedhje është “Krejt aspektet”. Postimi juaj do të jetë i dukshëm në krejt aspektet që përzgjidhni. Aspektet në të cilët doni ta postoni, mund t’i përzgjidhni edhe te anështylla. Kur postoni, aspekti(et) që keni përzgjedhur te lista majtas, do të përzgjidhen vetvetiu te përzgjedhësi i aspekteve, kur filloni të krijoni një postim të ri."
+ restrict_posts_i_see_q: "A mund t’i kufizoj postimet në rrjedhën time për vetëm disa, ato nga disa aspekte?"
+ restrict_posts_i_see_a: "Po. Klikoni “Aspektet e mia” te anështylla dhe mandej klikoni te lista aspekte individuale që t’i përzgjidhni ose shpërzgjidhni. Në rrjedhën tuaj do të shfaqen vetëm postime nga persona prej aspekteve të përzgjedhura."
+ rename_aspect_q: "Si ta riemërtoj një aspekt?"
+ rename_aspect_a: "Klikoni “Aspektet e mia” te anështylla, që prej skenës së rrjedhës, dhe klikoni ikonën laps në krah të aspektit që doni të riemërtoni, ose shkoni te faqja e Kontakteve tuaj dhe përzgjidhni aspektin që doni. Mandej klikoni ikonën e përpunimit në krah të emrit të aspektit, në krye të kësaj faqeje, ndryshoni emrin dhe shtypni “Përditësoje”."
+ delete_aspect_q: "Si ta fshij një aspekt?"
+ delete_aspect_a: "Klikoni “Aspektet e mia” te anështylla, që prej skenës së rrjedhës, dhe klikoni ikonën laps në krah të aspektit që doni të fshini, ose shkoni te faqja e Kontakteve tuaj dhe përzgjidhni aspektin që doni. Mandej klikoni ikonën e hedhurinave në cepin e sipërm djathtas të faqes."
+ chat:
+ title: "Fjalosje"
+ contacts_page: "faqe kontaktesh"
+ add_contact_roster_q: "Si të fjalosem me dikë në diaspora*?"
+ add_contact_roster_a: "Së pari, duhet të aktivizoni fjalosjet për një nga aspektet ku gjendet ai person. Për ta bërë këtë, shkoni te %{contacts_page}, përzgjidhni aspektin që doni dhe klikoni mbi ikonën e fjalosjeve që të aktivizoni fjalosjet për atë aspekt. %{toggle_privilege} Nëse parapëlqeni, mund të krijoni një aspekt special të quajtur “Fjalosje” dhe të shtoni në atë aspekt persona me të cilët doni të fjaloseni. Pasi ta keni bërë këtë, hapni ndërfaqen e fjalosjes dhe përzgjidhni personin me të cilin doni të fjaloseni."
+ mentions:
+ title: "Përmendje"
+ what_is_a_mention_q: "Ç’është një “përmendje”?"
+ what_is_a_mention_a: "Një përmendje është një lidhje për te faqja e profilit të një personi që shfaqet në një postim. Kur dikush përmendet, ai merr një njoftim që u tërheq vëmendjen te postimi."
+ how_to_mention_q: "Si ta përmend dikë teksa krijoj një postim?"
+ how_to_mention_a: "Shtypni shenjë “@” dhe filloni të shtypni emrin e tij. Do të hapet një menu hapmbyll që t’ju lejojë ta përzgjidhni më lehtë. Kini parasysh se mundet të përmenden vetëm persona që i keni të shtuar në një aspekt."
+ mention_in_comment_q: "A mund ta përmend, sipas kësaj formule, dikë në një koment?"
+ mention_in_comment_a: "Jo, hëpërhë jo."
+ see_mentions_q: "A ka ndonjë mënyrë të shoh postime në të cilat jam përmendur?"
+ see_mentions_a: "Po, klikoni “@Përmendje” në shtyllën në të majtë të faqes tuaj hyrëse."
+ pods:
+ title: "Nyje"
+ what_is_a_pod_q: "Ç’është një nyjë?"
+ what_is_a_pod_a: "Një nyjë është një shërbyes që xhiron software-in diaspora* dhe është i lidhur me rrjetin diaspora*. “Nyjë” është një metaforë që i referohet bishtajës te disa bimë bishtajore, të cilat përmbajnë fara, në atë mënyrë që një shërbyes përmban një numër llogarish përdoruesi. Ka mjaft nyje të ndryshme. Mund të shtoni shokë prej nyjash të tjera dhe të komunikoni me ta. S’ka nevojë të hapni nga një llogari në nyje të ndryshme! Mjafton një – në këtë mënyrë, diaspora*-n mund ta mendoni të ngjashme me një mundësues llogarish email. Ka nyje publike, nyje private, dhe me pak përpjekje mund të xhironi një tuajën."
+ find_people_q: "Sapo u regjistrova në një nyje, si mund të gjej persona me të cilët të ndaj gjëra?"
+ find_people_a: "Nëse doni të ftoni miqtë tuaj të përdorin diaspora*-n, përdorni lidhjen e ftesës ose lidhjen për email, te anështylla. Ndiqni #etiketa që të zbuloni persona të tjerë që kanë interesa të përbashkëta me tuajat, dhe shtoni ata që postojnë në një aspekt gjëra që kanë interes për ju. Në një postim publik thërrisni fort se jeni #irikëtu."
+ use_search_box_q: "Si ta përdor kutinë e kërkimeve për të gjetur individë të veçantë?"
+ use_search_box_a: "Nëse e dini ID-në e plotë të tyre në diaspora* (p.sh. emërpërdoruesi@emërnyjeje.org), mund t’i gjeni duke kërkuar për ta. Nëse gjendeni në të njëjtën nyje, mund të kërkoni thjesht për emrin e tyre të përdoruesit. Si rrugë tjetër, mund të kërkoni për ta sipas emrash profili (emri që shihni në ekran). Nëse kërkimi s’funksionon herën e parë, provoni sërish."
+ posts_and_posting:
+ title: "Postime dhe postimi"
+ stream_full_of_posts_q: "Pse është rrjedha ime plot me postime prej personash që s’i njoh dhe me të cilët nuk ndaj gjëra?"
+ stream_full_of_posts_a1: "Rrjedha juaj popullohet me tre lloje postimesh:"
+ stream_full_of_posts_li1: "Postime nga persona me të cilët ndani gjëra, që janë dy llojesh: postime publike dhe postime të kufizuara të ndara me ju në një aspekt pjesë e të cilit jeni. Që t’i hiqni këto postime prej rrjedhës suaj, thjesht reshtni së ndari gjëra me atë person."
+ stream_full_of_posts_li2: "Postime publike që përmbajnë një prej etiketave që ndiqni. Që të hiqni këto, reshtni së ndjekuri atë etiketë."
+ stream_full_of_posts_li3: "Postime publike nga persona pjesë e projektorit të bashkësisë. Këto mund të hiqen duke i hequr shenjën mundësisë “Të shfaqet në rrjedhë projektori i bashkësisë?”, te skeda Llogari e Rregullimeve tuaja."
+ hide_posts_q: "Si ta fsheh një postim?"
+ hide_posts_a: "Nëse e vendosni kursorin në krye të një postimi, në të djathtë do të shfaqet një X. Klikoni mbi që të fshihet postimi dhe të ndalen njoftimet mbi të. Mund ta shihni prapë postimin, nëse vizitoni faqen e profilit të personit që e postoi."
+ post_notification_q: "Si të marr njoftime, ose të resht së marri njoftime rreth një postimit?"
+ post_notification_a: "Në krah të X-it, në cepin e djathtë sipër të një postimi, do të gjeni një zilkë. Klikoni mbi që të aktivizoni ose çaktivizoni njoftimet mbi atë postim."
+ post_report_q: "Si të njoftoj për një postim fyes?"
+ post_report_a: "Klikoni ikonën trekëndëshe të sinjalizimeve, në cepin e djathtë sipër të postimit që doni t’i njoftohet përgjegjësit të nyjës suaj. Te kutia e dialogut jepni një arsye për sinjalizimin e këtij postimi."
+ character_limit_q: "Sa është kufiri për shenjat në një postim?"
+ character_limit_a: "65535 shenja. Që do të thotë 65395 më shumë se sa ju jepen në Twitter! ;)"
+ char_limit_services_q: "Po kur ndaj postim me një shërbim të lidhur te diaspora*, i cili ka kufi më të ulët për shenjat?"
+ char_limit_services_a: "Në këtë rast do të duhej ta kufizonit postimin tuaj aq sa është kufiri më i ulët (140 në rastin e Twitter-it; 1000 në rastin e Tumblr-it), dhe numri i shenjave të mbetura për përdorim ju shfaqet në ikonën e shërbimit, kur kjo është e theksuar. Mund të postoni prapëseprapë në këto shërbime, edhe kur postimi juaj është më i gjatë se sa kufijtë e tyre, por teksti në këto shërbime do të shfaqet i cunguar dhe me një lidhje për te postimi në diaspora*."
+ format_text_q: "Si ta formatoj tekstin në postimet e mia (shkronja të trasha, italike, etj.)?"
+ format_text_a: "Duke përdorur një sistem të thjeshtëzuar, të quajtur %{markdown}. Sintaksën e plotë të Markdown-it mund ta gjeni %{here}. Butoni i paraparjeve është vërtet i dobishëm këtu, sepse mund të shihni si do të duket mesazhi juaj, përpara se ta ndani me të tjerët."
+ insert_images_q: "Si të fus figura në postime?"
+ insert_images_a: "Klikoni ikonën e vogël kamera që të futni një figurë në një postim. Shtypni sërish ikonën kamera që të shtoni një tjetër foto, ose mund të përzgjidhni disa foto njëherësh që t’i ngarkoni në një dorë."
+ insert_images_comments_q: "A mund të fus figura në komente?"
+ insert_images_comments_a1: "S’mund të futni figura në komente, por kodi Markdown vijues"
+ image_text: "image text"
+ image_url: "image url"
+ insert_images_comments_a2: "mund të përdoret për të futur figura nga Interneti, në komente dhe postime."
+ size_of_images_q: "A mund ta përshtat madhësinë e figurave në postime apo komente?"
+ size_of_images_a: "Jo. Figurat ripërmasohen vetvetiu që t’i nxërë rrjedha pse pamja njëpostimëshe. Markdown s’ka kod për përcaktim të madhësisë së një figure."
+ embed_multimedia_q: "Si të trupëzoj video, audio, ose tjetër lëndë multimedia në një postim?"
+ embed_multimedia_a: "Zakonisht thjesht mund të hidhni URL-në (p.sh. http://www.youtube.com/watch?v=nnnnnnnnnnn ) te postimi juaj dhe videoja apo audioja do të trupëzohet vetvetiu. Në sajtet e mbuluar përfshihen: YouTube, Vimeo, SoundCloud, Flickr dhe ndoca të tjerë. diaspora* përdor oEmbed për këtë veçori. Dora-dora mbulojmë gjithnjë e më shumë burime media. Mbani mend të postoni përherë lidhje të thjeshta, të plota – jo lidhje të shkurtuara; pa operatorë pas URL-së bazë – dhe lërini pakëz kohë përpara se të rifreskoni faqen pas postimit, për të parë si duket."
+ post_location_q: "Si t’i shtoj një postimi vendndodhjen time?"
+ post_location_a: "Brenda skenës së botimi, klikoni ikonën thumb në krah të kamerës. Kjo do të shkaktojë futjen e vendndodhjes suaj me ndihmën e OpenStreetMap-it. Vendndodhjen tuaj mund ta përpunoni – mirë është të vendosni vetëm qytetin ku gjendni, se sa edhe adresën e saktë (rrugë, numër, etj)."
+ post_poll_q: "Si të shtoj një votim te postimi im?"
+ post_poll_a: "Klikoni mbi ikonën e grafikut që të prodhohet një votim. Shtypni një pyetje dhe të paktën dy përgjigje. Mos harroni ta bëni postimin tuaj publik, nëse doni që gjithkush të jetë në gjendje të marrë pjesë te votimi juaj."
+ private_posts:
+ title: "Postime private"
+ who_sees_post_q: "Kur postoj një mesazh në një aspekt (p.sh., një postim privat), kush mundet ta shohë?"
+ who_sees_post_a: "Mund ta shohin vetëm përdorues të diaspora*-s që kanë bërë hyrjen në të dhe që i keni vendosur në atë aspekt, para se të bënit postimin privat."
+ can_comment_q: "Kush mund të komentojë dhe të pëlqejë postimin tim privat?"
+ can_comment_a: "Mund të komentojnë ose ta pëlqejnë vetëm përdorues të diaspora*-s që i keni vendosur në atë aspekt përpara se të bënit postimin privat."
+ can_reshare_q: "Kush mund ta rindajë me të tjerët postimin tim privat?"
+ can_reshare_a: "Askush. Postimet private nuk mund të rindahen.Megjithatë, përdorues diaspora* që kanë bërë hyrjen, mund ta kopjojnë dhe hedhin gjetiu. U besoni apo jo këtyre personave… atë e dini ju!"
+ see_comment_q: "Kur komentoj një një postim privat, ose pëlqej një të tillë, kush mund ta shohë?"
+ see_comment_a: "Vetëm personat me të cilët qe ndarë ai postim (personat që gjenden në aspektet e përzgjedhura nga postuesi origjinal) mund të shohin komentet dhe pëlqimet për të. "
+ private_profiles:
+ title: "Profile private"
+ who_sees_profile_q: "Kush e sheh profilin tim privat?"
+ who_sees_profile_a: "Cilido përdorues që ka bërë hyrjen në llogarinë e vet dhe me të cilin ju ndani gjëra (që do të thotë, i keni shtuar në një prej aspekteve tuaj). Sidoqoftë, personat që ju ndjekin ju, por të cilët ju vetë nuk i ndiqni, do të shohin vetëm të dhënat tuaja publike."
+ whats_in_profile_q: "Ç’përmban profili im privat?"
+ whats_in_profile_a: "Profili juaj privat përmban jetëshkrimin tuaj, vendndodhjen, gjininë, dhe datëlindjen, nëse këto ndarje i keni plotësuar. Krejt këto të dhëna janë opsionale – e vendosni ju t’i jepni apo jo. Përdoruesit e futur, të cilët i keni shtuar në aspektet tuaja, janë të vetmit persona që mund të shohin profilin tuaj privat. Kur këta vizitojnë faqen e profilit tuaj do të shohin edhe postimet private të bëra në aspekte pjesë e të cilëve janë, përzierë me postimet tuaja publike."
+ who_sees_updates_q: "Kush sheh përditësime të profilit tim privat?"
+ who_sees_updates_a: "Cilido në aspektet tuaja mund të shohë ndryshime në profilin tuaj privat. "
+ public_posts:
+ title: "Postime publike"
+ who_sees_post_q: "Kur postoj diçka publikisht, kush mund ta shohë?"
+ who_sees_post_a: "Teorikisht cilido që përdor internetin mund të shohë një postim të cilin e shënoni si publikisht, ndaj sigurohuni se doni vërtet që postimi juaj të jetë publik. Është një mënyrë e goditur për të mbërritur tek bota."
+ find_public_post_q: "Si mund t’i gjejnë postimet e mia persona të tjerë?"
+ find_public_post_a: "Postimet tuaja publike do të shfaqen në rrjedhat e cilitdo që ju ndjek. Nëse përfshitë #etiketa në postimin tuaj publik, cilido që i ndjek këto etiketa do ta gjejë postimin tuaj në rrjedhën e tij. Çdo postim publik përmban gjithashtu një URL të veçantë që mund ta shohë gjithkush, madje edhe pse nuk kanë bërë hyrjen – kështu që postimet publike mund të lidhen drejt e nga Twitter, blogje, etj. Postimet publike mund edhe të indeksohen nga motorë kërkimesh."
+ can_comment_reshare_like_q: "Kush mund të komentojë, rindajë dhe pëlqejë postimin tim publik?"
+ can_comment_reshare_like_a: "Cilido përdorues i futur i diaspora*-s mund ta komentojë, rindajë, ose pëlqejë postimin tuaj publik."
+ see_comment_reshare_like_q: "Kur komentoj, rindaj diçka, ose pëlqej një postim publik, kush mund ta shohë?"
+ see_comment_reshare_like_a: "Komentet, pëlqimet, dhe rindarjet e postimeve e publike janë po ashtu publike. Cilido përdorues i diaspora*-s që ka bërë hyrjen, dhe cilido tjetër në internet mund të shohë ndërveprimet tuaj me një postim publik."
+ deselect_aspect_posting_q: "Çfarë ndodh kur shpërzgjedh një ose më tepër aspekte, teksa bëj një postim publik?"
+ deselect_aspect_posting_a: "Shpërzgjedhja e aspekteve nuk e prek një postim publik. Do të jetë sërish publik dhe do të shfaqet në rrjedhën e krejt kontakteve tuaja. Për ta bërë një postim të dukshëm vetëm për aspekte të caktuara, lypset që këto aspekte t’i përzgjidhni që prej përzgjedhësit të aspekteve, nën botuesin."
+ public_profiles:
+ title: "Profile publikë"
+ who_sees_profile_q: "Kush e sheh profilin tim publik?"
+ who_sees_profile_a: "Mund ta shohë cilido përdorues diaspora* i futur, si dhe Interneti përgjithësisht. Çdo profil ka një URL të drejtpërdrejtë, ndaj mund të lidhet drejtpërdrejt nga sajte të jashtëm. Dhe mund të indeksohet nga motorë kërkimesh."
+ whats_in_profile_q: "Ç’përmban profili im publik?"
+ whats_in_profile_a: "Profili juaj publik përmban emrin tuaj, pesë etiketa që i zgjidhni ju për të përshkruar veten, dhe foton tuaj, nëse i keni plotësuar këto fusha. Krejt këto të dhëna janë në dëshirën tuaj – vendosni ju t’i jepni apo jo. Këto të dhëna mund t’i lejoni të jenë të identifikueshme ose anonime, sipas dëshirës. Faqja juaj e profilit shfaq gjithashtu çfarëdo postimesh publike që keni bërë."
+ who_sees_updates_q: "Kush i sheh përditësimet te profili im publik?"
+ who_sees_updates_a: "Mund t’i shohë cilido që viziton faqen tuaj të profilit."
+ what_do_tags_do_q: "Ç’rol luajnë etiketat në profilin tim publik?"
+ what_do_tags_do_a: "Ato ndihmojnë njerëzit t’ju njohin. Fotoja juaj e profilit do të shfaqet në anën e majtë të atyre faqeve të veçanta të etiketave, tok me të kujtdo tjetër që i ka etiketat te profili i vet publik."
+ resharing_posts:
+ title: "Rindarje postimesh"
+ reshare_public_post_aspects_q: "A mund ta rindaj me të tjerët një postim publik në aspekte që përzgjedh?"
+ reshare_public_post_aspects_a: "Jo, kur rindani një postim publik, bëhet vetvetiu një nga postimet tuaja publike. Që ta ndani në disa prej aspekteve, kopjoni dhe ngjiteni lëndën e postimit në një postim të ri, të kufizuar për aspektet që doni."
+ reshare_private_post_aspects_q: "A mund ta rindaj me të tjerët një postim privat në aspekte që përzgjedh?"
+ reshare_private_post_aspects_a: "Jo, s’është e mundur të rindahen postimet private. Kjo bëhet për të respektuar dëshirën e postuesit origjinal, që e ndau atë vetëm me një grup të veçantë personash."
+ sharing:
+ title: "Ndarje me të tjerët"
+ add_to_aspect_q: "Ç’ndodh kur shtoj dikë në një nga aspektet e mia, ose kur dikush më shton në një nga aspektet e veta?"
+ add_to_aspect_a1: "Le të themi se Mira e shton Benin në një aspekt, por Beni nuk e ka shtuar (ende) Mirën në një aspekt:"
+ add_to_aspect_li1: "Beni do të marrë një njoftim se Mira ka “filluar të ndajë gjëra” me Benin."
+ add_to_aspect_li2: "Mira do të fillojë të shohë në rrjedhën e saj postimet publike të Benit."
+ add_to_aspect_li3: "Mira s’do të shohë ndonjë prej postimeve private të Benit."
+ add_to_aspect_li4: "Beni s’do të shohë në rrjedhën e tij ndonjë postim publik apo privat të Mirës."
+ add_to_aspect_li5: "Por nëse Beni shkon te faqja e profilit të Mirës, do të jetë në gjendje të shohë postimet private që bën Mira te aspekti në të cilin ka vendosur Benin (si edhe postimet publike të saj, të cilat atje mund t’i shohë kushdo)."
+ add_to_aspect_li6: "Beni do të jetë në gjendje të shoh profilin privat të Mirës (jetëshkrimin, vendin, gjininë, datëlindjen)."
+ add_to_aspect_li7: "Te faqja e kontakteve të Benit, Mira do të shfaqet nën “Vetëm ndajnë me mua”."
+ add_to_aspect_li8: "Mira do të jetë në gjendje ta @përmendë Benin në një postim."
+ add_to_aspect_a2: "Ky proces njihet si ndarje asimetrike. Vetëm nëse edhe Beni e shton Mirën në ndonjë aspekt, atëherë do të shndërrohet në ndarje të dyanshme, me shfaqjen në rrjedhat e secilit të postimeve publike të Mirës dhe të Benit, si dhe të postimeve private me rëndësi, dhe Mira do të jetë në gjendje të shohë profilin privat të Benit. Pas kësaj ata do të jenë në gjendje t’i dërgojnë njëri-tjetrit mesazhe private."
+ sharing_notification_q: "Si ta marr vesh që dikush fillon të ndajë me mua?"
+ sharing_notification_a: "Do të duhej të merrnit një njoftim, sa herë që dikush zë e ndan gjëra me ju."
+ only_sharing_q: "Cilët janë personat te pjesa “Që vetëm ndajnë me mua” e faqes sime të kontakteve?"
+ only_sharing_a: "Këta janë persona që ju kanë shtuar në një prej aspekteve të tyre, por që (ende) s’gjenden në ndonjë nga aspektet tuaj. Me fjalë të tjera, ata ndajnë gjëra me ju, por ju nuk ndani gjë me ta: mund t’i mendoni si persona që ju “ndjekin”. Nëse i shtoni në një aspekt, ata do të shfaqen në atë aspekt dhe jo më nën “Që ndajnë vetëm me mua”. Shihni më sipër."
+ list_not_sharing_q: "A ka ndonjë listë të personave të cilët i kam shtuar në një nga aspektet e mi, por që s’më kanë shtuar në ndonjë të tyrin?"
+ list_not_sharing_a: "Jo, por mund të shihni nëse dikush ndan apo jo gjëra me ju, duke vizituar faqen e tyre të profilit. Po qe se ndajnë, butoni që tregon aspektin(et) në të cilin i keni vendosur do të jetë i gjelbër; nëse jo, do të jetë gri."
+ see_old_posts_q: "Kur shtoj dikë te një aspekt, a mund të shohin postime më të vjetra që kam bërë tashmë nën atë aspekt?"
+ see_old_posts_a: "Jo. Do të jenë në gjendje të shohin vetëm postime të reja të mëvonshme në atë aspekt. Ata (dhe cilido tjetër) mund të shohin postimet tuaja publike më të vjetra te faqja e profilit tuaj, dhe mund t’i shohin ato edhe te rrjedhat e tyre."
+ tags:
+ title: "Etiketa"
+ what_are_tags_for_q: "Për se duhen etiketat?"
+ what_are_tags_for_a: "Etiketat janë një rrugë për të kategorizuar një postim, zakonisht sipas temash. Kërkimi për një etiketë përgjigjet me krejt postimet të cilat ju është lejuar t’i shihni, si publiket, ashtu edhe ato private, me atë etiketë. Kjo u lejon personave të interesuar mbi një temë të caktuar të gjejnë postime publike mbi të."
+ tags_in_comments_q: "A mund të vendos etiketa në komente, apo vetëm në postime?"
+ tags_in_comments_a: "Një etiketë e shtuar te një koment, edhe pse do të shfaqet si një lidhje te faqja e etiketës, nuk do ta bëjë atë postim (ose koment) të duket në atë faqe etiketash. Gjëja funksionon vetëm për etiketa në postime."
+ followed_tags_q: "Ç’janë “Etiketat e #Ndjekura” dhe si ndiqet një etiketë?"
+ followed_tags_a: "Pasi kërkoni për një etiketë, mund të klikoni mbi butonin në krye të faqes së etiketës për “ta ndjekur” atë etiketë. Ajo mandej do të shfaqet te lista juaj e etiketave të ndjekura, te menuja majtas. Klikimi mbi një nga etiketat që ndiqni ju shpie te faqja e asaj etikete, dhe mund të shihni kështu postime së fundi që përmbajnë atë etiketë. Klikoni mbi Etiketa të #Ndjekura që të shihni një rrjedhë postimesh që përmbajnë cilëndo nga etiketat që ndiqni."
+ people_tag_page_q: "Cilët janë personat e radhitur në anën e majtë të një faqeje etiketash?"
+ people_tag_page_a: "Janë persona që e kanë vënë atë etiketë te përshkrimi i vetes në faqet e tyre publike."
+ filter_tags_q: "Si mund të filtroj/përjashtoj disa etiketa nga rrjedha ime?"
+ filter_tags_a: "Kjo s’është ende e mundur drejtpërsëdrejti përmes diaspora*-s, por janë shkruar disa %{third_party_tools} që mund ta bëjnë këtë."
+ keyboard_shortcuts:
+ title: "Shkurtore tastiere"
+ keyboard_shortcuts_q: "Ç’shkurtore tastiere ka të gatshme?"
+ keyboard_shortcuts_a1: "Te pamja me rrjedhën mund të përdorni shkurtoret vijuese për tastierën:"
+ keyboard_shortcuts_li1: "j – Kaloni te postimi pasues"
+ keyboard_shortcuts_li2: "k – Kaloni te postimi i mëparshëm"
+ keyboard_shortcuts_li3: "c – Komentoni te postimi i tanishëm"
+ keyboard_shortcuts_li4: "l – Pëlqeni postimin e tanishëm"
+ keyboard_shortcuts_li5: "r – Rindani me të tjerët postimin e tanishëm"
+ keyboard_shortcuts_li6: "m – Zgjeroni shfaqjen e postimit të tanishëm"
+ keyboard_shortcuts_li7: "o – Hapni lidhjen e parë në postimin e tanishëm"
+ keyboard_shortcuts_li8: "Ctrl+Enter –Dërgoni mesazhin që po shkruani"
+ miscellaneous:
+ title: "Të ndryshme"
+ back_to_top_q: "A ka një rrugë të shpejtë për të kaluar në krye të faqes pasi kam rrëshqitur për poshtë?"
+ back_to_top_a: "Po. Pas rrëshqitjes poshtë në një faqe, klikoni mbi shigjetën ngjyrë gri që duket në cepin e poshtëm majtas të dritares së shfletuesit tuaj."
+ photo_albums_q: "A ka albume fotosh apo videosh?"
+ photo_albums_a: "Jo, hëpërhë jo. Sidoqoftë, mund të shihni fotot e ngarkuara nga një person në skedën Foto të faqes së tyre të profilit."
+ subscribe_feed_q: "A mund të pajtohem te postimet publike të dikujt përmes një lexuesi prurjesh?"
+ subscribe_feed_a: "Po, por kjo është ende një veçori jo shumë e latuar dhe formatimi i përfundime është ende me shumë cepa. Nëse prapë dëshironi ta provoni, shkoni te faqja e profilit të dikujt dhe klikoni butonin e prurjeve te shfletuesi juaj, ose mund të kopjoni URL-në e profilit (p.sh. https://podname.org/people/somenumber) dhe t’ia furnizoni një lexuesi prurjesh. Adresa e prurjes që përftohet duket pak a shumë si kjo: https://podname.org/public/username.atom – diaspora* përdor Atom-in, në vend se RSS-në."
+ diaspora_app_q: "A ka një aplikacion diaspora* për Android ose iOS?"
+ diaspora_app_a: "Ka patur disa aplikacione Android në zhvillim e sipër nga anëtarë të bashkësisë. Disa janë projekte të braktisura prej kohësh, ndaj edhe nuk funksionojnë mirë me versionin e tanishëm të diaspora*. Hëpërhë mos prisni shumë prej këtyre aplikacioneve. Nuk ka aplikacion për iOS hëpërhë. Rruga më e mirë për të përdorur diaspora*-n prej pajisjes suaj celulare është përmes një shfletuesi, ngaqë kemi krijuar një version për celular të sajtit, i cili do të duhej të punonte paq në krejt pajisjet, edhe pse nuk përmban ende gjithë funksionet."
+
invitation_codes:
excited: "%{name} është i ngazëllyer që ju sheh këtu."
invitations:
create:
- sent: "Janë dërguar ftesa për: %{emails} "
+ sent: "Janë dërguar ftesa për: %{emails}"
rejected: "Adresat email vijuese patën probleme: "
- no_more: "Nuk keni më ftesa."
+ no_more: "S’keni më ftesa."
already_sent: "E keni ftuar një herë këtë person."
already_contacts: "Jeni tashmë i lidhur me këtë person"
- own_address: "S'mund të dërgoni ftesë te adresa juaj."
+ own_address: "S’mund të dërgoni ftesë te adresa juaj."
+ empty: "Ju lutemi, jepni të paktën një adresë email."
+ note_already_sent: "Janë dërguar tashmë ftesa te: %{emails}"
new:
language: "Gjuhë"
- invite_someone_to_join: "Ftoni dikë që të marrë pjesë në Diaspora!"
- if_they_accept_info: "nëse pranojnë, do të shtohen te aspekti prej nga ku i ftuat."
- comma_separated_plz: "Mund të fusni shumë adresa email njëherësh, duke i ndarë me presje."
- check_out_diaspora: "Hej! Hidhini një sy Diaspora*-s"
+ invite_someone_to_join: "Ftoni dikë që të marrë pjesë në diaspora!"
+ if_they_accept_info: "Nëse pranojnë, do të shtohen te aspekti prej nga ku i ftuat."
+ comma_separated_plz: "Mund të jepni disa adresa email njëherësh, ndarë me presje."
+ check_out_diaspora: "Hej! Hidhini një sy diaspora*-s"
to: "Për"
personal_message: "Mesazh personal"
send_an_invitation: "Dërgoni një ftesë"
+ sending_invitation: "Po dërgohet ftesa…"
send_invitation: "Dërgoje ftesën"
- paste_link: "Ndajeni me miqtë tuaj këtë lidhje që t'i ftoni ata te Diaspora*, ose dërgojuani lidhjen drejtpërsëdrejti me email."
+ paste_link: "Ndajeni me shokët tuaj këtë lidhje që t’i ftoni ata te diaspora*, ose dërgojuani lidhjen drejtpërsëdrejti me email."
codes_left:
- zero: "Nuk kanë mbetur më ftesa te ky kod"
- one: "Ende një ftesë te ky kod"
- other: "Ende %{count} ftesa te ky kod"
+ zero: "S’kanë mbetur më ftesa te ky kod"
+ one: "Ende një ftesë te ky kod"
+ other: "Ende %{count} ftesa te ky kod"
aspect: "Aspekt"
- already_invited: "Ftesa juaj nuk është pranuar nga personat vijues:"
+ already_invited: "Ftesa juaj s’është pranuar nga personat vijues:"
resend: "Ridërgoje"
- check_out_diaspora: "Hidhini një sy Diaspora-s!"
+ check_out_diaspora: "Hidhini një sy diaspora-s!"
check_token:
- not_found: "Nuk u gjetën të dhëna ftese"
+ not_found: "S’u gjetën të dhëna ftese"
edit:
your_account_awaits: "Llogaria juaj pret!"
accept_your_invitation: "Pranojeni ftesën për ju"
@@ -402,92 +641,106 @@ sq:
header:
profile: "Profil"
settings: "Rregullime"
+ help: "Ndihmë"
logout: "Dilni"
- blog: "blog"
- login: "hyni"
- code: "kod"
- admin: "admin"
+ blog: "Blog"
+ login: "Hyni"
+ code: "Kod"
+ admin: "Admin"
view_all: "Shihini krejt"
recent_notifications: "Njoftime së fundi"
+ toggle_navigation: "Shfaqni/Fshihni lëvizjen"
application:
- powered_by: "POWERED BY DIASPORA*"
- whats_new: "ç'ka të re?"
- toggle: "aktivizojeni/çaktivizojeni për celular"
- public_feed: "Prurje Publike Diaspora për %{name}"
+ powered_by: "Xhiron me diaspora*"
+ whats_new: "Ç’ka të re?"
+ toggle: "Aktivizojeni/Çaktivizojeni për celular"
+ public_feed: "Prurje publike diaspora për %{name}"
your_aspects: "aspektet tuaja"
back_to_top: "Kthehuni në krye"
- source_package: "shkarkoni paketën me kodin burim"
+ source_package: "Shkarkoni paketën e kodit burim"
likes:
likes:
people_like_this:
- zero: "pa pëlqime"
+ zero: "Pa pëlqime"
one: "%{count} pëlqim"
other: "%{count} pëlqime"
people_like_this_comment:
- zero: "no likes"
+ zero: "Pa pëlqime"
one: "%{count} pëlqim"
other: "%{count} pëlqime"
people_dislike_this:
- zero: "pa mospëlqime"
+ zero: "Pa mospëlqime"
one: "%{count} mospëlqim"
other: "%{count} mospëlqime"
notifications:
started_sharing:
- zero: "%{actors} që ndajnë gjëra me ju."
- one: "%{actors} filloi të ndajë gjëra me ju."
- other: "%{actors} filluan të ndajnë gjëra me ju."
+ zero: "Filluan të ndajnë gjëra me ju %{actors} persona."
+ one: "Filloi të ndajë gjëra me ju %{actors} person."
+ other: "Filluan të ndajnë gjëra me ju %{actors} persona."
private_message:
- zero: "%{actors} ju ka dërguar mesazh."
- one: "%{actors} ju dërgoi mesazh."
- other: "%{actors} ju dërguan mesazh."
+ zero: "Ju kanë dërguar mesazh %{actors} persona."
+ one: "Ju ka dërguar mesazh %{actors} person."
+ other: "Ju kanë dërguar mesazh %{actors} persona."
comment_on_post:
- zero: "Te %{post_link} juaj ka komentuar %{actors}."
- one: "Te %{post_link} juaj komentoi %{actors}."
- other: "Te %{post_link} juaj komentuan %{actors}."
+ zero: "Te postimi juaj %{post_link} kanë komentuar %{actors} persona."
+ one: "Te postimi juaj %{post_link} komentoi %{actors} person."
+ other: "Te postimi juaj %{post_link} komentuan %{actors} persona."
also_commented:
- zero: "%{actors} ka komentuar gjithashtu te %{post_link} nga %{post_author}."
- one: "%{actors} ka komentuar gjithashtu te %{post_link} nga %{post_author}."
- other: "%{actors} kanë komentuar gjithashtu te %{post_link} nga %{post_author}."
+ zero: "Te postimi %{post_link} nga %{post_author} kanë komentuar gjithashtu %{actors} persona."
+ one: "Te postimi %{post_link} nga %{post_author} ka komentuar gjithashtu %{actors} person."
+ other: "Te postimi %{post_link} nga %{post_author} kanë komentuar gjithashtu %{actors} persona."
mentioned:
- zero: "%{actors} ju ka përmendur te një %{post_link}."
- one: "%{actors} ju përmendi te një %{post_link}."
- other: "%{actors} ju përmendën te një %{post_link}."
+ zero: "Ju kanë përmendur te postimi %{post_link} %{actors} persona."
+ one: "Ju ka përmendur te postimi %{post_link} %{actors} persona."
+ other: "Ju kanë përmendur te postimi %{post_link} %{actors} persona."
liked:
- zero: "%{post_link} tuaj e kanë përlqyer %{actors}."
- one: "%{post_link} tuaj e ka përlqyer %{actors}."
- other: "%{post_link} tuaj e kanë përlqyer %{actors}."
+ zero: "Postimin tuaj %{post_link} e kanë pëlqyer %{actors} persona."
+ one: "Postimin tuaj %{post_link} e ka pëlqyer %{actors} person."
+ other: "Postimin tuaj %{post_link} e kanë pëlqyer %{actors} persona."
reshared:
- zero: "%{post_link} tuaj e kanë rindarë me dikë %{actors}."
- one: "%{post_link} tuaj e ka rindarë me dikë %{actors}."
- other: "%{post_link} tuaj e kanë rindarë me dikë %{actors}."
- post: "post"
+ zero: "Postimin tuaj %{post_link} e kanë rindarë me dikë %{actors} persona."
+ one: "Postimin tuaj %{post_link} e ka rindarë me dikë %{actors} person."
+ other: "Postimin tuaj %{post_link} tuaj e kanë rindarë me dikë %{actors} persona."
+ post: "postim"
also_commented_deleted:
- zero: "%{actors} ka komentuar në një postim të fshirë."
- one: "%{actors} ka komentuar në një postim të fshirë."
- other: "%{actors} kanë komentuar në një postim të fshirë."
+ zero: "Në një postim të fshirë kanë komentuar %{actors} persona."
+ one: "Në një postim të fshirë ka komentuar %{actors} person."
+ other: "Në një postim të fshirë kanë komentuar %{actors} persona."
liked_post_deleted:
- zero: "Postimin tuaj të fshirë e pëlqeu %{actors}."
- one: "Postimin tuaj të fshirë e pëlqeu %{actors}."
- other: "Postimin tuaj të fshirë e pëlqyen %{actors}."
+ zero: "Postimin tuaj të fshirë e pëlqyen %{actors} persona."
+ one: "Postimin tuaj të fshirë e pëlqeu %{actors} person."
+ other: "Postimin tuaj të fshirë e pëlqyen %{actors} persona."
reshared_post_deleted:
- zero: "Postimin tuaj të fshirë e ka rindarë me dikë %{actors}."
- one: "Postimin tuaj të fshirë e ka rindarë me dikë %{actors}."
- other: "Postimin tuaj të fshirë e kanë rindarë me dikë %{actors}."
+ zero: "Postimin tuaj të fshirë e kanë rindarë me dikë %{actors} persona."
+ one: "Postimin tuaj të fshirë e ka rindarë me dikë %{actors} person."
+ other: "Postimin tuaj të fshirë e kanë rindarë me dikë %{actors} persona."
mentioned_deleted:
- zero: "Në një postim të fshirë ju kanë përmendur %{actors}."
- one: "Në një postim të fshirë ju ka përmendur %{actors}."
- other: "Në një postim të fshirë ju kanë përmendur %{actors}."
+ zero: "Në një postim të fshirë ju kanë përmendur %{actors} persona."
+ one: "Në një postim të fshirë ju ka përmendur %{actors} person."
+ other: "Në një postim të fshirë ju kanë përmendur %{actors} persona."
index:
notifications: "Njoftime"
- mark_all_as_read: "Vëru Shenjë të Tërave Si të Lexuara"
- mark_unread: "Vëru shenjë si të palexuara"
+ mark_all_as_read: "Vëru shenjë të tërave si të lexuara"
+ mark_all_shown_as_read: "Vëru shenjë krejt të shfaqurave si të lexuara"
+ mark_read: "Vëri shenjë si të lexuar"
+ mark_unread: "Vëri shenjë si të palexuar"
+ show_all: "Shfaqi krejt"
+ show_unread: "Shfaq të palexuarat"
+ all_notifications: "Krejt njoftimet"
+ also_commented: "Ka komentuar edhe"
+ comment_on_post: "Koment te postimi"
+ liked: "Pëlqeu"
+ mentioned: "Përmendi"
+ reshared: "Rindau"
+ started_sharing: "Zuri të ndajë"
+ no_notifications: "S’keni ende ndonjë njoftim."
and_others:
zero: "dhe askush tjetër"
one: "dhe një më tepër"
other: "dhe %{count} të tjerë"
- and: 'dhe'
+ and: "dhe"
helper:
new_notifications:
zero: "Pa njoftime të reja"
@@ -496,27 +749,34 @@ sq:
notifier:
a_post_you_shared: "postim."
- email_sent_by_diaspora: "Ky email u dërgua nga %{pod_name}. Nëse doni të reshtni së marri email-e të tillë,"
- click_here: "klikoni këtu"
+ a_private_message: "Ka një mesazh të ri privat te diaspora* për ju."
+ a_limited_post_comment: "Ka një koment të ri në një postim të kufizuar te diaspora* për ju."
+ email_sent_by_diaspora: "Ky email është dërguar nga %{pod_name}. Nëse doni të reshtni së marri email-e të tillë,"
+ click_here: "Klikoni këtu"
hello: "Tungjatjeta %{name}!"
thanks: "Faleminderit,"
to_change_your_notification_settings: "që të ndryshoni rregullimet tuaja mbi njoftimet"
single_admin:
- subject: "Mesazh lidhur me llogarinë tuaj te Diaspora:"
- admin: "Përgjegjësi i Diaspora-s"
+ subject: "Mesazh lidhur me llogarinë tuaj te diaspora*:"
+ admin: "Përgjegjësi i diaspora*-s suaj"
started_sharing:
- subject: "%{name} filloi të ndajë gjëra me ju në Diaspora*"
+ subject: "%{name} filloi të ndajë gjëra me ju në diaspora*"
sharing: "ka filluar të ndajë gjëra me ju!"
view_profile: "Shihni profilin për %{name}"
comment_on_post:
- reply: "Përgjigjjuni ose shihni postimin nga %{name} >"
+ limited_subject: "Ka një koment të ri në një nga postimet tuaja"
+ reply: "Përgjigjiuni ose shihni postimin nga %{name} >"
+ also_commented:
+ limited_subject: "Ka një koment të ri në një postim ku komentuat"
mentioned:
- subject: "%{name} ju ka përmenduar në Diaspora*"
+ subject: "%{name} ju ka përmendur në diaspora*"
mentioned: "ju përmendi në një postim:"
+ limited_post: "U përmendët në një postim të kufizuar."
private_message:
- reply_to_or_view: "Përgjigjuni te ose shiheni këtë bashkëbisedim >"
+ reply_to_or_view: "Përgjigjuni te ose shiheni këtë bisedë >"
liked:
liked: "%{name} e pëlqeu postimin tuaj"
+ limited_post: "%{name} pëlqeu postimin tuaj të kufizuar"
view_post: "Shiheni postimin >"
reshared:
reshared: "%{name} e rindau me dikë postimin tuaj"
@@ -524,113 +784,193 @@ sq:
confirm_email:
subject: "Ju lutemi, aktivizoni adresën tuaj të re email %{unconfirmed_email}"
click_link: "Që të aktivizoni adresën tuaj të re email %{unconfirmed_email}, ju lutemi, ndiqni këtë lidhje:"
- accept_invite: "Pranoni ftesën për te Diaspora*!"
- invited_you: "%{name} ju ka ftuar te Diaspora*"
+ report_email:
+ type:
+ post: "postim"
+ comment: "koment"
+ subject: "Një %{type}i të ri iu vu shenjë si fyes"
+ body: |-
+ Tungjatjeta,
+
+ %{type}it me ID-në %{id} iu vu shenjë si fyes.
+
+ [%{url}][1]
+
+ Ju lutemi, shqyrtojeni sa më shpejt që mundet!
+
+
+ Shëndet,
+
+ Roboti i email-eve te diaspora*!
+
+ [1]: %{url}
+ export_email:
+ subject: "%{name}, të dhënat tuaja personale janë gati për t’i shkarkuar"
+ body: |-
+ Tungjatjeta %{name},
+
+ Të dhënat tuaja janë bërë gati dhe mund t’i shkarkoni duke ndjekur [këtë lidhje](%{url}).
+
+ Shëndet,
+
+ Roboti i email-eve te diaspora*!
+ export_failure_email:
+ subject: "%{name}, na ndjeni, pati një problem me të dhënat tuaja"
+ body: |-
+ Tungjatjeta %{name}
+
+ Hasëm një problem teksa gatitnim të dhënat tuaja personale për shkarkim.
+ Ju lutemi, riprovoni!
+
+ Na ndjeni,
+
+ Roboti i email-eve te diaspora*!
+ export_photos_email:
+ subject: "%{name}, fotot tuaja janë gati për shkarkim"
+ body: |-
+ Tungjatjeta %{name},
+
+ Fotot tuaja u bënë gati dhe mund t’i shkarkoni duke ndjekur [këtë lidhje](%{url}).
+
+ Shëndet,
+
+ Roboti i email-eve te diaspora*!
+ export_photos_failure_email:
+ subject: "%{name}, pati një problem me fotot tuaja"
+ body: |-
+ Tungjatjeta %{name}
+
+ Hasëm një problem teksa gatitnim fotot tuaja për shkarkim.
+ Ju lutemi, riprovoni!
+
+ Na ndjeni,
+
+ Roboti i email-eve te diaspora*!
+ accept_invite: "Pranoni ftesën për te diaspora*!"
+ invited_you: "%{name} ju ka ftuar te diaspora*"
invite:
message: |-
Tungjatjeta!
-
- Ju kanë ftuar te Diaspora*!
-
- Që t'ia filloni, klikoni mbi këtë lidhje
-
- [%{invite_url}][1]
-
+
+ Ju kanë ftuar te diaspora*!
+
+ Që t’ia filloni, klikoni mbi këtë lidhje
+
+ [%{invite_url}][1]
+
+
Me dashuri,
-
- Roboti i email-eve te Diaspora*!
-
+
+ Roboti i email-eve te diaspora*!
+
+ P.S.: Në rast se s’e dini (ende) ç’është diaspora*, [ja][2] ku është përgjigja!
+
[1]: %{invite_url}
+ [2]: %{diasporafoundation_url}
+ remove_old_user:
+ subject: "Llogarisë tuaj te diaspora* i është vënë shenjë për heqje, për shkak mosveprimtarie"
+ body: |-
+ Tungjatjeta,
+
+ Duket sikur s’e doni më llogarinë tuaj te %{pod_url}, ngaqë s’e keni përdorur që prej %{after_days} ditësh. Që të sigurojmë për përdoruesit tanë aktivë punimin më të mirë te kjo nyjë diaspora*, do të donim të hiqnim prej bazës tonë të të dhënave llogaritë e padëshiruara.
+
+ Do të donim që të mbeteni pjesë bashkësisë diaspora*, dhe jeni i mirëpritur ta mbani gjallë llogarinë, nëse doni.
+
+ Nëse dëshironi ta mbani gjallë llogarinë tuaj, krejt çka lypset të bëni është të hyni në të përpara %{remove_after}. Kur të bëni hyrjen, ndaluni një çast dhe hidhni një sy nëpër diaspora*. Ka ndryshuar mjaft që nga hera e fundit që e patë, dhe mendojmë se do t’i pëlqeni përmirësimet që kemi bërë. Ndiqni ca #etiketa që të gjeni lëndë që ju pëlqen.
+
+ Hyni nga këtu: %{login_url}. Nëse keni harruar hollësitë tuaja për hyrje, mund të kërkoni një kujtues që nga ajo faqe.
+
+ Me shpresë se do t’ju shohim sërish,
+ Roboti i email-eve te diaspora*!
people:
zero: "asnjë person"
one: "1 person"
- two: "%{count} vetë"
- few: "%{count} vetë"
- many: "%{count} vetë"
other: "%{count} vetë"
person:
pending_request: "Në pritje të miratimit"
already_connected: "I lidhur tashmë"
thats_you: "Ky jeni ju!"
- add_contact: "shtojeni kontaktin"
+ add_contact: "Shtojeni kontaktin"
index:
- results_for: "përfundime kërkimi për"
+ results_for: "Përfundime kërkimi për"
no_results: "Hej! Lypset të kërkoni për diçka."
- couldnt_find_them_send_invite: "Nuk i gjetët dot? Dërgojuni një ftesë!"
- no_one_found: "...dhe nuk u gjet njeri."
- searching: "po kërkohet, ju lutemi, bëni durim..."
+ couldnt_find_them: "S’i gjetët dot?"
+ search_handle: "Që të jeni të sigurt se i gjeni shokët tuaj, përdorni ID-të e tyre diaspora*."
+ send_invite: "Ende asgjë? Dërgojuni një ftesë!"
+ no_one_found: "…dhe s’u gjet njeri."
+ searching: "Po kërkohet, ju lutemi, bëni durim…"
looking_for: "Po kërkonit për postime me etiketën %{tag_link}?"
webfinger:
- fail: "Na ndjeni, nuk gjetëm dot %{handle}."
+ fail: "Na ndjeni, s’gjetëm dot %{handle}."
show:
- has_not_shared_with_you_yet: "%{name} nuk ka ndarë ende ndonjë postim me ju!"
+ has_not_shared_with_you_yet: "%{name} s’ka ndarë ende ndonjë postim me ju!"
incoming_request: "%{name} dëshiron të ndajë diçka me ju"
return_to_aspects: "Kthehuni te faqja e aspektit tuaj"
to_accept_or_ignore: "që ta pranoni ose shpërfillni."
- does_not_exist: "Personi nuk ekziston!"
- not_connected: "Nuk ndani gjë me këtë person"
- recent_posts: "Postime Së Fundi"
- recent_public_posts: "Postime Publike Së Fundi"
+ does_not_exist: "Personi s’ekziston!"
+ not_connected: "S’ndani gjë me këtë person"
+ recent_posts: "Postime së fundi"
+ recent_public_posts: "Postime publike së fundi"
see_all: "Shihini krejt"
- start_sharing: "filloni të ndani me të tjerët"
+ start_sharing: "Filloni të ndani me të tjerët"
message: "Mesazh"
mention: "Përmendje"
ignoring: "Po shpërfillni krejt postimet e bëra nga %{name}."
closed_account: "Kjo llogari është mbyllur."
sub_header:
- you_have_no_tags: "nuk keni etiketa!"
- add_some: "shtoni ndonjë"
- edit: "përpunoni"
+ you_have_no_tags: "S’keni etiketa!"
+ add_some: "Shtoni ndonjë"
+ edit: "Përpunoni"
profile_sidebar:
- remove_contact: "hiqe kontaktin"
+ remove_contact: "Hiqe kontaktin"
edit_my_profile: "Përpunim i profilit tim"
- bio: "bio"
- location: "venndodhje"
- gender: "gjini"
- born: "datëlindje"
- in_aspects: "në aspektet"
+ bio: "Jetëshkrim"
+ location: "Vendndodhje"
+ gender: "Gjini"
+ born: "Datëlindje"
+ photos: "Foto"
+ in_aspects: "Në aspektet"
remove_from: "Hiqe %{name} prej %{aspect}?"
helper:
results_for: " përfundime për %{params}"
- people_on_pod_are_aware_of: " people on pod are aware of"
+ is_sharing: "%{name} ndan gjëra me ju"
+ is_not_sharing: "%{name} s’ndan gjëra me ju"
aspect_list:
- edit_membership: "përpunoni anëtarësinë te aspekti"
+ edit_membership: "Përpunojini anëtarësinë te aspekti"
add_contact_small:
- add_contact_from_tag: "shto kontakt prej etiketës"
- last_post: "Postimi i Fundit"
+ add_contact_from_tag: "Shtoni kontakt prej etiketës"
add_contact:
- invited_by: "qetë ftuar nga"
-
+ invited_by: "Qetë ftuar nga"
photos:
show:
- delete_photo: "Fshije Foton"
- make_profile_photo: "kaloje si foto profili"
- update_photo: "Përditësoje Foton"
- edit: "përpunojeni"
+ delete_photo: "Fshije foton"
+ make_profile_photo: "Kaloje si foto profili"
+ update_photo: "Përditësoje foton"
+ edit: "Përpunojeni"
edit_delete_photo: "Përpunoni përshkrim fotoje / fshijeni foton"
- collection_permalink: "permalidhje koleksioni"
+ collection_permalink: "Permalidhje koleksioni"
show_original_post: "Shfaq postimin origjinal"
edit:
editing: "Po përpunohet"
photo:
- view_all: "shihni krejt fotot nga %{name}"
+ view_all: "Shihni krejt fotot nga %{name}"
new:
- new_photo: "Foto e Re"
- back_to_list: "Mbrapsht te Lista"
- post_it: "postoje!"
+ new_photo: "Foto e re"
+ back_to_list: "Mbrapsht te lista"
+ post_it: "Postoje!"
create:
- runtime_error: "Ngarkimi i fotos dështoi. Jeni i sigurt se rripin e sigurimit e kishit lidhur?"
- integrity_error: "Ngarkimi i fotos dështoi. Jeni i sigurt se qe një figurë?"
- type_error: "Ngarkimi i fotos dështoi. Jeni i sigurt se shtuat një figurë?"
+ runtime_error: "Ngarkimi i fotos dështoi. Jeni i sigurt se rripin e sigurimit e kishit lidhur?"
+ integrity_error: "Ngarkimi i fotos dështoi. Jeni i sigurt se qe një figurë?"
+ type_error: "Ngarkimi i fotos dështoi. Jeni i sigurt se shtuat një figurë?"
update:
notice: "Fotoja u përditësua me sukses."
- error: "Nuk arrit të përpunojë foton."
+ error: "S’u arrit të përpunohet fotoja."
destroy:
notice: "Fotoja u fshi."
new_photo:
- invalid_ext: "{file} ka zgjatim të pavlefshëm. Lejohen vetëm {extensions}."
+ invalid_ext: "{file} ka zgjatim të pavlefshëm. Lejohen vetëm {extensions}."
size_error: "{file} është shumë e madhe, madhësia maksimum për kartelat është {sizeLimit}."
empty: "{file} është e zbrazët, ju lutemi, përzgjidhni sërish kartela, por pa të."
new_profile_photo:
@@ -638,19 +978,43 @@ sq:
or_select_one_existing: "ose përzgjidhni një prej %{photos}ve tuaja ekzistuese"
comment_email_subject: "Foto nga %{name}"
+ polls:
+ votes:
+ zero: "%{count} vota deri tani"
+ one: "%{count} votë deri tani"
+ other: "%{count} vota deri tani"
+
posts:
presenter:
- title: "A post from %{name}"
+ title: "Postim prej %{name}"
show:
+ location: "Postuar që prej %{location}"
destroy: "Fshije"
- permalink: "permalidhje"
- not_found: "Na ndjeni, nuk e gjetëm dot atë postim."
+ permalink: "Permalidhje"
+ not_found: "Na ndjeni, s’e gjetëm dot atë postim."
photos_by:
- zero: "Nuk ka foto nga %{author}"
+ zero: "S’ka foto nga %{author}"
one: "Një foto nga %{author}"
other: "%{count} foto nga %{author}"
reshare_by: "Rindarje nga %{author}"
+ report:
+ title: "Përmbledhje raportimesh"
+ post_label: "<b>Postim</b>: %{title}"
+ comment_label: "<b>Koment</b>:<br>%{data}"
+ reported_label: "<b>Raportuar nga</b> %{person}"
+ reason_label: "Arsye: %{text}"
+ review_link: "Vëri shenjë si të lexuar"
+ delete_link: "Fshije objektin"
+ reported_user_details: "Hollësi mbi përdoruesin e raportuar"
+ confirm_deletion: "Jeni i sigurt se doni të fshihet ky objekt?"
+ not_found: "<u>S’u gjet postimi/komenti. Duket se është fshirë nga vetë përdoruesi!</u>"
+ status:
+ marked: "Raportimit iu vu shenjë si i lexuar"
+ destroyed: "Postimi u asgjësua"
+ created: "U krijua një raportim"
+ failed: "Diçka shkoi ters"
+
share_visibilites:
update:
post_hidden_and_muted: "Postimi %{name} u fsheh dhe njoftimet u pezulluan."
@@ -658,8 +1022,14 @@ sq:
profiles:
edit:
- your_public_profile: "Profili juaj publik"
- your_private_profile: "Profili juaj privat"
+ basic: "Profili im bazë"
+ extended: "Profili im i zgjeruar"
+ settings: "Rregullime profili"
+ extended_visibility_text: "Dukshmëri e profilit tuaj të zgjeruar:"
+ public: "Publik"
+ limited: "I kufizuar"
+ basic_hint: "Çdo zë te profili juaj është në dëshirë. Profili juaj bazë do të jetë përherë publikisht i dukshëm."
+ extended_hint: "Klikoni mbi çelësin që të caktoni dukshmërinë e profilit tuaj të zgjeruar. Publik do të thotë se është i dukshëm në internet, i kufizuar do të thotë vetëm persona me të cilët ndani gjëra mund t’i shohin këto të dhëna."
your_name: "Emri juaj"
first_name: "Emri"
last_name: "Mbiemri"
@@ -667,16 +1037,17 @@ sq:
your_birthday: "Datëlindja juaj"
your_tags: "Përshkruani veten me 5 fjalë"
- your_tags_placeholder: "fjala vjen #filma #lepujt #udhëtime #mësues #Pukë"
+ your_tags_placeholder: "Fjala vjen #filma #lepujt #udhëtime #mësues #Pukë"
your_bio: "Jetëshkrimi juaj"
your_location: "Vendndodhja juaj"
your_photo: "Fotoja juaj"
- update_profile: "Përditësoni Profilin"
- allow_search: "Lejojuni njerëzve të kërkojnë për ju brenda Diaspora-s"
+ update_profile: "Përditësoni profilin"
+ allow_search: "Lejojuni njerëzve të kërkojnë për ju brenda diaspora-s"
edit_profile: "Përpunoje profilin"
- you_are_nsfw: "I keni vënë shenjë vetes si jo i paqmë për punë, lënda juaj nuk do t'u tregohet njerëzve të cilët kanë zgjedhur të mos shohin rrjedha lënde të diskutueshme."
- you_are_safe_for_work: "I keni vënë shenjë vetes si i paqmë për punë, çka nënkupton se pranoni që lënda që postoni pajtohet me udhëzimet e bashkësisë."
+ nsfw_explanation: "NSFW (“not safe for work ” - jo e përshtatshme për në punë) është standardi i bashkësisë vetë-administruese diaspora* për lëndë që mund të mos jetë e përshtatshme për t’u parë kur jeni në punë. Nëse planifikoni të ndani shpesh me të tjerët material të tillë, ju lutemi, i vini shenjë kësaj mundësie, që gjithçka që ndani me të tjerët, të fshihet te rrjedhat e njerëzve, derisa ata të zgjedhin ta shohin."
+ nsfw_explanation2: "Nëse vendosni të mos e përzgjidhni këtë mundësi, ju lutemi, shtoni etiketën #nsfw sa herë që ndani me të tjerët material të tillë."
+ nsfw_check: "Vëri shenjë si NSFW gjithçkaje që ndaj me të tjerët"
update:
updated: "Profili u përditësua"
failed: "Përditësimi i profilit dështoi"
@@ -686,30 +1057,31 @@ sq:
create_my_account: "Krijoje llogarinë time!"
join_the_movement: "Bashkojuni lëvizjes!"
- sign_up_message: "Rrjet Shoqëror me ♥"
+ sign_up_message: "Rrjet shoqëror me ♥"
- enter_email: "Jepni një email"
+ enter_email: "Jepni adresën tuaj email"
enter_username: "Zgjidhni një emër përdoruesi (shkronja, numra dhe nënvija vetëm)"
enter_password: "Jepni një fjalëkalim (minimumi gjashtë shenja)"
enter_password_again: "Jepni të njëjtin fjalëkalim si më parë"
- hey_make: "HEJ,<br/>BËNI<br/>DIÇKA."
- diaspora: "<3 Diaspora*"
- sign_up: "REGJISTROHUNI"
- email: "EMAIL"
- username: "EMËR PËRDORUESI"
- password: "FJALËKALIM"
- continue: "Vazhdoni"
+ sign_up: "Regjistrohuni"
+ email: "Email"
+ username: "Emër përdoruesi"
+ password: "Fjalëkalim"
+ password_confirmation: "Ripohim fjalëkalimi"
+ submitting: "Po parashtrohet…"
+ terms: "Duke krijuar një llogari pranoni %{terms_link}."
+ terms_link: "kushtet e shërbimit."
create:
- success: "U bëtë anëtar i Diaspora-s!"
+ success: "Iu bashkuat diaspora-s!"
edit:
edit: "Përpunoni %{name}"
- leave_blank: "(lëreni të zbrazët, po qe se nuk dëshironi ta ndryshoni)"
+ leave_blank: "(lëreni të zbrazët, po qe se s’dëshironi ta ndryshoni)"
password_to_confirm: "(kemi nevojë për fjalëkalimin tuaj të tanishëm që të ripohohet vullneti për ndryshimet)"
unhappy: "I/e pakënaqur?"
update: "Përditësoje"
- cancel_my_account: "Anuloje llogarinë tim"
- closed: "Në këtë nyje të Diaspora-s nuk pranohen më regjistrime."
- invalid_invite: "Lidhja e ftesës që ofruat nuk është më e vlefshme!"
+ cancel_my_account: "Anuloje llogarinë time"
+ closed: "Në këtë nyjë të diaspora-s regjistrimet janë mbyllur."
+ invalid_invite: "Lidhja e ftesës që ofruat s’është më e vlefshme!"
requests:
manage_aspect_contacts:
@@ -721,17 +1093,17 @@ sq:
ignore: "Kërkesa kontaktesh të shpërfillura."
create:
sending: "Dërgim"
- sent: "Kërkuat që të ndani diçka me %{name}. Kanë për ta parë herës tjetër që hyjnë në Diaspora."
+ sent: "Kërkuat që të ndani diçka me %{name}. Kanë për ta parë herës tjetër që hyjnë në Diaspora."
new_request_to_person:
- sent: "u dërgua!"
+ sent: "U dërgua!"
helper:
new_requests:
- zero: "pa kërkesa të reja"
- one: "kërkesë e re!"
+ zero: "S’ka kërkesa të reja"
+ one: "Kërkesë e re!"
other: "%{count} kërkesa të reja!"
reshares:
reshare:
- reshared_via: "rindarë me të tjerët përmes"
+ reshared_via: "Rindarë përmes"
reshare_original: "Rindani origjinalin"
reshare:
zero: "Rindarje"
@@ -744,118 +1116,137 @@ sq:
failure: "Pati një gabim gjatë rindarjes me të tjerët të këtij postimi."
comment_email_subject: "rindarje nga %{resharer} e postimit nga %{author}"
services:
+ provider:
+ facebook: "Facebook"
+ tumblr: "Tumblr"
+ twitter: "Twitter"
+ wordpress: "WordPress"
index:
- logged_in_as: "i futur si"
- disconnect: "shkëputu"
- really_disconnect: "të shkëputet nga %{service}?"
- connect_to_twitter: "Lidhu te Twitter"
- connect_to_facebook: "Lidhu te Facebook"
- connect_to_tumblr: "Lidhu te Tumblr"
+ title: "Administroni shërbime të lidhura"
+ connect: "Lidhe"
+ disconnect: "Shkëpute"
+ logged_in_as: "I futur si %{nickname}."
+ no_services_available: "S’ka shërbime gati për këtë nyjë."
+ not_logged_in: "Hëpërhë jo i futur"
+ really_disconnect: "Të shkëputet nga %{service}?"
edit_services: "Përpunoni shërbime"
- no_services: 'Nuk jeni lidhur ende me ndonjë shërbim.'
+ services_explanation: "Lidhja te shërbime ndarjesh prej palësh të treta ju jep aftësinë të botoni postime në to, ndërkohë që i shkruani në diaspora*."
create:
success: "Mirëfilltësim i suksesshëm."
failure: "Mirëfilltësimi dështoi."
already_authorized: "Një përdorues me id-në %{diaspora_id} te Diaspora e pat autorizuar tashmë këtë llogari %{service_name}."
+ read_only_access: "Shkalla e përdorshmërisë është vetëm lexim, ju lutemi, riprovoni të autorizoni më vonë"
destroy:
success: "Mirëfilltësimi u fshi me sukses."
failure:
- error: "pati një gabim në lidhjen me atë shërbim"
+ error: "Pati një gabim në lidhjen me atë shërbim"
inviter:
- join_me_on_diaspora: "Lidhuni me mua në DIASPORA*"
+ join_me_on_diaspora: "Lidhuni me mua në diaspora*"
click_link_to_accept_invitation: "Që të pranoni ftesën për ju, ndiqni këtë lidhje"
finder:
- fetching_contacts: "Diaspora po merret me miqtë tuaj nga %{service}, ju lutemi, kontrolloni sërish pas pak minutash."
- service_friends: "Miq nga %{service}"
- no_friends: "Nuk u gjetën miq nga Facebook-u."
+ fetching_contacts: "diaspora* po merret me shokët tuaj nga %{service}, ju lutemi, kontrolloni sërish pas pak minutash."
+ service_friends: "Shokë nga %{service}"
+ no_friends: "S’u gjetën shokë nga Facebook-u."
remote_friend:
- resend: "ridërgoje"
- invite: "ftojeni"
- not_on_diaspora: "Ende jo te Diaspora"
+ resend: "Ridërgoje"
+ invite: "Ftojeni"
+ not_on_diaspora: "Ende jo te diaspora*"
blocks:
create:
- success: "Në rregull, nuk keni për ta parë sërish atë përdorues te rrëkeza juaj. #silencio!"
- failure: "Nuk e shpërfillja dot atë përdorues. #evasion"
+ success: "Në rregull, s’keni për ta parë sërish atë përdorues te rrjedha juaj. #silencio!"
+ failure: "S’e shpërfillja dot atë përdorues. #evasion"
destroy:
- success: "Pa të shohim se ç'kanë për të thënë! #sayhello"
- failure: "Nuk rrija dot pa e shpërfilluar atë përdorues. #evasion"
+ success: "Pa të shohim se ç’kanë për të thënë! #sayhello"
+ failure: "S’rrija dot pa e shpërfillur atë përdorues. #evasion"
shared:
aspect_dropdown:
add_to_aspect: "Shtojeni kontaktin"
+ mobile_row_checked: "%{name} (hiqeni)"
+ mobile_row_unchecked: "%{name} (shtojeni)"
toggle:
zero: "Shtoni kontakt"
one: "Në %{count} aspekt"
other: "Në %{count} aspekte"
publisher:
- posting: "Postim..."
+ formatWithMarkdown: "Mund të përdorni %{markdown_link} për formatimin e postimeve tuaja"
+ posting: "Postim…"
share: "Ndajeni me të tjerët"
+ preview: "Paraparje"
post_a_message_to: "Postoni një mesazh te %{aspect}"
- make_public: "bëje publik"
- all: "krejt"
+ make_public: "Bëje publik"
+ all: "Krejt"
upload_photos: "Ngarkoni foto"
- all_contacts: "krejt kontaktet"
- share_with: "ndajeni me"
- whats_on_your_mind: "Ç'bluani në mendje?"
- publishing_to: "botim te: "
+ get_location: "Merrni vendndodhjen tuaj"
+ remove_location: "Hiqja vendndodhjen"
+ all_contacts: "Krejt kontaktet"
+ share_with: "Ndajeni me"
+ whats_on_your_mind: "Ç’bluani në mendje?"
+ publishing_to: "Botim te: "
discard_post: "Hidhe tej postimin"
new_user_prefill:
- newhere: "Rishtar"
+ newhere: "rishtar"
hello: "Njatjeta të gjithëve, jam #%{new_user_tag}. "
i_like: "Më interesojnë %{tags}. "
invited_by: "Faleminderit për ftesën, "
+ poll:
+ remove_poll_answer: "Hiqe mundësinë"
+ add_poll_answer: "Shtoni mundësi"
+ add_a_poll: "Shtoni një pyetësor"
+ question: "Pyetje"
+ option: "Mundësia 1"
add_contact:
- enter_a_diaspora_username: "Jepni një emër përdoruesi të Diaspora-s:"
- your_diaspora_username_is: "Emri juaj për te Diaspora është: %{diaspora_handle}"
- create_request: "Gjeni sipas ID-sh në Diaspora"
+ enter_a_diaspora_username: "Jepni një emër përdoruesi të diaspora*-s:"
+ your_diaspora_username_is: "Emri juaj për te diaspora* është: %{diaspora_handle}"
+ create_request: "Gjeni sipas ID-sh në diaspora*"
diaspora_handle: "diaspora@pod.org"
- know_email: "Ua dini adresën email? Do të ishte mirë t'i ftonit"
+ know_email: "Ua dini adresën email? Do të ishte mirë t’i ftonit"
add_new_contact: "Shtoni një kontakt të ri"
invitations:
invites: "Ftesa"
invite_someone: "Ftoni dikë"
invitations_left: "edhe %{count}"
- dont_have_now: "Hëpërhë nuk keni ndonjë, por së shpejti do t'ju mbërrijnë më shumë ftesa!"
- invites_closed: "Në këtë nyje Diaspora, ftesat hëpërhë janë të mbyllyra"
- invite_your_friends: "Ftoni miqtë tuaj"
+ dont_have_now: "Hëpërhë s’keni ndonjë, por së shpejti do t’ju mbërrijnë më shumë ftesa!"
+ invites_closed: "Në këtë nyjë diaspora*, ftesat hëpërhë janë të mbyllura"
+ invite_your_friends: "Ftoni shokët tuaj"
from_facebook: "Nga Facebook-u"
by_email: "Përmes email-i"
- share_this: "Ndajeni me të tjerët këtë lidhje përmes email-esh, blogjesh, ose rrjetesh shoqërorë që parapëlqeni!"
+ share_this: "Ndajeni këtë lidhje përmes email-i, blogu, ose rrjetesh shoqërore!"
reshare:
reshare: "Rindajeni"
public_explain:
- control_your_audience: "Kontrolloni Audiencën tuaj"
- new_user_welcome_message: "Përdorni #hashtags që të kalsifikoni postimet tuaja dhe të gjeni kështu persona që kanë interesa të njëjta me tuajat. Call out awesome people with @Mentions"
- visibility_dropdown: "Përdoreni këtë menu hapmbyll që të ndryshoni gjendjen (i dukshëm, i fshehur, publik, privat) të postimit tuaj. (Këshillojmë që këtë të parin ta bëni publik.)"
+ control_your_audience: "Kontrolloni publikun tuaj"
+ new_user_welcome_message: "Përdorni #hashtags që të klasifikoni postimet tuaja dhe të gjeni kështu persona që kanë interesa të njëjta me tuajat. Tërhiqni në bisedë persona të mahnitshëm, përmes funksionit @Përmendje"
+ visibility_dropdown: "Përdoreni këtë menu hapmbyll që të ndryshoni gjendjen e postimit tuaj. (Këshillojmë që këtë të parin ta bëni publik.)"
title: "Rregulloni shërbimet me të cilat lidheni"
share: "Ndajeni me të tjerët"
- outside: "Mesazhet publike do të jeni të dukshme nga të tjerët jashtë Diaspora-s."
- logged_in: "i futur te %{service}"
- manage: "administroni shërbimet me të cilat lidheni"
+ outside: "Mesazhet publike do të jeni të dukshme nga të tjerët jashtë diaspora*-s."
+ logged_in: "I futur te %{service}"
+ manage: "Administroni shërbimet me të cilat lidheni"
atom_feed: "Prurje Atom"
notification:
new: "%{type} i ri nga %{from}"
contact_list:
all_contacts: "Krejt kontaktet"
stream_element:
- viewable_to_anyone: "Ky postim është i dukshëm për këdo në web"
+ viewable_to_anyone: "Ky postim është i dukshëm për këdo në Internet"
connect_to_comment: "Lidhuni me këtë përdorues që të komentoni në postimin e tij"
- currently_unavailable: 'hëpërhë nuk mund të bëni komentim'
- via: "përmes %{link}"
- via_mobile: "përmes celularit"
+ currently_unavailable: "Hëpërhë s’mund të bëni komentim"
+ via: "Përmes %{link}"
+ via_mobile: "Përmes celularit"
ignore_user: "Shpërfille %{name}"
- ignore_user_description: "Shpërfille dhe hiqe përdoruesin prej krejt aspekteve?"
- hide_and_mute: "Hide and mute post"
- like: "Like"
- unlike: "Unlike"
- dislike: "Dislike"
+ ignore_user_description: "Të shpërfillet dhe hiqet përdoruesi prej krejt aspekteve?"
+ hide_and_mute: "Fshihe dhe mbyllja gojën postimit"
+ like: "Pëlqejeni"
+ unlike: "Hiqjani Pëlqimin"
+ dislike: "Mospëlqejeni"
shared_with: "Ndarë te: %{aspect_names}"
nsfw: "Këtij postimi i është vënë shenja NSFW nga autori i vet. %{link}"
- show: "shfaqe"
+ show: "Shfaqe"
footer:
- logged_in_as: "i futur si %{name}"
- your_aspects: "aspektet tuaja"
+ logged_in_as: "I futur si %{name}"
+ your_aspects: "Aspektet tuaja"
status_messages:
new:
mentioning: "Me përmendje të: %{person}"
@@ -865,10 +1256,7 @@ sq:
no_message_to_display: "Pa mesazh për shfaqje."
destroy:
failure: "Fshirja e postimit dështoi"
- too_long:
- zero: "ju lutemi, mesazhet tuaj mbi gjendjen bëjini më pak se %{count} shenja"
- one: "ju lutemi, mesazhet tuaj mbi gjendjen bëjini më pak se %{count} shenjë"
- other: "ju lutemi, mesazhet tuaj mbi gjendjen bëjini më pak se %{count} shenja"
+ too_long: "Ju lutemi, mesazhin tuaj mbi gjendjen bëjeni më pak se %{count} shenja. Tani është %{current_length} shenja"
stream_helper:
show_comments:
@@ -876,165 +1264,155 @@ sq:
one: "Shfaq edhe një koment"
other: "Shfaq edhe %{count} komente të tjera"
hide_comments: "Fshihi krejt komentet"
+ no_more_posts: "Keni mbërritur në fund të rrjedhës."
+ no_posts_yet: "Ende s’ka postime."
tags:
show:
- posts_tagged_with: "Postime të etiketuar me #%{tag}"
- nobody_talking: "Askush nuk po flet ende rreth %{tag}."
- people_tagged_with: "Persona të etiketuar me %{tag}"
+ tagged_people:
+ zero: "Asnjë i etiketuar me %{tag}."
+ one: "1 person i etiketuar me %{tag}."
+ other: "%{count} persona të etiketuar me %{tag}."
follow: "Ndiqeni #%{tag}"
following: "Po ndiqet #%{tag}"
- stop_following: "Resht Së Ndjekuri #%{tag}"
- followed_by: 'ndjekur nga'
- none: "Etiketa e zbrazët nuk ka kuptim!"
+ stop_following: "Resht së ndjekuri #%{tag}"
+ none: "Etiketa e zbrazët s’ka kuptim!"
+ name_too_long: "Ju lutemi, bëjeni emrin e etiketës suaj më të shkurtër se %{count} shenja. Tani është %{current_length} shenja"
+
tag_followings:
create:
- success: "Urraaa! Tani po ndiqni #%{name}."
- failure: "Ndjekja e #%{name} dështoi. Mos jeni duke e ndjekur tashmë?"
- none: "Nuk ka kuptim të ndiqet një etiketë e zbrazët!"
+ success: "Urraaa! Tani po ndiqni #%{name}."
+ failure: "Ndjekja e #%{name} dështoi. Mos jeni duke e ndjekur tashmë?"
+ none: "S’ka kuptim të ndiqet një etiketë e zbrazët!"
destroy:
- success: "Kështu, pra! Nuk po e ndiqni më #%{name}."
- failure: "Nuk u ndal dot ndjekja e #%{name}. Ndoshta e keni ndalur tashmë ndjekjen për të?"
-
- tokens:
- show:
- connect_to_cubbies: "Lidhuni te Cubbi.es"
- what_is_cubbies: "Cubbi.es është zbatimi i parë në botë për Diaspora-n. Është gjithashtu mënyra më e mirë për të koleksionuar foto online."
- love_to_try: "Do të na pëlqente shumë po ta provonit."
- sign_up_today: "Regjistrohuni sot!"
- screenshot_explanation: "%{link1}. Kjo cubby e dhënë është e lidhur te %{link2}."
- typical_userpage: "Një faqe përdoruesi të zakonshëm cubbi.es"
- daniels_account: "Llogaria Diaspora e Danielit"
- making_the_connection: "Vendosja e Lidhjes"
- connecting_is_simple: "Lidhja e llogarisë suaj Diaspora është punë e thjeshtë! Jepni ID-në tuaj Diaspora (<b>%{diaspora_id}</b>) prej <a href='%{href_link}'>faqes tuaj të rregullime</a> te cubbie.es dhe shtypni butonin e lidhjes."
- via: "(përmes %{link})"
-
- authorizations:
- index:
- revoke_access: "Shfuqizojeni Hyrjen"
- no_applications: "Nuk keni regjistruar ende ndonjë zbatim."
- new:
- cubbies_will: "Cubbies do të jetë në gjendje të postojë foto për ju"
- authorize: "Autorizoje"
- nope: "Jo"
+ success: "Kështu, pra! S’po e ndiqni më #%{name}."
+ failure: "S’u ndal dot ndjekja e #%{name}. Ndoshta e keni ndalur tashmë ndjekjen për të?"
+ manage:
+ title: "Administrim etiketash të ndjekura"
+ no_tags: "S’ndiqni ndonjë etiketë."
streams:
- community_spotlight_stream: "Prozhektori i Bashkësisë"
+ community_spotlight_stream: "Projektori i bashkësisë"
aspects_stream: "Aspekte"
mentioned_stream: "@Përmendje"
- followed_tags_stream: "Etiketa të #Ndjekura"
+ followed_tags_stream: "Etiketa të #ndjekura"
mentions:
title: "@Përmendje"
contacts_title: "Persona që ju kanë përmendur"
comment_stream:
- title: "Postime Ku Keni Komentuar"
+ title: "Postime ku keni komentuar"
contacts_title: "Persona te postimet e të cilëve keni komentuar"
like_stream:
- title: "Rrëkeza Më të Pëlqyerat"
+ title: "Rrjedhë të pëlqyerash"
contacts_title: "Persona postimet e të cilëve i pëlqeni"
followed_tag:
- title: "Etiketa të #Ndjekura"
+ title: "Etiketa të #ndjekura"
contacts_title: "Persona që ndjekin këto etiketa"
add_a_tag: "Shtoni një etiketë"
follow: "Ndiqe"
tags:
- title: "Postime të etiketuara: %{tags}"
+ title: "Postime të etiketuara me: %{tags}"
contacts_title: "Persona që e ndjekin këtë etiketë"
- tag_prefill_text: "%{tag_name} merret me... "
public:
- title: "Veprimtari Publike"
- contacts_title: "Postuesa Së Fundmi"
+ title: "Veprimtari publike"
+ contacts_title: "Postues së fundi"
multi:
- title: "Stream"
- contacts_title: "Persona në Rrëkezën tuaj"
+ title: "Rrjedhë"
+ contacts_title: "Persona në rrjedhën tuaj"
aspects:
- title: "Aspektet e Mia"
+ title: "Aspektet e mia"
activity:
- title: "Veprimtaria Ime"
-
+ title: "Veprimtaria ime"
users:
edit:
- export_data: "Eksportoni të Dhëna"
- photo_export_unavailable: "Hëpërhë eksportimi i fotove nuk funksionon"
- close_account_text: "Mbylleni Llogarinë"
- change_language: "Ndërroni Gjuhën"
- change_password: "Ndërroni Fjalëkalimin"
+ edit_account: "Përpunoni llogarinë"
+ change: "Ndryshoje"
+ your_handle: "ID-ja juaj Diaspora"
+ your_email: "Email-i juaj"
+ your_email_private: "Email-i juaj s’do të shihet kurrë nga përdorues të tjerë"
change_email: "Ndërroni email-in"
+ email_awaiting_confirmation: "Ju kemi dërguar një lidhje aktivizimi te %{unconfirmed_email}. Derisa të ndiqni këtë lidhje dhe të aktivizoni adresën e re, do të vazhdojmë të përdorim adresën tuaj origjinale %{email}."
+ change_password: "Ndërroni fjalëkalimin"
new_password: "Fjalëkalim i ri"
current_password: "Fjalëkalimi i tanishëm"
- current_password_expl: "ai me të cilin bëni hyrjen..."
+ current_password_expl: "ai me të cilin bëni hyrjen…"
character_minimum_expl: "duhet të ketë të paktën gjashtë shenja"
- download_xml: "shkarkoje xml-në time"
- download_photos: "shkarko fotot e mia"
- your_handle: "ID-ja juaj Diaspora"
- your_email: "Email-i juaj"
- edit_account: "Përpunoni llogarinë"
- receive_email_notifications: "Merrni njoftime me email kur..."
- also_commented: "...dikush komenton gjithashtu në një postim të kontaktit tuaj?"
- comment_on_post: "...dikush komenton në një postim tuajin?"
- mentioned: "...kur ju përmendin në një postim?"
- started_sharing: "...kur dikush fillon të ndajë gjëra me ju?"
- private_message: "...kur merrni një mesazh privat?"
- liked: "...dikujt i pëlqen një postim i juaji?"
- reshared: "...dikush rindan me të tjerët një postim tuajin?"
- change: "Ndryshoje"
- email_awaiting_confirmation: "Ju kemi dërguar një lidhje aktivizimi te %{unconfirmed_email}. Deri të ndiqni këtë lidhje dhe të aktivizoni adresën e re, do të vazhdojmë të përdorim adresën tuaj origjinale %{email}."
- stream_preferences: "Parapëlqime për Rrëkezën"
- show_community_spotlight: "Të shfaqet në Rrëkezë Prozhektori i Bashkësisë?"
- show_getting_started: "Riaktivizo Si T'ia Fillohet"
- getting_started: 'Parapëlqime për Përdorues të Re'
- following: "Rregullime Ndjekjeje"
- auto_follow_back: "Nëse dikush ju ndjek, ndiqeni vetvetiu edhe ju"
- auto_follow_aspect: "Aspekt për përdorues të ndjekur vetvetiu:"
-
+ change_language: "Ndërroni gjuhën"
+ change_color_theme: "Ndërroni temën e ngjyrave"
+ close_account_text: "Mbylleni Llogarinë"
+ stream_preferences: "Parapëlqime për rrjedhën"
+ show_community_spotlight: "Të shfaqet te rrjedha projektori mbi bashkësinë?"
+ show_getting_started: "Shfaq ndihmëza “si t’ia fillohet”"
+ getting_started: "Parapëlqime përdoruesi të ri"
+ following: "Rregullime ndjekjeje"
+ auto_follow_back: "Ndani vetvetiu me përdorues që fillojnë të ndajnë gjëra me ju"
+ auto_follow_aspect: "Aspekt për përdorues me të cilët ndani gjëra vetvetiu:"
+ receive_email_notifications: "Merrni njoftime me email kur:"
+ started_sharing: "dikush fillon të ndajë gjëra me ju"
+ someone_reported: "dikush dërgon një raportim"
+ mentioned: "u përmendët në një postim"
+ liked: "dikujt i pëlqen një postim i juaji"
+ reshared: "dikush rindan një postim tuajin"
+ comment_on_post: "dikush komenton në një postim tuajin"
+ also_commented: "dikush komenton në një postim ku keni komentuar"
+ private_message: "merrni një mesazh privat"
+ download_export: "Shkarko profilin tim"
+ request_export: "Kërko të dhënat e profilit tim"
+ request_export_update: "Rifresko të dhënat e profilit tim"
+ export_data: "Eksporto të dhëna"
+ export_in_progress: "Jemi duke përgatitur të dhënat tuaja. Ju lutemi, kontrolloni sërish pas pak çastesh."
+ last_exported_at: "(Përditësuar së fundi më %{timestamp})"
+ download_export_photos: "Shkarko fotot e mia"
+ request_export_photos: "Kërko fotot e mia"
+ request_export_photos_update: "Rifresko fotot e mia"
+ download_photos: "Shkarko fotot e mia"
+ export_photos_in_progress: "Jemi duke përgatitur fotot tuaja. Ju lutemi, kontrolloni sërish pas pak çastesh."
close_account:
dont_go: "Hej, ju lutemi, mos ikni!"
- make_diaspora_better: "Duam që të na ndihmoni ta bëjmë Diaspora-n më të mirë, ndaj do të ishte mirë ta ndihmoni, në vend që të largoheni. Nëse dëshironi të largoheni, duam t'ju bëjmë me dije se ç'do të ndodhë më pas."
- mr_wiggles: "Z. Wiggles do të trishtohet, kur t'ju shohë që po largoheni"
- what_we_delete: "Ne i fshijmë krejt postimet tuaja, të dhënat e profilit, sa më shpejt që mundemi. Komentet tuaja do të jenë prapë këtu, por do të jenë të përshoqëruara nga ID-ja juaj Diaspora."
- locked_out: "Do të bëhet çregjistrimi juaj dhe nuk do t'ju lejohet më hyrja në llogarinë tuaj."
- lock_username: "Nga kjo do të bllokohet emri juaj i përdoruesit, në rast se vendosët të regjistroheni sërish."
- no_turning_back: "Hëpërhë, nuk ka kthim mbrapsht."
- if_you_want_this: "Nëse e dëshironi vërtet këtë, shtypni më poshtë fjalëkalimin tuaj dhe klikoni mbi 'Mbylle Llogarinë'"
+ make_diaspora_better: "Do të donim që të qëndronit dhe të na ndihmonit ta bëjmë diaspora*-n më të mirë, në vend se të largoheni. Nëse dëshironi vërtet të largoheni, ja se ç’do të ndodhë më pas:"
+ mr_wiggles: "Z. Wiggles do të trishtohet, kur t’ju shohë që po largoheni"
+ what_we_delete: "Do të fshijmë krejt postimet tuaja dhe të dhënat e profilit, sa më shpejt që mundemi. Komentet tuaja në postimet e të tjerëve prapëseprapë do të duken, por do t’i jenë përshoqëruar ID-së suaj diaspora*, në vend se emrit tuaj."
+ locked_out: "Do të bëhet çregjistrimi juaj dhe s’do t’ju lejohet më hyrja në llogarinë tuaj, derisa të jetë fshirë ."
+ lock_username: "Emri juaj i përdoruesit do të bllokohet. S’do të jeni në gjendje të krijoni një llogari të re me po të njëjtën ID në këtë nyjë."
+ no_turning_back: "S’ka kthim mbrapa! Nëse jeni vërtet i sigurt, jepni fjalëkalimin tuaj më poshtë."
+ if_you_want_this: "Nëse e dëshironi vërtet këtë, shtypni më poshtë fjalëkalimin tuaj dhe klikoni mbi “Mbylle llogarinë”"
privacy_settings:
- title: "Rregullime Privatësie"
- ignored_users: "Përdorues të Shpërfillur"
+ title: "Rregullime privatësie"
+ strip_exif: "Figurave të ngarkuara hiqua tejtëdhënat e tilla si vendi, autori dhe modeli i kamerës (e këshilluar)"
+ ignored_users: "Përdorues të shpërfillur"
stop_ignoring: "Ndale shpërfilljen"
+ no_user_ignored_message: "S’jeni duke shpërfillur ndonjë përdorues"
destroy:
- success: "Llogaria juaj u bllokua. Mund të na duhen 20 minuta që të bllokojmë llogarinë tuaj. Faleminderit që e provuat Diaspora-n."
+ success: "Llogaria juaj u bllokua. Mund të na duhen 20 minuta që të bllokojmë llogarinë tuaj. Faleminderit që provuat diaspora*-n."
no_password: "Ju lutemi, jepni fjalëkalimin tuaj të tanishëm që të mbyllim llogarinë tuaj."
- wrong_password: "Fjalëkalimi i dhënë nuk u përputh me fjalëkalimin tuaj të tanishëm."
- getting_started:
- well_hello_there: "Epo, tungjatjetani!"
- community_welcome: "Bashkësia e Diaspora-s ka kënaqësinë t'ju shohë pjesë të saj!"
-
- awesome_take_me_to_diaspora: "Shkëlqyeshëm! Shpjemë te Diaspora*"
-
- who_are_you: "Kush jeni ju?"
- we_can_speed_things_up: "Mund t'i përshpejtojmë paksa gjërat duke"
- hooking_up_fb: "lidhur te Diaspora llogarinë tuaj Facebook."
- what_facebook_does: "Kështu do të merren prej andej emri dhe fotoja juaj, dhe do të mundësohet psotimi në të dy krahët."
+ wrong_password: "Fjalëkalimi i dhënë s’u përputh me fjalëkalimin tuaj të tanishëm."
+ getting_started:
+ well_hello_there: "E po…, tungjatjetani!"
+ community_welcome: "Bashkësia e diaspora*-s ka kënaqësinë t’ju shohë pjesë të saj!"
+ awesome_take_me_to_diaspora: "Shkëlqyeshëm! Shpjemë te diaspora*"
+ who_are_you: "Kush jeni?"
+ connect_to_facebook: "Mund t’i përshpejtojmë paksa gjërat duke %{link} te diaspora*. Kështu do të merren prej andej emri dhe fotoja juaj dhe do të mundësohen postime të ndërsjella."
+ connect_to_facebook_link: "lidhur llogarinë tuaj Facebook"
what_are_you_in_to: "Me se po merreni?"
- hashtag_explanation: "Etiketat ju lejojnë të flisni për to dhe të ndiqni interesat tuaja. Janë gjithashtu rrugë e dobishme për të gjetur miq të rinj në Diaspora."
+ hashtag_explanation: "Etiketat ju lejojnë të flisni për to dhe të ndiqni interesat tuaja. Janë gjithashtu rrugë e dobishme për të gjetur shokë të rinj në diaspora*."
hashtag_suggestions: "Provoni të ndiqni etiketa të tilla si #art, #movies, #gif, etj."
-
saved: "U ruajt!"
update:
- password_changed: "Fjalëkalimi u ndryshua. Tani mund të regjistroheni me fjalëkalimin tuaj të ri."
+ password_changed: "Fjalëkalimi u ndryshua. Tani mund të regjistroheni me fjalëkalimin tuaj të ri."
password_not_changed: "Ndryshimi i fjalëkalimit dështoi"
language_changed: "Gjuha u ndryshua"
@@ -1048,19 +1426,45 @@ sq:
unconfirmed_email_not_changed: "Ndryshimi i email-it dështoi"
follow_settings_changed: "Rregullimet për ndjekje u ndryshuan"
follow_settings_not_changed: "Ndryshimi i rregullimeve për ndjekje dështoi."
+ color_theme_changed: "Tema e ngjyrave u ndryshua me sukses."
+ color_theme_not_changed: "Ndodhi një gabim teksa ndryshohej tema e ngjyrave."
public:
- does_not_exist: "Përdoruesi %{username} nuk ekziston!"
+ does_not_exist: "Përdoruesi %{username} s’ekziston!"
confirm_email:
email_confirmed: "Email-i %{email} u aktivizua"
- email_not_confirmed: "Email-i nuk u aktivizua dot. Lidhje e gabuar?"
+ email_not_confirmed: "Email-i s’u aktivizua dot. Lidhje e gabuar?"
will_paginate:
- previous_label: "&laquo; e mëparshme"
- next_label: "pasuese &raquo;"
+ previous_label: "&laquo; e mëparshmja"
+ next_label: "pasuesja &raquo;"
webfinger:
- fetch_failed: "prurja e profilit webfinger për %{profile_url} dështoi"
- hcard_fetch_failed: "pati problem me prurjen e hcard-it për %{account}"
- xrd_fetch_failed: "pati një gabim gjatë marrjes së xrd-së për llogarinë %{account}"
- not_enabled: "Streha për %{account} nuk duket se e ka të aktivizuar mekanizmin webfinger."
- no_person_constructed: "Prej kësaj hcard-e nuk qe e mundur të ndërtohej profili i ndonjë personi."
+ fetch_failed: "Prurja e profilit webfinger për %{profile_url} dështoi"
+ hcard_fetch_failed: "Pati problem me prurjen e hcard-it për %{account}"
+ xrd_fetch_failed: "Pati një gabim gjatë marrjes së xrd-së për llogarinë %{account}"
+ not_enabled: "Streha për %{account} s’duket se e ka të aktivizuar mekanizmin webfinger."
+ no_person_constructed: "S’qe e mundur të ndërtohej profili i ndonjë personi prej kësaj hcard-e."
+
+ simple_captcha:
+ placeholder: "Jepni vlerën e figurës"
+ label: "Jepni kodin te kutia:"
+ message:
+ default: "Kodi sekret s’u përputh me figurën"
+ user: "Figura e fshehtë dhe kodi ndryshonin nga njëri-tjetri"
+ failed: "Verifikimi njerëzor dështoi"
+
+ statistics:
+ name: "Emër"
+ network: "Rrjet"
+ services: "Shërbime"
+ total_users: "Përdorues gjithsej"
+ active_users_halfyear: "Përdorues aktivë në gjysmën e vitit"
+ active_users_monthly: "Përdorues aktivë në muaj"
+ local_posts: "Postime vendore"
+ local_comments: "Komente vendore"
+ version: "Version"
+ registrations: "Regjistrime"
+ enabled: "Aktivizuar"
+ disabled: "Çaktivizuar"
+ open: "Open"
+ closed: "Closed"
diff --git a/config/locales/javascript/javascript.sq.yml b/config/locales/javascript/javascript.sq.yml
index f2d254883..9bb74489a 100644
--- a/config/locales/javascript/javascript.sq.yml
+++ b/config/locales/javascript/javascript.sq.yml
@@ -5,10 +5,85 @@
sq:
javascripts:
+ cancel: "Anuloje"
confirm_dialog: "Jeni i sigurt?"
+ confirm_unload: "Ju lutemi, ripohoni se doni ta braktisni këtë faqe. Të dhënat që keni dhënë s’do të ruhen."
+ create: "Krijoje"
delete: "Fshije"
ignore: "Shpërfille"
+ report:
+ prompt: "Ju lutemi, jepni një arsye:"
+ prompt_default: "p.sh. lëndë fyese"
+ name: "Njoftim"
+ status:
+ created: "Njoftimi u krijua me sukses"
+ exists: "Njoftimi ekziston"
ignore_user: "Të shpërfillet ky përdorues?"
+ ignore_failed: "S’arrihet të shpërfillet ky përdorues"
+ hide_post: "Të fshihet ky postim?"
+ hide_post_failed: "S’arrihet të fshihet ky postim"
+ remove_post: "Të hiqet ky postim?"
+ unblock_failed: "Zhbllokimi i këtij përdoruesi dështoi"
+ and: "dhe"
+ comma: ","
+ edit: "Përpunojeni"
+ no_results: "S’u gjetën përfundime"
+
+ admins:
+ dashboard:
+ up_to_date: "Nyja juaj është e përditësuar!"
+ outdated: "Nyja juaj është e vjetruar."
+ compare_versions: "Versioni më i ri i diaspora* është <%= latestVersion %>, nyja juaj xhiron ende <%= podVersion %>."
+ error: "S’u arrit të përcaktohej versioni më i ri i diaspora*."
+ admin:
+ pods:
+ pod: "Nyjë"
+ ssl: "SSL"
+ ssl_enabled: "SSL e aktivizuar"
+ ssl_disabled: "SSL e çaktivizuar"
+ added: "U shtua"
+ status: "Gjendje"
+ states:
+ unchecked: "E pakontrolluar"
+ no_errors: "OK"
+ dns_failed: "Ftillimi i emrit (DNS) dështoi"
+ net_failed: "Përpjekja për lidhje dështoi"
+ ssl_failed: "Lidhja e sigurt (SSL) dështoi"
+ http_failed: "Lidhja HTTP dështoi"
+ version_failed: "S’u arrit të merrej version software-i"
+ unknown_error: "Gjatë kontrollit ndodhi një gabim i papërcaktuar"
+ actions: "Veprime"
+ offline_since: "jashtë linje që prej:"
+ last_check: "kontrolli i fundit:"
+ more_info: "shfaq më tepër të dhëna"
+ check: "kryej një provë të lidhjes"
+ recheck:
+ success: "Nyja u kontrolluar sërish."
+ failure: "Kontrolli nuk u krye."
+ follow_link: "hape lidhjen në shfletues"
+ no_info: "S’ka të dhëna të tjera në këtë pikë"
+ server_software: "Software shërbyesi:"
+ response_time: "Kohë përgjigjeje:"
+ ms:
+ one: "<%= count %>ms"
+ other: "<%= count %>ms"
+ unknown: "e panjohur"
+ not_available: "jo gati"
+ unchecked:
+ one: "Ka ende një nyjë që s’është kontrolluar fare."
+ other: "Ka ende <%= count %> nyja që s’janë kontrolluar fare."
+ errors:
+ one: "Prova e lidhjes u përgjigj me një gabim për një nyjë."
+ other: "Prova e lidhjes u përgjigj me një gabim për <%= count %> nyje."
+
+ aspects:
+ make_aspect_list_visible: "Të bëhen kontaktet në këtë aspekt të dukshëm për njëri-tjetrin?"
+ name: "Emër"
+ create:
+ add_a_new_aspect: "Shtoni aspekt të ri"
+ success: "Aspekti juaj i ri <%= name %> u krijua"
+ failure: "Krijimi i aspektit dështoi."
+
timeago:
prefixAgo: ""
prefixFromNow: ""
@@ -24,10 +99,21 @@ sq:
month: "rreth një muaj"
months: "%d muaj"
year: "rreth një vit"
- years: "%d vjetë"
+ years: "%d vjet"
+ wordSeparator: " "
- my_activity: "Veprimtaria Ime"
+ contacts:
+ add_contact: "Shtoni kontakt"
+ aspect_list_is_visible: "Kontaktet në këtë aspekt janë në gjendje të shohin njëri-tjetrin."
+ aspect_list_is_not_visible: "Kontaktet në këtë aspekt s’janë në gjendje të shohin njëri-tjetrin."
+ remove_contact: "Hiqe kontaktin"
+ error_add: "S’u shtua dot <%= name %> te aspekti :("
+ error_remove: "S’u hoq dot <%= name %> prej aspekti :("
+ search_no_results: "S’u gjetën kontakte"
+
+ my_activity: "Veprimtaria ime"
my_stream: "Rrjedhë"
+ my_aspects: "Aspektet e mia"
videos:
watch: "Shiheni këtë video te <%= provider %>"
@@ -36,51 +122,102 @@ sq:
publisher:
at_least_one_aspect: "Duhet të publikoni të paktën një aspekt"
limited: "I kufizuar - postimi juaj do të shihet vetëm nga persona me të cilët ndani gjëra"
- public: "Publik - postimi juaj do të jetë i dukshëm nga kushdo dhe dhe motorët e kërkimeve do të jenë në gjendje ta kapin"
+ public: "Publik - postimi juaj do të jetë i dukshëm nga kushdo dhe motorët e kërkimeve do të jenë në gjendje ta kapin"
+ near_from: "Postuar që nga: <%= location %>"
+ option: "Përgjigjiuni"
+ add_option: "Shtoni një përgjigje"
+ question: "Pyetje"
+ bookmarklet:
+ post_something: "Postoni diçka te diaspora*"
+ post_submit: "Po parashtrohet postimit…"
+ post_success: "U postua! Po mbyllet dritarja flluskë…"
infinite_scroll:
- no_more: "Nuk ka më postime."
+ no_more: "S’ka më postime."
+ no_more_contacts: "S’ka më kontakte."
aspect_dropdown:
add_to_aspect: "Shtoni kontakt"
select_aspects: "Përzgjidhni aspekte"
all_aspects: "Krejt aspektet"
+ updating: "po përditësohet…"
+ mobile_row_checked: "<%= name %> (hiqe)"
+ mobile_row_unchecked: "<%= name %> (shtoje)"
stopped_sharing_with: "Reshtët së ndari gjëra me <%= name %>."
started_sharing_with: "Filluat të ndani gjëra me <%= name %>!"
- error: "Nuk u fillua dot ndarja e gjërave me <%= name %>. Mos po e shpërfillni?"
+ error: "S’u fillua dot ndarja e gjërave me <%= name %>. Mos po i shpërfillni?"
+ error_remove: "S’u hoq dot <%= name %> prej aspekti :("
toggle:
zero: "Përzgjidhni aspekte"
one: "Në <%= count %> aspekt"
other: "Në <%= count %> aspekte"
show_more: "shfaq më tepër"
failed_to_like: "Pëlqimi dështoi!"
+ failed_to_reshare: "Rindarja dështoi!"
failed_to_post_message: "Postimi i mesazhit dështoi!"
+ failed_to_remove: "Heqja e zërit dështoi!"
comments:
- show: "shfaqi krejt komentet"
- hide: "fshihi komentet"
+ show: "Shfaqi krejt komentet"
+ hide: "Fshihi komentet"
+ no_comments: "Ende s’ka komente."
reshares:
- duplicate: "I bukur ky, hë? E keni ndarë një herë me të tjerët atë postim!"
+ duplicate: "Bukur, ë? E keni ndarë një herë me të tjerët atë postim!"
successful: "Postimi u rinda me sukses me të tjerët!"
- post: "Të rindahet me të tjerët postimi nga <%= name %>?"
+ post: "Të rindahet me të tjerët postimi i <%= name %>?"
aspect_navigation:
select_all: "Përzgjidhi krejt"
- deselect_all: "Çpërzgjidhi krejt"
- no_aspects: "Nuk janë përzgjedhur aspekte"
+ deselect_all: "Shpërzgjidhi krejt"
+ no_aspects: "S’janë përzgjedhur aspekte"
+ add_an_aspect: "+ Shtoni një aspekt"
getting_started:
hey: "Hej, <%= name %>!"
- no_tags: "Hej, nuk jeni duke ndjekur ndonjë etiketë! Të vazhdohet, sido qoftë?"
+ no_tags: "Hej, s’jeni duke ndjekur ndonjë etiketë! Të vazhdohet, sido qoftë?"
alright_ill_wait: "Në rregull, do të pres."
- preparing_your_stream: "Po përgatitet rrjedha juaj e personalizuar..."
+ preparing_your_stream: "Po përgatitet rrjedha juaj e personalizuar…"
photo_uploader:
looking_good: "O Zot, sa bukur që dukeni!"
+ completed: "<%= file %> u plotësua"
+ error: "Ndodhi një problem teksa ngarkohej kartela <%= file %>"
+ invalid_ext: "{file} ka një zgjatim të pavlefshëm. Lejohen vetëm {extensions}."
+ size_error: "{file} është shumë e madhe, madhësia maksimum për kartelat është {sizeLimit}."
+ empty: "{file} është e zbrazët, ju lutemi, ripërzgjidhni kartela pa e përfshirë atë."
tags:
- wasnt_that_interesting: "OK, them se #<%= tagName %> nuk qe kushedi se çë interesant..."
+ wasnt_that_interesting: "OK, them se #<%= tagName %> s’qe kushedi se çë interesante…"
people:
- not_found: "dhe nuk u gjet ndonjë..."
+ not_found: "… dhe s’u gjet gjë"
+ mention: "Përmendje"
+ message: "Mesazh"
+ edit_my_profile: "Përpuno profilin tim"
+ stop_ignoring: "Resht së shpërfilluri"
+ helper:
+ is_sharing: "<%= name %> ndan gjëra me ju"
+ is_not_sharing: "<%= name %> ndan gjëra me ju"
+ profile:
+ edit: "Përpunojeni"
+ add_some: "Shtoni ca"
+ you_have_no_tags: "S’keni etiketa!"
+ ignoring: "I shpërfillni krejt postimet prej <%= name %>."
+ bio: "Jetëshkrim"
+ location: "Vendndodhje"
+ gender: "Gjini"
+ born: "Datëlindje"
+ photos: "Foto"
+ contacts: "Kontakte"
+ posts: "Postime"
+
+ conversation:
+ participants: "Pjesëmarrës"
+ new:
+ no_contacts: "Lypset të shtoni ca kontakte përpara se të filloni një bisedë."
+
+ notifications:
+ mark_read: "Shënoje si të lexuar"
+ mark_unread: "Shënoje si të palexuar"
+
stream:
hide: "Fshihe"
public: "Publike"
limited: "E kufizuar"
like: "Pëlqejeni"
- unlike: "Çpëlqejeni"
+ unlike: "Shpëlqejeni"
reshare: "Rindajeni"
comment: "Komentojeni"
original_post_deleted: "Postimi origjinal është fshirë nga autori."
@@ -89,6 +226,10 @@ sq:
hide_nsfw_posts: "Fshihi postimet #nsfw"
follow: "Ndiqe"
unfollow: "Mos e Ndiq Më"
+ enable_post_notifications: "Aktivizo njoftimet për këtë postim"
+ disable_post_notifications: "Çaktivizo njoftimet për këtë postim"
+ permalink: "Permalidhje"
+ via: "përmes <%= provider %>"
likes:
zero: "<%= count %> Pëlqime"
@@ -102,33 +243,63 @@ sq:
more_comments:
zero: "Shfaq <%= count %> komente të tjera"
- one: "Shfaq edhe <%= count %> koment"
- other: "Shfaq edhe <%= count %> komente"
+ one: "Shfaq edhe <%= count %> koment tjetër"
+ other: "Shfaq edhe <%= count %> komente të tjera"
+
+ followed_tag:
+ title: "#Etiketa të ndjekura"
+ contacts_title: "Persona me këto etiketa në profil"
+ add_a_tag: "Shtoni një etiketë"
+ follow: "Ndiqe"
+
+ tags:
+ follow: "Ndiqe #<%= tag %>"
+ following: "Po ndiqet #<%= tag %>"
+ stop_following: "Resht së ndjekuri #<%= tag %>"
+ stop_following_confirm: "Të reshtet së ndjekuri #<%= tag %>?"
+ follow_error: "S’u ndoq dot #<%= tag %> :("
+ stop_following_error: "S’u resht dot së ndjekuri #<%= tag %> :("
header:
home: "Kreu"
profile: "Profil"
contacts: "Kontakte"
settings: "Rregullime"
+ help: "Ndihmë"
admin: "Admin"
+ moderator: "Moderator"
log_out: "Dilni"
+ toggle_navigation: "Shfaqni/fshihni lëvizjen"
+ toggle_mobile: "Shfaqeni/fshiheni për celular"
notifications: "Njoftime"
- messages: "Mesazhe"
+ conversations: "Biseda"
search: "Kërko"
- recent_notifications: "Njoftime Së Fundmi"
+ recent_notifications: "Njoftime së fundi"
mark_all_as_read: "Shënoji krejt si të lexuara"
view_all: "Shihini krejt"
- close: "mbylle"
+ close: "Mbylle"
viewer:
stop_following_post: "Resht së ndjekuri postimin"
follow_post: "Ndiqe postimin"
like: "Pëlqejeni"
- unlike: "Çpëlqejeni"
+ unlike: "Shpëlqejeni"
reshare: "Rindajeni"
reshared: "I rindarë"
comment: "Komentojeni"
+ home: "Kreu"
+
+ poll:
+ vote: "Votoni"
+ go_to_original_post: "Mund të merrni pjesë te ky votim përmes lidhjes te <%= original_post_link %>."
+ original_post: "postimi origjinal"
+ result: "Përfundimi"
+ count:
+ one: "1 votë deri tani"
+ other: "<%=count%> vota deri tani"
+ show_result: "Shfaqe përfundimin"
+ close_result: "Fshihe përfundimin"
diff --git a/config/oembed_providers.yml b/config/oembed_providers.yml
index 7cde6334e..98817b279 100644
--- a/config/oembed_providers.yml
+++ b/config/oembed_providers.yml
@@ -19,3 +19,9 @@ mixcloud:
urls:
- http://www.mixcloud.com/*/*
- https://www.mixcloud.com/*/*
+
+mediacccde:
+ endpoint: "https://media.ccc.de/public/oembed/"
+ urls:
+ - http://media.ccc.de/v/*
+ - https://media.ccc.de/v/*
diff --git a/config/routes.rb b/config/routes.rb
index fe9c1e1cc..2daa85525 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -18,6 +18,7 @@ Diaspora::Application.routes.draw do
mount Sidekiq::Web => '/sidekiq', :as => 'sidekiq'
end
+ # Federation
mount DiasporaFederation::Engine => "/"
get "/atom.xml" => redirect('http://blog.diasporafoundation.org/feed/atom') #too many stupid redirects :()
@@ -182,17 +183,6 @@ Diaspora::Application.routes.draw do
get '/u/:username' => 'people#show', :as => 'user_profile', :constraints => { :username => /[^\/]+/ }
get '/u/:username/profile_photo' => 'users#user_photo', :constraints => { :username => /[^\/]+/ }
-
- # Federation
-
- controller :publics do
- post 'receive/users/:guid' => :receive
- post 'receive/public' => :receive_public
- get 'hub' => :hub
- end
-
-
-
# External
resources :services, :only => [:index, :destroy]
diff --git a/features/desktop/hovercards.feature b/features/desktop/hovercards.feature
index 77c56903b..9c510ab0d 100644
--- a/features/desktop/hovercards.feature
+++ b/features/desktop/hovercards.feature
@@ -6,15 +6,15 @@ Feature: Hovercards
Background:
Given a user named "Bob Jones" with email "bob@bob.bob"
- And "bob@bob.bob" has a public post with text "public stuff"
+ And "bob@bob.bob" has a public post with text "public stuff #hashtag"
And a user named "Alice" with email "alice@alice.alice"
And "alice@alice.alice" has a public post with text "alice public stuff"
- And the post with text "public stuff" is reshared by "alice@alice.alice"
+ And the post with text "public stuff #hashtag" is reshared by "alice@alice.alice"
And the post with text "alice public stuff" is reshared by "bob@bob.bob"
- And I sign in as "alice@alice.alice"
Scenario: Hovercards on the main stream
- Given I am on "bob@bob.bob"'s page
+ Given I sign in as "alice@alice.alice"
+ And I am on "bob@bob.bob"'s page
Then I should see "public stuff" within ".stream_element"
When I activate the first hovercard
Then I should see a hovercard
@@ -22,7 +22,8 @@ Feature: Hovercards
Then I should not see a hovercard
Scenario: Hovercards on the main stream in reshares
- Given I am on "bob@bob.bob"'s page
+ Given I sign in as "alice@alice.alice"
+ And I am on "bob@bob.bob"'s page
Then I should see "Alice" within "#main_stream"
When I hover "Alice" within "#main_stream"
Then I should not see a hovercard
@@ -30,3 +31,11 @@ Feature: Hovercards
Then I should see "Bob Jones" within "#main_stream"
When I hover "Bob Jones" within "#main_stream"
Then I should see a hovercard
+
+ Scenario: Hovercards on the tag stream as a logged out user
+ Given I am on the tag page for "hashtag"
+ Then I should see "public stuff" within ".stream_element"
+ When I activate the first hovercard
+ Then I should see a hovercard
+ When I deactivate the first hovercard
+ Then I should not see a hovercard
diff --git a/features/step_definitions/posts_steps.rb b/features/step_definitions/posts_steps.rb
index bb353b9e0..dd0a725c0 100644
--- a/features/step_definitions/posts_steps.rb
+++ b/features/step_definitions/posts_steps.rb
@@ -15,6 +15,7 @@ Then /^I should not see an uploaded image within the photo drop zone$/ do
end
Then /^I should not see any posts in my stream$/ do
+ page.assert_selector("#paginate .loader", visible: :hidden)
page.assert_selector(".stream_element", count: 0)
end
diff --git a/lib/assets/javascripts/jquery.mentionsInput.js b/lib/assets/javascripts/jquery.mentionsInput.js
index d3a7d25b2..7693caaee 100644
--- a/lib/assets/javascripts/jquery.mentionsInput.js
+++ b/lib/assets/javascripts/jquery.mentionsInput.js
@@ -7,18 +7,20 @@
* Using underscore.js
*
* License: MIT License - http://www.opensource.org/licenses/mit-license.php
- *
- * Modifcations for Diaspora:
+ *
+ * Modifications for Diaspora:
*
* Prevent replacing the wrong text by marking the replacement position with a special character
* Don't add a space after inserting a mention
* Only use the first div as a wrapperBox
+ * Binded paste event on input box to trigger contacts search for autocompletion while adding mention via clipboard
*/
(function ($, _, undefined) {
// Settings
- var KEY = { BACKSPACE : 8, TAB : 9, RETURN : 13, ESC : 27, LEFT : 37, UP : 38, RIGHT : 39, DOWN : 40, COMMA : 188, SPACE : 32, HOME : 36, END : 35 }; // Keys "enum"
+ var KEY = { PASTE : 118, BACKSPACE : 8, TAB : 9, RETURN : 13, ESC : 27, LEFT : 37, UP : 38, RIGHT : 39,
+ DOWN : 40, COMMA : 188, SPACE : 32, HOME : 36, END : 35 }; // Keys "enum"
var defaultSettings = {
triggerChar : '@',
onDataRequest : $.noop,
@@ -95,6 +97,7 @@
elmInputBox.attr('data-mentions-input', 'true');
elmInputBox.bind('keydown', onInputBoxKeyDown);
elmInputBox.bind('keypress', onInputBoxKeyPress);
+ elmInputBox.bind('paste',onInputBoxPaste);
elmInputBox.bind('input', onInputBoxInput);
elmInputBox.bind('click', onInputBoxClick);
elmInputBox.bind('blur', onInputBoxBlur);
@@ -208,6 +211,13 @@
hideAutoComplete();
}
+ function onInputBoxPaste(e) {
+ pastedData = e.originalEvent.clipboardData.getData("text/plain");
+ dataArray = pastedData.split("");
+ _.each(dataArray, function(value) {
+ inputBuffer.push(value);
+ });
+ }
function onInputBoxInput(e) {
updateValues();
updateMentionsCollection();
@@ -223,7 +233,8 @@
}
function onInputBoxKeyPress(e) {
- if(e.keyCode !== KEY.BACKSPACE) {
+ // Excluding ctrl+v from key press event in firefox
+ if (!((e.which === KEY.PASTE && e.ctrlKey) || (e.keyCode === KEY.BACKSPACE))) {
var typedValue = String.fromCharCode(e.which || e.keyCode);
inputBuffer.push(typedValue);
}
diff --git a/lib/diaspora/federated/retraction.rb b/lib/diaspora/federated/retraction.rb
index 5927dca85..61a5e254e 100644
--- a/lib/diaspora/federated/retraction.rb
+++ b/lib/diaspora/federated/retraction.rb
@@ -46,6 +46,14 @@ class Retraction
logger.info "event=retraction status=complete type=#{type} guid=#{post_guid}"
end
+ def correct_authorship?
+ if target.respond_to?(:relayable?) && target.relayable?
+ [target.author, target.parent.author].include?(person)
+ else
+ target.author == person
+ end
+ end
+
def receive(user, person)
if self.type == 'Person'
unless self.person.guid.to_s == self.post_guid.to_s
@@ -55,7 +63,7 @@ class Retraction
return
end
user.disconnected_by(self.target)
- elsif self.target.nil? || self.target.author != self.person
+ elsif target.nil? || !correct_authorship?
logger.warn "event=retraction status=abort reason='no post found authored by retractor' " \
"sender=#{person.diaspora_handle} post_guid=#{post_guid}"
else
diff --git a/lib/diaspora/relayable.rb b/lib/diaspora/relayable.rb
index 87c19a2ff..a99ef1a95 100644
--- a/lib/diaspora/relayable.rb
+++ b/lib/diaspora/relayable.rb
@@ -69,6 +69,12 @@ module Diaspora
def receive(user, person=nil)
comment_or_like = self.class.where(guid: self.guid).first || self
+ unless comment_or_like.signature_valid?
+ logger.warn "event=receive status=abort reason='object signature not valid' recipient=#{user.diaspora_handle} "\
+ "sender=#{comment_or_like.author.diaspora_handle} payload_type=#{self.class} parent_id=#{parent.id}"
+ return
+ end
+
# Check to make sure the signature of the comment or like comes from the person claiming to author it
unless comment_or_like.parent_author == user.person || comment_or_like.verify_parent_author_signature
logger.warn "event=receive status=abort reason='object signature not valid' recipient=#{user.diaspora_handle} "\
diff --git a/lib/postzord/receiver/public.rb b/lib/postzord/receiver/public.rb
index fc870ba42..bb821585b 100644
--- a/lib/postzord/receiver/public.rb
+++ b/lib/postzord/receiver/public.rb
@@ -24,7 +24,7 @@ class Postzord::Receiver::Public < Postzord::Receiver
parse_and_receive(@salmon.parsed_data)
logger.info "received a #{@object.inspect}"
- if @object.is_a?(SignedRetraction) # feels like a hack
+ if @object.is_a?(SignedRetraction) || @object.is_a?(Retraction) # feels like a hack
self.recipient_user_ids.each do |user_id|
user = User.where(id: user_id).first
@object.perform user if user
@@ -44,6 +44,11 @@ class Postzord::Receiver::Public < Postzord::Receiver
# receive relayable object only for the owner of the parent object
@object.receive(@object.parent_author.owner, @author)
end
+ unless @object.signature_valid?
+ @object.destroy
+ logger.warn "event=receive status=abort reason='object signature not valid' "
+ return
+ end
# notify everyone who can see the parent object
receiver = Postzord::Receiver::LocalBatch.new(@object, self.recipient_user_ids)
receiver.notify_users
@@ -74,7 +79,11 @@ class Postzord::Receiver::Public < Postzord::Receiver
end
def xml_author
- if @object.respond_to?(:relayable?)
+ if @object.is_a?(RelayableRetraction)
+ if [@object.parent_diaspora_handle, @object.target.parent.diaspora_handle].include?(@author.diaspora_handle)
+ @author.diaspora_handle
+ end
+ elsif @object.respond_to?(:relayable?)
#this is public, so it would only be owners sending us other people comments etc
@object.parent_author.local? ? @object.diaspora_handle : @object.parent_diaspora_handle
else
diff --git a/spec/controllers/jasmine_fixtures/aspects_spec.rb b/spec/controllers/jasmine_fixtures/aspects_spec.rb
index bdbf026ba..315326f7a 100644
--- a/spec/controllers/jasmine_fixtures/aspects_spec.rb
+++ b/spec/controllers/jasmine_fixtures/aspects_spec.rb
@@ -68,7 +68,7 @@ describe StreamsController, :type => :controller do
it "generates a jasmine fixture with a post containing a video", :fixture => true do
stub_request(
:get,
- "http://www.youtube.com/oembed?format=json&frame=1&iframe=1&maxheight=420&maxwidth=420&scheme=https&url=http://www.youtube.com/watch?v=UYrkQL1bX4A"
+ "https://www.youtube.com/oembed?format=json&frame=1&iframe=1&maxheight=420&maxwidth=420&scheme=https&url=http://www.youtube.com/watch?v=UYrkQL1bX4A"
).with(
:headers => {'Accept'=>'*/*'}
).to_return(
diff --git a/spec/controllers/notifications_controller_spec.rb b/spec/controllers/notifications_controller_spec.rb
index 7568f8e12..2e79d431d 100644
--- a/spec/controllers/notifications_controller_spec.rb
+++ b/spec/controllers/notifications_controller_spec.rb
@@ -46,7 +46,7 @@ describe NotificationsController, :type => :controller do
describe '#index' do
before do
@post = FactoryGirl.create(:status_message)
- FactoryGirl.create(:notification, :recipient => alice, :target => @post)
+ @notification = FactoryGirl.create(:notification, recipient: alice, target: @post)
end
it 'succeeds' do
@@ -56,8 +56,15 @@ describe NotificationsController, :type => :controller do
end
it 'succeeds for notification dropdown' do
+ Timecop.travel(6.seconds.ago) do
+ @notification.touch
+ end
get :index, :format => :json
expect(response).to be_success
+ note_html = JSON.parse(response.body)[0]["also_commented"]["note_html"]
+ note_html = Nokogiri::HTML(note_html)
+ timeago_content = note_html.css("time")[0]["data-time-ago"]
+ expect(timeago_content).to include(@notification.updated_at.iso8601)
expect(response.body).to match(/note_html/)
end
@@ -84,7 +91,6 @@ describe NotificationsController, :type => :controller do
it "should not provide a contacts menu for standard notifications" do
FactoryGirl.create(:notification, :recipient => alice, :target => @post)
get :index, "per_page" => 5
-
expect(Nokogiri(response.body).css('.aspect_membership')).to be_empty
end
diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb
deleted file mode 100644
index 5b105688b..000000000
--- a/spec/controllers/publics_controller_spec.rb
+++ /dev/null
@@ -1,79 +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 PublicsController, :type => :controller do
- let(:fixture_path) { Rails.root.join('spec', 'fixtures') }
- before do
- @user = alice
- @person = FactoryGirl.create(:person)
- end
-
- describe '#receive_public' do
- it 'succeeds' do
- post :receive_public, :xml => "<stuff/>"
- expect(response).to be_success
- end
-
- it 'returns a 422 if no xml is passed' do
- post :receive_public
- expect(response.code).to eq('422')
- end
-
- it 'enqueues a ReceiveUnencryptedSalmon job' do
- xml = "stuff"
- expect(Workers::ReceiveUnencryptedSalmon).to receive(:perform_async).with(xml)
- post :receive_public, :xml => xml
- end
- end
-
- describe '#receive' do
- let(:xml) { "<walruses></walruses>" }
-
- it 'succeeds' do
- post :receive, "guid" => @user.person.guid.to_s, "xml" => xml
- expect(response).to be_success
- end
-
- it 'enqueues a receive job' do
- expect(Workers::ReceiveEncryptedSalmon).to receive(:perform_async).with(@user.id, xml).once
- post :receive, "guid" => @user.person.guid.to_s, "xml" => xml
- end
-
- it 'unescapes the xml before sending it to receive_salmon' do
- aspect = @user.aspects.create(:name => 'foo')
- post1 = @user.post(:status_message, :text => 'moms', :to => [aspect.id])
- xml2 = post1.to_diaspora_xml
- user2 = FactoryGirl.create(:user)
-
- salmon_factory = Salmon::EncryptedSlap.create_by_user_and_activity(@user, xml2)
- enc_xml = salmon_factory.xml_for(user2.person)
-
- expect(Workers::ReceiveEncryptedSalmon).to receive(:perform_async).with(@user.id, enc_xml).once
- post :receive, "guid" => @user.person.guid.to_s, "xml" => CGI::escape(enc_xml)
- end
-
- it 'returns a 422 if no xml is passed' do
- post :receive, "guid" => @person.guid.to_s
- expect(response.code).to eq('422')
- end
-
- it 'returns a 404 if no user is found' do
- post :receive, "guid" => @person.guid.to_s, "xml" => xml
- expect(response).to be_not_found
- end
- it 'returns a 404 if no person is found' do
- post :receive, :guid => '2398rq3948yftn', :xml => xml
- expect(response).to be_not_found
- end
- end
-
- describe '#hub' do
- it 'succeeds' do
- get :hub
- expect(response).to be_success
- end
- end
-end
diff --git a/spec/factories.rb b/spec/factories.rb
index 87110bcf0..0d95a9606 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -10,6 +10,9 @@ def r_str
SecureRandom.hex(3)
end
+require "diaspora_federation/test"
+DiasporaFederation::Test::Factories.federation_factories
+
FactoryGirl.define do
factory :profile do
sequence(:first_name) { |n| "Robert#{n}#{r_str}" }
diff --git a/spec/federation_callbacks_spec.rb b/spec/federation_callbacks_spec.rb
index a2f3432b5..a775d5ecc 100644
--- a/spec/federation_callbacks_spec.rb
+++ b/spec/federation_callbacks_spec.rb
@@ -1,4 +1,5 @@
require "spec_helper"
+require "diaspora_federation/test"
describe "diaspora federation callbacks" do
describe ":fetch_person_for_webfinger" do
@@ -12,6 +13,7 @@ describe "diaspora federation callbacks" do
expect(wf.profile_url).to eq(person.profile_url)
expect(wf.atom_url).to eq(person.atom_url)
expect(wf.salmon_url).to eq(person.receive_url)
+ expect(wf.subscribe_url).to eq(AppConfig.url_to("/people?q={uri}"))
expect(wf.guid).to eq(person.guid)
expect(wf.public_key).to eq(person.serialized_public_key)
end
@@ -147,4 +149,151 @@ describe "diaspora federation callbacks" do
end
end
end
+
+ let(:local_person) { FactoryGirl.create(:user).person }
+ let(:remote_person) { FactoryGirl.create(:person) }
+ let(:post_by_a_local_person) { FactoryGirl.create(:status_message, author: local_person) }
+ let(:post_by_a_remote_person) { FactoryGirl.create(:status_message, author: remote_person) }
+
+ describe ":fetch_private_key_by_diaspora_id" do
+ it "returns a private key for a local user" do
+ key = DiasporaFederation.callbacks.trigger(:fetch_private_key_by_diaspora_id, local_person.diaspora_handle)
+ expect(key).to be_a(OpenSSL::PKey::RSA)
+ expect(key.to_s).to eq(local_person.owner.serialized_private_key)
+ end
+
+ it "returns nil for a remote user" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_private_key_by_diaspora_id, remote_person.diaspora_handle)
+ ).to be_nil
+ end
+
+ it "returns nil for an unknown id" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_private_key_by_diaspora_id, FactoryGirl.generate(:diaspora_id))
+ ).to be_nil
+ end
+ end
+
+ describe ":fetch_author_private_key_by_entity_guid" do
+ it "returns a private key for a post by a local user" do
+ key = DiasporaFederation.callbacks.trigger(:fetch_author_private_key_by_entity_guid,
+ "Post", post_by_a_local_person.guid)
+ expect(key).to be_a(OpenSSL::PKey::RSA)
+ expect(key.to_s).to eq(post_by_a_local_person.author.owner.serialized_private_key)
+ end
+
+ it "returns nil for a post by a remote user" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_author_private_key_by_entity_guid,
+ "Post", post_by_a_remote_person.guid)
+ ).to be_nil
+ end
+
+ it "returns nil for an unknown post" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_author_private_key_by_entity_guid,
+ "Post", FactoryGirl.generate(:guid))
+ ).to be_nil
+ end
+ end
+
+ describe ":fetch_public_key_by_diaspora_id" do
+ it "returns a public key for a person" do
+ key = DiasporaFederation.callbacks.trigger(:fetch_public_key_by_diaspora_id, remote_person.diaspora_handle)
+ expect(key).to be_a(OpenSSL::PKey::RSA)
+ expect(key.to_s).to eq(remote_person.serialized_public_key)
+ end
+
+ it "returns nil for an unknown person" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_public_key_by_diaspora_id, FactoryGirl.generate(:diaspora_id))
+ ).to be_nil
+ end
+ end
+
+ describe ":fetch_author_public_key_by_entity_guid" do
+ it "returns a public key for a known post" do
+ key = DiasporaFederation.callbacks.trigger(:fetch_author_public_key_by_entity_guid,
+ "Post", post_by_a_remote_person.guid)
+ expect(key).to be_a(OpenSSL::PKey::RSA)
+ expect(key.to_s).to eq(post_by_a_remote_person.author.serialized_public_key)
+ end
+
+ it "returns nil for an unknown post" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_author_public_key_by_entity_guid,
+ "Post", FactoryGirl.generate(:guid))
+ ).to be_nil
+ end
+ end
+
+ describe ":entity_author_is_local?" do
+ it "returns true for a post by a local user" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:entity_author_is_local?, "Post", post_by_a_local_person.guid)
+ ).to be_truthy
+ end
+
+ it "returns false for a post by a remote user" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:entity_author_is_local?, "Post", post_by_a_remote_person.guid)
+ ).to be_falsey
+ end
+
+ it "returns false for a unknown post" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:entity_author_is_local?, "Post", FactoryGirl.generate(:diaspora_id))
+ ).to be_falsey
+ end
+ end
+
+ describe ":fetch_entity_author_id_by_guid" do
+ it "returns id for a existing guid" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_entity_author_id_by_guid, "Post", post_by_a_remote_person.guid)
+ ).not_to eq(post_by_a_remote_person.author_id)
+ end
+
+ it "returns nil for a non-existing guid" do
+ expect(
+ DiasporaFederation.callbacks.trigger(:fetch_entity_author_id_by_guid, "Post", FactoryGirl.generate(:guid))
+ ).to be_nil
+ end
+ end
+
+ describe ":queue_public_receive" do
+ it "enqueues a ReceiveUnencryptedSalmon job" do
+ xml = "<diaspora/>"
+ expect(Workers::ReceiveUnencryptedSalmon).to receive(:perform_async).with(xml)
+
+ DiasporaFederation.callbacks.trigger(:queue_public_receive, xml)
+ end
+ end
+
+ describe ":queue_private_receive" do
+ let(:xml) { "<diaspora/>" }
+
+ it "returns true if the user is found" do
+ result = DiasporaFederation.callbacks.trigger(:queue_private_receive, alice.person.guid, xml)
+ expect(result).to be_truthy
+ end
+
+ it "enqueues a ReceiveEncryptedSalmon job" do
+ expect(Workers::ReceiveEncryptedSalmon).to receive(:perform_async).with(alice.id, xml)
+
+ DiasporaFederation.callbacks.trigger(:queue_private_receive, alice.person.guid, xml)
+ end
+
+ it "returns false if the no user is found" do
+ person = FactoryGirl.create(:person)
+ result = DiasporaFederation.callbacks.trigger(:queue_private_receive, person.guid, xml)
+ expect(result).to be_falsey
+ end
+
+ it "returns false if the no person is found" do
+ result = DiasporaFederation.callbacks.trigger(:queue_private_receive, "2398rq3948yftn", xml)
+ expect(result).to be_falsey
+ end
+ end
end
diff --git a/spec/integration/federation/federation_helper.rb b/spec/integration/federation/federation_helper.rb
new file mode 100644
index 000000000..dd3609b71
--- /dev/null
+++ b/spec/integration/federation/federation_helper.rb
@@ -0,0 +1,68 @@
+def remote_user_on_pod_b
+ @remote_on_b ||= create_remote_user("remote-b.net")
+end
+
+def remote_user_on_pod_c
+ @remote_on_c ||= create_remote_user("remote-c.net")
+end
+
+def create_remote_user(pod)
+ FactoryGirl.build(:user).tap do |user|
+ user.person = FactoryGirl.create(:person,
+ profile: FactoryGirl.build(:profile),
+ serialized_public_key: user.encryption_key.public_key.export,
+ diaspora_handle: "#{user.username}@#{pod}")
+ allow(DiasporaFederation.callbacks).to receive(:trigger)
+ .with(:fetch_private_key_by_diaspora_id, user.diaspora_handle) {
+ user.encryption_key
+ }
+ end
+end
+
+def create_relayable_entity(entity_name, target, diaspora_id, parent_author_key)
+ target_entity_type = FactoryGirl.factory_by_name(entity_name).build_class.get_target_entity_type(@entity.to_h)
+ expect(DiasporaFederation.callbacks).to receive(:trigger)
+ .with(
+ :fetch_author_private_key_by_entity_guid,
+ target_entity_type,
+ target.guid
+ )
+ .and_return(parent_author_key)
+
+ FactoryGirl.build(
+ entity_name,
+ conversation_guid: target.guid,
+ parent_guid: target.guid,
+ diaspora_id: diaspora_id,
+ poll_answer_guid: target.respond_to?(:poll_answers) ? target.poll_answers.first.guid : nil
+ )
+end
+
+def generate_xml(entity, remote_user, recipient=nil)
+ if recipient
+ DiasporaFederation::Salmon::EncryptedSlap.generate_xml(
+ remote_user.diaspora_handle,
+ OpenSSL::PKey::RSA.new(remote_user.encryption_key),
+ entity,
+ OpenSSL::PKey::RSA.new(recipient.encryption_key)
+ )
+ else
+ DiasporaFederation::Salmon::Slap.generate_xml(
+ remote_user.diaspora_handle,
+ OpenSSL::PKey::RSA.new(remote_user.encryption_key),
+ entity
+ )
+ end
+end
+
+def post_message(xml, recipient=nil)
+ if recipient
+ inlined_jobs do
+ post "/receive/users/#{recipient.guid}", guid: recipient.guid, xml: xml
+ end
+ else
+ inlined_jobs do
+ post "/receive/public", xml: xml
+ end
+ end
+end
diff --git a/spec/integration/federation/receive_federation_messages_spec.rb b/spec/integration/federation/receive_federation_messages_spec.rb
new file mode 100644
index 000000000..ab114e8e7
--- /dev/null
+++ b/spec/integration/federation/receive_federation_messages_spec.rb
@@ -0,0 +1,151 @@
+require "spec_helper"
+require "integration/federation/federation_helper"
+require "integration/federation/shared_receive_relayable"
+require "integration/federation/shared_receive_retraction"
+require "integration/federation/shared_receive_stream_items"
+
+describe "Receive federation messages feature" do
+ before do
+ allow(DiasporaFederation.callbacks).to receive(:trigger)
+ .with(:queue_public_receive, any_args).and_call_original
+ allow(DiasporaFederation.callbacks).to receive(:trigger)
+ .with(:queue_private_receive, any_args).and_call_original
+ end
+
+ let(:sender) { remote_user_on_pod_b }
+ let(:sender_id) { remote_user_on_pod_b.diaspora_handle }
+
+ context "with public receive" do
+ let(:recipient) { nil }
+
+ it "receives account deletion correctly" do
+ post_message(generate_xml(DiasporaFederation::Entities::AccountDeletion.new(diaspora_id: sender_id), sender))
+
+ expect(AccountDeletion.exists?(diaspora_handle: sender_id)).to be_truthy
+ end
+
+ it "rejects account deletion with wrong diaspora_id" do
+ delete_id = FactoryGirl.generate(:diaspora_id)
+ post_message(generate_xml(DiasporaFederation::Entities::AccountDeletion.new(diaspora_id: delete_id), sender))
+
+ expect(AccountDeletion.exists?(diaspora_handle: delete_id)).to be_falsey
+ expect(AccountDeletion.exists?(diaspora_handle: sender_id)).to be_falsey
+ end
+
+ context "reshare" do
+ it "reshare of public post passes" do
+ post = FactoryGirl.create(:status_message, author: alice.person, public: true)
+ reshare = FactoryGirl.build(
+ :reshare_entity, root_diaspora_id: alice.diaspora_handle, root_guid: post.guid, diaspora_id: sender_id)
+ post_message(generate_xml(reshare, sender))
+
+ expect(Reshare.exists?(root_guid: post.guid, diaspora_handle: sender_id)).to be_truthy
+ end
+
+ it "reshare of private post fails" do
+ post = FactoryGirl.create(:status_message, author: alice.person, public: false)
+ reshare = FactoryGirl.build(
+ :reshare_entity, root_diaspora_id: alice.diaspora_handle, root_guid: post.guid, diaspora_id: sender_id)
+ post_message(generate_xml(reshare, sender))
+
+ expect(Reshare.exists?(root_guid: post.guid, diaspora_handle: sender_id)).to be_falsey
+ end
+ end
+
+ it_behaves_like "messages which are indifferent about sharing fact"
+
+ context "with sharing" do
+ before do
+ contact = alice.contacts.find_or_initialize_by(person_id: sender.person.id)
+ contact.sharing = true
+ contact.save
+ end
+
+ it_behaves_like "messages which are indifferent about sharing fact"
+ it_behaves_like "messages which can't be send without sharing"
+ end
+ end
+
+ context "with private receive" do
+ let(:recipient) { alice }
+
+ it "treats sharing request recive correctly" do
+ entity = FactoryGirl.build(:request_entity, recipient_id: alice.diaspora_handle)
+
+ expect(Diaspora::Fetcher::Public).to receive(:queue_for).exactly(1).times
+
+ post_message(generate_xml(entity, sender, alice), alice)
+
+ expect(alice.contacts.count).to eq(2)
+ new_contact = alice.contacts.order(created_at: :asc).last
+ expect(new_contact).not_to be_nil
+ expect(new_contact.sharing).to eq(true)
+ expect(new_contact.person.diaspora_handle).to eq(sender_id)
+
+ expect(
+ Notifications::StartedSharing.exists?(
+ recipient_id: alice.id,
+ target_type: "Person",
+ target_id: sender.person.id
+ )
+ ).to be_truthy
+ end
+
+ it "doesn't save the private status message if there is no sharing" do
+ entity = FactoryGirl.build(:status_message_entity, diaspora_id: sender_id, public: false)
+ post_message(generate_xml(entity, sender, alice), alice)
+
+ expect(StatusMessage.exists?(guid: entity.guid)).to be_falsey
+ end
+
+ context "with sharing" do
+ before do
+ contact = alice.contacts.find_or_initialize_by(person_id: sender.person.id)
+ contact.sharing = true
+ contact.save
+ end
+
+ it_behaves_like "messages which are indifferent about sharing fact"
+ it_behaves_like "messages which can't be send without sharing"
+
+ it "treats profile receive correctly" do
+ entity = FactoryGirl.build(:profile_entity, diaspora_id: sender_id)
+ post_message(generate_xml(entity, sender, alice), alice)
+
+ expect(Profile.exists?(diaspora_handle: entity.diaspora_id)).to be_truthy
+ end
+
+ it "receives conversation correctly" do
+ entity = FactoryGirl.build(
+ :conversation_entity,
+ diaspora_id: sender_id,
+ participant_ids: "#{sender_id};#{alice.diaspora_handle}"
+ )
+ post_message(generate_xml(entity, sender, alice), alice)
+
+ expect(Conversation.exists?(guid: entity.guid)).to be_truthy
+ end
+
+ context "with message" do
+ let(:local_target) {
+ FactoryGirl.build(:conversation, author: alice.person).tap do |target|
+ target.participants << remote_user_on_pod_b.person
+ target.participants << remote_user_on_pod_c.person
+ target.save
+ end
+ }
+ let(:remote_target) {
+ FactoryGirl.build(:conversation, author: remote_user_on_pod_b.person).tap do |target|
+ target.participants << alice.person
+ target.participants << remote_user_on_pod_c.person
+ target.save
+ end
+ }
+ let(:entity_name) { :message_entity }
+ let(:klass) { Message }
+
+ it_behaves_like "it deals correctly with a relayable"
+ end
+ end
+ end
+end
diff --git a/spec/integration/federation/shared_receive_relayable.rb b/spec/integration/federation/shared_receive_relayable.rb
new file mode 100644
index 000000000..71c675743
--- /dev/null
+++ b/spec/integration/federation/shared_receive_relayable.rb
@@ -0,0 +1,59 @@
+shared_examples_for "it deals correctly with a relayable" do
+ context "local" do
+ let(:entity) { create_relayable_entity(entity_name, local_target, sender_id, nil) }
+
+ it "treats upstream receive correctly" do
+ expect(Postzord::Dispatcher).to receive(:build).with(alice, kind_of(klass)).and_call_original
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ received_entity = klass.find_by(guid: entity.guid)
+ expect(received_entity).not_to be_nil
+ expect(received_entity.author.diaspora_handle).to eq(remote_user_on_pod_b.diaspora_handle)
+ end
+
+ # Checks when a remote pod wants to send us a relayable without having a key for declared diaspora ID
+ it "rejects an upstream entity with a malformed author signature" do
+ expect(Postzord::Dispatcher).not_to receive(:build)
+ allow(remote_user_on_pod_b).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(klass.exists?(guid: entity.guid)).to be_falsey
+ end
+ end
+
+ context "remote" do
+ let(:author_id) { remote_user_on_pod_c.diaspora_handle }
+ let(:entity) { create_relayable_entity(entity_name, remote_target, author_id, sender.encryption_key) }
+
+ it "treats downstream receive correctly" do
+ expect(Postzord::Dispatcher).to receive(:build)
+ .with(alice, kind_of(klass)).and_call_original unless recipient.nil?
+
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ received_entity = klass.find_by(guid: entity.guid)
+ expect(received_entity).not_to be_nil
+ expect(received_entity.author.diaspora_handle).to eq(remote_user_on_pod_c.diaspora_handle)
+ end
+
+ # Checks when a remote pod B wants to send us a relayable with authorship from a remote pod C user
+ # without having correct signature from him.
+ it "rejects a downstream entity with a malformed author signature" do
+ expect(Postzord::Dispatcher).not_to receive(:build)
+ allow(remote_user_on_pod_c).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(klass.exists?(guid: entity.guid)).to be_falsey
+ end
+
+ # Checks when a remote pod C wants to send us a relayable from its user, but bypassing the pod B where
+ # remote status came from.
+ it "declines downstream receive when sender signed with a wrong key" do
+ expect(Postzord::Dispatcher).not_to receive(:build)
+ allow(sender).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(klass.exists?(guid: entity.guid)).to be_falsey
+ end
+ end
+end
diff --git a/spec/integration/federation/shared_receive_retraction.rb b/spec/integration/federation/shared_receive_retraction.rb
new file mode 100644
index 000000000..c9182e539
--- /dev/null
+++ b/spec/integration/federation/shared_receive_retraction.rb
@@ -0,0 +1,57 @@
+def retraction_entity(entity_name, target_object, sender)
+ allow(DiasporaFederation.callbacks).to receive(:trigger)
+ .with(
+ :fetch_entity_author_id_by_guid,
+ target_object.class.to_s,
+ target_object.guid
+ )
+ .and_return(sender.encryption_key)
+
+ FactoryGirl.build(
+ entity_name,
+ diaspora_id: sender.diaspora_handle,
+ target_guid: target_object.guid,
+ target_type: target_object.class.to_s
+ )
+end
+
+shared_examples_for "it retracts non-relayable object" do
+ it "retracts object by a correct retraction message" do
+ entity = retraction_entity(entity_name, target_object, sender)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(target_object.class.exists?(guid: target_object.guid)).to be_falsey
+ end
+
+ it "doesn't retract object when retraction has wrong signatures" do
+ allow(sender).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
+ entity = retraction_entity(entity_name, target_object, sender)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(target_object.class.exists?(guid: target_object.guid)).to be_truthy
+ end
+
+ it "doesn't retract object when sender is different from target object" do
+ entity = retraction_entity(entity_name, target_object, remote_user_on_pod_c)
+ post_message(generate_xml(entity, remote_user_on_pod_c, recipient), recipient)
+
+ expect(target_object.class.exists?(guid: target_object.guid)).to be_truthy
+ end
+end
+
+shared_examples_for "it retracts relayable object" do
+ it "retracts object by a correct message" do
+ entity = retraction_entity(entity_name, target_object, sender)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(target_object.class.exists?(guid: target_object.guid)).to be_falsey
+ end
+
+ it "doesn't retract object when retraction has wrong signatures" do
+ allow(sender).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
+ entity = retraction_entity(entity_name, target_object, sender)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(target_object.class.exists?(guid: target_object.guid)).to be_truthy
+ end
+end
diff --git a/spec/integration/federation/shared_receive_stream_items.rb b/spec/integration/federation/shared_receive_stream_items.rb
new file mode 100644
index 000000000..93e876481
--- /dev/null
+++ b/spec/integration/federation/shared_receive_stream_items.rb
@@ -0,0 +1,166 @@
+# by "stream items" we mean everything that could appear in the stream - post, comment, like, poll, etc and therefore
+# could be send either publicly or privately
+shared_examples_for "messages which are indifferent about sharing fact" do
+ let(:public) { recipient.nil? }
+
+ it "treats status message receive correctly" do
+ entity = FactoryGirl.build(:status_message_entity, diaspora_id: sender_id, public: public)
+
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(StatusMessage.exists?(guid: entity.guid)).to be_truthy
+ end
+
+ it "doesn't accept status message with wrong signature" do
+ allow(sender).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
+ entity = FactoryGirl.build(:status_message_entity, diaspora_id: sender_id, public: public)
+
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(StatusMessage.exists?(guid: entity.guid)).to be_falsey
+ end
+
+ describe "with messages which require a status to operate on" do
+ let(:local_target) { FactoryGirl.create(:status_message, author: alice.person, public: public) }
+ let(:remote_target) { FactoryGirl.create(:status_message, author: remote_user_on_pod_b.person, public: public) }
+
+ describe "notifications are sent where required" do
+ it "for comment on local post" do
+ entity = create_relayable_entity(:comment_entity, local_target, remote_user_on_pod_b.diaspora_handle, nil)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(
+ Notifications::CommentOnPost.exists?(
+ recipient_id: alice.id,
+ target_type: "Post",
+ target_id: local_target.id
+ )
+ ).to be_truthy
+ end
+
+ it "for like on local post" do
+ entity = create_relayable_entity(:like_entity, local_target, remote_user_on_pod_b.diaspora_handle, nil)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(
+ Notifications::Liked.exists?(
+ recipient_id: alice.id,
+ target_type: "Post",
+ target_id: local_target.id
+ )
+ ).to be_truthy
+ end
+ end
+
+ %w(comment like participation).each do |entity|
+ context "with #{entity}" do
+ let(:entity_name) { "#{entity}_entity".to_sym }
+ let(:klass) { entity.camelize.constantize }
+
+ it_behaves_like "it deals correctly with a relayable"
+ end
+ end
+
+ context "with poll_participation" do
+ let(:local_target) {
+ FactoryGirl.create(
+ :poll,
+ status_message: FactoryGirl.create(:status_message, author: alice.person, public: public)
+ )
+ }
+ let(:remote_target) {
+ FactoryGirl.create(
+ :poll,
+ status_message: FactoryGirl.create(:status_message, author: remote_user_on_pod_b.person, public: public)
+ )
+ }
+ let(:entity_name) { :poll_participation_entity }
+ let(:klass) { PollParticipation }
+
+ it_behaves_like "it deals correctly with a relayable"
+ end
+ end
+end
+
+shared_examples_for "messages which can't be send without sharing" do
+ # retractions shouldn't depend on sharing fact
+ describe "retractions for non-relayable objects" do
+ %w(retraction signed_retraction).each do |retraction_entity_name|
+ context "with #{retraction_entity_name}" do
+ let(:entity_name) { "#{retraction_entity_name}_entity".to_sym }
+
+ %w(status_message photo).each do |target|
+ context "with #{target}" do
+ let(:target_object) { FactoryGirl.create(target.to_sym, author: remote_user_on_pod_b.person) }
+
+ it_behaves_like "it retracts non-relayable object"
+ end
+ end
+ end
+ end
+ end
+
+ describe "with messages which require a status to operate on" do
+ let(:public) { recipient.nil? }
+ let(:local_target) { FactoryGirl.create(:status_message, author: alice.person, public: public) }
+ let(:remote_target) { FactoryGirl.create(:status_message, author: remote_user_on_pod_b.person, public: public) }
+
+ # this one shouldn't depend on the sharing fact. this must be fixed
+ describe "notifications are sent where required" do
+ it "for comment on remote post where we participate" do
+ alice.participate!(remote_target)
+ author_id = remote_user_on_pod_c.diaspora_handle
+ entity = create_relayable_entity(:comment_entity, remote_target, author_id, sender.encryption_key)
+ post_message(generate_xml(entity, sender, recipient), recipient)
+
+ expect(
+ Notifications::AlsoCommented.exists?(
+ recipient_id: alice.id,
+ target_type: "Post",
+ target_id: remote_target.id
+ )
+ ).to be_truthy
+ end
+ end
+
+ describe "retractions for relayable objects" do
+ %w(retraction signed_retraction relayable_retraction).each do |retraction_entity_name|
+ context "with #{retraction_entity_name}" do
+ let(:entity_name) { "#{retraction_entity_name}_entity".to_sym }
+
+ context "with comment" do
+ it_behaves_like "it retracts relayable object" do
+ # case for to-upstream federation
+ let(:target_object) {
+ FactoryGirl.create(:comment, author: remote_user_on_pod_b.person, post: local_target)
+ }
+ end
+
+ it_behaves_like "it retracts relayable object" do
+ # case for to-downsteam federation
+ let(:target_object) {
+ FactoryGirl.create(:comment, author: remote_user_on_pod_c.person, post: remote_target)
+ }
+ end
+ end
+
+ context "with like" do
+ it_behaves_like "it retracts relayable object" do
+ # case for to-upstream federation
+ let(:target_object) {
+ FactoryGirl.create(:like, author: remote_user_on_pod_b.person, target: local_target)
+ }
+ end
+
+ it_behaves_like "it retracts relayable object" do
+ # case for to-downsteam federation
+ let(:target_object) {
+ FactoryGirl.create(:like, author: remote_user_on_pod_c.person, target: remote_target)
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/javascripts/app/helpers/text_formatter_spec.js b/spec/javascripts/app/helpers/text_formatter_spec.js
index 04c18a9f4..e0b72adcb 100644
--- a/spec/javascripts/app/helpers/text_formatter_spec.js
+++ b/spec/javascripts/app/helpers/text_formatter_spec.js
@@ -97,7 +97,7 @@ describe("app.helpers.textFormatter", function(){
it("works with markdown", function(){
var code = "```markdown\n# header\n**strong**\n```";
- expect(this.formatter(code)).toContain("<span class=\"hljs-header\">");
+ expect(this.formatter(code)).toContain("<span class=\"hljs-section\">");
expect(this.formatter(code)).toContain("<span class=\"hljs-strong\">");
});
diff --git a/spec/javascripts/app/views/hovercard_view_spec.js b/spec/javascripts/app/views/hovercard_view_spec.js
index a003e24b2..6f7e4c260 100644
--- a/spec/javascripts/app/views/hovercard_view_spec.js
+++ b/spec/javascripts/app/views/hovercard_view_spec.js
@@ -1,11 +1,57 @@
describe("app.views.Hovercard", function() {
- beforeEach(function() {
- this.view = new app.views.Hovercard();
+ context("user not signed in", function() {
+ beforeEach(function() {
+ logout();
+ this.view = new app.views.Hovercard();
+ });
+
+ describe("_populateHovercardWith", function() {
+ it("doesn't fetch the aspect dropdown", function() {
+ spyOn(jQuery, "ajax").and.callThrough();
+ this.view.parent = spec.content();
+ this.view._populateHovercardWith({});
+ expect(jQuery.ajax).not.toHaveBeenCalled();
+ });
+ });
});
- describe("mouseIsOverElement", function() {
- it("returns false if the element is undefined", function() {
- expect(this.view.mouseIsOverElement(undefined, $.Event())).toBeFalsy();
+ context("user signed in", function() {
+ beforeEach(function() {
+ loginAs(factory.userAttrs());
+ this.view = new app.views.Hovercard();
+ });
+
+ describe("initialize", function() {
+ it("activates hovercards", function() {
+ expect(this.view.active).toBeTruthy();
+ });
+ });
+
+ describe("mouseIsOverElement", function() {
+ it("returns false if the element is undefined", function() {
+ expect(this.view.mouseIsOverElement(undefined, $.Event())).toBeFalsy();
+ });
+ });
+
+ describe("_populateHovercard", function() {
+ it("prevents global error handling for the ajax call", function() {
+ spyOn(jQuery, "ajax").and.callThrough();
+ this.view.parent = spec.content();
+ this.view._populateHovercard();
+ expect(jQuery.ajax).toHaveBeenCalledWith("undefined/hovercard.json", {preventGlobalErrorHandling: true});
+ });
+ });
+
+ describe("_populateHovercardWith", function() {
+ it("prevents global error handling for the ajax call", function() {
+ spyOn(jQuery, "ajax").and.callThrough();
+ this.view.parent = spec.content();
+ this.view._populateHovercardWith({});
+ expect(jQuery.ajax).toHaveBeenCalledWith(
+ "undefined/aspect_membership_button",
+ {preventGlobalErrorHandling: true}
+ );
+ });
});
});
});
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
index 1881aec22..b7bd65f71 100644
--- a/spec/models/notification_spec.rb
+++ b/spec/models/notification_spec.rb
@@ -97,8 +97,10 @@ describe Notification, :type => :model do
p = FactoryGirl.build(:status_message, :author => @user.person)
person2 = FactoryGirl.build(:person)
notification = Notification.notify(@user, FactoryGirl.build(:like, :author => @person, :target => p), @person)
+ earlier_updated_at = notification.updated_at
notification2 = Notification.notify(@user, FactoryGirl.build(:like, :author => person2, :target => p), person2)
expect(notification.id).to eq(notification2.id)
+ expect(earlier_updated_at).to_not eq(notification.reload.updated_at)
end
end
@@ -107,8 +109,10 @@ describe Notification, :type => :model do
p = FactoryGirl.build(:status_message, :author => @user.person)
person2 = FactoryGirl.build(:person)
notification = Notification.notify(@user, FactoryGirl.build(:comment, :author => @person, :post => p), @person)
+ earlier_updated_at = notification.updated_at
notification2 = Notification.notify(@user, FactoryGirl.build(:comment, :author => person2, :post => p), person2)
expect(notification.id).to eq(notification2.id)
+ expect(earlier_updated_at).to_not eq(notification.reload.updated_at)
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index ca444256a..586ec2824 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -73,6 +73,8 @@ RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
config.mock_with :rspec
+ config.example_status_persistence_file_path = "tmp/rspec-persistance.txt"
+
config.render_views
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
diff --git a/spec/support/fixture_builder.rb b/spec/support/fixture_builder.rb
index 34f981a33..e7d90d83f 100644
--- a/spec/support/fixture_builder.rb
+++ b/spec/support/fixture_builder.rb
@@ -34,11 +34,11 @@ FixtureBuilder.configure do |fbuilder|
local_leia.contacts.create(:person => remote_raphael, :aspects => [leias_aspect])
local_luke.contacts.create(:person => remote_raphael, :aspects => [lukes_aspect])
-
+
# Set up a follower
peter = FactoryGirl.create(:user_with_aspect, :username => "peter")
peters_aspect = peter.aspects.where(:name => "generic").first
-
+
peter.contacts.create!(:person => alice.person,
:aspects => [peters_aspect],
:sharing => false,